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 ?
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
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"
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).
Kann man überhaupt das FHEM IF in diesem Fall verwenden? Vielleicht besser auf Perlebene mit if arbeiten.
Das geht schon. Aber ich erinnere mich dunkel, es gab irgendeine Sonderlocke ...
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.
Du solltest die Befehle mit Komma statt mit Semikolon trennen.
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
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.
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 ?
Doku hilft :)
https://commandref.fhem.de/commandref_DE.html#DOIF_Angaben_im_Ausfuehrungsteil
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