Du kannst dieses Problem auf verschiedene Weisen lösen. Zum Beispiel, gegeben ein Switch Item
mySwitch:
Code: Alles auswählen
// Globale Variablen müssen zu Beginn der Datei definiert werden!
var Timer tMySwitch = null // Timer Variable
rule "mySwitch ON-Zeit"
when
Item mySwitch changed
then
tMySwitch?.cancel
if(newState == ON)
tMySwitch = createTimer(now.plusSeconds(12),[|
my2ndSwitch.sendCommand(ON)
tMySwitch = null
])
end
Die Rule wird jedes Mal ausgelöst, wenn sich der Zustand des Items
mySwitch ändert.
Als erstes wird, falls die Variable
tMySwitch ungleich null ist, der Timer, auf den sich die Variable bezieht gestoppt. Das
? bewirkt, dass der Befehl nur gesendet wird, wenn die Variable tatsächlich einen gültigen Zeiger enthält.
Anschließend wird geprüft, ob der aktuelle Status
ON ist. Ist das der Fall, so wird ein Timer angelegt und der Zeiger auf diesen Timer in der Variablen
tMySwitch gespeichert.
Anschließend ist die Rule fertig.
Läuft der Timer (nach zwölf Sekunden) ab, so wird der hinterlegte Code ausgeführt, welcher den Befehl
ON an das Item
my2ndSwitch sendet. Anschließend wird die Variable noch auf
null gesetzt (dieser Schritt ist nicht unbedingt erforderlich).
Diese Rule ist in der openHAB DSL programmiert. Sie muss
zwingend über eine
.rules Datei angelegt werden. Diese Dateien werden im Verzeichnis
/etc/openhab/rules/ gespeichert und tragen die Endung
.rules.
Die Rule kann in anderer Form auch über die UI angelegt werden, allerdings gibt es in der UI-Version keine globalen Variablen, was es etwas komplizierter macht, einen Timer einzusetzen. Eine einfache Alternative wäre dann eine Rule, welche den Zustand zum Update eines anderen Items verwendet, das dann wiederum über die Funktion expiration Timer verwendet wird, um eine zweite Rule zu starten (die dann das Item my2ndSwitch schalten würde). Ist etwas umständlich... Grundsätzlich: Du brauchst drei Items (mySwitch, my2ndSwitch und z.B. myExpireSwitch).
Die erste Rule triggert auf mySwitch changed und setzt myExpireSwitch per postUpdate(!) auf den gleichen Status wie mySwitch.
myExpireSwitch bekommt als Expiration Time zwölf Sekunden und als Befehl sendCommand OFF hinterlegt. Das Item wird also, so es auf den Status ON gebracht wird, nach zwölf Sekunden den Befehl OFF senden und den eigenen Status aufgrund von autoUpdate auf OFF ändern.
Die zweite Rule triggert auf myExpireSwitch received command OFF und schaltet my2ndSwitch per sendCommand auf ON. Wenn also das Expire Item abläuft, wird die Rule ausgelöst. Wird hingegen der Status des Expire Items vor Ablauf der zwölf Sekunden auf OFF geändert (weil mySwitch auf OFF gewechselt hat), so wird der Befehl nicht ausgelöst, die zweite Rule wird nicht gestartet.
openHAB4.3.3 stable in einem Debian-Container (bookworm) (Proxmox 8.3.5, LXC), mit openHABian eingerichtet