FHEM Forum

FHEM => Automatisierung => DOIF => Thema gestartet von: rih am 05 Januar 2018, 18:52:47

Titel: [Gelöst] DOIF mit IF
Beitrag von: rih am 05 Januar 2018, 18:52:47
Hallo,

nach langem rumprobieren wende ich mich nun doch frustriert ans Forum. Das Ziel ist, dass die Lampe 5x blinken soll, wenn der Bewegungssensor meldet oder das Licht manuell angemacht wird, aber nur wenn die Rolladen zu sind. Das setreading soll unabhängig von den Rolladen immer funktionieren. Die nachfolgende Variante funktioniert zwar wie gewünscht, aber im Logfile steht die Meldung "IF: no left bracket".
([3K_Sensor_Aussen_Sw_01] eq "closed" or [IT_Licht_Terasse:state] eq "on") (setreading IT_Licht_Terasse eventState on, IF [Alle_Rolladen:state] eq "down") (set Lava_Lampe alert lselect, sleep 5; set Lava_Lampe alert none) DOELSEIF ([3K_Sensor_Aussen_Sw_01] eq "open" or [IT_Licht_Terasse:state] eq "off") (setreading IT_Licht_Terasse eventState off) DOELSE


Dieser Versuch (mit linker Klammer) bringt die Meldung "invalid value, none), for parameter, alert". Funktion: keine.
([3K_Sensor_Aussen_Sw_01] eq "closed" or [IT_Licht_Terasse:state] eq "on") (setreading IT_Licht_Terasse eventState on, IF ([Alle_Rolladen:state] eq "down") (set Lava_Lampe alert lselect, sleep 5; set Lava_Lampe alert none)) DOELSEIF ([3K_Sensor_Aussen_Sw_01] eq "open" or [IT_Licht_Terasse:state] eq "off") (setreading IT_Licht_Terasse eventState off) DOELSE

An Attributen ist nur do always gesetzt. Kann mir bitte jemand auf die Sprünge helfen, wie die richtige Syntax / Klammersetzung sein muss?
Titel: Antw:DOIF mit IF
Beitrag von: Damian am 05 Januar 2018, 22:13:41
Die Fehlermeldung kommt offenbar von:

set Lava_Lampe alert none

funktioniert das denn aufgerufen in der Kommandozeile?
Titel: Antw:DOIF mit IF
Beitrag von: rih am 05 Januar 2018, 22:34:08
Also ohne die IF-Bedingung mit dem Alle_Rolladen: down funktioniert die Blinkerei. Ohne Fehlermeldung.
Set Lava_Lampe alert none schaltet das Blinken nach dem sleep 5 wieder aus.
Der Aufruf in der Kommandozeile wird ohne Fehlermeldung ausgeführt.
Titel: Antw:DOIF mit IF
Beitrag von: Damian am 05 Januar 2018, 23:29:42
Zitat von: rih am 05 Januar 2018, 22:34:08
Also ohne die IF-Bedingung mit dem Alle_Rolladen: down funktioniert die Blinkerei. Ohne Fehlermeldung.
Set Lava_Lampe alert none schaltet das Blinken nach dem sleep 5 wieder aus.
Der Aufruf in der Kommandozeile wird ohne Fehlermeldung ausgeführt.

Dann musst du dich an die Fehlerquelle herantasten:

z. B. ohne sleep testen
oder statt set Lava_Lampe alert none einfach einen Dummy setzen z. B. set mydummy on
Titel: Antw:DOIF mit IF
Beitrag von: rih am 06 Januar 2018, 00:03:26
Hm, die Perl-Variante funktioniert ohne Fehlermeldung:

([3K_Sensor_Aussen_Sw_01] eq "closed" or [IT_Licht_Terasse:state] eq "on") (setreading IT_Licht_Terasse eventState on) ({if (ReadingsVal("Alle_Rolladen","state",0) eq "down") {fhem("set Lava_Lampe alert lselect;; sleep 5;; set Lava_Lampe alert none");;}}) DOELSEIF ([3K_Sensor_Aussen_Sw_01] eq "open" or [IT_Licht_Terasse:state] eq "off") (setreading IT_Licht_Terasse eventState off) DOELSE

Leuchtet mir nicht ein, warum es mit IF nicht gehen soll. Ist das eventuell ein Bug im DOIF?
Titel: Antw:DOIF mit IF
Beitrag von: Otto123 am 06 Januar 2018, 00:29:45
Hi,

IF hat doch den Syntax IF () () -> https://fhem.de/commandref_DE.html#IF

Den vermisse ich hier IF [Alle_Rolladen:state] eq "down") - > es fehlt die linke Klammer   ::)

Gruß Otto
Titel: Antw:DOIF mit IF
Beitrag von: Damian am 06 Januar 2018, 05:58:17
Zitat von: rih am 06 Januar 2018, 00:03:26
Hm, die Perl-Variante funktioniert ohne Fehlermeldung:

([3K_Sensor_Aussen_Sw_01] eq "closed" or [IT_Licht_Terasse:state] eq "on") (setreading IT_Licht_Terasse eventState on) ({if (ReadingsVal("Alle_Rolladen","state",0) eq "down") {fhem("set Lava_Lampe alert lselect;; sleep 5;; set Lava_Lampe alert none");;}}) DOELSEIF ([3K_Sensor_Aussen_Sw_01] eq "open" or [IT_Licht_Terasse:state] eq "off") (setreading IT_Licht_Terasse eventState off) DOELSE

Leuchtet mir nicht ein, warum es mit IF nicht gehen soll. Ist das eventuell ein Bug im DOIF?

Es liegt am Semikolon, das habe ich wieder verdrängt, daher habe ich beim IF eingebaut (aber nur dort), dass man hinter Sleep ein Komma angeben kann. Daher:

([3K_Sensor_Aussen_Sw_01] eq "closed" or [IT_Licht_Terasse:state] eq "on") (setreading IT_Licht_Terasse eventState on, IF ([Alle_Rolladen:state] eq "down") (set Lava_Lampe alert lselect, sleep 5, set Lava_Lampe alert none)) DOELSEIF ([3K_Sensor_Aussen_Sw_01] eq "open" or [IT_Licht_Terasse:state] eq "off") (setreading IT_Licht_Terasse eventState off) DOELSE



Titel: Antw:DOIF mit IF
Beitrag von: rih am 06 Januar 2018, 11:33:49
Vielen Dank für die Erklärung und Hilfe, Damian. Nun funktioniert's mit dem IF wie gewünscht, keine Fehlermeldung mehr.  :D