Hallo Damian,
hier passt das wohl am besten:
Es war der Jahreswechsel und ich hatte mich schon gefreut, dem DOIF** (quasi) zuzuschauen, wie es die Daten verschiebt und das neue Jahr zu zählen beginnt.....
Hat aber nicht geklappt, folgendes hab ich dann rausgefunden:
es wird in der midnight-sub auf $mday und $yday geprüft. Das sind ja Perl-Variablen in fhem, die nicht "angepasst" sind, wie z.B. $year oder $month (->1...12). Ich habe dann in "perldoc -f localtime" nachgesehen und dort steht: $mday is the day of the month, also 1...Monatsende, das passt auch, aber $yday: is the day of the year, in the range 0..364 (or 0..365 in leap years.) Hat am 1.1. auch 0 ergeben. Damit wurde natürlich der Teil, der "midnight" am 1.1. ausführen soll, nicht abgearbeitet. Hier muss dann wohl auf $yday==0 geprüft werden.
Da ich 2 der DOIFs eingerichtet habe, habe ich nur bei einem das so geändert und die Werte händisch korrigiert, das 2te habe ich gelassen und gehofft, es läuft dann heute Nacht. Auch wieder nicht, Problem hier: die subs haben keine eindeutigen Namen, und es gilt ja immer die letzte geänderte Version, das war dann die mit dem $yday==0, also kanns am 2.1. ($yday=1) auch nicht gehen....
Hab ich mir dann auch korrigiert, sollte dann nächstes Jahr korrekt laufen.
Und ich hab noch die Jahresprüfung in die Klammer der Monatsprüfung geschoben, dann wird das nur jeden 1. des Monats und nicht täglich geprüft.
sub $SELF_midnight { ## Diese Funktion wird um Mitternacht ausgeführt
my ($device,$reading,$mday,$yday)=@_;
set_Reading("$device.$reading.day_counter",ReadingsVal($device, $reading,1));
set_Reading("$device.$reading.last_day",get_Reading("$device.$reading.day",0),1);
set_Reading("$device.$reading.day",0,1);
set_Reading ("$device.$reading.month",int((ReadingsVal($device, $reading,0)-(get_Reading("$device.$reading.month_counter",0)))*1000)/1000,1);
set_Reading ("$device.$reading.year",int((ReadingsVal($device, $reading,0)-(get_Reading("$device.$reading.year_counter",0)))*1000)/1000,1);
if ($mday == 1) {
set_Reading("$device.$reading.month_counter",ReadingsVal($device, $reading,0));
set_Reading("$device.$reading.last_month",get_Reading("$device.$reading.month",0),1);
set_Reading("$device.$reading.month",0,1);
if ($yday == 0) {
set_Reading("$device.$reading.year_counter",ReadingsVal($device, $reading,0));
set_Reading("$device.$reading.last_year",get_Reading("$device.$reading.year",0),1);
set_Reading("$device.$reading.year",0,1);
}
}
Vielleicht ist das ja hilreich.
Noch ne Frage zu der Art, wie Du das geschrieben hast: Beim Aufruf der sub wird $mday und $yday übergeben, das sind ja die fhem-perl Variablen. In der sub nimmst Du aber die selben Bezeichnungen, deklarierst diese aber neu (my(...$mday,$yday)=@_
Ist das üblich? Ich hätte hier vermutlich eigene Namen genutzt, allerdings gilt die Deklaration nur innerhalb der sub, von daher kann die Variable heissen wie sie will....
Gruß
Sany
**
https://wiki.fhem.de/wiki/DOIF/Automatisierung#Tages-.2C_Monats-_und_Jahresstatistik_f.C3.BCr_Strom-.2C_Gas-.2C_Wasserz.C3.A4hler_und_andere_Z.C3.A4hler