openHAB :: Regeln planen und konfigurieren
openHAB 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.
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.
Daniel Wenzel
30.01.2016 @ 19:13
Hallo Christian,
auch dir danke fürs Lob.
Die Konfigurationsdatein (items, rules, persistence,scripts,transform) kannst du entweder aufteilen oder sämtliche, jeweilige Inhalte in eine Datei packen.
Beispielsweise kannst du alle items in der default.items definieren oder übersichtlicher auf verschiedene .items-Dateien aufteilen.
Denk aber dran, dass du bei den rules Bibliotheken, die du für eine Regel benötigst, immer in der jeweiligen .rules Datei einbindest, auch wenn diese durch mehrere .rules-Dateien „doppelt“ eingebunden werden.
Grüße, Daniel
Christian
30.01.2016 @ 19:07
Hallo,
ich schließe mich meinen Vorredner an, echt super Seite!
Eine Frage hätte ich, schreibt man jede Rules in eine extra Datei oder schreibt man alles in eine Datei hintereinander weg?
Gruß
Christian
Daniel Wenzel
27.01.2016 @ 01:09
Da gibt es zwei Möglichkeiten:
1) Du erschaffst ein Dummy-Item. Wenn dieses Item durch Tasker geschaltet wird, kannst du in einer Regel die beiden Lichter schalten
2) Du packst beide Lichter in eine Gruppe und schaltest von nun an nur noch die Gruppe an oder aus.
Daniel
22.01.2016 @ 23:21
Hey echt super Seite mit super Grundlagenwissen!
Weißt du vielleicht wie ich mehrere Items mit einem einzigen Switch steuern kann?
Ich möchte z.B folgende zwei Items gleichzeitig ausführen:
Switch Light_EG_Daniel_Weiss „Weißes Licht“ (EG_Daniel, Lights) {milight=“bridge1;7;whiteMode“}
Switch Light_EG_Daniel_Weiss „Weißes Licht“ (EG_Daniel, Lights) {milight=“bridge1;8;whiteMode“}
Ich verwende meist Android in Verbindung mit Tasker um mit einem httpget den Switch auszulösen wenn ich nach hause komme (Wlan-Erkennung).
Um das ganze zu automatisieren möchte ich das networkhealth addon nutzen. Damit könnte ich das Licht auch automatisch Aus schalten wenn mein Android vom Netzwerk disconnected ist.
Daniel Wenzel
12.01.2016 @ 16:33
Hallo,
der openHAB-Server muss die Mails ja in irgendeine Weise versenden können. Dazu benötigt er einen sogenannten MTA (Mail-Transfer-Agent).
Ich werde irgendwann mal dazu eine kleine Anleitung schreiben. Bis dahin kannst du dich ja selber ein wenig in z.B. postfix oder exim einlesen.
Grüße
Pedro
12.01.2016 @ 12:58
Hallo nochmal :-), da ich deine Seite echt cool finde probiere ich immer mehr aus. Ich habe gestern das mit dem sendMail versucht was leider nicht ganz funktioniert hat.
Muss ich dafür etwas importieren oder ein addon herunterladen? Gruß und danke im Voraus.
Daniel Wenzel
19.12.2015 @ 16:52
Hallo Namensvetter ;)
Vielleicht könnte es so funktionieren:
import org.joda.time.*
rule "Licht dimmen"
when
Item Licht_an changed to ON
then
if(now.getHourOfDay < = 6 || now.getHourOfDay >= 22) {
sendCommand(Licht_Dimmer, 50);
createTimer(now.plusSeconds(5)) [| sendCommand(Licht_Farbe_Orange, ON) ]
}
end
Ich habs allerdings selbst nicht getestet, hört sich aber in der Theorie gut an ;)
Daniel
19.12.2015 @ 14:01
Hey, super Website von dir, sehr interessant und verständlich aufgebaut!
Ich hätte zu den Zeitgesteuerten regeln eine Frage:
Welchen Befehl kann ich verwenden um folgendes umzusetzen:
Wenn zw. 22:00 bis 06:00 das Item „Licht an“ aktiviert wird DANN Dimme es auf 50% und Farbe Orange zum Beispiel.
Ich weiß nur nicht wie ich den Zeitraum angeben kann welcher die Rule dann triggert fall das Licht eingeschaltet wird.
mfg
Daniel