createTimer mit eigener Funkton

Für welche Projekte verwendet Ihr OpenHAB? Was habt Ihr automatisiert? Stellt eure Projekte hier vor.

Moderatoren: Cyrelian, seppy

Antworten
Benutzeravatar
TorstenE
Beiträge: 237
Registriert: 12. Jan 2022 18:29
Answers: 4
Wohnort: Niederstaufen

createTimer mit eigener Funkton

Beitrag 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
openHAB 4.0.4 auf einem Pi 4 mit openHABian

Benutzeravatar
udo1toni
Beiträge: 13977
Registriert: 11. Apr 2018 18:05
Answers: 222
Wohnort: Darmstadt

Re: createTimer mit eigener Funkton

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

Benutzeravatar
TorstenE
Beiträge: 237
Registriert: 12. Jan 2022 18:29
Answers: 4
Wohnort: Niederstaufen

Re: createTimer mit eigener Funkton

Beitrag von TorstenE »

Danke Udo,

funktioniert alles wunderbar.

Schönen 1. Mai

Torsten
openHAB 4.0.4 auf einem Pi 4 mit openHABian

Antworten