Hauptmenü

time_str2num und DOIF

Begonnen von Docter, 13 Februar 2024, 09:06:48

Vorheriges Thema - Nächstes Thema

Docter

ich versuche mit den 2 Werte von SunRise und SunSet aus ProPlanta die Tageslänge zu berechnen.

Diese werden in HH:MM dargestellt.
Leider gelingt es mir nicht, diese zu wandeln und in sinnvoll Zeiten zu konvertieren, so dass ich eine Differenz berechnen kann.

so versuche ich es...

(
([[WetterProplanta:fc0_moonRise]])
)
(setreading KLIMA_Sun_Elevation X_SunRise {(time_str2num(ReadingsTimestamp("WetterProplanta","fc0_sunrise",0)))})
(setreading KLIMA_Sun_Elevation X_SunSet  {(time_str2num(ReadingsTimestamp("WetterProplanta","fc0_sunset",0)))})

(setreading KLIMA_Sun_Elevation X_DayLength {([KLIMA_Sun_Elevation:X_SunSet]-[KLIMA_Sun_Elevation:X_SunRise])})

Natürlich ist ReadingTimeStamp Quatsch, das ist ja der TimeStamp... der Wert zum Bsp.: 07:35 steht im Reading

Ich bekomme es leider einfach hin zusammen...

Danke
Thomas

Carsten K.

Moin Thomas,
bestimmt gibt es geschicktere Ansätze als meinen; aber ich denke, Du kannst die einzelnen Berechnungen leicht nachvollziehen...

Probier's mal damit:
{
  my $sunRiseTimeStr = ReadingsVal("WetterProplanta", "fc0_sunRise", "00:00");
  my $sunSetTimeStr = ReadingsVal("WetterProplanta", "fc0_sunSet", "00:00");
  my $sunRiseDateTime = "01-01-01 " . $sunRiseTimeStr;
  my $sunSetDateTime = "01-01-01 " . $sunSetTimeStr;
  my $dayLengthSeconds = time_str2num($sunSetDateTime) - time_str2num($sunRiseDateTime);
  my $dayLengthHours = floor($dayLengthSeconds / (60 * 60));
  my $dayLengthMinutes = ($dayLengthSeconds - ($dayLengthHours * 3600)) / 60;
  my $dayLengthAsTimeStr = sprintf "%02d:%02d", $dayLengthHours, $dayLengthMinutes;
}
Deine Variablen für setreading wären dann:
  • $sunRiseTimeStr
  • $sunSetTimeStr
  • $dayLengthAsTimeStr

Grüße,
Carsten
NUC FHEM on Debian, CC1101-USB-Lite 868MHz;
HM_HM_CC_RT_DN, HM-LC-SW1-PL2, HM_HM_TC_IT_WM_W_EU, HM-SEC-SC-2, HM-ES-TX-WM
FRITZ!DECT 200
Philips TV (Android), VuDuo2, VU Ultimo4k

rabehd

sub Daemmerung($$$)
{
# berechnet die Dauer zwischen 2 Uhrzeiten
# wird für ein Userreading benötigt
my($Device,$Val1,$Val2) = @_;
  my @splittime = split(/:/,TU_Get_Difference( ReadingsVal($Device, $Val2, "00:15").":00",ReadingsVal($Device, $Val1, "00:00").":00") );
my $Dauer = $splittime[2] + $splittime[1]*60 + $splittime[0]*3600;
return $Dauer;
}
Auch funktionierende Lösungen kann man hinterfragen.