[Gelöst] IF in DOIF erzeugt Fehlermeldung im LOG

Begonnen von hanswerner1, 08 Mai 2018, 12:24:39

Vorheriges Thema - Nächstes Thema

hanswerner1

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 ?


ComputerZOO

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

hanswerner1

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"



ComputerZOO

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).

CoolTux

Kann man überhaupt das FHEM IF in diesem Fall verwenden? Vielleicht besser auf Perlebene mit if arbeiten.
Du musst nicht wissen wie es geht! Du musst nur wissen wo es steht, wie es geht.
Support me to buy new test hardware for development: https://www.paypal.com/paypalme/MOldenburg
My FHEM Git: https://git.cooltux.net/FHEM/
Das TuxNet Wiki:
https://www.cooltux.net

Otto123

Das geht schon. Aber ich erinnere mich dunkel, es gab irgendeine Sonderlocke ...
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

Ellert

#6
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.

Damian

Du solltest die Befehle mit Komma statt mit Semikolon trennen.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

Otto123

#8
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
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

Damian

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.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

hanswerner1

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 ?


Otto123

Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

Damian

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
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF