FHEM Forum

FHEM => Automatisierung => DOIF => Thema gestartet von: Phantomato am 10 Juni 2019, 01:14:36

Titel: [gelöst] DOIF mit verschachtelter IF Schleife geht nicht trotz richtiger Syntax
Beitrag von: Phantomato am 10 Juni 2019, 01:14:36
Hallo,
ich habe eine DOIF Schleife die trotz richtiger Syntax bei Ausführung fehlschlägt (syntax error at (eval 805) line 1, near ")fhem"):

([Sonoff_Flur:Motion_PIR] == 1)
(
IF ([Sonoff_Flur] eq "OFF" and [Nachtruhe] eq "off" and [Sonoff_Kueche] eq "OFF" and [Sonoff_Wohnzimmer] eq "OFF" and [Sonoff_Essbereich] eq "OFF" and [HM_4217E3_Dim:pct] == 0 and [Farbe_Wohnzimmer:POWER] eq "OFF")
(
IF ([Sonoff_Kueche:BH1750_Illuminance] < 5 and [FlEnableMotionDetection] eq "on")
(
set FlLightEnabledByMotion on,
set FlTimerMotionDetection on,
set Sonoff_Flur on
)
IF ([FlTimerMotionDetection] eq "on")
(
set FlLightEnabledByMotion on,
set FlTimerMotionDetection on,
set Sonoff_Flur on
)
IF ($hms gt "06:00" and $hms lt "11:30")
(
set FlLightEnabledByMotion on,
set FlTimerMotionDetection on,
set Sonoff_Flur on
)
)
)
DOELSEIF ([Sonoff_Flur:Motion_PIR] == 0 and [FlLightEnabledByMotion] eq "on")
(
set Sonoff_Flur off,
set FlLightEnabledByMotion off
)


Das Problem scheinen die verschachtelten IF-Schleifen zu sein. Ich habe auch andere ähnliche DOIF Schleifen die aber funktionieren. Was hier anders ist kann ich mir nicht erklären.
Mein Workaround war zwischen die IF Schleifen eine dummy Zeile einzufügen. Damit geht es. Handelt es sich vielleicht um einen Bug im DOIF-Modul?

([Sonoff_Flur:Motion_PIR] == 1)
(
IF ([Sonoff_Flur] eq "OFF" and [Nachtruhe] eq "off" and [Sonoff_Kueche] eq "OFF" and [Sonoff_Wohnzimmer] eq "OFF" and [Sonoff_Essbereich] eq "OFF" and [HM_4217E3_Dim:pct] == 0 and [Farbe_Wohnzimmer:POWER] eq "OFF")
(
set MyDummy on

IF ([Sonoff_Kueche:BH1750_Illuminance] < 5 and [FlEnableMotionDetection] eq "on")
(
set FlLightEnabledByMotion on,
set FlTimerMotionDetection on,
set Sonoff_Flur on
)
IF ([FlTimerMotionDetection] eq "on")
(
set FlLightEnabledByMotion on,
set FlTimerMotionDetection on,
set Sonoff_Flur on
)
IF ($hms gt "06:00" and $hms lt "11:30")
(
set FlLightEnabledByMotion on,
set FlTimerMotionDetection on,
set Sonoff_Flur on
)
)
)
DOELSEIF ([Sonoff_Flur:Motion_PIR] == 0 and [FlLightEnabledByMotion] eq "on")
(
set Sonoff_Flur off,
set FlLightEnabledByMotion off
)
Titel: Antw:DOIF mit verschachtelter IF Schleife geht nicht trotz richtiger Syntax. Bug?
Beitrag von: amenomade am 10 Juni 2019, 01:42:04
ZitatHandelt es sich vielleicht um einen Bug im DOIF-Modul?
Bevor man auf ein Bug tippt, sollte man zuerst die Syntax vom DOIF bzw. IF respektieren. Ich würde eher sagen, es ist reine Glück, dass dein Workaround funktioniert.
Die Befehle (und IF ist ein Befehl) in einem Zweig des DOIFs oder des IFs müssen durch Coma getrennt sein. Du hast bestimmt Meldungen in der Log "ERROR evaluating {if(InternalIf(...."

Übrigens... die Verschachtelung braucht man hier nicht:
([Sonoff_Flur:Motion_PIR] == 1)
(
IF ([Sonoff_Flur] eq "OFF" and [Nachtruhe] eq "off" and [Sonoff_Kueche] eq "OFF" and [Sonoff_Wohnzimmer] eq "OFF" and [Sonoff_Essbereich] eq "OFF" and [HM_4217E3_Dim:pct] == 0 and [Farbe_Wohnzimmer:POWER] eq "OFF")
(

kann man auch so schreiben:
([Sonoff_Flur:Motion_PIR] == 1
and [?Sonoff_Flur] eq "OFF" and [?Nachtruhe] eq "off" and [?Sonoff_Kueche] eq "OFF" and [?Sonoff_Wohnzimmer] eq "OFF" and [?Sonoff_Essbereich] eq "OFF" and [?HM_4217E3_Dim:pct] == 0 and [?Farbe_Wohnzimmer:POWER] eq "OFF"
(


Titel: Antw:DOIF mit verschachtelter IF Schleife geht nicht trotz richtiger Syntax. Bug?
Beitrag von: Phantomato am 10 Juni 2019, 02:03:35
Genau so ist es wie du sagst! Dass der IF auch ein Befehl ist und Komma getrennt sein muss, war mir in der Tat nicht bewusst. Die elendlange DOIF Comandref  bin ich hoch und runter gegangen aber diese Info ist mir wohl entgangen. Danke dir für die Erleuchtung.

Das die Verschachtelung nicht unbediegt notwendig ist, ist mir klar. Es dient eher der Übersicht und Lesbarkeit. Aber stimmt, ein einfacher Zeilenumbruch würde es auch tun.
Titel: Antw:[gelöst] DOIF mit verschachtelter IF Schleife geht nicht trotz richtiger Syntax
Beitrag von: Damian am 10 Juni 2019, 08:49:42
Für strukturiertes Programmieren mit Verschachtelungen würde ich dir DOIF Perl-Mode empfehlen.

PS: In deinen Definitionen kommen Schleifen gar nicht vor :)