Moin @ all,
schon seit längerem störten mich die PERL WARNING's die durch Exponentialschreibweise im Log entstehen.
Vielleicht gibt es da eine einfache Lösung, wie man das allgemein beseitigen kann.
2015.09.14 14:31:30.912 1: PERL WARNING: Argument "-9.04265018054735-05" isn't numeric in subtraction (-) at fhem.pl line 3882.
2015.09.14 14:32:30.982 1: PERL WARNING: Argument "-9.13485735971612-05" isn't numeric in subtraction (-) at fhem.pl line 3882.
2015.09.14 14:34:31.124 1: PERL WARNING: Argument "-9.30104909796965-05" isn't numeric in subtraction (-) at fhem.pl line 3882.
2015.09.14 14:35:31.195 1: PERL WARNING: Argument "-4.4240606247368-05" isn't numeric in subtraction (-) at fhem.pl line 3882.
2015.09.14 14:36:31.267 1: PERL WARNING: Argument "-9.39882725349752-05" isn't numeric in subtraction (-) at fhem.pl line 3882.
2015.09.14 14:38:31.400 1: PERL WARNING: Argument "-4.56078509107552-05" isn't numeric in subtraction (-) at fhem.pl line 3882.
2015.09.14 14:39:31.486 1: PERL WARNING: Argument "-4.52420901337368-05" isn't numeric in subtraction (-) at fhem.pl line 3882.
2015.09.14 14:42:31.699 1: PERL WARNING: Argument "-4.62037306071755-05" isn't numeric in subtraction (-) at fhem.pl line 3882.
2015.09.14 15:14:34.616 1: PERL WARNING: Argument "9.40659900981093-05" isn't numeric in subtraction (-) at fhem.pl line 3882.
natürlich könnte man das in den entsprechenden Modulen durch begrenzen der Nachkommastellen abfangen, sinnvoller wäre es wahrscheinlich, das in der fhem.pl abzufangen.
Gruß Joachim
Hmm, das matcht bei mir nicht genau, aber kannst du bestätigen, dass deine Zeile 3882 diese hier ist:
} elsif( abs($value-$last_value) < $threshold ) {
Dann ist das Problem ein paar Zeilen drüber:
$value =~ s/[^\d\.\-]//g; # We expect only numbers here.
sollte
$value =~ s/[^\d\.\-eE]//g; # We expect only numbers here.
heissen, denn auch -9.04265018054735E-05 ist eine gültige Zahl in Perl.
Moin henryk,
du liegst richtig mit Deiner Vermutung, mit Deiner Vorgeschlagenen Änderung scheint es zu gehen.
Werde das mal einige Zeit beobachten.
Danke für Deine Hilfe.
@ Rudi,
was hälst Du davon, das so an allen entsprechenden Stellen in der fhem.pl einzubauen?
Gruß Joachim
Moin Rudi, moin henryk,
habe das ganze jetzt einige Tage beobachtet, die Perl Warnung ist weg.
hier mal das diff:
--- fhem.pl 2015-09-20 18:15:23.504407673 +0200
+++ fhem_neu.pl 2015-09-20 18:14:13.471462648 +0200
@@ -3876,7 +3876,7 @@
&& $eocrv[0] =~ m/.*:(.*)/ ) {
my $threshold = $1;
- $value =~ s/[^\d\.\-]//g; # We expect only numbers here.
+ $value =~ s/[^\d\.\-eE]//g; # We expect only numbers here.
my $last_value = $hash->{".attreocr-threshold$reading"};
if( !defined($last_value) ) {
$hash->{".attreocr-threshold$reading"} = $value;
wäre schön, wenn Du, Rudi, es einbauen könntest.
Gruß Joachim
Das Problem hatte ich auch schon mal vor längerer Zeit hier gepostet.
Um es klar zu sagen: das Problem betrifft Faelle mit event-on-change-reading in der Variante mit threshold, wo die Eingangsdaten in der exponentiellen Schreibweise (1.5e-5) reinkommen.
Der vorgeschlagene Patch verursacht leider auch neue Probleme:
1 liter -> 1e
1 feet -> 1ee
open -> e
Ich habe den vorgeschlagenen Patch erweitert, damit es auch in den erwaehnten Faellen funktioniert, bitte testen. Ja, es ist mir bewusst, dass es immer noch nicht perfekt ist, z.Bsp. wird "1.5e-5 liter" ignoriert.
Ja, na gut. Was du jetzt eingebaut hast ist so komplex, dass ich auf Anhieb gar nicht sagen kann, was es tut. Es kommt natürlich alles auf das Ziel an. Wenn das Ziel ist, die erste Zahl in einem Wert zu extrahieren, dann kann man das natürlich auch mit einem einzigen Regex relativ korrekt erledigen (jetzt nur für Dezimalzahlen, Hex, Binär und Oktal hat auch der alte Code nicht gekonnt):
$value =~ s/^.*?([+-]?\d*\.?\d+(?:e[+-]?\d+)?).*$/$1/si;
Das verabeitet zum Beispiel "content: .3E6 liter" problemlos.