Seite 1 von 1

Timer in Rule vorzeitig beenden

Verfasst: 5. Jan 2021 13:43
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

Re: Timer in Rule vorzeitig beenden

Verfasst: 5. Jan 2021 17:28
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 ;-)

Re: Timer in Rule vorzeitig beenden

Verfasst: 5. Jan 2021 23:52
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.

Re: Timer in Rule vorzeitig beenden

Verfasst: 6. Jan 2021 09:38
von sonic
Guten Morgen,

herzlichen Dank für die Infos.
@udo1toni:
Es funktioniert tadellos und vor allem auch sehr schlank. DANKE