diff --git a/fhem/contrib/DS_Starter/76_SolarForecast.pm b/fhem/contrib/DS_Starter/76_SolarForecast.pm index 7f44d7720..c6c7b8cc9 100644 --- a/fhem/contrib/DS_Starter/76_SolarForecast.pm +++ b/fhem/contrib/DS_Starter/76_SolarForecast.pm @@ -1376,7 +1376,7 @@ sub _transferWeatherValues { $epoche = $t + (3600*$num); } - my $wid = ReadingsNum($fcname, "fc${fd}_${fh}_ww", 99); # 55_DWD -> 0 .. 98 definiert , 99 ist nicht vorhanden # führende 0 einfügen wenn nötig + my $wid = ReadingsNum($fcname, "fc${fd}_${fh}_ww", -1); my $neff = ReadingsNum($fcname, "fc${fd}_${fh}_Neff", 0); # Effektive Wolkendecke my $r101 = ReadingsNum($fcname, "fc${fd}_${fh}_R101", 0); # Niederschlagswahrscheinlichkeit> 0,1 mm während der letzten Stunde @@ -1429,8 +1429,6 @@ sub _transferInverterValues { deleteReadingspec ($hash, "Today_Hour.*_PV.*"); } - ## aktuelle PV-Erzeugung - ######################### my ($pvread,$pvunit) = split ":", $h->{pv}; # Readingname/Unit für aktuelle PV Erzeugung my ($edread,$edunit) = split ":", $h->{etoday}; # Readingname/Unit für Tagesenergie @@ -1613,7 +1611,7 @@ sub forecastGraphic { my ($val,$height); my ($z2,$z3,$z4); my $he; # Balkenhöhe - my (%pv,%is,%t,%we,%di,%co); + my (%beam1,%is,%t,%we,%di,%beam2); ########################################################## # Kontext des SolarForecast-Devices speichern für Refresh @@ -1915,31 +1913,27 @@ sub forecastGraphic { my $offset = AttrNum($name, 'history_hour', 0); - my $val1; - my $val2; - if ($offset) { $t{0} += $offset; $t{0} += 24 if ($t{0} < 0); $t0 = sprintf('%02d', $t{0}); - $val1 = (exists($data{$hash->{TYPE}}{$name}{pvfc}{$t0})) ? $data{$hash->{TYPE}}{$name}{pvfc}{$t0} : 0; - $val2 = (exists($data{$hash->{TYPE}}{$name}{pvreal}{$t0})) ? $data{$hash->{TYPE}}{$name}{pvreal}{$t0} : 0; $we{0} = (exists($data{$hash->{TYPE}}{$name}{weather}{$t0}{id})) ? $data{$hash->{TYPE}}{$name}{weather}{$t0}{id} : -1 if ($weather); #$is{0} = undef; } else { - $val1 = (exists($data{$hash->{TYPE}}{$name}{pvfc}{$t0})) ? $data{$hash->{TYPE}}{$name}{pvfc}{$t0} : 0; - $val2 = (exists($data{$hash->{TYPE}}{$name}{pvreal}{$t0})) ? $data{$hash->{TYPE}}{$name}{pvreal}{$t0} : 0; $we{0} = (exists($hash->{HELPER}{'ThisHour_WeatherId'})) ? $hash->{HELPER}{"ThisHour_WeatherId"} : -1 if ($weather); #$is{0} = (ReadingsVal($name,"ThisHour_IsConsumptionRecommended",'no') eq 'yes' ) ? $icon : undef; } - $pv{0} = $beam1cont eq 'forecast' ? $val1 : $val2; - $co{0} = $beam2cont eq 'forecast' ? $val1 : $val2; - $di{0} = $pv{0} - $co{0}; + my $pvfc0 = exists $data{$hash->{TYPE}}{$name}{pvfc}{$t0} ? $data{$hash->{TYPE}}{$name}{pvfc}{$t0} : 0; + my $pvreal0 = exists $data{$hash->{TYPE}}{$name}{pvreal}{$t0} ? $data{$hash->{TYPE}}{$name}{pvreal}{$t0} : 0; + + $beam1{0} = $beam1cont eq 'forecast' ? $pvfc0 : $pvreal0; + $beam2{0} = $beam2cont eq 'forecast' ? $pvfc0 : $pvreal0; + $di{0} = $beam1{0} - $beam2{0}; # User Auswahl überschreiben wenn beide Werte die gleiche Basis haben ! $lotype = 'pv' if ($beam1cont eq $beam2cont); @@ -1998,8 +1992,8 @@ sub forecastGraphic { Log3($name, 4, "$name - Consumer planned data: $_"); } - $maxVal = !$maxVal ? $pv{0} : $maxVal; # Startwert wenn kein Wert bereits via attr vorgegeben ist - my $maxCon = $co{0}; # für Typ co + $maxVal = !$maxVal ? $beam1{0} : $maxVal; # Startwert wenn kein Wert bereits via attr vorgegeben ist + my $maxCon = $beam2{0}; # für Typ co my $maxDif = $di{0}; # für Typ diff my $minDif = $di{0}; # für Typ diff @@ -2007,8 +2001,8 @@ sub forecastGraphic { for my $i (1..$maxhours-1) { my $ti; - my $val1; - my $val2 = 0; + my $pvfci; + my $pvreali = 0; my $ii = sprintf('%02d',$i); @@ -2026,32 +2020,32 @@ sub forecastGraphic { my $jj = sprintf('%02d',$j); if ($i <= abs($offset)) { - $val1 = (exists($data{$hash->{TYPE}}{$name}{pvfc}{$jj})) ? $data{$hash->{TYPE}}{$name}{pvfc}{$jj} : 0; - $val2 = (exists($data{$hash->{TYPE}}{$name}{pvreal}{$jj})) ? $data{$hash->{TYPE}}{$name}{pvreal}{$jj} : 0; - $we{$i} = (exists($data{$hash->{TYPE}}{$name}{weather}{$jj}{id})) ? $data{$hash->{TYPE}}{$name}{weather}{$jj}{id} : -1 if ($weather); + $pvfci = (exists($data{$hash->{TYPE}}{$name}{pvfc}{$jj})) ? $data{$hash->{TYPE}}{$name}{pvfc}{$jj} : 0; + $pvreali = (exists($data{$hash->{TYPE}}{$name}{pvreal}{$jj})) ? $data{$hash->{TYPE}}{$name}{pvreal}{$jj} : 0; + $we{$i} = (exists($data{$hash->{TYPE}}{$name}{weather}{$jj}{id})) ? $data{$hash->{TYPE}}{$name}{weather}{$jj}{id} : -1 if ($weather); } else { my $nh = sprintf('%02d', $t{0}+$i-$thishour); - $val1 = ReadingsNum($name, 'NextHour'.$nh.'_PVforecast', 0); + $pvfci = ReadingsNum($name, 'NextHour'.$nh.'_PVforecast', 0); $we{$i} = $hash->{HELPER}{'NextHour'.$nh.'_WeatherId'} if($weather); } } else { - $val1 = ReadingsNum($name, 'NextHour'.$ii.'_PVforecast', 0); # Forecast + $pvfci = ReadingsNum($name, 'NextHour'.$ii.'_PVforecast', 0); # Forecast $we{$i} = $hash->{HELPER}{'NextHour'.$ii.'_WeatherId'} if($weather); # für Wettericons #$is{$i} = (ReadingsVal($name,"NextHour".$ii."_IsConsumptionRecommended",'no') eq 'yes') ? $icon : undef; } - $pv{$i} = $beam1cont eq 'forecast' ? $val1 : $val2; - $co{$i} = $beam2cont eq 'forecast' ? $val1 : $val2; + $beam1{$i} = $beam1cont eq 'forecast' ? $pvfci : $pvreali; + $beam2{$i} = $beam2cont eq 'forecast' ? $pvfci : $pvreali; # sicher stellen das wir keine undefs in der Liste haben ! - $pv{$i} //= 0; - $co{$i} //= 0; - $di{$i} = $pv{$i} - $co{$i}; + $beam1{$i} //= 0; + $beam2{$i} //= 0; + $di{$i} = $beam1{$i} - $beam2{$i}; - $maxVal = $pv{$i} if ($pv{$i} > $maxVal); - $maxCon = $co{$i} if ($co{$i} > $maxCon); + $maxVal = $beam1{$i} if ($beam1{$i} > $maxVal); + $maxCon = $beam2{$i} if ($beam2{$i} > $maxCon); $maxDif = $di{$i} if ($di{$i} > $maxDif); $minDif = $di{$i} if ($di{$i} < $minDif); } @@ -2086,7 +2080,7 @@ sub forecastGraphic { $ret .= "