Ankündigung

Einklappen
Keine Ankündigung bisher.

Deklaration und createTimer

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

    [Handbuch] Deklaration und createTimer

    Hallo zusammen,

    habe mir über einfache Rules (mit cron) eine Automatik erstellt, mit denen ich Zeitgesteuert Lichter im Haus ein und ausschalte.

    Beispiel:

    Code:
    rule Licht_UG_Esszimmer_ein
    when
      Time cron "0 23 16 * * ?"
    then
      if (Lichtautomatik.state == ON) {
        Licht_UG_Esszimmer_Tisch.sendCommand(ON)
      }
    end
    
    rule Licht_UG_Esszimmer_aus
    when
      Time cron "0 45 20 * * ?"
    then
      if (Lichtautomatik.state == ON) {
        Licht_UG_Esszimmer_Tisch.sendCommand(OFF)
      }
    end
    Nun bin ich zufällig auf der openHab Homepage (1) über die Funktion "createTimer(now.plusMinutes(5))" gestolpert.
    Mit dieser könnte ich meine Rules etwas vereinfachen. Wie funktioniert dies genau bzw. wie muss ich die Timer Variable deklarieren?

    (1) CUPSBinding - openhab - Documentation of the CUPS binding Bundle - empowering the smart home - Google Project Hosting

    Versucht habe ich folgendes:

    Code:
    rule Licht_EIN
    when
        Item Licht_OG_Kind1_Licht2 changed
    then
            if (Licht_OG_Kind1_Licht2.state==ON) {
                    LichtTimer = createTimer(now.plusMinutes(5)) [|
                            sendCommand(Licht_OG_Kind1_Licht2,OFF)
                    ]
            }
    end
    Der Designer gibt mit dann folgenden Fehler zurück:

    Couldn't resolve reference to JvmIdentifiableElement 'LichtTimer'.

    Wie muss ich die Variable LichtTimer deklarieren, damit der Befehl funktioniert?

    Gruß
    mepi0011

    #2
    Hi Pierre,

    Zitat von mepi0011 Beitrag anzeigen
    Wie muss ich die Variable LichtTimer deklarieren, damit der Befehl funktioniert?
    das Handle auf den Timer brauchst Du nur dann, wenn Du damit im weiteren Verlauf der Regel noch etwas machen möchtest (z.B. den Timer canceln). In Deinem Fall scheinst Du das aber nicht zu brauchen, also reicht:

    Code:
    rule Licht_EIN
    when
        Item Licht_OG_Kind1_Licht2 changed
    then
            if (Licht_OG_Kind1_Licht2.state==ON) {
                    createTimer(now.plusMinutes(5)) [|
                            sendCommand(Licht_OG_Kind1_Licht2,OFF)
                    ]
            }
    end
    Wenn Du in einem anderen Fall Zugriff auf das Handle brauchst, mußt Du die Variable vorher (außerhalb der Rule) deklarieren, also in etwa so:


    Code:
    import org.openhab.model.script.actions.Timer
    
    var Timer LichtTimer = null
    Weiterhin schöne Weihnachtstage,

    Thomas E.-E.
    Visualisierung, Rule/Logic-Engine, Integrationsplattform mit openhab (Supportforum)

    Kommentar


      #3
      Hallo Thomas,

      vielen Dank für die Erklärung!

      Mein Vorhaben funktioniert nun!

      PS: kann mann now.plusMinutes() auch einen Wert größer 60 geben? Hatte hier das Problem, dass das Licht nicht mehr ausgeschaltet wurde.

      Gruß
      Pierre

      Kommentar


        #4
        Hi Pierre,

        klar, Werte über 60 sollten auch ganz normal funktionieren - aber beachte bitte, dass die Timer keinen openHAB-Restart überleben

        Grüße,
        Kai

        Kommentar


          #5
          Hallo Kai,

          einen Restart habe ich nicht durchgeführt! Den Timer erzeuge ich innerhalb einer IF-Abfrage, kann es sein dass der Timer nach dem Verlassen der Abfrage gelöscht wir?

          Code:
          rule Auto_Licht_UG_Esszimmer_Decke
          when
            Time cron "0 23 16 * * ?"
          then
            if (Lichtautomatik.state == ON) {
              Licht_UG_Esszimmer_Decke.sendCommand(ON)
              createTimer(now.plusMinutes(240)) [|    
                  sendCommand(Licht_UG_Esszimmer_Decke,OFF)
                  ]
            }
          end
          Gruß
          Pierre

          Kommentar


            #6
            Die If-Abfrage sollte ebenfalls kein Problem sein. Kannst Du es etwas weiter analysieren? Geht es bei Werten <60? Oder wenn Du kein If hast?

            Grüße,
            Kai

            Kommentar


              #7
              verwendest Du den Designer? Gibt der vielleicht noch einen Hinweis?
              Visualisierung, Rule/Logic-Engine, Integrationsplattform mit openhab (Supportforum)

              Kommentar


                #8
                Zumindest bei now.plusSeconds() klappen Werte größer 60 problemlos, daher vermute ich, dass das bei Minuten auch kein Problem ist.

                Probleme habe ich beobachtet, wenn die Regel-Datei bei laufendem Timer noch mal geändert wurde, ist ja auch irgendwie logisch. Vielleicht hast Du da noch mal gespeichert?

                Kommentar


                  #9
                  Hallo,

                  das mit den Werten größer 60 Minuten hat sich erledigt, war falscher Alarm!

                  Die Items die ich in meiner Regel verwendet habe, fingen mit einer Zahl an (item 230V_Wohnzimmer. Der Designer hat mir hier einen Fehler angezeigt, das Item habe ich nun umbenannt. Evtl. lag es daran, da ich zu beginn des Designer nicht verwendet habe.

                  Gruß
                  mepi0011

                  Kommentar


                    #10
                    Hallo,

                    ist zwar schon etwas her aber ich wollte keinen neuen Thread extra aufmachen.
                    Ich habe auch vor Zeitverzögert meine LED Leisten auszuschalten. Die Leisten sollten ausgehen sobald ich meine TV Board ausmache, am besten Zeitverzögrt mit 5 min damit ich noch mit Licht ins Bad kann.

                    Hier meine Regel:
                    rule "LED Wohnen Aus wenn TV Board aus"
                    when
                    Item power_onkyo changed to OFF //Wenn TV Board Status OFF annimmt
                    then
                    createTimer(now.plusMinutes(5)){
                    sendCommand(LED_Alle,OFF) //werden die LED´s ausgeschalten
                    }
                    end

                    Leider sagt mir mein Designer "Invalid number of arguments. The methode createTimer(AbstractInstant,Procedure0) is not applicable for the arguments (DateTime)

                    Mein Openhab2 Release Build läuft auf einem Windows on an Stick.

                    Danke schonmal

                    Seb

                    Kommentar


                      #11
                      Zitat von SeKa91 Beitrag anzeigen
                      Hallo,


                      Hier meine Regel:
                      rule "LED Wohnen Aus wenn TV Board aus"
                      when
                      Item power_onkyo changed to OFF //Wenn TV Board Status OFF annimmt
                      then
                      createTimer(now.plusMinutes(5)){
                      sendCommand(LED_Alle,OFF) //werden die LED´s ausgeschalten
                      }
                      end
                      Hab meinen Fehler gefunden. Ich hatte "{ }" statt "[ ]" klammern verwendet.

                      Kommentar


                        #12
                        oder man nutzt anstelle von Timern das Expire Binding ... einfacher aufzusetzten

                        Kommentar

                        Lädt...
                        X