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.
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 ...
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 (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
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.
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
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