2
0
mirror of https://github.com/fhem/fhem-mirror.git synced 2025-03-04 05:16:45 +00:00

76_SolarForecast.pm: contrib 0.29.0

git-svn-id: https://svn.fhem.de/fhem/trunk@24149 2b470e98-0d58-463d-a4d8-8e2adae1ed80
This commit is contained in:
nasseeder1 2021-04-04 19:24:55 +00:00
parent 429d634fe3
commit 1c1e9e27f7

View File

@ -334,6 +334,7 @@ my $definve = 98.3;
my $kJtokWh = 0.00027778; # Umrechnungsfaktor kJ in kWh my $kJtokWh = 0.00027778; # Umrechnungsfaktor kJ in kWh
my $defmaxvar = 0.5; # max. Varianz pro Tagesberechnung Autokorrekturfaktor my $defmaxvar = 0.5; # max. Varianz pro Tagesberechnung Autokorrekturfaktor
my $definterval = 70; # Standard Abfrageintervall my $definterval = 70; # Standard Abfrageintervall
my $defslidenum = 3; # max. Anzahl der Arrayelemente in Schieberegistern
my $pvhcache = $attr{global}{modpath}."/FHEM/FhemUtils/PVH_SolarForecast_"; # Filename-Fragment für PV History (wird mit Devicename ergänzt) my $pvhcache = $attr{global}{modpath}."/FHEM/FhemUtils/PVH_SolarForecast_"; # Filename-Fragment für PV History (wird mit Devicename ergänzt)
my $pvccache = $attr{global}{modpath}."/FHEM/FhemUtils/PVC_SolarForecast_"; # Filename-Fragment für PV Circular (wird mit Devicename ergänzt) my $pvccache = $attr{global}{modpath}."/FHEM/FhemUtils/PVC_SolarForecast_"; # Filename-Fragment für PV Circular (wird mit Devicename ergänzt)
@ -1194,7 +1195,9 @@ sub centralTask {
### nicht mehr benötigte Readings/Daten löschen - kann später wieder raus !! ### 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}{"00"};
delete $data{$type}{$name}{pvhist}{$i} if(!$i); # evtl. vorhandene leere Schlüssel entfernen
} }
deleteReadingspec ($hash, "Today_Hour.*_Consumption"); deleteReadingspec ($hash, "Today_Hour.*_Consumption");
deleteReadingspec ($hash, "ThisHour_.*"); deleteReadingspec ($hash, "ThisHour_.*");
deleteReadingspec ($hash, "Today_PV"); deleteReadingspec ($hash, "Today_PV");
@ -1655,6 +1658,11 @@ sub _transferInverterValues {
push @$daref, "Current_PV<>". $pv." W"; push @$daref, "Current_PV<>". $pv." W";
$data{$type}{$name}{current}{generation} = $pv; # Hilfshash Wert current generation Forum: https://forum.fhem.de/index.php/topic,117864.msg1139251.html#msg1139251 $data{$type}{$name}{current}{generation} = $pv; # Hilfshash Wert current generation Forum: https://forum.fhem.de/index.php/topic,117864.msg1139251.html#msg1139251
push @{$data{$type}{$name}{current}{genslidereg}}, $pv; # Schieberegister PV Erzeugung
while (scalar @{$data{$type}{$name}{current}{genslidereg}} > $defslidenum) {
shift @{$data{$type}{$name}{current}{genslidereg}};
}
my $etuf = $etunit =~ /^kWh$/xi ? 1000 : 1; my $etuf = $etunit =~ /^kWh$/xi ? 1000 : 1;
my $etotal = ReadingsNum ($indev, $edread, 0) * $etuf; # Erzeugung total (Wh) my $etotal = ReadingsNum ($indev, $edread, 0) * $etuf; # Erzeugung total (Wh)
@ -1791,21 +1799,37 @@ sub _evaluateThresholds {
my $name = $paref->{name}; my $name = $paref->{name};
my $daref = $paref->{daref}; my $daref = $paref->{daref};
my $gen = CurrentVal ($hash, "generation", 0); # aktuelle PV Erzeugung
my $pt = ReadingsVal($name, "powerTrigger", ""); my $pt = ReadingsVal($name, "powerTrigger", "");
return if(!$pt); return if(!$pt);
my $aaref = CurrentVal ($hash, "genslidereg", "");
my @aa = @{$aaref} if (ref $aaref eq "ARRAY");
return if(scalar @aa < $defslidenum);
my $gen = $aa[0];
my ($gt,$lt) = (1,1);
for my $elem (@aa) {
if($elem < $gen) {
$gt = 0;
}
if($elem > $gen) {
$lt = 0;
}
}
my ($a,$h) = parseParams ($pt); my ($a,$h) = parseParams ($pt);
for my $key (keys %{$h}) { for my $key (keys %{$h}) {
my ($knum,$cond) = $key =~ /^([0-9]+)(on|off)$/x; my ($knum,$cond) = $key =~ /^([0-9]+)(on|off)$/x;
if($cond eq "on" && $gen > $h->{$key}) { if($cond eq "on" && $gt && $gen > $h->{$key}) {
push @$daref, "powerTrigger_${knum}<>on" if(ReadingsVal($name, "powerTrigger_${knum}", "off") eq "off"); push @$daref, "powerTrigger_${knum}<>on" if(ReadingsVal($name, "powerTrigger_${knum}", "off") eq "off");
} }
if($cond eq "off" && $gen < $h->{$key}) { if($cond eq "off" && $lt && $gen < $h->{$key}) {
push @$daref, "powerTrigger_${knum}<>off" if(ReadingsVal($name, "powerTrigger_${knum}", "on") eq "on"); push @$daref, "powerTrigger_${knum}<>off" if(ReadingsVal($name, "powerTrigger_${knum}", "on") eq "on");
} }
} }
@ -3174,10 +3198,6 @@ sub calcFromHistory {
my $day = strftime "%d", localtime($t); # aktueller Tag my $day = strftime "%d", localtime($t); # aktueller Tag
my $pvhh = $data{$type}{$name}{pvhist}; my $pvhh = $data{$type}{$name}{pvhist};
for my $key (keys %{$pvhh}) { # evtl. vorhandene leere Schlüssel entfernen
delete $data{$type}{$name}{pvhist}{$key} if(!$key);
}
my $calcd = AttrVal($name, "numHistDays", $calcmaxd); my $calcd = AttrVal($name, "numHistDays", $calcmaxd);
my @k = sort {$a<=>$b} keys %{$pvhh}; my @k = sort {$a<=>$b} keys %{$pvhh};
@ -3366,8 +3386,14 @@ sub listDataPool {
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") {
$sq .= $idx." => ".$h->{$idx}."\n"; $sq .= $idx." => ".$h->{$idx}."\n";
} }
else {
my $aser = join " ",@{$h->{$idx}};
$sq .= $idx." => ".$aser."\n";
}
}
} }
return $sq; return $sq;
@ -3861,13 +3887,13 @@ werden weitere SolarForecast Devices zugeordnet.
<ul> <ul>
<a name="powerTrigger"></a> <a name="powerTrigger"></a>
<li><b>powerTrigger &lt;1on&gt;=&lt;Wert&gt; &lt;1off&gt;=&lt;Wert&gt; [&lt;2on&gt;=&lt;Wert&gt; &lt;2off&gt;=&lt;Wert&gt; ...] </b> <br> <li><b>powerTrigger &lt;1on&gt;=&lt;Wert&gt; &lt;1off&gt;=&lt;Wert&gt; [&lt;2on&gt;=&lt;Wert&gt; &lt;2off&gt;=&lt;Wert&gt; ...] </b> <br>
Sobald die aktuelle PV Erzeugung (Reading Current_PV) die angegebenen Schwellenwerte über- bzw. unterschreitet, werden Generiert Trigger bei Über- bzw. Unterschreitung bestimmter PV Erzeugungswerte. <br>
die jeweiligen Trigger ausgelöst. <br> Überschreiten die letzten drei Messungen der PV Erzeugung eine definierte <b>Xon-Bedingung</b>, wird das Reading
Es kann eine beliebige Anzahl von Triggerbedingungen angegeben werden. Xon/Xoff-Bedingungen müssen nicht zwingend paarweise <b>powerTrigger_X = on</b> erstellt/gesetzt.
definiert werden (siehe Beispiel). <br> Unterschreiten die letzten drei Messungen der PV Erzeugung eine definierte <b>Xoff-Bedingung</b>, wird das Reading
Überschreitet die aktuelle PV Erzeugung eine definierte <b>Xon-Bedingung</b>, wird das Reading <b>powerTrigger_X = on</b>
erstellt/gesetzt. Unterschreitet die aktuelle PV Erzeugung eine definierte <b>Xoff-Bedingung</b>, wird das Reading
<b>powerTrigger_X = off</b> erstellt/gesetzt. <br> <b>powerTrigger_X = off</b> erstellt/gesetzt. <br>
Es kann eine beliebige Anzahl von Triggerbedingungen angegeben werden. Xon/Xoff-Bedingungen müssen nicht zwingend paarweise
definiert werden. <br>
<br> <br>
<ul> <ul>