Zwei Bedingungen in einer Rule (When - Part)

Einrichtung der openHAB Umgebung und allgemeine Konfigurationsthemen.

Moderatoren: seppy, udo1toni

Antworten
Baumtasche
Beiträge: 82
Registriert: 14. Sep 2020 21:52
Answers: 0

Zwei Bedingungen in einer Rule (When - Part)

Beitrag von Baumtasche »

Hallo zusammen,

ich möchte gerne folgendes umsetzten: Wenn ich nicht im Urlaub bin (ItemUrlaubsmodus = OFF) dann sollen die Rolläden um 7:00 hochfahren, am Wochenende und im Urlaub , sollen sie erst um 9:00 hochfahren.

Ich habe es mit folgenden Code versucht, aber da stimmt etwas mit der Syntax nicht. Geht das überhaupt so, dass ich im When-Part zwei Bedingungen abfrage?

Code: Alles auswählen


rule "Schlafzimmer Rollos hoch"
when
    Time cron "0 00 7 ? * MON-FRI *"  and ItemUrlaubsmodus.state == OFF or 
    Time cron "0 00 9 ? * SAT,SUN *"  and ItemUrlaubsmodus.state == ON
then
  // Rolladen hoch
Danke schon mal für eure Hilfe

Benutzeravatar
udo1toni
Beiträge: 15265
Registriert: 11. Apr 2018 18:05
Answers: 245
Wohnort: Darmstadt

Re: Zwei Bedingungen in einer Rule (When - Part)

Beitrag von udo1toni »

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

Antworten