FHEM Forum

FHEM => Anfängerfragen => Thema gestartet von: swifty am 08 April 2014, 20:27:41

Titel: gelöst: Unterschiede notify und at für perl Befehle? (z.B. Arrays, sprintf())
Beitrag von: swifty am 08 April 2014, 20:27:41
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
Titel: Antw:Unterschiede notify und at für perl Befehle? (z.B. Arrays, sprintf())
Beitrag von: betateilchen am 08 April 2014, 20:31:34
es wäre schon hilfreich, wenn man das komplette at und das komplette notify sehen könnte...
Titel: Antw:Unterschiede notify und at für perl Befehle? (z.B. Arrays, sprintf())
Beitrag von: swifty am 08 April 2014, 21:13:59
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
Titel: Antw:Unterschiede notify und at für perl Befehle? (z.B. Arrays, sprintf())
Beitrag von: betateilchen am 08 April 2014, 21:28:32
mach mal zwei Prozentzeichen in Deinem sprintf

$Pdiff = sprintf("%%.2f",$Pdiff);;\
Titel: Antw:Unterschiede notify und at für perl Befehle? (z.B. Arrays, sprintf())
Beitrag von: swifty am 08 April 2014, 21:39:29
ist jetzt anders:
2014.04.08 21:38:40 3: KWL_Calc_pdiff_KWL return value: SCALAR(0x1d2ac9c)
Titel: Antw:Unterschiede notify und at für perl Befehle? (z.B. Arrays, sprintf())
Beitrag von: betateilchen am 08 April 2014, 21:52:25
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.

Titel: Antw:Unterschiede notify und at für perl Befehle? (z.B. Arrays, sprintf())
Beitrag von: swifty am 08 April 2014, 21:57:08
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.
Titel: Antw:Unterschiede notify und at für perl Befehle? (z.B. Arrays, sprintf())
Beitrag von: swifty am 16 April 2014, 19:51:54
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

Titel: Antw:Unterschiede notify und at für perl Befehle? (z.B. Arrays, sprintf())
Beitrag von: marvin78 am 17 April 2014, 07:35:28
Da ich keine Lust habe, das selbst einzubauen um die Logeinträge zu sehen:

Wie sehen deine Logeinträge denn aus?
Titel: Antw:Unterschiede notify und at für perl Befehle? (z.B. Arrays, sprintf())
Beitrag von: maxritti am 17 April 2014, 08:14:43
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.
Titel: Antw:Unterschiede notify und at für perl Befehle? (z.B. Arrays, sprintf())
Beitrag von: marvin78 am 17 April 2014, 08:26:09
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.
Titel: Antw:Unterschiede notify und at für perl Befehle? (z.B. Arrays, sprintf())
Beitrag von: maxritti am 17 April 2014, 08:40:33
Alles klar.
Also Command Ref mal wieder nicht vernünftig gelesen  ;)
Titel: Antw:Unterschiede notify und at für perl Befehle? (z.B. Arrays, sprintf())
Beitrag von: swifty am 17 April 2014, 20:26:09
Danke!
Titel: Antw:gelöst: Unterschiede notify und at für perl Befehle? (z.B. Arrays, sprintf())
Beitrag von: FHEMAN am 23 März 2015, 00:35:42
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 @@).