FHEM Forum

FHEM => Automatisierung => Perl für FHEM-User => Thema gestartet von: Gisbert am 23 Februar 2026, 14:38:55

Titel: Umrechnung von Stunden in y d h als Funktion in 99_myUtils.pm
Beitrag von: Gisbert am 23 Februar 2026, 14:38:55
Hallo zusammen,

ich möchte eine Stundenzahl in ein Format y d h bringen, hab aber das Problem des Schaltjahres.
Mit folgfender Definition:
sub h2human($){
  my ($diff) = @_;
  my ($y,$d,$h,$ret);
  ($y,$diff) = _s2h_Div($diff,8766);
  ($d,$diff) = _s2h_Div($diff,24);
  ($h,$diff) = _s2h_Div($diff,1);
  $ret  = "$y"."y "."$d"."d "."$h"."h";
  return $ret;
}

sub _s2h_Div($$) {
  my ($p1,$p2) = @_;
  return (int($p1/$p2), $p1 % $p2);
}
gelingt es halb.
Für ein Jahr ohne Schalttag gibt es: 8760 Stunden.
Für ein Jahr mit Schalttag gibt es: 8784 Stunden, im Mittel jedes Jahr also 6 Stunden mehr.

Die obige Funktion macht die Berechnung so halb richtig, aber es fehlen ein paar Stunden. Konkret ergibt die Anzahl von 16290 Stunden 1y 313d 12h mit der obigen Funktion, aber es müssten 1y 313d 17h sein. Das ist jetzt nur ein kleiner Unterschied, aber ich hätte es gerne richtig, falls der Aufwand vertretbar ist.

Das genaue Datum, bei dem die Stundenzahl beginnt, ist prinzipiell bekannt - damit ist die Stundenzahl auch immer bekannt, aber die Angabe im Format y d h aber nicht.

Ich hoffe, das mein Anliegen mit dem konkreten Beispiel erkennbar ist.

Viele Grüße Gisbert
Titel: Aw: Umrechnung von Stunden in y d h als Funktion in 99_myUtils.pm
Beitrag von: betateilchen am 23 Februar 2026, 15:04:38
Das lässt sich nicht so einfach mit Deiner Funktion umrechnen.
Innerhalb eines Zeitraumes von 5 Jahren können beispielsweise ein oder zwei Schaltjahre liegen.

Aber es gibt ja für perl durchaus Module, die solche Kalenderbe- und -umrechnungen unterstützen.
Titel: Aw: Umrechnung von Stunden in y d h als Funktion in 99_myUtils.pm
Beitrag von: Gisbert am 23 Februar 2026, 15:35:47
Hallo betateilchen,

ich stimme dir vollkommen zu - , nur dass ich trotz Suche diese Perl-Funktionen noch nicht gefunden hab.

Hintergrund ist, dass ich Daten per ESPHome aus einem Akku auslesen möchte. Da ich so viele Daten wie möglich auslesen möchte, um eine gewisse Genauigkeit zu bekommen, aber andererseits Daten, die sich nicht ändern - jedenfalls nicht schnell - nur gelegentlich übertragen möchte, war ich auf die obige Idee gekommen.

Mittlerweile bin ich bei ESPHome etwas weiter, d.h. ich kann dort steuern, wie oft ich Daten übermittele kann. Im obigen Beispiel ist das ja nur 1xmal in der Stunde nötig.

D.h. mein Problem(chen) ist anderweitig gelöst. Wenn es noch neue Infos zu den passenden Perl-Funktionen gibt, dann schaue ich mir das auch an, aber es gibt damit keine Dringlichkeit (die hat es so oder so nicht gegeben 8)).

Viele Grüße Gisbert
Titel: Aw: Umrechnung von Stunden in y d h als Funktion in 99_myUtils.pm
Beitrag von: JoWiemann am 23 Februar 2026, 15:42:35
Die KI schlägt vor:

use strict;
use warnings;
use DateTime;
use DateTime::Duration;

my $stunden_input = 20000; # Beispiel: 20.000 Stunden

# Erstelle ein Dauer-Objekt aus Stunden
my $dur = DateTime::Duration->new( hours => $stunden_input );

# Umrechnung in Einheiten (normalized)
my ( $y, $m, $d, $h ) = $dur->in_units( 'years', 'months', 'days', 'hours' );

print "$stunden_input Stunden sind: $y Jahre, $m Monate, $d Tage und $h Stunden.\n";
# Ausgabe: 20000 Stunden sind: 2 Jahre, 3 Monate, 3 Tage und 8 Stunden.

Grüße Jörg
Titel: Aw: Umrechnung von Stunden in y d h als Funktion in 99_myUtils.pm
Beitrag von: betateilchen am 23 Februar 2026, 16:00:22
@Jörg:

Die Frage ist, ob das Beispiel auch ohne Monat funktioniert und dann die richtige Anzahl Tage rauskommt.
Denn nach dem Monat ist in der Aufgabenstellung ja nicht gefragt.

Außerdem kann das Beispiel auch ohne Angabe eines Startzeitpunktes nicht immer das korrekte Ergebnis liefern, wenn es um Berücksichtigung der Schaltjahre geht.