Autor Thema: Bug bei der Verwendung von TimeSeries in fhem.pl  (Gelesen 533 mal)

Offline mumpitzstuff

  • Developer
  • Hero Member
  • ****
  • Beiträge: 1170
Bug bei der Verwendung von TimeSeries in fhem.pl
« am: 04 November 2018, 23:54:34 »
Wenn man sich einen event-aggregator z. B. wie folgt anlegt:

attr Revolt_5d31 event-aggregator power::none:median:120,energy::none:median:120,avgpower::none:median:120
dann kommt es öfter zu folgendem Fehler im Logfile:

2018.11.01 11:58:07 1: PERL WARNING: Argument "" isn't numeric in numeric ge (>=) at FHEM/TimeSeries.pm line 265.
2018.11.01 11:58:07 1: stacktrace:
2018.11.01 11:58:07 1:     main::__ANON__                      called by FHEM/TimeSeries.pm (265)
2018.11.01 11:58:07 1:     TimeSeries::elapsed                 called by fhem.pl (4719)
2018.11.01 11:58:07 1:     main::readingsBulkUpdate            called by ./FHEM/19_Revolt.pm (138)
2018.11.01 11:58:07 1:     main::Revolt_Parse                  called by fhem.pl (3795)
2018.11.01 11:58:07 1:     main::Dispatch                      called by ./FHEM/00_CUL.pm (948)
2018.11.01 11:58:07 1:     main::CUL_Parse                     called by ./FHEM/00_CUL.pm (832)
2018.11.01 11:58:07 1:     main::CUL_Read                      called by fhem.pl (3599)
2018.11.01 11:58:07 1:     main::CallFn                        called by fhem.pl (726)

Die Ursache ist eigentlich ganz simpel. In fhem.pl wird ein TimeSeries Objekt erzeugt und dabei ein Parameter autoreset übergeben.

      my (undef,$duration,$method,$function,$holdTime) = split(":", $v[0], 5);
      my $ts;
      if(defined($readings->{".ts"})) {
        $ts= $readings->{".ts"};
      } else {
        require "TimeSeries.pm";
        $ts= TimeSeries->new( { method => $method,
                                autoreset => $duration,
                                holdTime => $holdTime } );

Dummerweise wird hier nicht geprüft, ob $duration nicht eventuell ein Leerstring ist und dieser Leerstring wird dann übergeben. Innerhalb von TimeSeries wird autoreset aber nur mit defined überprüft, was dann in der elapsed Methode von TimeSeries zum Fehler führt. Man müsste in fhem.pl $defined also in ein undef umwandeln, falls defined ein Leerstring enthält.
Man müsste daher diesen Code:

        require "TimeSeries.pm";
        $ts= TimeSeries->new( { method => $method,
                                autoreset => $duration,
                                holdTime => $holdTime } );

durch eventuell sowas ersetzen:

        require "TimeSeries.pm";
        $ts= TimeSeries->new( { method => $method,
                                autoreset => (looks_like_number($duration) ? $duration : undef),
                                holdTime => $holdTime } );

Ich bin mir nicht ganz sicher, aber eventuell müsste man für holdtime sowas ähnliches auch machen? Ist bei mir immer gesetzt, deshalb habe ich keine Ahnung...

Offline mumpitzstuff

  • Developer
  • Hero Member
  • ****
  • Beiträge: 1170
Antw:Bug bei der Verwendung von TimeSeries in fhem.pl
« Antwort #1 am: 15 November 2018, 13:12:00 »
Besteht kein Interesse das Problem zu beheben? Soll/Kann ich noch etwas beisteuern?

Online CoolTux

  • Developer
  • Hero Member
  • ****
  • Beiträge: 17210
Antw:Bug bei der Verwendung von TimeSeries in fhem.pl
« Antwort #2 am: 22 November 2018, 15:31:43 »
Interessant finde ich das sonst noch keiner sowas gemeldet hat. Scheint eher selten gebraucht zu werden.
Ich stupse es aber mal an da ich den "Fehler" Codetechn. mir erklären/nachvollziehen kann.
Du musst nicht wissen wie es geht! Du musst nur wissen wo es steht, wie es geht.
Support me to buy new test hardware for development: https://www.paypal.me/MOldenburg
Mein GitHub: https://github.com/LeonGaultier
kein Support für cfg Editierer

Offline mumpitzstuff

  • Developer
  • Hero Member
  • ****
  • Beiträge: 1170
Antw:Bug bei der Verwendung von TimeSeries in fhem.pl
« Antwort #3 am: 22 November 2018, 16:26:15 »
Es gab dazu 2-3 Erwähnungen im Forum. Wenn man nach timeseries sucht, wird man fündig.