[Gelöst] PERL WARNING: Use of uninitialized value $wert in string

Begonnen von fretti, 17 November 2023, 13:33:29

Vorheriges Thema - Nächstes Thema

fretti

Hallo,

Ich bekomme alle Minute 2 x so einen Eintrag im LOG.

2023.11.17 13:26:34 1: PERL WARNING: Use of uninitialized value $wert in string eq at (eval 2309009) line 1.

Nach anschalten von stacktrace kommt das:
2023.11.17 13:26:34 1: stacktrace:
2023.11.17 13:26:34 1:     main::__ANON__                      called by (eval 2309009) (1)
2023.11.17 13:26:34 1:     (eval)                              called by ./FHEM/33_readingsGroup.pm (357)
2023.11.17 13:26:34 1:     main::lookup2                       called by ./FHEM/33_readingsGroup.pm (1445)
2023.11.17 13:26:34 1:     main::readingsGroup_Notify          called by fhem.pl (3982)
2023.11.17 13:26:34 1:     main::CallFn                        called by fhem.pl (3894)
2023.11.17 13:26:34 1:     main::DoTrigger                     called by fhem.pl (4283)
2023.11.17 13:26:34 1:     main::Dispatch                      called by ./FHEM/00_MQTT2_CLIENT.pm (599)
2023.11.17 13:26:34 1:     main::MQTT2_CLIENT_Read             called by ./FHEM/00_MQTT2_CLIENT.pm (614)
2023.11.17 13:26:34 1:     main::__ANON__                      called by fhem.pl (3505)
2023.11.17 13:26:34 1:     main::HandleTimeout                 called by fhem.pl (705)


Kann man daraus ersehen, wo ggf der Fehler steckt?

VG Thomas
promox, debian, rpi, homematic, mqtt, dect, z2m

JoWiemann

Hallo,

ein List von Deiner ReadingsGroup könnte schon mal ein Anfang sein.

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

fretti

Ja, hab ich mal gelöscht, kommt wirklich von meiner einzigen ReadingGroup.

defmod rg_batterie_status readingsGroup .*:[bB]attery
attr rg_batterie_status alias BatterieStatus
attr rg_batterie_status mapping %ALIAS
attr rg_batterie_status notime 1
attr rg_batterie_status room 4.1.Sensoren
attr rg_batterie_status style style="text-align:left"
attr rg_batterie_status valueFormat { my ($wert) = $VALUE =~ m/(\d+)/;; return $VALUE if ($wert eq "");; return "critical" if ($wert < 25);; return "low" if ($wert < 50);; return "ok" if ($wert > 50);;}
attr rg_batterie_status valueIcon { my ($wert) = $VALUE =~ m/(\d+)/;; $wert = 100 if ($VALUE eq "ok");; $wert = 49 if ($VALUE eq "low");; $wert = 0 if ($VALUE eq "critical");; return "<i class='fa fa-battery-0 green fa-2x'><span class='myhidden'>critical</i>" if ($wert < 25);; return "<i class='fa fa-battery-0 green fa-2x'><span class='myhidden'>low</i>" if ($wert < 50);; return "<i class='fa fa-battery-4 green fa-2x'></i>".FW_makeImage('measure_battery_100@green',"people_sensor","rotate-90").FW_makeImage('fa-battery',"xx");;}


Wahrscheinlich liefert ein Sensor keinen Wert, sondern einen string!? Könnte das das Problem sein?

LG Thomas

promox, debian, rpi, homematic, mqtt, dect, z2m

JoWiemann

Hallo,

Du kannst Dir mit: list .* battery

alle entsprechenden Readings anzeigen lassen.

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

fretti

Hallo Jörg,

ja, da sind welche dabei, die senden nur "ok", manche z.B 80%, andere z.B. no.

Jetzt bin ich nicht der RegEx-Experte, um das alles abzufangen.

Kann man das auf die eingrenzen, die Zahlen liefern?
Oder gibt es eine andere Möglichkeit, alle zu erfassen?
promox, debian, rpi, homematic, mqtt, dect, z2m

JoWiemann

Hallo,

ich würde folgende Codezeile ändern wollen:

attr rg_batterie_status valueIcon { my ($wert) = $VALUE =~ m/(\d+)/;; $wert = 100 if ($VALUE eq "ok");; $wert = 49 if ($VALUE eq "low");; $wert = 0 if ($VALUE eq "critical");; return "<i class='fa fa-battery-0 green fa-2x'><span class='myhidden'>critical</i>" if ($wert < 25);; return "<i class='fa fa-battery-0 green fa-2x'><span class='myhidden'>low</i>" if ($wert < 50);; return "<i class='fa fa-battery-4 green fa-2x'></i>".FW_makeImage('measure_battery_100@green',"people_sensor","rotate-90").FW_makeImage('fa-battery',"xx");;}
nach
attr rg_batterie_status valueIcon { my $wert;; $wert = 100 if ($VALUE eq "ok");; $wert = 49 if ($VALUE eq "low");; $wert = 0 if ($VALUE eq "critical");; return "<i class='fa fa-battery-0 green fa-2x'><span class='myhidden'>critical</i>" if ($wert < 25);; return "<i class='fa fa-battery-0 green fa-2x'><span class='myhidden'>low</i>" if ($wert < 50);; return "<i class='fa fa-battery-4 green fa-2x'></i>".FW_makeImage('measure_battery_100@green',"people_sensor","rotate-90").FW_makeImage('fa-battery',"xx");;}

my ($wert) = $VALUE =~ m/(\d+)/;; macht hier keinen Sinn. Auch muss $wert vorher initialisiert werden. Wird durch die RegEx nichts gefunden, so wird my ($wert) = $VALUE =~ m/(\d+)/;; auch nicht initialisiert.

Du kannst so etwas gut testen auf: https://www.tutorialspoint.com/execute_perl_online.php

#
# Hello World Program in Perl
#
# die beiden use müssen vorhanden sein, da ansonsten die Fehlermeldung nicht sichtbar wird
use strict;
use warnings;

my $VALUE = "99";
my ($wert) = $VALUE =~ m/(\d+)/;
print $wert;

Wenn Du hier my $VALUE = "ok" einsetzt, dann sieht Du die Fehlermeldung.

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

fretti

Hallo Jörg,

danke für den Hinweis und deine Vorschlag, ich habe den noch ein klein wenig angepasst, weil da auch noch eine "80 %"  und ein "no" dabei war, jetzt kommen keine Fehlermeldungen im LOG.

LG Thomas
promox, debian, rpi, homematic, mqtt, dect, z2m

betateilchen

Drei Mal gelesen, aber die Klammer um $wert bei "my ($wert) = ..." verstehe ich immer noch nicht.
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!