Ich habe in FHEM eine Struktur, die mir eine Aussage über die Anwesenheit zurückgibt. Bisher benutze ich diese zur Überwachung von jedem Fenster, also wenn Anwesenheit == "absent" und Festern offen, schicke Nachricht.
Ich will mein FHEM mal ein bisschen Aufräumen und diese einzelnen DOIFs für jedes Fenster durch ein globales ersetzen. So sieht das aktuell aus:
Internals:
CFGFN
DEF (([gl.fs.Anwesenheit] eq "absent") and ["\.fk\.:open"])
(set gl.tb.Telegram message Es sind folgende Fenster geöffnet und keiner zuhause: [@a"\.fk\.":state:"open"])
DOELSE ()
FUUID 6642247b-f33f-2bd4-2a29-7cb568d4e7fe41f8
MODEL FHEM
NAME gl.fd.FensterAbwesend
NOTIFYDEV gl.fs.Anwesenheit,.*(\.fk\.).*,global
NR 5524
NTFY_ORDER 50-di_Fenster
STATE cmd_2
TYPE DOIF
VERSION 28546 2024-02-23 20:11:05
eventCount 1702
READINGS:
2024-05-18 14:00:40 Device gl.fs.Anwesenheit
2024-05-18 14:00:40 cmd 2
2024-05-18 14:00:40 cmd_event gl.fs.Anwesenheit
2024-05-18 14:00:40 cmd_nr 2
2024-05-18 14:00:40 e_gl.fs.Anwesenheit_STATE absent
2024-05-18 13:48:05 mode enabled
2024-05-18 14:00:40 state cmd_2
Regex:
accu:
bar:
barAvg:
collect:
cond:
:
0:
"\.fk\.:open" \.fk\.:open
gl.fs.Anwesenheit:
0:
&STATE ^gl.fs.Anwesenheit$
attr:
cmdState:
wait:
waitdel:
condition:
0 (::InternalDoIf($hash,'gl.fs.Anwesenheit','STATE') eq "absent") and ::EventDoIf('\.fk\.',$hash,'open',0)
do:
0:
0 set gl.tb.Telegram message Es sind folgende Fenster geöffnet und keiner zuhause: [@a"\.fk\.":state:"open"]
1:
0
helper:
NOTIFYDEV gl.fs.Anwesenheit,.*(\.fk\.).*,global
event absent
globalinit 1
last_timer 0
sleeptimer -1
timerdev gl.fs.Anwesenheit
timerevent absent
triggerDev gl.fs.Anwesenheit
DOIF_eventa:
cmd_nr: 2
cmd: 2
cmd_event: gl.fs.Anwesenheit
cmd_2
DOIF_eventas:
cmd_nr: 2
cmd: 2
cmd_event: gl.fs.Anwesenheit
state: cmd_2
timerevents:
absent
timereventsState:
state: absent
triggerEvents:
absent
triggerEventsState:
state: absent
internals:
all gl.fs.Anwesenheit:STATE
readings:
trigger:
uiState:
uiTable:
Attributes:
do always
room Global
Leider löst das nur aus, wenn gl.fs.Anwesenheit schon absent ist und ein Fenster geöffnet wurde. Der umgekehrte Fall, ich fahre weg und die Fenster sind schon offen funktioniert nicht. Die einzelnen DOIFs funktionieren aber in dem Fall - ich bekomme für jedes Fenster eine Nachricht. Und die sind exakt genauso aufgebaut, z.B.
Internals:
DEF (([ba.fk.FensterRechts] eq "open") && ([gl.fs.Anwesenheit] eq "absent")) (set gl.tb.Telegram message Fenster in Bad offen und keiner zuhause!)
FUUID 5cb63c06-f33f-d318-abd5-400b0557af3194c4
MODEL FHEM
NAME ba.fd.FensterRechts.WarnOffenWeg
NOTIFYDEV global,gl.fs.Anwesenheit,ba.fk.FensterRechts
NR 198
NTFY_ORDER 50-ba.fd.FensterRechts.WarnOffenWeg
STATE cmd_1
TYPE DOIF
VERSION 28546 2024-02-23 20:11:05
eventCount 41
READINGS:
2024-05-18 14:00:40 Device gl.fs.Anwesenheit
2024-05-18 14:00:40 cmd 1
2024-05-18 14:00:40 cmd_event gl.fs.Anwesenheit
2024-05-18 14:00:40 cmd_nr 1
2024-05-18 13:05:11 e_ba.fk.FensterRechts_STATE open
2024-05-18 14:00:40 e_gl.fs.Anwesenheit_STATE absent
2024-05-18 14:00:40 state cmd_1
Regex:
accu:
bar:
barAvg:
collect:
cond:
ba.fk.FensterRechts:
0:
&STATE ^ba.fk.FensterRechts$
gl.fs.Anwesenheit:
0:
&STATE ^gl.fs.Anwesenheit$
attr:
cmdState:
wait:
waitdel:
condition:
0 (::InternalDoIf($hash,'ba.fk.FensterRechts','STATE') eq "open") && (::InternalDoIf($hash,'gl.fs.Anwesenheit','STATE') eq "absent")
do:
0:
0 set gl.tb.Telegram message Fenster in Bad offen und keiner zuhause!
1:
helper:
NOTIFYDEV global,gl.fs.Anwesenheit,ba.fk.FensterRechts
event absent
globalinit 1
last_timer 0
sleeptimer -1
timerdev gl.fs.Anwesenheit
timerevent absent
triggerDev gl.fs.Anwesenheit
DOIF_eventa:
cmd_nr: 1
cmd: 1
cmd_event: gl.fs.Anwesenheit
cmd_1
DOIF_eventas:
cmd_nr: 1
cmd: 1
cmd_event: gl.fs.Anwesenheit
state: cmd_1
timerevents:
absent
timereventsState:
state: absent
triggerEvents:
absent
triggerEventsState:
state: absent
internals:
all ba.fk.FensterRechts:STATE gl.fs.Anwesenheit:STATE
perlblock:
readings:
trigger:
uiState:
uiTable:
Attributes:
room Bad
Ich habe gerade mal rumprobiert und sehe auch im DOIF dass das Event für Anwesenheit ankommt (siehe Screenshot). Habe auch testweise die beiden Auslösebedingungen ausgetauscht, ohne Erfolg.
Du verknüpfst einen Zustand (Anwesenheit) mit einem Event. Ersterer ist wahr oder falsch und löst bei Änderung einen Event aus.
Letzterer ist immer falsch, außer in dem Zeitpunkt, in dem er ausgelöst wird.
Außerdem ist immer nur ein Event aktiv (serielle Verarbeitung).
Wenn sich also die Anwesenheit ändert, ist der andere Event immer (!) falsch.
Du kannst das trennen und die Fenster Events eine Variable/Liste/Status ändern lassen, welche beim Gehen nur "vorgelesen" wird.
Verstehe, du meinst
[ba.fk.FensterRechts] eq "open"
ist nicht gleich
[ba.fk.FensterRechts:open]
Kann ich denn sowas ausdrücken wie
["\.fk\."] eq "open"
Oder ansonsten würde ich es mit
(([gl.fs.Anwesenheit] eq "absent") and ([#"\.fk\.":state:"open"]>0))
versuchen
Du kannst die Abzahl aller offenen Fenster in einem DOIF Reading (https://forum.fhem.de/index.php?topic=70624.0) ermitteln und beim Gehen einfach abfragen.