FHEM Forum

FHEM => Automatisierung => DOIF => Thema gestartet von: hanswerner1 am 08 Mai 2018, 12:24:39

Titel: [Gelöst] IF in DOIF erzeugt Fehlermeldung im LOG
Beitrag von: hanswerner1 am 08 Mai 2018, 12:24:39
Hallo,

ich steuere meine Rolladen über ein DOIF. Bei Sonne sollen die Rolleden runter gehen ausser an zwei Fenstern, wenn sie  auf sind oder die Rolladen schon runter sind, dann sollen sie bleiben wo sie sind.

Hab das so gelöst:

Auszug aus dem DOIF:

....
DOELSEIF ([Rolladen] eq "SonneV")
(
IF ([Fenster_Buero] eq "closed" or [Rollo_Buero:position] eq "0") (set Rollo_Buero position 45);
IF ([Fenster_Schlafzimmer] eq "closed" or [Rollo_Schlafzimmer:position] eq "0") (set Rollo_Schlafzimmer position 45);
set Rollo_Kueche position 45;
set Rollo_Wohnzimmer1 position 45
)

DOELSEIF ([Rolladen] eq "SonneH")
(
set Rollo_Ankleidezimmer position 45;
set Rollo_Wohnzimmer2 position 45
)

DOELSEIF ([Rolladen] eq "Sonnemittag")
(
IF ([Fenster_Buero] eq "closed") (set Rollo_Buero position 0);
IF ([Fenster_Schlafzimmer] eq "closed") (set Rollo_Schlafzimmer position 0);
set Rollo_Kueche position 0;
set Rollo_Wohnzimmer1 position 0;
set Rollo_Ankleidezimmer position 0;
set Rollo_Wohnzimmer2 position 0
)

DOELSEIF ([Rolladen] eq "Sonneaus")
(
IF ([Fenster_Buero] eq "closed") (set Rollo_Buero position 0);
IF ([Fenster_Schlafzimmer] eq "closed") (set Rollo_Schlafzimmer position 0);
set Rollo_Kueche position 0;
set Rollo_Wohnzimmer1 position 0;
set Rollo_Ankleidezimmer position 0;
set Rollo_Wohnzimmer2 position 0


Im Log steht folgende Fehlermeldung, wobei die Ausführung aber erfolg:


2018.05.08 10:14:37 1: ERROR evaluating {if(open eq "closed" or 59 eq "0"){fhem('set Rollo_Schlafzimmer position 45')}}: Not enough arguments for open at (eval 4736377) line 1, near "open eq"

2018.05.08 10:14:37 2: doif_Rolladen_Fenster: ; IF (open eq "closed" or 59 eq "0") (set Rollo_Schlafzimmer position 45); set Rollo_Kueche position 45; set Rollo_Wohnzimmer1 position 45 : Not enough arguments for open at (eval 4736377) line 1, near "open eq"


Wo könnte der Fehler sein ?

Titel: Antw:IF in DOIF erzeugt Fehlermeldung im LOG
Beitrag von: ComputerZOO am 08 Mai 2018, 13:50:06
Moin,
evtl. liegt es daran, dass du Birnen mit Äpfeln vergleichst:
...or [Rollo_Schlafzimmer:position] eq "0"...

Versuch mal ...or [Rollo_Schlafzimmer:position] == 0...

eq : Vergleich eines Strings
== : Vergleich von Zahlen
Titel: Antw:IF in DOIF erzeugt Fehlermeldung im LOG
Beitrag von: hanswerner1 am 08 Mai 2018, 14:08:36
Zitat von: ComputerZOO am 08 Mai 2018, 13:50:06
eq : Vergleich eines Strings
== : Vergleich von Zahlen

Hat keine Änderung gebracht. Die Fehlermeldung bleibt gleich:

1: ERROR evaluating {if(open eq "closed" or 59 == 0){fhem('set Rollo_Schlafzimmer position 45')}}: Not enough arguments for open at (eval 4825141) line 1, near "open eq"

2: doif_Rolladen_Fenster: ; IF (open eq "closed" or 59 == 0) (set Rollo_Schlafzimmer position 45); set Rollo_Kueche position 45; set Rollo_Wohnzimmer1 position 45 : Not enough arguments for open at (eval 4825141) line 1, near "open eq"


Titel: Antw:IF in DOIF erzeugt Fehlermeldung im LOG
Beitrag von: ComputerZOO am 08 Mai 2018, 14:27:45
Hmm,
was mir jetzt auf den zweiten Blick noch auffällt ist, dass du die Befehle mit Semikolon anstatt Kommata trennst (DOIF ist zwar tolerant dem gegenüber, aber ich meine ich wäre da im Zusammenhang mit IF auch schon einmal drauf reingefallen).
Titel: Antw:IF in DOIF erzeugt Fehlermeldung im LOG
Beitrag von: CoolTux am 08 Mai 2018, 14:33:07
Kann man überhaupt das FHEM IF in diesem Fall verwenden? Vielleicht besser auf Perlebene mit if arbeiten.
Titel: Antw:IF in DOIF erzeugt Fehlermeldung im LOG
Beitrag von: Otto123 am 08 Mai 2018, 14:38:51
Das geht schon. Aber ich erinnere mich dunkel, es gab irgendeine Sonderlocke ...
Titel: Antw:IF in DOIF erzeugt Fehlermeldung im LOG
Beitrag von: Ellert am 08 Mai 2018, 15:22:21
Zitat von: hanswerner1 am 08 Mai 2018, 12:24:39
Hallo,

ich steuere meine Rolladen über ein DOIF. Bei Sonne sollen die Rolleden runter gehen ausser an zwei Fenstern, wenn sie  auf sind oder die Rolladen schon runter sind, dann sollen sie bleiben wo sie sind.

Hab das so gelöst:

Auszug aus dem DOIF:

....
DOELSEIF ([Rolladen] eq "SonneV")
(
IF ([Fenster_Buero] eq "closed" or [Rollo_Buero:position] eq "0") (set Rollo_Buero position 45);
IF ([Fenster_Schlafzimmer] eq "closed" or [Rollo_Schlafzimmer:position] eq "0") (set Rollo_Schlafzimmer position 45);
set Rollo_Kueche position 45;
set Rollo_Wohnzimmer1 position 45
)

DOELSEIF ([Rolladen] eq "SonneH")
(
set Rollo_Ankleidezimmer position 45;
set Rollo_Wohnzimmer2 position 45
)

DOELSEIF ([Rolladen] eq "Sonnemittag")
(
IF ([Fenster_Buero] eq "closed") (set Rollo_Buero position 0);
IF ([Fenster_Schlafzimmer] eq "closed") (set Rollo_Schlafzimmer position 0);
set Rollo_Kueche position 0;
set Rollo_Wohnzimmer1 position 0;
set Rollo_Ankleidezimmer position 0;
set Rollo_Wohnzimmer2 position 0
)

DOELSEIF ([Rolladen] eq "Sonneaus")
(
IF ([Fenster_Buero] eq "closed") (set Rollo_Buero position 0);
IF ([Fenster_Schlafzimmer] eq "closed") (set Rollo_Schlafzimmer position 0);
set Rollo_Kueche position 0;
set Rollo_Wohnzimmer1 position 0;
set Rollo_Ankleidezimmer position 0;
set Rollo_Wohnzimmer2 position 0


Im Log steht folgende Fehlermeldung, wobei die Ausführung aber erfolg:


2018.05.08 10:14:37 1: ERROR evaluating {if(open eq "closed" or 59 eq "0"){fhem('set Rollo_Schlafzimmer position 45')}}: Not enough arguments for open at (eval 4736377) line 1, near "open eq"

2018.05.08 10:14:37 2: doif_Rolladen_Fenster: ; IF (open eq "closed" or 59 eq "0") (set Rollo_Schlafzimmer position 45); set Rollo_Kueche position 45; set Rollo_Wohnzimmer1 position 45 : Not enough arguments for open at (eval 4736377) line 1, near "open eq"


Wo könnte der Fehler sein ?
Wo der Fehler liegt geht meistens aus der Fehlermeldung hervor ;)

Zitatnear "open eq"

Wenn Du Dir den evaluierten Ausdruck ansiehst, dann fällt auf, dass open nicht in Anführungszeichen steht. Das könnte darauf hinweisen, das die Syntax [device:reading] um Anführungszeichen ergänzt werden muss.
Erhärtet wird die Vermutung durch den Hinweis
ZitatNot enough arguments for open
, das deutet daraufhin, dass open als Perlfunktion interpretiert wird.
Titel: Antw:IF in DOIF erzeugt Fehlermeldung im LOG
Beitrag von: Damian am 08 Mai 2018, 15:37:46
Du solltest die Befehle mit Komma statt mit Semikolon trennen.
Titel: Antw:IF in DOIF erzeugt Fehlermeldung im LOG
Beitrag von: Otto123 am 08 Mai 2018, 15:57:49
ZitatDas könnte darauf hinweisen, das die Syntax [device:reading] um Anführungszeichen ergänzt werden muss.
Das glaube ich nicht. Ich habe auch die halben Punkte in Verdacht.
Das hatten wir doch letztens erst....

Edit: Gingen Semikolons nicht auch, aber sie mussten verdoppelt werden?! :-X

Gruß Otto
Titel: Antw:IF in DOIF erzeugt Fehlermeldung im LOG
Beitrag von: Damian am 08 Mai 2018, 17:31:39
Die Erklärung ist folgende:

DOIF und IF nutzen die gleiche Syntax [device:reading], daher muss DOIF erkennen, dass ein IF kommt und überlässt die Ersetzung von [device:reading] dem IF-Befehl. Beim ersten IF klappt es auch beim zweiten nicht mehr, weil hier nicht das DOIF-Trennzeichen Komma, sondern Semikolon benutzt wurde. Deswegen hat DOIF das zweite IF nicht mehr erkannt und [device:reading] vorzeitig ersetzt, was dazu führt, dass das zweite IF auf die Nase fällt. Deshalb Komma beim DOIF verwenden statt Semikolon damit auch solche Definitionen sauber funktionieren.
Titel: Antw:IF in DOIF erzeugt Fehlermeldung im LOG
Beitrag von: hanswerner1 am 08 Mai 2018, 18:28:21
Zitat von: Damian am 08 Mai 2018, 15:37:46
Du solltest die Befehle mit Komma statt mit Semikolon trennen.

Das war es, vielen Dank !!!
Jetzt kommt keine Fehlermeldung mehr.

Hab in allen meinen DOIF's das ";" als Trennung zwischen den Befehlen. Also wäre hier auch überall ein "," richtig ?

Titel: Antw:IF in DOIF erzeugt Fehlermeldung im LOG
Beitrag von: Otto123 am 08 Mai 2018, 18:32:55
Doku hilft :)
https://commandref.fhem.de/commandref_DE.html#DOIF_Angaben_im_Ausfuehrungsteil
Titel: Antw:IF in DOIF erzeugt Fehlermeldung im LOG
Beitrag von: Damian am 08 Mai 2018, 18:34:14
Zitat von: hanswerner1 am 08 Mai 2018, 18:28:21
Das war es, vielen Dank !!!
Jetzt kommt keine Fehlermeldung mehr.

Hab in allen meinen DOIF's das ";" als Trennung zwischen den Befehlen. Also wäre hier auch überall ein "," richtig ?

In den meisten Fällen wird auch Semikolon funktionieren. Allerdings sollte man die Commandref zu DOIF beherzigen, dort steht nicht, dass man Semikolon verwenden sollte ;)

Man kann der ganzen Problematik entgehen, wenn man weitgehend auf FHEM-Syntax verzichtet: DOIF-Perl