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