Also, Du möchtest, dass ein Timer wiederkehrend eine Aufgabe ausführt. Der Timer soll aktiviert und deaktiviert werden. Das sieht so aus:
Code: Alles auswählen
var Timer tCheck = null // globale Variablen zu Beginn der Datei definieren
rule "Item ON" // Name der Rule
when
Item_Test changed // der Schalter wurde geschaltet
then
tCheck?.cancel // eventuell laufenden Timer stoppen
if(Item_Test.state == ON) // Falls Status ON
tCheck = createTimer(now.plusMinutes(30), [| // lege Timer an
//do something
tCheck.reschedule(now.plusMinutes(30) // Timer erneut planen
])
end
Zunächst muss ein Timer, den man steuern möchte (per cancel oder reschedule) in einem Objekt "gespeichert werden". Genauer ist das ein Zeiger auf den Timer.
Du lässt die Rule auf
received command triggern. Im Prinzip ist dagegen nichts einzuwenden, hier ist aber
changed der elegantere Trigger.
Triggert die Rule, so gibt es im Prinzip nur zwei Möglichkeiten, nämlich, der Status ist ON oder eben nicht. In letzterem Fall muss der Timer umgehend gestoppt werden. In ersterem Fall dürfte eigentlich kein Timer laufen, aber wer weiß... Es kann nicht schaden, den Timer zu canceln, falls es einen gibt. Der Befehl
tCheck?.cancel stoppt den Timer tCheck, allerdings nur, falls er existiert. Er ist gleichbedeutend mit dem Befehl
if(tCheck !== null) tCheck.cancel.
Man beachte dabei das Fragezeichen im ersten Befehl...
Falls also der Status ON ist, muss der Timer angelegt werden. Mit Ablauf des Timers wird der Code im Timer ausgeführt. Die letzte Handlung des Timercodes ist, den Timer erneut zu planen.
Timer ist übrigens ein Schlüsselwort, es steht nicht als gültiger Name einer Variablen zur Verfügung

openHAB4.3.5 stable in einem Debian-Container (bookworm) (Proxmox 8.4.1, LXC), mit openHABian eingerichtet