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.
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"
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.
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:
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
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!
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.
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",