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.
openHAB4.1.2 stable in einem Debian-Container (bookworm) (Proxmox 8.1.5, LXC), mit openHABian eingerichtet