gelöst: Unterschiede notify und at für perl Befehle? (z.B. Arrays, sprintf())

Begonnen von swifty, 08 April 2014, 20:27:41

Vorheriges Thema - Nächstes Thema

swifty

Hallo,

ich habe das Phänomen, dass der komplett identische Code, der im at Kommando wunderbar funktioniert, in einem notify nur Unsinn macht.

z.B. der Code
$Pdiff = sprintf("%.2f",$Pdiff);

schneidet im at Kommando wunderbar die Nachkommastellen ab. in einem notify gibt der identische Code das hier aus:
.2f

Weiß jemand warum? Oder wie kann ich den Befehl im notify benutzen?

Noch schlimmer ist es mit arrays:
my @P1 = split(/ ...
funktioniert tadellos im at. Im notify gibt fhem seltsame Fehlermeldungen aus:
2014.04.07 21:45:31 3: KWL_calc_Pdiff_KWL return value: No such class KWL_Press2P1 at (eval 81) line 1, near "{  my KWL_Press2P1"
syntax error at (eval 81) line 1, near "my KWL_Press2P1 ="
Global symbol "@P1" requires explicit package name at (eval 81) line 1.
No such class KWL_Press2P2 at (eval 81) line 1, near "; my KWL_Press2P2"
syntax error at (eval 81) line 1, near "my KWL_Press2P2 ="
Global symbol "@P1" requires explicit package name at (eval 81) line 1.
Global symbol "@P2" requires explicit package name at (eval 81) line 1.


Gruß
swifty

betateilchen

es wäre schon hilfreich, wenn man das komplette at und das komplette notify sehen könnte...
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

swifty

gerne:

at (funktioniert):
define KWL_recal_pdiff1 at *02:18:10 { \
if (Value("KWL_online") eq "online") { \
my $P1 = Value("KWL_Press1");;\
my $P2 = Value("KWL_Press2");;\
my $Pdiff = $P1[1] - $P2[1];;\
$Pdiff = sprintf("%.2f",$Pdiff);;\
fhem ("set KWL_Poffs_KWL $Pdiff");;}\
}



notify (sprint f gibt nichts sinnvolles aus)
define KWL_Calc_pdiff_KWL notify KWL_Press2 { \
if (Value("KWL_online") eq "online") { \
my $P1 = Value("KWL_Press1");;\
my $P2 = Value("KWL_Press2");;\
my $Pdiff = $P1 - $P2;;\
$Pdiff = sprintf("%.2f",$Pdiff);;\
Log 3, $Pdiff;;\
fhem ("set KWL_Poffs_KWL $Pdiff");;}\
}

Als würgaround habe ich eine Round funktion in MyUtils die prima (und genauer) funktioniert.

die folgenden Befehle sind historisch, da ich das WBS modul zur Zeit anders behandle. Unter anderem, da es mit dem notify mir nicht möglich ist den String zu zerlegen.

bei den Arrays, das at funktioniert:
define KWL_recal_pdiff1 at *02:18:10 { \
if (Value("KWL_online") eq "online") { \
my @P1 = split(/ /, Value("KWL_Press1"));;\
my @P2 = split(/ /, Value("KWL_Press2"));;\
my $Pdiff = $P1[1] - $P2[1];;\
$Pdiff = sprintf("%.2f",$Pdiff);;\
fhem ("set KWL_Poffs_KWL $Pdiff");;}\
}


Als notify nicht (läuft gar nicht erst)
define KWL_recal_pdiff_notify KWL_Press2 { \
if (Value("KWL_online") eq "online") { \
my @P1 = split(/ /, Value("KWL_Press1"));;\
my @P2 = split(/ /, Value("KWL_Press2"));;\
my $Pdiff = $P1[1] - $P2[1];;\
$Pdiff = sprintf("%.2f",$Pdiff);;\
fhem ("set KWL_Poffs_KWL $Pdiff");;}\
}



Jan

betateilchen

mach mal zwei Prozentzeichen in Deinem sprintf

$Pdiff = sprintf("%%.2f",$Pdiff);;\
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

swifty

ist jetzt anders:
2014.04.08 21:38:40 3: KWL_Calc_pdiff_KWL return value: SCALAR(0x1d2ac9c)

betateilchen

Im Moment hab ich grade keine Lust mehr, Dir weitere Würmer aus der Nase zu ziehen, nur weil man Dich um jede Information, die man zum helfen braucht, anbetteln muss.

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

swifty

aber genau die Änderung:
define KWL_Calc_pdiff_KWL notify KWL_Press2 { \
if (Value("KWL_online") eq "online") { \
my $P1 = Value("KWL_Press1");;\
my $P2 = Value("KWL_Press2");;\
my $Pdiff = $P1 - $P2;;\
$Pdiff = sprintf("%%.2f",$Pdiff);;\
Log 3, $Pdiff;;\
fhem ("set KWL_Poffs_KWL $Pdiff");;}\
}


ergibt nur den anderen Fehlercode.

sorry.

swifty

Also so  möchte ich es nicht so gerne stehen lassen.

Die Frage für mich ist weiterhin wie im Topic: (Gibt es) Unterschiede notify und at für perl Befehle? (z.B. Arrays,  sprintf()).
Auch wenn perl für mich eine Fremdsprache ist (und vermutlich bleibt) habe ich für mich Wege gefunden meine Algorithmen zum laufen zu bringen.

Ich denke es gibt Unterschiede in der Befehlsausführung zwischen notify und at. Da ist die eigentliche Frage: Ist das so gewollt und richtig?

Vielleicht treten die Unterschiede nur bei mir auf, ich würde mich freuen wenn *irgendwer* das folgende Beispiel ausprobiert. In dem Beispiel wird bei mir der Code nicht gleich behandelt.

in der cfg:

define testnotify notify testdummy { \
my $testvar = "funktioniert dieser Kot ?";; \
my @testarray = split(/ /, $testvar);;\
my $testresult = $testarray[1] . " " . $testarray[2] . " " .$testarray[0]. ".";;\
Log 3, $testresult;;}
attr testnotify room test

define testdummy dummy
attr testdummy room test

define testat at +*00:01:00 { \
my $testvar = "funktioniert dieser Kot ?";; \
my @testarray = split(/ /, $testvar);;\
my $testresult = $testarray[1] . " " . $testarray[2] . " " .$testarray[0]. ".";;\
Log 3, $testresult;;}
attr testat room test



Das notify in fhem einfach triggern mit
set testdummy 1

Bei mir ist der Log Eintrag sehr unterschiedlich. Nur bei mir?

gruß
swifty


marvin78

Da ich keine Lust habe, das selbst einzubauen um die Logeinträge zu sehen:

Wie sehen deine Logeinträge denn aus?

maxritti

Gerade eben habe ich mal die beiden Definitionen in meiner Entwicklungsumgebung eingegeben:


ZitatNotify:

testdummy { my $testvar = "funktioniert dieser Kot ?"; my @testarray = split(/ /, $testvar); my $testresult = $testarray[1] . " " . $testarray[2] . " " .$testarray[0]. "."; Log 3, $testresult}


At:

+*00:01:00 { my $testvar = "funktioniert dieser Kot ?"; my @testarray = split(/ /, $testvar); my $testresult = $testarray[1] . " " . $testarray[2] . " " .$testarray[0]. "."; Log 3, $testresult}


Ehrlich gesagt bin ich da auch ein wenig überrascht wie die Ergebnisse aussehen:

ZitatNotify:

2014.04.17 08:06:48 3: testnotify return value: No such class testdummytestarray at (eval 48) line 1, near "; my testdummytestarray"
syntax error at (eval 48) line 1, near "my testdummytestarray ="
Global symbol "@testarray" requires explicit package name at (eval 48) line 1.
Global symbol "@testarray" requires explicit package name at (eval 48) line 1.
Global symbol "@testarray" requires explicit package name at (eval 48) line 1.


At:

2014.04.17 08:07:16 3: dieser Kot funktioniert.


Da der auszuführende Code doch der gleiche ist, hätte ich da wie wohl auch swifty mit den gleichen Logeinträgen gerechnet.

marvin78

Es liegt daran, dass "@" im notify verdoppelt werden muss (solange nicht $EVENT,$NAME... vorkommt). Im at ist das nicht nötig, da es nichts gibt, auf das sich das einzelne "@" beziehen könnte.

Das alles wird sich wohl hoffentlich ändern, wenn @,% etc. endlich wirklich raus fliegen, wie in der commandref angekündigt.

maxritti

Alles klar.
Also Command Ref mal wieder nicht vernünftig gelesen  ;)


FHEMAN

Oh mann, wer guckt sich nach ein paar Wochen noch die Definition von at und notify in der Commandref an? Wegen diesem Mist musste ich meine Liebste vor 2 Stunden alleine ins Bett schicken!!

Also nochmal für google und zukünftig geplagte:
at
{my @a = split(/\s+/, ReadingsVal(...));}
notify
{my @@a = split(/\s+/, ReadingsVal(...));}

FHEM Referenz:
Um % oder @ im Text selbst benutzen zu können, müssen sie verdoppelt werden (%% oder @@).
NUC7i5 | PROXMOX | FHEM 6.2 | 1 HMLAND | 2 UART | HM | LMS | HIFIBERRY | DOORBIRD | BLINK | BUDERUS | HUE | ALEXA | MILIGHT | LUFTDATENINFO | MQTT| ZIGBEE2MQTT | INDEGO | ROBOROCK | SMA | APC | OPENWB