Hallo,
seit dem Update vom 16.11.2015 habe ich sehr skurrile Effekte. Ich habe es nun auf die fhem.pl herunter reduzieren können, die ursächlich dafür ist.
Ich kann, seit der fhem.pl vom Mo.16.11.2015, schlicht die "Variable" % nicht mehr verwenden.
Ich habe dazu eine minimal test funktion geschrieben:
test {
Log 0,"%"
}
Bei der Version fhem.pl vom 16.11.2015 gibt die Funktion im log Folgendes aus:
Bei "trigger test on" wird im Log lediglich "%" ausgegeben. Hier hätte ich ja nun eher "on" erwartet.
Bei einem Downgrade auf "fhem.pl 9809 2015-11-07 18:39:08Z" funktioniert es wieder, und die Funktion gibt mir den Inhalt aus und nicht den Bezeichner: also "on" aus.
Habe ich hier irgend eine Entwicklung verpasst ?
Ich nutze "%" natürlich an diversen Stellen in fhem, die nun deshalb alle nicht mehr funktionieren. Momentan bleibe ich zwangsweise bei fhem.pl 9809, damit fhem korrekt funktioniert.
Was kann Ursache des Problems sein ?
Viele Grüße!
Andreas
@ und % sind schon lange deprecated (siehe bspw. commandref zu notify - dort konnte man das schon sehr lange lesen). $NAME und $EVENT ersetzen sie. Seit Version 5.7 sind die Platzhalter nun raus (ist hier an mehreren Stellen im Forum nachzulesen). Du kannst mit dem global Attribut featurelevel noch auf 5.6 zurück schalten und @ und % funktionieren dann wieder für eine Weile. "Noch" ist hier jedoch das Stichwort. Du solltest umrüsten.
Das hängt damit zusammen, dass % schon länger auf der "Abschussliste" steht.
Zitat@ und % im notify/etc gibts nicht mehr, genauso wie %NAME, %EVENT. Bitte stattdessen $NAME, $EVENT verwenden. Das ist uniform in fhem-Befehlen, perl-Einzeiler {}, und im shell-Aufruf "" moeglich. Damit faellt auch die Notwendigkeit von @@/%% weg. Fuer Details siehe den (seit lange unveraenderten) commandref Eintrag fuer notify.
Siehe http://forum.fhem.de/index.php/topic,44094.0.html (http://forum.fhem.de/index.php/topic,44094.0.html)
lg, Stefan
Zitat von: marvin78 am 17 November 2015, 11:07:27
@ und % sind schon lange deprecated (siehe bspw. commandref zu notify - dort konnte man das schon sehr lange lesen). $NAME und $EVENT ersetzen sie. Seit Version 5.7 sind die Platzhalter nun raus (ist hier an mehreren Stellen im Forum nachzulesen). Du kannst mit dem global Attribut featurelevel noch auf 5.6 zurück schalten und @ und % funktionieren dann wieder für eine Weile. "Noch" ist hier jedoch das Stichwort. Du solltest umrüsten.
Okay, danke!
hab ich wirklich nicht wahr genommen. Ich stell meine Funktionen um.
Viele Grüße!
Andreas
Zitat von: fhem-challenge am 17 November 2015, 11:10:09
Okay, danke!
hab ich wirklich nicht wahr genommen. Ich stell meine Funktionen um.
Viele Grüße!
Andreas
Nachtrag:
Ich bin dabei alle "%" sowie "@" aus meinen Funktionen durch "$EVENT" bzw. "$NAME" zu ersetzen.
Dabei Folgendes Problem:
Diese folgende Testfunktion funktioniert:
test {
my @@heizungen=devspec2array("NAME=Heizung.Regler.*");
foreach(@@heizungen) {
Log 0,"$_"
}
}
... LOG ...
2015.11.17 13:47:57 0: Heizung.Regler.HM.Bad
2015.11.17 13:47:57 0: Heizung.Regler.HM.Flur
2015.11.17 13:47:57 0: Heizung.Regler.HM.Hobbyraum
2015.11.17 13:47:57 0: Heizung.Regler.HM.Poolraum
2015.11.17 13:47:57 0: Heizung.Regler.HM.Schlafzimmer
2015.11.17 13:47:57 0: Heizung.Regler.HM.Wohnzimmer
2015.11.17 13:48:16 0: Heizung.Regler.HM.Bad
2015.11.17 13:48:16 0: Heizung.Regler.HM.Flur
2015.11.17 13:48:16 0: Heizung.Regler.HM.Hobbyraum
2015.11.17 13:48:16 0: Heizung.Regler.HM.Poolraum
2015.11.17 13:48:16 0: Heizung.Regler.HM.Schlafzimmer
2015.11.17 13:48:16 0: Heizung.Regler.HM.WohnzimmerDiese hingegen (gleiche Funktion wie oben, lediglich greife ich hier auf die Variable "$EVENT" zu):
test {
Log 0,"$EVENT;
my @@heizungen=devspec2array("NAME=Heizung.Regler.*");
foreach(@@heizungen) {
Log 0,"$_"
}
}
... wirft ein ...
... LOG ...
2015.11.17 13:51:27 1: PERL WARNING: Bareword found where operator expected at (eval 2368) line 3, near "@@heizungen"
2015.11.17 13:51:27 3: eval: my $EVTPART0='on';my $TYPE='notify';my $SELF='test';my $EVENT='on';my $NAME='test';{
Log 0,"$EVENT";
my @@heizungen=devspec2array("NAME=Heizung.Regler.*");
foreach(@@heizungen) {
Log 0,"$_"
}
}
2015.11.17 13:51:27 1: PERL WARNING: Bareword found where operator expected at (eval 2368) line 5, near "@@heizungen"
2015.11.17 13:51:27 3: eval: my $EVTPART0='on';my $TYPE='notify';my $SELF='test';my $EVENT='on';my $NAME='test';{
Log 0,"$EVENT";
my @@heizungen=devspec2array("NAME=Heizung.Regler.*");
foreach(@@heizungen) {
Log 0,"$_"
}
}
2015.11.17 13:51:27 3: test return value: Can't use global @@ in "my" at (eval 2368) line 3, near "my @@"
syntax error at (eval 2368) line 3, near "@@heizungen"
syntax error at (eval 2368) line 5, near "@@heizungen"
Ich bin zugegeben etwas überrascht, oder sehe den Wald vor lauter Bäumen nicht mehr ?
Viele Grüße!
Andreas
Zitat von: fhem-challenge am 17 November 2015, 13:56:59
Ich bin zugegeben etwas überrascht, oder sehe den Wald vor lauter Bäumen nicht mehr ?
Mit einer Suche nach "Bareword" landest Du schnell hier: http://forum.fhem.de/index.php/topic,44172.msg360292.html#msg360292
@@ musst Du wohl durch @ ersetzen.
Doppelte @ sind nicht mehr nötig.
Zitat von: marvin78 am 17 November 2015, 14:09:46
Doppelte @ sind nicht mehr nötig.
Okay, danke!! --> es "tut" mit einem "@".
Dennoch:
Ich vermute , dass in Kürze viele User Probleme bekommen, die ein Update auf 5.7 gemacht haben.
Viele! codesnip(s), Wiki examples, Blogs u.v.m. verwenden noch "%"/"@", oder auch "@@"-[array]. Geschweige denn in diversen ForenThreads, hier lässt sich nachträglich kein Hinweis auf "depricated" in sämtlichen threads anhängen, sodass viele (vermutlich gerade neue) User erst einmal auf den "Leim" gehen werden.
Viele Grüße!
Andreas
Mag sein, aber das ist nun schon so lange als deprecated in der commandref markiert, dass es jeder gesehen haben sollte.
Hallo,
Bevor ich update versuche ich mich schlau zu machen worauf ich aufpassen muss, bei einem in mehreren Jahren gewachsenem System gibts doch sehr viele Altlasten. Ich bin eben dabei die letzten %'s und @@'s zu entfernen und habe jetzt noch eine Frage um ganz sicher zu gehen.
Zitat@ und % im notify/etc gibts nicht mehr, genauso wie %NAME, %EVENT. Bitte stattdessen $NAME, $EVENT verwenden. Das ist uniform in fhem-Befehlen, perl-Einzeiler {}, und im shell-Aufruf "" moeglich. Damit faellt auch die Notwendigkeit von @@/%% weg. Fuer Details siehe den (seit lange unveraenderten) commandref Eintrag fuer notify.
Das bezieht sich doch definitiv nur auf notify's, oder?
Ich habe mal kurz das FHEM directory gescannt und habe %NAME auch in vielen Modulen gefunden (ähnliches Ergebnis bei @@)
root@HAL9000:/opt/fhem/FHEM# cat *|grep %NAME
{ "CUL_FHTTK.*" => { GPLOT => "fht80tf:Window,", FILTER => "%NAME" } };
"%NAME" => $devName,
"%NAME" => shift(@{$hash->{helper}{lastCmdValue}}),
my %specials= ("%NAME" => $name,
my %specials= ("%NAME" => $name,
FILTER => "%NAME:power\\x3a.*",
{ "IT.*" => { GPLOT => "", FILTER => "%NAME" } };
{ "FHT.*" => { GPLOT => "fht:Temp/Act,", FILTER => "%NAME" } };
{ GPLOT => "fht80tf:Contact,", FILTER => "%NAME" },
{ GPLOT => "temp4hum6:Temp/Hum,", FILTER => "%NAME:T:.*" }
FILTER => "%NAME:T:.*" } };
FILTER => "%NAME:T:.*" } };
{ "CUL_TCM97001.*" => { GPLOT => "temp4hum4:Temp/Hum,", FILTER => "%NAME" },
"CUL_TCM97001_Unknown.*" => { GPLOT => "", FILTER => "%NAME" }
{ "CUL_TX.*" => { GPLOT => "temp4hum4:Temp/Hum,", FILTER => "%NAME" } };
{ "CUL_WS.*" => { GPLOT => "temp4hum6:Temp/Hum,", FILTER=>"%NAME:T:.*" } };
{ "CUL_EM.*" => { GPLOT => "power8:Power,", FILTER => "%NAME:CNT.*" } };
FILTER => "%NAME:dcpower:.*"
$hash->{AutoCreate} = { "LaCrosse.*" => { autocreateThreshold => "2:120", FILTER => "%NAME" }};
<code>define MOTION.not.02 notify ipcam:.*snapshots.* { myEmailFunction("%NAME") }</code><br>
define LogErna notify MyCalendar:modeAlarmed.*2767324dsfretfvds7dsfn3e4­dsa234r234sdfds6bh874­googlecom.* { Log3 %NAME, 1, "ALARM name=%NAME event=%EVENT part1=%EVTPART0 part2=%EVTPART1" }
define LogActors notify MyCalendar:mode(Started|Ended).* { my $reading= "%EVTPART0";; my $uid= "%EVTPART1";; my $actor= fhem("get MyCalendar summary $uid");; Log 3 %NAME, 1, "Actor: $actor, Reading $reading" }
define LogErna notify MyCalendar:modeAlarmed.*2767324dsfretfvds7dsfn3e4­dsa234r234sdfds6bh874­googlecom.* { Log3 %NAME, 1, "ALARM name=%NAME event=%EVENT part1=%EVTPART0 part2=%EVTPART1" }
define LogActors notify MyCalendar:mode(Started|Ended).* { my $reading= "%EVTPART0";; my $uid= "%EVTPART1";; my $actor= fhem("get MyCalendar summary $uid");; Log 3 %NAME, 1, "Actor: $actor, Reading $reading" }
<li>The macro <code>%NAME</code> will expand to the device name.</li>
"%NAME" => $hash->{NAME},
"%NAME" => $name,
<li><code>%NAME</code> - name of the PRESENCE definition</li>
<li><code>%NAME</code> - Name der PRESENCE-Definition</li>
"%NAME" => $n,
<li>Instead of % and @, the parameters %EVENT (same as %), %NAME (same
%NAME (funktionsgleich mit @) und
=> { GPLOT => "temp4:Temp,", FILTER => "%NAME" },
=> { GPLOT => "temp4hum4:Temp/Hum,", FILTER => "%NAME" },
FILTER => "%NAME" },
=> { GPLOT => "wind4windDir4:WindDir/WindSpeed,", FILTER => "%NAME" },
=> { GPLOT => "rain4:RainRate", FILTER => "%NAME" },
=> { GPLOT => "fht80tf:Window,", FILTER => "%NAME" },
=> { GPLOT => "fht80tf:Window,", FILTER => "%NAME" },
=> { GPLOT => "temp4hum4:Temp/Hum,", FILTER => "%NAME" },
=> { GPLOT => "temp4hum6:Temp/Hum,", FILTER => "%NAME" },
FILTER => "%NAME:T:.*" },
=> { GPLOT => "temp4hum6:Temp/Hum,", FILTER => "%NAME:T:.*" },
FILTER => "%NAME:T:.*" },
=> { GPLOT => "temp4hum6:Temp/Hum,", FILTER => "%NAME:T:.*" },
my $n = $hash->{NAME}; $str =~ s/%NAME/$n/g;
attr autocreate filelog test2/log/%NAME-%Y.log
wildcards %TYPE and %NAME, see the example above.</li><br>
the wildcards %TYPE and %NAME, see the example above. The filelog will
wildcards %TYPE and %NAME, see the example above.</li><br>
attr autocreate filelog test2/log/%NAME-%Y.log
die Wildcards %NAME und %TYPE enthalten, siehe oben stehendes
Dateiname darf die Wildcards %NAME und %TYPE enthalten, siehe oben
die Wildcards %NAME und %TYPE enthalten, siehe oben stehendes
<code>%EVENT</code> (same as <code>%</code>), <code>%NAME</code> (same
attr hc delayedExecutionCond isDelayed("%HEATING_CONTROL","%WEEKDAYTIMER","%TIME","%NAME","%EVENT")
the parameters %HEATING_CONTROL(timer name) %TIME %NAME(device name) %EVENT are replaced at runtime by the correct value.
attr wd delayedExecutionCond isDelayed("%HEATING_CONTROL","%WEEKDAYTIMER","%TIME","%NAME","%EVENT")
Die Parameter %HEATING_CONTROL(timer Name) %TIME %NAME(device Name) %EVENT werden zur Laufzeit durch die echten Werte ersetzt.
my %specials = ( "%NAME" => $hash->{DEVICE}, "%EVENT" => $newParam);
"%NAME" => $hash->{DEVICE},
my %specials = ( "%NAME" => $hash->{DEVICE}, "%EVENT" => $newParam);
<code>%EVENT</code> (same as <code>%</code>), <code>%NAME</code> (same
attr wd delayedExecutionCond isDelayed("%HEATING_CONTROL","%WEEKDAYTIMER","%TIME","%NAME","%EVENT")
the parameter %WEEKDAYTIMER(timer name) %TIME %NAME(device name) %EVENT are replaced at runtime by the correct value.
Gruß
Karl
Zitat von: schka17 am 17 November 2015, 16:34:41
Bevor ich update versuche ich mich schlau zu machen worauf ich aufpassen muss, bei einem in mehreren Jahren gewachsenem System gibts doch sehr viele Altlasten. Ich bin eben dabei die letzten %'s und @@'s zu entfernen und habe jetzt noch eine Frage um ganz sicher zu gehen.
Das bezieht sich doch definitiv nur auf notify's, oder?
Nein, nicht nur, siehe auch Anmerkung von Rudi hier http://forum.fhem.de/index.php/topic,44141.msg359996.html#msg359996 (http://forum.fhem.de/index.php/topic,44141.msg359996.html#msg359996)