Hallo,
bekomme durch einen notify folgende Fehlermeldung im log:
"Arduino_Heizung_A0_notify return value: Global symbol "$EVTPART1" requires explicit package name at (eval 170) line 1."
Notify ist
Arduino_Heizung_A1 { fhem("set Arduino_Heizung_A1_tmp ".sprintf("%1d",(80-((($EVTPART1/1023*5)-1.13)/0.022333333)))); }
Jemand eine Idee, was man dagegen tun kann?
Ohne den Code genauer angeschaut zu haben (bitte die Code-Tags benutzen) würde ich behaupten das $EVTPART1 nicht existiert.
Aus wie vielen Teilen besteht den $EVENT?
Kannst du leicht prüfen:
Arduino_Heizung_A1 Log(3,"$EVENT - $EVTPART0");
Wenn im Logfile $EVTPART0 = $EVENT ist gibt es kein $EVTPART1 ;)
das notify schlägt an, wenn über das frm device werte vom arduino kommen und normalerweise geht es. vielleicht kommt der eintrag dann, wenn der arduino bzw das frm device aus irgendeinem grund mal keinen wert liefert.
sollte doch abstellbar sein mit
Arduino_Heizung_A0 { $EVTPART1&&fhem("set Arduino_Heizung_A0_tmp ".sprintf("%1d",(80-((($EVTPART1/1023*5)-1.01)/0.0265)))); }
oder so ähnlich...
Das notify schlägt auf alles an was von Arduino_Heizung_A0 kommt.
Wenn kein $EVTPART1 existiert hilft dir auch dein "oder so ähnlich" nichts.
Hast du meinen Vorschlag mal ausprobiert ???
Notfalls wäre es auch schön wenn du meinen angepinnten Beitrag im Anfängerbereich liest - dort erwähne ich ja nicht umsonst den EventMonitor.
Dann mal einen Auszug aus dem EventMonitor posten.
Ich tippe nach wie vor schwer auf ein fehlerhaftes (weil nicht vorhandenes) regexp im notify.
Vielleicht liegt es auch einfach daran, dass es %EVTPART1 heißen muss...
Unklar - es gibt widersprüchliche Aussagen dazu in der commandref.
Kannst du den Unterschied zwischen $event und %event aufklären?
Ich habe gerade festgestellt, dass es in der commandref unterschiedliche Angaben dazu gibt, ob es $EVTPARTn oder als %EVTPARTn heissen muss. Muss ich mir mal genauer anschauen.
Der Unterschied zwischen EVENT und EVTPARTn ist in der commandref zu notify erklärt: http://fhem.de/commandref.html#notify
Zitat
The variable $EVENT will contain the complete event, e.g. measured-temp: 21.7 (Celsius)
$EVTPART0,$EVTPART1,$EVTPART2,etc contain the space separated event parts (e.g. $EVTPART0="measured-temp:", $EVTPART1="21.7", $EVTPART2="(Celsius)".
This data is available as a local variable in perl, as environment variable for shell scripts, and will be textually replaced for FHEM commands.
Vereinfacht gesagt, besteht ein EVENT aus 1..n EVTPARTs
Zitat von: betateilchen am 26 September 2015, 00:50:02
Ich habe gerade festgestellt, dass es in der commandref unterschiedliche Angaben dazu gibt, ob es $EVTPARTn oder als %EVTPARTn heissen
Genau darauf wollte ich hinaus, da es in der command ref beide Angaben gibt. % sollte eigentlich einen hash definieren... Aber das macht in dem Zusammenhang aus meiner Sicht keinen Sinn. Vielleicht klärt uns ein Perl Pro mal auf ;)
Aktuell funktioniert noch beides ($EVTPARTn und %EVTPARTn). % soll aber deprecated sein und wenn ich das richtig sehe, ist es in featurelevel 5.7 auch raus (ungetestet).
Den Tipp von Puschel74 ganz oben würde ich einmal beherzigen (für den Threadersteller).
man kan auch einfach mal auf den eventmonitor schauen. dann sieht man doch ganz genau, aus wie vielen teilen das event besteht.
edit: ich nutze seit anfang an immer "$EVENT, $EVTPARTn" erfolgreich.
nur % und @ sind deprecated.
das % in %EVENT und %EVNTPARTn hat nichts mit perl oder einem hash zu tun sondern sind die Kennzeichnung von 'variablen' auf fhem ebene. sie werden nur durch 'dummes' suchen und ersetzen in fhem ausdruck durch den jeweiligen inhalt ausgetauscht.
für die perl ebene werden diese jeweils in die $EVENT und $EVNTPARTn variablen kopiert, für die shellscript ebene werden sie in gleichnamige environment variablen kopiert.
normalerweise gibe es also für jede 'sprachebene' eine dafür vorgesehene variante.
aus irgendeinem grund wird aber auf der fhem ebene zusätzlich die $ variante ersetzt. das geht aber nur so lange gut wie man die % und $ varianten nicht mischt.
also zusammengefasst:
$EVENT, $EVNTPARTn -> für die perl ebene. also z.b. notify ... {if( $EVENT eq ...}.
- zugriff auf nicht vorhandene event teile erzeugt eine warnung.
- %... geht hier nicht!
%EVENT, %EVNTPARTn -> für die fhem ebene. also z.b. notify ... set x %EVENT.
- bei verwendung von nicht vorhandenen event teilen passiert nichts. bzw. der 'variablen' name wird wörtlich im ausdruck stehen.
- die $ variante geht hier auch. aber nicht mit % gemischt. bei z.b. notify ... set xx $EVTPART1 %EVTPART2 im gleichen fhem ausdruck wird nur $EVTPART1 ersetzt.
gruss
andre
Dann ist die commandref falsch formuliert. So wie es dort steht, sind auch %EVENT und %EVTPART etc. deprecated.
Zitat
in the command section you can access the event:
- The variable $EVENT will contain the complete event, e.g. measured-temp: 21.7 (Celsius)
- $EVTPART0,$EVTPART1,$EVTPART2,etc contain the space separated event parts (e.g. $EVTPART0="measured-temp:", $EVTPART1="21.7", $EVTPART2="(Celsius)". This data is available as a local variable in perl, as environment variable for shell scripts, and will be textually replaced for FHEM commands.
- $NAME contains the device to send the event, e.g. myFht
Note: the following is deprecated and will be removed in a future release. The described replacement is attempted if none of the above variables ($NAME/$EVENT/etc) found in the command.
- The character % will be replaced with the received event, e.g. with on or off or measured-temp: 21.7 (Celsius)
It is advisable to put the % into double quotes, else the shell may get a syntax error. - The character @ will be replaced with the device name.
- To use % or @ in the text itself, use the double mode (%% or @@).
- Instead of % and @, the parameters %EVENT (same as %), %NAME (same as @) and %TYPE (contains the device type, e.g. FHT) can be used. The space separated event "parts" are available as %EVTPART0, %EVTPART1, etc. A single % looses its special meaning if any of these parameters appears in the definition.
Ich wuerde gerne alles vereinheitlichen, und auf %EVENT auch verzichten.
Sonst kommt man nur durcheinander.
damit hätte ich kein problem.
aber man sollte darüber nachdenken ob man in diesem fall nicht ein mal beim einlesen der konfiguration automatisch alles von der % auf die $ variante umstellt.
Stimmt, fuehle ich mich nur unsicher bei wann und was.
Mein erster Versuch:
- falls "attr global featurelevel" nicht gesetzt ist, und $featurelevel >= 5.7, dann
- "attr global featurelevel 5.7" setzen
- eine Routine in fhem.pl fuer den Umbau anbieten.
- in allen notify Definitionen folgendes ersetzen:
- % oder %EVENT durch $EVENT,
- @ oder %NAME durch $NAME,
- %TYPE durch $TYPE
- %SELF durch $SELF
- %% durch % und @@ durch @
- in cmdalias Definitionen: % oder %EVENT durch $EVENT
- im PRESENCE powerCmd Attribut %NAME,%ADDRESS und %ARGUMENT
- bei WeekDayTimer und EnOcean bin ich unsicher.
Alternativen?
Hallo, zum Steuern einiger Kommandos nutze ich das Calendar-Modul. Dazu habe ich, wie in der Commandref beschrieben folgenden Code genutzt:
icloud_Kalender:modeStarted.* { my $reading="%EVTPART0";; my $uid= "%EVTPART1";; my $actor= fhem("get icloud_Kalender summary $uid");; if(defined $actor) { fhem("set $actor on") } }
Durch das Update auf fhem 5.7 funktionierte das so nicht mehr.. Somit habe ich den Code wie folgt geändert:
icloud_Kalender:modeStarted.* { my $reading="$EVTPART0";; my $uid= "$EVTPART1";; my $actor= fhem("get icloud_Kalender summary $uid");; if(defined $actor) { fhem("set $actor on") } }
Jetzt wird wieder geschaltet, aber ich bekomme mit 5 Min Abstand folgende Fehlermeldung:
SwitchActorOn return value: Global symbol "$EVTPART1" requires explicit package name at (eval 34401) line 1.
Mittel Event monitor und verbose 5 im Modul habe ich versucht, den Fehler zu ergründen. Leider ohne Erfolg. Kann mir jemand auf die Sprünge helfen??
Beste Grüße Jürgen K.
Dein Notify triggert auf ein Event das kein $EVTPART1 liefert. Regex im Notify besser eingrenzen.
Ich habe das gleiche Problem, verstehe aber deinen Lösungsvorschlag leider nicht. Kannst du das bitte für mich etwas präzisieren?
Juergen hat das bei dir funktioniert?
Global symbol "$EVTPART1" requires explicit package name at (eval 34401) line 1.
Die Meldung sagt aus, dass auf die Variable $EVTPART1 zugegriffen wurde, die Variable aber nicht definiert ist.
Das passiert z.B. wenn man die regex in einem notify nicht weit genug eingrenzt.
Beispiel:
define n notify device:.* set lamp $EVTPART0 $EVTPART1
Wenn jetzt ein Event "pct 100" eintrifft, dann wird "set lamp pct 100" aufgerufen.
Wenn aber ein Event "on" eintrifft, dann ist $EVTPART1 nicht definiert und es wird der genannte Fehler generiert.
Abhilfe:
define n notify device:pct.* set lamp $EVTPART0 $EVTPART1
Jetzt wird das notify nur noch getriggert, wenn das Event mit pct beginnt.
alternative Abhilfe:
define n notify device:.* set lamp $EVENT
jetzt würden beide Varianten ("on" und "pct 100") funktionieren.
Man muss halt eine regex finden, die nur auf das trigert, was man in dem notify auch verarbeiten möchte.
/Uli
Sorry, aber ich habe es auch nicht hinbekommen. Nach stundenlangem rumprobieren habe ich aufgegeben. Ärgert mich zwar..aber nicht zu ändern. Hauptsache ist, dass es schaltet. ...
Gruß
Jürgen
Hab es hinbekommen:
http://forum.fhem.de/index.php/topic,46144.msg380752.html#msg380752 (http://forum.fhem.de/index.php/topic,46144.msg380752.html#msg380752)
Wichtig ist, dass du die Befehle nicht direkt in die fhem.cfg einträgst sondern über das DEF Feld.
Hallo, bei mir läuft es inzwischen auch ohne Fehlermeldung. Habe mich an
http://www.fhemwiki.de/wiki/Google-Kalender_zur_Steuerung_von_Dummies (http://www.fhemwiki.de/wiki/Google-Kalender_zur_Steuerung_von_Dummies) gehalten.
Nun läuft es auch mit icloud..