Ankündigung

Einklappen
Keine Ankündigung bisher.

Rule mit Timer und ggf. Lock

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

    Rule mit Timer und ggf. Lock

    Hallo,

    ich möchte für meine KWL eine Steuer-Regel bauen, welche über die zentrale Luftfeuchte läuft. Konkret soll die Lüftung bei einer Luftfeuchte <=65% auf die höchste Stufe springen, um die Luftfeuchte abzubauen, bis beispielsweise auf 60% wieder erreicht sind -> danach Lüftung wieder auf eine kleine Stufe.
    Also habe ich eine Rule, welche die Luftfeuchte auf Änderung prüft und ab 65% die Lüftung hochfährt. Soweit so gut.
    Jetzt wäre es doch sinnvoll einen Timer zu bauen, der beispielsweise 10min läuft und der nach Ablauf prüft, ob die Luftfeuchte >=60% ist. Wenn nicht, dann sollte der Timer wieder von vorne laufen, etc. Ein Lock für diesen Timer ist sicherlich empfehlenswert, richtig?
    Damit will ich erreichen, dass die KWL nicht anfängt zu tackten, da es schon mal vorkommt, dass die Luftfeuchte bei geringerer Drehzahl der KWL etwas zunimmt.

    Hat vielleicht jemand so einen Timer zu laufen, oder schon mal was ähnliches geschrieben?

    Danke für eure Hilfe.

    #2
    Hiermit sollte ein erster Ansatz möglich sein:

    https://github.com/openhab/openhab1-...period-of-time

    oder mit reschedule z.B. hier:
    https://knx-user-forum.de/forum/supp...861#post652861

    Kommentar


      #3
      Meinst du, so könnte es funktionieren?

      Code:
      rule "KWL: Steuerung Luftfeuchte TEST"
      when
              Item Humidity changed
      then
              if ( Humidity.state > 65 ) {
                              // Lüftung hochfahren
                              timer = createTimer( now.plusMinutes( 15 ) ) [|
                                      if ( Humidity.state <= 60 ) {
                                              // Lüftung runterfahren
                                      }
                                      else {
                                              timer.reschedule( now.plusMinutes( 15 ) )
                                      }
                              ]
                      }
              }
      end
      Solllte man vielleicht noch ein Lock machen, damit es diesen Timer nur einmal gibt? Oder reicht den des Status vom Timer abzufragen?

      Kommentar


        #4
        Humidity.state ist ein State (steht ja da...), Du möchtest aber diesen State mit einer Zahl vergleichen. entsprechend muss es
        Code:
        if ((Humidity.state as DecimalType) > 65)
        heißen. Entsprechend natürlich auch in der nachgelagerten if-Anweisung. Die inneren Klammern können (in diesem speziellen Fall) auch weggelassen werden, schaden aber auch nicht.

        Kommentar


          #5
          Danke für den Hinweis. Die Abfragen haben aber auch so funktioniert. Leider hat meine Timer-Schleife oben so nicht funktioniert. Da fehlt wohl noch was, oder ich habe einen Denkfehler.

          Kommentar


            #6
            Ach ja, Du solltest eventuell vor dem Anlegen des Timers überprüfen, ob dieser schon läuft:
            Code:
            var Timer myTimer = null
            rule "KWL: Steuerung Luftfeuchte TEST"
            when
                Item Humidity changed
            then
                if(myTimer!=null) {
                    if ((Humidity.state as DecimalType) > 65) {
                       // Lüftung hochfahren
                      myTimer = createTimer(now.plusMinutes(15)) [|
                          if ((Humidity.state as DecimalType) <= 60) {
                              // Lüftung runterfahren
                          }
                         else {
                             timer.reschedule(now.plusMinutes(15))
                         }
                    ]
                    }
                }
            end
            Wahlweise kannst Du den Timer auch erst nach dem Hochdrehen der Lüftung prüfen, aber da die Rule auf CHANGED triggert, wird der Timer ohne diese Überprüfung immer wieder neu angelegt, so dass im günstigsten Fall eine Viertelstunde nach Unterschreiten des Schwellwertes der Timer überhaupt eine Chance erhält, abzulaufen, im ungünstigsten Fall ist openHAB vom vielen neu Anlegen des Timers überlastet...

            Kommentar


              #7
              Berechtigter Einwand. Habe meine OH2 Instanz jetzt am Wochenende anscheinend mit dem Timer bereits überlastet. Habe meine Rule nun mit deinen Tipps erweitert/umgebaut. Nächster Test läuft nun.

              Kommentar


                #8
                So läuft der Timer gar nicht mehr an. Vermutlich durch die Abfrage !=null, da er mit var Timer mytimer = null initialisiert wird...

                Lag daran. Habe nun noch eine Boolean Variable eingebaut, welche beim Start des Timers auf true geschaltet wird, und wieder auf false, sobald der untere Grenzwert erreicht ist. Die ersten Timer liefen bereits erfolgreich durch.
                Zuletzt geändert von netzlaff; 28.02.2017, 20:31.

                Kommentar


                  #9
                  Oh. Mist, hab aus Versehen die Logik verdreht... es muss in diesem Fall natürlich
                  Code:
                  if(myTimer==null)
                  heißen, Sorry. Wenn der Timer abgelaufen ist, sollte er automatisch wieder auf null gesetzt werden (falls Du ganz sicher sein willst, kannst Du die Zuweisung auch explizit im entsprechenden Programmteil (der Timer ist abgelaufen) erledigen.

                  Kommentar

                  Lädt...
                  X