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