Hallo,
ich habe etwas Perl-Code in einem Notify, welches mir den Essensplan meiner Tochter aus dem Webportal de Kita zieht.
Das funktioniert soweit auch aber dennoch bekomme ich die oben genannten Fehlermeldung im Log.
Kann mir jemand erklären warum?
{
if ($wday == 5) {
my $url = ReadingsVal('OUT_Kita_Essen','portal_URL','');
my $kdnr = ReadingsVal('OUT_Kita_Essen','.kdnr','');
my $pw = ReadingsVal('OUT_Kita_Essen','.kdpw','');
my $regex = '<div><strong>(Vegetarisch|Vollkost 1|Vollkost 2|Pasta)</strong><br />(.*)</div>';
my $ret ='';
my $meal = 'keine Bestellung';
my $group = '';
my $date = '';
###### get Session cookie
my $cmd_cookies = "curl -c cookies.txt -d \"userName=$kdnr&userPass=$pw&&authSubmit=Auf gehts\" $url";
# fhem("setReading at_Kita_Essensplan cmd_cookies $cmd_cookies");
for (my $ii=1; $ii < 15; $ii++) {
$date = POSIX::strftime("%d.%m.%Y",localtime(time+86400*($ii+2)));
###### get pages
my $cmd_page ="curl -b cookies.txt -d \"getCurrentDate=$date\" $url";
# fhem("setReading at_Kita_Essensplan cmd_page $cmd_page");
$ret = qx($cmd_page);
#--- parse page for meals and Write in Reading
($group,$meal) = ($ret =~ m[$regex]);
if ($meal eq '') {$meal = ' - '}
$meal =~ s/\(.*?\)//g;
fhem('setReading OUT_Kita_Essen t_'. sprintf("%03d", $ii) .'_Speise '. $meal);
fhem('setReading OUT_Kita_Essen t_'. sprintf("%03d", $ii) .'_daysleft '. sprintf("%d", $ii+2));
fhem('setReading OUT_Kita_Essen t_'. sprintf("%03d", $ii) .'_Date '. $date);
}
###### Logout and delete cookie
$cmd_cookies = "curl -b cookies.xt $url" . '/logout.html';
qx($cmd_cookies);
qx("rm cookies.txt");
}
else {
for (my $ii=1; $ii<15; $ii++) {
my $days_left = ReadingsNum('OUT_Kita_Essen','t_'. sprintf("%03d", $ii) .'_daysleft','');
fhem('setReading OUT_Kita_Essen t_'. sprintf("%03d", $ii) .'_daysleft '. sprintf("%d", $days_left - 1));
}
}
}
Also: Ein WARNING ist ein deutlicher Hinweis darauf, dass etwas nicht 100% korrekt ist, aber eben noch kein (kritischer) Fehler.
Leider kann man innerhalb eines notify nicht feststellen, welche Zeile das war, sonst kann man leichter feststellen, an was es konkret krankt. Da wäre myUtils-Code leichter zu debuggen.
Da wir hier im "will was lernen"-Bereich sind, vielleicht noch zwei Hinweise:
"qq"
Das macht es einfacher, Ausdrücke wie
my $cmd_cookies = "curl -c cookies.txt -d \"userName=$kdnr&userPass=$pw&&authSubmit=Auf gehts\" $url";
zu schreiben:
my $cmd_cookies = qq(curl -c cookies.txt -d "userName=$kdnr&userPass=$pw&&authSubmit=Auf gehts" $url);
Und bei Schleifen finde ich
for (my $ii=1; $ii < 15; $ii++) {
weniger elegant wie
for my $ii (1..14) {
Was für eine Fehlermeldung genau bekommst du denn (das im Titel ist vermutlich nicht die komplette)?
Hast du mal einen Test ohne FHEM gemacht? Debug-Output eingebaut?
@Beta-User:
Ich könnte den Code auch in die myUtils verschieben, wenn das beim debuggen hilft... Da ich der Code ansich keinen Wiederverwendungswert hat, habe ich es bisher in dem at belassen.
Danke auch für die Style-Hinweise. War mir so nicht bekannt.
@Christoph_Morrison
das komplette Warning lautet
PERL WARNING: Use of uninitialized value $meal in string eq at (eval 1031102) line 27.
Kenne ich bisher so nur, wenn ich eine Variable vorher nicht mit my $meal initialisiert habe. Das ist ja aber zu beginne vorhanden.
Ohne FHEM habe ich nichts getetstet, weil ich nicht wüsste wie.
Was genau meinst du mit Debug-Output? Ich hatte anfangs einzelne Rückgabe in Readings geschrieben, um bspw. zu testen ob meine Befehle richtig zusammen gebaut werden. Andere Ausgaben habe ich nicht.
Edit:
Sit vielleicht ein ganz anderes Problem aber direkt nach dem Warning im Log erhalte ich eine ganze Menge Statistiken... Kriege ich die irgendwie weg? Was sagen mir diese Zahlen?
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0
0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0
100 21643 0 21618 100 25 78610 90 --:--:-- --:--:-- --:--:-- 78416
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0
100 21653 0 21628 100 25 124k 147 --:--:-- --:--:-- --:--:-- 125k
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0
100 21658 0 21633 100 25 158k 187 --:--:-- --:--:-- --:--:-- 159k
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0
100 21621 0 21596 100 25 157k 186 --:--:-- --:--:-- --:--:-- 157k
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0
100 25 0 0 100 25 0 164 --:--:-- --:--:-- --:--:-- 163
100 21629 0 21604 100 25 122k 145 --:--:-- --:--:-- --:--:-- 122k
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0
100 20573 0 20548 100 25 99k 124 --:--:-- --:--:-- --:--:-- 99k
...dann dürfte das Problem aus dieser Zeile kommen:
if ($meal eq '') {$meal = ' - '}
Immer dann, wenn kein match vorliegt.
Versuche mal
$meal = ' - ' if !$meal;
"unwahr" ist bei Perl nämlich "0", leerer Text und "echtes undef"... Da hier wohl keine 0 kommt (?), sollte das klappen...
Zitat von: Beta-User am 03 Dezember 2021, 14:13:27
...dann dürfte das Problem aus dieser Zeile kommen:
if ($meal eq '') {$meal = ' - '}
Immer dann, wenn kein match vorliegt.
Versuche mal
$meal = ' - ' if !$meal;
"unwahr" ist bei Perl nämlich "0", leerer Text und "echtes undef"... Da hier wohl keine 0 kommt (?), sollte das klappen...
Das hat geholfen. jedenfalls ist das Warning weg.
neben den Statistiken ist mir jetzt aber noch aufgefallen, dass die cookies.txt nicht gelöscht werden kann. Log
sh: 1: rm cookies.txt: not found
Passt die Pfadangabe nicht? Angelegt und genutzt wird die Datei ja im Hauptverzeichnis (/opt/fhem).
".xt" ne ".txt"?
qx("rm cookies.txt")
Ich denke es muss so:
qx(rm cookies.txt)
Ich habe dazu nur einen Verweis auf meine Notiz (https://heinz-otto.blogspot.com/2018/02/in-fhem-externe-programme-aufrufen.html). :)
ZitatAchtung: Die Verwendung von qx("") führt zu einer Fehlermeldung, da ist offenbar ein String Terminator zu viel.
so einfach...
Danke Otto.
Wenn wir jetzt noch die Statistiken geklärt bekommen, bin ich durch ;-)
$cmd_cookies = "curl -b cookies.xt $url" . '/logout.html';
Hier würde ich trotzdem nochmal nach ".xt" sehen und vielleicht mal wieder "qq" ins Rennen werfen...
Zitat von: Beta-User am 03 Dezember 2021, 14:49:50
$cmd_cookies = "curl -b cookies.xt $url" . '/logout.html';
Hier würde ich trotzdem nochmal nach ".xt" sehen und vielleicht mal wieder "qq" ins Rennen werfen...
habe ich angepasst, danke.
Witziger Weise führte das zu keinem Fehler, da es beim Logout scheinbar unnötig ist die cookies zu übergeben.