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
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
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
Setze den Code nach der Änderung mal hier rein.
Gruß Sascha
Gesendet von meinem E6653 mit Tapatalk
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
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
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?
Ich habe die Formulierung des Hinweises präzisiert, damit klar wird, das Vergleichsoperatoren in Befehlen o.k. sind, ab Morgen im Update.
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
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)