Rules in openHAB erstellen

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.

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
endCode-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.

NameBeschreibungCodeBeispiel
Befehl erhaltenLöst aus, wenn ein Item einen Befehl erhält.Item ITEM received command COMMANDItem eg_wz_licht received command ON
ÄndernWird 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 STATEItem 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 „CRONTime cron „0 20 8 ? * MON-DO *“
Channel-TriggerHiermit kannst du z.B. auf das Astro Binding reagieren, wenn dieses z.B. den Sonnenaufgang meldet.Channel „CHANNEL“ triggered EVENTChannel „astro:sun:zuhause:set’event“ triggered START
Beispiele für Auslöser einer Rule

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! 😉

Hinweis: Mit Sternchen (*) markierte Links auf dieser Seite sind Werbelinks. Beim Kauf darüber erhalte ich eine kleine Provision, der Preis bleibt für dich aber gleich. Damit unterstützt du mich, sodass ich weiterhin kostenlosen Inhalt auf diesem Blog anbieten kann ;-).

Hast du Fragen, Anregungen oder einen einfachen Kommentar dazu? Dann poste es hier!

Bitte bedenke, dass alle Kommentare manuell freigeschaltet werden müssen. Das kann teilweise ein bisschen dauern, du kannst dich aber mit der unten aufgeführten Funktion benachrichtigen lassen, wenn er beantwortet wurde. Das heißt auch, dass Beleidigungen, Spam oder pure Werbung keine Chance haben, auf die Website zu kommen. Deine Email-Adresse wird selbstverständlich nicht veröffentlicht. Erforderliche Felder sind mit * oder (erforderlich) markiert.

Dieser Beitrag hat 14 Kommentare

  1. Avatar-Foto
    Andy

    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

    1. Logo Bloggingwelt
      Jan

      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

  2. Avatar-Foto
    Ralf

    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

    1. Logo Bloggingwelt
      Jan

      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

      1. Avatar-Foto
        Ralf

        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

        1. Logo Bloggingwelt
          Jan

          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

  3. Avatar-Foto
    Tobi

    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.

    1. Logo Bloggingwelt
      Jan

      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

      1. Avatar-Foto
        Tobi

        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.

        1. Logo Bloggingwelt
          Jan

          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

  4. Avatar-Foto
    andy

    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

    1. Logo Bloggingwelt
      Jan

      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

  5. Avatar-Foto
    Alexander

    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

    1. Logo Bloggingwelt
      Jan

      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