mirror of
https://github.com/fhem/fhem-mirror.git
synced 2025-02-01 07:19:24 +00:00
76_SolarForecast.pm: contrib 0.38.0
git-svn-id: https://svn.fhem.de/fhem/trunk@24273 2b470e98-0d58-463d-a4d8-8e2adae1ed80
This commit is contained in:
parent
b159d5a436
commit
92f6833bb0
@ -119,6 +119,7 @@ BEGIN {
|
|||||||
|
|
||||||
# Versions History intern
|
# Versions History intern
|
||||||
my %vNotesIntern = (
|
my %vNotesIntern = (
|
||||||
|
"0.38.0" => "18.04.2021 consumption forecast for the next hours prepared ",
|
||||||
"0.37.0" => "17.04.2021 estConsumptionForecast, new getter forecastQualities, new setter currentRadiationDev ".
|
"0.37.0" => "17.04.2021 estConsumptionForecast, new getter forecastQualities, new setter currentRadiationDev ".
|
||||||
"language sensitive setup hints ",
|
"language sensitive setup hints ",
|
||||||
"0.36.1" => "14.04.2021 add dayname to pvHistory ",
|
"0.36.1" => "14.04.2021 add dayname to pvHistory ",
|
||||||
@ -381,10 +382,10 @@ my @dweattrmust = qw(TTT Neff R101 ww SunUp SunRise SunSet);
|
|||||||
my @draattrmust = qw(Rad1h); # Werte die im Attr forecastProperties des Radiation-DWD_Opendata Devices mindestens gesetzt sein müssen
|
my @draattrmust = qw(Rad1h); # Werte die im Attr forecastProperties des Radiation-DWD_Opendata Devices mindestens gesetzt sein müssen
|
||||||
my $whistrepeat = 900; # Wiederholungsintervall Schreiben historische Daten
|
my $whistrepeat = 900; # Wiederholungsintervall Schreiben historische Daten
|
||||||
|
|
||||||
my $cldampdef = 45; # Dämpfung (%) des Korrekturfaktors bzgl. effektiver Bewölkung, siehe: https://www.energie-experten.org/erneuerbare-energien/photovoltaik/planung/sonnenstunden
|
my $cldampdef = 35; # Dämpfung (%) des Korrekturfaktors bzgl. effektiver Bewölkung, siehe: https://www.energie-experten.org/erneuerbare-energien/photovoltaik/planung/sonnenstunden
|
||||||
my $cloud_base = 0; # Fußpunktverschiebung bzgl. effektiver Bewölkung
|
my $cloud_base = 0; # Fußpunktverschiebung bzgl. effektiver Bewölkung
|
||||||
|
|
||||||
my $rdampdef = 20; # Dämpfung (%) des Korrekturfaktors bzgl. Niederschlag (R101)
|
my $rdampdef = 10; # Dämpfung (%) des Korrekturfaktors bzgl. Niederschlag (R101)
|
||||||
my $rain_base = 0; # Fußpunktverschiebung bzgl. effektiver Bewölkung
|
my $rain_base = 0; # Fußpunktverschiebung bzgl. effektiver Bewölkung
|
||||||
|
|
||||||
# Information zu verwendeten internen Datenhashes
|
# Information zu verwendeten internen Datenhashes
|
||||||
@ -1778,6 +1779,7 @@ sub _transferWeatherValues {
|
|||||||
my $wid = ReadingsNum($fcname, "fc${fd}_${fh2}_ww", -1);
|
my $wid = ReadingsNum($fcname, "fc${fd}_${fh2}_ww", -1);
|
||||||
my $neff = ReadingsNum($fcname, "fc${fd}_${fh2}_Neff", 0); # Effektive Wolkendecke
|
my $neff = ReadingsNum($fcname, "fc${fd}_${fh2}_Neff", 0); # Effektive Wolkendecke
|
||||||
my $r101 = ReadingsNum($fcname, "fc${fd}_${fh2}_R101", 0); # Niederschlagswahrscheinlichkeit> 0,1 mm während der letzten Stunde
|
my $r101 = ReadingsNum($fcname, "fc${fd}_${fh2}_R101", 0); # Niederschlagswahrscheinlichkeit> 0,1 mm während der letzten Stunde
|
||||||
|
my $temp = ReadingsNum($fcname, "fc${fd}_${fh2}_TTT", 0); # Außentemperatur
|
||||||
|
|
||||||
my $fhstr = sprintf "%02d", $fh; # hier kann Tag/Nacht-Grenze verstellt werden
|
my $fhstr = sprintf "%02d", $fh; # hier kann Tag/Nacht-Grenze verstellt werden
|
||||||
|
|
||||||
@ -1790,21 +1792,27 @@ sub _transferWeatherValues {
|
|||||||
|
|
||||||
my $txt = ReadingsVal($fcname, "fc${fd}_${fh2}_wwd", '');
|
my $txt = ReadingsVal($fcname, "fc${fd}_${fh2}_wwd", '');
|
||||||
|
|
||||||
Log3($name, 5, "$name - collect Weather data: device=$fcname, wid=fc${fd}_${fh1}_ww, val=$wid, txt=$txt, cc=$neff, rp=$r101");
|
Log3($name, 5, "$name - collect Weather data: device=$fcname, wid=fc${fd}_${fh1}_ww, val=$wid, txt=$txt, cc=$neff, rp=$r101, t=$temp");
|
||||||
|
|
||||||
$time_str = "NextHour".sprintf "%02d", $num;
|
$time_str = "NextHour".sprintf "%02d", $num;
|
||||||
$data{$type}{$name}{nexthours}{$time_str}{weatherid} = $wid;
|
$data{$type}{$name}{nexthours}{$time_str}{weatherid} = $wid;
|
||||||
$data{$type}{$name}{nexthours}{$time_str}{cloudcover} = $neff;
|
$data{$type}{$name}{nexthours}{$time_str}{cloudcover} = $neff;
|
||||||
$data{$type}{$name}{nexthours}{$time_str}{rainprob} = $r101;
|
$data{$type}{$name}{nexthours}{$time_str}{rainprob} = $r101;
|
||||||
|
$data{$type}{$name}{nexthours}{$time_str}{temp} = $temp;
|
||||||
|
|
||||||
if($num < 23 && $fh < 24) { # Ringspeicher Weather Forum: https://forum.fhem.de/index.php/topic,117864.msg1139251.html#msg1139251
|
if($num < 23 && $fh < 24) { # Ringspeicher Weather Forum: https://forum.fhem.de/index.php/topic,117864.msg1139251.html#msg1139251
|
||||||
$data{$type}{$name}{circular}{sprintf("%02d",$fh1)}{weatherid} = $wid;
|
$data{$type}{$name}{circular}{sprintf("%02d",$fh1)}{weatherid} = $wid;
|
||||||
$data{$type}{$name}{circular}{sprintf("%02d",$fh1)}{weathertxt} = $txt;
|
$data{$type}{$name}{circular}{sprintf("%02d",$fh1)}{weathertxt} = $txt;
|
||||||
$data{$type}{$name}{circular}{sprintf("%02d",$fh1)}{wcc} = $neff;
|
$data{$type}{$name}{circular}{sprintf("%02d",$fh1)}{wcc} = $neff;
|
||||||
$data{$type}{$name}{circular}{sprintf("%02d",$fh1)}{wrp} = $r101;
|
$data{$type}{$name}{circular}{sprintf("%02d",$fh1)}{wrp} = $r101;
|
||||||
|
$data{$type}{$name}{circular}{sprintf("%02d",$fh1)}{temp} = $temp;
|
||||||
|
|
||||||
|
if($num == 0) { # aktuelle Außentemperatur
|
||||||
|
$data{$type}{$name}{current}{temp} = $temp;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if($fd == 0 && $fh1) { # WeatherId in pvhistory speichern
|
if($fd == 0 && $fh1) { # Weather in pvhistory speichern
|
||||||
$paref->{wid} = $wid;
|
$paref->{wid} = $wid;
|
||||||
$paref->{histname} = "weatherid";
|
$paref->{histname} = "weatherid";
|
||||||
$paref->{nhour} = sprintf("%02d",$fh1);
|
$paref->{nhour} = sprintf("%02d",$fh1);
|
||||||
@ -1818,6 +1826,10 @@ sub _transferWeatherValues {
|
|||||||
$paref->{histname} = "weatherrainprob";
|
$paref->{histname} = "weatherrainprob";
|
||||||
setPVhistory ($paref);
|
setPVhistory ($paref);
|
||||||
|
|
||||||
|
$paref->{temp} = $temp;
|
||||||
|
$paref->{histname} = "temperature";
|
||||||
|
setPVhistory ($paref);
|
||||||
|
|
||||||
delete $paref->{histname};
|
delete $paref->{histname};
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -2360,18 +2372,19 @@ sub estConsumptionForecast {
|
|||||||
return if(!$medev || !$defs{$medev});
|
return if(!$medev || !$defs{$medev});
|
||||||
|
|
||||||
my $type = $hash->{TYPE};
|
my $type = $hash->{TYPE};
|
||||||
|
my $hhist = $data{$type}{$name}{pvhist};
|
||||||
|
|
||||||
## Verbrauchsvorhersage für den nächsten Tag
|
## Verbrauchsvorhersage für den nächsten Tag
|
||||||
##############################################
|
##############################################
|
||||||
my $tomorrow = strftime "%a", localtime($t+86400); # Wochentagsname morgen
|
my $tomorrow = strftime "%a", localtime($t+86400); # Wochentagsname kommender Tag
|
||||||
my $totcon = 0;
|
my $totcon = 0;
|
||||||
my $dnum = 0;
|
my $dnum = 0;
|
||||||
|
|
||||||
for my $n (1..31) {
|
for my $n (sort{$a<=>$b} keys %{$data{$type}{$name}{pvhist}}) {
|
||||||
my $hdn = HistoryVal ($hash, sprintf("%02d",$n), 99, "dayname", undef);
|
my $hdn = HistoryVal ($hash, $n, 99, "dayname", undef);
|
||||||
next if(!$hdn || $hdn ne $tomorrow);
|
next if(!$hdn || $hdn ne $tomorrow);
|
||||||
|
|
||||||
$totcon += HistoryVal ($hash, sprintf("%02d",$n), 99, "con", 0);
|
$totcon += HistoryVal ($hash, $n, 99, "con", 0);
|
||||||
$dnum++;
|
$dnum++;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -2382,6 +2395,38 @@ sub estConsumptionForecast {
|
|||||||
$data{$type}{$name}{current}{tomorrowconsumption} = "Wait for more days with a consumption figure";
|
$data{$type}{$name}{current}{tomorrowconsumption} = "Wait for more days with a consumption figure";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
## Verbrauchsvorhersage für die nächsten Stunden
|
||||||
|
##################################################
|
||||||
|
my $conh = { "01" => 0, "02" => 0, "03" => 0, "04" => 0,
|
||||||
|
"05" => 0, "06" => 0, "07" => 0, "08" => 0,
|
||||||
|
"09" => 0, "10" => 0, "11" => 0, "12" => 0,
|
||||||
|
"13" => 0, "14" => 0, "15" => 0, "16" => 0,
|
||||||
|
"17" => 0, "18" => 0, "19" => 0, "20" => 0,
|
||||||
|
"21" => 0, "22" => 0, "23" => 0, "24" => 0,
|
||||||
|
};
|
||||||
|
|
||||||
|
for my $k (sort keys %{$data{$type}{$name}{nexthours}}) {
|
||||||
|
my $nhts = NexthoursVal ($hash, $k, "starttime", undef);
|
||||||
|
next if(!$nhts);
|
||||||
|
|
||||||
|
$dnum = 0;
|
||||||
|
my $utime = timestringToTimestamp ($nhts);
|
||||||
|
my $nhday = strftime "%a", localtime($utime); # Wochentagsname des NextHours Key
|
||||||
|
my $nhhr = sprintf("%02d", (int (strftime "%H", localtime($utime))) + 1); # Stunde des Tages vom NextHours Key (01,02,...24)
|
||||||
|
|
||||||
|
for my $m (sort{$a<=>$b} keys %{$data{$type}{$name}{pvhist}}) {
|
||||||
|
my $hdn = HistoryVal ($hash, $m, 99, "dayname", undef);
|
||||||
|
next if(!$hdn || $hdn ne $nhday);
|
||||||
|
|
||||||
|
$conh->{$nhhr} += HistoryVal ($hash, $m, $nhhr, "con", 0);
|
||||||
|
$dnum++;
|
||||||
|
Log3($name, 1, "$name - hdn: $hdn, $dnum, nhhr: $nhhr, ".$conh->{$nhhr});
|
||||||
|
}
|
||||||
|
if ($dnum) {
|
||||||
|
$data{$type}{$name}{nexthours}{$k}{confc} = $conh->{$nhhr}/$dnum; # Durchschnittsverbrauch aller gleicher Wochentage pro Stunde
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -3504,13 +3549,14 @@ sub calcPVforecast {
|
|||||||
my $raindamp = AttrVal($name, "rainFactorDamping", $rdampdef); # prozentuale Berücksichtigung des Regenkorrekturfaktors
|
my $raindamp = AttrVal($name, "rainFactorDamping", $rdampdef); # prozentuale Berücksichtigung des Regenkorrekturfaktors
|
||||||
my @strings = sort keys %{$stch};
|
my @strings = sort keys %{$stch};
|
||||||
|
|
||||||
my $cloudcover = NexthoursVal ($hash, "NextHour".sprintf("%02d",$num), "cloudcover", 0); # effektive Wolkendecke nächste Stunde X
|
|
||||||
my $ccf = 1 - ((($cloudcover - $cloud_base)/100) * $clouddamp/100); # Cloud Correction Faktor mit Steilheit und Fußpunkt
|
|
||||||
my $range = int ($cloudcover/10); # Range errechnen
|
|
||||||
|
|
||||||
my $rainprob = NexthoursVal ($hash, "NextHour".sprintf("%02d",$num), "rainprob", 0); # Niederschlagswahrscheinlichkeit> 0,1 mm während der letzten Stunde
|
my $rainprob = NexthoursVal ($hash, "NextHour".sprintf("%02d",$num), "rainprob", 0); # Niederschlagswahrscheinlichkeit> 0,1 mm während der letzten Stunde
|
||||||
my $rcf = 1 - ((($rainprob - $rain_base)/100) * $raindamp/100); # Rain Correction Faktor mit Steilheit
|
my $rcf = 1 - ((($rainprob - $rain_base)/100) * $raindamp/100); # Rain Correction Faktor mit Steilheit
|
||||||
|
|
||||||
|
my $cloudcover = NexthoursVal ($hash, "NextHour".sprintf("%02d",$num), "cloudcover", 0); # effektive Wolkendecke nächste Stunde X
|
||||||
|
my $ccf = 1 - ((($cloudcover - $cloud_base)/100) * $clouddamp/100); # Cloud Correction Faktor mit Steilheit und Fußpunkt
|
||||||
|
|
||||||
|
my $range = int ($cloudcover/10); # Range errechnen
|
||||||
|
|
||||||
## Ermitteln des relevanten Autokorrekturfaktors
|
## Ermitteln des relevanten Autokorrekturfaktors
|
||||||
if ($uac eq "on") { # Autokorrektur soll genutzt werden
|
if ($uac eq "on") { # Autokorrektur soll genutzt werden
|
||||||
$hcfound = "yes"; # Status ob Autokorrekturfaktor im Wertevorrat gefunden wurde
|
$hcfound = "yes"; # Status ob Autokorrekturfaktor im Wertevorrat gefunden wurde
|
||||||
@ -3596,7 +3642,7 @@ sub calcVariance {
|
|||||||
my $idts = ReadingsTimestamp($name, "currentInverterDev", ""); # Definitionstimestamp des Inverterdevice
|
my $idts = ReadingsTimestamp($name, "currentInverterDev", ""); # Definitionstimestamp des Inverterdevice
|
||||||
return if(!$idts);
|
return if(!$idts);
|
||||||
|
|
||||||
$idts = timestringToTimestamp ($hash, $idts);
|
$idts = timestringToTimestamp ($idts);
|
||||||
|
|
||||||
if($t - $idts < 86400) {
|
if($t - $idts < 86400) {
|
||||||
my $rmh = sprintf "%.1f", ((86400 - ($t - $idts)) / 3600);
|
my $rmh = sprintf "%.1f", ((86400 - ($t - $idts)) / 3600);
|
||||||
@ -3621,7 +3667,7 @@ sub calcVariance {
|
|||||||
|
|
||||||
my $cdone = ReadingsVal ($name, "pvCorrectionFactor_".sprintf("%02d",$h)."_autocalc", "");
|
my $cdone = ReadingsVal ($name, "pvCorrectionFactor_".sprintf("%02d",$h)."_autocalc", "");
|
||||||
if($cdone eq "done") {
|
if($cdone eq "done") {
|
||||||
Log3($name, 5, "$name - pvCorrectionFactor Hour: ".sprintf("%02d",$h). " already calculated");
|
Log3($name, 5, "$name - pvCorrectionFactor Hour: ".sprintf("%02d",$h)." already calculated");
|
||||||
next;
|
next;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -3786,6 +3832,7 @@ sub setPVhistory {
|
|||||||
my $wcc = $paref->{wcc} // 0; # Wolkenbedeckung
|
my $wcc = $paref->{wcc} // 0; # Wolkenbedeckung
|
||||||
my $wrp = $paref->{wrp} // 0; # Wahrscheinlichkeit von Niederschlag
|
my $wrp = $paref->{wrp} // 0; # Wahrscheinlichkeit von Niederschlag
|
||||||
my $pvcorrf = $paref->{pvcorrf} // 1; # pvCorrectionFactor
|
my $pvcorrf = $paref->{pvcorrf} // 1; # pvCorrectionFactor
|
||||||
|
my $temp = $paref->{temp}; # Außentemperatur
|
||||||
|
|
||||||
my $type = $hash->{TYPE};
|
my $type = $hash->{TYPE};
|
||||||
my $val = q{};
|
my $val = q{};
|
||||||
@ -3876,6 +3923,12 @@ sub setPVhistory {
|
|||||||
$data{$type}{$name}{pvhist}{$day}{99}{pvcorrf} = q{};
|
$data{$type}{$name}{pvhist}{$day}{99}{pvcorrf} = q{};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if($histname eq "temperature") { # Außentemperatur
|
||||||
|
$val = $temp;
|
||||||
|
$data{$type}{$name}{pvhist}{$day}{$nhour}{temp} = $temp;
|
||||||
|
$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 hour: $nhour, hash: $histname, val: $val");
|
||||||
|
|
||||||
return;
|
return;
|
||||||
@ -3906,6 +3959,7 @@ sub listDataPool {
|
|||||||
my $wid = HistoryVal ($hash, $day, $key, "weatherid", "-");
|
my $wid = HistoryVal ($hash, $day, $key, "weatherid", "-");
|
||||||
my $wcc = HistoryVal ($hash, $day, $key, "wcc", "-");
|
my $wcc = HistoryVal ($hash, $day, $key, "wcc", "-");
|
||||||
my $wrp = HistoryVal ($hash, $day, $key, "wrp", "-");
|
my $wrp = HistoryVal ($hash, $day, $key, "wrp", "-");
|
||||||
|
my $temp = HistoryVal ($hash, $day, $key, "temp", undef);
|
||||||
my $pvcorrf = HistoryVal ($hash, $day, $key, "pvcorrf", "-");
|
my $pvcorrf = HistoryVal ($hash, $day, $key, "pvcorrf", "-");
|
||||||
my $dayname = HistoryVal ($hash, $day, $key, "dayname", undef);
|
my $dayname = HistoryVal ($hash, $day, $key, "dayname", undef);
|
||||||
$ret .= "\n " if($ret);
|
$ret .= "\n " if($ret);
|
||||||
@ -3913,6 +3967,7 @@ sub listDataPool {
|
|||||||
$ret .= ", wid: $wid" if($wid);
|
$ret .= ", wid: $wid" if($wid);
|
||||||
$ret .= ", wcc: $wcc" if($wcc);
|
$ret .= ", wcc: $wcc" if($wcc);
|
||||||
$ret .= ", wrp: $wrp" if($wrp);
|
$ret .= ", wrp: $wrp" if($wrp);
|
||||||
|
$ret .= ", temp: $temp" if($temp);
|
||||||
$ret .= ", pvcorrf: $pvcorrf" if($pvcorrf);
|
$ret .= ", pvcorrf: $pvcorrf" if($pvcorrf);
|
||||||
$ret .= ", dayname: $dayname" if($dayname);
|
$ret .= ", dayname: $dayname" if($dayname);
|
||||||
}
|
}
|
||||||
@ -3943,6 +3998,7 @@ sub listDataPool {
|
|||||||
my $wtxt = CircularVal ($hash, $idx, "weathertxt", "-");
|
my $wtxt = CircularVal ($hash, $idx, "weathertxt", "-");
|
||||||
my $wccv = CircularVal ($hash, $idx, "wcc", "-");
|
my $wccv = CircularVal ($hash, $idx, "wcc", "-");
|
||||||
my $wrprb = CircularVal ($hash, $idx, "wrp", "-");
|
my $wrprb = CircularVal ($hash, $idx, "wrp", "-");
|
||||||
|
my $temp = CircularVal ($hash, $idx, "temp", "-");
|
||||||
my $pvcorrf = CircularVal ($hash, $idx, "pvcorrf", "-");
|
my $pvcorrf = CircularVal ($hash, $idx, "pvcorrf", "-");
|
||||||
my $quality = CircularVal ($hash, $idx, "quality", "-");
|
my $quality = CircularVal ($hash, $idx, "quality", "-");
|
||||||
|
|
||||||
@ -3969,7 +4025,7 @@ sub listDataPool {
|
|||||||
}
|
}
|
||||||
|
|
||||||
$sq .= "\n" if($sq);
|
$sq .= "\n" if($sq);
|
||||||
$sq .= $idx." => pvfc: $pvfc, pvrl: $pvrl, gcon: $gcons, gfeedin: $gfeedin, wcc: $wccv, wrp: $wrprb, wid: $wid, wtxt: $wtxt\n";
|
$sq .= $idx." => pvfc: $pvfc, pvrl: $pvrl, gcon: $gcons, gfeedin: $gfeedin, wcc: $wccv, wrp: $wrprb, temp=$temp, wid: $wid, wtxt: $wtxt\n";
|
||||||
$sq .= " corr: $pvcf\n";
|
$sq .= " corr: $pvcf\n";
|
||||||
$sq .= " quality:$cfq";
|
$sq .= " quality:$cfq";
|
||||||
}
|
}
|
||||||
@ -3988,8 +4044,10 @@ sub listDataPool {
|
|||||||
my $r101 = NexthoursVal ($hash, $idx, "rainprob", "-");
|
my $r101 = NexthoursVal ($hash, $idx, "rainprob", "-");
|
||||||
my $rad1h = NexthoursVal ($hash, $idx, "Rad1h", "-");
|
my $rad1h = NexthoursVal ($hash, $idx, "Rad1h", "-");
|
||||||
my $pvcorrf = NexthoursVal ($hash, $idx, "pvcorrf", "-");
|
my $pvcorrf = NexthoursVal ($hash, $idx, "pvcorrf", "-");
|
||||||
|
my $temp = NexthoursVal ($hash, $idx, "temp", "-");
|
||||||
|
my $confc = NexthoursVal ($hash, $idx, "confc", "-");
|
||||||
$sq .= "\n" if($sq);
|
$sq .= "\n" if($sq);
|
||||||
$sq .= $idx." => starttime: $nhts, pvfc: $nhfc, wid: $wid, wcc: $neff, correff: $pvcorrf, wrp: $r101, Rad1h: $rad1h";
|
$sq .= $idx." => starttime: $nhts, pvfc: $nhfc, confc: $confc, wid: $wid, wcc: $neff, wrp: $r101, correff: $pvcorrf, Rad1h: $rad1h, temp=$temp";
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -3999,6 +4057,8 @@ sub listDataPool {
|
|||||||
return qq{NextHours cache is empty.};
|
return qq{NextHours cache is empty.};
|
||||||
}
|
}
|
||||||
for my $idx (sort keys %{$h}) {
|
for my $idx (sort keys %{$h}) {
|
||||||
|
my $nhfc = NexthoursVal ($hash, $idx, "pvforecast", undef);
|
||||||
|
next if(!$nhfc);
|
||||||
my $nhts = NexthoursVal ($hash, $idx, "starttime", undef);
|
my $nhts = NexthoursVal ($hash, $idx, "starttime", undef);
|
||||||
my $pvcorrf = NexthoursVal ($hash, $idx, "pvcorrf", undef);
|
my $pvcorrf = NexthoursVal ($hash, $idx, "pvcorrf", undef);
|
||||||
$pvcorrf //= "-/-";
|
$pvcorrf //= "-/-";
|
||||||
@ -4011,7 +4071,7 @@ sub listDataPool {
|
|||||||
if ($htol eq "current") {
|
if ($htol eq "current") {
|
||||||
$h = $data{$type}{$name}{current};
|
$h = $data{$type}{$name}{current};
|
||||||
if (!keys %{$h}) {
|
if (!keys %{$h}) {
|
||||||
return qq{current values cache is empty.};
|
return qq{Current values cache is empty.};
|
||||||
}
|
}
|
||||||
for my $idx (sort keys %{$h}) {
|
for my $idx (sort keys %{$h}) {
|
||||||
if (ref $h->{$idx} ne "ARRAY") {
|
if (ref $h->{$idx} ne "ARRAY") {
|
||||||
@ -4097,9 +4157,7 @@ return;
|
|||||||
# Timestamp umwandeln
|
# Timestamp umwandeln
|
||||||
################################################################
|
################################################################
|
||||||
sub timestringToTimestamp {
|
sub timestringToTimestamp {
|
||||||
my $hash = shift;
|
|
||||||
my $tstring = shift;
|
my $tstring = shift;
|
||||||
my $name = $hash->{NAME};
|
|
||||||
|
|
||||||
my($y, $mo, $d, $h, $m, $s) = $tstring =~ /([0-9]{4})-([0-9]{2})-([0-9]{2})\s([0-9]{2}):([0-9]{2}):([0-9]{2})/xs;
|
my($y, $mo, $d, $h, $m, $s) = $tstring =~ /([0-9]{4})-([0-9]{2})-([0-9]{2})\s([0-9]{2}):([0-9]{2}):([0-9]{2})/xs;
|
||||||
return if(!$mo || !$y);
|
return if(!$mo || !$y);
|
||||||
@ -4212,6 +4270,7 @@ return;
|
|||||||
# gfeedin - reale Netzeinspeisung
|
# gfeedin - reale Netzeinspeisung
|
||||||
# weatherid - Wetter ID
|
# weatherid - Wetter ID
|
||||||
# wcc - Grad der Bewölkung
|
# wcc - Grad der Bewölkung
|
||||||
|
# temp - Außentemperatur
|
||||||
# wrp - Niederschlagswahrscheinlichkeit
|
# wrp - Niederschlagswahrscheinlichkeit
|
||||||
# pvcorrf - PV Autokorrekturfaktor f. Stunde des Tages
|
# pvcorrf - PV Autokorrekturfaktor f. Stunde des Tages
|
||||||
# dayname - Tagesname (Kürzel)
|
# dayname - Tagesname (Kürzel)
|
||||||
@ -4255,6 +4314,7 @@ return $def;
|
|||||||
# weathertxt - DWD Wetter Text
|
# weathertxt - DWD Wetter Text
|
||||||
# wcc - DWD Wolkendichte
|
# wcc - DWD Wolkendichte
|
||||||
# wrp - DWD Regenwahrscheinlichkeit
|
# wrp - DWD Regenwahrscheinlichkeit
|
||||||
|
# temp - Außentemperatur
|
||||||
# pvcorrf - PV Autokorrekturfaktoren (HASH)
|
# pvcorrf - PV Autokorrekturfaktoren (HASH)
|
||||||
# $def: Defaultwert
|
# $def: Defaultwert
|
||||||
#
|
#
|
||||||
@ -4365,6 +4425,8 @@ return $def;
|
|||||||
# gridconsumption - aktueller Netzbezug
|
# gridconsumption - aktueller Netzbezug
|
||||||
# powerbatin - Batterie Ladeleistung
|
# powerbatin - Batterie Ladeleistung
|
||||||
# powerbatout - Batterie Entladeleistung
|
# powerbatout - Batterie Entladeleistung
|
||||||
|
# temp - aktuelle Außentemperatur
|
||||||
|
# tomorrowconsumption - Verbrauch des kommenden Tages
|
||||||
# $def: Defaultwert
|
# $def: Defaultwert
|
||||||
#
|
#
|
||||||
################################################################
|
################################################################
|
||||||
@ -4829,6 +4891,7 @@ verfügbare Globalstrahlung ganz spezifisch in elektrische Energie umgewandelt.
|
|||||||
<tr><td> </td><td>/1...X - Korrekturfaktor aus Store genutzt (höhere Zahl = bessere Qualität) </td></tr>
|
<tr><td> </td><td>/1...X - Korrekturfaktor aus Store genutzt (höhere Zahl = bessere Qualität) </td></tr>
|
||||||
<tr><td> <b>wrp</b> </td><td>vorhergesagter Grad der Regenwahrscheinlichkeit </td></tr>
|
<tr><td> <b>wrp</b> </td><td>vorhergesagter Grad der Regenwahrscheinlichkeit </td></tr>
|
||||||
<tr><td> <b>Rad1h</b> </td><td>vorhergesagte Globalstrahlung </td></tr>
|
<tr><td> <b>Rad1h</b> </td><td>vorhergesagte Globalstrahlung </td></tr>
|
||||||
|
<tr><td> <b>temp</b> </td><td>vorhergesagte Außentemperatur </td></tr>
|
||||||
</table>
|
</table>
|
||||||
</ul>
|
</ul>
|
||||||
</li>
|
</li>
|
||||||
@ -4876,6 +4939,7 @@ verfügbare Globalstrahlung ganz spezifisch in elektrische Energie umgewandelt.
|
|||||||
<tr><td> <b>gfeedin</b> </td><td>reale Leistungseinspeisung in das Stromnetz </td></tr>
|
<tr><td> <b>gfeedin</b> </td><td>reale Leistungseinspeisung in das Stromnetz </td></tr>
|
||||||
<tr><td> <b>wcc</b> </td><td>Grad der Wolkenüberdeckung </td></tr>
|
<tr><td> <b>wcc</b> </td><td>Grad der Wolkenüberdeckung </td></tr>
|
||||||
<tr><td> <b>wrp</b> </td><td>Grad der Regenwahrscheinlichkeit </td></tr>
|
<tr><td> <b>wrp</b> </td><td>Grad der Regenwahrscheinlichkeit </td></tr>
|
||||||
|
<tr><td> <b>temp</b> </td><td>Außentemperatur </td></tr>
|
||||||
<tr><td> <b>wid</b> </td><td>ID des vorhergesagten Wetters </td></tr>
|
<tr><td> <b>wid</b> </td><td>ID des vorhergesagten Wetters </td></tr>
|
||||||
<tr><td> <b>wtxt</b> </td><td>Beschreibung des vorhergesagten Wetters </td></tr>
|
<tr><td> <b>wtxt</b> </td><td>Beschreibung des vorhergesagten Wetters </td></tr>
|
||||||
<tr><td> <b>corr</b> </td><td>Autokorrekturfaktoren für die Stunde des Tages und der Bewölkungsrange (0..10) </td></tr>
|
<tr><td> <b>corr</b> </td><td>Autokorrekturfaktoren für die Stunde des Tages und der Bewölkungsrange (0..10) </td></tr>
|
||||||
@ -4994,7 +5058,7 @@ verfügbare Globalstrahlung ganz spezifisch in elektrische Energie umgewandelt.
|
|||||||
<li><b>cloudFactorDamping </b><br>
|
<li><b>cloudFactorDamping </b><br>
|
||||||
Prozentuale Berücksichtigung (Dämpfung) des Bewölkungprognosefaktors bei der solaren Vorhersage. <br>
|
Prozentuale Berücksichtigung (Dämpfung) des Bewölkungprognosefaktors bei der solaren Vorhersage. <br>
|
||||||
Größere Werte vermindern, kleinere Werte erhöhen tendenziell den prognostizierten PV Ertrag.<br>
|
Größere Werte vermindern, kleinere Werte erhöhen tendenziell den prognostizierten PV Ertrag.<br>
|
||||||
(default: 45)
|
(default: 35)
|
||||||
</li>
|
</li>
|
||||||
<br>
|
<br>
|
||||||
|
|
||||||
@ -5126,7 +5190,7 @@ verfügbare Globalstrahlung ganz spezifisch in elektrische Energie umgewandelt.
|
|||||||
<li><b>rainFactorDamping </b><br>
|
<li><b>rainFactorDamping </b><br>
|
||||||
Prozentuale Berücksichtigung (Dämpfung) des Regenprognosefaktors bei der solaren Vorhersage. <br>
|
Prozentuale Berücksichtigung (Dämpfung) des Regenprognosefaktors bei der solaren Vorhersage. <br>
|
||||||
Größere Werte vermindern, kleinere Werte erhöhen tendenziell den prognostizierten PV Ertrag.<br>
|
Größere Werte vermindern, kleinere Werte erhöhen tendenziell den prognostizierten PV Ertrag.<br>
|
||||||
(default: 20)
|
(default: 10)
|
||||||
</li>
|
</li>
|
||||||
<br>
|
<br>
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user