Immer diese Rules...

Einrichtung der openHAB Umgebung und allgemeine Konfigurationsthemen.

Moderatoren: seppy, udo1toni

Antworten
Backbe01
Beiträge: 123
Registriert: 19. Jul 2019 21:04
Answers: 0

Immer diese Rules...

Beitrag 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
OH 4.1.0M2 auf nuc in Docker

bastler
Beiträge: 121
Registriert: 7. Jan 2020 19:36
Answers: 2

Re: Immer diese Rules...

Beitrag 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

Backbe01
Beiträge: 123
Registriert: 19. Jul 2019 21:04
Answers: 0

Re: Immer diese Rules...

Beitrag 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:
OH 4.1.0M2 auf nuc in Docker

Backbe01
Beiträge: 123
Registriert: 19. Jul 2019 21:04
Answers: 0

Re: Immer diese Rules...

Beitrag 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...
OH 4.1.0M2 auf nuc in Docker

Benutzeravatar
udo1toni
Beiträge: 15248
Registriert: 11. Apr 2018 18:05
Answers: 242
Wohnort: Darmstadt

Re: Immer diese Rules...

Beitrag 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)
openHAB4.3.3 stable in einem Debian-Container (bookworm) (Proxmox 8.3.5, LXC), mit openHABian eingerichtet

Backbe01
Beiträge: 123
Registriert: 19. Jul 2019 21:04
Answers: 0

Re: Immer diese Rules...

Beitrag 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?
OH 4.1.0M2 auf nuc in Docker

Benutzeravatar
udo1toni
Beiträge: 15248
Registriert: 11. Apr 2018 18:05
Answers: 242
Wohnort: Darmstadt

Re: Immer diese Rules...

Beitrag 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.
openHAB4.3.3 stable in einem Debian-Container (bookworm) (Proxmox 8.3.5, LXC), mit openHABian eingerichtet

Antworten