PERL WARNING: Use of uninitialized value $d in hash element at fhem.pl line 4096

Begonnen von Bitzer, 18 August 2017, 11:07:13

Vorheriges Thema - Nächstes Thema

Bitzer

Hallo,

nach dem heutigen Update habe ich folgende Fehlermeldungen nach jedem Neustart im log. Das ist nur ein Auszug, es sind noch einige mehr...
Kann mir jemand weiterhelfen wo das Problem liegt? Ich habe keine Idee...

Danke und Gruß
Oli

PERL WARNING: Use of uninitialized value $d in hash element at fhem.pl line 4096, <$fh> line 175.
2017.08.18 10:54:02 1: stacktrace:
2017.08.18 10:54:02 1:     main::__ANON__                      called by fhem.pl (4096)
2017.08.18 10:54:02 1:     main::AttrVal                       called by ./FHEM/10_EnOcean.pm (725)
2017.08.18 10:54:02 1:     main::EnOcean_Define                called by fhem.pl (3433)
2017.08.18 10:54:02 1:     main::CallFn                        called by fhem.pl (1919)
2017.08.18 10:54:02 1:     main::CommandDefine                 called by fhem.pl (1170)
2017.08.18 10:54:02 1:     main::AnalyzeCommand                called by fhem.pl (1024)
2017.08.18 10:54:02 1:     main::AnalyzeCommandChain           called by fhem.pl (1305)
2017.08.18 10:54:02 1:     main::CommandInclude                called by fhem.pl (531)
2017.08.18 10:54:03 1: PERL WARNING: Use of uninitialized value $d in hash element at fhem.pl line 4096, <$fh> line 216.
2017.08.18 10:54:03 1: stacktrace:
2017.08.18 10:54:03 1:     main::__ANON__                      called by fhem.pl (4096)
2017.08.18 10:54:03 1:     main::AttrVal                       called by ./FHEM/10_EnOcean.pm (725)
2017.08.18 10:54:03 1:     main::EnOcean_Define                called by fhem.pl (3433)
2017.08.18 10:54:03 1:     main::CallFn                        called by fhem.pl (1919)
2017.08.18 10:54:03 1:     main::CommandDefine                 called by fhem.pl (1170)
2017.08.18 10:54:03 1:     main::AnalyzeCommand                called by fhem.pl (1024)
2017.08.18 10:54:03 1:     main::AnalyzeCommandChain           called by fhem.pl (1305)
2017.08.18 10:54:03 1:     main::CommandInclude                called by fhem.pl (531)
2017.08.18 10:54:03 1: PERL WARNING: Use of uninitialized value $d in hash element at fhem.pl line 4096, <$fh> line 232.
2017.08.18 10:54:03 1: stacktrace:
2017.08.18 10:54:03 1:     main::__ANON__                      called by fhem.pl (4096)
2017.08.18 10:54:03 1:     main::AttrVal                       called by ./FHEM/10_EnOcean.pm (725)
2017.08.18 10:54:03 1:     main::EnOcean_Define                called by fhem.pl (3433)
2017.08.18 10:54:03 1:     main::CallFn                        called by fhem.pl (1919)
2017.08.18 10:54:03 1:     main::CommandDefine                 called by fhem.pl (1170)
2017.08.18 10:54:03 1:     main::AnalyzeCommand                called by fhem.pl (1024)
2017.08.18 10:54:03 1:     main::AnalyzeCommandChain           called by fhem.pl (1305)
2017.08.18 10:54:03 1:     main::CommandInclude                called by fhem.pl (531)
2017.08.18 10:54:03 1: PERL WARNING: Use of uninitialized value $d in hash element at fhem.pl line 4096, <$fh> line 248.
2017.08.18 10:54:03 1: stacktrace:
2017.08.18 10:54:03 1:     main::__ANON__                      called by fhem.pl (4096)
2017.08.18 10:54:03 1:     main::AttrVal                       called by ./FHEM/10_EnOcean.pm (725)
2017.08.18 10:54:03 1:     main::EnOcean_Define                called by fhem.pl (3433)
2017.08.18 10:54:03 1:     main::CallFn                        called by fhem.pl (1919)
2017.08.18 10:54:03 1:     main::CommandDefine                 called by fhem.pl (1170)
2017.08.18 10:54:03 1:     main::AnalyzeCommand                called by fhem.pl (1024)
2017.08.18 10:54:03 1:     main::AnalyzeCommandChain           called by fhem.pl (1305)
2017.08.18 10:54:03 1:     main::CommandInclude                called by fhem.pl (531)

klaus.schauer

Im log finden sich, so verstehe ich das, Aufrufe der zentralen Routine AttrVal durch EnOcean. Kann mir mal jemand erklären, ob der Fehler ggf. mit den Aufrufen zusammenhängen kann.

Das EnOcean-Modul wurde seit dem 27. März nicht mehr angepasst. Gibt es grundlegende Änderungen in den zentralen Modulen, die Auswirkungen auf das EnOcean Modul haben und sind deshalb in dem Modul Anpassungen notwendig?

rudolfkoenig

Nein, keine Aenderungen.
In diesem Fall wurde AttrVal mit einem undefinierten Geraet ($d) aufgerufen, und das war auch frueher unzulaessig.

klaus.schauer

Bitte mal 00_TCM auf die Vorgängerversion zurücksetzen, siehe Anlage. 10_EnOcean ruft auch Attribute des Transceivers aus 00_TCM auf. Vielleicht müssen wir dort suchen. Das Modul habe ich kürzlich aktualisiert.

Bitzer

Leider auch mit der alten Version noch das gleiche Verhalten. Vielleicht ist der Fehler auch schon älter, da ich länger keine Update gemacht hatte (letzter Stand war von Mai 2016).
Gibt es noch etwas was ich zur Eingrenzung des Fehlers machen kann?

Bitzer

Hallo Klaus,

ich habe inzwischen durch Analyse der Zeilennummerierung in der fhem.cfg herausgefunden, dass der Fehler scheinbar jedesmal beim Aufruf von

define Geraet_xyz EnOcean 01234ABCD

erzeugt wird.

Edit:
Außerdem habe ich mir die fhem.pl anschaut. In der Zeile 4096, in der der Fehler auftritt gab es eine Änderung am 11.4.17 "fhem.pl: make AttrVal parameter check identical to ReadingsVal (Forum..."

Screenshot Github im Anhang. Wenn ich den alten Code wieder einfüge ist der Fehler weg. Was ich nicht verstehe, warum tritt die Fehlermeldung scheinbar nur bei mir auf?

Hilft das bei der Fehlersuche evtl. weiter?

Danke und Gruß
Oli

klaus.schauer

Danke für die Fehlersuche. Zu den Änderungen in fhem.pl und ggf. den Auswirkungen kann Rudi sicherlich was sagen.

Welche Attribute sind denn im Device Geraet_xyz gesetzt? Scheint ja ein manuell angelegtes "Test"-Device zu sein.

Bitzer

Das Gerät war nur ein Beispiel. Tatsächlich kommt der Fehler bei allen definierten Enocean Devices. Hier mal ein konkretes Beispiel aus der fhem.cfg:

define Temp_Aussen EnOcean 04010815
attr Temp_Aussen IODev TCM310_0
attr Temp_Aussen manufID 00D
attr Temp_Aussen group Aussensensor
attr Temp_Aussen icon icoKLIMA
attr Temp_Aussen room 01_Licht,02_Rolladen,03_Temperatur
attr Temp_Aussen fp_Dachgeschoss 100,220,4,Temp_Aussen
attr Temp_Aussen fp_Erdgeschoss 100,220,4,Temp_Aussen
attr Temp_Aussen subType tempHumiSensor.02

gagamicha

Hallo zusammen ,

kann ich bei mir bestätigen ist mir auch aufgefallen
bei jedem

define XYZ EnOcean FFCCXYZ

kommt bei mir auch die Pearl Warnung

christoph.kaiser.in

#9
Hallo,

die Warnung kam bei mir auch - die Variable $autocreateName wird im Modul "10_EnOcean.pm" in der Zeile 715 definiert und vorbelegt. In Zeile 725 wird sie als Übergabeparameter in der Funktion AttrVal() verwendet. Dort ist sie dann im Fall der Warnung nicht mehr definiert.

Als Ursache habe ich die while() Schleife in den Zeilen 722ff gefunden. Dort würde sie für ein element des hash %defs des Typs "autocreate" mit dem im Hash gespeicherten Namen belegt. Für den Fall, dass der Hash kein Element des Typs "autocreate" enthält, bleibt sie wohl undefiniert.

Ich habe folgenden Code zur Analyse und Korrektur als Ersatz der Zeilen 720 bis 725 eingefügt:

  Log3 $name, 5, "10_EnOcean: Defaultvalues: $autocreateName, $autocreateDeviceRoom, $name"; # CK: added 17.01.2018 for debugging purposes
  Log3 $name, 5, "10_EnOcean: Commandline: " . join(' ', @a); # CK: added 17.01.2018 for debugging purposes
  if(@a > 2 && @a < 5) {
    # find autocreate device
    while (($autocreateName, $autocreateHash) = each(%defs)) {
  Log3 $name, 5, "10_EnOcean: While Schleife: $autocreateName, $autocreateHash, $defs{$autocreateName}{TYPE}"; # CK: added 17.01.2018 for debugging purposes
      last if ($defs{$autocreateName}{TYPE} eq "autocreate");
    }
    Log3 $name, 5, "10_EnOcean: Defaultvalues $autocreateName , $autocreateDeviceRoom, $name"; # CK: added 17.01.2018 for debugging purposes
    $autocreateDeviceRoom = AttrVal($autocreateName, "device_room", $autocreateDeviceRoom) if (defined $autocreateName); # CK: added 17.01.2018: "  if (defined $autocreateName)" to avoid warning message, due to undefined var $autocreateName
Log3 $name, 5, "10_EnOcean: Defaultvalues $autocreateName , $autocreateDeviceRoom, $name"; # CK: added 17.01.2018 for debugging purposes


Meine Lösung wäre also in Zeile 725 den schliessenden ";"  durch ein " if (defined $autocreateName);" zu ersetzen.

Evtl. kann sich ein FHEM EnOcean Guru dieses Thema noch einmal ansehen und eine professionelle Lösung implementieren ? - Danke !

Gruß
Christoph

klaus.schauer


klaus.schauer

Bitte geänderte Version von 10_EnOcean testen, Entwicklerversion siehe Anlage.

christoph.kaiser.in

#12
Hallo,

leider ist ein Test der Funktion aktuell nicht möglich, da XML::Simple auf meinem System nicht  verfügbar scheint.

Über apt-get ist es in der Distribution nicht verfügbar und über CPAN scheitert die Installation an der dependency XML::Parser::Expat, die sich bislang auf meinem Cubietruck/Armbian System nicht erstellen lässt.

...ich bleibe dran.

Gruß
Christoph

klaus.schauer

Mal mit

apt-get install libxml-simple-perl

versuchen.

Gehört die Bibliothek nicht eigentlich zum Standardumfang der PERL-Grundinstallation?

Anbei eine erweiterte Entwicklerversion in der fehlende XML-Routinen abgefangen und im LOG ein entsprechender Hinweis angezeigt wird. Die XML-Funktionen sind nicht für die Behebung des o. a. Fehlers sondern für andere neue Funktionen erforderlich.

christoph.kaiser.in

Hallo,

vielen Dank für die zusätzliche Anpassung! Andererseits sollte ich XML::Simple schnellstmöglich installieren, um für zukünftige Updates vorbereitet zu sein.

Die Installtion mit apt-get install libxml-simple-perl schlägt bei meiner Distribution fehl.

root@meinserver:~# apt-get install libxml-simple-perl
Reading package lists... Done
Building dependency tree
Reading state information... Done
Package libxml-simple-perl is not available, but is referred to by another package.
This may mean that the package is missing, has been obsoleted, or
is only available from another source

E: Package 'libxml-simple-perl' has no installation candidate


Die Installation via CPAN
root@meinserver:~# cpan XML::Simple schlug gestern abend wegen segmentation faults beim compilieren von XML::Parser::Expat fehl - da verabschiedet sich wohl meine SD Karte so langsam.

root@meinserver:~# apt-get install libexpat1-dev im Vorfeld sorgte für die erforderlichen Libraries.

Ich schaue mir die komplette Version inkl. XML an - die Neugier ist einfach zu groß ;)

Gruß
Christoph


christoph.kaiser.in

#15
Hallo,

die Änderungen zeigen Wirkung.

Vorher:
2018.01.25 20:11:37 2: EnOcean Cryptographic functions available.
2018.01.25 20:11:37 1: PERL WARNING: Use of uninitialized value $d in hash element at fhem.pl line 4178, <$fh> line 35.
2018.01.25 20:11:37 1: PERL WARNING: Use of uninitialized value $d in hash element at fhem.pl line 4178, <$fh> line 45.
2018.01.25 20:11:37 1: PERL WARNING: Use of uninitialized value $d in hash element at fhem.pl line 4178, <$fh> line 55.
2018.01.25 20:11:37 1: PERL WARNING: Use of uninitialized value $d in hash element at fhem.pl line 4178, <$fh> line 80.
2018.01.25 20:11:37 1: PERL WARNING: Use of uninitialized value $d in hash element at fhem.pl line 4178, <$fh> line 107.
2018.01.25 20:11:37 1: PERL WARNING: Use of uninitialized value $d in hash element at fhem.pl line 4178, <$fh> line 224.
2018.01.25 20:11:37 1: PERL WARNING: Use of uninitialized value $d in hash element at fhem.pl line 4178, <$fh> line 250.
2018.01.25 20:11:37 1: PERL WARNING: Use of uninitialized value $d in hash element at fhem.pl line 4178, <$fh> line 270.
2018.01.25 20:11:37 1: PERL WARNING: Use of uninitialized value $d in hash element at fhem.pl line 4178, <$fh> line 338.
2018.01.25 20:11:37 1: PERL WARNING: Use of uninitialized value $d in hash element at fhem.pl line 4178, <$fh> line 364.


Nachher:

2018.01.25 20:15:39 2: EnOcean Cryptographic functions available.
2018.01.25 20:15:39 2: EnOcean XML functions available.


Sonst bislang alles unauffällig - wie bisher. Die weiteren Änderungen sehe ich vor allem für Eltako Geräte und beim Einlernen wirksam ? Wie kann man die Ausgabe der Device Descriptions auslösen ?

Mal sehen, was beim Einlernen meiner weiteren Permundo PSC152-EO passiert ;). Das braucht allerdings noch etwas Zeit...

Danke für die schnelle Reaktion und Korrektur - war in der Fehlerwirkung nicht wirklich kritisch, da die Änderung ja nur die Warnung abfängt. Hatte ich auch so beim Lesen des Codes verstanden.

Gruß
Christoph



klaus.schauer

Zur zukünftige Abbildung und Nutzung herstellerspezifischer Erweiterungen in Fhem wurden grundlegende ReComm Funktionen erstellt, insbesondere für das Auslesen von Geräte- und Parameterbeschreibungen im XML-Format. Die eigentlichen Zusatzfunktionen, die darauf aufbauen, müssen aber noch erstellt werden. Einen Zeitplan dafür habe ich noch nicht.

Funktioniert die aktuelle 10_EnOcean-Entwicklerversion auch ohne die Einbindung des zusätzlichen Perl XML-Moduls?

christoph.kaiser.in

Hallo,

ja, sieht bei mir gut aus.

cpan App::cpanminus

danach

cpanm --uninstall XML::Simple

führt nach einem

shutdown restart

zu

2018.01.28 15:35:05 0: Server shutdown
2018.01.28 15:35:08 1: Including fhem.cfg
[...]
2018.01.28 15:35:12 2: EnOcean Cryptographic functions available.
2018.01.28 15:35:12 2: EnOcean XML functions are not available.
[...]
2018.01.28 15:35:14 2: EnOcean Anbau.Rolladen.Ost.Links XML functions are not available
2018.01.28 15:35:14 2: EnOcean Anbau.Tischlampe1 XML functions are not available


Ich würde sagen die Maskierung der XML Funktionen funktioniert...

Gruß
Christoph

drhirn

Zitat von: klaus.schauer am 24 Januar 2018, 09:14:15Gehört die Bibliothek nicht eigentlich zum Standardumfang der PERL-Grundinstallation?

Also, auf meinem Debian Stretch nicht. Habe gerade ein FHEM-Update gemacht und danach genau die Fehlermeldung "XML functions are not available" für jedes EnOcean-Gerät. Nach der Installation des Pakets libxml-simple-perl waren die dann wieder weg.