[gelöst]Fehlermeldung in 99_myutils

Begonnen von matze1999, 16 März 2025, 09:11:23

Vorheriges Thema - Nächstes Thema

matze1999

Hallo,

ich habe folgende Fehlermeldung(en) im log:

PERL WARNING: Use of uninitialized value within @valp in string at ./FHEM/99_myUtils.pm line 40X.
Hir die Routine dazu:

sub departure4 {
  my $url = "https://transport.stefan-biermann.de/publictransportapi/rest/departure/FHEM?from=900415116&provider=Vbb";
  my $result = GetFileFromURL($url);
  my @valp = split(/,/,$result);
  map {$_ =~ s/[\[\]"]//g; } @valp;
  for (my $i=0;$i<3;$i++) {
    my $l = "$valp[$i*3]";
    my $z = "$valp[($i*3)+1]";
    my $dz = "$valp[($i*3)+1]";
    my $m = "$valp[($i*3)+2]";
        if ( $l == 551) {
        $dz=~s/Bahnhof/\Bahnhof über Passage/};
        if ( $l == 598) {
        $dz=~s/Gasthaus/Fürstl\. Drehna ü\. Pießig /};
        fhem("setreading departuresPo Linie$i $l",1);
    fhem("setreading departuresPo Ziel$i $z",1);
    fhem("setreading departuresPo displayZiel$i $dz",1);
    fhem("setreading departuresPo Min$i $m",1);
  }
}

Ich vermute, das es damit zusammenhängt, weil zu bestimmten Zeiten keine daten vorhanden sind. Kann man das "abfangen" und die Variable $valp dann anders belegen oder die Verabeitung unterbinden, sowas wie

next unless
matze1999

Otto123

#1
Hi,

Du kannst den Perl Operator  "or ||" oder "defined or // " verwenden.

Beispiel:
my $os_name = $ua->os_string() || 'No OS';
Gruß Otto
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

matze1999

Hallo,

danke, ich weiss nicht wie, hab jetzt überall an jede Zeile wo  "$valp" vorkam oder hinter "my @valp"

|| 'leer' angefügt.

Fehler bleibt.


matze1999

so

sub departure4 {
  my $url = "https://transport.stefan-biermann.de/publictransportapi/rest/departure/FHEM?from=900415116&provider=Vbb";
  my $result = GetFileFromURL($url);
  my @valp = split(/,/,$result);
  map {$_ =~ s/[\[\]"]//g; } @valp;
  for (my $i=0;$i<3;$i++) {
    my $l = "$valp[$i*3]" || 'leer';
    my $z = "$valp[($i*3)+1]" || 'leer';
    my $dz = "$valp[($i*3)+1]"  || 'leer';
    my $m = "$valp[($i*3)+2]" || 'leer';
        if ( $l == 551) {
        $dz=~s/Bahnhof/\Bahnhof über Passage/};
        if ( $l == 598) {
        $dz=~s/Gasthaus/Fürstl\. Drehna ü\. Pießig /};
        fhem("setreading departuresPo Linie$i $l",1);
    fhem("setreading departuresPo Ziel$i $z",1);
    fhem("setreading departuresPo displayZiel$i $dz",1);
    fhem("setreading departuresPo Min$i $m",1);
  }
}

matze1999

die erste Fehlermeldung aus der Zeile

map {$_ =~ s/[\[\]"]//g; } @valp;
bekomme ich so weg:

map {$_ = '' unless defined $_; $_ =~ s/[\[\]"]//g; } @valp;
nur hier weiss ich nicht weiter:

for (my $i=0;$i<3;$i++) {
    my $l = "$valp[$i*3]";
    my $z = "$valp[($i*3)+1]";
    my $dz = "$valp[($i*3)+1]";
    my $m = "$valp[($i*3)+2]";




Otto123

my @valp = split(/,/,$result);Du musst einfach hier was sinnvolles reinschreiben. Ich weiß leider nicht was das wäre. :) und ob $result an der Stelle wirklich undefined ist?
my @valp = split(/,/,$result) // split(/,/,'willi,lustig,1,2,3,4,5');
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

matze1999

Hallo Otto,

vielen dank, aber ich bekomme das nicht hin.

Wenn nichts fährt: @valp enthält nur einen Wert ("EFA error status: OK") statt der erwarteten drei Abfahrten (mit Linie, Ziel und Zeit). Kann man damit das abfangen?



matze1999

Otto123

Naja aber wenn Du "EFA error status: OK" mit einem Split am Komma zerlegen willst wo gar keines ist? Das verstehe ich nicht.

Oder ist es sonst eine liste mit kommas getrennt?
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

matze1999

Hallo,

mein fehler:

wenn Abfahrten sind dann sehen die Daten so aus:

[["579","Bahnhof","26"],["579","Bahnhof","57"],["579","Bahnhof","87"]]
Wenn keine Abfahrten sind, steht das o.g.:

EFA error status: OK
Das split Ergebnis ist dann für das erste Reading "EFA error status: OK" und alle anderen bleiben auf dem alten Stand.

Und im log erscheint die Fehlermeldung 

uninitialized value
Weil ja die restlichen 8 Werte nicht vorhanden sind.

matze1999

Otto123

#9
dann man doch am Anfang einfach die Abfrage if ($result eq 'EFA error status: OK') und mach eine "Fehlerbehandlung" mit anschließendem return.

Oder mach eine for (@valp) {}  Schleife wenn es egal ist ob die anderen Readings alte Werte haben.
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

matze1999

@Otto,

so einfach:

sub departure4 {
  my $url = "https://transport.stefan-biermann.de/publictransportapi/rest/departure/FHEM?from=900415116&provider=Vbb";
  my $result = GetFileFromURL($url);
  my @valp = split(/,/,$result);
  if ($result ne 'EFA error status: OK') {
   map {$_ =~ s/[\[\]"]//g; } @valp;
   for (my $i=0;$i<3;$i++) {
     my $l = "$valp[$i*3]";
     my $z = "$valp[($i*3)+1]";
     my $dz = "$valp[($i*3)+1]";
     my $m = "$valp[($i*3)+2]";
         if ( $l == 551) {
         $dz=~s/Bahnhof/\Bahnhof über Südpassage/};
         if ( $l == 598) {
         $dz=~s/Gasthaus/Fürstl\. Drehna ü\. Pießig /};
     fhem("setreading departuresPo Linie$i $l",1);
     fhem("setreading departuresPo Ziel$i $z",1);
     fhem("setreading departuresPo displayZiel$i $dz",1);
     fhem("setreading departuresPo Min$i $m",1)};
} else
   {
   fhem("setreading departuresPo Linie0 EFA","EFA");
    }
}

Das letzte reading nutze ich an anderer Stelle zur Auswertung, deshalb bleibt es mit "EFA" drin.