fhem.cfg - Syntax bei mehrzeiliger Schreibweise

Begonnen von rx, 03 September 2014, 22:20:45

Vorheriges Thema - Nächstes Thema

rx

Moin!

Immer wenn ich denke, dass ich den Syntax von fhem beherrsche, werde ich eines Besseren belehrt.

Kann mir jemand sagen was an diesem Block falsch ist?

define team_rauchmelder notify Rauchmelder_Team:smoke-Alarm.* \
{ \
    { fhem('set Licht_aussen_Structure on') } \
    { fhem('set Licht_innen_Structure on') } \
    { fhem('set Rolllaeden_Structure off') } \
    \
    my $StatusAlarm1=(ReadingsVal("Rauchmelder_Team","recentAlarm",""));;\
    my $StatusAlarm2=(ReadingsVal("Rauchmelder_Team","smoke_detect",""));;\
    \
    { system("curl -s -F 'token=XXX' -F 'user=YYY' -F \"message=Alarm: Rauchmelder $StatusAlarm1 - $StatusAlarm2 hat ausgelöst\" https://api.pushover.net/1/messages.json&") } \
}


Die Fehlermeldung lautet:
2014.09.03 19:54:36 3: team_rauchmelder return value: Unknown command {, try help.
Unknown command my, try help.
Global symbol "$StatusAlarm1" requires explicit package name at (eval 56902) line 1.
Global symbol "$StatusAlarm2" requires explicit package name at (eval 56902) line 1.
Unmatched right curly bracket at (eval 56902) line 2, at end of line
syntax error at (eval 56902) line 2, near "}
}"


Wenn ich den Code in eine Zeile schreibe, dann scheint es zu funktionieren.

Danke!
Server started with 1333 defined entities (fhem.pl:27302/2023-03-05 perl:5.028001 os:linux user:root pid:29591)

P.A.Trick

Du solltest NICHT in der fhem.cfg herumfuschen sondern lieber den Webeditor nutzen!

Ich versuche dennoch mal zu helfen aber nur wenn du in Zukunft den Webeditor nutzt! (einfach auf DEF klicken!)

Versuche das mal

define team_rauchmelder notify Rauchmelder_Team:smoke-Alarm.* \
{ \
    { fhem('set Licht_aussen_Structure on');; } \
    { fhem('set Licht_innen_Structure on');; } \
    { fhem('set Rolllaeden_Structure off');; } \
    \
    my $StatusAlarm1=ReadingsVal("Rauchmelder_Team","recentAlarm","");;\
    my $StatusAlarm2=ReadingsVal("Rauchmelder_Team","smoke_detect","");;\
    \
    system("curl -s -F 'token=XXX' -F 'user=YYY' -F \"message=Alarm: Rauchmelder $StatusAlarm1 - $StatusAlarm2 hat ausgelöst\" https://api.pushover.net/1/messages.json &");; \
}
Cubietruck,RPI,QNAP Ts-419p+, FS20, FRITZ!DECT200, 7 MAX! Thermostate, 3 MAX! Fensterkontakte, Kodi, CUL V3.3, EM1000S, LW12, LD382, HUE, HM-CFG-USB-2, 1x HM-LC-SW1-FM, 2x HM-LC-SW2-FM, 2x HM-LC-Sw1PBU-FM, 3xHM-LC-Bl1PBU-FM,HM-SEC-RHS, 2xHM-SEC-SD,HM-WDS30-T-O, 3x HM-LC-Dim1TPBU-FM, RPI+AddOn

rx

Danke für deine schnelle Antwort. Mit dem Webeditor habe ich überhaupt kein Glück. Wenn ich über "DEF" den Part editiere, dann funktioniert das Notify danach überhaupt nicht mehr und die Backslashes werden automatisiert entfernt. Vielleicht habe ich da noch einen Denkfehler...
Server started with 1333 defined entities (fhem.pl:27302/2023-03-05 perl:5.028001 os:linux user:root pid:29591)

P.A.Trick

Zitat von: rx am 03 September 2014, 22:56:53
Danke für deine schnelle Antwort. Mit dem Webeditor habe ich überhaupt kein Glück. Wenn ich über "DEF" den Part editiere, dann funktioniert das Notify danach überhaupt nicht mehr und die Backslashes werden automatisiert entfernt. Vielleicht habe ich da noch einen Denkfehler...

Absolut, denn über die Backslashe und doppelten Semikolons sollst du dir ja erst gar keine Gedanken machen!

PS: Funktioniert es denn nun?
Cubietruck,RPI,QNAP Ts-419p+, FS20, FRITZ!DECT200, 7 MAX! Thermostate, 3 MAX! Fensterkontakte, Kodi, CUL V3.3, EM1000S, LW12, LD382, HUE, HM-CFG-USB-2, 1x HM-LC-SW1-FM, 2x HM-LC-SW2-FM, 2x HM-LC-Sw1PBU-FM, 3xHM-LC-Bl1PBU-FM,HM-SEC-RHS, 2xHM-SEC-SD,HM-WDS30-T-O, 3x HM-LC-Dim1TPBU-FM, RPI+AddOn

rx

Ich habe deine Änderungen in die fhem.cfg eingebaut und neu gestartet. Es erscheint bei einem Trigger die folgende Meldung:

2014.09.03 23:13:40 3: team_rauchmelder return value: Unknown command {, try help.
Unknown command }, try help.
Unknown command }, try help.
Unknown command }, try help.
Unknown command my, try help.
Unknown command system("curl, try help.
Unknown command }, try help.


Interessant ist auch, dass z.B. der folgende Block problemlos funktioniert:

define Briefkasten_Pushover notify dorfbreite_briefkasten:open \
{ \
    { fhem("set CUL_HM_HM_OU_CFM_PL_217F19_Mp3 playTone 11") } \
    \
     { fhem('set dorfbreite_flur_tablet on-for-timer 300') } \
    \
    { system("curl -s -F 'token=XXX' -F 'user=YYY' -F 'message=Hinweis: Der Briefkasten wurde geöffnet' https://api.pushover.net/1/messages.json&") } \
    { system("/usr/local/bin/take_picture.sh Briefkasten&") } \
}


Ich habe anscheinend beim Syntax irgendwas überhaupt nicht verstanden - aber was?
Server started with 1333 defined entities (fhem.pl:27302/2023-03-05 perl:5.028001 os:linux user:root pid:29591)

betateilchen

viel zu viele geschweifte Klammern, wo keine hingehören.

Du hast nur einen einzigen durchgehenden Codeblock, also brauchst Du auch nur EIN EINZIGES Paar geschweifte Klammen drumrum.

Das ist übrigens kein fhem-Problem, sondern grundlegendes Basiswissen Perl "Wie ruft man Funktionen auf?". Und wenn man das nicht weiß, dann sollte man solche Änderungen im fhem-Frontend machen.

Oder besser gleich configDB benutzen, dann kommt man gar nicht mehr in die Versuchung, in der fhem.cfg etwas selbst machen zu wollen - weil es dann nämlich keine solche Datei mehr gibt.

-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

rx

Deine Hinweise nehme ich gerne auf. Leider werde ich mit jedem Beitrag von euch ratloser und muss weitere Noob-Fragen stellen. Vielleicht erbarmt sich ja jemand.

Meine Änderungsversuche im fhem-Frontend waren nicht von Erfolg gekrönt. Wenn ich bei dem Notify auf "DEF" klicke, dann öffnet sich ein Fenster mit der Funktion und ich kann sie editieren. Ob ich dort jetzt Backslashes machen muss, mit mehreren Zeilen arbeiten kann oder auf die Semikolon verzichten kann erschliesst sich mir leider überhaupt nicht. Bislang habe ich darin nur eine Möglichkeit gesehen, die fhem.cfg auch über das Frontend zu verändern. Auch ein Syntaxprüfung scheint nicht durchgeführt zu werden.

Frage zum Codeblock: Wenn ich innerhalb des Notify nur mit Perl arbeite , dann brauche ich nur einmal geschweifte Klammern drum herum? Wie sieht das mit Semikolon aus, brauche ich das zwischen den Befehlen? Einmal? Zweimal? Brauche ich die nur bei mehreren Zeilen oder immer? Theoretisch stören doch die geschweiften Klammern in jeder Zeile nicht, oder?

Wenn in configDB nehme, dann werden Anweisungen innerhalb von Notifies ganz anders definiert?

Grüße
Server started with 1333 defined entities (fhem.pl:27302/2023-03-05 perl:5.028001 os:linux user:root pid:29591)

marvin78

Im DEF im Frontend brauchst du die \ nicht. ; wirst du weiterhin benötigen. FHEM kümmert sich jedoch um die nötige Verdoppelung. Dein Code oben für den DEF Bereich könnte z.B. so aussehen:

dorfbreite_briefkasten:open {
    fhem("set CUL_HM_HM_OU_CFM_PL_217F19_Mp3 playTone 11");
    fhem("set dorfbreite_flur_tablet on-for-timer 300");
    system("curl -s -F 'token=XXX' -F 'user=YYY' -F 'message=Hinweis: Der Briefkasten wurde geöffnet' https://api.pushover.net/1/messages.json&");
    system("/usr/local/bin/take_picture.sh Briefkasten&");
}


Vorschlag von mir: Mit Perl beschäftigen. Ein paar Grundlagen können nicht schaden.

betateilchen

Zitat von: rx am 04 September 2014, 14:01:51
Wenn ich bei dem Notify auf "DEF" klicke, dann öffnet sich ein Fenster mit der Funktion und ich kann sie editieren. Ob ich dort jetzt Backslashes machen muss, mit mehreren Zeilen arbeiten kann oder auf die Semikolon verzichten kann erschliesst sich mir leider überhaupt nicht.

Du kannst in dem Fenster beliebig viele Zeilen schreiben, darfst dort keine backslashes eingeben, und musst selbstverständlich Semikolon dort setzen, wo sie von perl (!) gebraucht werden (also keine doppelten Semikolon).  Das Semikolon am Ende einer perl Funktion ist Bestandteil einer korrekten perl Syntax.

Den Backslash gibt es in dieser Form in perl gar nicht, der wird nur fhem-intern verwendet. Sobald Du in dem DEF-Fenster über das Frontend arbeitest, brauchst Du den nicht mehr zu verwenden - und wirst ihn auch nie mehr zu sehen bekommen.

Syntaxprüfung geht, sobald Du einen externen Editor eingebunden hast, das Frontend unterstützt den Editor codemirror und dann steht Dir auch eine passende Syntaxprüfung und ein Syntaxhighlighting zur Verfügung. Wie man das einrichtet, steht in der commandref Dokumentation zu FHEMWEB.
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

rx

Zitat von: marvin78 am 04 September 2014, 14:07:06
Im DEF im Frontend brauchst du die \ nicht. ; wirst du weiterhin benötigen.
Vorschlag von mir: Mit Perl beschäftigen. Ein paar Grundlagen können nicht schaden.

Danke dir! Jetzt wird es klarer!
Server started with 1333 defined entities (fhem.pl:27302/2023-03-05 perl:5.028001 os:linux user:root pid:29591)

rx

Zitat von: betateilchen am 04 September 2014, 14:09:05
Den Backslash gibt es in dieser Form in perl gar nicht, der wird nur fhem-intern verwendet. Sobald Du in dem DEF-Fenster über das Frontend arbeitest, brauchst Du den nicht mehr zu verwenden - und wirst ihn auch nie mehr zu sehen bekommen.

Syntaxprüfung geht, sobald Du einen externen Editor eingebunden hast, das Frontend unterstützt den Editor codemirror und dann steht Dir auch eine passende Syntaxprüfung und ein Syntaxhighlighting zur Verfügung. Wie man das einrichtet, steht in der commandref Dokumentation zu FHEMWEB.

Ich glaube genau das hat mich verwirrt. Ich komme ja eigentlich schon aus der Programmierer-Ecke, aber diese Vermischung hat es für mich schwer gemacht.

Codemirror habe ich bereits aktiviert.

Danke euch!
Server started with 1333 defined entities (fhem.pl:27302/2023-03-05 perl:5.028001 os:linux user:root pid:29591)

betateilchen

ZitatServer started with 367 defined entities (version $Id: fhem.pl 6080 2014-06-07 16:12:09Z rudolfkoenig $, os linux, user frank, pid 4105)

ich empfehle übrigens, ein Update durchzuführen...

# $Id: fhem.pl 6498 2014-09-01 19:24:40Z rudolfkoenig $
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

rx

Server started with 1333 defined entities (fhem.pl:27302/2023-03-05 perl:5.028001 os:linux user:root pid:29591)

rx

Soooooo, wieder etwas schlauer. Jetzt habe ich folgendes Problem:

Ich passe via DEF und Frontend mit codemirror-Plugin den Code an - so wie ihr geschrieben habt - ohne unnötige geschweifte Klammern und brav mit einem Semikolon hinter jedem Befehl. Backslashes lasse ich weg. Dann versuche ich das notify zu triggern ... und nichts passiert.

Muss ich nach Änderungen via DEF fhem neu starten?

Wie kann ich das debuggen? Ich habe verbose auf 5 gesetzt und bekomme das im Log:

2014.09.04 15:48:42 5: Cmd: >trigger dorfbreite_briefkasten open<
2014.09.04 15:48:42 5: Triggering dorfbreite_briefkasten (1 changes)
2014.09.04 15:48:42 5: Notify loop for dorfbreite_briefkasten open


Mein Code in DEF sieht so aus:

dorfbreite_briefkasten:open
{
fhem("set CUL_HM_HM_OU_CFM_PL_217F19_Mp3 playTone 11");
fhem('set dorfbreite_flur_tablet on-for-timer 300');
system("curl -s -F 'token=XXX' -F 'user=YYY' -F 'message=Hinweis: Der Briefkasten wurde geöffnet' https://api.pushover.net/1/messages.json&");
       system("/usr/local/bin/take_picture.sh Briefkasten&");
}


Wenn ich das jetzt noch raffen würde, ich glaube dann habe ich es.
Server started with 1333 defined entities (fhem.pl:27302/2023-03-05 perl:5.028001 os:linux user:root pid:29591)

franky08

Save config nach dem editieren nicht vergessen, sonst ist nach einem shutdown restart alles wieder weg  ;)

VG
Frank
Debian Bookworm auf HUNSN / Debian Bullseye auf 2.ter HUNSN F2F an 2x RaspiB
mit FHEM aktuell
22Zoll ViewSonic als Infodislay (WVC)
3xHMLAN mit vccu, raspmatic_rpi3, HMIP-HCU1