FHEM Forum

FHEM => Anfängerfragen => Thema gestartet von: ulli am 16 Dezember 2013, 20:55:51

Titel: Syntax fhem("")
Beitrag von: ulli am 16 Dezember 2013, 20:55:51
Hallo,

ich möchte meine Heizung unter der Woche um 9:30 für 30 Minuten anschalten und am Wochenende um 7 Uhr für 30 Minuten anschalten und habe daher folgendes definiert:

define at_WZ_HeatingValve_AutoOnWe at *09:30:00 {\
fhem("set WZ_HeatingValve setMode day") if($we));;\
fhem("define at_WZ_HeatingValve_AutoOffWe at +00:30:00 { fhem("set WZ_HeatingValve setMode night") if(Value("HomeStatus") ne "Zuhause"); } ");;\
}
define at_WZ_HeatingValve_AutoOn at *07:00:00 {\
fhem("set WZ_HeatingValve setMode day") if(!($we));;\
fhem("define at_WZ_HeatingValve_AutoOff at +00:30:00 { fhem("set WZ_HeatingValve setMode night") if(Value("HomeStatus") ne "Zuhause"); } ");;\
}


Leider bekomme ich aber einen Syntax Fehler.
Wie kann ich denn das ganze elegant lösen? Ich denke das geschachtelte fhem("") Kommando ist das Problem?
Titel: Antw:Syntax fhem("")
Beitrag von: ulli am 17 Dezember 2013, 10:23:20
Hat keiner eine Idee?
Titel: Antw:Syntax fhem("")
Beitrag von: Jaydee am 17 Dezember 2013, 10:36:20
Versuch mal die Verschachtelung duch die verschiedenen Arten von Anführungszeichen (einfach ' und doppelt ") zu vereinfachen.

also z.B. so:
fhem('define at_WZ_HeatingValve_AutoOffWe at +00:30:00 { fhem("set WZ_HeatingValve setMode night") if(Value("HomeStatus") ne "Zuhause"); } ');;\

Zumindest an anderer Stelle waren verschachtelte Anführungszeichen immer ein Problem. Und man konnte es so lösen. Ob es hier ausreicht, weiß ich nicht, ist aber einen Versuch wert.

Nebenbei: ich Verwende der Übersicht halber auch die fhem("")-Schreibweise, aber genau genommen ist sie nicht nötig wenn man zuvor nicht alles durch die {} als Perl-Code definiert.

Titel: Antw:Syntax fhem("")
Beitrag von: bugster_de am 17 Dezember 2013, 14:28:57
Hi,

zuerst wäre ja mal die Quizfrage, welchen Syntaxfehler du denn bekommst.

Aber ich kann mir das schon denken: Du hast die Escape Sequenzen für die Strings vergessen:

z.B. hier:
fhem("define at_WZ_HeatingValve_AutoOffWe at +00:30:00 { fhem("set WZ_HeatingValve setMode night") if(Value("HomeStatus") ne "Zuhause"); } ");;
beim erste " geht der String auf und beim zweiten " geht er wieder zu. Alles danach wird dann als Perl Code und eben nicht als Bestandteil des Strings interpretiert.

So sollte es gehen:
fhem("define at_WZ_HeatingValve_AutoOffWe at +00:30:00 { fhem(\"set WZ_HeatingValve setMode night\") if(Value(\"HomeStatus\") ne \"Zuhause\"); } ");;
Titel: Antw:Syntax fhem("")
Beitrag von: Zrrronggg! am 23 Dezember 2013, 02:38:53
Zitatdefine at_WZ_HeatingValve_AutoOnWe at *09:30:00 {\
         fhem("set WZ_HeatingValve setMode day") if($we));;\
         fhem("define at_WZ_HeatingValve_AutoOffWe at +00:30:00 { fhem("set WZ_HeatingValve setMode night") if(Value("HomeStatus") ne "Zuhause"); } ");;\
      }
   define at_WZ_HeatingValve_AutoOn at *07:00:00 {\
         fhem("set WZ_HeatingValve setMode day") if(!($we));;\
         fhem("define at_WZ_HeatingValve_AutoOff at +00:30:00 { fhem("set WZ_HeatingValve setMode night") if(Value("HomeStatus") ne "Zuhause"); } ");;\
      }

Besteht das Problem noch?
Titel: Antw:Syntax fhem("")
Beitrag von: ulli am 05 April 2014, 19:13:18
Ich konnte das Problem mit einem \" letztes mal lösen. Jetzt habe ich wieder ein sehr ähnliches Problem. Habt Ihr wieder einen Tip, ich bekomme es nicht hin!! :-[ :-[


define notify_EB_Waschmaschine_longTimer notify EB_WallSwitch_2:dimdown {\
fhem("set Jeelink868 beep + +");;\
fhem("delete at_EB_longWM") if(Value("at_EB_longWM"));;\
fhem("define at_EB_longWM at +02:30:00 {\\
if(Value(\"HomeStatus\") eq \"Zuhause\") {\\
fhem(\"set Jeelink868 beep +  +  +  +\");;\\
} else {\\
$data{HomeStatus_Delay_BackHome}.=\"set Jeelink868 beep +  +  +  +;;\";;\\
}\\
}");;\
}

Ich bekomme immer ein " Unknown command }" und
die Variable "$data{..}" wird im Log einfach rausgeworfen und es bleibt ein "=\"set...

Ausgabe ist wie folgt:

2014.04.05 19:14:30 3: define at_EB_shortWM at +01:30:00 { if(Value("HomeStatus") eq "Zuhause") { fhem("set Jeelink868 beep +  +  +  +"); } else { .="set Jeelink868 beep +  +  +  +;"; } } : Unknown command }, try help.
Unknown command ", try help.
Unknown command }, try help.
2014.04.05 19:14:30 3: notify_EB_Waschmaschine_shortTimer return value: Unknown command }, try help.
Unknown command ", try help.
Unknown command }, try help.

Hilfe..
Titel: Antw:Syntax fhem("")
Beitrag von: UliM am 05 April 2014, 19:18:06
Hi,
uijuijui.
Nimm doch erstmal einfache Anführungsstriche für Literale, also
\"Zuhause\"
'Zuhause'

Und zeig doch mal bitte die DEF aus dem Detailscreen des notify, diese fhem.cfg-Darstellung verknotet einem ja die Augen :)
Dann kann man's schon mal besser lesen.

Was ist denn $data für ein hash und was willst Du damit erreichen? Steht es innerhalb dieser Routine zur Verfügung?

=8-)
Titel: Antw:Syntax fhem("")
Beitrag von: ulli am 05 April 2014, 19:21:34
$data{...} soll eine Variable darstellen die ich dann in einem anderen notify abfrage. Funktioniert an anderer Stelle so ganz gut...

ich bekomme mit ' anstatt " den selben Fehler :(

Das Def aus dem Webinterface zeigt folgendes:
EB_WallSwitch_2:off {
fhem("set Jeelink868 beep + +");
fhem("delete at_EB_shortWM") if(Value("at_EB_shortWM"));
fhem("define at_EB_shortWM at +01:30:00 {
if(Value('HomeStatus') eq 'Zuhause') {
fhem('set Jeelink868 beep +  +  +  +');
} else {
$data{HomeStatus_Delay_BackHome}.='set Jeelink868 beep +  +  +  +;';
} }");
}
Titel: Antw:Syntax fhem("")
Beitrag von: UliM am 05 April 2014, 19:58:46
Schon viel besser lesbar :)

In der vorletzten Zeile steht das
}");
etwas verloren da. Hast Du mal ne Leerstelle nach } versucht?
=8-)
Titel: Antw:Syntax fhem("")
Beitrag von: ulli am 05 April 2014, 20:22:29
hmm habs hinbekommen. Ich denke aber das da der ein oder andere Fehler in fhem ist, da doch die Syntax so nicht sauber ist, oder?

define notify_EB_Waschmaschine_shortTimer notify EB_WallSwitch_2:off {\
fhem("set Jeelink868 beep + +");;\
fhem("delete at_EB_shortWM") if(Value("at_EB_shortWM"));;\
fhem("define at_EB_shortWM at +01:45:00 {\
if(Value('HomeStatus') eq 'Zuhause') {\
fhem('set Jeelink868 beep +  +  +  +')\
} else {\
\$data\{HomeStatus_Delay_BackHome\}.='set Jeelink868 beep +  +  +  +;;;;'\
} } ");;\
}


Zu Fehlern führen z.B.:
* Wenn ich am Ende der Zeilen ein ; oder ;; einfüge
* ich die Variable ohne die \ benutze
* Ich weniger als 4x; in der Zeile der Variable einfüge
Titel: Antw:Syntax fhem("")
Beitrag von: Puschel74 am 05 April 2014, 22:35:27
Hallo,

dann solltest du nicht die fhem.cfg bearbeiten sondern das DEF.
Das erspart dir die grüblerei wann ; oder ;; oder \ kommt.

Grüße
Titel: Antw:Syntax fhem("")
Beitrag von: justme1968 am 05 April 2014, 22:51:56
das DEF bearbeiten hilf in dem fall leider nicht wenn dort selber wieder ein define mit alle möglichen rein geschachtelt wird. dann muss man trozdem selber maskieren.

das einfachste und ohne nachdenken zuverlässigste ist solche dinge direkt nach myUtils auszulagern. da muss nur noch maskiert werden wenn in einem einzigen fhem aufruf mehrte dinge gemacht werden. und selbst das kann man sich sparen wenn man auch das wider auslagert. 

gruss
  andre
Titel: Antw:Syntax fhem("")
Beitrag von: Puschel74 am 05 April 2014, 22:53:59
Daher trigger ich bei sowas gerne macros.