Na ja, das geht aber besser...
Der wichtigste Punkt hierbei ist, zu verstehen, dass die bedingte Verzweigung ausschließlich auf den nachfolgenden Befehl wirkt. Es spielt keine Rolle, wie Text hierfür eingerückt ist. Um mehrere Befehle von einer Bedingung abhängig auszuführen, müssen diese Befehle als Gruppe zusammengefasst werden. Dies geschieht mit den geschweiften Klammern (die Befehle befinden sich damit in einem neuen Kontext und das if sieht nur den Kontext als einzelnen Befehl).
Sieht also besser so aus:
Code: Alles auswählen
rule"Terrassentür geht zu"
when
Item Terassentuer changed from OPEN to CLOSED
then
if((Temperatur_aussen.state as Number) < 15 && WZ_Fenster_S.state == CLOSED) {
if(Termostat_Wohn.state == 0)
Termostat_Wohn.sendCommand(1)
if(Termostat_Ess.state == 0)
Termostat_Ess.sendCommand(1)
}
end
Allerdings solltest Du Dir darüber im Klaren sein, dass es diverse Dinge gibt, die diese Rule nicht abdeckt. Natürlich kannst Du diese Dinge mit anderen Rules berücksichtigen, aber es wäre eleganter, wenige Rules für das konkrete Problem zu nutzen.
Hier gibt es drei Bedingungen, die dazu dienen, die Heizung zu aktivieren. Allerdings sollte die Heizung vermutlich auch wieder abschalten, wenn die Bedingungen anders aussehen. Geht mit einer einzigen Rule:
Code: Alles auswählen
rule"Heizung Ess- und Wohnzimmer"
when
Item Terassentuer changed or
Item WZ_Fenster_S changed or
Item Temperatur_aussen changed
then
var Number soll = 0
if((Temperatur_aussen.state as Number) < 15 && WZ_Fenster_S.state == CLOSED && Terrassentuer.state == CLOSED)
soll = 2
else if((Temperatur_aussen.state as Number) > 16 || WZ_Fenster_S.state == OPEN || Terrassentuer.state == OPEN)
soll = 1
if(soll > 0) {
soll = soll -1
if(Termostat_Wohn.state != soll)
Termostat_Wohn.sendCommand(soll)
if(Termostat_Ess.state != soll)
Termostat_Ess.sendCommand(soll)
}
end
Die Rule schaltet also die Heizung ein, wenn Tür und Fenster geschlossen und die Temperatur unter 15 ist. Sie schaltet die Heizung aus, sobald die Temperatur über 16 steigt oder Fenster bzw. Tür geöffnet werden. Die Variable und deren Nutzung dienen dazu, doppelte Befehle zu vermeiden. Wenn man beide Thermostaten in eine Gruppe packt, kann man die Gruppe nutzen und den Code noch eleganter gestalten:
Code: Alles auswählen
gThermostate.members.filter[i|i.state =! soll].forEach[j|j.sendCommand(soll)]
das ersetzt dann die vier Zeilen für die Thermostaten, die beiden Thermostaten müssen dann zu der Gruppe gThermostate gehören.
openHAB4.3.5 stable in einem Debian-Container (bookworm) (Proxmox 8.4.1, LXC), mit openHABian eingerichtet