Ankündigung

Einklappen
Keine Ankündigung bisher.

openHAB Timer zurücksetzten, Fenster Auf / Zu

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

    openHAB Timer zurücksetzten, Fenster Auf / Zu

    Guten Tag, ich versuche schon den ganzen Morgen die regel ans laufen zu bekommen... Wieso auch immer will es einfach nicht funktionieren..

    Vielleicht fällt euch noch ein Fehler auf?!

    Hier die Regel:
    Code:
    var Timer timer = null
    rule "Fenster zu"
    when
        Item FfkSchlafState changed
    then
    if (FfkSchlafState.state == CLOSED) 
    {
        if (timer !== null) 
        {
            timer.cancel
            timer = null
        }
    }
    else if (FfkSchlafState.state == OPEN) 
    {
        if (timer === null) 
        {
            timer = createTimer(now.plusMinutes(10), [ |
                sendBroadcastNotification("Fenster ZU!") ])
        }
    }
    end
    Vielen Dank schon mal!

    #2
    Bin nicht so der Experte für Rule-Syntax, aber basierend auf anderen Programmiersprachen kommen mir !== und === dubios vor. Ist da nicht jeweils ein = zu viel?

    Kommentar


      #3
      Nein, das ist schon korrekt so. == bedeutet: ist gleich. === bedeutet: ist identisch. Dieser Unterschied ist bei null (nicht NULL!) wichtig. null verweist auf eine bestimmte Stelle im Speicher. Wenn eine Variable null enthält, so muss sie auf diese Speicherstelle zeigen, nicht auf eine Speicherzelle, die (vielleicht zufällig) den gleichen Wert enthält.

      Was die Rule selbst betrifft: Auch wenn das funktioniert, sollte man davon absehen, Variablen gleichlautend zu Schlüsselworten zu benennen.
      Ansonsten sieht die Rule aber gut aus, auch wenn ich es nicht lassen kann, ein bischen dran rum zu schreiben.
      Code:
      // Globale Variablen zu Beginn der Datei definieren!
      var Timer tFenster = null
      
      rule "Fenster zu"
      when
          Item FfkSchlafState changed
      then
          if(FfkSchlafState.state == CLOSED) {
              tFenster?.cancel
              tFenster = null
          } else if(FfkSchlafState.state == OPEN) {
              if(tFenster === null) {
                  tFenster = createTimer(now.plusMinutes(10), [ |
                      sendBroadcastNotification("Fenster ZU!")
                  ] )
              }
          }
      end
      tFenster?.cancel ist gleichbedeutend mit if(tFenster !== null) tFenster.cancel

      Streng genommen kann man noch ein bisschen weiter kürzen:
      Code:
      // Globale Variablen zu Beginn der datei definieren!
      var Timer tFenster = null
      
      rule "Fenster zu"
      when
          Item FfkSchlafState changed
      then
          if(FfkSchlafState.state == CLOSED)
              tFenster?.cancel
          else
              tFenster = createTimer(now.plusMinutes(10), [ |
                  sendBroadcastNotification("Fenster ZU!")
              ])
      end
      Es gibt nur zwei gültige Status, OPEN und CLOSED, eine Änderung auf NULL geht nur mit expliziter Zuweisung (FfkSchlafState.postUpdate(NULL)). Eine Prüfung auf einen laufenden Timer ist ebenfalls unnötig, da der Timer ja aktiv gecancelt wird, sobald der Status nach CLOSED geändert wird (was die Voraussetzung dafür ist, dass die Rule mit changed triggern kann, nachdem ein Timer durch OPEN gestartet wurde). Damit ist auch die null-Initialisierung unnötig, somit steht nur jeweils ein Befehl im if- bzw. else-block, also können auch noch die geschweiften Klammern entfallen.
      Sollte die Rule nicht funktionieren, hilft nur Erweitern mit logInfo() Befehlen.
      Zuletzt geändert von udo1toni; 23.03.2020, 23:28.

      Kommentar


        #4
        Vielen Dank für deine ausführliche Antwort!
        Hab es eben direkt getestet nur leider bricht er den Timer nicht ab bzw. springt nicht rein. hab es mit logInfo mir anzeigen lassen, Trigger kommt, Benachrichtigung auch. Wieso auch immer bekomme ich zwei Benachrichtigungen...

        Habe mich für die kurze Version entschieden.
        Wenn ich aus dem if(FfkSchlafState.state == CLOSED) ein if(FfkSchlafState.state != OPEN) mache bricht er den Timer nur ab und Startet diesen gar nicht erst.

        Ich hab einen HmIP-SWDM Fensterkontakt an der Charly CCU und bekomme in openHAB im event.log auch jedesmal brav ein changed to OPEN / CLOSED.

        Hat noch jemand eine idee? Aktuell würde die Rule dann so aussehen:
        Code:
        var Timer tFenster = null
        rule "Fenster zu"
        when
            Item FfkSchlafState changed
        then
            logInfo("rules", "Trigger")
            if(FfkSchlafState.state != OPEN) // oder == CLOSED statt != OPEN
            {
                logInfo("rules", "Timer abgebrochen")
                tFenster?.cancel
            }
            else
            {
                logInfo("rules", "Timer aktiviert")
                tFenster = createTimer(now.plusMinutes(1), [ |
                    sendBroadcastNotification("Fenster ZU!")
                ])
            }
        end

        Kommentar


          #5
          'Was steht denn genau im log? also speziell zum Zeitpunkt des Schließens/Öffnens bis die Rule fertig ist?
          Du könntest noch eine weitere log Zeile ergänzen, am Ende der Rule:
          Code:
          var Timer tFenster = null
          rule "Fenster zu"
          when
              Item FfkSchlafState changed
          then
              logInfo("window", "Trigger")
              if(FfkSchlafState.state != OPEN) // oder == CLOSED statt != OPEN
              {
                  logInfo("window", "Timer abgebrochen")
                  tFenster?.cancel
              }
              else
              {
                  logInfo("window", "Timer aktiviert")
                  tFenster = createTimer(now.plusMinutes(1), [ |
                      sendBroadcastNotification("Fenster ZU!")
                  ])
              }
              logInfo("window", "Rule Ende")
          end
          Handelt es sich bei FfkSchlafState auch um ein Contact Item, oder ist es ein String Item?, dann müsste das if-Statement nämlich so aussehen:
          Code:
           if(FfkSchlafState.state.toString != "OPEN") // oder if(FfkSchlafState.state.toString == "CLOSED")
          Zuletzt geändert von udo1toni; 27.03.2020, 12:21.

          Kommentar


            #6
            Vielen Dank für die ausführliche Hilfe! Der letzte fehler war das es ein String war... :-/ hab ich ganz vergessen.... Hatte wieso auch immer noch den Contact im Kopf..

            Kommentar

            Lädt...
            X