Also, Deine Rule mag super funktionieren, das kann sich aber ganz leicht ändern, wenn der Sollwert nicht gesetzt wurde oder der Messwert ausfällt
Aber sise soll ja ohnehin überarbeitet werden...
Code: Alles auswählen
rule "Heizungssteuerung Wohnzimmer"
when
Item WohnRaumtemp changed or
Item WohnRaumtempSollSetpoint changed or
Item WohnzimmerHeizungSwitch changed
then
var Number nRaumSoll = 16 // default Solltemperatur, falls das Item noch nicht initialisiert ist
if(WohnRaumtempSollSetpoint.state instanceof Number) // falls gültiger Wert vorliegt
nRaumSoll = WohnRaumtempSollSetpoint.state as Number // Sollwert setzen
var Number nRaumIst = 18 // default Isttemperatur, falls kein gültiger Messwert vorliegt
if(WohnRaumtemp.state instanceof Number) // falls gültiger Wert vorliegt
nRaumIst = WohnRaumtemp.state as Number // Istwert setzen
var sSoll = WohnHeizung.state // aktueller Zustand
if(WohnzimmerHeizungSwitch.state == ON) { // Heizung freigegeben?
if(nRaumIst <= nRaumSoll) // Solltemperatur unterschritten?
sSoll = ON // dann Sollzustand ON
else if(nRaumIst >= nRaumSoll +1) // Solltemperatur um mindestens 1 überschritten?
sSoll = OFF // dann Sollzustand OFF
} else // Heizung abgeschaltet?
sSoll = OFF // dann Sollzustand OFF
if(WohnHeizung.state != sSoll) // Weicht Ist von Soll ab?
WohnHeizung.sendCommand(sSoll.toString) // dann Befehl senden
end
Zu Beginn werden die beiden Zahlenwerte in Variablen übernommen. Ansonsten müsste man immer fürchten, dass einer oder beide Werte keine gültige Zahl liefern, womit es dann zu einer NullPointer Exception kommt.
Außerdem müssen wir die beiden Werte zwei mal vergleichen (einmal mit Aufschlag), so dass die Variablen sich schon lohnen.
Weil es insgesamt drei verschiedene Möglichkeiten gibt, was den Ausgang des Vergleichs betrifft, und dann noch drei Eingangswerte verwendet werden müssen (der Schalter zur Freigabe der Heizung), ist es das Einfachste, hier gestaffelt zu vergleichen. dabei nutze ich den aktuellen Status der Heizung als "Neutralstellung".
Ist der Schalter nicht ON, so wird der Sollzustand auf OFF gesetzt.
Ist der Schalter ON, aber die Temperatur über dem oberen Grenzwert (Soll+ 1) wird der Sollzustand ebenfalls auf OFF gesetzt.
Ist der Schalter ON und die Temperatur unterhalb oder gleich dem unteren Grenzwert (Soll), wird der Sollzustand auf OFF gesetzt.
Ist der Schalter ON und die Temperatur zwischen unterem Grenzwert und oberem Grenzwert, so bleibt der Sollzustand auf dem aktuellen Wert.
Zum Schluss muss der aktuelle Wert mit dem Sollwert verglichen werden und bei Bedarf der Steuerbefehl abgesetzt werden (diesen Vergleich könnte man auch einsparen, aber warum sollte man eine eingeschaltete Heizung immer wieder einschalten (oder eine ausgeschaltete Heizung immer wieder ausschalten?
openHAB4.1.2 stable in einem Debian-Container (bookworm) (Proxmox 8.1.5, LXC), mit openHABian eingerichtet