Ja, die Rule hat Fehler
Korrekt musst Du den Itemnamen mit .state ergänzen, um den Status zu erhalten, also so:
Nun gibt es aber keine Garantie, dass der Status des Items zur Laufzeit der Rule noch identisch mit dem Status ist, der zum Start der Rule geführt hat (auch wenn das fast immer der Fall sein wird).
Besser ist es, nach dem neuen Status zu fragen, dazu gibt es die implizite Variable newState.
Außerdem hast Du unnötig doppelten Code in der Rule, sowie gänzlich unnötigen Code.
Sauber sieht es so aus:
Code: Alles auswählen
var Timer Licht4_Timer = null
rule "Nachricht wenn Licht im Haus 4 offline"
when
Item Schildkroeten_Licht4_Online changed
then
Licht4_Timer?.cancel
if(newState != ON)
Licht4_Timer = createTimer(now.plusMinutes(60), [|
val telegramAction = getActions("telegram","telegram:telegramBot:Telegram_Bot")
telegramAction.sendTelegram("Licht im Schildkrötenhaus 4 ist seit einer Stunde Offline")
])
end
Die Schreibweise mit dem Fragezeichen
ist gleichbedeutend mit
Der Timer wird also gestoppt, falls er existiert. Eigentlich: Falls ein Zeiger auf einen Timer existiert, wird dieser aus dem Scheduler gelöscht, unabhängig davon, ob er existiert, noch auf die Ausführung wartet oder schon abgelaufen ist. Die cancel-Funktion wirft aber nur einen Fehler, wenn sie mit null aufgerufen wird, ansonsten wird z.B. bei einem bereits abgelaufenen Timer das Fehlen des Timers stillschweigend ignoriert. Das ist auch der Grund, warum man die Variable nicht explizit auf null setzen muss, nur beim Initialisieren (var Timer ... = null) ist das wichtig.
Da der Timer so oder so gestoppt werden muss, kann man das auch genauso gut zu Beginn des Codes erledigen und anschließend nur für den Fall, dass das Item nicht den Zustand ON hat den Timer erneut anlegen.
openHAB4.1.2 stable in einem Debian-Container (bookworm) (Proxmox 8.2.2, LXC), mit openHABian eingerichtet