Lux73 hat geschrieben: ↑2. Jan 2023 18:06
dennoch denke ich kann ich dann auch so Verfahren:
Nein? Deine Rule prüft, ob Temperatur < 0 UND Switch OFF (Fall 1)
ODER (das heißt, falls Fall 1 nicht zutrifft) ob Switch ON
Das bedeutet: Temperatur ist unter 0 und Schalter OFF -> Schalter wird auf ON gewechselt.
Nächste Messung: Temperatur immer noch unter 0, aber Schalter nicht OFF -> Fall 1 trifft nicht zu, also Prüfung, ob Schalter ON -> trifft zu, also Schalter OFF.
Das ist NICHT das, was Du erreichen willst.
Abgesehen davon ist Deine Rule nicht "möglichst einfach". Und die Rule ist nicht failsafe.
Mit Absicherung gegen Fehler sieht die Rule so aus:
Code: Alles auswählen
rule "Switch Frost aussen"
when
Item Sensor_Aussen_Temperatur changed
then
if(!(newState instanceof Number)) {
logWarn("frost", "Außentemperatursensor liefert ungültigen Wert ({}), Abbruch!",newState)
return;
}
var soll = ON
if((newState as Number).floatVaue > 0)
soll = OFF
if(Switch_Frost.state != soll) {
Switch_Frost.sendCommand(soll.toString)
logInfo("frost","Frostwächter wurde {}geschaltet!", if(soll != ON) "aus" else "ein")
}
end
Zunächst prüft die Rule (abweichend von Deiner Rule), ob der Sensor überhaupt einen gültigen Wert liefert (im Sinne von: da kommt eine Zahl). Im Fehlerfall wird die Rule abgebrochen, natürlich mit Meldung.
Danach wird zunächst die Sollstellung ermittelt (ergibt sich aus der Temperatur)
Anschließend wird ein Schaltbefehl ausgeführt, falls das Soll vom Ist abweicht.
Die Meldung beinhaltet keine Nennung der Temperatur, denn die Information ist irrelevant. Relevant ist lediglich, ob ein Schaltvorgang stattgefunden hat.
Durch die Verwendung der Variablen ist die Rule so simpel, wie sie eben sein kann.
Durch die Verwendung der Substitution ist die Meldung auch im Source Code gut verständlich. Als Meldungstext wird entweder
"Frostwächter wurde eingeschaltet!" oder "Frostwächter wurde ausgeschaltet!" ausgegeben. Das ist in meinen Augen hübscher als z.B.
"Frostwächter wurde auf ON geschaltet!" bzw. "Frostwächter wurde auf OFF geschaltet!", was natürlich genauso ginge und dann keinen ternären Operator bräuchte, aber ganz ehrlich: der Code ist simpel und übersichtlich.
Wenn die Temperatur unbedingt genannt werden soll, könnte man auch diese Logmeldung ausgeben:
Code: Alles auswählen
logInfo("frost","Temperatur {}°C, Frostwächter wurde {}geschaltet!",String.format("%.1f",(newState as Number).floatValue), if(soll != ON) "aus" else "ein")
womit dann die Meldung um die Temperatur mit einer Nachkommastelle ergänzt wird. Dafür ist die Zeile aber schon wieder etwas komplizierter
Beachte bitte auch, dass der Name des Loggers hier frost lautet. Damit wird es nun möglich, in der Karaf Konsole einfach
zu tippen und die Meldungen auf die Warnmeldungen zu beschränken, und zwar nur für diese Rule, unabhängig von anderen Rules (solange sie nicht ebenfalls frost als Loggernamen verwenden).
openHAB4.3.3 stable in einem Debian-Container (bookworm) (Proxmox 8.3.5, LXC), mit openHABian eingerichtet