Immer wieder gern genommenes Missverständnis.
Das when ist keine Auflistung von Bedingungen, sondern es handelt sich um Trigger. Jeder aufgeführte Trigger führt zur Ausführung der Rule, wenn der Trigger auftritt. Es ist nicht möglich, das Triggern einer Rule zu verhindern, wenn ein aufgeführter Trigger auftritt.
Es ist aber durchaus möglich, im then-Teil beliebigen Code zu schreiben, auch solchen, der zusätzliche Bedingungen definiert. also so:
Code: Alles auswählen
rule "Schlafzimmer Rollos hoch"
when
Time cron "0 00 7 ? * MON-FRI" or
Time cron "0 00 9 ? * *"
then
if(ItemUrlaubsmodus.state == ON && now.getHourOfDay < 9) return; // Abbruch falls Urlaub und vor 9 Uhr
// Rolladen hoch
// je nach Ausführung testen, ob der Rollladen bereits geöffnet wurde
end
Es gibt also zwei Trigger, einmal den Trigger werktags um 7 Uhr und einen zweiten Trigger für 9 Uhr (der 2. Trigger aber an jedem Tag!)
In der Rule wird geprüft, ob Urlaub aktiv ist und gleichzeitig nicht der Zeitpunkt des 2. Triggers erreicht ist. Ist das der Fall, so wird die Rule umgehend abgebrochen (man beachte das ; hinter dem return, das ist wichtig!)
Ich nutze hier Aktoren zur Steuerung, die direkt positionieren können. Mein Befehl zum Öffnen lautet also RollladenItem.sendCommand(0). Wenn der Rollladen diese Position bereits hat, passiert bei mir genau nichts (abgesehen natürlich von einer Meldung in der events.log). Es gibt aber Rollladenaktoren, die zumindest kurz "zucken", das muss man dann verhindern, indem man zunächst prüft, ob der Rollladen schon bewegt wurde. (deshalb die zusätzliche Bemerkung)
openHAB4.3.5 stable in einem Debian-Container (bookworm) (Proxmox 8.4.1, LXC), mit openHABian eingerichtet