From 8c2001901500fa033f90f5a27fc10cc50cdc43a6 Mon Sep 17 00:00:00 2001 From: nasseeder1 Date: Sat, 15 Oct 2022 17:17:38 +0000 Subject: [PATCH] 76_SolarForecast.pm: contrib 0.70.3 git-svn-id: https://svn.fhem.de/fhem/trunk@26541 2b470e98-0d58-463d-a4d8-8e2adae1ed80 --- fhem/contrib/DS_Starter/76_SolarForecast.pm | 39 ++++++++++----------- 1 file changed, 19 insertions(+), 20 deletions(-) diff --git a/fhem/contrib/DS_Starter/76_SolarForecast.pm b/fhem/contrib/DS_Starter/76_SolarForecast.pm index a5a365281..13fd07209 100644 --- a/fhem/contrib/DS_Starter/76_SolarForecast.pm +++ b/fhem/contrib/DS_Starter/76_SolarForecast.pm @@ -126,6 +126,8 @@ BEGIN { # Versions History intern my %vNotesIntern = ( + "0.70.3 "=> "15.10.2022 use readingsBulkUpdateIfChanged in function createReadingsFromArray ", + "0.70.2 "=> "15.10.2022 average calculation in _calcCAQwithSolCastPercentil, delete reduce by temp in __calcSolCastEstimates ", "0.70.1 "=> "14.10.2022 new function setTimeTracking ", "0.70.0 "=> "13.10.2022 delete Attr solCastPercentile, new manual Setter pvSolCastPercentile_XX ", "0.69.0 "=> "12.10.2022 Autocorrection function for model SolCast-API, __solCast_ApiRequest: request only 48 hours ", @@ -2332,6 +2334,10 @@ sub Attr { $val = ($do == 1 ? "disabled" : "initialized"); readingsSingleUpdate($hash, "state", $val, 1); } + + if($aName eq "createTomorrowPVFcReadings") { + deleteReadingspec ($hash, "Tomorrow_Hour.*"); + } if ($cmd eq "set") { if ($aName eq "interval") { @@ -3541,18 +3547,7 @@ sub __calcSolCastEstimates { my $peaksum = 0; for my $string (sort keys %{$data{$type}{$name}{strings}}) { - my $peak = $data{$type}{$name}{strings}{$string}{peak}; # String Peak (kWp) - - $paref->{peak} = $peak; - $paref->{cloudcover} = $cloudcover; - $paref->{temp} = $temp; - - my ($peakloss, $modtemp) = ___calcPeaklossByTemp ($paref); # Reduktion Peakleistung durch Temperaturkoeffizienten der Module (vorzeichengehaftet) - $peak += $peakloss; - - delete $paref->{peak}; - delete $paref->{cloudcover}; - delete $paref->{temp}; + my $peak = $data{$type}{$name}{strings}{$string}{peak}; # String Peak (kWp) $peak *= 1000; @@ -3565,8 +3560,6 @@ sub __calcSolCastEstimates { "Starttime" => $wantdt, "modulePeakString" => $peak." W", "Forecasted temperature" => $temp." °C", - "Module Temp (calculated)" => $modtemp." °C", - "Loss String Peak Power by Temp" => $peakloss." kWP", "Cloudcover" => $cloudcover, "CloudFactorDamping" => $clouddamp." %", "Cloudfactor" => $ccf, @@ -5524,7 +5517,7 @@ sub _calcReadingsTomorrowPVFc { my $type = $hash->{TYPE}; - deleteReadingspec ($hash, "Tomorrow_Hour.*"); + # deleteReadingspec ($hash, "Tomorrow_Hour.*"); my $h = $data{$type}{$name}{nexthours}; my $hods = AttrVal($name, 'createTomorrowPVFcReadings', ''); @@ -8027,7 +8020,7 @@ sub _calcCAQwithSolCastPercentil { 90 => $est90, ); - my $perc = 50; # Standardpercentil + my $perc = 50; # Standardpercentil my $diff0 = abs ($est50 - $pvval); ## no critic 'NoStrict' for my $p (sort keys %pc) { @@ -8048,14 +8041,14 @@ sub _calcCAQwithSolCastPercentil { my ($usenhd) = __useNumHistDays ($name); # ist Attr numHistDays gesetzt ? if($dnum) { # Werte in History vorhanden -> haben Prio ! - $avgperc = $avgperc * $dnum; + $avgperc = $avgperc; $dnum++; - $perc = sprintf "%.0f", ((($avgperc + $perc) / $dnum) / 10); + $perc = sprintf "%.0f", ((($avgperc + $perc) / 2) / 10); } elsif($oldperc && !$usenhd) { # keine Werte in History vorhanden, aber in CircularVal && keine Beschränkung durch Attr numHistDays $oldperc = $oldperc * $oldq; $dnum = $oldq + 1; - $perc = sprintf "%.0f", ((($oldperc + $perc) / $dnum) / 10); + $perc = sprintf "%.0f", ((($oldperc + $perc) / 2) / 10); } else { # ganz neuer Wert $perc = sprintf "%.0f", ($perc / 10); @@ -9070,7 +9063,13 @@ sub createReadingsFromArray { for my $elem (@$daref) { my ($rn,$rval,$ts) = split "<>", $elem, 3; - readingsBulkUpdate($hash, $rn, $rval, undef, $ts); + + if ($ts) { + readingsBulkUpdate ($hash, $rn, $rval, undef, $ts); + } + else { + readingsBulkUpdateIfChanged ($hash, $rn, $rval); + } } readingsEndUpdate($hash, $doevt);