[gelöst] DOIF: Warum funktioniert "wait" nicht?

Begonnen von Jogi, 11 Dezember 2021, 12:03:45

Vorheriges Thema - Nächstes Thema

Jogi

Hallo,
ich habe folgendes DOIF:
Internals:
   DEF        ([Kaltwasser:presence] eq "absent")()(set teleBot message 🆘️ Fühler/Modul Heizung AUSFALL)(set HeizungFuehler off)
DOELSEIF ([Kaltwasser:presence] eq "present")() (set HeizungFuehler on)(set teleBot message Fühler/Modul Heizung OK)
DOELSE ## nothing
   FUUID      5c44780f-f33f-8efe-3aaa-1c28c8b6e430bbfb
   MODEL      FHEM
   NAME       HeizungFuehlerd1
   NOTIFYDEV  Kaltwasser,global
   NR         1497
   NTFY_ORDER 50-HeizungFuehlerd1
   STATE      cmd_2_1
   TYPE       DOIF
   VERSION    24905 2021-09-01 18:35:54
   READINGS:
     2021-12-11 11:50:25   Device          Kaltwasser
     2021-12-11 11:50:41   cmd             2.1
     2021-12-11 11:50:41   cmd_event       Kaltwasser
     2021-12-11 11:50:41   cmd_nr          2
     2021-12-11 11:50:41   cmd_seqnr       1
     2021-12-11 11:50:25   e_Kaltwasser_presence present
     2021-12-10 13:59:16   mode            enabled
     2021-12-11 11:50:41   state           cmd_2_1
     2021-12-11 11:50:41   wait_timer      11.12.2021 11:54:41 cmd_2_2 Kaltwasser
   Regex:
     accu:
     collect:
     cond:
       Kaltwasser:
         0:
           presence   ^Kaltwasser$:^presence:
         1:
           presence   ^Kaltwasser$:^presence:
   attr:
     cmdState:
     wait:
       0:
         15
         600
         30
       1:
         15
         240
         5
       2:
         0
     waitdel:
   condition:
     0          ::ReadingValDoIf($hash,'Kaltwasser','presence') eq "absent"
     1          ::ReadingValDoIf($hash,'Kaltwasser','presence') eq "present"
   do:
     0:
       0         
       1          set teleBot message 🆘️ Fühler/Modul Heizung AUSFALL
       2          set HeizungFuehler off
     1:
       0         
       1          set HeizungFuehler on
       2          set teleBot message Fühler/Modul Heizung OK
     2:
       0         
   helper:
     DEVFILTER  ^global$|^Kaltwasser$
     NOTIFYDEV  global|Kaltwasser
     event      presence: present
     globalinit 1
     last_timer 0
     sleepdevice Kaltwasser
     sleepsubtimer 1
     sleeptimer 1
     timerdev   Kaltwasser
     timerevent presence: present
     triggerDev Kaltwasser
     DOIF_eventa:
       cmd_nr: 2
       cmd_seqnr: 1
       cmd_event: Kaltwasser
       cmd_2_1
     DOIF_eventas:
       cmd_nr: 2
       cmd_seqnr: 1
       cmd_event: Kaltwasser
       state: cmd_2_1
     timerevents:
       presence: present
     timereventsState:
       presence: present
     triggerEvents:
       presence: present
     triggerEventsState:
       presence: present
   internals:
   readings:
     all         Kaltwasser:presence
   trigger:
   uiState:
   uiTable:
Attributes:
   alias      Störmeldung absent
   wait       15,600,30:15,240,5:0

Doch anscheinend funktioniert das wait da nicht wie ich es gerne hätte.
Hier mal ein Auszug aus dem log:
2021-12-11_11:42:23 Kaltwasser presence: absent
2021-12-11_11:42:24 Kaltwasser absent
2021-12-11_11:43:13 Hz_Vorlauf Tem: 34.50
2021-12-11_11:47:28 Brauchwasser presence: absent
2021-12-11_11:47:28 Brauchwasser absent
2021-12-11_11:47:47 FB_Heizung presence: present
2021-12-11_11:47:47 FB_Heizung Tem: 33.50
2021-12-11_11:50:25 Kaltwasser Temperature: 20.00
2021-12-11_11:50:25 Kaltwasser presence: present

Demnach kommt die Meldung:
2021-12-11_11:42:23 Kaltwasser presence: absent
um 11:42 Uhr.
Zum selben Zeítpunkt geht die Meldung auch per Telegram raus (siehe Anhang). Wenn ich DOIF und wait richtig verstehe dürfte die Meldung aber erst nach exakt 615 Sekunden (15+600) rausgehen. Gleiches gilt für die Meldung bei zurücksetzen.

Das ist nicht mein einziges DOIF und auch nicht mein einziges wait, aber es ist das Einzige, das nicht so läuft wie gewollt. Wahrscheinlich sitzt das Problem wieder vor dem Rechner, aber ich komme momentan nicht darauf.
PS. Das () in dem cmd´s habe ich nur eingebaut, weil ich festgestellt habe, dass es keine Verzögerung gibt und es war ein Versuch doch noch eine Verzögerung hinzukriegen. Das war vorher nicht drin, hat aber auch nicht funktioniert.

Für Tipps bin ich dankbar.


Damian

Zitat von: Jogi am 11 Dezember 2021, 12:03:45
Hallo,
ich habe folgendes DOIF:
Internals:
   DEF        ([Kaltwasser:presence] eq "absent")()(set teleBot message 🆘️ Fühler/Modul Heizung AUSFALL)(set HeizungFuehler off)
DOELSEIF ([Kaltwasser:presence] eq "present")() (set HeizungFuehler on)(set teleBot message Fühler/Modul Heizung OK)
DOELSE ## nothing
   FUUID      5c44780f-f33f-8efe-3aaa-1c28c8b6e430bbfb
   MODEL      FHEM
   NAME       HeizungFuehlerd1
   NOTIFYDEV  Kaltwasser,global
   NR         1497
   NTFY_ORDER 50-HeizungFuehlerd1
   STATE      cmd_2_1
   TYPE       DOIF
   VERSION    24905 2021-09-01 18:35:54
   READINGS:
     2021-12-11 11:50:25   Device          Kaltwasser
     2021-12-11 11:50:41   cmd             2.1
     2021-12-11 11:50:41   cmd_event       Kaltwasser
     2021-12-11 11:50:41   cmd_nr          2
     2021-12-11 11:50:41   cmd_seqnr       1
     2021-12-11 11:50:25   e_Kaltwasser_presence present
     2021-12-10 13:59:16   mode            enabled
     2021-12-11 11:50:41   state           cmd_2_1
     2021-12-11 11:50:41   wait_timer      11.12.2021 11:54:41 cmd_2_2 Kaltwasser
   Regex:
     accu:
     collect:
     cond:
       Kaltwasser:
         0:
           presence   ^Kaltwasser$:^presence:
         1:
           presence   ^Kaltwasser$:^presence:
   attr:
     cmdState:
     wait:
       0:
         15
         600
         30
       1:
         15
         240
         5
       2:
         0
     waitdel:
   condition:
     0          ::ReadingValDoIf($hash,'Kaltwasser','presence') eq "absent"
     1          ::ReadingValDoIf($hash,'Kaltwasser','presence') eq "present"
   do:
     0:
       0         
       1          set teleBot message 🆘️ Fühler/Modul Heizung AUSFALL
       2          set HeizungFuehler off
     1:
       0         
       1          set HeizungFuehler on
       2          set teleBot message Fühler/Modul Heizung OK
     2:
       0         
   helper:
     DEVFILTER  ^global$|^Kaltwasser$
     NOTIFYDEV  global|Kaltwasser
     event      presence: present
     globalinit 1
     last_timer 0
     sleepdevice Kaltwasser
     sleepsubtimer 1
     sleeptimer 1
     timerdev   Kaltwasser
     timerevent presence: present
     triggerDev Kaltwasser
     DOIF_eventa:
       cmd_nr: 2
       cmd_seqnr: 1
       cmd_event: Kaltwasser
       cmd_2_1
     DOIF_eventas:
       cmd_nr: 2
       cmd_seqnr: 1
       cmd_event: Kaltwasser
       state: cmd_2_1
     timerevents:
       presence: present
     timereventsState:
       presence: present
     triggerEvents:
       presence: present
     triggerEventsState:
       presence: present
   internals:
   readings:
     all         Kaltwasser:presence
   trigger:
   uiState:
   uiTable:
Attributes:
   alias      Störmeldung absent
   wait       15,600,30:15,240,5:0

Doch anscheinend funktioniert das wait da nicht wie ich es gerne hätte.
Hier mal ein Auszug aus dem log:
2021-12-11_11:42:23 Kaltwasser presence: absent
2021-12-11_11:42:24 Kaltwasser absent
2021-12-11_11:43:13 Hz_Vorlauf Tem: 34.50
2021-12-11_11:47:28 Brauchwasser presence: absent
2021-12-11_11:47:28 Brauchwasser absent
2021-12-11_11:47:47 FB_Heizung presence: present
2021-12-11_11:47:47 FB_Heizung Tem: 33.50
2021-12-11_11:50:25 Kaltwasser Temperature: 20.00
2021-12-11_11:50:25 Kaltwasser presence: present

Demnach kommt die Meldung:
2021-12-11_11:42:23 Kaltwasser presence: absent
um 11:42 Uhr.
Zum selben Zeítpunkt geht die Meldung auch per Telegram raus (siehe Anhang). Wenn ich DOIF und wait richtig verstehe dürfte die Meldung aber erst nach exakt 615 Sekunden (15+600) rausgehen. Gleiches gilt für die Meldung bei zurücksetzen.

Das ist nicht mein einziges DOIF und auch nicht mein einziges wait, aber es ist das Einzige, das nicht so läuft wie gewollt. Wahrscheinlich sitzt das Problem wieder vor dem Rechner, aber ich komme momentan nicht darauf.
PS. Das () in dem cmd´s habe ich nur eingebaut, weil ich festgestellt habe, dass es keine Verzögerung gibt und es war ein Versuch doch noch eine Verzögerung hinzukriegen. Das war vorher nicht drin, hat aber auch nicht funktioniert.

Für Tipps bin ich dankbar.

Man sieht ja die Timer, die gerade laufen in den Readings, die werden wohl funktionieren. Ein wait-Timer wird nicht zurückgesetzt beim erneutem Event, womöglich ist der Auslöser ein Event zuvor und nicht das, was du sieht.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

Jogi

Hallo Damian,
das verstehe ich nicht ganz.
Man sieht doch z.B. auch an
2021-12-11_11:50:25 Kaltwasser presence: present
dass die Telegram-Meldung sofort kommt, ohne wait (DOIF geht auf cmd2). Dazwischen war doch kein Event mehr.
Oder verstehe ich da etwas falsch?

Damian

Hier funktioniert alles wie programmiert:

Zitat2021-12-11 11:50:25   Device          Kaltwasser
     2021-12-11 11:50:41   cmd             2.1
     2021-12-11 11:50:41   cmd_event       Kaltwasser
     2021-12-11 11:50:41   cmd_nr          2
     2021-12-11 11:50:41   cmd_seqnr       1
     2021-12-11 11:50:25   e_Kaltwasser_presence present
     2021-12-10 13:59:16   mode            enabled
     2021-12-11 11:50:41   state           cmd_2_1
     2021-12-11 11:50:41   wait_timer      11.12.2021 11:54:41 cmd_2_2 Kaltwasser

Um 11:50:25 kam das auslösende Event
Um 11:50:41 wurde der erste Befehl ausgelöst cmd_2_1 (16 Sekunden später)
und um 11:54:41 kommt der zweite   (240 Sekunden später)
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

Jogi

#4
Vielen Dank für Deine Erklärung.
Ich habe nie daran gezweifelt das DOIF richtig funktioniert, aber ich bin erst jetzt durch Deine Erklärung darauf gekommen, dass die Meldung irgendwo anders herkommen muss.

Und, Asche auf mein Haupt, ich schäme mich  :-[
Ich habe den Fehler lokalisiert und die Ursache saß -natürlich :-\- mal wieder vor dem Rechner.
Ich hatte dasselbe DOIF zweimal in meiner fhem.cfg, unter unterschiedlichen Namen. Das eine hat das wait-Attribut, das andere nicht.
Bei welcher Bastelei das passiert ist weiß ich nicht mehr.
So sind die Meldungen immer von den DOIF gekommen, das nicht verzögert und das ich nicht auf dem Schirm hatte.
Eigene Doofheit.

Sorry für den Aufwand und Danke für den Schubser,
Jogi