diff --git a/fhem/contrib/DS_Starter/76_SolarForecast.pm b/fhem/contrib/DS_Starter/76_SolarForecast.pm index cf4310705..4650ca861 100644 --- a/fhem/contrib/DS_Starter/76_SolarForecast.pm +++ b/fhem/contrib/DS_Starter/76_SolarForecast.pm @@ -160,14 +160,14 @@ BEGIN { # Versions History intern my %vNotesIntern = ( - "1.54.1" => "07.07.2025 change utf8 to UTF-8, userExit: new coding, __createReduceIcon: fix Wide character in syswrite - https://forum.fhem.de/index.php?msg=1344368 ". + "1.54.1" => "07.07.2025 userExit: new coding, __createReduceIcon: fix Wide character in syswrite - https://forum.fhem.de/index.php?msg=1344368 ". "_setattrKeyVal: optimize function between execute from FHEMWEB and Commandline ". "_beamGraphicFirstHour, _beamGraphicRemainingHours: decimal places according to the setting of the energy unit", "1.54.0" => "05.07.2025 edit commandref, ___areaFactorTrack: important bugfix in calc of direct area factor for DWD use ", "1.53.3" => "04.07.2025 Change of the correction factor calculation to the ratio of real production and the API raw forecast ", "1.53.2" => "03.07.2025 graphicControl->showDiff can be set separately for each level ". "setupInverterDevXX: Check that there are no commas with spaces before and after (strings) ", - "1.53.1" => "30.06.2025 add UTF-8 smileys, fix Perl warning uninitialized value \$color ", + "1.53.1" => "30.06.2025 add utf8 smileys, fix Perl warning uninitialized value \$color ", "1.53.0" => "28.06.2025 new battery style (batcontainer), new key setupBatteryDevXX->label, new reading Battery_ChargeUnrestricted_XX ". "attribute graphicShowDiff replaced by graphicControl->showDiff ". "check local coordinates are set in global device and fill message system if failure ". @@ -3557,7 +3557,7 @@ sub __forecastSolar_ApiResponse { $data{$name}{statusapi}{ForecastSolar}{'?All'}{requests_remaining} = $jdata->{'message'}{'ratelimit'}{'remaining'}; # verbleibende Requests in Periode $data{$name}{statusapi}{ForecastSolar}{'?All'}{requests_limit_period} = $jdata->{'message'}{'ratelimit'}{'period'}; # Requests Limit Periode $data{$name}{statusapi}{ForecastSolar}{'?All'}{requests_limit} = $jdata->{'message'}{'ratelimit'}{'limit'}; # Requests Limit in Periode - $data{$name}{statusapi}{ForecastSolar}{'?All'}{place} = encode ('UTF-8', $jdata->{'message'}{'info'}{'place'}); + $data{$name}{statusapi}{ForecastSolar}{'?All'}{place} = encode ('utf8', $jdata->{'message'}{'info'}{'place'}); if ($debug =~ /apiCall/x) { Log3 ($name, 1, qq{$name DEBUG> ForecastSolar API Call - server response for PV string "$string"}); @@ -5488,8 +5488,8 @@ sub __generateCatOut { ## Ausgabe ############ my $out = ''; - $out .= ''.encode('UTF-8', $hqtxt{dwdcat}{$lang}).'
'; # The Deutscher Wetterdienst Station Catalog - $out .= encode('UTF-8', $hqtxt{nrsele}{$lang}).' '.$noe.'
'; # Selected entries + $out .= ''.encode('utf8', $hqtxt{dwdcat}{$lang}).'
'; # The Deutscher Wetterdienst Station Catalog + $out .= encode('utf8', $hqtxt{nrsele}{$lang}).' '.$noe.'
'; # Selected entries $out .= "($select)

"; $out .= qq{}; @@ -5614,7 +5614,7 @@ sub __dwdStatCatalog_Response { my @datarr = split "\n", $dat; for my $s (@datarr) { - $s = encode ('UTF-8', $s); + $s = encode ('utf8', $s); my ($id, $tail) = split " ", $s, 2; @@ -12643,7 +12643,7 @@ sub ___doPlanning { last; } else { - $paref->{supplement} = encode('UTF-8', $hqtxt{emsple}{$lang}); # 'erwarteter max Überschuss weniger als' + $paref->{supplement} = encode('utf8', $hqtxt{emsple}{$lang}); # 'erwarteter max Überschuss weniger als' $paref->{ps} = 'suspended:'; ___setConsumerPlanningState ($paref); @@ -12677,7 +12677,7 @@ sub ___doPlanning { } if (!$done) { - $paref->{supplement} = encode('UTF-8', $hqtxt{nmspld}{$lang}); # 'kein max Überschuss für den aktuellen Tag gefunden' + $paref->{supplement} = encode('utf8', $hqtxt{nmspld}{$lang}); # 'kein max Überschuss für den aktuellen Tag gefunden' $paref->{ps} = 'suspended:'; ___setConsumerPlanningState ($paref); @@ -13132,8 +13132,8 @@ sub ___switchConsumerOn { my $supplmnt = ConsumerVal ($hash, $c, 'planSupplement', ''); $paref->{supplement} = '' if($supplmnt =~ /swoncond\snot|swoncond\snicht/xs && $swoncond); - $paref->{supplement} = encode('UTF-8', $hqtxt{swonnm}{$lang}) if(!$swoncond); # 'swoncond not met' - $paref->{supplement} = encode('UTF-8', $hqtxt{swofmt}{$lang}) if($swoffcond); # 'swoffcond met' + $paref->{supplement} = encode('utf8', $hqtxt{swonnm}{$lang}) if(!$swoncond); # 'swoncond not met' + $paref->{supplement} = encode('utf8', $hqtxt{swofmt}{$lang}) if($swoffcond); # 'swoffcond met' if (defined $paref->{supplement}) { ___setConsumerPlanningState ($paref); @@ -15782,8 +15782,8 @@ sub _graphicHeader { $ydayDvtn =~ /^[1-9]/ ? $hqtxt{pltp}{$lang} : $hqtxt{snbefb}{$lang}; - $text_tdayDvtn = encode ('UTF-8', $text_tdayDvtn); - $text_ydayDvtn = encode ('UTF-8', $text_ydayDvtn); + $text_tdayDvtn = encode ('utf8', $text_tdayDvtn); + $text_ydayDvtn = encode ('utf8', $text_ydayDvtn); ## erste Header-Zeilen ####################### @@ -16039,17 +16039,17 @@ sub __createReduceIcon { my $img; if (!defined $rps) { - $title = encode ('UTF-8', $htitles{rdcstat}{$lang}); + $title = encode ('utf8', $htitles{rdcstat}{$lang}); $title =~ s//$name/xs; $img = '-'; } elsif ($rps) { - $title = encode ('UTF-8', $htitles{rdcactiv}{$lang}); + $title = encode ('utf8', $htitles{rdcactiv}{$lang}); $title =~ s//$name/xs; $img = FW_makeImage ('10px-kreis-gelb.png', $title); } else { - $title = encode ('UTF-8', $htitles{rdcnoact}{$lang}); + $title = encode ('utf8', $htitles{rdcnoact}{$lang}); $title =~ s//$name/xs; $img = FW_makeImage ('10px-kreis-gruen.png', $title); } @@ -16818,9 +16818,11 @@ sub _beamGraphicFirstHour { $hfcg->{0}{beam1} //= 0; $hfcg->{0}{beam2} //= 0; + my %roundable = map { $_ => 1 } qw(pvForecast pvReal consumptionForecast consumption); + my @beams = ($beam1cont, $beam2cont); $hfcg->{0}{diff} = sprintf "%.1f", ($hfcg->{0}{beam1} - $hfcg->{0}{beam2}); - $hfcg->{0}{diff} = sprintf "%.0f", $hfcg->{0}{diff} if($kw eq 'Wh' && ($beam1cont eq 'pvForecast' || $beam1cont eq 'pvReal')); - + $hfcg->{0}{diff} = sprintf "%.0f", $hfcg->{0}{diff} if($kw eq 'Wh' && grep { $roundable{$_} } @beams); + my $epc = CurrentVal ($hash, 'ePurchasePriceCcy', 0); my $efc = CurrentVal ($hash, 'eFeedInTariffCcy', 0); @@ -17029,8 +17031,10 @@ sub _beamGraphicRemainingHours { $hfcg->{$i}{beam1} //= 0; $hfcg->{$i}{beam2} //= 0; + my %roundable = map { $_ => 1 } qw(pvForecast pvReal consumptionForecast consumption); + my @beams = ($beam1cont, $beam2cont); $hfcg->{$i}{diff} = sprintf "%.1f", ($hfcg->{$i}{beam1} - $hfcg->{$i}{beam2}); - $hfcg->{$i}{diff} = sprintf "%.0f", $hfcg->{$i}{diff} if($kw eq 'Wh' && ($beam1cont eq 'pvForecast' || $beam1cont eq 'pvReal')); + $hfcg->{$i}{diff} = sprintf "%.0f", $hfcg->{$i}{diff} if($kw eq 'Wh' && grep { $roundable{$_} } @beams); $maxVal = $hfcg->{$i}{beam1} if($hfcg->{$i}{beam1} > $maxVal); $maxVal = $hfcg->{$i}{beam2} if($hfcg->{$i}{beam2} > $maxVal); @@ -19061,7 +19065,7 @@ sub weather2icon { my $txt = $lang eq "DE" ? "txtd" : "txte"; if (defined $weather_ids{$id}) { - return $weather_ids{$id}{icon}, encode('UTF-8', $weather_ids{$id}{$txt}); + return $weather_ids{$id}{icon}, encode('utf8', $weather_ids{$id}{$txt}); } return ('unknown',''); @@ -19350,8 +19354,8 @@ sub fillupMessageSystem { next if($smi >= IDXLIMIT); $midx++; $data{$name}{messages}{$midx}{SV} = trim ($data{$name}{preparedmessages}{$smi}{SV}); - $data{$name}{messages}{$midx}{DE} = encode ('UTF-8', $data{$name}{preparedmessages}{$smi}{DE}); - $data{$name}{messages}{$midx}{EN} = encode ('UTF-8', $data{$name}{preparedmessages}{$smi}{EN}); + $data{$name}{messages}{$midx}{DE} = encode ('utf8', $data{$name}{preparedmessages}{$smi}{DE}); + $data{$name}{messages}{$midx}{EN} = encode ('utf8', $data{$name}{preparedmessages}{$smi}{EN}); } # Integration File Messages @@ -19435,7 +19439,7 @@ sub outputMessages { next if($key >= IDXLIMIT); $hc++; - #my $enmsg = encode ('UTF-8', $data{$name}{messages}{$key}{$lang}); + #my $enmsg = encode ('utf8', $data{$name}{messages}{$key}{$lang}); my $enmsg = $data{$name}{messages}{$key}{$lang}; $out .= qq{}; @@ -21950,13 +21954,13 @@ sub checkPlantConfig { $out .= "
"; if ($cf) { - $out .= encode ("UTF-8", $hqtxt{strnok}{$lang}); + $out .= encode ("utf8", $hqtxt{strnok}{$lang}); } elsif ($wn) { - $out .= encode ("UTF-8", $hqtxt{strwn}{$lang}); + $out .= encode ("utf8", $hqtxt{strwn}{$lang}); } else { - $out .= encode ("UTF-8", $hqtxt{strok}{$lang}); + $out .= encode ("utf8", $hqtxt{strok}{$lang}); } $out =~ s/ (Bitte eventuelle Hinweise|Please note any information).*// if(!$io);