DOIF löst bei Abwesenheit nicht aus

Begonnen von teichtaucher, 18 Mai 2024, 14:17:54

Vorheriges Thema - Nächstes Thema

teichtaucher

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.


Per

#1
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.

teichtaucher

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

Per

Du kannst die Abzahl aller offenen Fenster in einem DOIF Reading ermitteln und beim Gehen einfach abfragen.