Die Rule kann nicht funktionieren

, egal ob mit oder ohne Timer.
Deutlich wird das, wenn man die Rule etwas ordentlicher formatiert. Nur der relevante Teil:
Code: Alles auswählen
if(Dummy_alle_geschlossen.state == ON)
return;
if(now.getMonthValue >= 4 && now.getMonthValue <= 9)
Rolladen.members.forEach[ r |
r.sendCommand(DOWN)
Thread::sleep(900)
]
Dummy_alle_geschlossen.postUpdate(ON)
else // <-------------------------------------------------- else ohne if!
if(now.getMonthValue >= 10 && now.getMonthValue() <= 3) // a > 9 UND a < 4 niemals erfüllt!
Rollladen_Winter.members.forEach[ r |
r.sendCommand(DOWN)
Thread::sleep(900)
]
Dummy_alle_geschlossen.postUpdate(ON)
if() als bedingte Verzweigung wirkt ausschließlich auf den nächsten Befehl. Damit ist Dummy_alle_geschlossen.postUpdate(ON) nicht Teil der bedingten Verzweigung. Entsprechend hat else auch kein vorgeordnetes if()
Eine Zahl (oder auch der Inhalt einer Variablen) kann niemals gleichzeitig größer als 9 UND kleiner als 4 sein.
Korrekt:
Code: Alles auswählen
if(Dummy_alle_geschlossen.state == ON)
return;
if(now.getMonthValue > 3 && now.getMonthValue < 10) { // einfacher
Rolladen.members.forEach[ r |
r.sendCommand(DOWN)
Thread::sleep(900)
]
Dummy_alle_geschlossen.postUpdate(ON)
} else
if(now.getMonthValue > 9 || now.getMonthValue() < 4) { // einfacher
Rollladen_Winter.members.forEach[ r |
r.sendCommand(DOWN)
Thread::sleep(900)
]
Dummy_alle_geschlossen.postUpdate(ON)
}
Die geschweiften Klammern definieren einen Block, der von if() als eine Anweisung betrachtet wird. Nun gibt es auch ein vorgeordnetes if() und else funktioniert. In der zweiten if() Anweisung heißt es nun der Wert muss entweder größer als 9 ODER kleiner als 4 sein.
Allerdings ist die zweite if-Anweisung unnötig, entweder wir befinden uns innerhalb oder außerhalb des Sommer-Fensters (1.4. - 30.9.)
Außerdem wird Dummy_alle_geschlossen.postUpdate(ON) auf jeden Fall ausgeführt, sollte also nicht Bestandteil des if-Blocks sein. Praktischerweise können nun die geschweiften Klammern auch wieder entfallen. now.getMonthValue wird zweimal abgefragt, also einfach in einer lokalen Konstanten speichern. Der fertige Codeblock ohne Timer:
Code: Alles auswählen
if(Dummy_alle_geschlossen.state == ON)
return;
val Integer iMonth = now.getMonthValue
if(iMonth > 3 && iMonth < 10)
Rolladen.members.forEach[ r |
r.sendCommand(DOWN)
Thread::sleep(900)
]
else
Rollladen_Winter.members.forEach[ r |
r.sendCommand(DOWN)
Thread::sleep(900)
]
Dummy_alle_geschlossen.postUpdate(ON)
Dein eigentliches Problem, das des Timers, ist allerdings noch ungelöst. Rein formal sollte der Timer funktionieren.
Es kann allerdings sein, dass Thread::sleep() in diesem Zusammenhang Probleme bereitet, weil es im Kontext des Lambdas definiert ist (sollte eigentlich keine Rolle spielen, aber trotzdem...).
openHAB4.3.3 stable in einem Debian-Container (bookworm) (Proxmox 8.3.5, LXC), mit openHABian eingerichtet