Global symbol "$EVTPART1" requires explicit package name

Begonnen von FhemPiUser, 25 September 2015, 19:59:18

Vorheriges Thema - Nächstes Thema

FhemPiUser

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?

Puschel74

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  ;)
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.

FhemPiUser

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

Puschel74

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

betateilchen

#4
Vielleicht liegt es auch einfach daran, dass es %EVTPART1 heißen muss...

Unklar - es gibt widersprüchliche Aussagen dazu in der commandref.
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

dev0

Kannst du den Unterschied zwischen $event und %event aufklären?

betateilchen

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
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

dev0

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 ;)

marvin78

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).

frank

#9
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.
FHEM: 6.0(SVN) => Pi3(buster)
IO: CUL433|CUL868|HMLAN|HMUSB2|HMUART
CUL_HM: CC-TC|CC-VD|SEC-SD|SEC-SC|SEC-RHS|Sw1PBU-FM|Sw1-FM|Dim1TPBU-FM|Dim1T-FM|ES-PMSw1-Pl
IT: ITZ500|ITT1500|ITR1500|GRR3500
WebUI [HMdeviceTools.js (hm.js)]: https://forum.fhem.de/index.php/topic,106959.0.html

justme1968

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

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

marvin78

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.

rudolfkoenig

Ich wuerde gerne alles vereinheitlichen, und auf %EVENT auch verzichten.
Sonst kommt man nur durcheinander.

justme1968

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

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

rudolfkoenig

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?