diff --git a/fhem/contrib/DS_Starter/76_SolarForecast.pm b/fhem/contrib/DS_Starter/76_SolarForecast.pm index d3452ea3e..cc3edf356 100644 --- a/fhem/contrib/DS_Starter/76_SolarForecast.pm +++ b/fhem/contrib/DS_Starter/76_SolarForecast.pm @@ -160,7 +160,8 @@ BEGIN { # Versions History intern my %vNotesIntern = ( - "1.59.0" => "06.10.2025 new sub __normIconBoxScale to fix problem with chromium engine > 140.x, Forum: https://forum.fhem.de/index.php?msg=1349058 ", + "1.59.1" => "07.10.2025 ", + "1.59.0" => "06.10.2025 new sub __normIconInnerScale to fix problem with chromium engine > 140.x, Forum: https://forum.fhem.de/index.php?msg=1349058 ", "1.58.8" => "06.10.2025 __batChargeOptTargetPower: minor Code change ", "1.58.7" => "05.10.2025 fix negative SoC forecast when using optPower Forum: https://forum.fhem.de/index.php?msg=1348954 ", "1.58.6" => "03.10.2025 __batChargeMgmt code changed, new sub ___batChargeSaveResults, remove reading Battery_ChargeRecommended_XX ". @@ -11920,12 +11921,13 @@ sub _batChargeMgmt { my $nhr = $hopt->{$shod}{nhr}; my @batteries = grep { !/^(?:fd|speff|surplswh|nhr)$/xs } keys %{$hopt->{24}}; - for my $bat (sort @batteries) { + for my $bat (sort @batteries) { + next if(!defined $hopt->{$shod}{$bat}{batinstcap}); my $ssocwh = $hopt->{$shod}{$bat}{runwh} // '-'; ## SOC-Prognose OTP ##################### - my $fcendwh = $hopt->{$shod}{$bat}{fcendwh} // 0; + my $fcendwh = $hopt->{$shod}{$bat}{fcendwh} // 0; $progsoc = sprintf "%.1f", (100 * $fcendwh / $hopt->{$shod}{$bat}{batinstcap}); # Prognose SoC in % ## Speicherung und Readings erstellen OTP @@ -12025,9 +12027,10 @@ sub __batChargeOptTargetPower { my $otp; for my $hod (sort { $a <=> $b } keys %{$hsurp}) { - my $spls = int $hsurp->{$hod}{surplswh}; - my $newshod = sprintf "%02d", (int $hod + 1); - my $nhr = $hsurp->{$hod}{nhr}; + my $nhr = $hsurp->{$hod}{nhr}; + my $spls = int ($hsurp->{$hod}{surplswh} // 0); + my $nexthod = sprintf "%02d", (int $hod + 1); + my $nextnhr = $hsurp->{$nexthod}{nhr}; my @remaining_hods = grep { int $_ >= int $hod } @sortedhods; @@ -12055,7 +12058,7 @@ sub __batChargeOptTargetPower { my $runwhneed = $goalwh - $runwh; my $achievable = 1; my $total = 0; - $total += $hsurp->{$_}{surplswh} for @remaining_hods; # Gesamtkapazität aller Stunden mit PV-Überschuß ermitteln + $total += $hsurp->{$_}{surplswh} for @remaining_hods; # Gesamtkapazität aller Stunden mit PV-Überschuß ermitteln if ($total * $befficiency < $goalwh) { # Erreichbarkeit des Ziels (benötigte Ladeenergie total) prüfen $achievable = 0; @@ -12069,7 +12072,8 @@ sub __batChargeOptTargetPower { $hsurp->{$hod}{$sbn}{pneedmin} = $bpinmax; $runwh += $hsurp->{$hod}{speff} / $befficiency; # um Verbrauch reduzieren - $hsurp->{$hod}{$sbn}{fcendwh} = sprintf "%.0f", max ($lowSocwh, $runwh); # untere Begrenzung auf lowSoC + $hsurp->{$hod}{$sbn}{fcendwh} = sprintf "%.0f", max ($lowSocwh, $runwh); # untere Begrenzung auf lowSoC + $hsurp->{$nexthod}{$sbn}{fcnextwh} = $hsurp->{$hod}{$sbn}{fcendwh} if(defined $nextnhr); # Startwert kommende Stunde if ($nhr eq '00') { $otp->{$sbn}{target} = $csocwh <= $lowSocwh ? $bpinreduced : $bpinmax; @@ -12118,15 +12122,15 @@ sub __batChargeOptTargetPower { - $hsurp->{$hod}{$sbn}{fcendwh} = sprintf "%.0f", min ($goalwh, $runwh # Endwert Prognose aktuelle Stunde + $hsurp->{$hod}{$sbn}{fcendwh} = sprintf "%.0f", min ($goalwh, $runwh # Endwert Prognose aktuelle Stunde + $befficiency * ($nhr eq '00' ? $otp->{$sbn}{target} : $spls ) - ); - - $hsurp->{$newshod}{$sbn}{fcnextwh} = $hsurp->{$hod}{$sbn}{fcendwh}; # Startwert kommende Stunde + ); + + $hsurp->{$nexthod}{$sbn}{fcnextwh} = $hsurp->{$hod}{$sbn}{fcendwh} if(defined $nextnhr); # Startwert kommende Stunde } } @@ -18725,9 +18729,9 @@ END0 } ); - $cicon = FW_makeImage ($cicon, ''); - $cicon = __normIconBoxScale ($cicon); - + $cicon = FW_makeImage ($cicon, ''); + $cicon = __normIconInnerScale ($cicon); + $ret .= qq{}; $ret .= "$calias".$cicon; $ret .= ' '; @@ -18766,8 +18770,8 @@ END1 $hicon = $hicon.'@'.$pahcol; } - $hicon = FW_makeImage ($hicon, ''); - $hicon = __normIconBoxScale ($hicon); + $hicon = FW_makeImage ($hicon, ''); + $hicon = __normIconInnerScale ($hicon); $ret .= qq{}; # translate(X-Koordinate,Y-Koordinate) $ret .= "$hmtxt".$hicon; @@ -18788,8 +18792,8 @@ END1 ); - $dicon = FW_makeImage ($dicon, ''); - $dicon = __normIconBoxScale ($dicon); + $dicon = FW_makeImage ($dicon, ''); + $dicon = __normIconInnerScale ($dicon); $ret .= qq{}; $ret .= "$dumtxt".$dicon; @@ -19268,8 +19272,8 @@ sub __addInputProducerIcon { } ); - $genericon = FW_makeImage ($genericon, ''); - $genericon = __normIconBoxScale ($genericon); + $genericon = FW_makeImage ($genericon, ''); + $genericon = __normIconInnerScale ($genericon); $ret .= qq{}; $ret .= "$genertxt".$genericon; @@ -19287,8 +19291,8 @@ sub __addInputProducerIcon { } ); - $picon = FW_makeImage ($picon, ''); - $picon = __normIconBoxScale ($picon); + $picon = FW_makeImage ($picon, ''); + $picon = __normIconInnerScale ($picon); $ret .= qq{}; $ret .= "$ptxt".$picon; @@ -19323,8 +19327,8 @@ sub __addNodeIcon { } ); - $nicon = FW_makeImage ($nicon, ''); - $nicon = __normIconBoxScale ($nicon); + $nicon = FW_makeImage ($nicon, ''); + $nicon = __normIconInnerScale ($nicon); my $ret = qq{}; # translate(X-Koordinate,Y-Koordinate) $ret .= "$ntxt".$nicon; @@ -19569,9 +19573,9 @@ return $p; ################################################################ # liefere skaliertes Icon in einer normierten Viewbox ################################################################ -sub __normIconBoxScale { +sub __normIconInnerScale { my $icon = shift; - my $size = shift // 72; + my $size = shift // 70; my $pad = shift // 0; return $icon unless $icon =~ m{]*)>(.*?)}si; @@ -19594,7 +19598,7 @@ sub __normIconBoxScale { $ox += $pad; # fügt $pad ViewBox-Einheiten Rand links bzw. oben hinzu. $oy += $pad; - my $inner = qq{}.$inner.''; # gib Inner-Content zurück, umgeben von der Transform-Gruppe + my $inner = qq{}.$inner.''; # gib Inner-Content zurück, umgeben von der Transform-Gruppe return $inner; }