Hallo zusammen,
ich verzweifle gerade an folgender DOIF. Ich habe das Modul erst seit kurzem in Betrieb und das ist eine meiner ersten DOIFs!
Das DOIF soll bei Unterschreitung der Außentemperatur (15°C) und geöffnetem Fenster eine Pushnachricht nach 610 Sekunden lossenden. Diese Nachricht soll 5x versendet werden mit einem zeitlichen Abstand von 300 Sekunden.
[var.push.warn.temp.badezimmer] ist ein dummy, welcher die Pushfunktion anschaltet oder ausschaltet. In diesem Fall war es natürlich auf "on". Sobald eine der mit "and" verknüpften Bedinungen unwahr wird, soll keine Nachricht mehr versendet werden.
Das Problem:
Wenn ich nach der ersten Nachricht zum Beispiel das Fenster schließe (oder den Dummy [var.push.warn.temp.badezimmer] auf "off" schalte), werden trotzdem alle 5 Nachrichten versendet. Ich möchte aber, dass dann natürlich nichts mehr versendet wird. Anbei ein Screenshot, wo man es erkennen kann, dass die DOIF Prüfung unwahr ist, aber trotzdem noch Nachrichten versendet werden.
Wo habe ich den Fehler eingebaut?
Kurzer Hintergrund was das DOIF macht:
Wenn alle diese Zustände eintreffen...
[var.push.warn.temp.badezimmer] eq "on"
[window.badezimmer:state] eq "open"
[sensor.luft.Aussen:temperature] < [var.tempwarn.limit:state]
wir eine Pushnachricht versendet
(set pushmsg msg 'Badezimmerfenster bitte schließen!' 'Raum: [sensor.luft.Badezimmer_OG:temperature]°C / [sensor.luft.Badezimmer_OG:humidity]% - Außen: [sensor.luft.Aussen:temperature] °C')
das DOIF hat folgende Attribute
do:always
repeatcmd:[var.tempwarn.repeatcmd:state]
repeatsame:[var.tempwarn.repeatsame:state]
wait: [var.tempwarn.wait:state]
dies sind die Variablen
var.tempwarn.limit: 15
var.tempwarn.repeatcmd: 300
var.tempwarn.repeatsame: 5
var.tempwarn.wait: 610
Lösche das do always-Attribut.
Ansonsten, immer in der Kommandozeile list <dein DOIF-Modul> eingeben und die Ausgabe als Code (#-Symbol oben) hier posten.
Hallo Damian,
danke für deine schnelle Antwort. Ich habe das "do always" Attribut entfernt und erneut einen Test gemacht. Leider besteht das Problem immer noch (siehe Screenshot)
Anbei mein "list push.warn.temp.badezimmer"
Internals:
CFGFN
DEF ([var.push.warn.temp.badezimmer] eq "on" and [window.badezimmer:state] eq "open" and [sensor.luft.Aussen:temperature] < [var.tempwarn.limit:state]) (set pushmsg msg 'Badezimmerfenster bitte schließen!' 'Raum: [sensor.luft.Badezimmer_OG:temperature]°C / [sensor.luft.Badezimmer_OG:humidity]% - Außen: [sensor.luft.Aussen:temperature] °C')
FUUID 5c5c7225-f33f-1bb7-d5a1-c60bc735e22d2934
MODEL FHEM
NAME push.warn.temp.badezimmer
NR 307
NTFY_ORDER 50-push.warn.temp.badezimmer
STATE cmd_1
TYPE DOIF
READINGS:
2019-02-07 20:32:13 Device window.badezimmer
2019-02-07 20:31:32 cmd 1
2019-02-07 20:31:31 cmd_count 3
2019-02-07 20:31:32 cmd_event window.badezimmer
2019-02-07 20:31:32 cmd_nr 1
2019-02-07 20:31:13 e_sensor.luft.Aussen_temperature 6.4
2019-02-07 20:11:13 e_var.push.warn.temp.badezimmer_STATE on
2019-02-07 20:32:13 e_window.badezimmer_state closed
2019-02-07 19:05:41 mode enabled
2019-02-07 20:31:32 state cmd_1
2019-02-07 20:31:32 wait_timer 07.02.2019 20:36:32 cmd_1 window.badezimmer
Regex:
attr:
cmdState:
repeatcmd:
[var.tempwarn.repeatcmd:state]
repeatsame:
[var.tempwarn.repeatsame:state]
wait:
0:
[var.tempwarn.wait:state]
waitdel:
condition:
0 ::InternalDoIf($hash,'var.push.warn.temp.badezimmer','STATE') eq "on" and ::ReadingValDoIf($hash,'window.badezimmer','state') eq "open" and ::ReadingValDoIf($hash,'sensor.luft.Aussen','temperature') < ::ReadingValDoIf($hash,'var.tempwarn.limit','state')
devices:
0 var.push.warn.temp.badezimmer window.badezimmer sensor.luft.Aussen var.tempwarn.limit
all var.push.warn.temp.badezimmer window.badezimmer sensor.luft.Aussen var.tempwarn.limit
do:
0:
0 set pushmsg msg 'Badezimmerfenster bitte schließen!' 'Raum: [sensor.luft.Badezimmer_OG:temperature]°C / [sensor.luft.Badezimmer_OG:humidity]% - Außen: [sensor.luft.Aussen:temperature] °C'
1:
helper:
event contact: closed (to broadcast),closed,trigger_cnt: 23
globalinit 1
last_timer 0
sleepdevice window.badezimmer
sleepsubtimer 0
sleeptimer 0
timerdev sensor.luft.Aussen
timerevent temperature: 6.4,humidity: 81
triggerDev window.badezimmer
DOIF_eventas:
cmd_nr: 1
cmd: 1
cmd_event: window.badezimmer
state: cmd_1
timerevents:
temperature: 6.4
humidity: 81
timereventsState:
temperature: 6.4
humidity: 81
triggerEvents:
contact: closed (to broadcast)
closed
trigger_cnt: 23
triggerEventsState:
contact: closed (to broadcast)
state: closed
trigger_cnt: 23
internals:
0 var.push.warn.temp.badezimmer:STATE
all var.push.warn.temp.badezimmer:STATE
itimer:
readings:
0 window.badezimmer:state sensor.luft.Aussen:temperature var.tempwarn.limit:state
all window.badezimmer:state sensor.luft.Aussen:temperature var.tempwarn.limit:state
trigger:
uiState:
uiTable:
Attributes:
repeatcmd [var.tempwarn.repeatcmd:state]
repeatsame [var.tempwarn.repeatsame:state]
room push
wait [var.tempwarn.wait:state]
Dann hänge einfach DOELSE am Ende deiner Definition an, damit das Modul den Zustand wechselt.
Okay, das haut hin! Vielen Dank!
Aber ich verstehe noch nicht, warum ich nicht nur ein DOIF nehmen kann, denn DOELSE ist doch optional, oder?
PS: Geniales Modul, was du da gemacht hast! 8)