From 2ab0d9d80720e516d729a438f3de9eae8bcea6cf Mon Sep 17 00:00:00 2001 From: Beta-User <> Date: Sun, 6 Dec 2020 05:43:44 +0000 Subject: [PATCH] Twilight: add option to get tomorrows sr/ss-times; cref typos git-svn-id: https://svn.fhem.de/fhem/trunk@23296 2b470e98-0d58-463d-a4d8-8e2adae1ed80 --- fhem/FHEM/59_Twilight.pm | 32 ++++++++++++++++++++++++-------- 1 file changed, 24 insertions(+), 8 deletions(-) diff --git a/fhem/FHEM/59_Twilight.pm b/fhem/FHEM/59_Twilight.pm index 94600ecec..ad664a02c 100644 --- a/fhem/FHEM/59_Twilight.pm +++ b/fhem/FHEM/59_Twilight.pm @@ -589,8 +589,8 @@ sub Twilight_calc { my $hash = shift; my $deg = shift; my $idx = shift // return; - - my $now = time(); + my $now = shift // time(); + my $midnight = $now - secondsSinceMidnight( $now ); my $lat = $hash->{helper}{'.LATITUDE'}; my $long = $hash->{helper}{'.LONGITUDE'}; @@ -1005,9 +1005,19 @@ sub Twilight_CompassPoint { } sub twilight { - my ( $twilight, $reading, $min, $max ) = @_; + my ( $twilight, $reading, $min, $max, $cloudCover ) = @_; + my $hash = $defs{$twilight}; + return "unknown device $twilight" if !defined $hash; + + my $t; + + $t = hms2h( ReadingsVal( $twilight, $reading, 0 ) ) if $reading ne "sr_tomorrow" and $reading ne "ss_tomorrow"; - my $t = hms2h( ReadingsVal( $twilight, $reading, 0 ) ); + if ($reading eq "sr_tomorrow" or $reading eq "ss_tomorrow") { + my $wh = Twilight_getWeatherHorizon( $hash, $cloudCover // 50, 0); + my ($sr, $ss) = Twilight_calc( $hash, $wh, "7", time() + DAYSECONDS ); + $t = hms2h( FmtTime( $reading eq "sr_tomorrow" ? $sr : $ss ) ); + } $t = hms2h($min) if ( defined($min) && ( hms2h($min) > $t ) ); $t = hms2h($max) if ( defined($max) && ( hms2h($max) < $t ) ); @@ -1143,6 +1153,8 @@ __END__ 5 - weather twilight, sun is between indoor_horizon and a virtual weather horizon (the weather horizon depends on weather conditions (optional)
6 - maximum daylight

+ state will reflect the current virtual "day phase" (0 = after midnight, 1 = sr_astro has passed, ...12 = ss_astro has passed)
+ Azimut, Elevation, Twilight
The module calculates additionally the azimuth and the elevation of the sun. The values can be used to control a roller shutter. @@ -1285,8 +1297,7 @@ Example:

indoor_horizon
- Der Parameter indoor_horizon bestimmt einen virtuellen Horizont, der für die Berechnung der Dämmerung innerhalb von Rämen genutzt werden kann. Minimalwert ist -6 (ergibt gleichen Wert wie Zivile Dämmerung). Bei 0 fallen - indoor- und realer Dämmerungswert zusammen. Werte grösser 0 ergeben frühere Werte für den Abend bzw. spätere für den Morgen. + Der Parameter indoor_horizon bestimmt einen virtuellen Horizont, der für die Berechnung der Dämmerung innerhalb von Räumen genutzt werden kann. Minimalwert ist -6 (ergibt gleichen Wert wie Zivile Dämmerung). Bei 0 fallen indoor- und realer Dämmerungswert zusammen. Werte größer 0 ergeben frühere Werte für den Abend bzw. spätere für den Morgen.

weatherDevice:Reading
@@ -1301,7 +1312,7 @@ Example:
Ein Twilight-Device berechnet periodisch die Dämmerungszeiten und -phasen während des Tages. Es berechnet ein virtuelles "Licht"-Element das einen Indikator für die momentane Tageslichtmenge ist. - Neben der Position auf der Erde wird es vom sog. "indoor horizon" (Beispielsweise hohe Gebäde oder Berge) + Neben der Position auf der Erde wird es vom sog. "indoor horizon" (Beispielsweise hohe Gebäude oder Berge) und dem Wetter beeinflusst. Schlechtes Wetter führt zu einer Reduzierung des Tageslichts für den ganzen Tag. Das berechnete Licht liegt zwischen 0 und 6 wobei die Werte folgendes bedeuten:

light @@ -1314,6 +1325,8 @@ Example: 5 - Wetterbedingte Dämmerung, die Sonne ist zwischen indoor_horizon und einem virtuellen Wetter-Horizonz (der Wetter-Horizont ist Wetterabhängig (optional)
6 - Maximales Tageslicht

+ state entspricht der aktuellen virtuellen "Tages-Phase" (0 = nach Mitternacht, 1 = nach sr_astro, ...12 = nach ss_astro)
+ Azimut, Elevation, Twilight (Seitenwinkel, Höhenwinkel, Dämmerung)
Das Modul berechnet zusätzlich Azimuth und Elevation der Sonne. Diese Werte können zur Rolladensteuerung verwendet werden.

@@ -1381,7 +1394,7 @@ Wissenswert dazu ist, dass die Sonne, abhägnig vom Breitengrad, bestimmte E
  • readingFnAttributes
  • useExtWeather <device>:<reading> [<usercode>]
  • Nutzt Daten von einem anderen Device um twilight_weather zu berechnen.
    - Das Reading sollte sich im Intervall zwischen 0 und 100 bewegen, z.B. das Reading c_clouds in einemopenweathermap device, bei dem 0 heiteren und 100 bedeckten Himmel bedeuten. + Das Reading sollte sich im Intervall zwischen 0 und 100 bewegen, z.B. das Reading c_clouds in einem openweathermap device, bei dem 0 heiteren und 100 bedeckten Himmel bedeuten. Wettereffekte wie Starkregen oder Gewitter k¨nnen derzeit für die Berechnung von twilight_weather nicht mehr herangezogen werden.
    Durch Angabe von usercode (Achtung: experimentelles feature! Kann auch schiefgehen...) kann die Berechnung der sr_weather und ss_weather-Zeiten verbessert werden, indem die zum jeweils zugehörigen indoor-Zeitpunkt gehörenden Vorhersage-Werte zurückgegeben werden. Das Rückgabe-Format der Funktion muss sein:
    @@ -1414,6 +1427,9 @@ Wissenswert dazu ist, dass die Sonne, abhägnig vom Breitengrad, bestimmte E
          $minParameter min time - optional
          $maxParameter max time - optional
          
    +     

    + Optional ist es möglich, auch die morgigen sr_weather bzw. ss_weather abzufragen, dafür werden die "fiktiven" Reading-Namen "sr_tomorrow" bzw. "ss_tomorrow" verwendet. Als Bedeckungsgrad wird dabei ein fiktiver Wert von "50" angenommen, dieser kann mit (optionalem) 5. Parameter auch abweichend (Bereich: 0-100) angegeben werden. Beispiel:
    + { twilight('tw_test1','sr_tomorrow','08:00','09:10',100) }
    Anwendungsbeispiel: