[gelöst] userreading fehler bei Zeitberechnung

Begonnen von Jewe, 14 Oktober 2019, 21:44:47

Vorheriges Thema - Nächstes Thema

Jewe

Hallo zusammen,

habe ein problemchen mit einem userreading bei dem ich eine Zeitberechnung durchführe. Die Berechnung an sich funktioniert, aber im Log sind immerwieder diese Perl Warnungen...

attr Wetter userReadings fc0_Sonnenstunden { (sunset_abs() - sunrise_abs())* ReadingsNum("Wetter", "fc0_sun", 0)/100}

Fehler:
2019.10.10 23:35:26 3: PROPLANTA: set Wetter update
2019.10.10 23:35:40 1: PERL WARNING: Argument "07:02:03" isn't numeric in subtraction (-) at (eval 7654376) line 1.
2019.10.10 23:35:40 3: eval: { (sunset_abs() - sunrise_abs())* ReadingsNum("Wetter", "fc0_sun", 0)/100}
2019.10.10 23:35:40 1: PERL WARNING: Argument "19:16:07" isn't numeric in subtraction (-) at (eval 7654376) line 1.
2019.10.10 23:35:40 3: eval: { (sunset_abs() - sunrise_abs())* ReadingsNum("Wetter", "fc0_sun", 0)/100}


Ich habe es dann mit time_str2num probiert, aber die Umsetzung ist wohl nicht ganz richtig:

attr Wetter userReadings fc0_Sonnenstunden { (time_str2num(sunset_abs()) - time_str2num(sunrise_abs()))* ReadingsNum("Wetter", "fc0_sun", 0)/100}

Grüssle, Jens

Otto123

#1
Hallo Jens,

es gibt dazu einen guten Artikel im Wiki.

Und das Thema hatten wir hier schon mal https://forum.fhem.de/index.php?topic=86901.0

Gruß Otto
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

rudolfkoenig

sunset_abs() / sunrise_abs() liefert nur die Uhrzeit als String, genau das was at fuer die Definition braucht.
Solche Strings kann man in perl nicht substrahieren, man muss sie erst in eine Zahl wandeln.

time_str2num ist eine moegliche Loesung, allerdings erwartet diese Funktion Datum+Uhrzeit:
{time_str2num("2000-01-01 ".sunset_abs())-time_str2num("2000-01-01 ".sunrise_abs())}

Jewe

Das Wiki und das Threat hatte ich auch gefunden. Allerdings war der Threat ja nicht so ganz erfolgreich...

Ich habe es nun so gelöst :

fc0_Sonnenstunden {sprintf "%.1f", ((time_str2num("2000-01-01 ".sunset_abs())-time_str2num("2000-01-01 ".sunrise_abs())* ReadingsNum("Wetter", "fc0_sun", 0)/100)/3600)}

Danke Euch, Jens

Otto123

Zitat von: Jewe am 14 Oktober 2019, 22:58:14
Allerdings war der Threat ja nicht so ganz erfolgreich...
Jetzt schon :)
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

mi.ke

Moin,

hat jemand eine Idee, woher (Modul) ich die Zeiten des Sonnenaufgang/-untergang für die nächsten 1 bis 4 Tagen bekommen kann.

Danke

cheers
mi.ke
FHEM 5.9 | RPi4 + 5 x RPi(Z) + FB7590 + FB 6890 LTE via LAN und WAN (VPN) verbunden.
2 x CUL868 + 3 x RFXTRX(e) + 6 x HMwLanGW + 4 x z2tGw + 5 x LGW + 2 x IRBlast + CO2 +++
FS20, FHT, FMS, Elro(mod), CM160, Revolt, LGTV, STV, AVR, withings, HM-sec-*, HM-CC-RT-DN, AMAD, PCA301, arlo, Aqara

rabehd

Zitat von: mi.ke am 15 Oktober 2019, 12:35:47
Moin,

hat jemand eine Idee, woher (Modul) ich die Zeiten des Sonnenaufgang/-untergang für die nächsten 1 bis 4 Tagen bekommen kann.

Danke

cheers
mi.ke

Gehört nicht wirklich als Frage hierein,. Nennt man das nicht "kapern"?

Schau mal ins Wiki vom Modul Astro.
Auch funktionierende Lösungen kann man hinterfragen.

Otto123

Oder schau in die Doku von sunrise_el
Zitatsunrise_abs_dat() and sunset_abs_dat() return the absolute time of the corresponding event to a given date(no 24 hours added).
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

mi.ke

Zitat von: rabehd am 15 Oktober 2019, 12:40:24
Gehört nicht wirklich als Frage hierein,. Nennt man das nicht "kapern"?

Schau mal ins Wiki vom Modul Astro.

Bin ich völlig anderer Meinung!
1.)
Wenn schon fc0_Sonnenstunden, warum dann nicht auch fc1_Sonnenstunden, fc2_Sonnenstunden, fc3_Sonnenstunden.
Ausserdem bist Du ja auch nicht der Themenstarter.

2.)
In diesem Thead geht es um sunrise/sunset nicht um Astro

Zitat von: Otto123 am 15 Oktober 2019, 12:52:39
Oder schau in die Doku von sunrise_el

Otto, mal wieder ein fettes Danke

Cheers
mi.ke
FHEM 5.9 | RPi4 + 5 x RPi(Z) + FB7590 + FB 6890 LTE via LAN und WAN (VPN) verbunden.
2 x CUL868 + 3 x RFXTRX(e) + 6 x HMwLanGW + 4 x z2tGw + 5 x LGW + 2 x IRBlast + CO2 +++
FS20, FHT, FMS, Elro(mod), CM160, Revolt, LGTV, STV, AVR, withings, HM-sec-*, HM-CC-RT-DN, AMAD, PCA301, arlo, Aqara

rabehd

Auch funktionierende Lösungen kann man hinterfragen.

Otto123

#10
Zitat von: Jewe am 14 Oktober 2019, 22:58:14
Das Wiki und das Threat hatte ich auch gefunden. Allerdings war der Threat ja nicht so ganz erfolgreich...

Ich habe es nun so gelöst :

fc0_Sonnenstunden {sprintf "%.1f", ((time_str2num("2000-01-01 ".sunset_abs())-time_str2num("2000-01-01 ".sunrise_abs())* ReadingsNum("Wetter", "fc0_sun", 0)/100)/3600)}

Danke Euch, Jens
Hallo Jens,

die Formel stimmt so nicht, da fehlen ein paar  Klammern bzw ist eine falsch gesetzt - und man kann die Klammer für sprintf  weglassen:  ;)
fc0_Sonnenstunden {sprintf "%.1f", (time_str2num("2000-01-01 ".sunset_abs())-time_str2num("2000-01-01 ".sunrise_abs()))* ReadingsNum("Wetter", "fc0_sun", 0)/100/3600}
Erklärung: Die Differenz muss zuerst ausgeführt werden!

Gruß Otto
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

Jewe

Zitat von: Otto123 am 16 Oktober 2019, 09:21:58
Hallo Jens,

die Formel stimmt so nicht, da fehlen ein paar  Klammern bzw ist eine falsch gesetzt - und man kann die Klammer für sprintf  weglassen:  ;)
fc0_Sonnenstunden {sprintf "%.1f", (time_str2num("2000-01-01 ".sunset_abs())-time_str2num("2000-01-01 ".sunrise_abs()))* ReadingsNum("Wetter", "fc0_sun", 0)/100/3600}
Erklärung: Die Differenz muss zuerst ausgeführt werden!

Gruß Otto

Hallo Otto,

das war letzte Nacht einfach zuviel.... Danke, mit den richtigen Klammern passt es nun.

Grüssle Jens

Jewe

Zitat von: Otto123 am 16 Oktober 2019, 09:21:58
Hallo Jens,

die Formel stimmt so nicht, da fehlen ein paar  Klammern bzw ist eine falsch gesetzt - und man kann die Klammer für sprintf  weglassen:  ;)
fc0_Sonnenstunden {sprintf "%.1f", (time_str2num("2000-01-01 ".sunset_abs())-time_str2num("2000-01-01 ".sunrise_abs()))* ReadingsNum("Wetter", "fc0_sun", 0)/100/3600}
Erklärung: Die Differenz muss zuerst ausgeführt werden!

Gruß Otto

Hallo Otto,

mit den Klammern ist doch besser, sonst gibts wieder eine andere Warnung.

So passt es nun :
fc0_Sonnenstunden {sprintf "%.1f", ((time_str2num("2000-01-01 ".sunset_abs())-time_str2num("2000-01-01 ".sunrise_abs()))* ReadingsNum("Wetter", "fc0_sun", 0)/100/3600)}