76_SolarForecast: Version 1.60.0
git-svn-id: https://svn.fhem.de/fhem/trunk@30470 2b470e98-0d58-463d-a4d8-8e2adae1ed80
This commit is contained in:
@@ -1,5 +1,6 @@
|
|||||||
# Add changes at the top of the list. Keep it in ASCII, and 80-char wide.
|
# Add changes at the top of the list. Keep it in ASCII, and 80-char wide.
|
||||||
# Do not insert empty lines here, update check depends on it
|
# Do not insert empty lines here, update check depends on it
|
||||||
|
- feature: 76_SolarForecast: Version 1.60.0
|
||||||
- feature: 98_vitoconnect: Message Übersetzung und Listen auch One Base
|
- feature: 98_vitoconnect: Message Übersetzung und Listen auch One Base
|
||||||
- bugfix: 72_FRITZBOX: docsis überarbeitet
|
- bugfix: 72_FRITZBOX: docsis überarbeitet
|
||||||
- bugfix: 59_Weather: Fix Weather.pm to use READINGS instead of readings
|
- bugfix: 59_Weather: Fix Weather.pm to use READINGS instead of readings
|
||||||
|
|||||||
File diff suppressed because it is too large
Load Diff
@@ -496,6 +496,7 @@ use constant {
|
|||||||
TEMPMODINC => 25, # default Temperaturerhöhung an Solarzellen gegenüber Umgebungstemperatur bei wolkenlosem Himmel
|
TEMPMODINC => 25, # default Temperaturerhöhung an Solarzellen gegenüber Umgebungstemperatur bei wolkenlosem Himmel
|
||||||
TEMPBASEDEF => 25, # Temperatur Module bei Nominalleistung
|
TEMPBASEDEF => 25, # Temperatur Module bei Nominalleistung
|
||||||
|
|
||||||
|
LOGDELAY => 600, # Verzögerungszeit zwischen zwei Logausgaben mit identischen Inhalt
|
||||||
DEFMINTIME => 60, # default Einplanungsdauer in Minuten
|
DEFMINTIME => 60, # default Einplanungsdauer in Minuten
|
||||||
CONSFCLDAYS => 60, # die Stundenwerte der letzten CONSFCLDAYS Tage zur Kalkulation der Verbrauchvorhersage einbezogen
|
CONSFCLDAYS => 60, # die Stundenwerte der letzten CONSFCLDAYS Tage zur Kalkulation der Verbrauchvorhersage einbezogen
|
||||||
DEFCTYPE => 'other', # default Verbrauchertyp
|
DEFCTYPE => 'other', # default Verbrauchertyp
|
||||||
@@ -12273,9 +12274,9 @@ sub __batChargeOptTargetPower {
|
|||||||
my $remainingSurp = 0;
|
my $remainingSurp = 0;
|
||||||
|
|
||||||
for my $h (@remaining_hods) { # Gesamtwert PV-Überschuß aller Stunden mit PV-Überschuß ermitteln
|
for my $h (@remaining_hods) { # Gesamtwert PV-Überschuß aller Stunden mit PV-Überschuß ermitteln
|
||||||
my $val = $hsurp->{$h}{nhr} eq '00'
|
my $val = defined $hsurp->{$h}{nhr} && $hsurp->{$h}{nhr} eq '00'
|
||||||
? $replacement // 0
|
? int ($replacement) // 0
|
||||||
: $hsurp->{$h}{surplswh};
|
: $hsurp->{$h}{surplswh};
|
||||||
$remainingSurp += int $val;
|
$remainingSurp += int $val;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -12345,7 +12346,13 @@ sub __batChargeOptTargetPower {
|
|||||||
## weiter mit Überschuß
|
## weiter mit Überschuß
|
||||||
#########################
|
#########################
|
||||||
my $otpMargin = $hsurp->{$hod}{$sbn}{otpMargin};
|
my $otpMargin = $hsurp->{$hod}{$sbn}{otpMargin};
|
||||||
my $fref = ___batFindMinPhWh ($hsurp, \@remaining_hods, $runwhneed, $replacement);
|
my $fref = ___batFindMinPhWh ( $hsurp,
|
||||||
|
\@remaining_hods,
|
||||||
|
$remainingSurp,
|
||||||
|
$runwhneed,
|
||||||
|
$replacement,
|
||||||
|
$achievable
|
||||||
|
);
|
||||||
my $limpower = $strategy eq 'optPower'
|
my $limpower = $strategy eq 'optPower'
|
||||||
? min ($fref->{ph}, $spls) # Ladeleistung auf den kleineren Wert begrenzen (es kommen Nachberechnungen)
|
? min ($fref->{ph}, $spls) # Ladeleistung auf den kleineren Wert begrenzen (es kommen Nachberechnungen)
|
||||||
: $fref->{ph};
|
: $fref->{ph};
|
||||||
@@ -12495,8 +12502,8 @@ return $value;
|
|||||||
###############################################################################################
|
###############################################################################################
|
||||||
# Binärsuche für konstante Ladeleistung: $ph Wh via Binärsuche Iteration
|
# Binärsuche für konstante Ladeleistung: $ph Wh via Binärsuche Iteration
|
||||||
#
|
#
|
||||||
# - Wenn die Summe aller surplswh geringer ist als der Bedarf, wird Ereq automatisch auf
|
# - Wenn die Summe aller surplswh geringer ist als der Bedarf, wird ph automatisch auf
|
||||||
# diesen Maximalwert gesetzt und liefert so die tatsächlich erreichbare Energie.
|
# den cap Maximalwert gesetzt und liefert so den maximalen Überschußwert als Ladeleistung.
|
||||||
# - gewichtete Stundenkapazität @hods enthält die Stunden-Keys sortiert von der niedrigsten
|
# - gewichtete Stundenkapazität @hods enthält die Stunden-Keys sortiert von der niedrigsten
|
||||||
# bis zur höchsten Leistung. In jeder Binärsuche-Iteration addiert das Skript
|
# bis zur höchsten Leistung. In jeder Binärsuche-Iteration addiert das Skript
|
||||||
# min(ph, surplswh) für jede Stunde, wodurch die konstant gewählte Leistung ph gemäß der
|
# min(ph, surplswh) für jede Stunde, wodurch die konstant gewählte Leistung ph gemäß der
|
||||||
@@ -12506,32 +12513,41 @@ return $value;
|
|||||||
# die vollständige Ausnutzung der vorhandenen Kapazität.
|
# die vollständige Ausnutzung der vorhandenen Kapazität.
|
||||||
###############################################################################################
|
###############################################################################################
|
||||||
sub ___batFindMinPhWh {
|
sub ___batFindMinPhWh {
|
||||||
my ($hsurp, $aref, $Ereq, $replacement) = @_;
|
my ($hsurp, $hodsref, $remainingSurp, $Ereq, $replacement, $achievable) = @_;
|
||||||
|
|
||||||
my @hods = @$aref;
|
my @hods = @$hodsref;
|
||||||
my $low = 0;
|
my $low = 0;
|
||||||
my $high = max map { $hsurp->{$_}{surplswh} } @hods;
|
my $high = $remainingSurp; # Summe aller verbleibenden Tagesüberschüsse auf Stundenbasis inkl. Gewichtung Stunde 00
|
||||||
my $eps = 0.5; # minimale Genauigkeit in Wh (1e-3)
|
my $eps = 0.5; # minimale Genauigkeit in Wh (1e-3)
|
||||||
my $max_iter = 100; # Zwangsabbruch nach X Durchläufen
|
my $max_iter = 100; # Zwangsabbruch nach X Durchläufen
|
||||||
my $loop = 0;
|
my $loop = 0;
|
||||||
|
|
||||||
while (($high - $low) > $eps) {
|
if (!$achievable) {
|
||||||
last if ++$loop > $max_iter;
|
my $max_cap = max map { defined $hsurp->{$_}{nhr} && $hsurp->{$_}{nhr} eq '00'
|
||||||
|
? int($replacement)
|
||||||
|
: $hsurp->{$_}{surplswh} // 0
|
||||||
|
} @hods;
|
||||||
|
|
||||||
my $mid = ($low + $high) / 2;
|
return { ph => (sprintf "%.0f", $max_cap), iterations => $loop, blur => (sprintf "%.4f", 0) };
|
||||||
my $charged = 0;
|
}
|
||||||
|
|
||||||
for my $hod (@hods) {
|
while (($high - $low) > $eps) {
|
||||||
my $nhr = $hsurp->{$hod}{nhr};
|
last if ++$loop > $max_iter;
|
||||||
next if(!defined $nhr);
|
|
||||||
my $cap = $nhr eq '00' ? int $replacement : $hsurp->{$hod}{surplswh};
|
|
||||||
$charged += min ($mid, $cap);
|
|
||||||
}
|
|
||||||
|
|
||||||
$charged >= $Ereq ? ($high = $mid) : ($low = $mid);
|
my $mid = ($low + $high) / 2;
|
||||||
}
|
my $charged = 0;
|
||||||
|
|
||||||
$high = max (0, $high);
|
for my $hod (@hods) {
|
||||||
|
my $nhr = $hsurp->{$hod}{nhr};
|
||||||
|
next if(!defined $nhr);
|
||||||
|
my $cap = $nhr eq '00' ? int $replacement : $hsurp->{$hod}{surplswh};
|
||||||
|
$charged += min ($mid, $cap);
|
||||||
|
}
|
||||||
|
|
||||||
|
$charged >= $Ereq ? ($high = $mid) : ($low = $mid);
|
||||||
|
}
|
||||||
|
|
||||||
|
$high = max (0, $high);
|
||||||
|
|
||||||
return { ph => (sprintf "%.0f", $high), iterations => $loop, blur => (sprintf "%.4f", ($high - $low)) };
|
return { ph => (sprintf "%.0f", $high), iterations => $loop, blur => (sprintf "%.4f", ($high - $low)) };
|
||||||
}
|
}
|
||||||
@@ -23534,12 +23550,12 @@ return;
|
|||||||
# längerer Zeit als $delay Sekunden ausgegeben wurde
|
# längerer Zeit als $delay Sekunden ausgegeben wurde
|
||||||
#
|
#
|
||||||
# delay => Sek. bis gleiche Meldung wieder geloggt werden darf
|
# delay => Sek. bis gleiche Meldung wieder geloggt werden darf
|
||||||
# (default 600)
|
# (default LOGDELAY)
|
||||||
################################################################
|
################################################################
|
||||||
sub askLogtime {
|
sub askLogtime {
|
||||||
my $name = shift;
|
my $name = shift;
|
||||||
my $err = shift;
|
my $err = shift;
|
||||||
my $delay = shift // 600;
|
my $delay = shift // LOGDELAY;
|
||||||
|
|
||||||
return if(!$err);
|
return if(!$err);
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user