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
Hallo,
ein List von Deiner ReadingsGroup könnte schon mal ein Anfang sein.
Grüße Jörg
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
Hallo,
Du kannst Dir mit: list .* battery
alle entsprechenden Readings anzeigen lassen.
Grüße Jörg
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?
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
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
Drei Mal gelesen, aber die Klammer um $wert bei "my ($wert) = ..." verstehe ich immer noch nicht.