Seite 1 von 1

Immer diese Rules...

Verfasst: 7. Jan 2020 16:18
von Backbe01
Hallo,

erstmal ein gutes neues Jahr an alle!!!!

Nun zum Problem: :D

Ich hatte bis vor kurzem die Rule unten (fast einwandfrei) am laufen. Was komisch war, die Rule fing auch am Ende nochmal an, störte mich aber nicht. Seit ein paar Tagen startet zwar die Rule (Eintrag im log) sie wird aber nicht beendet. Ich habe aber nichts verändert und finde den Fehler nicht.

Hintergrund: Es soll das Nachtlicht für meinen Sohn sein, dass die Lampe nicht die ganze Nacht brennt...

Vielen Dank vorab...

Rule:

Code: Alles auswählen

var Timer tSchlummer = null                                                        // globale Variable für den Timer

rule "Schlummer"
when
    Item LEDIKEA_OG_RaphaelDH changed
then
    logInfo("Schlummer", "Schlummerlicht startet")
    if(tSchlummer !== null) tSchlummer.cancel
    var Integer iSekunden = 3600
    if(now.getMinuteOfDay >= 21 * 60 && now.getMinuteOfDay < 23 * 60 +29 ) iSekunden = 600
    if(now.getMinuteOfDay >= 1 && now.getMinuteOfDay < 6 * 60 +10 ) iSekunden = 600
    tSchlummer = createTimer(now.plusSeconds(iSekunden), [
        LEDIKEA_OG_RaphaelDH.sendCommand(OFF)
        tSchlummer = null
    ])
end

Re: Immer diese Rules...

Verfasst: 7. Jan 2020 19:41
von bastler
hi,

nicht sicher aber ich vermute dass sobald der timer abgelaufen ist und das licht ausgeschaltet wird startest du damit die regel erneut. darum würde ich mal probieren die when-bedingung

Code: Alles auswählen

when
    Item LEDIKEA_OG_RaphaelDH changed
zu erweitern um

Code: Alles auswählen

when
    Item LEDIKEA_OG_RaphaelDH changed to ON
dadurch wird die regel wirklich nur beim einschalten des lichtes aktiviert

Re: Immer diese Rules...

Verfasst: 7. Jan 2020 20:44
von Backbe01
Hallo Bastler,

klar, du hast Recht! Darum startete die Rule auch immer nochmal - logisch! Aber das fand ich eigentlich gar nicht schlecht. Das Item ist ein Dimmer-Item, daher kann ich nicht mit on/off arbeiten. Und mir war es immer ganz recht, dass ab der letzten Einstellung der Timer startet.

Leider schaltet die Lampe aber immer noch nicht wieder aus... Mal schauen, befrage zusätzlich gerade Tante Google... :lol:

Re: Immer diese Rules...

Verfasst: 7. Jan 2020 21:44
von Backbe01
Ich habe für mich jetzt die Lösung gefunden. Ob dies so 100% korrekt ist weiß ich nicht, aber es funktioniert.
Ich habe den letzten Teil der Rule

Code: Alles auswählen

tSchlummer = null
weggelassen. Jetzt läuft es wieder...

Re: Immer diese Rules...

Verfasst: 12. Jan 2020 02:29
von udo1toni
Grundsätzlich sieht die Rule nicht schlecht aus. Die Prüfung auf changed to ON funktioniert ja leider nicht, aber man kann die Rule gezielt beenden:

Code: Alles auswählen

var Timer tSchlummer = null                                                        // globale Variable für den Timer

rule "Schlummer"
when
    Item LEDIKEA_OG_RaphaelDH changed
then
    if((LEDIKEA_OG_RaphaelDH.state as Number) == 0)
        return;
    logInfo("Schlummer", "Schlummerlicht startet")
    tSchlummer?.cancel
    var Integer iSekunden = 3600
    if(now.getMinuteOfDay >= 21 * 60 && now.getMinuteOfDay < 23 * 60 +29 ) iSekunden = 600
    if(now.getMinuteOfDay >= 1 && now.getMinuteOfDay < 6 * 60 +10 ) iSekunden = 600
    tSchlummer = createTimer(now.plusSeconds(iSekunden), [
        LEDIKEA_OG_RaphaelDH.sendCommand(OFF)
        tSchlummer = null
    ])
end
Der Timer lässt sich auch unkomplizierter löschen (siehe Code - tSchlummer?.cancel bedeutet: falls tSchlummer nicht null ist, cancel ausführen)

Re: Immer diese Rules...

Verfasst: 23. Jan 2020 08:33
von Backbe01
Hallo Udo,

habe erst jetzt bemerkt, dass der Chef sich auf noch gemeldet hat!:-)

Wie ich sehe, hast du noch "return" eingefügt. Das wäre noch ein guter Ansatz, wobei es vorher auch nicht wirklich schlimm war.

Was mich allerdings wundert: Wenn ich

Code: Alles auswählen

tSchlummer = null
in der Regel verbaut habe, habe ich viele Einträge im Log (die ich nicht verstehe :-)). Sobald ich o.g. Codezeile rauslasse ist alles normal - und funktioniert!???

Warum muss der Timer am Ende auf null gesetzt werden, er ist doch eh beendet und würde bei einem erneuten Start ja auch zurückgesetzt?

Re: Immer diese Rules...

Verfasst: 24. Jan 2020 05:15
von udo1toni
Backbe01 hat geschrieben: 23. Jan 2020 08:33 Wenn ich

Code: Alles auswählen

tSchlummer = null
in der Regel verbaut habe, habe ich viele Einträge im Log (die ich nicht verstehe :-)). Sobald ich o.g. Codezeile rauslasse ist alles normal - und funktioniert!???
Müsste man dann gucken, woran sich openHAB hier stört. Gewöhnlich kann man Variablen jederzeit auf null setzen - falls es im Code irgendwo Stellen gibt, die zwingend einen gültigen Wert erwarten, muss man halt vorher auf null prüfen.
Warum muss der Timer am Ende auf null gesetzt werden, er ist doch eh beendet und würde bei einem erneuten Start ja auch zurückgesetzt?
Das kannst Du halten wie ein Dachdecker ;) Je nachdem, wie man einen Timer implementiert, kann es halt wichtig sein, dass die Variable tatsächlich gelöscht ist, oder man nutzt die Variable, um zu prüfen, ob der Timer läuft. Leider gibt es da keine andere Möglichkeit, etwas dazu zu erfahren.
Eine Timer-Variable bringt auch eine Eigenschaft running mit, die ist aber tatsächlich nur in dem Moment true, wo der Code gerade ausgeführt wird, nicht, wenn der Timer darauf wartet, dass der Zeitpunkt der Ausführung kommt. Eine andere Eigenschaft ist terminated, welche dann true wird, wenn der Timer beendet wurde. Ich bin mir gerade nicht sicher, ob der Timer dafür laufen muss, oder ob terminated auch true wird, wenn man mittels timer.cancel den Task aus dem Scheduler entfernt hat.