FHEM Forum

FHEM => Anfängerfragen => Thema gestartet von: gestein am 16 Juni 2019, 22:34:22

Titel: DOIF: Abarbeitung der Zweige, wenn Condition immer wieder erfüllt
Beitrag von: gestein am 16 Juni 2019, 22:34:22
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
Titel: Antw:DOIF: Abarbeitung der Zweige, wenn Condition immer wieder erfüllt
Beitrag von: Ellert am 16 Juni 2019, 22:45:28
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.
Titel: Antw:DOIF: Abarbeitung der Zweige, wenn Condition immer wieder erfüllt
Beitrag von: Damian am 18 Juni 2019, 20:32:39
DOIF ([myTwilight:azimuth] > 220)...

Wenn es nicht so funktioniert, wie du möchtest, bitte list vom DOIF posten
Titel: Antw:DOIF: Abarbeitung der Zweige, wenn Condition immer wieder erfüllt
Beitrag von: gestein am 22 Juni 2019, 21:58:47
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
Titel: Antw:DOIF: Abarbeitung der Zweige, wenn Condition immer wieder erfüllt
Beitrag von: Ellert am 22 Juni 2019, 23:24:50
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.
Titel: Antw:DOIF: Abarbeitung der Zweige, wenn Condition immer wieder erfüllt
Beitrag von: gestein am 23 Juni 2019, 00:28:48
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
Titel: Antw:DOIF: Abarbeitung der Zweige, wenn Condition immer wieder erfüllt
Beitrag von: Ellert am 23 Juni 2019, 09:31:22
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.