Ja, aber nein.

So wird ein Schuh draus:
Code: Alles auswählen
// Globale Variablen immer zu Anfang der Datei definieren!
var Timer tInnogyAlarm = null // Timer für Alarm Meldung
rule "Prüfung Innogy Zentrale"
when
Thing "innogysmarthome:bridge:d79b954f20" changed // Thing hat Stataus geändert
then
val thingStatusInfo = getThingStatusInfo("innogysmarthome:bridge:d79b954f20") // hole aktuellen Status
if(thingStatusInfo == "ONLINE") { // falls online
tInnogyAlarm?.cancel // falls existent, brich Timer ab
if(tInnogyAlarm !== null) tInnogyAlarm = null // falls Zeiger auf Timer gesetzt, löschen
} else if(tInnogyAlarm === null) { // nicht online -> falls noch kein Timer definiert
tInnogyAlarm = createTimer(ZonedDateTime.now.plusMinutes(3), [| // lege Timer an. Wenn Timer abläuft
Meldung.postUpdate ("Achtung die Innogy Zentrale ist Offline !!!") // Melde Offline Zustand
tInnogyAlarm = null
])
}
end
Der Punkt ist: Sobald die Zentrale Online ist, soll der Timer abgebrochen werden, der die Alarmmeldung bringt (das ist der erste Teil der Rule). Falls das Thing nicht Online ist, soll ein Timer gestartet werden (natürlich nur, wenn der Timer nicht bereits läuft).
Da wir außerhalb des Timers prüfen, ob das Thing Online ist, müssen wir diesen Test nicht im Timer selbst ausführen.
Die Rule sendet also genau dann einen Alarm, wen ndie Innogy Zentrale mehr als drei Minuten am Stück nicht Online ist.
Man kann das übrigens auch ohne DSL Timer erledigen, indem man ein Item als Timer definiert.
Gegeben: Switch Item tInnogyAlarm (weil sprechender Name...) mit Metadaten Expiration Timer:
Code: Alles auswählen
value: 0h3m0s,command=OFF
config:
ignoreStateUpdates: "false"
Nun gibt es zwei Rules:
Code: Alles auswählen
rule "Prüfung Innogy Zentrale"
when
Thing "innogysmarthome:bridge:d79b954f20" changed // Thing hat Stataus geändert
then
val thingStatusInfo = getThingStatusInfo("innogysmarthome:bridge:d79b954f20") // hole aktuellen Status
if(thingStatusInfo == "ONLINE") { // falls online
tInnogyAlarm.postUpdate(OFF) // falls existent, brich Timer ab
} else if(tInnogyAlarm.state != ON) { // nicht online -> falls noch kein Timer definiert
tInnogyAlarm.postUpdate(ON)
}
end
rule "Sende Alarm Innogy Zentrale"
when
Item tInnogyAlarm received command OFF
then
Meldung.postUpdate ("Achtung die Innogy Zentrale ist Offline !!!") // Melde Offline Zustand
end
Der Code ist weitgehend identisch. Die zweite Variante kann direkt über UI Rules definiert werden. Dafür ist aber die Expiration Time fix.
In der Rules DSL ist es ein Leichtes, je nach Bedarf unterschiedliche Ablaufzeiten zu verwenden (ich habe darüber z.B. meinen Dusch-WC Lüfter mit variablen Nachlaufzeiten ausgerüstet). Dafür muss die Rule aber zwingend über Textdatei angelegt werden, da ja eine globale Variable benötigt wird.
openHAB4.3.3 stable in einem Debian-Container (bookworm) (Proxmox 8.3.5, LXC), mit openHABian eingerichtet