Hallo,
ich habe mir ein etwas kompliziertes DOIF gebastelt um meine Rollos zu steuern.
Das DOIF sieht vereinfacht so aus:
defmod WZ.RolloStiegeLinks_azi_rollo DOIF ([myTwilight:azimuth] gt "220") (
set WZ.RolloStiegeLinks my,
{Log 1, "WZ.RolloStiegeLinks runter"}
)
DOELSE (
{Log 1, "WZ.RolloStiegeLinks nix zu tun"}
)
attr WZ.RolloStiegeLinks_azi_rollo room Rollos
[myTwilight:azimuth] ändert sich natürlich laufend.
Eigentlich dachte ich, dass DOIF den Befehl nur einmal ausführt, wenn die Condition gleich ist (nämlich z.B. > 220).
Allerdings wird nun das "set WZ.RolloStiegeLinks my" immer wieder ausgeführt, wenn sich [myTwilight:azimuth] ändert und > 220 ist.
Wie kann man DOIF beibringen, den Zweig nur einmal abzuarbeiten, auch wenn sich [myTwilight:azimuth] ändert?
Danke im Voraus
lg, Gerhard
Statt DOELSE nimm DOELSEIF mit einer Bedingung, die entweder eine Hysteresis realisiert, z.B. bei Azimut < (220+<Hysterese>) oder einmal am Tag, z.B. um [00:00] in den 2. Zweig wechselt.
Du könntest DOELSE weglassen.
Und Du hast recht, DOIF sollte nur einmal schalten, weil der Azimut zum Tagesende ansteigt. Das DOIF sollte nur erneut schalten, wenn Azimut 220 oder kleiner wird, es sei denn, Du verwendest do always.
DOIF ([myTwilight:azimuth] > 220)...
Wenn es nicht so funktioniert, wie du möchtest, bitte list vom DOIF posten
Hallo,
hier das list des devices:
defmod WZ.RolloStiegeLinks_azi_rollo DOIF ([myTwilight:azimuth] gt "220" and [OZW772:Aussentemperatur] gt "25" and [13:00-{sunset(-3600,"17:00","20:00")}] and (([Zuhause] eq "abwesend") or ([Zuhause] eq "verreist"))) (\
set WZ.RolloStiegeLinks runter,\
{Log 1, "WZ.RolloStiegeLinks runter weil alle weg und T>25, azi:[myTwilight:azimuth], Temp:[OZW772:Aussentemperatur], Zuhause:[Zuhause:state]"}\
)\
DOELSEIF ([myTwilight:azimuth] gt "220" and [OZW772:Aussentemperatur] gt "25" and [13:00-{sunset(-3600,"17:00","20:00")}] and (([Zuhause] ne "abwesend") and ([Zuhause] ne "verreist"))) (\
set WZ.RolloStiegeLinks my,\
{Log 1, "WZ.RolloStiegeLinks my weil jemand da und T>25, azi:[myTwilight:azimuth], Temp:[OZW772:Aussentemperatur], Zuhause:[Zuhause:state]"}\
)\
DOELSEIF ([myTwilight:azimuth] gt "220" and [OZW772:Aussentemperatur] gt "19" and [13:00-{sunset(-3600,"17:00","20:00")}]) (\
set WZ.RolloStiegeLinks my,\
{Log 1, "WZ.RolloStiegeLinks my weil T>19, azi:[myTwilight:azimuth], Temp:[OZW772:Aussentemperatur], Zuhause:[Zuhause:state]"}\
)\
DOELSEIF ([23:00-{sunrise(1800,"04:00","05:30")}] and [OZW772:Aussentemperatur] lt "10" and (([Zuhause] eq "abwesend") or ([Zuhause] eq "verreist"))) (\
set WZ.RolloStiegeLinks runter,\
{Log 1, "WZ.RolloStiegeLinks runter weil alle weg und T<10, azi:[myTwilight:azimuth], Temp:[OZW772:Aussentemperatur], Zuhause:[Zuhause:state]"}\
)\
DOELSEIF ([23:00-{sunrise(1800,"04:00","05:30")}] and [OZW772:Aussentemperatur] lt "10" and (([Zuhause] ne "abwesend") and ([Zuhause] ne "verreist"))) (\
set WZ.RolloStiegeLinks my,\
{Log 1, "WZ.RolloStiegeLinks my weil jemand da aber T<10, azi:[myTwilight:azimuth], Temp:[OZW772:Aussentemperatur], Zuhause:[Zuhause:state]"}\
)\
DOELSE (\
{Log 1, "WZ.RolloStiegeLinks nix zu tun, azi:[myTwilight:azimuth], Temp:[OZW772:Aussentemperatur], Zuhause:[Zuhause:state]"}\
)
Immer wenn sich azimuth ändert, wird der jeweilige Zweig wieder ausgeführt.
Beim rechten Rollo habe ich weiters das Attribut "repeatsame" probiert:
repeatsame 1:1:1:1:1
Ändert aber nicht. Wird trotzdem immer wieder ausgeführt.
Was mache ich falsch?
lg, Gerhard
Ein Listing sieht anders aus, es ist das Ergebnis des Befehls list (https://commandref.fhem.de/commandref_DE.html#list), wenn er in der Befehlszeile ausgeführt wird.
Bitte entschuldige. Zu kurz gedacht.
Ich habe zum Testen auch noch log- und pushmsg-Zeilen drinnen.
Internals:
DEF ([myTwilight:azimuth] gt "220" and [OZW772:Aussentemperatur] gt "25" and [13:00-{sunset(-3600,"17:00","20:00")}] and (([Zuhause] eq "abwesend") or ([Zuhause] eq "verreist"))) (
set WZ.RolloStiegeLinks runter,
set pushmsg msg 'fhem' "[1] Der Rollo im Wohnzimmer Links ist ganz zu, azi:[myTwilight:azimuth], Temp:[OZW772:Aussentemperatur], Zuhause:[Zuhause:state]",
{Log 1, "WZ.RolloStiegeLinks runter weil alle weg und T>25, azi:[myTwilight:azimuth], Temp:[OZW772:Aussentemperatur], Zuhause:[Zuhause:state]"}
)
DOELSEIF ([myTwilight:azimuth] gt "220" and [OZW772:Aussentemperatur] gt "25" and [13:00-{sunset(-3600,"17:00","20:00")}] and (([Zuhause] ne "abwesend") and ([Zuhause] ne "verreist"))) (
set WZ.RolloStiegeLinks my,
set pushmsg msg 'fhem' "[2] Der Rollo im Wohnzimmer Links ist auf my, azi:[myTwilight:azimuth], Temp:[OZW772:Aussentemperatur], Zuhause:[Zuhause:state]",
{Log 1, "WZ.RolloStiegeLinks my weil jemand da und T>25, azi:[myTwilight:azimuth], Temp:[OZW772:Aussentemperatur], Zuhause:[Zuhause:state]"}
)
DOELSEIF ([myTwilight:azimuth] gt "220" and [OZW772:Aussentemperatur] gt "19" and [13:00-{sunset(-3600,"17:00","20:00")}]) (
set WZ.RolloStiegeLinks my,
set pushmsg msg 'fhem' "[3] Der Rollo im Wohnzimmer Links ist auf my, azi:[myTwilight:azimuth], Temp:[OZW772:Aussentemperatur], Zuhause:[Zuhause:state]",
{Log 1, "WZ.RolloStiegeLinks my weil T>19, azi:[myTwilight:azimuth], Temp:[OZW772:Aussentemperatur], Zuhause:[Zuhause:state]"}
)
DOELSEIF ([23:00-{sunrise(1800,"04:00","05:30")}] and [OZW772:Aussentemperatur] lt "10" and (([Zuhause] eq "abwesend") or ([Zuhause] eq "verreist"))) (
set WZ.RolloStiegeLinks runter,
set pushmsg msg 'fhem' "[4] Der Rollo im Wohnzimmer Links ist auf my, azi:[myTwilight:azimuth], Temp:[OZW772:Aussentemperatur], Zuhause:[Zuhause:state]",
{Log 1, "WZ.RolloStiegeLinks runter weil alle weg und T<10, azi:[myTwilight:azimuth], Temp:[OZW772:Aussentemperatur], Zuhause:[Zuhause:state]"}
)
DOELSEIF ([23:00-{sunrise(1800,"04:00","05:30")}] and [OZW772:Aussentemperatur] lt "10" and (([Zuhause] ne "abwesend") and ([Zuhause] ne "verreist"))) (
set WZ.RolloStiegeLinks my,
set pushmsg msg 'fhem' "[5] Der Rollo im Wohnzimmer Links ist auf my, azi:[myTwilight:azimuth], Temp:[OZW772:Aussentemperatur], Zuhause:[Zuhause:state]",
{Log 1, "WZ.RolloStiegeLinks my weil jemand da aber T<10, azi:[myTwilight:azimuth], Temp:[OZW772:Aussentemperatur], Zuhause:[Zuhause:state]"}
)
DOELSE (
{Log 1, "WZ.RolloStiegeLinks nix zu tun, azi:[myTwilight:azimuth], Temp:[OZW772:Aussentemperatur], Zuhause:[Zuhause:state]"}
)
FUUID 5c43b92d-f33f-0b7a-5805-d61302d5475c5237
MODEL FHEM
NAME WZ.RolloStiegeLinks_azi_rollo
NR 956
NTFY_ORDER 50-WZ.RolloStiegeLinks_azi_rollo
STATE cmd_3
TYPE DOIF
VERSION 19303 2019-05-01 08:47:16
READINGS:
2019-06-22 19:35:41 Device myTwilight
2019-06-22 19:35:42 cmd 3
2019-06-22 19:35:42 cmd_event myTwilight
2019-06-22 19:35:42 cmd_nr 3
2019-06-22 19:33:58 e_OZW772_Aussentemperatur 23.9
2019-06-22 19:35:34 e_Zuhause_STATE zuhause
2019-06-22 19:35:41 e_myTwilight_azimuth 292.57
2019-06-23 00:24:00 mode enabled
2019-06-23 00:24:00 state cmd_3
2019-06-23 00:10:00 timer_01_c01 23.06.2019 13:00:00
2019-06-23 00:10:00 timer_02_c01 23.06.2019 20:00:00
2019-06-23 00:10:00 timer_03_c02 23.06.2019 13:00:00
2019-06-23 00:10:00 timer_04_c02 23.06.2019 20:00:00
2019-06-23 00:10:00 timer_05_c03 23.06.2019 13:00:00
2019-06-23 00:10:00 timer_06_c03 23.06.2019 20:00:00
2019-06-23 00:10:00 timer_07_c04 23.06.2019 23:00:00
2019-06-23 00:10:00 timer_08_c04 23.06.2019 04:42:29
2019-06-23 00:10:00 timer_09_c05 23.06.2019 23:00:00
2019-06-23 00:10:00 timer_10_c05 23.06.2019 04:42:29
Regex:
accu:
condition:
0 ::ReadingValDoIf($hash,'myTwilight','azimuth') gt "220" and ::ReadingValDoIf($hash,'OZW772','Aussentemperatur') gt "25" and ::DOIF_time($hash,0,1,$wday,$hms) and ((::InternalDoIf($hash,'Zuhause','STATE') eq "abwesend") or (::InternalDoIf($hash,'Zuhause','STATE') eq "verreist"))
1 ::ReadingValDoIf($hash,'myTwilight','azimuth') gt "220" and ::ReadingValDoIf($hash,'OZW772','Aussentemperatur') gt "25" and ::DOIF_time($hash,2,3,$wday,$hms) and ((::InternalDoIf($hash,'Zuhause','STATE') ne "abwesend") and (::InternalDoIf($hash,'Zuhause','STATE') ne "verreist"))
2 ::ReadingValDoIf($hash,'myTwilight','azimuth') gt "220" and ::ReadingValDoIf($hash,'OZW772','Aussentemperatur') gt "19" and ::DOIF_time($hash,4,5,$wday,$hms)
3 ::DOIF_time($hash,6,7,$wday,$hms) and ::ReadingValDoIf($hash,'OZW772','Aussentemperatur') lt "10" and ((::InternalDoIf($hash,'Zuhause','STATE') eq "abwesend") or (::InternalDoIf($hash,'Zuhause','STATE') eq "verreist"))
4 ::DOIF_time($hash,8,9,$wday,$hms) and ::ReadingValDoIf($hash,'OZW772','Aussentemperatur') lt "10" and ((::InternalDoIf($hash,'Zuhause','STATE') ne "abwesend") and (::InternalDoIf($hash,'Zuhause','STATE') ne "verreist"))
days:
devices:
0 myTwilight OZW772 Zuhause
1 myTwilight OZW772 Zuhause
2 myTwilight OZW772
3 OZW772 Zuhause
4 OZW772 Zuhause
all myTwilight OZW772 Zuhause
do:
0:
0 set WZ.RolloStiegeLinks runter, set pushmsg msg 'fhem' "[1] Der Rollo im Wohnzimmer Links ist ganz zu, azi:[myTwilight:azimuth], Temp:[OZW772:Aussentemperatur], Zuhause:[Zuhause:state]", {Log 1, "WZ.RolloStiegeLinks runter weil alle weg und T>25, azi:[myTwilight:azimuth], Temp:[OZW772:Aussentemperatur], Zuhause:[Zuhause:state]"}
1:
0 set WZ.RolloStiegeLinks my, set pushmsg msg 'fhem' "[2] Der Rollo im Wohnzimmer Links ist auf my, azi:[myTwilight:azimuth], Temp:[OZW772:Aussentemperatur], Zuhause:[Zuhause:state]", {Log 1, "WZ.RolloStiegeLinks my weil jemand da und T>25, azi:[myTwilight:azimuth], Temp:[OZW772:Aussentemperatur], Zuhause:[Zuhause:state]"}
2:
0 set WZ.RolloStiegeLinks my, set pushmsg msg 'fhem' "[3] Der Rollo im Wohnzimmer Links ist auf my, azi:[myTwilight:azimuth], Temp:[OZW772:Aussentemperatur], Zuhause:[Zuhause:state]", {Log 1, "WZ.RolloStiegeLinks my weil T>19, azi:[myTwilight:azimuth], Temp:[OZW772:Aussentemperatur], Zuhause:[Zuhause:state]"}
3:
0 set WZ.RolloStiegeLinks runter, set pushmsg msg 'fhem' "[4] Der Rollo im Wohnzimmer Links ist auf my, azi:[myTwilight:azimuth], Temp:[OZW772:Aussentemperatur], Zuhause:[Zuhause:state]", {Log 1, "WZ.RolloStiegeLinks runter weil alle weg und T<10, azi:[myTwilight:azimuth], Temp:[OZW772:Aussentemperatur], Zuhause:[Zuhause:state]"}
4:
0 set WZ.RolloStiegeLinks my, set pushmsg msg 'fhem' "[5] Der Rollo im Wohnzimmer Links ist auf my, azi:[myTwilight:azimuth], Temp:[OZW772:Aussentemperatur], Zuhause:[Zuhause:state]", {Log 1, "WZ.RolloStiegeLinks my weil jemand da aber T<10, azi:[myTwilight:azimuth], Temp:[OZW772:Aussentemperatur], Zuhause:[Zuhause:state]"}
5:
0 {Log 1, "WZ.RolloStiegeLinks nix zu tun, azi:[myTwilight:azimuth], Temp:[OZW772:Aussentemperatur], Zuhause:[Zuhause:state]"}
helper:
globalinit 1
last_timer 10
sleeptimer -1
internals:
0 Zuhause:STATE
1 Zuhause:STATE
3 Zuhause:STATE
4 Zuhause:STATE
all Zuhause:STATE
interval:
0 -1
1 0
2 -1
3 2
4 -1
5 4
6 -1
7 6
8 -1
9 8
intervalfunc:
itimer:
localtime:
0 1561287600
1 1561312800
2 1561287600
3 1561312800
4 1561287600
5 1561312800
6 1561323600
7 1561257749
8 1561323600
9 1561257749
perlblock:
readings:
0 myTwilight:azimuth OZW772:Aussentemperatur
1 myTwilight:azimuth OZW772:Aussentemperatur
2 myTwilight:azimuth OZW772:Aussentemperatur
3 OZW772:Aussentemperatur
4 OZW772:Aussentemperatur
all myTwilight:azimuth OZW772:Aussentemperatur
realtime:
0 13:00:00
1 20:00:00
2 13:00:00
3 20:00:00
4 13:00:00
5 20:00:00
6 23:00:00
7 04:42:29
8 23:00:00
9 04:42:29
time:
0 13:00:00
1 {sunset(-3600,"17:00","20:00")}
2 13:00:00
3 {sunset(-3600,"17:00","20:00")}
4 13:00:00
5 {sunset(-3600,"17:00","20:00")}
6 23:00:00
7 {sunrise(1800,"04:00","05:30")}
8 23:00:00
9 {sunrise(1800,"04:00","05:30")}
timeCond:
0 0
1 0
2 1
3 1
4 2
5 2
6 3
7 3
8 4
9 4
timer:
0 0
1 0
2 0
3 0
4 0
5 0
6 0
7 0
8 0
9 0
timers:
0 0 1
1 2 3
2 4 5
3 6 7
4 8 9
triggertime:
1561257749:
localtime 1561257749
hash:
1561287600:
localtime 1561287600
hash:
1561312800:
localtime 1561312800
hash:
1561323600:
localtime 1561323600
hash:
uiState:
uiTable:
Attributes:
room Rollos,Wohnzimmer,Zeitschaltuhr
Warum werden die einzelnen Zweige immer wieder aufgerufen?
Was mache ich falsch?
Danke für jede Hilfe.
lg, Gerhard
Wenn Du schon Logeinträge hast, dann poste die auch.
Am besten postest die Logeinträge in quote Tags, dann kannst Du die Stellen im Log markieren, die Deiner Meinung nach den Fehler kennzeichnen.
Da das Fehlverhalten auch bei dem vereinfachten DOIF aus den ersten Post auftritt, wäre es natüchlich leichter den Fehler zu finden, wenn Du das Listing und die Logeinträge für dieses DOIF posten würdest.
Edit
Ich habe bei der vereinfachten Version das von Dir beschriebene Verhalten nicht beobachten können.
Bei einem Vergleichswert von 220 und einer Aktualisierung des Azimut alle 300 s, wird nur ein Logeintrag erzeugt.
Wenn ich den Vergleichswert auf 100 ändere, wird auch nur ein Logeintrag erzeugt.
Zitat
2019.06.23 09:42:31.783 1: WZ.RolloStiegeLinks nix zu tun
Um 9.47 Uhr hätte nach Deiner Beschreibung hier ein Eintrag erfolgen müssen.
9.50 Uhr, Änderung des Vergleichswetes von 220 auf 100
2019.06.23 09:52:32.292 2: WZ.RolloStiegeLinks_azi_rollo: set WZ.RolloStiegeLinks my: Please define WZ.RolloStiegeLinks first
2019.06.23 09:52:32.295 1: WZ.RolloStiegeLinks runter
Um 9.57 Uhr und alle 300 s danach, hätten nach Deiner Beschreibung hier Einträg erfolgen müssen.