Timer

Einrichtung der openHAB Umgebung und allgemeine Konfigurationsthemen.

Moderatoren: seppy, udo1toni

Antworten
Baumtasche
Beiträge: 82
Registriert: 14. Sep 2020 21:52
Answers: 0

Timer

Beitrag von Baumtasche »

HI,

ich habe ein Problem und komme nicht wirklich auf eine Lösung, ich bin auch noch nicht solange im Thema drin, wahrscheinlich ist das eine Anfängerfrage :-(

Folgende Herausforderung.

Ich will, wenn ein Item (Item_Test) auf On gesetzt wird, das ein Timer startet der alle 30 Minuten etwas prüft. Sobald das (Item_Test) auf Off gesetzt wird, soll der Timer stoppen.

Im Forum habe ich schon rules dazu gefunden, werde aber nicht so ganz schlau aus ihnen. Insbesondere der else-Part ist mir nicht ganz klar und wie kann kann ich den Timer immer wieder laufen lassen, bis ein bestimmtes Ereignis eintritt.

Code: Alles auswählen

rule "Item ON"
when
    Item_Test received command ON
then
if(Timer == null) {
    Timer= createTimer(now.plusMinutes(30), [|
    //do something
    Timer = null
])
}
else {
    Timer.reschedule(now.plusMinutes(30)
}
end 


violine21
Beiträge: 600
Registriert: 20. Sep 2019 05:49
Answers: 7

Re: Timer

Beitrag von violine21 »

Baumtasche hat geschrieben: 25. Okt 2020 21:27 Ich will, wenn ein Item (Item_Test) auf On gesetzt wird, das ein Timer startet der alle 30 Minuten etwas prüft. Sobald das (Item_Test) auf Off gesetzt wird, soll der Timer stoppen.
Hast Du Dich hier evtl. unglücklich ausgedrückt?

Hier ein Beispiel, wo auf das Item_Test getriggert wird und nach 30 Minuten eine Aktion ausgeführt wird:

Code: Alles auswählen

var Timer t_Timer1 = null
rule "Item ON"
when
    Item_Test changed
then
if(Item_Test.state == ON) {
        t_Timer1?.cancel
        t_Timer1 = createTimer(now.plusMinutes(30), [ |
            //do something
            t_Timer1 = null
        ] )
    }
if (Item_Test.state == OFF && t_Timer1 !== null ) {        
        t_Timer1?.cancel
        t_Timer1 = null 
    }
end
Wenn Du allerdings bei Item_Test = ON alle 30 Minuten etwas testen willst, solltest Du das mit einem Time-cron lösen.
Deine Rule würde sonst dauerhaft einen Thread blockieren.

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

Re: Timer

Beitrag von udo1toni »

Also, Du möchtest, dass ein Timer wiederkehrend eine Aufgabe ausführt. Der Timer soll aktiviert und deaktiviert werden. Das sieht so aus:

Code: Alles auswählen

var Timer tCheck = null                                 // globale Variablen zu Beginn der Datei definieren

rule "Item ON"                                          // Name der Rule
when
    Item_Test changed                                   // der Schalter wurde geschaltet
then
    tCheck?.cancel                                      // eventuell laufenden Timer stoppen
    if(Item_Test.state == ON)                           // Falls Status ON
        tCheck = createTimer(now.plusMinutes(30), [|    // lege Timer an
            //do something
            tCheck.reschedule(now.plusMinutes(30)       // Timer erneut planen
        ])
end 
Zunächst muss ein Timer, den man steuern möchte (per cancel oder reschedule) in einem Objekt "gespeichert werden". Genauer ist das ein Zeiger auf den Timer.
Du lässt die Rule auf received command triggern. Im Prinzip ist dagegen nichts einzuwenden, hier ist aber changed der elegantere Trigger.
Triggert die Rule, so gibt es im Prinzip nur zwei Möglichkeiten, nämlich, der Status ist ON oder eben nicht. In letzterem Fall muss der Timer umgehend gestoppt werden. In ersterem Fall dürfte eigentlich kein Timer laufen, aber wer weiß... Es kann nicht schaden, den Timer zu canceln, falls es einen gibt. Der Befehl tCheck?.cancel stoppt den Timer tCheck, allerdings nur, falls er existiert. Er ist gleichbedeutend mit dem Befehl if(tCheck !== null) tCheck.cancel.
Man beachte dabei das Fragezeichen im ersten Befehl...
Falls also der Status ON ist, muss der Timer angelegt werden. Mit Ablauf des Timers wird der Code im Timer ausgeführt. Die letzte Handlung des Timercodes ist, den Timer erneut zu planen.

Timer ist übrigens ein Schlüsselwort, es steht nicht als gültiger Name einer Variablen zur Verfügung ;)
openHAB4.3.5 stable in einem Debian-Container (bookworm) (Proxmox 8.4.1, LXC), mit openHABian eingerichtet

Baumtasche
Beiträge: 82
Registriert: 14. Sep 2020 21:52
Answers: 0

Re: Timer

Beitrag von Baumtasche »

Hallo zusammen,

vielen Dank für eure Hilfe, auch bei solch vermeintlich leichten Probleme.

Antworten