diff --git a/fhem/contrib/DS_Starter/76_SolarForecast.pm b/fhem/contrib/DS_Starter/76_SolarForecast.pm index 725123c63..edf28222c 100644 --- a/fhem/contrib/DS_Starter/76_SolarForecast.pm +++ b/fhem/contrib/DS_Starter/76_SolarForecast.pm @@ -118,7 +118,7 @@ BEGIN { # Versions History intern my %vNotesIntern = ( - "0.38.3" => "21.04.2021 minor fixes in sub calcVariance, Traffic light indicator for prediction quality ", + "0.38.3" => "21.04.2021 minor fixes in sub calcVariance, Traffic light indicator for prediction quality, some more fixes ", "0.38.2" => "20.04.2021 fix estConsumptionForecast, add consumption values to graphic ", "0.38.1" => "19.04.2021 bug fixing ", "0.38.0" => "18.04.2021 consumption forecast for the next hours prepared ", @@ -1349,10 +1349,10 @@ sub centralTask { RemoveInternalTimer($hash, "FHEM::SolarForecast::centralTask"); ### nicht mehr benötigte Readings/Daten löschen - kann später wieder raus !! - #for my $i (keys %{$data{$type}{$name}{pvhist}}) { + for my $i (keys %{$data{$type}{$name}{pvhist}}) { # delete $data{$type}{$name}{pvhist}{$i}{"00"}; - # delete $data{$type}{$name}{pvhist}{$i} if(!$i); # evtl. vorhandene leere Schlüssel entfernen - #} + delete $data{$type}{$name}{pvhist}{$i} if(!$i); # evtl. vorhandene leere Schlüssel entfernen + } #deleteReadingspec ($hash, "Today_Hour.*_Consumption"); #deleteReadingspec ($hash, "ThisHour_.*"); @@ -1698,7 +1698,8 @@ sub _transferDWDForecastValues { num => $num, uac => $uac, fh => $fh, - fd => $fd + fd => $fd, + day => $paref->{day} }; my $calcpv = calcPVforecast ($params); # Vorhersage gewichtet kalkulieren @@ -2464,7 +2465,7 @@ sub FwFn { my $link = forecastGraphic ($d); my $alias = AttrVal($d, "alias", $d); # Linktext als Aliasname oder Devicename setzen - my $dlink = "$alias"; + my $dlink = qq{$alias}; my $ret = ""; if(IsDisabled($d)) { @@ -2472,7 +2473,7 @@ sub FwFn { $ret .= ""; $ret .= ""; $ret .= ""; $ret .= ""; $ret .= "
"; - $ret .= "Solar forecast graphic device $d is disabled"; + $ret .= qq{Solar forecast graphic device $d is disabled}; $ret .= "
"; @@ -2526,7 +2527,7 @@ sub pageAsHtml { my $link = forecastGraphic ($name, $ftui); my $alias = AttrVal($name, "alias", $name); # Linktext als Aliasname oder Devicename setzen - my $dlink = "$alias"; + my $dlink = "$alias"; my $ret = ""; if(IsDisabled($name)) { @@ -2534,7 +2535,7 @@ sub pageAsHtml { $ret .= ""; $ret .= ""; $ret .= ""; $ret .= ""; $ret .= "
"; - $ret .= "SMA Portal graphic device $name is disabled"; + $ret .= qq{Solar Forecast Device $name is disabled}; $ret .= "
"; @@ -2584,7 +2585,7 @@ sub forecastGraphic { my $ta = ReadingsVal ($name, "moduleTiltAngle", undef); # Modul Neigungswinkel Konfig if(!$is || !$fcdev || !$radev || !$indev || !$peak || !defined $pv0 || !$dir || !$ta) { - my $link = qq{$name}; + my $link = qq{$name}; $height = AttrNum($name, 'beamHeight', 200); $ret .= ""; $ret .= ""; @@ -2757,7 +2758,7 @@ sub forecastGraphic { ########################## if ($header) { my $alias = AttrVal ($name, "alias", $name ); # Linktext als Aliasname - my $dlink = "$alias"; + my $dlink = qq{$alias}; my $lup = ReadingsTimestamp($name, ".lastupdateForecastValues", "0000-00-00 00:00:00"); # letzter Forecast Update my $lupt = "last update:"; @@ -3573,6 +3574,7 @@ sub calcPVforecast { my $type = $hash->{TYPE}; my $stch = $data{$type}{$name}{strings}; # String Configuration Hash my $pr = 1.0; # Performance Ratio (PR) + my $fh1 = $fh+1; my $chour = strftime "%H", localtime($t+($num*3600)); # aktuelle Stunde my $reld = $fd == 0 ? "today" : $fd == 1 ? "tomorrow" : "unknown"; @@ -3606,8 +3608,16 @@ sub calcPVforecast { } } - $data{$type}{$name}{nexthours}{"NextHour".sprintf("%02d",$num)}{pvcorrf} = $hc."/".$hq; + $data{$type}{$name}{nexthours}{"NextHour".sprintf("%02d",$num)}{pvcorrf} = $hc."/".$hq; + if($fd == 0 && $fh1) { + $paref->{pvcorrf} = $hc."/".$hq; + $paref->{nhour} = sprintf("%02d",$fh1); + $paref->{histname} = "pvcorrfactor"; + setPVhistory ($paref); + delete $paref->{histname}; + } + my $pvsum = 0; for my $st (@strings) { # für jeden String der Config .. @@ -3708,17 +3718,20 @@ sub calcVariance { next; } - my $oldfac = ReadingsNum ($name, "pvCorrectionFactor_".sprintf("%02d",$h), 1); # bisher definierter Korrekturfaktor - $oldfac = 1 if(1*$oldfac == 0); + #my $oldfac = ReadingsNum ($name, "pvCorrectionFactor_".sprintf("%02d",$h), 1); # bisher definierter Korrekturfaktor + #$oldfac = 1 if(1*$oldfac == 0); Log3($name, 5, "$name - Hour: ".sprintf("%02d",$h).", Today PVreal: $pvval, PVforecast: $fcval"); $paref->{hour} = $h; my ($pvavg,$fcavg,$anzavg,$range) = calcAvgFromHistory ($paref); # historische PV / Forecast Vergleichswerte ermitteln - $anzavg //= 1; # der aktuelle Wert ist dann der erste AVG im Store + $anzavg //= 0; # der aktuelle Wert ist dann der erste AVG im Store $pvval = $pvavg ? ($pvval + $pvavg) / 2 : $pvval; # Ertrag aktuelle Stunde berücksichtigen $fcval = $fcavg ? ($fcval + $fcavg) / 2 : $fcval; # Vorhersage aktuelle Stunde berücksichtigen + my ($oldfac, $oldq) = CircularAutokorrVal ($hash, sprintf("%02d",$h), $range, 0); # bisher definierter Korrekturfaktor/KF-Qualität der Stunde des Tages der entsprechenden Bewölkungsrange + $oldfac = 1 if(1*$oldfac == 0); + Log3 ($name, 4, "$name - PV History -> average hour ($h) -> real: $pvval, forecast: $fcval"); my $factor = sprintf "%.2f", ($pvval / $fcval); # Faktorberechnung: reale PV / Prognose @@ -3742,13 +3755,7 @@ sub calcVariance { } push @da, "pvCorrectionFactor_".sprintf("%02d",$h)."<>".$factor." (automatic - old factor: $oldfac, cloudiness range: $range, found history days in range: $anzavg)"; - push @da, "pvCorrectionFactor_".sprintf("%02d",$h)."_autocalc<>done"; - - $paref->{pvcorrf} = $factor."/".$anzavg; - $paref->{nhour} = sprintf("%02d",$h); - $paref->{histname} = "pvcorrfactor"; - setPVhistory ($paref); - delete $paref->{histname}; + push @da, "pvCorrectionFactor_".sprintf("%02d",$h)."_autocalc<>done"; } createReadingsFromArray ($hash, \@da, 1); @@ -3966,7 +3973,7 @@ sub setPVhistory { $data{$type}{$name}{pvhist}{$day}{99}{temp} = q{}; } - Log3 ($name, 5, "$name - set PV History hour: $nhour, hash: $histname, val: $val"); + Log3 ($name, 5, "$name - set PV History day: $day, hour: $nhour, hash: $histname, val: $val"); return; }