FHEM Forum

FHEM => Anfängerfragen => Thema gestartet von: matze1999 am 16 März 2025, 09:11:23

Titel: [gelöst]Fehlermeldung in 99_myutils
Beitrag von: matze1999 am 16 März 2025, 09:11:23
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
Titel: Aw: Fehlermeldung in 99_myutils
Beitrag von: Otto123 am 16 März 2025, 10:23:08
Hi,

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

Beispiel:
my $os_name = $ua->os_string() || 'No OS';
Gruß Otto
Titel: Aw: Fehlermeldung in 99_myutils
Beitrag von: matze1999 am 16 März 2025, 10:51:04
Hallo,

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

|| 'leer' angefügt.

Fehler bleibt.

Titel: Aw: Fehlermeldung in 99_myutils
Beitrag von: matze1999 am 16 März 2025, 10:53:32
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);
  }
}
Titel: Aw: Fehlermeldung in 99_myutils
Beitrag von: matze1999 am 16 März 2025, 11:36:23
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]";



Titel: Aw: Fehlermeldung in 99_myutils
Beitrag von: Otto123 am 16 März 2025, 11:58:03
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');
Titel: Aw: Fehlermeldung in 99_myutils
Beitrag von: matze1999 am 16 März 2025, 12:41:48
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
Titel: Aw: Fehlermeldung in 99_myutils
Beitrag von: Otto123 am 16 März 2025, 13:20:50
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?
Titel: Aw: Fehlermeldung in 99_myutils
Beitrag von: matze1999 am 16 März 2025, 13:28:13
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
Titel: Aw: Fehlermeldung in 99_myutils
Beitrag von: Otto123 am 16 März 2025, 13:41:21
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.
Titel: Aw: Fehlermeldung in 99_myutils
Beitrag von: matze1999 am 16 März 2025, 14:20:52
@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.