[gelöst] Warum wird cmd_4 ausgeführt?

Begonnen von Nobbynews, 26 Oktober 2021, 06:33:06

Vorheriges Thema - Nächstes Thema

Nobbynews

Guten Morgen,

ich habe bei mir zur Rolladensteuerung ein DOIF definiert, indem mehrere Zustände abgebildet werden. Neben einer zufällig gesteuerten Lüftungsstellung (RolladenTuerLueftung) noch eine Teilöffnung (RolladenTuerHalb) und natürlich die komplette Öffnung.
Jetzt ist mir die Tage aufgefallen, dass cmd_4 ausgeführt wurde, obwohl es nach der Logik (mMn) nicht hätte ausgeführt werden sollen. Zur Kontrolle habe ich Log-Einträge hinzugefügt und zuvor ein setreading ZWave_BWM_Garage_Lux RolladenTuerHalb 1 ausgeführt.

Hier das list:
Internals:
   DEF        ([05:00-09:00] and
[ZWave_BWM_Garage_Lux:Helligkeit] >= [?ZWave_BWM_Garage_Lux:Tuer] and
[?ZWave_BWM_Garage_Lux:RolladenTuer] == 0)
(set IRBlaster _send Taste2,
set IRBlaster _send rauf1,
setreading ZWave_BWM_Garage_Lux RolladenTuer 1,
{fhem ("setreading ZWave_BWM_Garage HelligkeitStart5 ".sprintf("%.2F",($hour-4)*60+$min+$sec/60))},
set pushHandyNorbert message Rolladen Tuer hochgefahren)
DOELSEIF
([05:00-09:00] and
[ZWave_BWM_Garage_Lux:Helligkeit] >= [?ZWave_BWM_Garage_Lux:TuerHalb] and
[?ZWave_BWM_Garage_Lux:RolladenTuerHalb] == 0 and
[?ZWave_BWM_Garage_Lux:RolladenTuerLueftung] == 1)
(setreading ZWave_BWM_Garage_Lux RolladenTuerHalb 1,
  set IRBlaster _send Taste2,
  set IRBlaster _send rauf1)
(set IRBlaster _send Taste2,
  set IRBlaster _send Stop1)
DOELSEIF
([05:00-09:00] and
[ZWave_BWM_Garage_Lux:Helligkeit] >= [?ZWave_BWM_Garage_Lux:TuerHalb] and
[?ZWave_BWM_Garage_Lux:RolladenTuerHalb] == 0 and
[?ZWave_BWM_Garage_Lux:RolladenTuerLueftung] == 0)
(setreading ZWave_BWM_Garage_Lux RolladenTuerHalb 1,
  set IRBlaster _send Taste2,
  set IRBlaster _send rauf1)
(set IRBlaster _send Taste2,
  set IRBlaster _send Stop1)
DOELSEIF
([([05:05] + int(rand(900)))|8] or [([06:05] + int(rand(900)))|7]  and
[?ZWave_BWM_Garage_Lux:RolladenTuerHalb] == 0 and
[?ZWave_BWM_Garage_Lux:RolladenTuerLueftung] == 0)
({Log 1,"diRolladenTuer cmd 4"},
  {Log 1,"RolladenTuerHalb: ".ReadingsNum("ZWave_BWM_Garage_Lux","RolladenTuerHalb",0)},
  {Log 1,"RolladenTuerLueftung: ".ReadingsNum("ZWave_BWM_Garage_Lux","RolladenTuerLueftung",0)},
  setreading ZWave_BWM_Garage_Lux RolladenTuerLueftung 1,
  set IRBlaster _send Taste2, set IRBlaster _send rauf1)
(set IRBlaster _send Taste2, set IRBlaster _send Stop1)
DOELSE
({Log 1, "Nichts zu tun!!"})
   FUUID      60d81506-f33f-8873-cacb-9377cbe590bda777
   FVERSION   98_DOIF.pm:0.249050/2021-09-01
   MODEL      FHEM
   NAME       di_Rolladen_Tuer
   NOTIFYDEV  global,ZWave_BWM_Garage_Lux
   NR         631
   NTFY_ORDER 50-di_Rolladen_Tuer
   STATE      cmd_4<br/>
Lüftung: 05:18:45
   TYPE       DOIF
   VERSION    24905 2021-09-01 18:35:54
   OLDREADINGS:
   READINGS:
     2021-10-25 18:52:52   Device          ZWave_BWM_Garage_Lux
     2021-10-26 03:10:00   Lueftung        05:18:45
     2021-10-26 05:18:59   cmd             4.2
     2021-10-26 05:18:59   cmd_event       timer_7
     2021-10-26 05:18:59   cmd_nr          4
     2021-10-26 05:18:59   cmd_seqnr       2
     2021-10-25 18:52:52   e_ZWave_BWM_Garage_Lux_Helligkeit 2
     2021-10-25 12:53:28   mode            enabled
     2021-10-26 05:18:59   state           cmd_4
     2021-10-25 12:53:28   timer_01_c01    26.10.2021 05:00:00
     2021-10-25 12:53:28   timer_02_c01    26.10.2021 09:00:00
     2021-10-25 12:53:28   timer_03_c02    26.10.2021 05:00:00
     2021-10-25 12:53:28   timer_04_c02    26.10.2021 09:00:00
     2021-10-25 12:53:28   timer_05_c03    26.10.2021 05:00:00
     2021-10-25 12:53:28   timer_06_c03    26.10.2021 09:00:00
     2021-10-26 05:18:45   timer_07_c04    27.10.2021 05:09:15|8
     2021-10-25 12:53:28   timer_08_c04    26.10.2021 06:11:27|7
     2021-10-26 05:18:59   wait_timer      no timer
   Regex:
     accu:
     collect:
     cond:
       ZWave_BWM_Garage_Lux:
         0:
           Helligkeit ^ZWave_BWM_Garage_Lux$:^Helligkeit:
         1:
           Helligkeit ^ZWave_BWM_Garage_Lux$:^Helligkeit:
         2:
           Helligkeit ^ZWave_BWM_Garage_Lux$:^Helligkeit:
         3:
   attr:
     cmdState:
     wait:
       0:
         0
       1:
         0
         5
       2:
         0
         14
       3:
         0
         14
       4:
         0
     waitdel:
   condition:
     0          ::DOIF_time($hash,0,1,$wday,$hms) and   ::ReadingValDoIf($hash,'ZWave_BWM_Garage_Lux','Helligkeit') >= ::ReadingValDoIf($hash,'ZWave_BWM_Garage_Lux','Tuer') and   ::ReadingValDoIf($hash,'ZWave_BWM_Garage_Lux','RolladenTuer') == 0
     1          ::DOIF_time($hash,2,3,$wday,$hms) and   ::ReadingValDoIf($hash,'ZWave_BWM_Garage_Lux','Helligkeit') >= ::ReadingValDoIf($hash,'ZWave_BWM_Garage_Lux','TuerHalb') and   ::ReadingValDoIf($hash,'ZWave_BWM_Garage_Lux','RolladenTuerHalb') == 0 and  ::ReadingValDoIf($hash,'ZWave_BWM_Garage_Lux','RolladenTuerLueftung') == 1
     2          ::DOIF_time($hash,4,5,$wday,$hms) and   ::ReadingValDoIf($hash,'ZWave_BWM_Garage_Lux','Helligkeit') >= ::ReadingValDoIf($hash,'ZWave_BWM_Garage_Lux','TuerHalb') and   ::ReadingValDoIf($hash,'ZWave_BWM_Garage_Lux','RolladenTuerHalb') == 0 and  ::ReadingValDoIf($hash,'ZWave_BWM_Garage_Lux','RolladenTuerLueftung') == 0
     3          ::DOIF_time_once($hash,6,$wday,"8") or ::DOIF_time_once($hash,7,$wday,"7")  and  ::ReadingValDoIf($hash,'ZWave_BWM_Garage_Lux','RolladenTuerHalb') == 0 and  ::ReadingValDoIf($hash,'ZWave_BWM_Garage_Lux','RolladenTuerLueftung') == 0
   days:
     6          8
     7          7
   do:
     0:
       0          set IRBlaster _send Taste2,  set IRBlaster _send rauf1,  setreading ZWave_BWM_Garage_Lux RolladenTuer 1,  {fhem ("setreading ZWave_BWM_Garage HelligkeitStart5 ".sprintf("%.2F",($hour-4)*60+$min+$sec/60))},  set pushHandyNorbert message Rolladen Tuer hochgefahren
     1:
       0          setreading ZWave_BWM_Garage_Lux RolladenTuerHalb 1,   set IRBlaster _send Taste2,   set IRBlaster _send rauf1
       1          set IRBlaster _send Taste2,   set IRBlaster _send Stop1
     2:
       0          setreading ZWave_BWM_Garage_Lux RolladenTuerHalb 1,   set IRBlaster _send Taste2,   set IRBlaster _send rauf1
       1          set IRBlaster _send Taste2,   set IRBlaster _send Stop1
     3:
       0          {Log 1,"diRolladenTuer cmd 4"},   {Log 1,"RolladenTuerHalb: ".ReadingsNum("ZWave_BWM_Garage_Lux","RolladenTuerHalb",0)},   {Log 1,"RolladenTuerLueftung: ".ReadingsNum("ZWave_BWM_Garage_Lux","RolladenTuerLueftung",0)},   setreading ZWave_BWM_Garage_Lux RolladenTuerLueftung 1,   set IRBlaster _send Taste2, set IRBlaster _send rauf1
       1          set IRBlaster _send Taste2, set IRBlaster _send Stop1
     4:
       0          {Log 1, "Nichts zu tun!!"}
   helper:
     DEVFILTER  ^global$|^ZWave_BWM_Garage_Lux$
     NOTIFYDEV  global|ZWave_BWM_Garage_Lux
     event      timer_7
     globalinit 1
     last_timer 8
     sleepdevice timer_7
     sleepsubtimer -1
     sleeptimer -1
     timerdev   
     timerevent timer_7
     triggerDev
     timerevents:
       timer_7
     timereventsState:
       timer_7
     triggerEvents:
       timer_7
     triggerEventsState:
       timer_7
   internals:
   interval:
     0          -1
     1          0
     2          -1
     3          2
     4          -1
     5          4
   intervalfunc:
   intervaltimer:
   localtime:
     0          1635217200
     1          1635231600
     2          1635217200
     3          1635231600
     4          1635217200
     5          1635231600
     6          1635304155
     7          1635221487
   readings:
     all         ZWave_BWM_Garage_Lux:Helligkeit
   realtime:
     0          05:00:00
     1          09:00:00
     2          05:00:00
     3          09:00:00
     4          05:00:00
     5          09:00:00
     6          05:09:15
     7          06:11:27
   time:
     0          05:00:00
     1          09:00:00
     2          05:00:00
     3          09:00:00
     4          05:00:00
     5          09:00:00
     6          ([05:05]+int(rand(900)))
     7          ([06:05]+int(rand(900)))
   timeCond:
     0          0
     1          0
     2          1
     3          1
     4          2
     5          2
     6          3
     7          3
   timer:
     0          0
     1          0
     2          0
     3          0
     4          0
     5          0
     6          0
     7          0
   timers:
     0           0  1
     1           2  3
     2           4  5
     3           6  7
   trigger:
   triggertime:
     1635221487:
       localtime  1635221487
       hash:
     1635231600:
       localtime  1635231600
       hash:
     1635304155:
       localtime  1635304155
       hash:
   uiState:
   uiTable:
Attributes:
   room       08_Rolladen
   stateFormat {ReadingsVal($name,"state",0)."<br/>
Lüftung: ".ReadingsVal($name,"Lueftung",0)}
   wait       0:0,5:0,14:0,14:0


Heute Morgen zur Ausführungszeit um 05:18:45 (siehe Reading Lueftung) wurden folgende Log-Einträge generiert:
2021.10.26 05:18:45 1: diRolladenTuer cmd 4
2021.10.26 05:18:45 1: RolladenTuerHalb: 1
2021.10.26 05:18:45 1: RolladenTuerLueftung: 0

Im DOIF wird das Reading abgefragt über:
and [?ZWave_BWM_Garage_Lux:RolladenTuerHalb] == 0

Ich habe anscheinend Tomaten auf den Augen und sehe erst einmal keinen Fehler in der Logik.
Wieso wird trotz RolladenTuerHalb = 1 hier cmd_4 ausgeführt?

Norbert

Edit:
spontane Idee:
Könnte ein
Zitatand [?ZWave_BWM_Garage_Lux:RolladenTuerHalb:d] == 0
das Problem beseitigen?
Muss ich mal ausprobieren.

Damian

Zitat([([05:05] + int(rand(900)))|8] or [([06:05] + int(rand(900)))|7]  and
[?ZWave_BWM_Garage_Lux:RolladenTuerHalb] == 0 and
[?ZWave_BWM_Garage_Lux:RolladenTuerLueftung] == 0)

or hat eine niedrigere Priorität als and, daher wird getriggert, wenn entweder [([05:05] + int(rand(900)))|8] wahr wird oder der Rest. Du willst aber vermutlich

([([05:05] + int(rand(900)))|8] or [([06:05] + int(rand(900)))|7]) and ...
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

Nobbynews

#2
Zitat von: Damian am 26 Oktober 2021, 09:46:48
or hat eine niedrigere Priorität als and, daher wird getriggert, wenn entweder [([05:05] + int(rand(900)))|8] wahr wird oder der Rest. Du willst aber vermutlich

([([05:05] + int(rand(900)))|8] or [([06:05] + int(rand(900)))|7]) and ...
So war das jedenfalls gedacht.
Dann müsste doch eigentlich ein Ändern von "or" zu "||" auch zum Erfolg führen, da "and" dann eine niedrigere Prirität hätte? Jedenfalls wenn ich die Beispiele b) und c) von hier https://wiki.fhem.de/wiki/DOIF/Operatorenrangfolge richtig verstanden habe.
Durch das Klammern werden die einzelnen Teile der logischen Verknüfpung auf die gleiche Priorität gebracht?

Norbert

Damian

Zitat von: Nobbynews am 26 Oktober 2021, 10:15:02
So war das jedenfalls gedacht.
Dann müsste doch eigentlich ein Ändern von "or" zu "||" auch zum Erfolg führen, da "and" dann eine niedrigere Prirität hätte?
Durch das Klammern werden die einzelnen Teile der logischen Verknüfpung auf die gleiche Priorität gebracht.

Norbert

Ich würde || mit and nicht mischen. Entweder  || und  && verwenden oder or und and. UND ist immer höher priorisiert als ODER, das lernen bereits die Grundschüler bei mal-Rechnen (entspricht und) und plus-Rechnen (entspricht oder).

Es gibt deswegen ja in der Mathematik bzw. der Informatik Klammern, die Priorität der Auswertung beeinflussen.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

Nobbynews

Zitat von: Damian am 26 Oktober 2021, 10:26:12
UND ist immer höher priorisiert als ODER, das lernen bereits die Grundschüler bei mal-Rechnen (entspricht und) und plus-Rechnen (entspricht oder).
Das ist schon klar.
Mein Gedankenfehler war halt, dass durch meinen Konstrukt quasi die logische Verknüpfung  "A oder (B und C und D)" durch die Prioritäten erzeugt wurde.
Danke für die Unterstützung.

Norbert

Damian

#5
Zitat von: Nobbynews am 26 Oktober 2021, 10:33:32
Das ist schon klar.
Mein Gedankenfehler war halt, dass durch meinen Konstrukt quasi die logische Verknüpfung  "A oder (B und C und D)" durch die Prioritäten erzeugt wurde.
Danke für die Unterstützung.

Norbert

Das ist richtig. Da bei Perl || und or bzw. && und and, warum auch immer, definiert wurde, kann man ODER vor UND stellen und das würde die mathematische Welt der logischen Operationen auf den Kopf stellen :o
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF