DOIF DOELSEIF Funktioniert nicht richtig

Begonnen von RatisBow, 02 April 2023, 18:12:44

Vorheriges Thema - Nächstes Thema

RatisBow

Hallo zusammen,

ich möchte über den Tag, abhängig des Tages meine Heizung regeln. Dazu habe ich vereinfacht ein TestDoIf erstellt.
Mit dem habe ich folgendes Problem,
gebe ich nur Zeitformate vor, Funktioniert alles
Beispiel:
## 1
([05:30-15:00])
   (set myDoIfTemp [MQTT2_ESP32Client:temperatur_W_soll])
## 2
DOELSEIF ([15:00-21:00])
   (set myDoIfTemp [MQTT2_ESP32Client:temperatur_W_soll])
## 3
DOELSEIF ([21:00-23:00])
   (set myDoIfTemp [MQTT2_ESP32Client:temperatur_W_soll])
## 4
DOELSE
   (set myDoIfTemp 18.0)   

gebe ich nun andere Zustandsbedingungen hinzu, werden diese mit checkall (cmd_2) richtig  ausgegeben, tritt ein Event ein, wird dies nicht mehr richtig erkannt (cmd_4).

Listing 1 mit checkall:
Internals:
   CFGFN     
   DEF        ## 1
(([05:30-15:00]) and ([Anwesenheit] eq "present") and ([myTemperatur] eq "on"))
   (set myDoIfTemp ([MQTT2_ESP32Client:temperatur_W_soll]))
## 2
DOELSEIF (([15:00-21:00]) and ([myTemperatur] eq "on"))
   (set myDoIfTemp ([MQTT2_ESP32Client:temperatur_W_soll]))
## 3
DOELSEIF (([21:00-23:00]) and ([Anwesenheit] eq "present") and ([myTemperatur] eq "on"))
   (set myDoIfTemp ([MQTT2_ESP32Client:temperatur_W_soll]))
## 4
DOELSE
   (set myDoIfTemp 18.0)

   FUUID      64299a42-f33f-7b43-0102-401d106e1ea461a9
   MODEL      FHEM
   NAME       TestDoif
   NOTIFYDEV  myTemperatur,global,Anwesenheit
   NR         13381
   NTFY_ORDER 50-TestDoif
   STATE      cmd_2
   TYPE       DOIF
   VERSION    27367 2023-03-27 21:37:33
   eventCount 42
   READINGS:
     2023-04-02 17:47:18   Device          Anwesenheit
     2023-04-02 17:47:25   cmd             2
     2023-04-02 17:47:25   cmd_event       TestDoif
     2023-04-02 17:47:25   cmd_nr          2
     2023-04-02 17:47:18   e_Anwesenheit_STATE present
     2023-04-02 17:44:11   mode            enabled
     2023-04-02 17:47:25   state           cmd_2
     2023-04-02 17:44:12   timer_01_c01    03.04.2023 05:30:00
     2023-04-02 17:44:12   timer_02_c01    03.04.2023 15:00:00
     2023-04-02 17:44:12   timer_03_c02    03.04.2023 15:00:00
     2023-04-02 17:44:12   timer_04_c02    02.04.2023 21:00:00
     2023-04-02 17:44:12   timer_05_c03    02.04.2023 21:00:00
     2023-04-02 17:44:12   timer_06_c03    02.04.2023 23:00:00
   Regex:
     accu:
     bar:
     barAvg:
     collect:
     cond:
       Anwesenheit:
         0:
           &STATE     ^Anwesenheit$
         1:
         2:
           &STATE     ^Anwesenheit$
       myTemperatur:
         0:
           &STATE     ^myTemperatur$
         1:
           &STATE     ^myTemperatur$
         2:
           &STATE     ^myTemperatur$
   attr:
     cmdState:
     wait:
     waitdel:
   condition:
     0          (::DOIF_time($hash,0,1,$wday,$hms)) and (::InternalDoIf($hash,'Anwesenheit','STATE') eq "present") and (::InternalDoIf($hash,'myTemperatur','STATE') eq "on")
     1          (::DOIF_time($hash,2,3,$wday,$hms)) and (::InternalDoIf($hash,'myTemperatur','STATE') eq "on")
     2          (::DOIF_time($hash,4,5,$wday,$hms)) and (::InternalDoIf($hash,'Anwesenheit','STATE') eq "present") and (::InternalDoIf($hash,'myTemperatur','STATE') eq "on")
   days:
   devices:
   do:
     0:
       0          set myDoIfTemp ([MQTT2_ESP32Client:temperatur_W_soll])
     1:
       0          set myDoIfTemp ([MQTT2_ESP32Client:temperatur_W_soll])
     2:
       0          set myDoIfTemp ([MQTT2_ESP32Client:temperatur_W_soll])
     3:
       0          set myDoIfTemp 18.0
   helper:
     NOTIFYDEV  myTemperatur,global,Anwesenheit
     event      present
     globalinit 1
     last_timer 6
     sleeptimer -1
     timerdev   
     timerevent present
     timerevents
     timereventsState
     triggerDev
     DOIF_eventa:
       cmd_nr: 2
       cmd: 2
       cmd_event: TestDoif
       cmd_2
     DOIF_eventas:
       cmd_nr: 2
       cmd: 2
       cmd_event: TestDoif
       state: cmd_2
   internals:
     all         Anwesenheit:STATE myTemperatur:STATE
   interval:
     0          -1
     1          0
     2          -1
     3          2
     4          -1
     5          4
   intervalfunc:
   localtime:
     0          1680492600
     1          1680526800
     2          1680526800
     3          1680462000
     4          1680462000
     5          1680469200
   readings:
   realtime:
     0          05:30:00
     1          15:00:00
     2          15:00:00
     3          21:00:00
     4          21:00:00
     5          23:00:00
   time:
     0          05:30:00
     1          15:00:00
     2          15:00:00
     3          21:00:00
     4          21:00:00
     5          23:00:00
   timeCond:
     0          0
     1          0
     2          1
     3          1
     4          2
     5          2
   timer:
     0          0
     1          0
     2          0
     3          0
     4          0
     5          0
   timers:
     0           0  1
     1           2  3
     2           4  5
   trigger:
   triggertime:
     1680462000:
       localtime  1680462000
       hash:
     1680469200:
       localtime  1680469200
       hash:
     1680492600:
       localtime  1680492600
       hash:
     1680526800:
       localtime  1680526800
       hash:
   uiState:
   uiTable:
Attributes:
   room       Testraum

Listing 2 nach kurzer Zeit durch auslöser eines Events

Internals:
   CFGFN     
   DEF        ## 1
(([05:30-15:00]) and ([Anwesenheit] eq "present") and ([myTemperatur] eq "on"))
   (set myDoIfTemp ([MQTT2_ESP32Client:temperatur_W_soll]))
## 2
DOELSEIF (([15:00-21:00]) and ([myTemperatur] eq "on"))
   (set myDoIfTemp ([MQTT2_ESP32Client:temperatur_W_soll]))
## 3
DOELSEIF (([21:00-23:00]) and ([Anwesenheit] eq "present") and ([myTemperatur] eq "on"))
   (set myDoIfTemp ([MQTT2_ESP32Client:temperatur_W_soll]))
## 4
DOELSE
   (set myDoIfTemp 18.0)

   FUUID      64299a42-f33f-7b43-0102-401d106e1ea461a9
   MODEL      FHEM
   NAME       TestDoif
   NOTIFYDEV  myTemperatur,global,Anwesenheit
   NR         13381
   NTFY_ORDER 50-TestDoif
   STATE      cmd_4
   TYPE       DOIF
   VERSION    27367 2023-03-27 21:37:33
   eventCount 43
   READINGS:
     2023-04-02 17:48:30   Device          Anwesenheit
     2023-04-02 17:47:54   cmd             4
     2023-04-02 17:47:54   cmd_event       Anwesenheit
     2023-04-02 17:47:54   cmd_nr          4
     2023-04-02 17:48:30   e_Anwesenheit_STATE present
     2023-04-02 17:44:11   mode            enabled
     2023-04-02 17:47:54   state           cmd_4
     2023-04-02 17:44:12   timer_01_c01    03.04.2023 05:30:00
     2023-04-02 17:44:12   timer_02_c01    03.04.2023 15:00:00
     2023-04-02 17:44:12   timer_03_c02    03.04.2023 15:00:00
     2023-04-02 17:44:12   timer_04_c02    02.04.2023 21:00:00
     2023-04-02 17:44:12   timer_05_c03    02.04.2023 21:00:00
     2023-04-02 17:44:12   timer_06_c03    02.04.2023 23:00:00
   Regex:
     accu:
     bar:
     barAvg:
     collect:
     cond:
       Anwesenheit:
         0:
           &STATE     ^Anwesenheit$
         1:
         2:
           &STATE     ^Anwesenheit$
       myTemperatur:
         0:
           &STATE     ^myTemperatur$
         1:
           &STATE     ^myTemperatur$
         2:
           &STATE     ^myTemperatur$
   attr:
     cmdState:
     wait:
     waitdel:
   condition:
     0          (::DOIF_time($hash,0,1,$wday,$hms)) and (::InternalDoIf($hash,'Anwesenheit','STATE') eq "present") and (::InternalDoIf($hash,'myTemperatur','STATE') eq "on")
     1          (::DOIF_time($hash,2,3,$wday,$hms)) and (::InternalDoIf($hash,'myTemperatur','STATE') eq "on")
     2          (::DOIF_time($hash,4,5,$wday,$hms)) and (::InternalDoIf($hash,'Anwesenheit','STATE') eq "present") and (::InternalDoIf($hash,'myTemperatur','STATE') eq "on")
   days:
   devices:
   do:
     0:
       0          set myDoIfTemp ([MQTT2_ESP32Client:temperatur_W_soll])
     1:
       0          set myDoIfTemp ([MQTT2_ESP32Client:temperatur_W_soll])
     2:
       0          set myDoIfTemp ([MQTT2_ESP32Client:temperatur_W_soll])
     3:
       0          set myDoIfTemp 18.0
   helper:
     NOTIFYDEV  myTemperatur,global,Anwesenheit
     event      present
     globalinit 1
     last_timer 6
     sleeptimer -1
     timerdev   Anwesenheit
     timerevent present
     triggerDev Anwesenheit
     timerevents:
       present
     timereventsState:
       state: present
     triggerEvents:
       present
     triggerEventsState:
       state: present
   internals:
     all         Anwesenheit:STATE myTemperatur:STATE
   interval:
     0          -1
     1          0
     2          -1
     3          2
     4          -1
     5          4
   intervalfunc:
   localtime:
     0          1680492600
     1          1680526800
     2          1680526800
     3          1680462000
     4          1680462000
     5          1680469200
   readings:
   realtime:
     0          05:30:00
     1          15:00:00
     2          15:00:00
     3          21:00:00
     4          21:00:00
     5          23:00:00
   time:
     0          05:30:00
     1          15:00:00
     2          15:00:00
     3          21:00:00
     4          21:00:00
     5          23:00:00
   timeCond:
     0          0
     1          0
     2          1
     3          1
     4          2
     5          2
   timer:
     0          0
     1          0
     2          0
     3          0
     4          0
     5          0
   timers:
     0           0  1
     1           2  3
     2           4  5
   trigger:
   triggertime:
     1680462000:
       localtime  1680462000
       hash:
     1680469200:
       localtime  1680469200
       hash:
     1680492600:
       localtime  1680492600
       hash:
     1680526800:
       localtime  1680526800
       hash:
   uiState:
   uiTable:
Attributes:
   room       Testraum

Leider kiann ich aus den Listings keinen Unterschied erkennen, warum das eine mal cmd_2 erscheint und das nächste mal cmd_4.

Ich habe auch verschiedene andere Möglichkeiten schon getestet, die aber leider zu keinem Brauchbaren ergebnis führen.

Deshalb bin ich auf die Hilfe des Forums jetzt angewiesen und freue mich über jede Unterstützung.

Beste Grüße
RatisBow

Adimarantis

Brauchst du da nicht ein "do always".
Sonst wird ein Zweig niemals ein zweites mal ausgeführt (bevor nicht ein anderer zutrifft).
Hat mich auch schon öfter verwirrt.
Raspberry 4 + HM-MOD-RPI-PCB (pivCCU) + RfxTrx433XL + 2xRaspberry 1
Module: 50_Signalbot, 52_I2C_ADS1x1x , 58_RPI_1Wire, (50_SPI_MAX31865)

RatisBow

@Adimarantis vielen Dank, das war wohl der Richtige Hinweis.
hier Forum-Beitrag habe ich die Antwort gefunden. Genau wie es dort beschrieben wird, gehe ich bei einer DOIF DOELSEIF .. DOELSE Schleife aus, das jede Bedingung geprüft wird. dies ist aber leider nicht der Fall. Ich habe das Attribut "checkall" auf all gestellt und hoffe, das es dadurch Funktioniert, wie ich es brauche.

RatisBow