99_myUtils.pm: Unterprogramm Datumsvergleich fehlerhaft

Begonnen von stoeberhai, 22 Mai 2021, 07:11:27

Vorheriges Thema - Nächstes Thema

stoeberhai

Aufgabenstellung:
Das Reading fc0_date aus dem Modul Proplanta soll an eine Funktion MyUtil_IstDatumHeutigesDatum($) in 99_myUtils.pm übergeben werden.
Das Reading fc0_date wird in einer anderen Funktion in 99_myUtils.pm wie folgt ausgelesen:
my $ProplantaHeutigesDatum = ReadingsVal("OUT_Wetter", "fc0_date", "n.a.");
und dann in einer if-Abfrage dieser Funktion an MyUtil_IstDatumHeutigesDatum($) übergeben:

if(($Event =~ m/on/) && ($actTime gt "04:00" && $actTime lt "09:00") && (MyUtil_IstDatumHeutigesDatum($ProplantaHeutigesDatum) == 1))
{
...
}



Die Funktion vergleicht dieses Datum mit dem aktuellen Datum und gibt 1 zurück, wenn die Daten übereinstimmen, andernfalls 0:


sub MyUtil_IstDatumHeutigesDatum($)
{
my ($uebergebenesDatum) = @_;
# Lokales Datum holen:
($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime();
my $monat = sprintf("%02d",$mon+1);
my $tag = sprintf("%02d",$mday);
my $jahr = sprintf("%04d",$year+1900);
# Datumsstring zusammenstellen:
my $heute = $tag.".".$monat.".".$jahr;
#printf($uebergebenesDatum);
return 1 if ($uebergebenesDatum eq $heute); # true
return 0 if ($uebergebenesDatum ne $heute); # false
} # Ende MyUtil_IstDatumHeutigesDatum


Irgendwo ist aber ein Fehler, denn nach dem Einbau des oben gezeigten Codes in 99_myUtils.pm tritt ein Fehler auf.
Was mache ich verkehrt?



Fehlermelddung:

<div class='fhemlog'>2021.05.19 20:16:11 1 : ERROR evaluating my $EVENT=   $evalSpecials->{'%EVENT'};my $EVTPART0=   $evalSpecials->{'%EVTPART0'};my $EVTPART1=   $evalSpecials->{'%EVTPART1'};my $NAME=   $evalSpecials->{'%NAME'};my $SELF=   $evalSpecials->{'%SELF'};my $TYPE=   $evalSpecials->{'%TYPE'};{MyUtil_OG_Bad_Wetteransage($EVENT)}: Undefined subroutine &main::MyUtil_OG_Bad_Wetteransage called at (eval 657) line 1, <ICSFILE> line 25163. </div><div class='fhemlog'>2021.05.19 20:16:11 3 : n_WetterAnsage return value: Undefined subroutine &main::MyUtil_OG_Bad_Wetteransage calle
RaspberryPi, Homematic, ZWave, Fritz!Box 7490

Otto123

#1
Moin,

die Fehlermeldung sagt: es gibt MyUtil_OG_Bad_Wetteransage nicht.
Du redest von MyUtil_IstDatumHeutigesDatum.

Ich vermute: irgendwas stimmt in Deiner 99_myUtils nicht. Ich vermute eine andere Definition endet nicht und damit ist die nachfolgende Funktion nicht bekannt. Hast Du die 99_myUtils mit einem ungeeigneten Editor (unter Windows ?) editiert?

Noch einen alternativen Vorschlag für Deine sub:
{
my ($uebergebenesDatum) = @_;
$uebergebenesDatum =~ /(\d\d).(\d\d).(\d\d\d\d)/;
my $date = time_str2num("$3-$2-$1 00:00:00");
my $heute = time_str2num(strftime('%F 00:00:00',localtime(time)));
return $date == $heute;
}

Mit Anregungen von hier:
Das Datum (im deutschen Format) wird mit regExp in Tag Monat Jahr "extrahiert" - die 3 Elemente stehen in den Variablen $1 $2 $3
Das Datum wird nach ISO 8601 neu zusammengesetzt und die FHEM Funktion time_str2num wandelt in sekunden um (epoch)
Das heutige Datum wird genauso ermittelt.
Der Vergleich wird zurückgegeben.

Tipp: So erhält man ($date - $heute)/86400 die Anzahl der Tage zwischen beiden Daten.

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