73_km200.pm neu bringt FHEM zum Absturz

Begonnen von Roderich, 17 November 2022, 12:36:31

Vorheriges Thema - Nächstes Thema

Roderich

Nach dem Update heute startet FHEM nicht mehr.

2022.11.17 12:04:03 1: Including fhem.cfg
2022.11.17 12:04:04 3: WEB: port 8083 opened
2022.11.17 12:04:04 2: eventTypes: loaded 3719 lines from ./log/eventTypes.txt
2022.11.17 12:04:04 1: PERL WARNING: main::km200_GetDynService() called too early to check prototype at ./FHEM/73_km200.pm line 2572, <$fh> line 76.
2022.11.17 12:04:04 1: stacktrace:
2022.11.17 12:04:04 1:     main::__ANON__                      called by ./FHEM/73_km200.pm (2572)
2022.11.17 12:04:04 1:     (eval)                              called by fhem.pl (2757)
2022.11.17 12:04:04 1:     (eval)                              called by fhem.pl (2756)
2022.11.17 12:04:04 1:     main::CommandReload                 called by fhem.pl (2061)
2022.11.17 12:04:04 1:     main::LoadModule                    called by fhem.pl (2126)
2022.11.17 12:04:04 1:     main::CommandDefine                 called by fhem.pl (1274)
2022.11.17 12:04:04 1:     main::AnalyzeCommand                called by fhem.pl (1125)
2022.11.17 12:04:04 1:     main::AnalyzeCommandChain           called by fhem.pl (1413)
2022.11.17 12:04:04 1:     main::CommandInclude                called by fhem.pl (626)
2022.11.17 12:04:16 1: PERL WARNING: Use of uninitialized value $_ in string eq at ./FHEM/73_km200.pm line 482, <$fh> line 78.
2022.11.17 12:04:16 1: stacktrace:
2022.11.17 12:04:16 1:     main::__ANON__                      called by ./FHEM/73_km200.pm (482)
2022.11.17 12:04:16 1:     main::km200_Attr                    called by fhem.pl (3972)
2022.11.17 12:04:16 1:     main::CallFn                        called by fhem.pl (3194)
2022.11.17 12:04:16 1:     main::CommandAttr                   called by fhem.pl (1274)
2022.11.17 12:04:16 1:     main::AnalyzeCommand                called by fhem.pl (1125)
2022.11.17 12:04:16 1:     main::AnalyzeCommandChain           called by fhem.pl (1413)
2022.11.17 12:04:16 1:     main::CommandInclude                called by fhem.pl (626)
Can't call method "first_index" without a package or object reference at ./FHEM/73_km200.pm line 482, <$fh> line 78.


ich habe die alte Version wieder eingespielt. Damit läuft FHEM wieder.
Vielleich kann ja jemand den Fehler finden.

Sailor

Zitat von: Roderich am 17 November 2022, 12:36:31
Nach dem Update heute startet FHEM nicht mehr.
ich habe die alte Version wieder eingespielt. Damit läuft FHEM wieder.
Vielleich kann ja jemand den Fehler finden.

Lösche mal dein "DoNotPol" Attribut und versuche es nochmal mit der neuen Version.
Ich kann den Fehler bei mir nicht nachvollziehen.

Und dann bitte auch mal ein list mit in das Forum legen.

Gruß
    Sailor
******************************
Man wird immer besser...

Roderich

Beim zweiten Versuch hat es geklappt mit gelöschtem DoNotPol.
Es kommt beim Starten nur noch diese Meldung

2022.11.17 14:14:14 1: PERL WARNING: main::km200_GetDynService() called too early to check prototype at ./FHEM/73_km200.pm line 2572, <$fh> line 76.
2022.11.17 14:14:14 1: stacktrace:
2022.11.17 14:14:14 1:     main::__ANON__                      called by ./FHEM/73_km200.pm (2572)
2022.11.17 14:14:14 1:     (eval)                              called by fhem.pl (2757)
2022.11.17 14:14:14 1:     (eval)                              called by fhem.pl (2756)
2022.11.17 14:14:14 1:     main::CommandReload                 called by fhem.pl (2061)
2022.11.17 14:14:14 1:     main::LoadModule                    called by fhem.pl (2126)
2022.11.17 14:14:14 1:     main::CommandDefine                 called by fhem.pl (1274)
2022.11.17 14:14:14 1:     main::AnalyzeCommand                called by fhem.pl (1125)
2022.11.17 14:14:14 1:     main::AnalyzeCommandChain           called by fhem.pl (1413)
2022.11.17 14:14:14 1:     main::CommandInclude                called by fhem.pl (626)


Ansonsten scheint es zu Laufen  :)

Sailor

Danke für den Hinweis.

die PERL WARNING: main::km200_GetDynService() called too early to check prototype at ./FHEM/73_km200.pm line 2572, <$fh> line 76. habe ich schon gelöst.

Das Andere schau ich mir mal an...

Gruss
   Sailor
******************************
Man wird immer besser...

Roderich

DoNotPol kann bei mir nicht mehr gesetzt werden.

FHEM stürzt ab mit folgender Meldung

Can't call method "first_index" without a package or object reference at ./FHEM/73_km200.pm line 482

ergerd

Ich habe das gleiche Problem.

Grüße
ergerd
FHEM auf RasPi 4, CUNO, ZigBee, 1Wire2WLAN, DS2423, C-Control II, Buderus KM200, LaCrosseGateway, PCA301, ConBee II, LuftdatenInfo, OneWireGW, Div. ESPs u. Shellys

Beta-User

Könnt ihr den "elsif"-Zweig ab Zeile 448 mal testweise durch das hier ersetzen:

    elsif($a[2] eq 'DoNotPoll') {
        #my @KM200_DONOTPOLL   = ();
        my @temp              = @a;

        ### Stop the current timer
        RemoveInternalTimer($hash);
        Log3 $name, 4, $name. " : km200 - InternalTimer has been removed.";
       
        ### Delete the first 3 items of the array
        splice @temp, 0, 3;

        ### Insert empty field as minimum entry
        push @temp, "";
       
        ### Transform string entries seperated by blank into array
        my @KM200_DONOTPOLL = split m/\s+/, $temp[0];
        @KM200_DONOTPOLL //=();

        ### Remove trailing slash of each item if available
       
        ### For each item found in this empty parent directory
        for my $item (@KM200_DONOTPOLL) {
            ### Delete trailing slash
            $item =~ s/\/$//;
        }
       
        ### Save list of services not to be polled into hash
        @{$hash->{Secret}{KM200DONOTPOLL}} = @KM200_DONOTPOLL;

        ### Get original list of root services back
        @{$hash->{Secret}{KM200ALLSERVICES}} = @{$hash->{Secret}{KM200ALLSERVICESBACKUP}};
       
        ### For every blacklisted service
        for my $SearchWord(@KM200_DONOTPOLL) {
            last if @{$hash->{Secret}{KM200ALLSERVICES}}|| ref @{$hash->{Secret}{KM200ALLSERVICES}} ne 'ARRAY';
            ### Filter all blocked root services out of services to be polled
            my $FoundPosition = first_index{ $_ eq $SearchWord }@{$hash->{Secret}{KM200ALLSERVICES}};
            if ($FoundPosition >= 0) {
                splice(@{$hash->{Secret}{KM200ALLSERVICES}}, $FoundPosition, 1);
            }
        }
        ### Message for debugging purposes
        Log3 $name, 5, $name. "km200 module is only polling the following services! \n @{$hash->{Secret}{KM200ALLSERVICES}}";
        Log3 $name, 5, $name. "km200 module is NOT  polling the following services! \n @{$hash->{Secret}{KM200DONOTPOLL}}";
        Log3 $name, 4, $name. " : km200 - The following services will not be polled: ". $a[3];
       
        ### Interrupting all currently running Polling
        @{$hash->{Secret}{KM200DYNSERVICES}} = "";
        $hash->{temp}{ServiceCounterDyn} = 0;

        ### Delete all Readings
        fhem( "deletereading $name .*" );

        ### Re-start the sounding of  values from KM200 but wait the period of $hash->{POLLINGTIMEOUT} + 10s
        InternalTimer(gettimeofday()+$hash->{POLLINGTIMEOUT}+10, "km200_GetInitService", $hash, 1);
        Log3 $name, 4, $name. " : km200 - Sounding of services re-started after change of DoNotPoll attribute";
    }

Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: MiLight@ESP-GW, BT@OpenMQTTGw | MySensors: seriell, v.a. 2.3.1@RS485 | ZWave | ZigBee@deCONZ | SIGNALduino | MapleCUN | RHASSPY
svn: u.a MySensors, Weekday-&RandomTimer, Twilight,  div. attrTemplate-files

Sailor

#7
Hi BetaUser

Zitat von: Beta-User am 18 November 2022, 09:41:30
Könnt ihr den "elsif"-Zweig ab Zeile 448 mal testweise durch das hier ersetzen:

Danke für den Versuch. Da ich den Fehler nicht nachstellen kann, bin ich für jede Hilfe dankbar.

Um zusaetzlich die lästige Warnung im Log weg zu bekommen, fügt doch Testweise mal
sub km200_GetDynService($);
in Zeile 57 ein.

Gruß
    Sailor
******************************
Man wird immer besser...

Beta-User

Zitat von: Sailor am 18 November 2022, 10:12:47
Um zusaetzlich die lästige Warnung im Log weg zu bekommen, fügt doch Testweise mal
sub km200_GetDynService($);
Wir sollten uns mal über Perl unterhalten... Diese forward-Declarations sind echt nicht der aktuelle Stand der Dinge.
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: MiLight@ESP-GW, BT@OpenMQTTGw | MySensors: seriell, v.a. 2.3.1@RS485 | ZWave | ZigBee@deCONZ | SIGNALduino | MapleCUN | RHASSPY
svn: u.a MySensors, Weekday-&RandomTimer, Twilight,  div. attrTemplate-files

Beta-User

Würde mal alternativ zu der forward declaration vorschlagen, Zeile 2572 (bzw. 2574 nach Einfügen meines Code-Vorschlags) so zu fassen:
$init_done ? km200_GetDynService($hash) : InternalTimer(gettimeofday()+30, \&km200_GetDynService, $hash, 1);
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: MiLight@ESP-GW, BT@OpenMQTTGw | MySensors: seriell, v.a. 2.3.1@RS485 | ZWave | ZigBee@deCONZ | SIGNALduino | MapleCUN | RHASSPY
svn: u.a MySensors, Weekday-&RandomTimer, Twilight,  div. attrTemplate-files

Sailor

#10
Zitat von: Beta-User am 18 November 2022, 09:41:30
Könnt ihr den "elsif"-Zweig ab Zeile 448 mal testweise durch das hier ersetzen:
   
465 @KM200_DONOTPOLL //=();
485 my $FoundPosition = first_index{ $_ eq $SearchWord }@{$hash->{Secret}{KM200ALLSERVICES}};

Da bekomme ich an der Stelle folgende Fehlermeldung:


Can't modify private array in defined or assignment (//=) at .//FHEM/73_km200.pm line 465, near ");"
Type of arg 1 to List::MoreUtils::XS::firstidx must be block or sub {} (not reference constructor) at .//FHEM/73_km200.pm line 485, near "};"


Gruss
    Sailor
******************************
Man wird immer besser...

Sailor

Zitat von: Beta-User am 18 November 2022, 11:36:32
Würde mal alternativ zu der forward declaration vorschlagen, Zeile 2572 (bzw. 2574 nach Einfügen meines Code-Vorschlags) so zu fassen:
$init_done ? km200_GetDynService($hash) : InternalTimer(gettimeofday()+30, \&km200_GetDynService, $hash, 1);

Habe die forward-Deklaration auskommentiert und deine Code-Zeile wie von dir vorgeschlagen eingefügt.

Resultat bei Neustart:

2022.11.18 12:07:57.671 1: PERL WARNING: main::km200_GetDynService() called too early to check prototype at .//FHEM/73_km200.pm line 2574, <$fh> line 262.


Gruß
    Sailor
******************************
Man wird immer besser...

Beta-User

Hmm, hätte ich wohl testen sollen...

Versuche es mal mit (nur) dem in der Zeile vorher:
my @KM200_DONOTPOLL = split m/\s+/, $temp[0] // ();
Das lädt zumindest ordnungsgemäß.

(Das Problem, das gelöst werden muss: uU. ist das Array nach dem split nicht defined, und daraus resultieren dann die weiteren Fehlermeldungen. Also muss mindestens ein leeres Array her....)

Zitat von: Sailor am 18 November 2022, 12:09:45
Habe die forward-Deklaration auskommentiert und deine Code-Zeile wie von dir vorgeschlagen eingefügt.

Resultat bei Neustart:

2022.11.18 12:07:57.671 1: PERL WARNING: main::km200_GetDynService() called too early to check prototype at .//FHEM/73_km200.pm line 2574, <$fh> line 262.


Gruß
    Sailor
Kannst du mal stacktrace einschalten? Die Meldung zur verursachenden Zeile ist nämlich jetzt eine (deutlich) andere als vorher.

(Hier dürfte das Problem sein, dass bereits aus define heraus Code ausgeführt wird. Man sollte m.E. eine Art "firstinit"-Routine haben, die timerbasiert aufgerufen wird, wenn $init_done noch nicht wahr ist).
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: MiLight@ESP-GW, BT@OpenMQTTGw | MySensors: seriell, v.a. 2.3.1@RS485 | ZWave | ZigBee@deCONZ | SIGNALduino | MapleCUN | RHASSPY
svn: u.a MySensors, Weekday-&RandomTimer, Twilight,  div. attrTemplate-files

Sailor

Hi Beta-User

Zitat von: Beta-User am 18 November 2022, 12:12:19
Versuche es mal mit (nur) dem in der Zeile vorher:
my @KM200_DONOTPOLL = split m/\s+/, $temp[0] // ();
Das lädt zumindest ordnungsgemäß.
(Das Problem, das gelöst werden muss: uU. ist das Array nach dem split nicht defined, und daraus resultieren dann die weiteren Fehlermeldungen. Also muss mindestens ein leeres Array her....)
Das hat schon mal gefunzt. Sowohl beim "reload 73_km200" als auch bei "shutdown restart"
Danke.... Schaun mer mal wie sich das über Nacht verhält.


Zitat von: Beta-User am 18 November 2022, 12:12:19
Kannst du mal stacktrace einschalten? Die Meldung zur verursachenden Zeile ist nämlich jetzt eine (deutlich) andere als vorher.
(Hier dürfte das Problem sein, dass bereits aus define heraus Code ausgeführt wird. Man sollte m.E. eine Art "firstinit"-Routine haben, die timerbasiert aufgerufen wird, wenn $init_done noch nicht wahr ist).

Anbei der stacktrace


2022.11.18 13:02:11.804 1: PERL WARNING: main::km200_GetDynService() called too early to check prototype at .//FHEM/73_km200.pm line 2574, <$fh> line 262.
2022.11.18 13:02:11.804 1: stacktrace:
2022.11.18 13:02:11.805 1:     main::__ANON__                      called by .//FHEM/73_km200.pm (2574)
2022.11.18 13:02:11.805 1:     (eval)                              called by fhem.pl (2757)
2022.11.18 13:02:11.805 1:     (eval)                              called by fhem.pl (2756)
2022.11.18 13:02:11.806 1:     main::CommandReload                 called by fhem.pl (2061)
2022.11.18 13:02:11.806 1:     main::LoadModule                    called by fhem.pl (2126)
2022.11.18 13:02:11.806 1:     main::CommandDefine                 called by fhem.pl (1274)
2022.11.18 13:02:11.806 1:     main::AnalyzeCommand                called by fhem.pl (1125)
2022.11.18 13:02:11.807 1:     main::AnalyzeCommandChain           called by fhem.pl (1413)
2022.11.18 13:02:11.807 1:     main::CommandInclude                called by fhem.pl (1274)
2022.11.18 13:02:11.807 1:     main::AnalyzeCommand                called by fhem.pl (1125)
2022.11.18 13:02:11.807 1:     main::AnalyzeCommandChain           called by fhem.pl (1413)
2022.11.18 13:02:11.808 1:     main::CommandInclude                called by fhem.pl (626)


Gruß
    Sailor
******************************
Man wird immer besser...

Beta-User

Hmm, dann würde ich mal annehmen, dass das eine Folge aus Zeile 299 ist.

Sieht für mich nach einem Webfehler aus, irgendwelche Funktionen zur define-Time aufzurufen, die "hart" irgendwelche Reaktionen von einer Gegenstelle erwarten. Dto. übrigens auch für (indirekte) trigger-Kommandos wie readingsSingleUpdate() (#284). Dadurch werden uU. plötzlich alle möglichen Eventhandler wach und reagieren ihrerseits, obwohl die FHEM-Initialisierung noch nicht durch ist. Dann hat man Reihenfolgediskussionen zur Frage, wo was in der cfg steht (so man eine als File hat (!)), etc. pp..
Sollte man bereinigen!

Just my2ct.
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: MiLight@ESP-GW, BT@OpenMQTTGw | MySensors: seriell, v.a. 2.3.1@RS485 | ZWave | ZigBee@deCONZ | SIGNALduino | MapleCUN | RHASSPY
svn: u.a MySensors, Weekday-&RandomTimer, Twilight,  div. attrTemplate-files