In diesem Beitrag zeige ich dir, wie du in openHAB sogenannte „rules“ erstellst. Das sind einfache wenn-dann Anfragen, mit denen du viele Dinge umsetzen kannst.
Inhalt
Ohne „rules“ ist ein Smart Home nicht smart. Regeln automatisieren bestimmte Abläufe und erleichtern damit erst den Alltag.
Der grundlegende Aufbau
Als erstes musst du verstehen, wie die Regeln grundsätzlich aufgebaut sind. Hierzu mal ein kurzes Beispiel:
rule "Name"
when
//Auslöser
then
//Anweisung
end
Code-Sprache: JavaScript (javascript)
Am Anfang wird zuerst ein Name für die Regel festgelegt. Dieser sollte natürlich möglichst gut beschreiben, was die Regel macht, da es sonst wirklich, und ich spreche da leider aus Erfahrung ;-), seht schnell unübersichtlich wird.
In dem when-Teil wird der Auslöser für die Regel festgelegt. Das kann z.B. eine bestimmte Zeit oder ein Ereignis sein.
Unter then wird definiert, was passieren soll, wenn die Regel ausgelöst wird. Das kann bspw. eine Schaltung einer Lampe oder eine Nachricht an dein Telefon via Telegram sein, so wie es in diesem Beitrag beschrieben ist.
Auslöser
Nun mal ein paar häufig genutzte Beispiele für Auslöser:
Hinweis: Fett gedruckte Großbuchstaben musst du durch deine Daten ersetzen, also z.B. ITEM durch eg_wz_licht.
Name | Beschreibung | Code | Beispiel |
---|---|---|---|
Befehl erhalten | Löst aus, wenn ein Item einen Befehl erhält. | Item ITEM received command COMMAND | Item eg_wz_licht received command ON |
Ändern | Wird ausgelöst, wenn ein Item seinen Wert oder Status zu dem zugeordneten Wert ändert. Wenn es bei jeder Änderung aktiviert werden soll, einfach den „to“-Teil oder „from“-Teil weglassen. | Item ITEM changed from STATE to STATE | Item eg_anwesenheit changed from ON to OFF |
Zeit (Time-Cron) | Wenn du eine Regel zeitgesteuert starten möchtest, kannst du sogenannte Time-Crons benutzen. Diese kannst du z.B. auf der Website cronmaker.com generieren. | Time cron „CRON„ | Time cron „0 20 8 ? * MON-DO *“ |
Channel-Trigger | Hiermit kannst du z.B. auf das Astro Binding reagieren, wenn dieses z.B. den Sonnenaufgang meldet. | Channel „CHANNEL“ triggered EVENT | Channel „astro:sun:zuhause:set’event“ triggered START |
Es gibt noch viele andere Trigger, allerdings findet man diese nur auf der englischen Dokumentation von openHAB.
Aktionen
Nachdem ein Trigger ausgelöst hat, wird der „then“-Teil der Regel ausgeführt. Hier kann man z.B. Nachrichten via Telegram senden, Items schalten oder Informationen abfragen. Es können Schleifen, Variablen und Abfragen benutzt werden.
Häufig verwendet man Befehle, wie z.B. eg_wz_licht.sendCommand(ON) oder lampe.state. Hier alle Befehle aufzulisten wäre unmöglich…schaue also einfach in der offiziellen openHAB Dokumentation auf englisch nach oder schreibe deinen konkreten Anwendungsfall gerne in die Kommentare und ich werde versuchen, dir die passende Regel erklären. Wenn du noch weitere Beispiele für Regeln sehen möchtest, kannst du sehr gerne z.B. meinen Beitrag zu einer automatischen Steuerung der Rollläden ansehen, in dem ich auch mehrere Regeln dazu erkläre.
Noch Fragen? Dann ab damit in die Kommentare! 😉
hallo
evtl. kannst du mir ja helfen
rule „Tür Status ändert sich, gleich tv ton stum“
when
Item MAXFensterkontaktContactState changed to OPEN
then
und hier weiß ich nicht was ich schreiben muss nichts funktioniert,
mein item=mute müsste von off auf on geschaltet werden
danke im voraus
Hallo Andy,
das sieht ja schonmal ganz gut aus ?. Dein Item, welches z.B. TV heißt, müsste dann also auf ON gesetzt werden. Dafür kannst du den Befehl TV.sendCommand(ON); benutzen. Und am Ende nicht vergessen, end zu schreiben ?. Wie steuerst du denn, ob du den Fernseher stumm stellst? Hast du einen Smart TV eingebunden und dann das entsprechende Item für das Stummschalten erstellt?
Viele Grüße
Jan
Hi,
ich habe folges Problem mit einer Regel.
Ich möchte die Sender meiner DreamBox per Alexa schalten.
Nutze ich folgendes, funktioniert es, aber ich kann nur einstellige Ziahlen versenden. Möchte ich z.B. commnd=31 auslösen, wird nur command=3 ausgelöst.
rule „ZDF“
when
Item DM_zdf received command
then
switch(receivedCommand) {
case ON : sendHttpGetRequest(„http://IPderBox:80/web/remotecontrol?command=5“)
}
Nun schalte ich im WebIf den Sender und hole mit mit
http://ip-box/web/getcurrent
die Werte, die an den Receiver gesendet werden.
Dann habe ich die Regel wie folgt erstellt:
rule „RTL“
when
Item DM_rtl received command
then
switch(receivedCommand) {
case ON : sendHttpGetRequest(„http://IPderBox/web/zap?sRef=1:0:19:EF10:421:1:C00000:0:0:0“)
}
end
Leider funktioniert dass nicht. Wenn ich einen Schalter betätige, passiert leider nichts.
Wenn ich den Link ausführe, funktioniert es.
Habt Ihr einen Tipp für mich?
Gruß
Ralf
Hallo Ralf,
Ich habe es selbst noch nicht probiert, unseren Receiver mit OpenWebIf in openHAB zu integrieren, aber eine sehr gute Idee ;-). Funktioniert die Eingabe der zweistelligen Kanäle nur über ne Alexa nicht oder auch über die Sitemap nicht? Mein Ansatz wäre noch, versuchen eine zweistellige Senderzahl in den Code der Rule hard-zu-coden, um dann zu sehen, ob das vielleicht funktioniert.
Ich würde mich freuen, wenn du uns weiter auf dem Laufenden hältst ;-).
Viele Grüße
Jan
Hallo Jan,
ich habe es hinbekommen. Es läuft auch sehr gut.
zuerst müssen Items für jeden Sender angelegt werden und mit [Lighting] getagged werden.
Anschließend suchst du dir mit http://ipderbox/web/getcurrent den Wert, der zwischen den spitzen Klammern steht.
1:0:19:7E:C:85:C00000:0:0:0:
Anschließend folgende Regel erstellen, den Wert anpassen und speichern:
rule „Das Erste“
when
Item DM_ard received command ON
then
{ sendHttpGetRequest(„http://ipderbox:80/web/zap?sRef=1:0:19:283D:3FB:1:C00000:0:0:0:“) }
end
Das war es auch schon, Alexa kommtr deiner Aufforderung zum Umschalten nach.
Gruß
Ralf
Hallo Ralf,
super, dass das dann jetzt funktioniert hat. Die Lösung geht natürlich auch, aber dann muss mann sich auf die Sender festlegen, die man per Alexa schalten möchte, wobei das ja vermutlich (zumindest bei mir) überschaubar ist. Danke für die Lösung! Ich werde dann auch mal probieren unsere TV-Box in openHAB zu integrieren.
Viele Grüße
Jan
Hallo Jan,
erstmal danke für den coolen Blog…
Ich habe eine Modbus Verbindung mit einem Wago Controller realisiert, was auch super funktioniert. Leider ist das mit dem Schalter Items im Openhab so eine Sache, da ich im Wago Controller intern Schaltungen definiere, sollte der Schalter im Openhab über Modbus seinen Status auf An oder Aus anpassen damit ich eben über die Openhab Visualisierung weiß ob es An oder eben Aus ist. Dazu stelle ich den Aktuellen Status über Modbus zur Verfügung, leider weiß ich nicht wie ich den Switch (Visueller Openhab Schalter oder Taster) und den Contact (Status Licht) in einem Item bzw. auf der Sitemap verknüpfen soll.
Das wollte ich mit einer Regel umsetzen, was mir aber nicht gelingt.
Ich habe wie schon gesagt zwei Modbus Adressen, eine für einen Visuellen Schalter in Openhab (kann auch ein Taster sein, ist der Wago egal) und eine Rückmeldung dass das Licht an ist.
Das würde ich gerne in der Sitemaps als Schalter darstellen der von Rot auf Grün wechselt, aber es darf nicht von Openhab über Modbus ein neues Signal an die Wago herausgeschickt werden außer es wird über den Visuellen Schalter in Openhab ausgelöst. Ich hoffe ich habe es verständlich ausgedrückt und es gibt dafür eine Lösung.
Wäre super wenn du mir da vielleicht auf die Sprünge helfen könntest.
Hallo Tobi,
schön, dass dir mein Blog gefällt ;-).
Ich kenne mich zwar nicht so mit Modbus und Wago Controllern aus, aber ich versuche trotzdem Mal, auf der openHAB-Seite zu helfen. In welcher Form wird denn der Status vom Wago zurückgegeben?
Bei MQTT z.B. gibt es einen command(cmnd)- und einen status(stat)-Channel, den man in der Item-Konfiguration festlegen kann.
Viele Grüße
Jan
Ich habe ein thing erstellt wo ich einmal ein Switch Items und ein Contact Items definiert habe.
Wie schon gesagt schickt Openhab auf Switch Items ein An oder Aus über meiner definierten Modbus Adresse zur Wago. Das gleiche macht die Wago auch, sie schickt ein An oder Aus an Openhab über einer Modbus Adresse, was ich in Openhab als Contact Items angelegt habe. Das Contact Items nimmt immer den Status an was das Licht gerade hat egal von was es geschalten wird (openhab, Alexa, Wago Programm…) und da kommt jetzt auch das Problem, da es ja von verschieden stellen aus angesteuert wird, soll der Switch auf der Sitemaps in Openhab mir immer den Aktuelle Status Anzeigen, das kann er aber leider nicht weil er den Status von der letzten Schaltung in Openhab übernimmt. Ich hab mir dann gedacht das ich das dann ja irgendwie über das Contact Items lösen kann. Wenn Contact An dann Switch Status An und wenn Contact Items aus dann Switch Status Aus, es darf halt bei der Status Änderung kein schaltbefehl An oder Aus Impuls auf dem Modbus gesetzt werden, weil sonst schaltet mit ja die Wago wieder. Ich bräuchte ein Schalter auf der Sitemaps wie ein Kontrollschalter, der auf mein Switch Items an und Aus übermittelt und aber ein Status anzeige hat wo er von dem Contact items erhält.
Hallo Tobi,
jetzt habe ich glaube ich verstanden, was du meinst. Also mir ist kein Weg bekannt, wie man das ganze umsetzen könnte, sodass der Status auch in dem Schalter zum Schalten zu sehen ist. Das einzige, was mir einfällt ist, dass man in der Paper UI beim Erstellen eines Items auch einen Channel für den Status einstellen kann. Hier könntest du den Channel eintragen, den du auch bei dem Contact-Item benutzt. Sonst finde ich hier die Informationen auf der openHAB Seite ganz gut.
Viele Grüße
Jan
hallo
ich möchte gerne das täglich eine info auf meinem tv kommt
und das um 18:00
wenn ich in der rul auf den link klick kommt diese auch auf dem tv
aber leider sonst nicht was stimmt da nicht
das ist meine rule
rule „Fische füttern“
when
Time cron „0 0 18 1/1 * ? *“
then
sendHttpGetRequest(„http://192.168.178.45:80/web/message?text=FISCHE%20füttern!&type=1&timeout=5“)
end
Hallo Andy,
eigentlich sieht die Rule gut aus. Probier Mal, im then-Teil einen Log-Eintrag zu erstellen oder eine Lampe oder ähnliches zu steuern. Dann kannst du sehen, ob die Regel ausgelöst wurde. Wenn das auch nicht funktioniert, muss es an dem Auslöser-Teil liegen. Hier kannst du dann Mal versuchen, die Rule durch einen Schalter testweise zu starten.
Ich hoffe, dass ich dir helfen konnte. Halte uns gerne hier auf dem Laufenden ;-).
Viele Grüße
Jan
Hallo Jan
Ich möchte gerne meine Weihnachtsbeleuchtung einschalten, wenn die Wetterstation das Signal für Dämmerung sendet, aber nur im November, Dezember, Januar und Februar.
Bei „when“ scheint man die Trigger aber nur mit „or“ verknüpfen zu können und nicht mit „and“.
Auch ohne die Zeitabhängigkeit scheint es nicht zu funktionieren.
Das habe ich bisher:
rule „Weihnachtsbeleuchtung Ein“
when
Item dawn2 received command
// Time cron „* * * ? 1,2,11,12 *“
then {
if(dawn2.state == OPEN
sendCommand(TE_Garage_Steckdose, ON)
}
end
Vielleicht hast Du ja eine Idee woran es liegen könnte.
dawn2 ist vom Typ contact:
Contact dawn2 „Dämmerung 2 [MAP(alarm.map):%s]“ (WG_Wiga,TE_Garage,TE_Wiga,Aussen) { knx = „<5/3/0“ }
TE_Garage_Steckdose ist ein Switch
Switch TE_Garage_Steckdose „Steckdose Terrasse Garage“ (TE_Garage,Steckdose) [„Lighting“] { knx = „3/1/2+<3/1/102“ }
Gruss
Alexander
Hallo Alexander,
puh, stimmt, um die Weihnachtsbeleuchtung muss ich mich auch langsam mal kümmern ? .
Wenn folgender Coder nicht funktioniert, wäre wichtig zu wissen, was im Log steht. Da kannst du dann normalerweise sehen, ob z.B.
dawn2
überhaupt geändert wurde, sodass die Rule ausgelöst wird.In deinem Code sind im then-Teil auch Klammern, welche nur bei if-Abfragen oder anderen Schleifen benötigt werden. Ich habe die Rule jetzt Mal so umgeschrieben, dass zuerst eine Variable mit dem derzeitigen Monat belegt wird. Dann wird, sobald die Dämmerung über den Kontakt ausgelöst wird, überprüft, ob es sich um die entsprechenden Monate handelt und dann entsprechend geschaltet.
Probiere doch gerne Mal aus, ob das so funktioniert ?.
derzeitigerMonat = now.getMonthOfYear
rule “Weihnachtsbeleuchtung Ein”
when
Item dawn2 changed to OPEN
then
if(derzeitigerMonat < 3 || derzeitigerMonat > 10) {
sendCommand(TE_Garage_Steckdose, ON)
}
end
Viele Grüße
Jan