ich habe folgende Rule die jahrelang ohne Probleme funktioniert hat, aber jetzt irgendwie nicht mehr.
Code: Alles auswählen
var String logPrefix = 'Fensterüberwachung: '
var boolean log = true
var boolean useBot = false
var String meldeText = ''
var Number fensterOffenWarnungKueche = 60
var Number fensterOffenWarnungKG = 60
var Number lastNotification
// Die ursprüngliche Rule ist von hier -> https://www.forwardme.de/2019/10/03/offene-fenster-nie-wieder-vergessen-dank-openhab/
rule "Fenster Benachrichtigung"
when
Time cron "0 0/1 * * * ?" // Alle 1 Minute
then
// Check ob Variablen passen, ansonsten defaultwert setzen
if ((NotificationFenster.state != OFF) && (NotificationFenster.state != ON)) {
NotificationFenster.sendCommand(ON)
logInfo('rules', logPrefix + 'Setze Default-Wert für NotificationFenster=An')
}
if (fensterOffenWarnungMinuten.state == null) {
fensterOffenWarnungMinuten.postUpdate(30)
logInfo('rules', logPrefix + 'Setze Default-Wert für fensterOffenWarnungMinuten=30')
}
if (lastNotification == null) {
lastNotification = now.toInstant().toEpochMilli();
logInfo('rules', logPrefix + 'Setze Wert für lastNotification auf die aktuelle Zeit ' + lastNotification )
}
if ((now.getMonthValue() >= 11 || now.getMonthValue() <= 3) && fensterOffenWarnungMinuten.state != 10) // zwischen November und März die Zeit auf 10 Minuten ändern.
{
fensterOffenWarnungMinuten.postUpdate(10)
logInfo('rules', logPrefix + 'Setze Wert für fensterOffenWarnungMinuten=10 (Winter)')
}
else if ((now.getMonthValue() >= 4 && now.getMonthValue() <= 10) && fensterOffenWarnungMinuten.state != 30) // zwischen April und Oktober die Zeit auf 30 Minuten ändern.
{
fensterOffenWarnungMinuten.postUpdate(30)
logInfo('rules', logPrefix + 'Setze Wert für fensterOffenWarnungMinuten=30')
}
useBot = false
// Ist Benachrichtigung über offene Fenster aktiviert?
if (NotificationFenster.state == ON) {
var Number n1 = gKontakte.members.filter[i|i.state == OPEN].size + gKontakte.members.filter[i|i.state == ON].size
if (n1 > 0)
{
meldeText = ''
// zuerst schauen wir, ob Fenster noch in die Liste rein müssen, wenn noch nicht enthalten
gKontakte.members.filter[ i | i.state.toString() == 'OPEN' || i.state.toString() == 'ON'].forEach[i|
var lastUpdate = i.lastUpdate("mapdb").toInstant();
// Ermitteln, wie lange in Sekunden das Fenster nun offen ist
var long offenInMinuten = (now.toInstant().toEpochMilli() - lastUpdate.toEpochMilli())/(1000*60);
if (log) logInfo('rules', 'letztes Update von ' + i.name + ' (Status: ' + i.state.toString() + '): ' + lastUpdate + ' - offen seit Minuten: ' + offenInMinuten.toString())
if ((offenInMinuten >= (fensterOffenWarnungKueche)) && (i.name == "EG_Kueche_Fenster" )) {
meldeText+=i.name.toString() + ' seit ' + offenInMinuten + ' Minuten, '
}
else if ((offenInMinuten >= (fensterOffenWarnungKG)) && (i.name == "KG_Kellerfenster" )) {
meldeText+=i.name.toString() + ' seit ' + offenInMinuten + ' Minuten, '
}
else if ((offenInMinuten >= (fensterOffenWarnungMinuten.state as DecimalType)) && (i.name != "EG_Kueche_Fenster" )&& (i.name != "KG_Kellerfenster" )) {
meldeText+=i.name.toString() + ' seit ' + offenInMinuten + ' Minuten, '
}
if ((offenInMinuten == (fensterOffenWarnungKueche)) && (i.name == "EG_Kueche_Fenster" )) {
// Nun per Pushover warnen
useBot = true
}
else if ((offenInMinuten == (fensterOffenWarnungKG)) && (i.name == "KG_Kellerfenster" )) {
// Nun per Pushover warnen
useBot = true
}
else if ((offenInMinuten == (fensterOffenWarnungMinuten.state as DecimalType)) && (i.name != "EG_Kueche_Fenster" )&& (i.name != "KG_Kellerfenster" )) {
// Nun per Pushover warnen
if (now.getHour() >= 22 || now.getHour() <= 7) // keine Nachricht zwischen 22 Uhr und 07 Uhr versenden
{
useBot = false
logInfo('rules', logPrefix + 'useBot=false')
}
else
{
useBot = true
logInfo('rules', logPrefix + 'useBot=true')
}
}
]
if (meldeText != '')
{
// Meldetext erzeugen
meldeText = 'Fenster/Türen offen: ' + meldeText.replaceAll('KG_','Kellergeschoß_').replaceAll('EG_','Erdgeschoß ').replaceAll('OG_','Obergeschoß ').replaceAll('r_S','r_Süden').replaceAll('r_O','r_Osten').replaceAll('r_W','r_Westen').replaceAll('r_N','r_Norden').replaceAll('_',' ').replaceAll('ue','ü').replaceAll('ae','ä').replaceAll('Fenster','').replaceAll('Kind2','T****') + ' bitte schließen!'
if (log) logInfo('rules', logPrefix + 'Meldung über offene Fenster wird erfolgen...')
if (meldeText.length() > 250)
{
meldeText = meldeText.substring(0,250)
if (log) logInfo('rules', logPrefix + 'Meldetext gekürzt...')
}
if (useBot)
{
if (((now.toInstant().toEpochMilli() - lastNotification)/(1000*60)) > 10)
{
val actions = getActions("pushover", "pushover:pushover-account:*********")
actions.sendMessage("Information", meldeText)
lastNotification = now.toInstant().toEpochMilli();
logInfo('rules', logPrefix + 'Meldung über offene Fenster wird gesendet...')
if (log) logInfo('rules', logPrefix + meldeText)
}
else
{
logInfo('rules', logPrefix + 'Meldung über offene Fenster wird NICHT gesendet, letzte Meldung noch keine 10 Minuten her.')
if (log) logInfo('rules', logPrefix + meldeText)
}
}
else
{
if (log) logInfo('rules', logPrefix + 'Meldung über offene Fenster wird NICHT gesendet...')
if (log) logInfo('rules', logPrefix + meldeText)
}
}
}
else
{
if (log) logInfo('rules', logPrefix + 'Es sind keine Fenster/Türen offen!')
}
}
end
Gerade habe ich ein Fenster geöffnet und als Status folgendes bekommen:
Ich habe es aber gerade erst geöffnet. Warum wird der Status nicht aktualisiert?letztes Update von OG_Ankleide_Fenster (Status: OPEN): 2025-10-29T12:19:44Z - offen seit Minuten: 2672
Hier müsste ja die aktuelle Zeit stehen, also offen seit Minuten: 0.
Meine mapdb.persist sieht so aus:
Code: Alles auswählen
Strategies {
default = everyChange
}
Items {
*: strategy = everyChange, restoreOnStartup
NotificationFenster : strategy = everyChange, restoreOnStartup
kontakteoffen : strategy = everyChange, restoreOnStartup
...
}
Bin aktuell auf OH 5.0.2
Wo liegt jetzt mein Problem?
P.S. Wenn ich die log Settings von mapdb auf Debug stelle, dann passt lastUpdate jedesmal.