Seite 1 von 1

Item Status abfragen

Verfasst: 14. Apr 2021 18:45
von Servomaster
Ich möchte die Einschaltzeit eine Items überwachen. wird ein Item eingeschaltet (externer Sensor o.ä.) möchte ich ermitteln ob er z.B. >2 sekunden eingeschaltet ist. Wie kann ich das integrieren?

Re: Item Status abfragen

Verfasst: 14. Apr 2021 19:24
von udo1toni
Es kommt drauf an, was Du auswerten möchtest.

Geht es nur darum, eine Meldung auszugeben, sobald das Item länger als 2 Sekunden eingeschaltet ist, so sähe das so aus:

Code: Alles auswählen

var Timer tOnTime = null

rule "alarm wenn mehr als 2 sek ON"
when
    Item myMonitoredItem changed
then
    tOnTime?.cancel
    if(newState == ON)
        tOnTime = createTimer(now.plusSeconds(2),[|
            logInfo("alarm","Item myMonitoredItem länger als 2 Sekunden ON")
        ])
end
Der Timer wird gestartet, wenn das Item auf ON gewechselt hat. Der Timer wird gecancelt, wenn das Status des Items wieder wechselt.
Läuft der Timer ab, so wird eine Meldung generiert (natürlich kann man dort auch beliebigen anderen Code einbauen).

Re: Item Status abfragen

Verfasst: 16. Apr 2021 19:00
von Servomaster
Danke für die Hilfe. Das habe ich gesucht. Hab den Code zwar noch nicht verstanden, werde mich aber bemühen das zu ändern.

Re: Item Status abfragen

Verfasst: 16. Apr 2021 20:21
von udo1toni
der Code ist eigentlich ganz gut lesbar:

Code: Alles auswählen

var Timer tOnTime = null
definiere eine Globale Variable, die einen Zeiger auf einen Timer hält. (global, weil außerhalb der Rules)

Code: Alles auswählen

rule "alarm wenn mehr als 2 sek ON"
when
    Item myMonitoredItem changed
then
Kopf der Rule mitsamt Triggern, also wann die Rule ausgelöst werden soll. In diesem Fall bei jeder Statusänderung des Items myMonitoredItem

Code: Alles auswählen

    tOnTime?.cancel
Falls (das ist das ?) die Variable tOnTime einen Zeiger auf einen Timer enthält, stoppe den Timer und lösche ihn aus dem Scheduler.

Code: Alles auswählen

    if(newState == ON)
Falls der neue Status (des Items, welches die Rule getriggert hat) ON ist

Code: Alles auswählen

        tOnTime = createTimer(
Lege einen Timer an und weise der Variablen tOnTime den Zeiger auf den Timer zu. Der Timer hat folgende Eigenschaften:

Code: Alles auswählen

        now.plusSeconds(2)
zwei Sekunden von nun an (also "in 2 Sekunden") Beginn des Codeblocks, der ausgeführt wird, wennn der Timer abläuft.

Code: Alles auswählen

            logInfo("alarm","Item myMonitoredItem länger als 2 Sekunden ON")
Gebe eine Logmeldung aus, der Logger heißt alarm, die Meldung lautet "Item myMonitoredItem länger als 2 Sekunden ON". End des Codeblocks, der vom Timer ausgeführt wird und Ende der createTimer-Anweisung. Ende der Rule.

Re: Item Status abfragen

Verfasst: 17. Apr 2021 16:47
von Servomaster
Super erklärt. Denke das ich das jetzt verstanden habe. Das mit dem Fragezeichen hat mich verwirrt. Danke.

Re: Item Status abfragen

Verfasst: 18. Apr 2021 19:18
von udo1toni
Das mit dem Fragezeichen ist eine schicke Kurzform von

Code: Alles auswählen

if(tOnTime !== null) tOnTime.cancel
Das gibt es auch an anderen Stellen in der Rules DSL.