Hauptmenü

Syntax fhem("")

Begonnen von ulli, 16 Dezember 2013, 20:55:51

Vorheriges Thema - Nächstes Thema

ulli

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?

ulli


Jaydee

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.


bugster_de

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\"); } ");;

Zrrronggg!

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?
FHEM auf Linkstation Mini, CUL 868 SlowRF, 2xCUL 868 RFR, CUL 433 für IT, 2xHMLAN-Configurator mit VCCU, ITV-100 Repeater, Sender und Aktoren von FHT, FS20, S300, HM, IT, RSL

ulli

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

UliM

#6
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-)
RPi4/Raspbian, CUL V3 (ca. 30 HomeMatic-devices), LAN (HarmonyHub, alexa etc.).  Fördermitglied des FHEM e.V.

ulli

$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 +  +  +  +;';
} }");
}

UliM

Schon viel besser lesbar :)

In der vorletzten Zeile steht das
}");
etwas verloren da. Hast Du mal ne Leerstelle nach } versucht?
=8-)
RPi4/Raspbian, CUL V3 (ca. 30 HomeMatic-devices), LAN (HarmonyHub, alexa etc.).  Fördermitglied des FHEM e.V.

ulli

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

Puschel74

Hallo,

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

Grüße
Zotac BI323 als Server mit DBLog
CUNO für FHT80B, 3 HM-Lan per vCCU, RasPi mit CUL433 für Somfy-Rollo (F2F), RasPi mit I2C(LM75) (F2F), RasPi für Panstamp+Vegetronix +SONOS(F2F)
Ich beantworte keine Supportanfragen per PM! Bitte im Forum suchen oder einen Beitrag erstellen.

justme1968

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
hue, tradfri, alexa-fhem, homebridge-fhem, LightScene, readingsGroup, ...

https://github.com/sponsors/justme-1968

Puschel74

Daher trigger ich bei sowas gerne macros.
Zotac BI323 als Server mit DBLog
CUNO für FHT80B, 3 HM-Lan per vCCU, RasPi mit CUL433 für Somfy-Rollo (F2F), RasPi mit I2C(LM75) (F2F), RasPi für Panstamp+Vegetronix +SONOS(F2F)
Ich beantworte keine Supportanfragen per PM! Bitte im Forum suchen oder einen Beitrag erstellen.