[gelöst] DOIF mit verschachtelter IF Schleife geht nicht trotz richtiger Syntax

Begonnen von Phantomato, 10 Juni 2019, 01:14:36

Vorheriges Thema - Nächstes Thema

Phantomato

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
)
Server: RaspberryPi4 4GB @Raspbian GNU/Linux 10 (buster), Docker, FHEM Docker | Homematic nanoCUL868 (VCCU) | Tasmota Switch & Sensors | Tasmota Zigbee | Zigbee2mqtt | SIGNALduino | Alexa & GoogleHome

amenomade

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"
(


Pi 3B, Alexa, CUL868+Selbstbau 1/2λ-Dipol-Antenne, USB Optolink / Vitotronic, Debmatic und HM / HmIP Komponenten, Rademacher Duofern Jalousien, Fritz!Dect Thermostaten, Proteus

Phantomato

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.
Server: RaspberryPi4 4GB @Raspbian GNU/Linux 10 (buster), Docker, FHEM Docker | Homematic nanoCUL868 (VCCU) | Tasmota Switch & Sensors | Tasmota Zigbee | Zigbee2mqtt | SIGNALduino | Alexa & GoogleHome

Damian

Für strukturiertes Programmieren mit Verschachtelungen würde ich dir DOIF Perl-Mode empfehlen.

PS: In deinen Definitionen kommen Schleifen gar nicht vor :)
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF