ich habe folgenden Usecase, kann ihn aber nicht effektiv umsetzen.
Ich möchte eine Erinnerung z.B. per Telegram haben, wenn ein Fenster/Tür länger als ein bestimmte Zeit offen ist. Z.B. nach 10 Minuten.
Für ein Fenster funktioniert es wie folgt:
Ich habe einen "FensterKontakt" und eine virtuellen Schalter "FensterKontakt_Zeit". Öffne ich das Fenster, starte ich einen Timer von 10 Minuten, der dann die Variable FensterKontakt_Zeit einschaltet. Wenn nach den 10 Minuten der FensterKontakt_Zeit einschaltet, prüfe ich ob FensterKontakt immernoch OPEN ist, wenn ja gibt es ein Meldung, wenn nicht, gibt es keine Meldung und der FensterKontakt_Zeit wird wieder auf OFF geschaltet.
Wird das Fenster nach z.b. 15 Minuten geschlossen, wird eine Meldung ausgelöst "Fenster wieder geschlossen".
Soweit funktioniert das sehr gut. Ich habe aber deutlich mehr als 15 dieser Sensoren und möchte nur ein Script haben.
Idee:
Ich gruppiere alle Fenster/Tür Kontakte in einer Gruppe FensterCheckGroup und alle Zeit Variablen (die den gleichen Namen haben wie der FensterKontakt + "_ZEIT") in der Gruppe FensterCheckGroup_ZEIT.
Über ein oder zwei Rules möchte ich indirekt über den Member die entsprechenden Kontakte abfragen.
Das klappt auch ganz gut, aber für die Zeitverzögerung nehme ich eine Lambda Funktion, die keine Indirekten Objekte erlaubt.
Hier hänge ich im Moment.
Script bisher ohne Gruppe für ein Fenster:
Code: Alles auswählen
var Timer tKueche = null
rule "Timer_Fenster_Kueche"
when
Item ZW_WZ_Kueche_Kontakt_Door_Sensor changed
then
tKueche?.cancel // Falls Timer definiert, Timer entfernen
if(ZW_WZ_Kueche_Kontakt_Door_Sensor.state == OPEN) {
tKueche = createTimer(now.plusSeconds(10),[| ZW_WZ_Kueche_Kontakt_Door_Sensor_ZEIT.sendCommand(ON)])
} else {
tKueche?.cancel
if (ZW_WZ_Kueche_Kontakt_Door_Sensor_ZEIT.state == ON) {
ZW_WZ_Kueche_Kontakt_Door_Sensor_ZEIT.sendCommand(OFF)
val telegramAction = getActions("telegram","telegram:telegramBot:1cXXXXXXX80")
telegramAction.sendTelegram("Fenster Kueche - wieder zu")
}
}
end
rule "Activate Timer_Fenster_Kueche"
when
Item ZW_WZ_Kueche_Kontakt_Door_Sensor_ZEIT received command ON
// this only happens if timer runs to end
then
val telegramAction = getActions("telegram","telegram:telegramBot:1cXXXXXXX80")
telegramAction.sendTelegram("Fenster Kueche - zu lange offen")
end
Code: Alles auswählen
var Timer tKueche = null
rule "FensterCheck X"
when
Member of FensteCheckGroup changed
then
val mode = triggeringItem.state
val iName = triggeringItem.name
logInfo("FensterCheck","Name is: {}, Mode is: {}",iName,mode)
if (mode==OPEN) {
var itemName = FensteCheckGroup_Zeit.members.findFirst[ t | t.name == (iName + "_ZEIT") ] as GenericItem //get target item
logInfo("FensterCheck für ZEIT","Name is: {}",itemName)
tKueche = createTimer(now.plusSeconds(10),[| itemName.sendCommand(ON)]) ==> Hier ist der erste Fehler vom compiler
} else { // mode CLOSE
// var itemName = FensteCheckGroup_Zeit.members.findFirst[ t | t.name == (iName + "_ZEIT") ] as GenericItem //get target item
}
end
Vielen Dank für eure Ideen.