fhem.pl Problem durch Exponentialschreibweise

Begonnen von Joachim, 14 September 2015, 15:48:39

Vorheriges Thema - Nächstes Thema

Joachim

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
FHEM aktuellste Version auf FB 7570 und 7390 mit Zebradem Toolbox Freetz
FHEM auf Raspberry
1-Wire mit LinkUSBi und Rs-Pi ds2482-800  1-Wire-9 Board; Max mit Cube, HMLAN
div. 1-Wire Sensoren; MAX-Thermostaten; Homematic-Komponenten, Zehnder KWL über RS-232

henryk

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.

Joachim

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
FHEM aktuellste Version auf FB 7570 und 7390 mit Zebradem Toolbox Freetz
FHEM auf Raspberry
1-Wire mit LinkUSBi und Rs-Pi ds2482-800  1-Wire-9 Board; Max mit Cube, HMLAN
div. 1-Wire Sensoren; MAX-Thermostaten; Homematic-Komponenten, Zehnder KWL über RS-232

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
FHEM aktuellste Version auf FB 7570 und 7390 mit Zebradem Toolbox Freetz
FHEM auf Raspberry
1-Wire mit LinkUSBi und Rs-Pi ds2482-800  1-Wire-9 Board; Max mit Cube, HMLAN
div. 1-Wire Sensoren; MAX-Thermostaten; Homematic-Komponenten, Zehnder KWL über RS-232

stromer-12

Das Problem hatte ich auch schon mal vor längerer Zeit hier gepostet.
FHEM (SVN) auf RPi1B mit HMser | ESPLink
FHEM (SVN) virtuell mit HMLAN | HMUSB | CUL

rudolfkoenig

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.

henryk

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.