Seite 2 von 14
Re: Temperatur Tendenz ermitteln
Verfasst: 13. Aug 2020 08:14
von violine21
KellerK1nd hat geschrieben: ↑13. Aug 2020 07:58
Ich würde ja gerne den Status nur schreiben, wenn sich in den letzten 15 Minuten der Wert geändert hat.
Mein Ansatz mit der 15-minütig getriggerten Rule basiert darauf, das ich dadurch einen "länger" laufenden Timer spare.
Ich hatte da schon die eine oder andere Huddelei mit Timerabstürzen, darum favorisiere ich bei langen, festen Zeitrastern
immer den Time-Cron.
Aber das kann jeder selbst entscheiden.

Re: Temperatur Tendenz ermitteln
Verfasst: 13. Aug 2020 21:35
von PeterA
Ich hab das auch mal versucht:
Code: Alles auswählen
rule "Aussentemperatur Tendenz ermitteln" //Lacrosse Sensor
when
Item AussenTemp changed or
System started or
Time cron "0 * * * * ?"// jede Minute
then
if((AussenTemp.state as Number).floatValue > (AussenTemp.previousState().state as Number).floatValue){
logInfo("Aussentemperatur", "steigend")
AussenTemp_Tendenz.postUpdate("steigend")
}
if((AussenTemp.state as Number).floatValue == (AussenTemp.previousState().state as Number).floatValue){
logInfo("Aussentemperatur", "stagnierend")
AussenTemp_Tendenz.postUpdate("stagnierend")
}
if((AussenTemp.state as Number).floatValue < (AussenTemp.previousState().state as Number).floatValue){
logInfo("Aussentemperatur", "fallend")
AussenTemp_Tendenz.postUpdate("fallend")
}
end
Aber trotz fallender Temperatur Triggert nur "stagnierend"
Code: Alles auswählen
2020-08-13 21:02:10.822 [vent.ItemStateChangedEvent] - AussenTemp changed from 21.1 to 21.0
2020-08-13 21:02:32.844 [INFO ] [rthome.model.script.Aussentemperatur] - stagnierend
Kann das an der rrd4j Persistence liegen welche ich für meine Items nehme ?
Gruß Peter
Re: Temperatur Tendenz ermitteln
Verfasst: 13. Aug 2020 23:49
von udo1toni
violine21 hat geschrieben:
udo1toni hat geschrieben: ↑13. Aug 2020 04:34aber sie benötigen auch dann Speicher und (ein wenig) Rechenzeit, wenn gerade keine Rule läuft
Ist das ein Ernst zu nehmender Fakt?
Nicht bei der gewählten Anzahl Threads, wohl aber, wenn man die Anzahl stark erhöht (z.B. Auf 200 Threads - das ist konfigurierbar).
Gesendet von iPad mit Tapatalk
Re: Temperatur Tendenz ermitteln
Verfasst: 14. Aug 2020 01:24
von violine21
PeterA hat geschrieben: ↑13. Aug 2020 21:35
Aber trotz fallender Temperatur Triggert nur "stagnierend"
Code: Alles auswählen
2020-08-13 21:02:10.822 [vent.ItemStateChangedEvent] - AussenTemp changed from 21.1 to 21.0
2020-08-13 21:02:32.844 [INFO ] [rthome.model.script.Aussentemperatur] - stagnierend
Kann das an der rrd4j Persistence liegen welche ich für meine Items nehme ?
Gruß Peter
Klingt spannend!
Zwischen den beiden Ereignissen liegen 22 Sekunden.
Kann man sich eigentlich die rrd4j-Datenbank auch so anschauen, wie zB. MySQL mit phpmyadmin?
Vielleicht ist der previousState zum Zeitpunkt der Rule nicht der, den wir erwarten.
Das könnte man doch auch in den log-Text mit einbinden.
Oder es liegt schlicht an dem Komma (Punkt). Eventuell wird die Zahl nur als 21 interpretiert.
Dann wäre mir die Variante mit dem Proxy-Item doch sicherer.
Ich lass die Rule mal ohne den minütlichen Time-Cron laufen und beobachte.
Re: Temperatur Tendenz ermitteln
Verfasst: 14. Aug 2020 02:03
von violine21
So, gerade gabs eine Temperaturänderung und siehe da:
Code: Alles auswählen
2020-08-14 01:35:00.046 [INFO ] [rthome.model.script.Aussentemperatur] - stagniert: 15.2 = 15.2
2020-08-14 01:54:43.421 [INFO ] [rthome.model.script.Aussentemperatur] - stagniert: 15.4 = 15.4
2020-08-14 01:54:43.421 [INFO ] [rthome.model.script.Aussentemperatur] - stagniert: 15.4 = 15.4
2020-08-14 01:57:01.423 [INFO ] [rthome.model.script.Aussentemperatur] - stagniert: 15.5 = 15.5
2020-08-14 01:59:07.105 [INFO ] [rthome.model.script.Aussentemperatur] - stagniert: 15.6 = 15.6
2020-08-14 02:02:02.362 [INFO ] [rthome.model.script.Aussentemperatur] - stagniert: 15.7 = 15.7
2020-08-14 02:04:43.325 [INFO ] [rthome.model.script.Aussentemperatur] - stagniert: 15.8 = 15.8
Der erste log-Eintrag war mit Time-Cron und die anderen durch Änderung hervorgerufen.
Zum Zeitpunkt des Rule-Durchlaufs war der previous.State bereits gleich dem Aktualwert.
Interessant wäre jetzt mal ein Blick in den Datenbankverlauf.
Übrigens hier die Rule:
Code: Alles auswählen
rule "Aussentemperatur Tendenz ermitteln"
when
Item Wetterstation1ACTUALTEMPERATURE changed
then
if((Wetterstation1ACTUALTEMPERATURE.state as Number).floatValue > (Wetterstation1ACTUALTEMPERATURE.previousState().state as Number).floatValue){
logInfo("Aussentemperatur", "steigt: "+((Wetterstation1ACTUALTEMPERATURE.state as Number).floatValue)+" > "+((Wetterstation1ACTUALTEMPERATURE.previousState().state as Number).floatValue))
}
if((Wetterstation1ACTUALTEMPERATURE.state as Number).floatValue == (Wetterstation1ACTUALTEMPERATURE.previousState().state as Number).floatValue){
logInfo("Aussentemperatur", "stagniert: "+((Wetterstation1ACTUALTEMPERATURE.state as Number).floatValue)+" = "+((Wetterstation1ACTUALTEMPERATURE.previousState().state as Number).floatValue))
}
if((Wetterstation1ACTUALTEMPERATURE.state as Number).floatValue < (Wetterstation1ACTUALTEMPERATURE.previousState().state as Number).floatValue){
logInfo("Aussentemperatur", "fällt: "+((Wetterstation1ACTUALTEMPERATURE.state as Number).floatValue)+" < "+((Wetterstation1ACTUALTEMPERATURE.previousState().state as Number).floatValue))
}
end
Evtl. kann Udo hier für Klarheit sorgen

Re: Temperatur Tendenz ermitteln
Verfasst: 14. Aug 2020 06:11
von PeterA
Re: Temperatur Tendenz ermitteln
Verfasst: 14. Aug 2020 09:24
von violine21
Du Scherzkeks

Den Thread kenne ich, das war ich selbst mit meiner Photovoltaikbatterie.
Ich hatte das seinerzeit anders gelöst und fand dieses Thema hier als Lernobjekt recht interessant.
Ich werde jetzt mal den kompletten previousState im log anzeigen lassen. Da ist dann wenigstens der Zeitstempel dabei.
Mit der Proxy-Item-Variante funktioniert es auf alle Fälle einwandfrei!
Re: Temperatur Tendenz ermitteln
Verfasst: 14. Aug 2020 09:51
von PeterA
Oh... hatte ich am Handy übersehen.
Deine Proxy-Item-Variante hatte ich gestern auch versucht.
Da maulte aber VSC bei diesem Teil "(letzte_Temperatur.state)"
Kann jetzt den Meldung nicht zeigen da nicht am richtigen Rechner.
Wie ist denn das Proxy Item definiert ?
Re: Temperatur Tendenz ermitteln
Verfasst: 14. Aug 2020 11:00
von PeterA
So
Code: Alles auswählen
rule "Aussentemperatur Tendenz ermitteln"
when
Item AussenTemp changed or
Time cron "0 0/15/30/45 * * * ?"// jede 15. Minute
then
if((AussenTemp.state as Number).floatValue > (AussenTemp_Tendenz_Proxy.state){
logInfo("Aussentemperatur", "steigt")
}
if((AussenTemp.state as Number).floatValue == (AussenTemp_Tendenz_Proxy.state){
logInfo("Aussentemperatur", "stagniert")
}
if((AussenTemp.state as Number).floatValue < (AussenTemp_Tendenz_Proxy.state){
logInfo("Aussentemperatur", "fällt")
}
AussenTemp_Tendenz_Proxy.postUpdate((AussenTemp.state as Number).floatValue)
end
Meldung von VSC:
Code: Alles auswählen
{
"resource": "/Volumes/openHAB-conf/rules/tendenz_test.rules",
"owner": "_generated_diagnostic_collection_name_#0",
"code": "org.eclipse.xtext.xbase.validation.IssueCodes.incompatible_types",
"severity": 8,
"message": "Type mismatch: cannot convert from State to byte",
"startLineNumber": 6,
"startColumn": 50,
"endLineNumber": 6,
"endColumn": 82
}
So ist das Proxy Item definiert:
Re: Temperatur Tendenz ermitteln
Verfasst: 14. Aug 2020 11:32
von violine21
Das Item:
Die Rule:
Code: Alles auswählen
rule "Aussentemperatur Tendenz mit Proxy ermitteln"
when
Item Wetterstation1ACTUALTEMPERATURE changed
then
if(!(prevTemperatur.state instanceof Number)) {
prevTemperatur.postUpdate(0)
}
if((Wetterstation1ACTUALTEMPERATURE.state as Number).floatValue > prevTemperatur.state as Number) {
logInfo("Aussentemperatur", "steigt: "+(Wetterstation1ACTUALTEMPERATURE.state as Number).floatValue+" > "+prevTemperatur.state as Number)
}
if((Wetterstation1ACTUALTEMPERATURE.state as Number).floatValue == prevTemperatur.state as Number){
logInfo("Aussentemperatur", "stagniert: "+(Wetterstation1ACTUALTEMPERATURE.state as Number).floatValue+" = "+prevTemperatur.state as Number)
}
if((Wetterstation1ACTUALTEMPERATURE.state as Number).floatValue < prevTemperatur.state as Number){
logInfo("Aussentemperatur", "fällt: "+(Wetterstation1ACTUALTEMPERATURE.state as Number).floatValue+" < "+prevTemperatur.state as Number)
}
prevTemperatur.postUpdate((Wetterstation1ACTUALTEMPERATURE.state as Number).floatValue)
end
"message": "Type mismatch: cannot convert from State to byte",
Da fehlt das " as Number"
Wo es immer nur geht, verzichte ich auf Einheiten (UoM), außer bei der Visualisierung.
Hat sich iregendwie bei mir so fesgesetzt.