Das ist einem Denkfehler Deinerseits geschuldet
Du nutzt ein if - else.
Du prüfst, ob Zeitraum erfüllt und Timer nicht gestartet. Ist das der Fall, legst Du den Timer an (soweit korrekt)
Andernfalls planst Du den Timer erneut (also falls auch nur eine der Bedingungen oben nicht erfüllt ist).
Weiterhin triggert die Rule bei jeder Änderung. Im Zweifel wird das Licht nach weniger als 90 Minuten ausgehen, es wäre also sinnvoll, auf changed to OFF zu triggern, da dies ohnehin der letzte Trigger ist.
Code: Alles auswählen
rule "Sleeptimer"
when
Item EG_FLUR_LED_Treppe_Schalten changed to OFF // Licht schaltet nach Bewegung wieder aus
then
timer_sleep?.cancel // Timer entfernen, falls geplant
if(now.toLocalTime.getHour < 23 && now.toLocalTime.getHour > 6) // falls Uhrzeit zwischen 7:00:00 und 23:00:00
return; // Regel abbrechen
timer_sleep?.cancel // Timer entfernen, falls geplant
timer_sleep = createTimer(now.plusMinutes(90), [ | // Timer anlegen (Lambda ist 2. Parameter der Definition)
PanasonicTV_Remote.sendCommand("POWER")
// weitere Schritte
]) // Ende von createTimer
end
Der Code ist etwas anders formatiert und arbeitet im Detail etwas anders, sollte aber Deinem Wunsch entsprechen.
Die Rule wird nur beim Ausschalten des Lichts getriggert.
Zunächst wird ein eventuell laufender Timer entfernt. Das Fragezeichen zwischen
timer_sleep und
.cancel bewirkt, dass der Befehl
.cancel nur ausgeführt wird, wenn der Timer auch existiert. Ist also das Gleiche wie
if(timer_sleep !== null) timer_sleep.cancel.
Dieser Punkt ist nicht unwichtig, denn wir wollen nicht, dass ein eventuell kurz vor 7 Uhr gestarteter Timer noch auf Standby schaltet, falls danach wieder Bewegung erkannt wird.
Eventuell möchtest Du noch eine weitere Rule anlegen, die um 7 Uhr gezielt laufende Timer cancelt.
Sollte die Rule zwischen 7 Uhr und 23 Uhr getriggert werden, so wird sie an dieser Stelle abgebrochen.
Anschließend ist sichergestellt, dass es keinen laufenden Timer gibt, aber der Zeitraum passt.
Nun kann also der Timer angelegt werden.
Ich nutze gerne die Schreibweise, bei der deutlich wird, dass das Lambda (Teil zwischen [ | und ]) ein Teil des Funktionsaufrufs
createTimer() ist. Deshalb schreibe ich es innerhalb der Klammern und trenne es als zweiten Parameter mit einem Komma ab.
Ich gehe davon aus, dass
PanasonicTV_Remote.sendCommand("POWER") nicht hinreichend ist. Oder ist dies ein definierter Ausschaltbefehl?
openHAB4.3.3 stable in einem Debian-Container (bookworm) (Proxmox 8.3.5, LXC), mit openHABian eingerichtet