76_SolarForecast: contrib version 1.59.6

git-svn-id: https://svn.fhem.de/fhem/trunk@30436 2b470e98-0d58-463d-a4d8-8e2adae1ed80
This commit is contained in:
DS_Starter
2025-10-23 11:23:43 +00:00
parent 83eaeb11a3
commit 86fc80c9ef

View File

@@ -11918,7 +11918,7 @@ sub _batChargeMgmt {
$hsurp->{$fd}{$hod}{nhr} = $nhr;
$hsurp->{$fd}{$hod}{speff} = $surpls; # effektiver PV Überschuß bzw. effektiver Verbrauch wenn < 0
$hsurp->{$fd}{$hod}{surplswh} = $surplswh.'.'.$hod; # absoluter Überschuß in Wh der Stunde mit Sortierhilfe
$hsurp->{$fd}{$hod}{$bn}{spday} = $spday; # (Rest)PV-Überschuß am laufenden Tag
$hsurp->{$fd}{$hod}{$bn}{spday} = $spday; # (Rest)PV-Überschuß am laufenden Tag
$hsurp->{$fd}{$hod}{$bn}{initsocwh} = $socwh; # durch LR fortgeschriebener SoC
$hsurp->{$fd}{$hod}{$bn}{batinstcap} = $batinstcap; # installierte Batteriekapazität (Wh)
$hsurp->{$fd}{$hod}{$bn}{goalwh} = $goalwh; # Ladeziel
@@ -12125,6 +12125,28 @@ sub __batChargeOptTargetPower {
my $name = $paref->{name};
my $hsurp = $paref->{hsurp}; # Hashref Überschußhash
## Surplus der Stunde 00 in Variable extrahieren und im Hash durch Zeitgewichtung ersetzen
############################################################################################
my $spls00 = 0;
for my $k (keys %$hsurp) {
my $nh = $hsurp->{$k}{nhr};
if ($nh eq '00') {
my $val = $hsurp->{$k}{surplswh};
if (defined $val && $val =~ /^(\d+)\.(\w+)$/) {
$spls00 = $1;
my $replacement = sprintf "%.0f", ($spls00 / 60 * (60 - int $minute)); # aktuelle (Rest)-Stunde -> zeitgewichteter PV-Überschuß
$replacement .= '.'.$2;
$hsurp->{$k}{surplswh} = $replacement;
#Log3 ($name, 1, "$name - spls00: $spls00, replacement: $replacement ");
}
last; # da Stunde 00 nur einmal vorkommt, können wir abbrechen
}
}
my $fipl = CurrentVal ($name, 'feedinPowerLimit', INFINITE);
my @sortedhods = sort { $hsurp->{$a}{surplswh} <=> $hsurp->{$b}{surplswh} } keys %{$hsurp}; # Stunden aufsteigend nach PV-Überschuß sortiert
my @batteries = grep { !/^(?:fd|speff|surplswh|nhr)$/xs } keys %{$hsurp->{24}};
@@ -12135,6 +12157,9 @@ sub __batChargeOptTargetPower {
for my $hod (sort { $a <=> $b } keys %{$hsurp}) {
my $nhr = $hsurp->{$hod}{nhr};
my $spls = int ($hsurp->{$hod}{surplswh} // 0);
$spls = $spls00 if($nhr eq '00'); # aktuelle Stunde: zeitgewichteter PV-Überschuß mit Original ersetzen
my $nexthod = sprintf "%02d", (int $hod + 1);
my $nextnhr = $hsurp->{$nexthod}{nhr};
@@ -12208,7 +12233,7 @@ sub __batChargeOptTargetPower {
####################################
my $otpMargin = $hsurp->{$hod}{$sbn}{otpMargin};
my $fref = ___batFindMinPhWh ($hsurp, \@remaining_hods, $runwhneed);
my $needraw = min ($fref->{ph}, $spls); # Ladeleistung auf Surplus begrenzen
my $needraw = min ($fref->{ph}, $spls); # Ladeleistung auf Surplus begrenzen (es kommen Nachberechnungen)
$needraw = $bpinmax if(!$hsurp->{$hod}{$sbn}{lcintime});
$needraw = max ($needraw, $bpinreduced); # Mindestladeleistung bpinreduced sicherstellen
@@ -13763,9 +13788,13 @@ sub __setConsRcmdState {
my $debug = $paref->{debug};
my $hash = $defs{$name};
my $nompower = ConsumerVal ($name, $c, 'power', 0); # Consumer nominale Leistungsaufnahme (W)
my $nompower = ConsumerVal ($name, $c, 'power', 0); # Consumer nominale Leistungsaufnahme (W)
my $pvshare = ConsumerVal ($name, $c, 'pvshare', 100); # Soll-Anteil PV-Energie an nompower: 100 - nur PV, 0 - kann mit 0 PV-Überschuß betrieben werden
my $sharepower = $nompower * $pvshare / 100;
my $ccr = AttrVal ($name, 'ctrlConsRecommendReadings', ''); # Liste der Consumer für die ConsumptionRecommended-Readings erstellt werden sollen
my $rescons = isConsumerPhysOn ($hash, $c) ? 0 : $nompower; # resultierender Verbauch nach Einschaltung Consumer
my $rescons = isConsumerPhysOn ($hash, $c) ? 0 : $sharepower; # resultierender Verbauch nach Einschaltung Consumer
my ($method, $surplus) = determSurplus ($name, $c); # Consumer spezifische Ermittlung des Energieüberschußes