Ankündigung

Einklappen
Keine Ankündigung bisher.

Timer

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

    [Codebeispiel] Timer

    Hallo zusammen,
    ich versuche mich gerade an einem Timer.
    Problem:
    Ein Fensterkontakt ,der nicht zyklisch sendet, meldet dem RTR Frostschutz.Wenn der RTR die "Nachtabsenkung" erhält schaltet er auch dort hin und übergeht das offene Fenster.Also heizt.
    Jetzt möchte ich über einen Timer den Kontakt zyklisch senden,alle 10 min,damit der RTR wieder in den Frostschutz wechselt.irgendwie passiert nichts.
    Deer Timer ist am Anfang der .rule Datei eingetragen.
    Kann mir da jemand weiterhelfen?

    Code:
    rule "Frostschutz Bad"
    when
        Item Window_Bad_Fenster received command
    then
        if(receivedCommand==CLOSED) {
            if(timer==null) {
                timer = createTimer(now.plusSeconds(600))[|
                    sendCommand(Window_Bad_Fenster, CLOSED)
                ]
            } else if(receivedCommand==OPEN) {
                if(timer!=null) {
                    timer.cancel
                    timer = null
                }
    
            }
        }
     end

    #2
    Also, eigentlich sollte der RTR die Umschaltung sperren, wenn das Fenster offen ist. Weiter wäre es natürlich besser, den Fensterkontakt zyklisch senden zu lassen

    Unabhängig davon bin ich mir nicht sicher, ob der Kontakt tatsächlich als Command ausgewertet wird, es könnte also sein, dass die Rule eher auf received update reagiert. Dann wäre natürlich Window_Bad_Fenster.state statt receivedCommand zu verwenden.

    Außerdem könnte es gut sein, dass openHAB sich weigert, auf Contact items ein sendCommand abzusetzen, das sind schließlich per Definition Nur-Lese-Objekte. Vielleicht müsstest Du statt Contact ein Switch item verwenden.

    Kommentar


      #3
      danke,
      leider kann man den fensterkontakt nicht auf zyklisch senden stellen.(MDT Binäreingang UP)

      Kommentar


        #4
        Und als Sperrobjekt ist er dann vermutlich auch nicht verwendbar?

        Kommentar


          #5
          Hallo, habe mich mal wieder an das Problem gesetzt.Der Code sieht wie folgt aus:
          Code:
          rule "Frostschutz Bad"
          when
              Item Window_Bad_Kontakt received command
          then
              if(receivedCommand==ON) {
                  if(timer==null) {
                      timer = createTimer(now.plusSeconds(600)) [|
                          sendCommand(Window_Bad_Kontakt,ON)
                      ]
                  } else {
                      timer.reschedule(now.plusSeconds(500))
                      }    
                  } else if(receivedCommand==OFF) {
                      if(timer!=null) {
                          timer.cancel
                          timer = null
                      }
          
                  }
          
           end
          Er sendet aber nur einmal .Wenn mein Gedanke richtig ist sollte er aber doch alle 500 sec senden,da ja das item den Befehl on erhält.
          Mfg Alex

          Kommentar


            #6
            Nö. Senden ist nicht gleich empfangen

            Außerdem bin ich nicht sicher, ob der Timer sich überhaupt noch reaktivieren lässt, wenn er schon abgelaufen und (Achtung!) der Code bereits komplett ausgeführt wurde.

            Kannst Du den Konkakt mit openHAB abfragen? Du könntest dann als Notbehelf das Item auf zyklisch lesen konfigurieren. Falls Du noch knx1 nutzt, wäre die Formulierung so:
            Code:
            Switch Window_Bad_Kontakt "Kontakt ist [%s]" {knx="<(600)1/1/1"}
            openHAB schickt alle 600 Sekunden einen Read Request an die GA 1/1/1.
            Voraussetzung ist natürlich, wie oben erwähnt, dass das Objekt im MDT Binäreingang mit dem R-Flag (bzw. dem L-Flag, wenn Du die deutsche Version von ETS nutzt) versehen ist.
            Falls Du bereits OH2.3.0 mit knx2 einsetzt, musst Du ein Thing für diesen Kontakt anlegen und im Thing die Zykluszeit angeben:
            Code:
            Thing device MDT_BinaerEingang "MDT Binäreingang" [readInterval=600] {Type switch : contact1 "Fensterkontakt" [ ga="<1/1/1" ] }
            sollte ansonsten genauso funktionieren.

            Da die GA innerhalb knx gekoppelt ist, sollte der RTR die Antwort mitbekommen. Aber Achtung! im RTR muss das U-Flag (bzw. A-Flag in deutsch) gesetzt sein, damit der RTR auch auf das Antworttelegramm reagiert. Es gibt nämlich in knx sehr wohl einen Unterschied zwischen einem Befehl und einer Statusinformation.

            Falls das alles nichts hilft, Du also trotzdem auf die Rule angewiesen bist, müsste sie eher so aussehen:
            Code:
            var Timer tContact = null
            
            rule "Frostschutz Bad"
                when
                    Item Window_Bad_Kontakt changed
                then
                    if(Window_Bad_Kontakt.state==OFF) {
                        tContact.cancel
                        tContact = null
                    } else {
                        if(tContact != null) tContact.cancel
                        tContact = createTimer(now.plusSeconds(600)) [|
                            Window_Bad_Kontakt.sendCommand(ON)
                            tContact.reschedule(now.plusSeconds(600))
                        ]
                    }
            end
            Der Timer wird also aus dem noch laufenden Timer heraus neu geplant (ich habe gerade diese Woche verifiziert, dass das funktioniert).
            Sobald das Fenster geschlossen wurde, wird der Timer gecancelt und damit auch nicht mehr erneut ausgelöst.

            Kommentar


              #7
              Der Code passt und funktioniert.Das Abfragen der GA hat irgendwie nicht so geklappt.
              Vielen Dank dafür.

              Kommentar


                #8
                Zitat von alexbn Beitrag anzeigen
                danke,
                leider kann man den fensterkontakt nicht auf zyklisch senden stellen.(MDT Binäreingang UP)
                Meine BE von MDT können zyklisches Senden. In der der Beschreibung ist das auch aufgeführt. Sicher, dass Dein BE das nicht kann?

                Kommentar

                Lädt...
                X