rule funktioniert nicht mehr wie gewünscht - Problem mit lastUpdate
Verfasst: 31. Okt 2025 14:16
Hallo,
ich habe folgende Rule die jahrelang ohne Probleme funktioniert hat, aber jetzt irgendwie nicht mehr.
Das Problem ist der lastUpdate-Status vom geöffneten Fenster.
Gerade habe ich ein Fenster geöffnet und als Status folgendes bekommen:
Hier müsste ja die aktuelle Zeit stehen, also offen seit Minuten: 0.
Meine mapdb.persist sieht so aus:
Ich kann nicht genau sagen seit wann das nicht mehr funktioniert und ob das mit einem Update von OH zu tun hat.
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.
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.