openHAB :: Regeln planen und konfigurieren

openhabrules-150x1501openHAB wird erst durch ein komplexes Regelwerk zur wahren Hausautomatisierung. Dazu stehen uns eine Reihe von Prüfungen und Aktionen zur Verfügung, um möglichst viele Prozesse in unserem IoT-Haus zu automatisieren.

 

 

 

 

little_blue_dot Einleitunglittle_blue_dot Einbinden der Internetgeschwindigkeitlittle_blue_dot RFID-Lesegerät einbinden
little_blue_dot Installationlittle_blue_dot Präsenzerkennung via Bluetooth und Pinglittle_blue_dot Einbinden von DS18B20-Sensoren
little_blue_dot Konfigurationlittle_blue_dot Kleines Netzwerkmonitoringlittle_blue_dot ical-Abfallkalender einbinden
little_blue_dot Reverse-Proxy für OpenHABlittle_blue_dot Einbinden von LG-Fernsehern [Update]little_blue_dot openHAB als Wecker
little_blue_dot Datenspeicherung und Statistikenlittle_blue_dot Einbinden Schaltern und Kontaktenlittle_blue_dot Einbinden von Bewegungssensoren
little_blue_dot Regeln planen und konfigurierenlittle_blue_dot Einbinden von Funksteckdosen (433 MHz)little_blue_dot Einbinden einer FritzBox
little_blue_dot Einbinden von USB-Steckdosenleisten (SIS-PMS)little_blue_dot Infrarotgesteuerte Geräte einbindenlittle_blue_dot Sprachausgabe auf einem Raspberry
little_blue_dot Einbinden von Temperatursensorenlittle_blue_dot Steuerung mit NFC-Tagslittle_blue_dot Schaltbare Steckdosenleiste mit Relais
little_blue_dot Externer Zugriff mit my.openhab

 

 

Allgemeines zu Regeln

Durch viele Auslöser können wir openHAB dazu bewegen, etwas zu tun. Dabei verläuft eine Regel immer nach dem gleichen Schema: Wenn das passiert, was ich dir sage, dann tue das, was ich in diesem Fall von dir fordere. Die erstellten Regeln werden stets mit einem einleitenden „rule“ mit einem einzigartigen Titel benannt.

In diesem Beitrag möchte ich auf die unterschiedlichen Auslöser einer Regel eingehen und anhand von Beispielen zeigen, wie diese praktisch anzuwenden sein könnten.

Eine beispielhafte, komplette Regel könnte so aussehen:

rule “Aquarium Wasserstand niedrig”
when
    Item WTR_AQ changed from 1 to 0
then
    sendCommand(AQ_PUMPE, OFF)
    sendMail(“deinmail@adresse.de”, “Wasserstand Aquarium zu niedrig”, “Der Wasserstand im Aquarium ist zu niedrig, die Pumpen wurden deaktiviert.”)
end

 

Der Bereich „when“

In diesem Bereich geben wir an, WANN etwas passieren soll. Dabei können wir auf folgende Events zurückgreifen.

 

Regeln beim Systemstart

Manchmal ist es notwendig, dass gewisse Prozederen beim Systemstart (als beim Start von openHAB) durchgeführt werden müssen. Dazu leiten wir unsere Regeln wie folgt ein:

when 
    System started

 

Die Anwendung in einem Beispiel:

rule “Systemstart” 
when 
    System started 
then 
    postUpdate(TRIGGER_AX, OFF) 
end

In dieser Regel wird beim Starten von openHAB das Item „TRIGGER_AX“ auf den Status „OFF“ gesetzt.

 

Regel nach Uhrzeit

Hier erstellen wir Regeln, die einer klassischen Zeitschaltuhr entsprechen:

when 
    Time cron “0 0 7 * * ?”

In diesem Beispiel wird die Regel um 07:00 Uhr morgens ausgeführt. Dies könnte so sinnvoll eingesetzt werden: Schalte morgens um 07:00 Uhr die Kaffeemaschine ein und um 07:15 wieder ab.

rule “Morgens Kaffee an” 
when 
    Time cron “0 0 7 * * ?” 
then
    sendCommand(SWITCH_KAFFEE, ON)
end

rule “Morgens Kaffee aus” 
when 
    Time cron “0 15 7 * * ?” 
then
    sendCommand(SWITCH_KAFFEE, OFF)
end

An diesen beiden Regeln kann man erkennen, wie sich das cron-Konstrukt ergibt. Von links nach rechts werden die Sekunde, die Minute und die Stunde der Schaltung angegeben. Das Item „SWITCH_KAFFEE“ wird in diesem Fall ein- und später wieder ausgeschaltet.

 

Regel in Zeitintervallen

Alternativ zum Schalten zu festen Uhrzeiten kann eine Regel auch in Zeitintervallen ausgeführt werden.

when 
    Time cron “0 0/5 * * * ?”

 

Wollen wir beispielsweise erreichen, dass alle 5 Minuten das Item „LICHT_WZ“ ein, und 5 Sekunden später wieder ausgeschaltet wird, sähe die entsprechende Regel so aus:

rule “Cron 5 Minuten” 
when 
    Time cron “0 0/5 * * * ?” 
then
    sendCommand(LICHT_WZ, ON)
    createTimer(now.plusSeconds(5)) [| sendCommand(LICHT_WZ, OFF) ]
end

Hier sehen wir im Gegensatz zum ersten Beispiel eine kleine Änderung im cron-Konstrukt: Mit der Angabe von „0/5“ wird die Regel alle 5 Minuten ausgeführt, mit „0/15“ jede Viertelstunde usw.

 

Regel bei Änderungen eines Items

Richtig interessant sind Regeln, die auf die Statusänderung eines Item reagieren.

Wir können mit einer Aktion reagieren, wenn sich der Status eines Items irgendwie ändert:

when
    Item LICHT_WZ changed

…oder wenn sich der Status von irgendeinem Status auf ON ändert:

when
    Item LICHT_WZ changed to ON

…oder wenn sich der Status explizit von 1 auf 0 ändert:

when
    Item WTR_AQ changed from 1 to 0

 

Beispiel:
In der folgenden Beispielregel wollen wir eine E-Mail erhalten, wenn der Wasserstand in unserem Aquarium zu niedrig ist. Zudem soll die Pumpe abgeschaltet werden, damit diese nicht trocken läuft.

rule “Aquarium Wasserstand niedrig”
when
    Item WTR_AQ changed from 1 to 0
then
    sendCommand(AQ_PUMPE, OFF)
    sendMail(“deine@mailadresse.de”, “Wasserstand Aquarium zu niedrig”, “Der Wasserstand im Aquarium ist zu niedrig, die Pumpen wurden deaktiviert.”)
end

 

Regeln verketten

Eine Verkettung der bisher kennengelernten when-Abfragen ist natürlich auch möglich:

when
   Time cron “0 0 * * * ?” or
   System started

 

Ein weiteres Beispiel, um aus einzelnen Präsenzen eine Gesamtpräsenz zu ermitteln:

rule “Gesamtpraesenz anwesend”
when
    Item MOB188 changed to ON or
    Item MOB139 changed to ON or
    Item MOB189 changed to ON
then
    postUpdate(PRAESENZ, ON)
end

 

 

Der Bereich „then“

In diesem Bereich wird das angegeben, was bei der Aktivierung der Regel ausgeführt werden soll.

 

Status eines Items ädern

Mit dem Befehl „postupdate“ wird der Status eines Items in openHAB geändert, OHNE eine Schaltung zu tätigen:

then
    postUpdate(PRAESENZ, ON)

 

Ein Item schalten

Im Gegensatz zu „postupdate“ können wir mit dem Befehl „sendcommand“ den Status eines Items ändern UND dieses zeitgleich schalten:

then
    sendCommand(WZ_LICHT, ON)

 

Eine Gruppe schalten

Alternativ zu einem einzelnen Item kann auch eine gesamte Gruppe geschaltet werden. Bei Items, hinter denen ein Execute-Command steckt und/oder bei Items, die einen 433MHz-Schalter bedienen, sollte jedoch der sendCommand nicht an die Gruppe, sonder zeitverzögert an die einzelnen Items gerichtet werden. Dies kann beispielsweise mit der Umsetzung in folgender Regeln erreicht werden:

rule “Morgens alle Lichter an”
when
    Time cron “0 0 7 * * ?”
then
    GRP_LICHTER?.members.forEach[Switch| 
        sendCommand(Switch, ON) 
        Thread::sleep(2000) 
    ]
end

In diesem Beispiel wird für jedes Mitglied der Gruppe „GRP_LICHTER“ das Command „ON“ gesendet, jedoch wird zwischen jedem zu schaltenden Item der Gruppe eine Pause von 2 Sekunden gelassen.

 

Aktion mit Zeitverzögerung

Aktionen im „then„-Block können auch zeitverzögert ausgeführt werden. Beispielhaft sei dies an folgender Regel gezeigt:

rule “Cron 5 Minuten” 
when 
    Time cron “0 0/5 * * * ?” 
then
    sendCommand(LICHT_WZ, ON)
    createTimer(now.plusSeconds(5)) [| sendCommand(LICHT_WZ, OFF) ]
end

Nachdem das Licht eingeschaltet wurde, wird dies mit einer Verzögerung von 5 Sekunden wieder ausgeschaltet.

 

Eine E-Mail versenden

Unter Umständen ist es notwendig, dass openHAB eine E-Mail versendet. Der Aufruf hierfür sieht wie folgt aus:

then
    sendMail(“deine@mailadresse.de”, “Wasserstand Aquarium zu niedrig”, “Der Wasserstand im Aquarium ist zu niedrig, die Pumpen wurden deaktiviert.”)

Zunächst wird die E-Mail-Adresse angegeben, an die die Meldung gesendet werden soll. Getrennt mit einem Komma setzen wir nun die Betreffzeile, anschließend den Mailinhalt.

Etwas komplizierter ist das Senden von Item-Werten:

sendMail("deine@mailadresse.de", "Neue Kontobewegung", "Hallo,\ndein Kontostand hat sich geaendert.\nKonto: Girokonto\nAlter Kontostand: " + previousState + "\nNeuer Kontostand: " + KONTO_GIRO.state + "\nLetzte Buchung:\Partner: " + KONTO_GIRO_REM.state.toString() + "\nBetreff: " + KONTO_GIRO_SUB.state.toString() + "\nBetrag: " + KONTO_GIRO_VAL.state + "\nHerzlichste Gruesse\nDein Haus")

 

Es ist sogar möglich, das Bild einer Webcam in eine Mail zu packen:

sendMail("deinemail@adresse.de", "Wohnzimmer", "Es wurde eine Bewegung im Wohnzimmer festgestellt", "http://IP_DER_WEBCAM/jpg/image.jpg")

 

Wenn-Dann Abfragen

Nicht nur im when-Block können Abfragen eingesetzt werden, sondern auch, vielleicht sogar detailierter, im then-Block. Dabei ist zu beachten, dass das „then“ natürlich nur dann durchgeführt wird, wenn das „when“ zutrifft und die Regel somit aktiviert wird.

Eine IF-Abfrage im then-Block könnte wie folgt gegliedert sein:

if(AW_PRAESENZ.state == OFF)

 

Hier die Abfrage in einem Beispiel:

rule “Fernseher WZ geht an”
when
    Item TVC65 changed to ON
then
    postUpdate(TVC65_POWER, ON)
    postUpdate(TVC65_TON, ON)
    if(PRAESENZ.state == OFF) {
        createTimer(now.plusMinutes(1)) [| sendCommand(TVC65_POWER, OFF) ]
    }
end

Hierbei wird, wenn sich der Fernseher einschaltet, geprüft, ob jemand zuhause ist. Wenn nicht, wird dieser nach einer Minute wieder ausgeschaltet.

 

Weitere Beispiele für ein IF-Konstrukt:

if(WTR_AQ.state != 0)
if(HELLIGKEIT_FLUR.state < 40) {
if((TEMP_WZ < 10)  && (TEMP_WZ >= 30)

Scripte ausführen

Wem die Möglichkeiten nicht reichen, die openHAB für die Regeln bietet, der kann durch Regeln externe Scripte ausführen lassen:

then
    callScript(“feiertage”)

Dabei müssen die aufzurufenden Scripte im Ordner „openhab/configurations/scripts“ hinterlegt sein.