[gelöst] [99_Utils.pm] Argument "56Z" isn't numeric in subroutine

Begonnen von yersinia, 24 April 2020, 14:59:00

Vorheriges Thema - Nächstes Thema

yersinia

Hallo rudi,

ich bekomme hin und wieder folgende Warnung im log:
PERL WARNING: Argument "56Z" isn't numeric in subroutine entry at ./FHEM/99_Utils.pm line 21.

Ich vermute die Ursache im stateFormat eines JsonMod Devices:
POSIX::strftime("%d.%m.%y",localtime(time_str2num(ReadingsVal($name,"published_at","2000-01-01T00:00:00Z"))));

Das Reading:
2020-04-24 14:06:00   published_at    2020-03-26T17:48:56Z

Da ich nur %d.%m.%y benötige, sehe ich auch keinen Fehler.

Ist dies ein zu fixender bug oder ein feature und das Reading ist malformed?
(Oder ist meine Code-Zeile zur Datumswert-Umwandlung zu komplex?)

Danke vorab.
viele Grüße, yersinia
----
FHEM 6.4 (SVN) on RPi 4B with RasPi OS Bookworm (perl 5.36.0) | FTUI
nanoCUL->2x868(1x ser2net)@tsculfw, 1x433@Sduino | MQTT2 | Tasmota | ESPEasy
VCCU->14xSEC-SCo, 7xCC-RT-DN, 5xLC-Bl1PBU-FM, 3xTC-IT-WM-W-EU, 1xPB-2-WM55, 1xLC-Sw1PBU-FM, 1xES-PMSw1-Pl

CoolTux

Rudi ich habe Zeile 20 wie folgt positiv getestet

@a = split("[ZT: -]", $str);



Grüße
Du musst nicht wissen wie es geht! Du musst nur wissen wo es steht, wie es geht.
Support me to buy new test hardware for development: https://www.paypal.com/paypalme/MOldenburg
My FHEM Git: https://git.cooltux.net/FHEM/
Das TuxNet Wiki:
https://www.cooltux.net

rudolfkoenig

time_str2num ist nicht fuers Parsen von Zeitangaben mit TimeZone gedacht, und das wird sie durch erweitern der split mit Z auch nicht.

Wen man vorhat das zu unterstuetzen, muesste man die TimeZone Angabe mktime weitergeben, aber laut "perldoc POSIX" nimmt die perl Variante von mktime keine solchen Parameter, im Gegensatz zu der C-Variante, siehe "man mktime". Laut Internet-Weisheit sollte man fuer sowas das externe DateTime Modul verwenden, dieses Modul ist mir aber sehr unsympathisch.

Ich wuerde das vorliegende Problem durch Stringmanipulation loesen, selbst wenn damit die Zeitzone auch ignoriert wird.

Ich staune gerade auch ueber die (Fremd-)Erweiterung der time_str2num Funktion vor 7 Jahren fuer den Fall dass kein $str spezifiziert ist.
Das habe ich jetzt korrigiert.

yersinia

Danke. Fürs Analysieren, Erklären und partiell fixen/optimieren.

Zitat von: rudolfkoenig am 24 April 2020, 16:36:32
Ich wuerde das vorliegende Problem durch Stringmanipulation loesen, selbst wenn damit die Zeitzone auch ignoriert wird.
Also in meinem Fall sowas wie:
my $pubat = substr(ReadingsVal($name,"published_at","2000-01-01T00:00:00Z"),0,-1);
$ret .= POSIX::strftime("%d.%m.%y",localtime(time_str2num($pubat)));
viele Grüße, yersinia
----
FHEM 6.4 (SVN) on RPi 4B with RasPi OS Bookworm (perl 5.36.0) | FTUI
nanoCUL->2x868(1x ser2net)@tsculfw, 1x433@Sduino | MQTT2 | Tasmota | ESPEasy
VCCU->14xSEC-SCo, 7xCC-RT-DN, 5xLC-Bl1PBU-FM, 3xTC-IT-WM-W-EU, 1xPB-2-WM55, 1xLC-Sw1PBU-FM, 1xES-PMSw1-Pl

rudolfkoenig

Ich meinte eher sowas wie
ReadingsVal($name,"published_at","2000-01-01T00:00:00Z") =~ m/^20(\d+)-(\d+)-(\d+)/;
$ret .= "$3.$2.$1";

aber ich habe es nicht getestet, und ich bestehe auch nicht auf diese Art der Loesung.

yersinia

Zitat von: rudolfkoenig am 24 April 2020, 16:49:17
Ich meinte eher sowas wie
ReadingsVal($name,"published_at","2000-01-01T00:00:00Z") =~ m/^20(\d+)-(\d+)-(\d+)/;
$ret .= "$3.$2.$1";

aber ich habe es nicht getestet, und ich bestehe auch nicht auf diese Art der Loesung.
Hab ich aber getestet und sieht erstmal gut aus. Die Frage ist, welche die bessere, elegantere, Ressourcen-schonendere Lösung ist!? Vermutlich deine....
viele Grüße, yersinia
----
FHEM 6.4 (SVN) on RPi 4B with RasPi OS Bookworm (perl 5.36.0) | FTUI
nanoCUL->2x868(1x ser2net)@tsculfw, 1x433@Sduino | MQTT2 | Tasmota | ESPEasy
VCCU->14xSEC-SCo, 7xCC-RT-DN, 5xLC-Bl1PBU-FM, 3xTC-IT-WM-W-EU, 1xPB-2-WM55, 1xLC-Sw1PBU-FM, 1xES-PMSw1-Pl

rudolfkoenig