Timer in Rule vorzeitig beenden

Einrichtung der openHAB Umgebung und allgemeine Konfigurationsthemen.

Moderatoren: seppy, udo1toni

Antworten
sonic
Beiträge: 74
Registriert: 19. Jan 2020 10:39
Answers: 0

Timer in Rule vorzeitig beenden

Beitrag von sonic »

Hallo zusammen,

ich habe eine Rule geschrieben, die eine Push Meldung schickt wenn das Fenster im Kinderzimmer 15 Minuten lang offen ist.

Funktioniert auch soweit bestens. Jetzt möchte ich aber gerne, dass wenn das Fenster zum Beispiel nach 5 Minuten wieder zu gemacht wird, dass der Timer angehalten wird und somit auch keine Push Meldung raus geht. Dieses zurücksetzen funktioniert leider nicht. Kann mir jemand helfen?

Anbei meine Rule

Code: Alles auswählen

var Timer myTimer = null
rule "Kinderzimmerfenster"
when
	Item M_KinderfensterDataOpen changed to OPEN
then
	myTimer = createTimer(now.plusMinutes(15), [| 
		sendBroadcastNotification("Erinnerung - Kinderzimmerfenster seit 15 Minuten offen")
    	])
end

rule "Kinderzimmerfenster Close"
when
    Item M_KinderfensterDataOpen changed to CLOSE
then
    myTimer.cancel()
    myTimer = null
end
---------------------------------
OpenHAB 3 auf Dell ThinClient unter Debian Bullseye und ConBee II
RaspberryPi 4b 2GB in Din Rail Gehäuse mit PiVCCU3
Allerlei Sonoff, Shelly, NodeMCU, Sensoren, Aqara Krams und und und.

int5749
Beiträge: 1173
Registriert: 4. Nov 2019 22:08
Answers: 9

Re: Timer in Rule vorzeitig beenden

Beitrag von int5749 »

Hi,

ich würde dies in eine Rule packen und habe dies mal anhand meines Garagentorwächters umgeschrieben

Code: Alles auswählen

var Timer tM_Kinderfenster = null

rule M_Kinderfenstermonitor
when
	Item M_KinderfensterDataOpen changed
then
	if (M_KinderfensterDataOpen.state == "OPEN") {
		if(tM_Kinderfenster===null){
		tM_Kinderfenster = createTimer(now.plusMinutes(15)) [|
            sendBroadcastNotification("Erinnerung - Kinderzimmerfenster seit 15 Minuten offen")
			]
		}
	}
	else if (M_KinderfensterDataOpen.state == "CLOSED") {
		tM_Kinderfenster.cancel
    	tM_Kinderfenster = null
	}
end
PS: Ich würde Timer möglichst auch nach Funktion benennen, damit man bei mehreren Timern den Überblick behält ;-)
openHAB 4.1.0 Release mit openHABian in einem Debian Bookworm (LXC) unter Proxmox 8.1.3

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

Re: Timer in Rule vorzeitig beenden

Beitrag von udo1toni »

Um es korrekt umzusetzen, sollte man unbedingt daran denken, dass es Situationen geben kann, in denen ein Timer übrig bleibt. Es ist also immer sinnvoll, einen eventuell laufenden Timer zunächst zu beseitigen. Damit wird die Rule noch etwas einfacher:

Code: Alles auswählen

var Timer tM_Kinderfenster = null

rule "Kinderfenster Monitor"
when
    Item M_KinderfensterDataOpen changed
then
    tM_Kinderfenster?.cancel
    if (M_KinderfensterDataOpen.state == OPEN)
        tM_Kinderfenster = createTimer(now.plusMinutes(15)) [|
            sendBroadcastNotification("Erinnerung - Kinderzimmerfenster seit 15 Minuten offen")
        ]
end
Egal wie die Rule getriggert wird, zunächst wird ein eventuell vorhandener Timer gecancelt. Das Fragezeichen vor dem .cancel bewirkt, dass der Befehl nur ausgeführt wird, wenn es auch tatsächlich einen Timer gibt. Nur für den Fall, das der Status nach OPEN gewechselt hat, wird der Timer erneut angelegt.
openHAB4.3.5 stable in einem Debian-Container (bookworm) (Proxmox 8.4.1, LXC), mit openHABian eingerichtet

sonic
Beiträge: 74
Registriert: 19. Jan 2020 10:39
Answers: 0

Re: Timer in Rule vorzeitig beenden

Beitrag von sonic »

Guten Morgen,

herzlichen Dank für die Infos.
@udo1toni:
Es funktioniert tadellos und vor allem auch sehr schlank. DANKE
---------------------------------
OpenHAB 3 auf Dell ThinClient unter Debian Bullseye und ConBee II
RaspberryPi 4b 2GB in Din Rail Gehäuse mit PiVCCU3
Allerlei Sonoff, Shelly, NodeMCU, Sensoren, Aqara Krams und und und.

Antworten