userReading - Subtraktion von einer vorgegebenen Zeit

Begonnen von neyzen, 13 März 2023, 12:58:18

Vorheriges Thema - Nächstes Thema

neyzen

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?

Otto123

#1
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 :)
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

betateilchen

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));
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

neyzen

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?

neyzen

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

betateilchen

Am einfachsten nimmst Du im split() einfach ReadingsVal() anstatt $t.
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

neyzen

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!


Otto123

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.
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

betateilchen

Ich würde die Gebetszeiten trotzdem nicht so umständlich über Berechnungen aus Readingwerten ermitteln. Das geht mit Sicherheit viel einfacher.
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!