Seite 1 von 1

Rule mit delay funktioniert nicht

Verfasst: 28. Feb 2019 11:16
von Airmaxchen
Ahoi!

Ich habe mir eine Rule erstellt, die mir nach einiger Zeit melden soll, dass ich das Garagentor offen gelassen habe.

Code: Alles auswählen

rule "Garage offen"
    when
        Item XiaomiAqaraDoorWindowSensor_OpenStatus changed to OPEN
    then 
    createTimer(now.plusSeconds(10)) [
                    if (XiaomiAqaraDoorWindowSensor_OpenStatus == OPEN) { 
                        sendNotification("meine@email.at","Garage offen!")
    	             }]
end
Ohne den Timer funktioniert sie aber ich möchte erst erinnert werden wenn das Tor länger offen ist. (Die eingestellten 10 Sekunden sind nur zu Testzwecken)

Ich bekomme im events.log auch keine Fehlermeldung dazu.
Was mache ich falsch?

Re: Rule mit delay funktioniert nicht

Verfasst: 28. Feb 2019 12:37
von mamoel
Ich habe noch nie die Timerfunktion benutzt, aber ich glaube das müsste so aussehen:

Code: Alles auswählen

createTimer(now.plusSeconds(10), [|
	if (XiaomiAqaraDoorWindowSensor_OpenStatus == OPEN) { 
	sendNotification("meine@email.at","Garage offen!")
        }
])

Re: Rule mit delay funktioniert nicht

Verfasst: 28. Feb 2019 12:53
von Airmaxchen
Hat leider auch nicht funktioniert.

Re: Rule mit delay funktioniert nicht

Verfasst: 28. Feb 2019 13:15
von mamoel
Könntest Du mal testweise ins Log schreiben, einmal direkt nach dem 'then' und einmal vor dem 'if' innerhalb des Timers?

Re: Rule mit delay funktioniert nicht

Verfasst: 28. Feb 2019 13:28
von Airmaxchen
Ich als ziemlicher Anfänger muss leider sagen:

Wie mache ich das?

Re: Rule mit delay funktioniert nicht

Verfasst: 28. Feb 2019 13:38
von mamoel
An den besagten Stellen einfach jeweils eine Zeile einfügen:

Code: Alles auswählen

logInfo("Garagentimer", "Garage offen - vor Timer")
und

Code: Alles auswählen

logInfo("Garagentimer", "Garage offen - im Timer")
Der Text ist im Prinzip egal. Hauptsache man sieht, ob er überhaupt das Öffnen des Garagentors erkennt und falls ja, ob der Timer funktioniert.

Re: Rule mit delay funktioniert nicht

Verfasst: 28. Feb 2019 13:43
von mamoel
Der Fehler liegt aber wahrscheinlich woanders. Ersetze den Code mal auf diese Weise:

Code: Alles auswählen

XiaomiAqaraDoorWindowSensor_OpenStatus.state == OPEN
Also mit einem '.state'.

Re: Rule mit delay funktioniert nicht

Verfasst: 28. Feb 2019 13:56
von Airmaxchen
Perfekt!
Das war es. Das .state hat gefehlt.
Herzlichen Dank!

Re: Rule mit delay funktioniert nicht

Verfasst: 28. Feb 2019 13:58
von mamoel
Ja, ich glaube da sind schon Einige (mich eingeschlossen) darauf reingefallen.

Re: Rule mit delay funktioniert nicht

Verfasst: 28. Feb 2019 21:03
von udo1toni
Zur Ergänzung:
Die Rule funktioniert so natürlich, allerdings ist es umständlich, den Timer beim Öffnen zu erzeugen und dann doch wieder prüfen zu müssen, ob die Tür noch offen ist. Eleganter scheint mir deshalb diese Variante:

Code: Alles auswählen

// globale Variablen werden zu Beginn der rules Datei definiert
var Timer tGarage = null

rule "Garage offen"
when
    Item XiaomiAqaraDoorWindowSensor_OpenStatus changed
then
    tGarage?.cancel
    if(XiaomiAqaraDoorWindowSensor_OpenStatus.state == OPEN)
        tGarage = createTimer(now.plusSeconds(10), [ |
            sendNotification("meine@email.at","Garage offen!")
    	])
end
Wenn die Tür geöffnet wird, wird ein evtl. laufender Timer gecancelt und anschließend neu erstellt. Falls die Tür geschlossen wird, wird der Timer ebenfalls gecancelt, aber nicht neu erstellt.

Die Schreibweisen createTimer(abstractInstant) [lambda] und createTimer(abstractInstant, [|lambda]) ergeben das identische Verhalten.
Trotzdem ziehe ich letztere Variante vor, weil so klar ersichtlich ist, dass das Lambda (der auszuführende Code) ein Parameter der Funktion ist.