Regel Lüften Warnung - Timer basierend auf Item
Verfasst: 5. Jul 2025 17:09
Hallo,
ich versuche meine Regel zur Warnung bei geöffneten Fenster anzupassen. Die Zeit bis zur Warnung soll nicht mehr fest definiert sein, sondern pro Fenster mittels Number Item gesteuert werden können.
Grundlage ist folgende Regel:
Nach besten Wissen habe ich die Regel wie folgt angepasst, aber es funktioniert nicht. Meine Programmierkenntnisse sind leider echt rudimentär, daher bin ich trotz zahlreichen Googlen nicht in der Regel die Regel zum Laufen zu bekommen.
Es erscheint folgende Fehlermeldung im Log:
Kann mir einer helfen? Vielen Dank.
Gruß
Robert
ich versuche meine Regel zur Warnung bei geöffneten Fenster anzupassen. Die Zeit bis zur Warnung soll nicht mehr fest definiert sein, sondern pro Fenster mittels Number Item gesteuert werden können.
Grundlage ist folgende Regel:
Code: Alles auswählen
import org.openhab.core.model.script.ScriptServiceUtil
import java.util.Map
val Map<String, Timer> contactTimers = newHashMap
val Map<String, Boolean> contactList = newHashMap
rule "Fenster Status"
when
Member of Fenstersensoren changed
then
val String itemLabel = triggeringItem.label
val String itemName = triggeringItem.name
val String itemNameSperren = itemName.replace("Kontakt","Sperren")
val GenericItem SperrenItem = ScriptServiceUtil.getItemRegistry?.getItem(itemNameSperren) as GenericItem
var vName = triggeringItem.name.split("_").get(1)
var vTimerName = "timer_" + vName
contactTimers.get(vTimerName)?.cancel;
if((triggeringItem.state == "Offen") && (SperrenItem.state != ON)) {
contactList.put(vTimerName,true)
contactTimers.put(vTimerName, createTimer(now.plusMinutes(13)) [|
var text = itemLabel + " ist "
if(contactList.get(vTimerName)) {
contactList.put(vTimerName,false)
text = text + "seit "
} else {
text = text + "länger als " }
text = text + "13 Minuten geöffnet"
AlexaWohnzimmer_Ankuendigung.sendCommand(text)
AlexaBad_TTS.sendCommand(text)
AlexaArbeitszimmer_TTS.sendCommand(text)
AlexaKueche_TTS.sendCommand(text)
if (Anwesenheit == OFF) {sendBroadcastNotification(text, "contact", "Info")}
else {
if (UniFiWirelessClientRobert_Online.state == ON) {sendNotification("abc@abc.de", text, "contact", "Info")}
}
contactTimers.get(vTimerName)?.reschedule(now.plusMinutes(5))
])
}
else if ((triggeringItem.state == "Offen") && (SperrenItem.state != OFF)) {
contactList.put(vTimerName,true)
contactTimers.put(vTimerName, createTimer(now.plusMinutes(1440)) [|
var text = itemLabel + " ist "
if(contactList.get(vTimerName)) {
contactList.put(vTimerName,false)
text = text + "seit "
} else {
text = text + "länger als " }
text = text + "1 Tag geöffnet"
AlexaWohnzimmer_Ankuendigung.sendCommand(text)
AlexaBad_TTS.sendCommand(text)
AlexaArbeitszimmer_TTS.sendCommand(text)
AlexaKueche_TTS.sendCommand(text)
if (Anwesenheit == OFF) {sendBroadcastNotification(text, "contact", "Info")}
else {
if (UniFiWirelessClientRobert_Online.state == ON) {sendNotification("abc@abc.de", text, "contact", "Info")}
}
contactTimers.get(vTimerName)?.reschedule(now.plusMinutes(10))
])
}
else
contactTimers.get(vTimerName)?.cancel
end
Code: Alles auswählen
import org.openhab.core.model.script.ScriptServiceUtil
import java.util.Map
val Map<String, Timer> contactTimers = newHashMap
val Map<String, Boolean> contactList = newHashMap
rule "Fenster Status"
when
Member of Fenstersensoren changed
then
val String itemLabel = triggeringItem.label
val String itemName = triggeringItem.name
val String itemNameSperren = itemName.replace("Kontakt","SperrenTest")
val GenericItem SperrenItem = ScriptServiceUtil.getItemRegistry?.getItem(itemNameSperren) as GenericItem
var vName = triggeringItem.name.split("_").get(1)
var vTimerName = "timer_" + vName
var vTimerTime = "13"
contactTimers.get(vTimerName)?.cancel;
if (SperrenItem.state instanceof Number) {vTimerTime = SperrenItem.state as Number}
if(triggeringItem.state == "Offen") {
logInfo("INFO", "Fenster geöffnet: " + itemName + " seit " + vTimerTime)
contactList.put(vTimerName,true)
contactTimers.put(vTimerName, createTimer(now.plusMinutesvTimerTime)) [|
var text = itemLabel + " ist "
if(contactList.get(vTimerName)) {
contactList.put(vTimerName,false)
text = text + "seit "
} else {
text = text + "länger als " }
text = text + vTimerTime + " Minuten geöffnet"
AlexaWohnzimmer_Ankuendigung.sendCommand(text)
AlexaBad_TTS.sendCommand(text)
AlexaArbeitszimmer_TTS.sendCommand(text)
AlexaKueche_TTS.sendCommand(text)
if (Anwesenheit == OFF) {sendBroadcastNotification(text, "contact", "Info")}
else {
if (UniFiWirelessClientRobert_Online.state == ON) {sendNotification("abc@abc.de", text, "contact", "Info")}
}
contactTimers.get(vTimerName)?.reschedule(now.plusMinutes(5))
])
}
else
contactTimers.get(vTimerName)?.cancel
end
Code: Alles auswählen
2025-07-05 16:59:37.035 [ERROR] [.handler.AbstractScriptModuleHandler] - Script execution of rule with UID 'Lueften-test-1' failed: An error occurred during the script execution: Could not invoke method: org.eclipse.xtext.xbase.lib.StringExtensions.operator_plus(java.lang.String,java.lang.String) on instance: null in Lueften-test
Gruß
Robert