diff --git a/fhem/contrib/DS_Starter/76_SolarForecast.pm b/fhem/contrib/DS_Starter/76_SolarForecast.pm index bf35c2570..c6adb6562 100644 --- a/fhem/contrib/DS_Starter/76_SolarForecast.pm +++ b/fhem/contrib/DS_Starter/76_SolarForecast.pm @@ -160,6 +160,7 @@ BEGIN { # Versions History intern my %vNotesIntern = ( + "1.52.13"=> "16.06.2025 _genSpecialReadings: new option remainingHrsWoChargeRcmdBat_XX ", "1.52.12"=> "15.06.2025 readCacheFile: option aitrained -> Code optimized for saving memory ". "fillupMessageSystem: prevent Icon failore if SV contain spaces ". "setupBatteryDevXX: 'dyn' -> Battery color can be dynamically set depending from SoC value ", @@ -1453,6 +1454,12 @@ my %hcsr = ( $hcsr{'todayBatOut_'.$bn}{par} = 99; $hcsr{'todayBatOut_'.$bn}{unit} = ' Wh'; $hcsr{'todayBatOut_'.$bn}{def} = 0; + + $hcsr{'remainingHrsWoChargeRcmdBat_'.$bn}{fnr} = 5; + $hcsr{'remainingHrsWoChargeRcmdBat_'.$bn}{fn} = \&NexthoursVal; + $hcsr{'remainingHrsWoChargeRcmdBat_'.$bn}{par} = 'rcdchargebat'.$bn; + $hcsr{'remainingHrsWoChargeRcmdBat_'.$bn}{unit} = ''; + $hcsr{'remainingHrsWoChargeRcmdBat_'.$bn}{def} = '-'; } # Funktiontemplate zur Speicherung von Werten in pvHistory @@ -14396,6 +14403,24 @@ sub _genSpecialReadings { storeReading ($prpo.'_'.$kpi, $d2c); } + elsif ($kpi =~ /remainingHrsWoChargeRcmdBat_/xs) { + my $bn = (split "_", $kpi)[1]; + my $n = 0; + + for my $idx (sort keys %{$data{$name}{nexthours}}) { + my $istoday = &{$hcsr{$kpi}{fn}} ($name, $idx, 'today', 0); + last if(!$istoday); + + my $rcdcharge = &{$hcsr{$kpi}{fn}} ($name, $idx, $hcsr{$kpi}{par}, $def); + + if (!$rcdcharge) { + $n++; + } + } + + storeReading ($prpo.'_'.$kpi, $n); + + } elsif ($kpi eq 'todayGridFeedIn') { my $idfi = &{$hcsr{$kpi}{fn}} ($hash, $hcsr{$kpi}{par}, 'initdayfeedin', $def); # initialer Tagesstartwert my $cfi = &{$hcsr{$kpi}{fn}} ($hash, $hcsr{$kpi}{par}, 'feedintotal', $def); # aktuelles total Feed In @@ -14710,7 +14735,7 @@ sub entryGraphic { lotype => CurrentVal ($name, 'layoutType', 'double'), hourstyle => CurrentVal ($name, 'hourStyle', ''), hdrDetail => CurrentVal ($name, 'headerDetail', 'all'), # ermöglicht den Inhalt zu begrenzen, um bspw. passgenau in ftui einzubetten - fsize => CurrentVal ($name, 'spaceSize', SPACESIZE), + spacesz => CurrentVal ($name, 'spaceSize', SPACESIZE), kw => CurrentVal ($name, 'energyUnit', 'Wh'), clegendpos => CurrentVal ($name, 'showLegend', 'icon_top'), # Lage und Art Cunsumer Legende clink => CurrentVal ($name, 'detailLink', 1), # Link zur Detailansicht des Verbrauchers @@ -16682,7 +16707,7 @@ sub _beamGraphic { my $show_diff = $paref->{show_diff}; # zusätzliche Anzeige $di{} in allen Typen my $lotype = $paref->{lotype}; my $height = $paref->{height}; - my $fsize = $paref->{fsize}; + my $spacesz = $paref->{spacesz}; my $kw = $paref->{kw}; my $colorb1 = $paref->{colorb1}; my $colorb2 = $paref->{colorb2}; @@ -16775,13 +16800,13 @@ sub _beamGraphic { # Berechnung der Zonen ######################## if ($lotype eq 'single') { - $he = int(($maxVal - $hfcg->{$i}{beam1}) / $maxVal * $height) + $fsize; # Der zusätzliche Offset durch $fsize verhindert bei den meisten Skins dass die Grundlinie der Balken nach unten durchbrochen wird - $z3 = int($height + $fsize - $he); + $he = int(($maxVal - $hfcg->{$i}{beam1}) / $maxVal * $height) + $spacesz; # Der zusätzliche Offset durch $spacesz verhindert bei den meisten Skins dass die Grundlinie der Balken nach unten durchbrochen wird + $z3 = int($height + $spacesz - $he); $titz3 = qq/title="$hfcg->{0}{beam1txt}"/; } if ($lotype eq 'double') { - # he - freier der Raum über den Balken. fsize wird nicht verwendet, da bei diesem Typ keine Zahlen über den Balken stehen + # he - freier der Raum über den Balken. spacesz wird nicht verwendet, da bei diesem Typ keine Zahlen über den Balken stehen # z2 - primärer Balkenwert ggf. mit Icon # z3 - sekundärer Balkenwert, bei zu kleinem Wert wird der Platz komplett Zone 2 zugeschlagen und nicht angezeigt # z2 und z3 nach Bedarf tauschen, wenn sekundärer Balkenwert > primärer Balkenwert @@ -16805,17 +16830,17 @@ sub _beamGraphic { $z2 = int (($z2 - $z3) / $maxVal * $height); $z3 = int ($height - $he - $z2); # was von maxVal noch übrig ist - if ($z3 < int($fsize / 2)) { # dünnen Strichbalken vermeiden / ca. halbe Zeichenhöhe + if ($z3 < int($spacesz / 2)) { # dünnen Strichbalken vermeiden / ca. halbe Zeichenhöhe $z2 += $z3; $z3 = 0; } } if ($lotype eq 'diff') { - # he - freier der Raum über den Balken , Zahl positiver Wert + fsize + # he - freier der Raum über den Balken , Zahl positiver Wert + spacesz # z2 - positiver Balken inkl Icon # z3 - negativer Balken - # z4 - Zahl negativer Wert + fsize + # z4 - Zahl negativer Wert + spacesz my ($px_pos,$px_neg); my $maxValBeam = 0; # ToDo: maxValBeam noch aus maxVal ableiten @@ -16858,9 +16883,9 @@ sub _beamGraphic { $z4 = (!$px_neg || !$minDif) ? 0 : int((abs($minDif)-$z3) / abs($minDif) * $px_neg); # Teilung durch 0 unbedingt vermeiden $z3 = ($px_neg - $z4); - # Beiden Zonen die Werte ausgeben könnten muß fsize als zusätzlicher Raum zugeschlagen werden ! - $he += $fsize; - $z4 += $fsize if($z3); # komplette Grafik ohne negativ Balken, keine Ausgabe von z3 & z4 + # Beiden Zonen die Werte ausgeben könnten muß spacesz als zusätzlicher Raum zugeschlagen werden ! + $he += $spacesz; + $z4 += $spacesz if($z3); # komplette Grafik ohne negativ Balken, keine Ausgabe von z3 & z4 } ## Erstellung der Balken @@ -25892,44 +25917,45 @@ to ensure that the system configuration is correct.
@@ -28519,44 +28545,45 @@ die ordnungsgemäße Anlagenkonfiguration geprüft werden.