Hi,
ich habe mal eine Frage zur Berechnung von Zeiträumen. Ich würde gerne die Anzahl der Tage ermitteln - von einem Startdatum angefangen bis heute. Das Startdatum habe ich als userReading (im Format DD.MM.YYY) definiert. Ich würde gerne die Anzahl der Tage in einem weiteren uerReading erfassen, bin aber ein wenig überfordert - so wie ich das sehe, geht das nur mit Perl und der date::calc Funktion. Vielleicht kann mir mal jemand unter die Arme greifen?
Danke schön :-)
Viele Grüße
in einer eigenen Sub und da kannst du zB auch direkt mit timestamp arbeiten. Aber es gibt sicher viele Wege dafür.
eher ich mich mit Perl code rumärgere mach ich das mit nem 2zeiler script:
Tage=$((($(date -d 31-Dec-2017 +'%s') - $(date +'%s')) /86400))
perl /opt/fhem/fhem.pl 7072 "set xyz $Tage "
Hi,
ich habe das mal versucht, das mit einer Subroutine in der myUtils zu lösen. Da ich noch so gut wie nie was mit Perl und noch nie was mit der myUtils gemacht habe (außer fremden Code eingefügt) war das recht spannend. Bin auch schon recht weit gekommen, allerdings hänge ich an einer Stelle und komme nicht weiter. Vielleicht kann mir mal jemand helfen?
# Tage Berechnung
sub CalcDays() {
use Date::Calc qw(Delta_Days);
my $start_datum = ReadingsVal("Easymeter","Start_Periode","");
my $tag = substr($start_datum, 0, 2);
my $monat = substr($start_datum, 3, 2);
my $jahr = substr($start_datum, 6, 4);
my $start_datum = ($jahr.",".$monat.",".$tag);
my ($d,$m,$y) = (localtime)[3,4,5];
my $ymd = sprintf '%04d,%02d,%02d', $y+1900, $m+1, $d ;
my $anzahl_tage = Delta_Days($start_datum,$ymd);
return $anzahl_tage;
}
Der Wert für das Reading Start_Periode ist 01.02.2017
als Fehlermeldung kommt im Reading
Zitat
Error evaluating Easymeter userReading Tage_Periode: Usage: Date::Calc::XS::Delta_Days(year1, month1, day1, year2, month2, day2) at ./FHEM/99_myUtils.pm line
Wenn ich mir aber den Inhalt der Variablen $start_datum (=2017,02,01) und $ymd (=2017,06,13) anschaue, dann müsste die Syntax aber richtig sein. - oder anscheinend ja nicht, weil es nicht geht ;-) Geb ich anstatt der Variablen den Inhalt der Variablen ein, dann geht es.
Hat jemand einen Tipp?
Sooo...
habe den Fehler selber gefunden - mit Strings (grade auch zusammengesetzte) kann man natürlich nicht rechnen ;-)
Wem es interessiert - hiermit geht es:
sub CalcDays() {
use Date::Calc qw(Delta_Days);
my $start_datum = ReadingsVal("Easymeter","Start_Periode","");
my $tag = substr($start_datum, 0, 2);
my $monat = substr($start_datum, 3, 2);
my $jahr = substr($start_datum, 6, 4);
my ($d,$m,$y) = (localtime)[3,4,5];
my $y = sprintf '%04d',$y+1900;
my $m = sprintf '%02d',$m+1;
my $d = sprintf '%02d',$d;
my $anzahl_tage = Delta_Days($jahr,$monat,$tag,$y,$m,$d);
return $anzahl_tage;
}
Danke, dass du die Lösung hier postest. Könntest du auch noch [Gelöst] vor das Subject des ersten Posts schreiben?
Zitat von: KernSani am 13 Juni 2017, 21:59:42
Danke, dass du die Lösung hier postest. Könntest du auch noch [Gelöst] vor das Subject des ersten Posts schreiben?
Sorry, dachte eigentlich, das ich das gemacht habe - habe ich dann wohl vergessen und wurde hiermit nachgeholt
hi, ich habe diesen post gefunden und deine sub in die myutils eingefügt, mein gerät und das reading geändert aber ich bekomme kein reading im gerät mit der anzahl der tage. was mache ich falsch
mfg
Du musst die Sub natürlich auch aufrufen.
Ich denke mal am besten aus ein userreadings heraus