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!
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 &");; \
}
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...
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?
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?
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.
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
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.
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.
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!
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!
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 $
Ja, meiner Signatur :) Danke für den Hinweis.
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.
Save config nach dem editieren nicht vergessen, sonst ist nach einem shutdown restart alles wieder weg ;)
VG
Frank
Die Änderungen an DEF werden in der laufenden Konfiguration sofort wirksam.
Ändere mal
dorfbreite_briefkasten:open
in
dorfbreite_briefkasten.*open.*
und teste.
Und dann musst Du irgendwann lernen, wann es wichtig ist, mit " zu arbeiten und wann mit ', aber das ist ein ganz anderes Thema ;)
Hallo,
du kannst dir auch den EventMonitor zum Freund machen.
Öffnen, ein Gerät auslösen (also auch tatsächlich den Briefkasten öffnen) und schauen was im EventMonitor steht.
DAS ist dann genau DER trigger für dein Notify.
Grüße
Ich empfehle in der fhem.cfg nur einzeilig zu arbeiten, dort also nur eine Funktion aufzurufen. Die Funktion dann in die 99_Utils schreiben.
Dann hast du langfristig weniger Probleme!!!
Das wichtigste gelöste Problem betrifft die komische Syntax mit den Fortsetzungszeichen in der fhem.cfg. - man braucht sie nicht mehr.
Der Fehler lag an folgender Sache:
Wenn man die geschweifte Klammer hinter dem regulären Ausdruck in die nächste Zeile schreibt, steht danach in der Definition für REGEXP:
.* {
Wenn man die geschweifte Klammer direkt hinter den regulären Ausdruck schreibt, dann ist REGEXP wie gewünscht .*
Grüße
und vielen Dank für eure Geduld und die vielen Tipps!
btw: Was habe ich teilweise den Syntax mit den Backslashes und den doppelten Semikolon verflucht, aber jetzt mittels DEF ist alles ganz einfach - geil, nun macht es richtig Spaß und ich muss auch nicht nach jeder Änderung fhem neu starten ;)))