2
0
mirror of https://github.com/fhem/fhem-mirror.git synced 2025-04-12 08:41:41 +00:00

76_SolarForecast: contrib 1.49.5

git-svn-id: https://svn.fhem.de/fhem/trunk@29813 2b470e98-0d58-463d-a4d8-8e2adae1ed80
This commit is contained in:
nasseeder1 2025-03-31 19:59:24 +00:00
parent 22b8b59da1
commit 21622087a8

View File

@ -163,6 +163,8 @@ my %vNotesIntern = (
"1.49.5" => "29.03.2025 some code changes, Attr affectSolCastPercentile, ctrlSolCastAPIoptimizeReq are obsolete -> SolCast optimze requests is default now ". "1.49.5" => "29.03.2025 some code changes, Attr affectSolCastPercentile, ctrlSolCastAPIoptimizeReq are obsolete -> SolCast optimze requests is default now ".
"attr affectConsForecastIdentWeekdays replaced by plantControl->consForecastIdentWeekdays ". "attr affectConsForecastIdentWeekdays replaced by plantControl->consForecastIdentWeekdays ".
"attr affectConsForecastLastDays replaced by plantControl->consForecastLastDays ". "attr affectConsForecastLastDays replaced by plantControl->consForecastLastDays ".
"attr ctrlInterval replaced by plantControl->cycleInterval".
"attr ctrlGenPVdeviation replaced by plantControl->genPVdeviation ".
"setupBatteryDevXX: new keys pinmax, poutmax ", "setupBatteryDevXX: new keys pinmax, poutmax ",
"1.49.4" => "28.03.2025 _batChargeRecmd: revert Loading release changes of V 1.49.0, _transferAPIRadiationValues: fix sunalt for next day ". "1.49.4" => "28.03.2025 _batChargeRecmd: revert Loading release changes of V 1.49.0, _transferAPIRadiationValues: fix sunalt for next day ".
"Home Node: Mouse over show Autarky Rate, flowGraphicControl: new key strokeconsumerdyncol ", "Home Node: Mouse over show Autarky Rate, flowGraphicControl: new key strokeconsumerdyncol ",
@ -557,7 +559,7 @@ my @rconfigs = qw( pvCorrectionFactor_Auto
# Anlagenkonfiguration: maßgebliche Attribute # Anlagenkonfiguration: maßgebliche Attribute
my @aconfigs = qw( aiControl my @aconfigs = qw( aiControl
consumerLegend consumerAdviceIcon consumerLink consumerLegend consumerAdviceIcon consumerLink
ctrlConsRecommendReadings ctrlGenPVdeviation ctrlInterval ctrlConsRecommendReadings
ctrlLanguage ctrlNextDayForecastReadings ctrlNextHoursSoCForecastReadings ctrlLanguage ctrlNextDayForecastReadings ctrlNextHoursSoCForecastReadings
ctrlSolCastAPImaxReq ctrlSolCastAPImaxReq
ctrlSpecialReadings ctrlUserExitFn ctrlSpecialReadings ctrlUserExitFn
@ -1520,8 +1522,6 @@ sub Initialize {
"consumerLink:0,1 ". "consumerLink:0,1 ".
"ctrlConsRecommendReadings:multiple-strict,$allcs ". "ctrlConsRecommendReadings:multiple-strict,$allcs ".
"ctrlDebug:multiple-strict,$dm,#10 ". "ctrlDebug:multiple-strict,$dm,#10 ".
"ctrlGenPVdeviation:daily,continuously ".
"ctrlInterval ".
"ctrlLanguage:DE,EN ". "ctrlLanguage:DE,EN ".
"ctrlNextDayForecastReadings:multiple-strict,$hod ". "ctrlNextDayForecastReadings:multiple-strict,$hod ".
"ctrlNextHoursSoCForecastReadings ". "ctrlNextHoursSoCForecastReadings ".
@ -1575,7 +1575,7 @@ sub Initialize {
########################################################################################################################## ##########################################################################################################################
my $av = 'obsolete#-#use#attr#plantControl#instead'; my $av = 'obsolete#-#use#attr#plantControl#instead';
my $av1 = 'obsolete#-#will#be#deleted#soon'; my $av1 = 'obsolete#-#will#be#deleted#soon';
$hash->{AttrList} .= " affectBatteryPreferredCharge:$av affectConsForecastInPlanning:$av ctrlShowLink:$av ctrlBackupFilesKeep:$av affectConsForecastIdentWeekdays:$av affectConsForecastLastDays:$av"; # 29.03.2025 $hash->{AttrList} .= " affectBatteryPreferredCharge:$av affectConsForecastInPlanning:$av ctrlShowLink:$av ctrlBackupFilesKeep:$av affectConsForecastIdentWeekdays:$av affectConsForecastLastDays:$av ctrlInterval:$av ctrlGenPVdeviation:$av"; # 31.03.2025
$hash->{AttrList} .= " affectSolCastPercentile:$av1 ctrlSolCastAPIoptimizeReq:$av1"; # 29.03.2025 $hash->{AttrList} .= " affectSolCastPercentile:$av1 ctrlSolCastAPIoptimizeReq:$av1"; # 29.03.2025
########################################################################################################################## ##########################################################################################################################
@ -5843,7 +5843,7 @@ sub Attr {
### nicht mehr benötigte Daten verarbeiten - Bereich kann später wieder raus !! ### nicht mehr benötigte Daten verarbeiten - Bereich kann später wieder raus !!
###################################################################################################################### ######################################################################################################################
if ($cmd eq 'set' && $aName =~ /^affectBatteryPreferredCharge|affectConsForecastInPlanning|ctrlShowLink|ctrlBackupFilesKeep|affectConsForecastIdentWeekdays|affectConsForecastLastDays$/) { # 29.03.2025 if ($cmd eq 'set' && $aName =~ /^affectBatteryPreferredCharge|affectConsForecastInPlanning|ctrlShowLink|ctrlBackupFilesKeep|affectConsForecastIdentWeekdays|affectConsForecastLastDays|ctrlInterval|ctrlGenPVdeviation$/) { # 31.03.2025
my $msg = "The attribute $aName is replaced by 'plantControl'."; my $msg = "The attribute $aName is replaced by 'plantControl'.";
if (!$init_done) { if (!$init_done) {
Log3 ($name, 1, "$name - $msg"); Log3 ($name, 1, "$name - $msg");
@ -5907,34 +5907,16 @@ sub Attr {
delete $data{$name}{circular}{99}{'nextTsMaxSocChge'.$bn}; delete $data{$name}{circular}{99}{'nextTsMaxSocChge'.$bn};
} }
if ($aName eq 'ctrlGenPVdeviation' && $aVal eq 'daily') {
readingsDelete ($hash, 'Today_PVdeviation');
delete $data{$name}{circular}{99}{tdayDvtn};
}
if ($aName eq 'graphicHeaderOwnspecValForm') { if ($aName eq 'graphicHeaderOwnspecValForm') {
$err = isGhoValFormValid ($name, $aVal); $err = isGhoValFormValid ($name, $aVal);
return $err if($err); return $err if($err);
} }
if ($cmd eq 'set') { if ($cmd eq 'set') {
if ($aName eq 'ctrlInterval') {
unless ($aVal =~ /^[0-9]+$/x) {
return qq{Invalid value for $aName. Use only figures 0-9!};
}
}
if ($init_done && $aName eq 'ctrlUserExitFn') { if ($init_done && $aName eq 'ctrlUserExitFn') {
($err) = checkCode ($name, $aVal, 'cc1'); ($err) = checkCode ($name, $aVal, 'cc1');
return $err if($err); return $err if($err);
} }
if ($init_done && $aName eq 'ctrlInterval') {
_newCycTime ($hash, time, $aVal);
my $nct = CurrentVal ($hash, 'nextCycleTime', 0); # gespeicherte nächste CyleTime
readingsSingleUpdate ($hash, 'nextCycletime', (!$nct ? 'Manual / Event-controlled' : FmtTime($nct)), 0);
return;
}
} }
my $params = { my $params = {
@ -6338,8 +6320,9 @@ sub _attrplantControl { ## no critic "not used"
consForecastIdentWeekdays => { comp => '(0|1)', act => 0 }, consForecastIdentWeekdays => { comp => '(0|1)', act => 0 },
consForecastLastDays => { comp => '([1-9]|[1-9][0-9]|1[0-7][0-9]|180)', act => 0 }, consForecastLastDays => { comp => '([1-9]|[1-9][0-9]|1[0-7][0-9]|180)', act => 0 },
consForecastInPlanning => { comp => '(0|1)', act => 0 }, consForecastInPlanning => { comp => '(0|1)', act => 0 },
feedinPowerLimit => { comp => '\d+', act => 0 },
cycleInterval => { comp => '\d+', act => 1 }, cycleInterval => { comp => '\d+', act => 1 },
feedinPowerLimit => { comp => '\d+', act => 0 },
genPVdeviation => { comp => '(daily|continuously)', act => 1 },
showLink => { comp => '(0|1)', act => 0 }, showLink => { comp => '(0|1)', act => 0 },
}; };
@ -6912,6 +6895,11 @@ sub __attrKeyAction {
} }
} }
if ($akey eq 'genPVdeviation' && $keyval eq 'daily') {
readingsDelete ($hash, 'Today_PVdeviation');
delete $data{$name}{circular}{99}{tdayDvtn};
}
return; return;
} }
@ -8069,6 +8057,26 @@ sub centralTask {
} }
###### ######
my $civ = AttrVal ($name, 'ctrlInterval', undef); # 31.03.2025
my $pc6 = AttrVal ($name, 'plantControl', '');
if (defined $civ) {
my $newval = $pc6." cycleInterval=$civ";
CommandAttr (undef, "$name plantControl $newval");
::CommandDeleteAttr (undef, "$name ctrlInterval");
}
######
my $cgd = AttrVal ($name, 'ctrlGenPVdeviation', undef); # 31.03.2025
my $pc7 = AttrVal ($name, 'plantControl', '');
if (defined $cgd) {
my $newval = $pc7." genPVdeviation=$cgd";
CommandAttr (undef, "$name plantControl $newval");
::CommandDeleteAttr (undef, "$name ctrlGenPVdeviation");
}
######
my $n = 0; # 01.02.25 -> Datenmigration pvrlsum, pvfcsum, dnumsum in pvrl_*, pvfc_* my $n = 0; # 01.02.25 -> Datenmigration pvrlsum, pvfcsum, dnumsum in pvrl_*, pvfc_*
for my $hh (1..24) { for my $hh (1..24) {
$hh = sprintf "%02d", $hh; $hh = sprintf "%02d", $hh;
@ -12933,7 +12941,7 @@ sub _calcTodayPVdeviation {
my $dp; my $dp;
if (AttrVal ($name, 'ctrlGenPVdeviation', 'daily') eq 'daily') { if (CurrentVal ($name, 'genPVdeviation', 'daily') eq 'daily') {
my $sstime = timestringToTimestamp ($date.' '.ReadingsVal ($name, "Today_SunSet", '22:00').':00'); my $sstime = timestringToTimestamp ($date.' '.ReadingsVal ($name, "Today_SunSet", '22:00').':00');
return if($t < $sstime); return if($t < $sstime);
@ -12943,7 +12951,7 @@ sub _calcTodayPVdeviation {
my $pvfcd = ReadingsNum ($name, 'RestOfDayPVforecast', 0) - $pvfc; # PV Prognose bis jetzt my $pvfcd = ReadingsNum ($name, 'RestOfDayPVforecast', 0) - $pvfc; # PV Prognose bis jetzt
return if(!$pvfcd); # Illegal division by zero verhindern return if(!$pvfcd); # Illegal division by zero verhindern
$dp = sprintf "%.2f", (100 - (100 * $pvre / abs $pvfcd)); # V 1.25.0 $dp = sprintf "%.2f", (100 - (100 * $pvre / abs $pvfcd)); # V 1.25.0
} }
$data{$name}{circular}{99}{tdayDvtn} = $dp; $data{$name}{circular}{99}{tdayDvtn} = $dp;
@ -13786,7 +13794,7 @@ sub entryGraphic {
flowgconsTime => CurrentVal ($name, 'showconsumerremaintime', 1), # Verbraucher Restlaufeit in der Energieflußgrafik anzeigen flowgconsTime => CurrentVal ($name, 'showconsumerremaintime', 1), # Verbraucher Restlaufeit in der Energieflußgrafik anzeigen
flowgconsDist => CurrentVal ($name, 'consumerdist', FGCDDEF), # Abstand Verbrauchericons zueinander flowgconsDist => CurrentVal ($name, 'consumerdist', FGCDDEF), # Abstand Verbrauchericons zueinander
flowgh2cDist => CurrentVal ($name, 'h2consumerdist', 0), # Erweiterung des vertikalen Abstandes Haus -> Consumer flowgh2cDist => CurrentVal ($name, 'h2consumerdist', 0), # Erweiterung des vertikalen Abstandes Haus -> Consumer
genpvdva => AttrVal ($name, 'ctrlGenPVdeviation', 'daily'), # Methode der Abweichungsberechnung genpvdva => CurrentVal ($name, 'genPVdeviation', 'daily'), # Methode der Abweichungsberechnung
lang => getLang ($hash), lang => getLang ($hash),
debug => getDebug ($hash), # Debug Module debug => getDebug ($hash), # Debug Module
}; };
@ -20847,7 +20855,7 @@ return;
sub controller { sub controller {
my $name = shift; my $name = shift;
my $interval = AttrVal ($name, 'ctrlInterval', DEFINTERVAL); # 0 wenn manuell gesteuert my $interval = CurrentVal ($name, 'cycleInterval', DEFINTERVAL); # 0 wenn manuell gesteuert
my $idval = IsDisabled ($name); my $idval = IsDisabled ($name);
my $disabled = $idval == 1 ? 1 : 0; my $disabled = $idval == 1 ? 1 : 0;
my $inactive = $idval == 3 ? 1 : 0; my $inactive = $idval == 3 ? 1 : 0;
@ -24383,34 +24391,6 @@ to ensure that the system configuration is correct.
</li> </li>
<br> <br>
<a id="SolarForecast-attr-ctrlGenPVdeviation"></a>
<li><b>ctrlGenPVdeviation </b><br>
Specifies the method for calculating the deviation between predicted and real PV generation.
The Reading <b>Today_PVdeviation</b> is created depending on this setting. <br><br>
<ul>
<table>
<colgroup> <col width="15%"> <col width="85%"> </colgroup>
<tr><td> <b>daily</b> </td><td>Calculation and creation of Today_PVdeviation is done after sunset (default) </td></tr>
<tr><td> <b>continuously</b> </td><td>Calculation and creation of Today_PVdeviation is done continuously </td></tr>
</table>
</ul>
</li><br>
<a id="SolarForecast-attr-ctrlInterval"></a>
<li><b>ctrlInterval &lt;Sekunden&gt; </b><br>
Repetition interval of the data collection. <br>
If ctrlInterval is explicitly set to 0, no regular data collection takes place and must be started externally
with get &lt;name&gt; data. <br>
(default: 70)
<br><br>
<b>Note:</b> Regardless of the set interval (even with 0), data is collected automatically a few seconds
before the end and after the start of a full hour. <br>
Furthermore, data is collected automatically when an event from a device defined as asynchron
device (consumer, meter, etc.) is received and processed.
</li><br>
<a id="SolarForecast-attr-ctrlLanguage"></a> <a id="SolarForecast-attr-ctrlLanguage"></a>
<li><b>ctrlLanguage &lt;DE | EN&gt; </b><br> <li><b>ctrlLanguage &lt;DE | EN&gt; </b><br>
Defines the used language of the device. The language definition has an effect on the module graphics and various Defines the used language of the device. The language definition has an effect on the module graphics and various
@ -24513,8 +24493,8 @@ to ensure that the system configuration is correct.
<a id="SolarForecast-attr-ctrlUserExitFn"></a> <a id="SolarForecast-attr-ctrlUserExitFn"></a>
<li><b>ctrlUserExitFn {&lt;Code&gt;} </b><br> <li><b>ctrlUserExitFn {&lt;Code&gt;} </b><br>
After each cycle (see the <a href="#SolarForecast-attr-ctrlInterval">ctrlInterval </a> attribute), the code given After each cycle (see the <a href="#SolarForecast-attr-plantControl">plantControl->cycleInterval </a> attribute),
in this attribute is executed. The code is to be enclosed in curly brackets {...}. <br> the code given in this attribute is executed. The code is to be enclosed in curly brackets {...}. <br>
The code is passed the variables <b>$name</b> and <b>$hash</b>, which contain the name of the SolarForecast The code is passed the variables <b>$name</b> and <b>$hash</b>, which contain the name of the SolarForecast
device and its hash. <br> device and its hash. <br>
In the SolarForecast Device, readings can be created and modified using the <b>storeReading</b> function. In the SolarForecast Device, readings can be created and modified using the <b>storeReading</b> function.
@ -24967,11 +24947,24 @@ to ensure that the system configuration is correct.
<tr><td> </td><td>For example, if the value is set to 8, the same weekdays of the past 8 weeks are taken into account. </td></tr> <tr><td> </td><td>For example, if the value is set to 8, the same weekdays of the past 8 weeks are taken into account. </td></tr>
<tr><td> </td><td>Value: <b>Integer 0..180</b>, default: 60 </td></tr> <tr><td> </td><td>Value: <b>Integer 0..180</b>, default: 60 </td></tr>
<tr><td> </td><td> </td></tr> <tr><td> </td><td> </td></tr>
<tr><td> <b>cycleInterval</b> </td><td>Repetition interval of the data collection in seconds. </td></tr>
<tr><td> </td><td>If cycleInterval is explicitly set to 0, there is no regular data collection and must be started externally </td></tr>
<tr><td> </td><td>with get &lt;name&gt; data. </td></tr>
<tr><td> </td><td>Value: <b>Integer</b>, default: 70 </td></tr>
<tr><td> </td><td><b>Note:</b> Regardless of the interval set (even with 0), data is collected automatically a few seconds before the end </td></tr>
<tr><td> </td><td>and after the start of a full hour. Data is also collected automatically when an event from a device defined </td></tr>
<tr><td> </td><td>as asynchronous (consumer, meter, etc.) is received and processed. </td></tr>
<tr><td> </td><td> </td></tr>
<tr><td> <b>feedinPowerLimit</b> </td><td>Feed-in limit of the entire system into the public grid in watts. </td></tr> <tr><td> <b>feedinPowerLimit</b> </td><td>Feed-in limit of the entire system into the public grid in watts. </td></tr>
<tr><td> </td><td>SolarForecast does not limit the feed-in, but uses this information </td></tr> <tr><td> </td><td>SolarForecast does not limit the feed-in, but uses this information </td></tr>
<tr><td> </td><td>within the battery charge management to avoid system curtailment. </td></tr> <tr><td> </td><td>within the battery charge management to avoid system curtailment. </td></tr>
<tr><td> </td><td>Value: <b>Integer</b>, default: unlimited </td></tr> <tr><td> </td><td>Value: <b>Integer</b>, default: unlimited </td></tr>
<tr><td> </td><td> </td></tr> <tr><td> </td><td> </td></tr>
<tr><td> <b>genPVdeviation</b> </td><td>Defines the method for calculating the deviation between forecast and actual PV generation. </td></tr>
<tr><td> </td><td>The reading <b>Today_PVdeviation</b> is created depending on this setting. </td></tr>
<tr><td> </td><td><b>daily</b> - Calculation and creation of Today_PVdeviation takes place after sunset (default) </td></tr>
<tr><td> </td><td><b>continuously</b> - Calculation and creation of Today_PVdeviation is continuous </td></tr>
<tr><td> </td><td> </td></tr>
<tr><td> <b>showLink</b> </td><td>Display of a link to the detailed view of the device above the graphics area </td></tr> <tr><td> <b>showLink</b> </td><td>Display of a link to the detailed view of the device above the graphics area </td></tr>
<tr><td> </td><td><b>0</b> - Display off, <b>1</b> - Display on, default: 0 </td></tr> <tr><td> </td><td><b>0</b> - Display off, <b>1</b> - Display on, default: 0 </td></tr>
<tr><td> </td><td> </td></tr> <tr><td> </td><td> </td></tr>
@ -24980,7 +24973,7 @@ to ensure that the system configuration is correct.
<ul> <ul>
<b>Beispiel: </b> <br> <b>Beispiel: </b> <br>
attr &lt;name&gt; plantControl feedinPowerLimit=4800 consForecastInPlanning=1 showLink=1 backupFilesKeep=2 consForecastIdentWeekdays=1 consForecastLastDays=8 attr &lt;name&gt; plantControl feedinPowerLimit=4800 consForecastInPlanning=1 showLink=1 backupFilesKeep=2 consForecastIdentWeekdays=1 consForecastLastDays=8 genPVdeviation=continuously
</ul> </ul>
</li> </li>
@ -25036,7 +25029,7 @@ to ensure that the system configuration is correct.
<tr><td> </td><td><b>0</b> - no display of the device (default) </td></tr> <tr><td> </td><td><b>0</b> - no display of the device (default) </td></tr>
<tr><td> </td><td><b>1..3[:top|bottom]</b> - display of the device in level 1,2 or 3 (above|below) the bar </td></tr> <tr><td> </td><td><b>1..3[:top|bottom]</b> - display of the device in level 1,2 or 3 (above|below) the bar </td></tr>
<tr><td> </td><td> </td></tr> <tr><td> </td><td> </td></tr>
<tr><td> <b>asynchron</b> </td><td>Data collection mode according to the ctrlInterval setting (synchronous) or additionally by </td></tr> <tr><td> <b>asynchron</b> </td><td>Data collection mode according to the plantControl->cycleInterval setting (synchronous) or additionally by </td></tr>
<tr><td> </td><td>event processing (asynchronous). </td></tr> <tr><td> </td><td>event processing (asynchronous). </td></tr>
<tr><td> </td><td><b>0</b> - no data collection after receiving an event from the device (default) </td></tr> <tr><td> </td><td><b>0</b> - no data collection after receiving an event from the device (default) </td></tr>
<tr><td> </td><td><b>1</b> - trigger a data collection when an event is received from the device </td></tr> <tr><td> </td><td><b>1</b> - trigger a data collection when an event is received from the device </td></tr>
@ -25108,7 +25101,7 @@ to ensure that the system configuration is correct.
<tr><td> </td><td><b>&lt;Day&gt;</b> - Icon and optional color for activity after sunrise </td></tr> <tr><td> </td><td><b>&lt;Day&gt;</b> - Icon and optional color for activity after sunrise </td></tr>
<tr><td> </td><td><b>&lt;Night&gt;</b> - Icon and optional color after sunset, otherwise the moon phase is displayed </td></tr> <tr><td> </td><td><b>&lt;Night&gt;</b> - Icon and optional color after sunset, otherwise the moon phase is displayed </td></tr>
<tr><td> </td><td> </td></tr> <tr><td> </td><td> </td></tr>
<tr><td> <b>asynchron</b> </td><td>Data collection mode according to the ctrlInterval setting (synchronous) or additionally by </td></tr> <tr><td> <b>asynchron</b> </td><td>Data collection mode according to the plantControl->cycleInterval setting (synchronous) or additionally by </td></tr>
<tr><td> </td><td>event processing (asynchronous). (optional) </td></tr> <tr><td> </td><td>event processing (asynchronous). (optional) </td></tr>
<tr><td> </td><td><b>0</b> - no data collection after receiving an event from the device (default) </td></tr> <tr><td> </td><td><b>0</b> - no data collection after receiving an event from the device (default) </td></tr>
<tr><td> </td><td><b>1</b> - trigger a data collection when an event is received from the device </td></tr> <tr><td> </td><td><b>1</b> - trigger a data collection when an event is received from the device </td></tr>
@ -25179,7 +25172,7 @@ to ensure that the system configuration is correct.
<tr><td> </td><td>&lt;Reading&gt;:&lt;Currency&gt; - Reading of the <b>meter device</b> that contains the remuneration : Currency </td></tr> <tr><td> </td><td>&lt;Reading&gt;:&lt;Currency&gt; - Reading of the <b>meter device</b> that contains the remuneration : Currency </td></tr>
<tr><td> </td><td>&lt;Device&gt;:&lt;Reading&gt;:&lt;Currency&gt; - any device and reading containing the remuneration : Currency </td></tr> <tr><td> </td><td>&lt;Device&gt;:&lt;Reading&gt;:&lt;Currency&gt; - any device and reading containing the remuneration : Currency </td></tr>
<tr><td> </td><td> </td></tr> <tr><td> </td><td> </td></tr>
<tr><td> <b>asynchron</b> </td><td>Data collection mode according to the ctrlInterval setting (synchronous) or additionally by </td></tr> <tr><td> <b>asynchron</b> </td><td>Data collection mode according to the plantControl->cycleInterval setting (synchronous) or additionally by </td></tr>
<tr><td> </td><td>event processing (asynchronous). </td></tr> <tr><td> </td><td>event processing (asynchronous). </td></tr>
<tr><td> </td><td><b>0</b> - no data collection after receiving an event from the device (default) </td></tr> <tr><td> </td><td><b>0</b> - no data collection after receiving an event from the device (default) </td></tr>
<tr><td> </td><td><b>1</b> - trigger a data collection when an event is received from the device </td></tr> <tr><td> </td><td><b>1</b> - trigger a data collection when an event is received from the device </td></tr>
@ -26867,34 +26860,6 @@ die ordnungsgemäße Anlagenkonfiguration geprüft werden.
</li> </li>
<br> <br>
<a id="SolarForecast-attr-ctrlGenPVdeviation"></a>
<li><b>ctrlGenPVdeviation </b><br>
Legt die Methode zur Berechnung der Abweichung von prognostizierter und realer PV Erzeugung fest.
Das Reading <b>Today_PVdeviation</b> wird in Abhängigkeit dieser Einstellung erstellt. <br><br>
<ul>
<table>
<colgroup> <col width="15%"> <col width="85%"> </colgroup>
<tr><td> <b>daily</b> </td><td>Berechnung und Erstellung von Today_PVdeviation erfolgt nach Sonnenuntergang (default) </td></tr>
<tr><td> <b>continuously</b> </td><td>Berechnung und Erstellung von Today_PVdeviation erfolgt fortlaufend </td></tr>
</table>
</ul>
</li><br>
<a id="SolarForecast-attr-ctrlInterval"></a>
<li><b>ctrlInterval &lt;Sekunden&gt; </b><br>
Wiederholungsintervall der Datensammlung. <br>
Ist ctrlInterval explizit auf "0" gesetzt, erfolgt keine regelmäßige Datensammlung und muss mit
"get &lt;name&gt; data" extern gestartet werden. <br>
(default: 70)
<br><br>
<b>Hinweis:</b> Unabhängig vom eingestellten Intervall (auch bei "0") erfolgt einige Sekunden vor dem Ende
sowie nach dem Beginn einer vollen Stunde eine automatische Datensammlung. <br>
Weiterhin erfolgt eine automatische Datensammlung wenn ein Event eines als "asynchron"
definierten Gerätes (Consumer, Meter, etc.) empfangen und verarbeitet wird.
</li><br>
<a id="SolarForecast-attr-ctrlLanguage"></a> <a id="SolarForecast-attr-ctrlLanguage"></a>
<li><b>ctrlLanguage &lt;DE | EN&gt; </b><br> <li><b>ctrlLanguage &lt;DE | EN&gt; </b><br>
Legt die benutzte Sprache des Devices fest. Die Sprachendefinition hat Auswirkungen auf die Modulgrafik und Legt die benutzte Sprache des Devices fest. Die Sprachendefinition hat Auswirkungen auf die Modulgrafik und
@ -26997,8 +26962,8 @@ die ordnungsgemäße Anlagenkonfiguration geprüft werden.
<a id="SolarForecast-attr-ctrlUserExitFn"></a> <a id="SolarForecast-attr-ctrlUserExitFn"></a>
<li><b>ctrlUserExitFn {&lt;Code&gt;} </b><br> <li><b>ctrlUserExitFn {&lt;Code&gt;} </b><br>
Nach jedem Zyklus (siehe Attribut <a href="#SolarForecast-attr-ctrlInterval ">ctrlInterval </a>) wird der in diesem Nach jedem Zyklus (siehe Attribut <a href="#SolarForecast-attr-plantControl">plantControl->cycleInterval</a>) wird der in
Attribut abgegebene Code ausgeführt. Der Code ist in geschweifte Klammern {...} einzuschließen. <br> diesem Attribut abgegebene Code ausgeführt. Der Code ist in geschweifte Klammern {...} einzuschließen. <br>
Dem Code werden die Variablen <b>$name</b> und <b>$hash</b> übergeben, die den Namen des SolarForecast Device und Dem Code werden die Variablen <b>$name</b> und <b>$hash</b> übergeben, die den Namen des SolarForecast Device und
dessen Hash enthalten. <br> dessen Hash enthalten. <br>
Im SolarForecast Device können Readings über die Funktion <b>storeReading</b> erzeugt und geändert werden. Im SolarForecast Device können Readings über die Funktion <b>storeReading</b> erzeugt und geändert werden.
@ -27448,11 +27413,24 @@ die ordnungsgemäße Anlagenkonfiguration geprüft werden.
<tr><td> </td><td>Zum Beispiel werden dann bei einem gesetzten Wert von '8' die gleichen Wochentage der vergangenen 8 Wochen berücksichtigt. </td></tr> <tr><td> </td><td>Zum Beispiel werden dann bei einem gesetzten Wert von '8' die gleichen Wochentage der vergangenen 8 Wochen berücksichtigt. </td></tr>
<tr><td> </td><td>Wert: <b>Ganzzahl 0..180</b>, default: 60 </td></tr> <tr><td> </td><td>Wert: <b>Ganzzahl 0..180</b>, default: 60 </td></tr>
<tr><td> </td><td> </td></tr> <tr><td> </td><td> </td></tr>
<tr><td> <b>cycleInterval</b> </td><td>Wiederholungsintervall der Datensammlung in Sekunden. </td></tr>
<tr><td> </td><td>Ist cycleInterval explizit auf '0' gesetzt, erfolgt keine regelmäßige Datensammlung und muss mit 'get &lt;name&gt; data' </td></tr>
<tr><td> </td><td>extern gestartet werden. </td></tr>
<tr><td> </td><td>Wert: <b>Ganzzahl</b>, default: 70 </td></tr>
<tr><td> </td><td><b>Hinweis:</b> Unabhängig vom eingestellten Intervall (auch bei '0') erfolgt einige Sekunden vor dem Ende </td></tr>
<tr><td> </td><td>sowie nach dem Beginn einer vollen Stunde eine automatische Datensammlung. Weiterhin erfolgt eine automatische Datensammlung </td></tr>
<tr><td> </td><td>wenn ein Event eines als "asynchron" definierten Gerätes (Consumer, Meter, etc.) empfangen und verarbeitet wird. </td></tr>
<tr><td> </td><td> </td></tr>
<tr><td> <b>feedinPowerLimit</b> </td><td>Einspeiselimit der Gesamtanlage in das öffentliche Netz in Watt. </td></tr> <tr><td> <b>feedinPowerLimit</b> </td><td>Einspeiselimit der Gesamtanlage in das öffentliche Netz in Watt. </td></tr>
<tr><td> </td><td>SolarForecast limitiert die Einspeisung nicht, verwendet diese Angabe jedoch </td></tr> <tr><td> </td><td>SolarForecast limitiert die Einspeisung nicht, verwendet diese Angabe jedoch </td></tr>
<tr><td> </td><td>innerhalb des Batterie-Lademanagements zur Vermeidung einer Anlagenabregelung. </td></tr> <tr><td> </td><td>innerhalb des Batterie-Lademanagements zur Vermeidung einer Anlagenabregelung. </td></tr>
<tr><td> </td><td>Wert: <b>Ganzzahl</b>, default: unbegrent </td></tr> <tr><td> </td><td>Wert: <b>Ganzzahl</b>, default: unbegrent </td></tr>
<tr><td> </td><td> </td></tr> <tr><td> </td><td> </td></tr>
<tr><td> <b>genPVdeviation</b> </td><td>Legt die Methode zur Berechnung der Abweichung von prognostizierter und realer PV Erzeugung fest. </td></tr>
<tr><td> </td><td>Das Reading <b>Today_PVdeviation</b> wird in Abhängigkeit dieser Einstellung erstellt. </td></tr>
<tr><td> </td><td><b>daily</b> - Berechnung und Erstellung von Today_PVdeviation erfolgt nach Sonnenuntergang (default) </td></tr>
<tr><td> </td><td><b>continuously</b> - Berechnung und Erstellung von Today_PVdeviation erfolgt fortlaufend </td></tr>
<tr><td> </td><td> </td></tr>
<tr><td> <b>showLink</b> </td><td>Anzeige eines Links zur Detailansicht des Device über dem Grafikbereich </td></tr> <tr><td> <b>showLink</b> </td><td>Anzeige eines Links zur Detailansicht des Device über dem Grafikbereich </td></tr>
<tr><td> </td><td><b>0</b> - Anzeige aus, <b>1</b> - Anzeige an, default: 0 </td></tr> <tr><td> </td><td><b>0</b> - Anzeige aus, <b>1</b> - Anzeige an, default: 0 </td></tr>
<tr><td> </td><td> </td></tr> <tr><td> </td><td> </td></tr>
@ -27461,7 +27439,7 @@ die ordnungsgemäße Anlagenkonfiguration geprüft werden.
<ul> <ul>
<b>Beispiel: </b> <br> <b>Beispiel: </b> <br>
attr &lt;name&gt; plantControl feedinPowerLimit=4800 consForecastInPlanning=1 showLink=1 backupFilesKeep=2 consForecastIdentWeekdays=1 consForecastLastDays=8 attr &lt;name&gt; plantControl feedinPowerLimit=4800 consForecastInPlanning=1 showLink=1 backupFilesKeep=2 consForecastIdentWeekdays=1 consForecastLastDays=8 genPVdeviation=continuously
</ul> </ul>
</li> </li>
@ -27516,8 +27494,8 @@ die ordnungsgemäße Anlagenkonfiguration geprüft werden.
<tr><td> </td><td><b>0</b> - keine Anzeige des Gerätes (default) </td></tr> <tr><td> </td><td><b>0</b> - keine Anzeige des Gerätes (default) </td></tr>
<tr><td> </td><td><b>1..3[:top|bottom]</b> - Anzeige des Gerätes in der Ebene 1,2 oder 3 (über|unter) den Balken </td></tr> <tr><td> </td><td><b>1..3[:top|bottom]</b> - Anzeige des Gerätes in der Ebene 1,2 oder 3 (über|unter) den Balken </td></tr>
<tr><td> </td><td> </td></tr> <tr><td> </td><td> </td></tr>
<tr><td> <b>asynchron</b> </td><td>Modus der Datensammlung entsprechend Einstellung ctrlInterval (synchron) oder zusätzlich durch </td></tr> <tr><td> <b>asynchron</b> </td><td>Modus der Datensammlung entsprechend Einstellung plantControl->cycleInterval (synchron) oder </td></tr>
<tr><td> </td><td>Eventverarbeitung (asynchron). </td></tr> <tr><td> </td><td>zusätzlich durch Eventverarbeitung (asynchron). </td></tr>
<tr><td> </td><td><b>0</b> - keine Datensammlung nach Empfang eines Events des Gerätes (default) </td></tr> <tr><td> </td><td><b>0</b> - keine Datensammlung nach Empfang eines Events des Gerätes (default) </td></tr>
<tr><td> </td><td><b>1</b> - auslösen einer Datensammlung bei Empfang eines Events des Gerätes </td></tr> <tr><td> </td><td><b>1</b> - auslösen einer Datensammlung bei Empfang eines Events des Gerätes </td></tr>
</table> </table>
@ -27589,8 +27567,8 @@ die ordnungsgemäße Anlagenkonfiguration geprüft werden.
<tr><td> </td><td><b>&lt;Tag&gt;</b> - Icon und ggf. Farbe bei Aktivität nach Sonnenaufgang </td></tr> <tr><td> </td><td><b>&lt;Tag&gt;</b> - Icon und ggf. Farbe bei Aktivität nach Sonnenaufgang </td></tr>
<tr><td> </td><td><b>&lt;Nacht&gt;</b> - Icon und ggf. Farbe nach Sonnenuntergang, sonst wird die Mondphase angezeigt </td></tr> <tr><td> </td><td><b>&lt;Nacht&gt;</b> - Icon und ggf. Farbe nach Sonnenuntergang, sonst wird die Mondphase angezeigt </td></tr>
<tr><td> </td><td> </td></tr> <tr><td> </td><td> </td></tr>
<tr><td> <b>asynchron</b> </td><td>Modus der Datensammlung entsprechend Einstellung ctrlInterval (synchron) oder zusätzlich durch </td></tr> <tr><td> <b>asynchron</b> </td><td>Modus der Datensammlung entsprechend Einstellung plantControl->cycleInterval (synchron) oder </td></tr>
<tr><td> </td><td>Eventverarbeitung (asynchron). (optional) </td></tr> <tr><td> </td><td> zusätzlich durch Eventverarbeitung (asynchron). (optional) </td></tr>
<tr><td> </td><td><b>0</b> - keine Datensammlung nach Empfang eines Events des Gerätes (default) </td></tr> <tr><td> </td><td><b>0</b> - keine Datensammlung nach Empfang eines Events des Gerätes (default) </td></tr>
<tr><td> </td><td><b>1</b> - auslösen einer Datensammlung bei Empfang eines Events des Gerätes </td></tr> <tr><td> </td><td><b>1</b> - auslösen einer Datensammlung bei Empfang eines Events des Gerätes </td></tr>
</table> </table>
@ -27661,7 +27639,7 @@ die ordnungsgemäße Anlagenkonfiguration geprüft werden.
<tr><td> </td><td>&lt;Reading&gt;:&lt;Währung&gt; - Reading des <b>Meter Device</b> das die Vergütung enthält : Währung </td></tr> <tr><td> </td><td>&lt;Reading&gt;:&lt;Währung&gt; - Reading des <b>Meter Device</b> das die Vergütung enthält : Währung </td></tr>
<tr><td> </td><td>&lt;Device&gt;:&lt;Reading&gt;:&lt;Währung&gt; - beliebiges Device und Reading welches die Vergütung enthält : Währung </td></tr> <tr><td> </td><td>&lt;Device&gt;:&lt;Reading&gt;:&lt;Währung&gt; - beliebiges Device und Reading welches die Vergütung enthält : Währung </td></tr>
<tr><td> </td><td> </td></tr> <tr><td> </td><td> </td></tr>
<tr><td> <b>asynchron</b> </td><td>Modus der Datensammlung entsprechend Einstellung ctrlInterval (synchron) oder zusätzlich durch </td></tr> <tr><td> <b>asynchron</b> </td><td>Modus der Datensammlung entsprechend Einstellung plantControl->cycleInterval (synchron) oder zusätzlich durch </td></tr>
<tr><td> </td><td>Eventverarbeitung (asynchron). </td></tr> <tr><td> </td><td>Eventverarbeitung (asynchron). </td></tr>
<tr><td> </td><td><b>0</b> - keine Datensammlung nach Empfang eines Events des Gerätes (default) </td></tr> <tr><td> </td><td><b>0</b> - keine Datensammlung nach Empfang eines Events des Gerätes (default) </td></tr>
<tr><td> </td><td><b>1</b> - auslösen einer Datensammlung bei Empfang eines Events des Gerätes </td></tr> <tr><td> </td><td><b>1</b> - auslösen einer Datensammlung bei Empfang eines Events des Gerätes </td></tr>