Hallo,
ich habe ein Zeit (variable), dieser steht im reading
02_Sonnenaufgang 06:35 2023-03-13 10:01:02
Jetzt möchte ich zur dieser Zeit eine neue Zeit berechnen, die 50 minuten davor liegt.
In der Wiki ist ein schönes Beispiel
{POSIX::strftime("%H:%M:%S",localtime(time-45*60))}
Allerings möchte ich nicht wie im Beispiel die Differenz zur aktuellen Zeit, sondern eben zu meinem reading oben.
Ich weis leider nicht wie ich mein userReading definieren muss.
Kann mir jemand helfen?
Wenn Du 50 min vorm Sonnenaufgang willst, wäre es einfach :)
{sunrise_abs('CIVIL',-50*60)}
https://fhem.de/commandref_modular_DE.html#SUNRISE_EL
Falls Du wirklich den Wert 06:35 auslesen willst:
{POSIX::strftime("%H:%M",localtime(time_str2num("$today ".ReadingsVal($name,'02_Sonnenaufgang',''))-50*60))}
Geht sicher viel einfacher :)
Vielleicht nicht einfacher, aber leichter verständlich:
my $t = "06:30";
my $diff = 50*MINUTESECONDS;
my ($h,$m) = split(/:/,$t);
return strftime("%H:%M:%S",gmtime($h*HOURSECONDS+$m*MINUTESECONDS-$diff));
Hallo Otto,
nein ich brauche tatsächlich das reading 02_Sonnenaufgang zum Berechnen. Denn wenn das funktioniert, werde ich das auf meine 4 anderen Zeiten die sich ja täglich ändern, anwenden.
dein zweiter code gibt mir eine Fehlermeldung
Error evaluating KalanZamaniHesapla userReading KeratSabah: Global symbol "$today" requires explicit package name (did you forget to declare "my $today"?) at (eval 125601) line 1.
Das reading 02_Sonnenaufgang hat das Device in diesem Fall "Namaz"
Liegt hier mein Fehler?
Zitat von: betateilchen am 13 März 2023, 20:51:26
Vielleicht nicht einfacher, aber leichter verständlich:
my $t = "06:30";
my $diff = 50*MINUTESECONDS;
my ($h,$m) = split(/:/,$t);
return strftime("%H:%M:%S",gmtime($h*HOURSECONDS+$m*MINUTESECONDS-$diff));
Hallo betateilchen,
dein code funktioniert!
allerdings, wie mache ich my $t = "06:30"; variabel?
Mein reading dazu liegt ja hier
device= Namaz
reading=02_Sonnenaufgang
Am einfachsten nimmst Du im split() einfach ReadingsVal() anstatt $t.
Ich habe jetzt folgendes bei meinem userReading geändert
{
my $diff = 50*MINUTESECONDS;
my ($h,$m) = split(/:/,ReadingsVal("Namaz","02_Sonnenaufgang",0));
return strftime("%H:%M:%S",gmtime($h*HOURSECONDS+$m*MINUTESECONDS-$diff));}
damit funktioniert es genau so wie ich es mir vorgestellt habe. Super. Du hast mir wieder mal sehr geholfen betateilchen.
Danke aber auch an Otto!
Laut commandref ist die Variable verfügbar, in meinem Test war sie das auch:
ZitatUm die Verwendung von Datum und Zeitangaben zu vereinfachen, wurden die Variablen $sec, $min, $hour, $mday, $month, $year, $wday, $yday, $isdst und $hms für die Verwendung in PERL-"oneliners" eingeführt (s. unter perldoc -f localtime). Ausnahmen: $month hat einen Wertebereich von 1 bis 12 und $year ist korrigiert von 1900. Weiterhin enthält $hms die Zeit in dem HH:MM:SS Format und $today das aktuellen Datum in YYYY-MM-DD Format.
Offenbar ist sie in deinem Device nicht da - egal der Code von Betateilchen ist doch funktional und wirklich leichter verständlich.
Ich würde die Gebetszeiten trotzdem nicht so umständlich über Berechnungen aus Readingwerten ermitteln. Das geht mit Sicherheit viel einfacher.