FHEM Forum

FHEM => Automatisierung => DOIF => Thema gestartet von: Intruder1956 am 09 Juli 2018, 16:04:26

Titel: Ich komme mit dem DOIF nicht weiter
Beitrag von: Intruder1956 am 09 Juli 2018, 16:04:26
Hallo, kann mir noch geholfen werden  ;)
Das folgende DOIF funktioniert soweit, bis auf, dass das Rollo WZ_Rollo_Tuer bei anwesend morgens nicht hoch geht, ansonsten alles ok.
define doRolladen DOIF ([{sunrise(2000,"07:30")}-{sunset(-3200)}|8] or [08:30-{sunset(-3200)}|7]) \
   ((set Bad_Rollo,WZ_RollGross,Schlaf_Rollo,Kueche_Rollo_Strasse,Kueche_Rollo_Balkon up),\
   IF ([WernerS4] eq "present") \
      (set  WZ_Rollo_Tuer up))\
DOELSE ((set Bad_Rollo,WZ_RollGross,Schlaf_Rollo,Kueche_Rollo_Strasse,Kueche_Rollo_Balkon down),\
   IF ([WernerS4] eq "absent") \
      (set  WZ_Rollo_Tuer down))
attr doRolladen eventMap cmd_1:Rolladen_Oben cmd_2:Rolladen_Unten cmd_3:Rolladen_Oben cmd_4:Rolladen_Unten
attr doRolladen room Rolladen


Beim ausführen von DoifTools kommt folgende Meldung
doRolladen der erste Befehl nach DOELSE scheint eine  Bedingung zu sein, weil eq enthalten ist, bitte prüfen.

Da weiß ich nicht und verstehe es auch nicht, was zu ändern ist.
Wenn ich versuche ein neues DOIF zu erstellen mit den gleichen Parametern nur anderen Namen

define doRolladenNEU DOIF ([{sunrise(2000,"07:30")}-{sunset(-3200)}|8] or [08:30-{sunset(-3200)}|7]) \
   ((set Bad_Rollo,WZ_RollGross,Schlaf_Rollo,Kueche_Rollo_Strasse,Kueche_Rollo_Balkon up),\
   IF ([WernerS4] eq "present") \
      (set  WZ_Rollo_Tuer up))\
DOELSE ((set Bad_Rollo,WZ_RollGross,Schlaf_Rollo,Kueche_Rollo_Strasse,Kueche_Rollo_Balkon down),\
   IF ([WernerS4] eq "absent") \
      (set  WZ_Rollo_Tuer down))


Dann kommt folgende Meldung

doRolladenNeu DOIF: expected DOELSEIF or DOELSE: \ ((set Bad_Rollo,WZ_RollGross,Schlaf_Rollo,Kueche_Rollo_Strasse,Kueche_Rollo_Balkon up),\ IF ([WernerS4] eq "present") \ (set WZ_Rollo_Tuer up))\ DOELSE ((set Bad_Rollo,WZ_RollGross,Schlaf_Rollo,Kueche_Rollo_Strasse,Kueche_Rollo_Balkon down),\ IF ([WernerS4] eq "absent") \ (set WZ_Rollo_Tuer down))

Habe leider nicht den Durchblick und weiß nicht was ich da noch machen kann.
Für Hilfe einer Lösung wäre ich sehr dankbar.

Vielen Dank
Werner

PS. der Grund warum ich ein zweites DOIF erstellen möchte ist der, dass ab und zu, die eine oder andere Rollade nicht geschlossen wird.
      Ich möchte das zweite DOIF einfach 2 Minuten später nochmal ausführen lassen.
      So wie ganz oben angegeben läuft das DOIF seit ca. 1,5 Jahre
Titel: Antw:Ich komme mit dem DOIF nicht weiter
Beitrag von: sash.sc am 09 Juli 2018, 16:09:15
Irgendwie stört mich das IF darin. Mach doch ein DOELSE oder DOELSEIF daraus.

Würde es mal versuchen

Gesendet von meinem E6653 mit Tapatalk

Titel: Antw:Ich komme mit dem DOIF nicht weiter
Beitrag von: Intruder1956 am 09 Juli 2018, 16:21:58
leider ohne Erfolg, habe das "IF" geändert in "DOELSEIF" und nur "DOELSE"
auch folgende Meldung
doRolladenNeu DOIF: expected DOELSEIF or DOELSE: \ ((set Bad_Rollo,WZ_RollGross,Schlaf_Rollo,Kueche_Rollo_Strasse,Kueche_Rollo_Balkon up),\ DOELSE ([WernerS4] eq "present") \ (set WZ_Rollo_Tuer up))\ DOELSE ((set Bad_Rollo,WZ_RollGross,Schlaf_Rollo,Kueche_Rollo_Strasse,Kueche_Rollo_Balkon down),\ DOELSE ([WernerS4] eq "absent") \ (set WZ_Rollo_Tuer down))

Gruß Werner
Titel: Antw:Ich komme mit dem DOIF nicht weiter
Beitrag von: sash.sc am 09 Juli 2018, 16:58:20
Setze den Code nach der Änderung mal hier rein.

Gruß Sascha

Gesendet von meinem E6653 mit Tapatalk

Titel: Antw:Ich komme mit dem DOIF nicht weiter
Beitrag von: Intruder1956 am 09 Juli 2018, 17:06:59
Hier mit DOELSE
define doRolladenNeu DOIF ([{sunrise(2000,"07:30")}-{sunset(-3200)}|8] or [08:30-{sunset(-3200)}|7]) \    ((set Bad_Rollo,WZ_RollGross,Schlaf_Rollo,Kueche_Rollo_Strasse,Kueche_Rollo_Balkon up),\    DOELSE ([WernerS4] eq "present") \       (set  WZ_Rollo_Tuer up))\ DOELSE ((set Bad_Rollo,WZ_RollGross,Schlaf_Rollo,Kueche_Rollo_Strasse,Kueche_Rollo_Balkon down),\    DOELSE ([WernerS4] eq "absent") \       (set  WZ_Rollo_Tuer down))

Hier mit DOELSEIF
define doRolladenNeu DOIF ([{sunrise(2000,"07:30")}-{sunset(-3200)}|8] or [08:30-{sunset(-3200)}|7]) \    ((set Bad_Rollo,WZ_RollGross,Schlaf_Rollo,Kueche_Rollo_Strasse,Kueche_Rollo_Balkon up),\    DOELSEIF ([WernerS4] eq "present") \       (set  WZ_Rollo_Tuer up))\ DOELSE ((set Bad_Rollo,WZ_RollGross,Schlaf_Rollo,Kueche_Rollo_Strasse,Kueche_Rollo_Balkon down),\    DOELSEIF ([WernerS4] eq "absent") \       (set  WZ_Rollo_Tuer down))

und hier ein List vom ursprünglichem DOIF
Internals:
   .eventMapCmd Rolladen_Oben:noArg Rolladen_Unten:noArg Rolladen_Oben:noArg Rolladen_Unten:noArg
   CFGFN      /opt/fhem/FHEM/Rolladen.cfg
   DEF        ([{sunrise(2000,"07:30")}-{sunset(-3200)}|8] or [08:30-{sunset(-3200)}|7])
   ((set Bad_Rollo,WZ_RollGross,Schlaf_Rollo,Kueche_Rollo_Strasse,Kueche_Rollo_Balkon up),
   IF ([WernerS4] eq "present")
      (set  WZ_Rollo_Tuer up))
DOELSE ((set Bad_Rollo,WZ_RollGross,Schlaf_Rollo,Kueche_Rollo_Strasse,Kueche_Rollo_Balkon down),
   IF ([WernerS4] eq "absent")
      (set  WZ_Rollo_Tuer down))
   MODEL      FHEM
   NAME       doRolladen
   NR         261
   NTFY_ORDER 50-doRolladen
   STATE      Rolladen_Oben
   TYPE       DOIF
   .attraggr:
   .attrminint:
   READINGS:
     2018-07-09 07:30:00   cmd             1
     2018-07-09 07:30:00   cmd_event       timer_1
     2018-07-09 07:30:00   cmd_nr          1
     2018-06-15 11:06:55   mode            enabled
     2018-07-09 07:30:00   state           cmd_1
     2018-07-08 21:32:47   timer_01_c01    09.07.2018 07:30:00|8
     2018-07-08 21:32:47   timer_02_c01    09.07.2018 21:31:58|8
     2018-07-08 21:32:47   timer_03_c01    09.07.2018 08:30:00|7
     2018-07-08 21:32:47   timer_04_c01    09.07.2018 21:31:58|7
   Regex:
   attrtimer:
     waitdel:
   condition:
     0          DOIF_time($hash,0,1,$wday,$hms,"8") or DOIF_time($hash,2,3,$wday,$hms,"7")
   days:
     0          8
     1          8
     2          7
     3          7
   devices:
   do:
     0:
       0          (set Bad_Rollo,WZ_RollGross,Schlaf_Rollo,Kueche_Rollo_Strasse,Kueche_Rollo_Balkon up),    IF ([WernerS4] eq "present")        (set  WZ_Rollo_Tuer up)
     1:
       0          (set Bad_Rollo,WZ_RollGross,Schlaf_Rollo,Kueche_Rollo_Strasse,Kueche_Rollo_Balkon down),    IF ([WernerS4] eq "absent")        (set  WZ_Rollo_Tuer down)
   helper:
     DOIF_Readings_events
     DOIF_eventas
     event      timer_1
     globalinit 1
     last_timer 4
     sleeptimer -1
     timerdev   
     timerevent timer_1
     timereventsState
     triggerDev
     timerevents:
       timer_1
     triggerEvents:
       timer_1
   internals:
   interval:
     0          -1
     1          0
     2          -1
     3          2
   intervalfunc:
   intervaltimer:
   itimer:
   localtime:
     0          1531114200
     1          1531164718
     2          1531117800
     3          1531164718
   perlblock:
   readings:
   realtime:
     0          07:30:00
     1          21:31:58
     2          08:30:00
     3          21:31:58
   time:
     0          {sunrise(2000,"07:30")}
     1          {sunset(-3200)}
     2          08:30:00
     3          {sunset(-3200)}
   timeCond:
     0          0
     1          0
     2          0
     3          0
   timer:
     0          0
     1          0
     2          0
     3          0
   timers:
     0           0  1  2  3
   triggertime:
     1531164718:
       localtime  1531164718
       hash:
   uiState:
   uiTable:
Attributes:
   eventMap   cmd_1:Rolladen_Oben cmd_2:Rolladen_Unten cmd_3:Rolladen_Oben cmd_4:Rolladen_Unten
   room       Rolladen


Gruß Werner
Titel: Antw:Ich komme mit dem DOIF nicht weiter
Beitrag von: sash.sc am 09 Juli 2018, 17:12:20
Du hast das 1. DOELSEIF mit in die klammer vom doif gesetzt. Das muss nicht sein. Schaue da nochmal ob der comandref nach. Da gibt es ja hunderte Beispiele......

Hier dein DOIF


define doRolladenNeu DOIF ([{sunrise(2000,"07:30")}-{sunset(-3200)}|8] or [08:30-{sunset(-3200)}|7]) \    ((set Bad_Rollo,WZ_RollGross,Schlaf_Rollo,Kueche_Rollo_Strasse,Kueche_Rollo_Balkon up),\    DOELSE ([WernerS4] eq "present") \       (set  WZ_Rollo_Tuer up))\ DOELSE ((set Bad_Rollo,WZ_RollGross,Schlaf_Rollo,Kueche_Rollo_Strasse,Kueche_Rollo_Balkon down),\    DOELSE ([WernerS4] eq "absent") \       (set  WZ_Rollo_Tuer down))


So würde ich es machen.


define doRolladenNeu DOIF ([{sunrise(2000,"07:30")}-{sunset(-3200)}|8] or [08:30-{sunset(-3200)}|7])  (set Bad_Rollo,WZ_RollGross,Schlaf_Rollo,Kueche_Rollo_Strasse,Kueche_Rollo_Balkon up),\
DOELSEIF ([WernerS4] eq "present")   (set  WZ_Rollo_Tuer up)\
DOELSE (set Bad_Rollo,WZ_RollGross,Schlaf_Rollo,Kueche_Rollo_Strasse,Kueche_Rollo_Balkon down),\
DOELSEIF ([WernerS4] eq "absent")  (set  WZ_Rollo_Tuer down)


Wenn Du eine Bedingung setzt, dann mit DOIF oder DOELSEIF. Eine Ausführung mit DOELSE.

Hab es jetzt nur mal untereinander geschrieben, damit du den Unterschied siehst ! Nicht einfach 1 zu 1 kopieren. ;-)

Ein kleiner Tip. Ich habe bei mir die Rollos in eine Gruppe gepackt, über das Attribut group.
dann kannst du auch folgendes schreiben wenn du deine rollos in die group "Rollos" gepackt hast. So werden dann alle Rollos angesteuert die in der Gruppe "Rollos" sind. Dann brauchst du nicht jeden Befehl einzeln abzusetzen !



set group=Rollos on



Gruß Sascha

Gesendet von meinem E6653 mit Tapatalk

Titel: Antw:Ich komme mit dem DOIF nicht weiter
Beitrag von: Per am 09 Juli 2018, 17:18:29
Das eq passt schon so, da werden die DoifTools das nachfolgende IF nicht erkennen. Darfst du ignorieren. Bzw. dem Entwickler (Ellert) mitteilen.
Gehen denn die anderen Rollos morgens hoch, wenn "WZ_Rollo_Tuer" nicht will?
Titel: Antw:Ich komme mit dem DOIF nicht weiter
Beitrag von: Ellert am 09 Juli 2018, 18:42:39
Ich habe die Formulierung des Hinweises präzisiert, damit klar wird, das Vergleichsoperatoren in Befehlen o.k. sind, ab Morgen im Update.
Titel: Antw:Ich komme mit dem DOIF nicht weiter
Beitrag von: Intruder1956 am 09 Juli 2018, 19:15:03
Danke euch allen für die Bemühung mir zu einem funktionsfähigen DOIF zu kommen,
werde es ausprobieren.

@Per, ja alle anderen gehen hoch, bzw. was mir jetzt im Moment einfällt.

Die Tür sollte auch mit den anderen Rollos hochgehen wenn ich nicht da bin, es bleibt aber unten.
Wenn ich zu Hause bin, soll es oben bleiben, wegen rauchen abends auf dem Balkon.
Wenn ich abwesend bin sollte es mit den anderen Rollos gleichziehen, also rauf und runter

Gruß Werner
Titel: Antw:Ich komme mit dem DOIF nicht weiter
Beitrag von: Per am 11 Juli 2018, 12:09:38
Erstell doch mal ein Dummy und setze diesen im DOIF mit den Status von "WernerS4". Vllt. hast du ja Abweichungen vom erwarteten Zustand. Und wenn du "set  WZ_Rollo_Tuer up" in der CommandLine ausführst, geht es?
Plan B: statt IF mal if versuchen.
Plan C: DOIF auf vier Fälle aufblasen:
DOIF (Zeit + WernerS4 = da) (set  WZ_Rollo_Tuer up,set $SELF cmd2)
DOELSEIF (Zeit) (set Rest up)
DOELSEIF (Werner = weg)  (set  WZ_Rollo_Tuer down,set $SELF cmd4)
DOELSE (set Rest down)