Fast. Es fehlt noch die Prüfung, ob die Variable false ist.
So sähe die Rule konkret aus:
Code: Alles auswählen
var Boolean bTempMessage = false
rule "Pufferspeicher hat 55 Grad ereicht"
when
Item Pufferspeichersensor_Temperatur changed
then
logInfo("Pufferspeicher", "Rule getriggert! Wert : {}", Pufferspeichersensor_Temperatur.state )
if(!(Pufferspeichersensor_Temperatur.state instanceof Number)) {
logWarn("Pufferspeicher", "Sensor Item liefert keinen gültigen Zahlenwert.")
return;
}
if(bTempMessage) {
logInfo("Pufferspeicher", "Nachricht bereits gesendet.")
return;
}
if((Pufferspeichersensor_Temperatur.state as Number).floatValue > 55) {
logInfo("Pufferspeicher", "Pufferspeicher hat Temperatur von 55 °C erreicht! ")
bPufferspeichersensor_Temperatur = true
Meldung.postUpdate("Der Pufferspeicher hat eine Temperatur von 55 Grad ereicht!")
}
end
Esfehlt dann noch ein Reset der Variablen, damit "irgendwann" wieder eine Meldung ausgegeben wird.
Der Vollständigkeit halber hier noch die andere Variante:
Code: Alles auswählen
rule "Pufferspeicher Nachricht"
when
Item Pufferspeichersensor_Temperatur changed
then
logDebug("warmwasser", "Rule getriggert! Wert : {} ", Pufferspeichersensor_Temperatur.state )
if(!(previousState instanceof Number))
logWarn("warmwasser", "kein gültiger Vergleichswert! Setze Wert unter 55.")
val nPrev = if(previousState instanceof Number) (previousState as Number).floatValue else 50
if(!(newState instanceof Number)) {
logWarn("warmwasser", "Sensor Item liefert keinen gültigen Zahlenwert. Abbruch!")
return;
}
val nNew = (newState as Number).floatValue
if(nNew > 55 && nPrev <= 55) {
logInfo("warmwasser", "Pufferspeicher hat Temperatur 55 °C überschritten! ")
bPufferspeichersensor_Temperatur = true
Meldung.postUpdate("Der Pufferspeicher hat die Temperatur 55 °C überschritten!")
}
end
Noch ein paar Hinweise:
Die log-Befehle erwarten zwei Strings als Parameter. Dabei ist der erste String der Logger Name. Das hat nur am Rande etwas mit der Meldung zu tun. Hier sollte eigentlich nur ein Bezug auf die Rule erkennbar sein, der Text sollte aber nicht als Teil der Meldung verstanden werden. Stattdessen ist dieser Parameter eine Größe, die zur Steuerung des Verhaltens herangezogen wird.
Man kann zur Laufzeit über die Karaf Konsole mittels
log:set <loglevel> <loggername> gezielt Meldungen unterdrücken oder ausgeben lassen. Der genaue Name des Loggers ist leider hochgradig von der verwendeten Version von openHAB abhängig, geht aber natürlich aus den Meldungen hervor. Aktuell (openHAB3.x) sollte er z.B.
org.openhab.core.model.script.warmwasser für die 2. Rule lauten, der in der Rule angegebene Name ist also nur ein Teil des Logger Namens. Mit
log:set DEBUG org.openhab.core.model.script.warmwasser wird die erste Meldung (Rule getriggert) ausgegeben, mit
log:set INFO org.openhab.core.model.script.warmwasser wird diese Meldung nicht ausgegeben, aber die Meldung, wenn die Temperatur überschritten wird. Mit
log:set WARN org.openhab.core.model.script.warmwasser werden nur die Warnmeldungen ausgegeben. Dazu ist es aber essenziell, dass der Logger Name thematisch verwendet wird, nicht als individueller Bestandteil der Meldungen. Genauso ist es eher fragwürdig, einfach "rule" in das Feld zu schreiben, zumal dies eine bereits vorhandene Information ist (das geht aus
org.openhab.core.model.script hervor).
sprechende Namen für Variablen sind toll, aber je länger ein Variablenname, desto unübersichtlicher wird der Code. Also: so lang wie nötig, so kurz wie möglich. Temp mag als Kürzel zweideutig sein (temporär vs. Temperatur) aber im Kontext ist es eindeutig genug.
Mit dem ternären Operator
ist es sehr einfach, einen Default Wert zu setzen. Alternativ kann man natürlich auch
schreiben. Letztlich ist das egal, nimmt aber entsprechend mehr Platz weg.
openHAB4.3.5 stable in einem Debian-Container (bookworm) (Proxmox 8.4.1, LXC), mit openHABian eingerichtet