Seite 1 von 1

createTimer mit eigener Funkton

Verfasst: 30. Apr 2023 11:16
von TorstenE
Hallo Mitstreiter,

wie kann ich "createTimer" eine eigene Funktion mitgeben?

Code: Alles auswählen

MyTimer = createTimer(10, function() {
...
...
...})
Danke und schönen Sonntag

Torsten

Re: createTimer mit eigener Funkton

Verfasst: 30. Apr 2023 20:51
von udo1toni
createTimer() erwartet die Funktion als Lambda. Gewöhnlich wird man den Code direkt übergaben, man könnte das Lamda aber auch vorher in einer Variablen speichern, nur hat man halt nichts davon. Konkret so:

Code: Alles auswählen

var Timer tTimer = null // globale Variable als Zeiger auf den Timer
                        // globale Variablen vor der ersten Rule in der Datei definieren!

rule "timer starten"
when
    Item mySwitch changed
then
    tTimer?.cancel // Falls Timer definiert, Timer entfernen
    if(mySwitch.state == OFF)
        return;
    tTimer = createTimer(now.plusSeconds(10),[|
        mySwitch.sendCommand(OFF)
    ])
end
Die Zuweisung zu einer Variablen ist nicht zwingend, falls der Zeiger aber nicht einer Variablen zugewiesen wird, verliert man jegliche Kontrolle über den Timer.
Das erste in der Rule ist, sicherzustellen, dass der Timer nicht schon vorhanden ist. Es gibt verschiedenee Optionen dafür, hier lösche ich den Timer, falls er vorhanden ist. tTimer?.cancel ist dabei gleichbedeutend mit if(tTimer !== null) tTimer.cancel
Anschließend prüfe ich in der Rule, ob der Schalter, der die R ule ausgelöst hat auf OFF steht. Ist das der Fall, wird die Rule beendet.
Ansonsten wird der Timer Variablen ein Zeiger zugewiesen (der Rückgabewert von createTimer()).
createTimer(dateTime,function) erwartet zwei Argumente, das erste ist der exakte Zeitpunkt, an dem der übergebene Code ausgeführt werden soll. der Zeitpunkt wird gewöhnlich relativ zu now() angegeben, in die Vergangenheit kann man die Ausführung aus verständlichen Gründen nicht verschieben.
Das zweite Argument ist der auszuführende Code. der Code wird dabei als Lambda übergeben, das heißt, ein [] eingeschlossen. Der | ist nicht notwendig, ich gebe ihn nur der Vollständigkeit halber an,
Der Code als solcher läuft unabhängig von der Rule, die den Timer angelegt hat.

Re: createTimer mit eigener Funkton

Verfasst: 1. Mai 2023 11:37
von TorstenE
Danke Udo,

funktioniert alles wunderbar.

Schönen 1. Mai

Torsten