Ankündigung

Einklappen
Keine Ankündigung bisher.

Variable wir nach Neustart nicht berücksichtigt

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

    Variable wir nach Neustart nicht berücksichtigt

    In folgender Regel berücksichtige ich die Variable (minutes), wo ich die Anzahl der Minuten ermittel. Es muss also vor 19:20 Uhr sein. Das funktioniert auch soweit bis OH neugestartet wird.
    Danach wird die Variable nicht mehr berechnet bzw. berücksichigt und die Regel funktioniert nicht mehr. Nachdem ich die Variable auskommentiere wird die Regel natürlich ausgeführt. Ich nächsten Lauf (ohne Auskommentierung der Variable (minutes)) wird sie wieder berücksichtigt und alles funktioniert. Wie muss ich es einrichten, damit die Variable direkt nach dem Neustart berücksichtigt wird? var minutes = 0 funktioniert leider nicht. Danke!

    var minutes = now.getHour() * 60 + now.getMinute()

    rule"Beschattung hoch bei Anwesendheit"
    when Item Einbruchschutz_schalten changed
    then
    if(Einbruchschutz_schalten.state ==OFF
    && Helligkeit.state >450
    && minutes < 1160
    )
    { Beschattung_Anwesendheit.sendCommand(ON)
    Zentral_Beschattung_Temperatur.sendCommand(0)

    #2
    Wenn Du die Aktion nur in Abhängigkeit von der aktuellen Uhrzeit ausführen willst, dann wird da so nicht funktionieren.

    Warum berechnest Du minutes außerhalb der Rule? So wird minutes nur einmalig berechnet, entweder direkt beim Start von OH oder wenn das Script erstmalig zur Ausführung kommt (habe ich noch nie ausprobiert wann das genau der Fall ist).

    Kommentar


      #3
      Danke für dein Feedback. Dies ist nicht das Problem. Die Rule funktioniert. Um 19:25 Uhr wird bspw. nicht mehr getriggert. Um 19:15 Uhr schon. Daher wird die Berechnung immer wieder aufs neue aktualisiert.

      Das Problem ist das die Variable minutes nach einem Neustart von OH nicht mehr funktioniert weil sie evtl auf null steht. Hier bin ich mir aber unsicher...
      Zuletzt geändert von Nerz; 28.10.2021, 20:03.

      Kommentar


        #4
        Du könntest Dir einfach mal minutes ins Log schreiben lassen. Wie soll der Wert null werden?

        Wenn Du OH nun gerade eben neugestartest hast (nach 19:20) dann würde ich erwarten, dass die Aktion nicht ausgeführt wird. Mag sein, dass es bislang nur zufällig funktioniert hat...
        Zuletzt geändert von wknx; 28.10.2021, 21:57.

        Kommentar


          #5
          Zitat von Nerz Beitrag anzeigen
          Danke für dein Feedback. Dies ist nicht das Problem. Die Rule funktioniert. Um 19:25 Uhr wird bspw. nicht mehr getriggert. Um 19:15 Uhr schon. Daher wird die Berechnung immer wieder aufs neue aktualisiert.

          Das Problem ist das die Variable minutes nach einem Neustart von OH nicht mehr funktioniert weil sie evtl auf null steht. Hier bin ich mir aber unsicher...
          Nein, wknx hat da schon Recht. Wenn Du eine Variable global definierst, dann wird diese exakt dann gesetzt, wenn die Rules-Datei geladen wird. Das gschieht irgendwann beim Start von openHAB und immer dann, wenn Du die Datei änderst bzw. neu abspeicherst (auch ohne etwas zu ändern).
          Du kannst die Variable minutes durchaus global definieren. Die Berechnung der Variablen muss aber zwingend innerhalb der Rule erfolgen.

          Die Variable minutes wird niemals den Wert null annehmen, denn entweder, sie ist noch nicht definiert (das heißt, sie existiert nicht) oder ihr ist der Initialwert zugewiesen, das sind eben die seit 00:00 Uhr vergangenen Minuten (ergibt sich aus der Formel)

          Tipp hier: Unter openHAB2 gab es getMinuteOfDay als Funktion. Unter openHAB3 gibt es diese Funktion nicht mehr, wohl aber ofSecondOfDay. Du kannst also auch einfach now.ofSecondOfDay schreiben (und natürlich den Vergleichswert mit 60 multiplizieren)

          Kommentar


            #6
            Danke für eurer Feedback. Habs nun mal wie folgt eigebaut und werde es testen:

            Code:
            rule"Beschattung hoch bei Anwesendheit"
            when Item Einbruchschutz_schalten changed
            then
            var minutes = now.getHour() * 60 + now.getMinute()
                if(Einbruchschutz_schalten.state ==OFF
                && Helligkeit.state >450
                && minutes < 1160
                )
                { Beschattung_Anwesendheit.sendCommand(ON)
                Zentral_Beschattung_Temperatur.sendCommand(0)
              
            }
            else { Beschattung_Anwesendheit.sendCommand(OFF)
            }
            end

            Kommentar

            Lädt...
            X