Dauerhaft Perl-Warnungen vermutlich aus logProxy

Begonnen von Fakenius, 04 April 2024, 10:02:00

Vorheriges Thema - Nächstes Thema

Fakenius

Hallo, seit Monaten und auch in der aktuellen Version finde ich viele dieser Warnungen im Log:
PERL WARNING: Argument "undef" isn't numeric in subtraction (-) at ./FHEM/99_Utils.pm line 114.Die Warnung resultiert daraus, dass SVG_time_to_sec() mit dem String (!) "undef" aufgerufen wird, was nicht abgefangen wird.
Das Stacktrace dazu: 2024.04.03 22:06:33 1: stacktrace:
2024.04.03 22:06:33 1:     main::__ANON__                      called by ./FHEM/99_Utils.pm (114)
2024.04.03 22:06:33 1:     main::SVG_time_to_sec               called by ./FHEM/98_logProxy.pm (470)
2024.04.03 22:06:33 1:     main::logProxy_shiftTime            called by ./FHEM/98_logProxy.pm (941)
2024.04.03 22:06:33 1:     main::logProxy_Get                  called by fhem.pl (3985)
2024.04.03 22:06:33 1:     main::CallFn                        called by fhem.pl (2035)
2024.04.03 22:06:33 1:     main::CommandGet                    called by fhem.pl (1282)
2024.04.03 22:06:33 1:     main::AnalyzeCommand                called by ./FHEM/01_FHEMWEB.pm (2866)
2024.04.03 22:06:33 1:     main::FW_fC                         called by ./FHEM/98_SVG.pm (1270)
2024.04.03 22:06:33 1:     main::SVG_getData                   called by ./FHEM/98_SVG.pm (1234)
2024.04.03 22:06:33 1:     main::SVG_doShowLog                 called by ./FHEM/98_SVG.pm (1127)
2024.04.03 22:06:33 1:     main::SVG_showLog                   called by ./FHEM/01_FHEMWEB.pm (1016)
2024.04.03 22:06:33 1:     main::FW_answerCall                 called by ./FHEM/01_FHEMWEB.pm (609)
2024.04.03 22:06:33 1:     main::FW_Read                       called by fhem.pl (3985)
2024.04.03 22:06:33 1:     main::CallFn                        called by fhem.pl (786)2024.04.03 22:06:33 1: stacktrace:
2024.04.03 22:06:33 1:     main::__ANON__                      called by ./FHEM/99_Utils.pm (114)
2024.04.03 22:06:33 1:     main::SVG_time_to_sec               called by ./FHEM/98_logProxy.pm (470)
2024.04.03 22:06:33 1:     main::logProxy_shiftTime            called by ./FHEM/98_logProxy.pm (941)
2024.04.03 22:06:33 1:     main::logProxy_Get                  called by fhem.pl (3985)
2024.04.03 22:06:33 1:     main::CallFn                        called by fhem.pl (2035)
2024.04.03 22:06:33 1:     main::CommandGet                    called by fhem.pl (1282)
2024.04.03 22:06:33 1:     main::AnalyzeCommand                called by ./FHEM/01_FHEMWEB.pm (2866)
2024.04.03 22:06:33 1:     main::FW_fC                         called by ./FHEM/98_SVG.pm (1270)
2024.04.03 22:06:33 1:     main::SVG_getData                   called by ./FHEM/98_SVG.pm (1234)
2024.04.03 22:06:33 1:     main::SVG_doShowLog                 called by ./FHEM/98_SVG.pm (1127)
2024.04.03 22:06:33 1:     main::SVG_showLog                   called by ./FHEM/01_FHEMWEB.pm (1016)
2024.04.03 22:06:33 1:     main::FW_answerCall                 called by ./FHEM/01_FHEMWEB.pm (609)
2024.04.03 22:06:33 1:     main::FW_Read                       called by fhem.pl (3985)
2024.04.03 22:06:33 1:     main::CallFn                        called by fhem.pl (786)

In der fhem.pl finden sich eine Reihe dieser Stringzuweisungen ("undef").

Ich habe Zeile 114 in ./FHEM/99_Utils.pm wie folgt erweitert: if(!$str || $str eq 'undef') {Damit ist Ruhe.

Vielleicht hat ein sich zuständig fühlender Entwickler Interesse, dem nachzugehen oder das einfach so erweitert einzuchecken!?

Grüße
Joachim
FS20, Homematic (DebMatic), Zigbee (deCONZ), LaCrosse, selbstgebaute Sensoren und Aktoren via MQTT
 (CUL, HB-RF-USB-2, Jeelink, SIGNALDuino, ConBee III)

JoWiemann

Hallo Jochen,

von wo wird den SVG_time_to_sec($) mit dem Parameter "undef" aufgerufen. Dass ist doch das eigentliche Problem. Hast Du mal deine *.gplot und Deine fhem.cfg nach "undef" durchsucht?

Im Perl Universum ist undef oder undef() eine Funktion und setzt den Wert einer Variablen auf "nicht definiert". Der richtige Aufruf der SVG_time_to_sec($) wäre also SVG_time_to_sec(undef) und nicht SVG_time_to_sec("undef").

Grüße Jörg
Jörg Wiemann

Slave: RPi B+ mit 512 MB, COC (868 MHz), CUL V3 (433.92MHz SlowRF); FHEMduino, Aktuelles FHEM

Master: CubieTruck; Debian; Aktuelles FHEM

Fakenius

Hallo Jörg,

die Aufrufkaskade ist ja im Stacktrace zu sehen. Da ist nichts "von mir" dabei. Und ja, ich habe mehrfach nach "undef" gesucht. Wie ich geschrieben habe, findet sich z.B. in der fhem.pl in Zeile 2604 die Zuweisung "undef" (als String):$lev+2, " ", defined($v) ? $v:"undef"); Von so etwas wird es vermutlich irgendwo herkommen. Es schadet somit nicht, in der SVG_time_to_sec($) entsprechend abzufangen.
FS20, Homematic (DebMatic), Zigbee (deCONZ), LaCrosse, selbstgebaute Sensoren und Aktoren via MQTT
 (CUL, HB-RF-USB-2, Jeelink, SIGNALDuino, ConBee III)

betateilchen

#3
Zitat von: Fakenius am 04 April 2024, 11:52:05Wie ich geschrieben habe, findet sich z.B. in der fhem.pl in Zeile 2604 die Zuweisung "undef" (als String):

Ja. Und an der Stelle ist das so auch völlig korrekt, weil dieser String auch als String ausgegeben wird.

Zitat von: Fakenius am 04 April 2024, 11:52:05Von so etwas wird es vermutlich irgendwo herkommen.

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

betateilchen

Zeig mal bitte das raw def Deines SVG devices.
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

Fakenius

Zitat von: betateilchen am 04 April 2024, 14:30:06Zeig mal bitte das raw def Deines SVG devices.

defmod SVG_Regensensor SVG FileLog_Wetterdaten:rhSVG_Regensensor:CURRENT
attr SVG_Regensensor captionPos auto
attr SVG_Regensensor label "pro Tag [mm]"::"pro Stunde [mm]"
attr SVG_Regensensor room Wetter

setstate SVG_Regensensor initialized
... das wird Dich wohl nicht weiterbringen ;-)  Aber ich habe nach dem Ausschlussverfahren herausbekommen, dass es offensichtlich aus dieser Zeile aus der zugehörigen .gplot kommt:
#lp FileLog:FileLog_Wetterdaten,offset=60,predict,clip:4:SD_WS_115_0.statRainDay\x3a::Ich forsche mal weiter ...

FS20, Homematic (DebMatic), Zigbee (deCONZ), LaCrosse, selbstgebaute Sensoren und Aktoren via MQTT
 (CUL, HB-RF-USB-2, Jeelink, SIGNALDuino, ConBee III)

Fakenius

Habe ein erstes 'Forschungsergebnis':

die sub logProxy_shiftTime($$) in der 98_logProxy.pm ist diejenige, die SVG_time_to_sec mit "undef" aufruft und damit die Warning verursacht.

Zu mehr habe ich aber heute keine Zeit. Schönen Abend.
FS20, Homematic (DebMatic), Zigbee (deCONZ), LaCrosse, selbstgebaute Sensoren und Aktoren via MQTT
 (CUL, HB-RF-USB-2, Jeelink, SIGNALDuino, ConBee III)

Fakenius

Hatte doch noch etwas Zeit. Das "undef" kommt aus den Zeilen 941-942 in der 99_logProxy.pm:
      $main::data{"firstdate1"} = logProxy_shiftTime($main::data{"firstdate1"},$offset.$offset_scale) if( $offset );
      $main::data{"currdate1"} = logProxy_shiftTime($main::data{"currdate1"},$offset.$offset_scale) if( $offset );
FS20, Homematic (DebMatic), Zigbee (deCONZ), LaCrosse, selbstgebaute Sensoren und Aktoren via MQTT
 (CUL, HB-RF-USB-2, Jeelink, SIGNALDuino, ConBee III)

betateilchen

Zitat von: Fakenius am 04 April 2024, 16:07:21... das wird Dich wohl nicht weiterbringen

Doch, das hat mich schon weitergebracht. Zum Zeitpunkt meiner Frage wusste ich schon, dass die Meldung durch eine Offset Berechnung verursacht wird. Meine Frage zielte deshalb darauf ab, herauszufinden, ob Du ein Attribut mit einem offset gesetzt hast - was aber nicht der Fall ist.

In diesem Fall wäre meine nächste Frage nach dem Inhalt des gplot-Files gewesen, das hast Du ja gleich mit beantwortet und sogar genau die Zeile geliefert, die ich sehen wollte - die mit einem Offset.

Zitat von: Fakenius am 04 April 2024, 16:32:33die sub logProxy_shiftTime($$) in der 98_logProxy.pm ist diejenige, die SVG_time_to_sec mit "undef" aufruft

Noch immer glaube ich nicht daran, dass die Funktion mit "undef" (als String) aufgerufen wird.
Bau doch mal in der SVG_time_to_sec() eine Debug Ausgabe ein, damit man sieht, womit die Funktion wirklich aufgerufen wird.
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

rudolfkoenig

logProxy_shiftTime ruft SVG_time_to_sec mit einem String auf, was nicht wie YYYY-MM-DD_HH:MM:SS aufgebaut ist, sonder eher wie AAAA.
Dadurch wird $m (entspricht MM) zu undef, und perl beschwert sich bei $m-1.

Beim logProxy_shiftTime Aufruf in der Zeile 941 hat also $main::data{"firstdate1"} das falsche Format.
firstdate1 wird in FileLog_get berechnet, offensichtlich gelang das in diesem Fall nicht, z.Bsp. weil im abgefragten Intervall keine Daten waren.

Fakenius

Zitat von: rudolfkoenig am 04 April 2024, 23:03:23... Beim logProxy_shiftTime Aufruf in der Zeile 941 hat also $main::data{"firstdate1"} das falsche Format.
firstdate1 wird in FileLog_get berechnet, offensichtlich gelang das in diesem Fall nicht, z.Bsp. weil im abgefragten Intervall keine Daten waren.

Das entspricht genau meiner "Erkenntnis", die ich durch Einbau von (vielen) Debug-Ausgaben erlangt habe ;-)

Ich klinke mich hier aus. Das Problem ist erkannt.

Schönes Wochenende
Joachim
FS20, Homematic (DebMatic), Zigbee (deCONZ), LaCrosse, selbstgebaute Sensoren und Aktoren via MQTT
 (CUL, HB-RF-USB-2, Jeelink, SIGNALDuino, ConBee III)