Ankündigung

Einklappen
Keine Ankündigung bisher.

Timer openhab2 wo ist der Fehler

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

    Timer openhab2 wo ist der Fehler

    Hallo,
    ich habe zwei Timer für eine Befehlswiederholung.Muss ich irgendwo was umbenennen? Da anscheinend immer nur ein Timer ausgeführt wird.
    Code:
      
      [COLOR=#c586c0]rule[/COLOR][COLOR=#ce9178]"Frostschutz Bad"[/COLOR]
      [COLOR=#c586c0]when[/COLOR]
      [COLOR=#569cd6]Item[/COLOR][COLOR=#4ec9b0]Window_Bad_Kontakt[/COLOR][COLOR=#d4d4d4] changed[/COLOR]
      [COLOR=#c586c0]then[/COLOR]
      [COLOR=#c586c0]if[/COLOR][COLOR=#d4d4d4]([/COLOR][COLOR=#4ec9b0]Window_Bad_Kontakt[/COLOR][COLOR=#d4d4d4].[/COLOR][COLOR=#d4d4d4]state[/COLOR][COLOR=#d4d4d4]==[/COLOR][COLOR=#b5cea8]OFF[/COLOR][COLOR=#d4d4d4]) {[/COLOR]
      [COLOR=#d4d4d4]tContact[/COLOR][COLOR=#d4d4d4].[/COLOR][COLOR=#d4d4d4]cancel[/COLOR]
      [COLOR=#d4d4d4]tContact [/COLOR][COLOR=#d4d4d4]=[/COLOR][COLOR=#569cd6]null[/COLOR]
      [COLOR=#d4d4d4]} [/COLOR][COLOR=#c586c0]else[/COLOR][COLOR=#d4d4d4] {[/COLOR]
      [COLOR=#c586c0]if[/COLOR][COLOR=#d4d4d4](tContact [/COLOR][COLOR=#d4d4d4]!==[/COLOR][COLOR=#569cd6]null[/COLOR][COLOR=#d4d4d4]) tContact[/COLOR][COLOR=#d4d4d4].[/COLOR][COLOR=#d4d4d4]cancel[/COLOR]
      [COLOR=#d4d4d4]tContact [/COLOR][COLOR=#d4d4d4]=[/COLOR][COLOR=#d4d4d4] createTimer(now[/COLOR][COLOR=#d4d4d4].[/COLOR][COLOR=#d4d4d4]plusSeconds([/COLOR][COLOR=#b5cea8]300[/COLOR][COLOR=#d4d4d4])) [|[/COLOR]
      [COLOR=#4ec9b0]Window_Bad_Kontakt[/COLOR][COLOR=#d4d4d4].[/COLOR][COLOR=#d4d4d4]sendCommand([/COLOR][COLOR=#b5cea8]ON[/COLOR][COLOR=#d4d4d4])[/COLOR]
      [COLOR=#d4d4d4]tContact[/COLOR][COLOR=#d4d4d4].[/COLOR][COLOR=#d4d4d4]reschedule(now[/COLOR][COLOR=#d4d4d4].[/COLOR][COLOR=#d4d4d4]plusSeconds([/COLOR][COLOR=#b5cea8]300[/COLOR][COLOR=#d4d4d4]))[/COLOR]
      [COLOR=#d4d4d4]][/COLOR]
      [COLOR=#d4d4d4]}[/COLOR]
      [COLOR=#c586c0]end[/COLOR]
      [COLOR=#6a9955]/**----------------------------------------------------------------------------------------------------------------------------------------------------------- */[/COLOR]
        [COLOR=#c586c0]rule[/COLOR][COLOR=#ce9178]"Frostschutz Ankleide"[/COLOR]
      [COLOR=#c586c0]when[/COLOR]
      [COLOR=#569cd6]Item[/COLOR][COLOR=#4ec9b0]Window_AZ_Kontakt[/COLOR][COLOR=#d4d4d4] changed[/COLOR]
      [COLOR=#c586c0]then[/COLOR]
      [COLOR=#c586c0]if[/COLOR][COLOR=#d4d4d4]([/COLOR][COLOR=#4ec9b0]Window_AZ_Kontakt[/COLOR][COLOR=#d4d4d4].[/COLOR][COLOR=#d4d4d4]state[/COLOR][COLOR=#d4d4d4]==[/COLOR][COLOR=#b5cea8]OFF[/COLOR][COLOR=#d4d4d4]) {[/COLOR]
      [COLOR=#d4d4d4]tContact[/COLOR][COLOR=#d4d4d4].[/COLOR][COLOR=#d4d4d4]cancel[/COLOR]
      [COLOR=#d4d4d4]tContact [/COLOR][COLOR=#d4d4d4]=[/COLOR][COLOR=#569cd6]null[/COLOR]
      [COLOR=#d4d4d4]} [/COLOR][COLOR=#c586c0]else[/COLOR][COLOR=#d4d4d4] {[/COLOR]
      [COLOR=#c586c0]if[/COLOR][COLOR=#d4d4d4](tContact [/COLOR][COLOR=#d4d4d4]!==[/COLOR][COLOR=#569cd6]null[/COLOR][COLOR=#d4d4d4]) tContact[/COLOR][COLOR=#d4d4d4].[/COLOR][COLOR=#d4d4d4]cancel[/COLOR]
      [COLOR=#d4d4d4]tContact [/COLOR][COLOR=#d4d4d4]=[/COLOR][COLOR=#d4d4d4] createTimer(now[/COLOR][COLOR=#d4d4d4].[/COLOR][COLOR=#d4d4d4]plusSeconds([/COLOR][COLOR=#b5cea8]300[/COLOR][COLOR=#d4d4d4])) [|[/COLOR]
      [COLOR=#4ec9b0]Window_AZ_Kontakt[/COLOR][COLOR=#d4d4d4].[/COLOR][COLOR=#d4d4d4]sendCommand([/COLOR][COLOR=#b5cea8]ON[/COLOR][COLOR=#d4d4d4])[/COLOR]
      [COLOR=#d4d4d4]tContact[/COLOR][COLOR=#d4d4d4].[/COLOR][COLOR=#d4d4d4]reschedule(now[/COLOR][COLOR=#d4d4d4].[/COLOR][COLOR=#d4d4d4]plusSeconds([/COLOR][COLOR=#b5cea8]300[/COLOR][COLOR=#d4d4d4]))[/COLOR]
      [COLOR=#d4d4d4]][/COLOR]
      [COLOR=#d4d4d4]}[/COLOR]
      [COLOR=#c586c0]end[/COLOR]
    danke im voraus



















    Zuletzt geändert von alexbn; 22.04.2019, 14:57.

    #2
    Hat sich erledigt glaube ich. Man sollte auch ein "var Timer" erstellen. Manchmal ist es schon schwer

    Kommentar


      #3
      Du musst auf jeden Fall zwei unterschiedliche Variablen für die zwei unterschiedlichen Timer verwenden, sonst kommen sich die beiden Timer in die Quere. Willst Du tatsächlich, dass der Steuerbefehl alle 5 Minuten erneut gesendet wird?

      Ansonsten lässt sich der Code auch noch etwas optimieren:
      Code:
      var Timer tFrostBad = null
      var Timer tFrostAnkleide = null
      
      rule"Frostschutz Bad"
      when
          ItemWindow_Bad_Kontakt changed
      then
          tFrostBad?.cancel
          if(Window_Bad_Kontakt.state!=OFF)
              tFrostBad = createTimer(now.plusSeconds(300)) [ |
                  Window_Bad_Kontakt.sendCommand(ON)
                  tFrostBad.reschedule(now.plusSeconds(300))
              ]
      end
      
      rule"Frostschutz Ankleide"
      when
          ItemWindow_AZ_Kontakt changed
      then
          tFrostAnkleide?.cancel
          if(Window_AZ_Kontakt.state!=OFF)
              tFrostAnkleide = createTimer(now.plusSeconds(300)) [ |
                  Window_AZ_Kontakt.sendCommand(ON)
                  tContact.reschedule(now.plusSeconds(300))
              ]
      end
      Ist es überhaupt richtig, dass Du den Kontakt, der gewechselt hat, immer wieder ON senden lässt?
      Zuletzt geändert von udo1toni; 23.04.2019, 22:41.

      Kommentar


        #4
        Morgen,
        ich nochmal.
        Ja ist richtig das er dann ON senden soll.Hintergrund ist das die Fensterkontakte nicht zyklisch senden können.Wenn sich dann die Betriebsart der RT ändert,wird geheizt obwohl die Fenster geöffnet sind.Dies soll verhindert werden.
        Könntest du mir diese regeln mal erklären? Damit ich die Funktion verstehe.

        Kommentar


          #5
          Code:
          var Timer tFrostBad = null                           // Timer Objekt erzeugen
          
          rule "Frostschutz Bad"
          when
              Item Window_Bad_Kontakt changed                        // Fensterkontakt (als Switch) hat seinen Status geändert
          then
              tFrostBad?.cancel                                      // falls ein Timer läuft, abbrechen
              if(Window_Bad_Kontakt.state!=OFF)                      // Falls nicht OFF
                  tFrostBad = createTimer(now.plusSeconds(300)) [ |  // Lege Timer an
                      Window_Bad_Kontakt.sendCommand(ON)             // Wenn Timer abläuft, sende ON
                      tFrostBad.reschedule(now.plusSeconds(300))     // und Timer neu planen
                  ]
          end
          In Deinem ursprünglichen Code wird der Timer genau wie in meinem Code auf jedem Fall gelöscht, falls er existiert. Bei mir passiert das allerdings zu Beginn der Rule.
          Dadurch ist es unnötig, die Timer Variable wieder mit null zu initialisieren. Nur falls das Item nicht OFF als Zustand hat, wird der Timer angelegt. Das ist das gleiche Verhalten wie bei Deiner Rule - Du könntest auch auf Window_Bad_Kontakt.state==ON testen - das ist allerdings ein Unterschied, denn das Item kann auch den Zustand NULL annehmen.

          Kommentar

          Lädt...
          X