2
0
mirror of https://github.com/fhem/fhem-mirror.git synced 2025-04-19 00:26:03 +00:00

76_SolarForecast: contrib 1.34.2

git-svn-id: https://svn.fhem.de/fhem/trunk@29199 2b470e98-0d58-463d-a4d8-8e2adae1ed80
This commit is contained in:
nasseeder1 2024-10-05 09:02:20 +00:00
parent 4e0092d40e
commit 2bd71f301b

View File

@ -156,7 +156,8 @@ BEGIN {
# Versions History intern # Versions History intern
my %vNotesIntern = ( my %vNotesIntern = (
"1.34.2" => "04.10.2024 _flowGraphic: replace sun by FHEM SVG-Icon, sun or icon of moon phases according day/night ", "1.34.2" => "05.10.2024 _flowGraphic: replace sun by FHEM SVG-Icon, sun or icon of moon phases according day/night ".
"new optional key 'icon' in attr setupInverterDev ",
"1.34.1" => "04.10.2024 _flowGraphic: replace house by FHEM SVG-Icon ", "1.34.1" => "04.10.2024 _flowGraphic: replace house by FHEM SVG-Icon ",
"1.34.0" => "03.10.2024 implement ___areaFactorTrack for calculation of direct area factor and share of direct radiation ". "1.34.0" => "03.10.2024 implement ___areaFactorTrack for calculation of direct area factor and share of direct radiation ".
"note in Reading pvCorrectionFactor_XX if AI prediction was used in relevant hour ". "note in Reading pvCorrectionFactor_XX if AI prediction was used in relevant hour ".
@ -396,7 +397,7 @@ my %vNotesIntern = (
"0.1.0" => "09.12.2020 initial Version " "0.1.0" => "09.12.2020 initial Version "
); );
## default Variablen ## Standardvariablen
###################### ######################
my @da; # Readings-Store my @da; # Readings-Store
my $deflang = 'EN'; # default Sprache wenn nicht konfiguriert my $deflang = 'EN'; # default Sprache wenn nicht konfiguriert
@ -483,10 +484,14 @@ my $b4fontcoldef = '000000';
my $fgCDdef = 130; # Abstand Verbrauchericons zueinander my $fgCDdef = 130; # Abstand Verbrauchericons zueinander
my $prodicondef = 'sani_garden_pump'; # default Producer-Icon my $prodicondef = 'sani_garden_pump'; # default Producer-Icon
my $consicondef = 'light_light_dim_100'; # default Consumer-Icon my $cicondef = 'light_light_dim_100'; # default Consumer-Icon
my $ciconcoldef = 'darkorange'; # default Consumer-Icon Färbung
my $homeicondef = 'control_building_control@grey'; # default Home-Icon my $homeicondef = 'control_building_control@grey'; # default Home-Icon
my $sunicondef = 'weather_sun'; # default Sonne-icon my $invicondef = 'weather_sun'; # default Inverter-icon
my $inviconcoldef = 'orange'; # default Inverter Färbung wenn aktiv
my $moonicondef = 2; # default Mond-Phase (aus %hmoon) my $moonicondef = 2; # default Mond-Phase (aus %hmoon)
my $mooncoldef = 'lightblue'; # default Mond Färbung
my $inactcoldef = 'grey'; # default Färbung Icon wenn inaktiv
my $bPath = 'https://svn.fhem.de/trac/browser/trunk/fhem/contrib/SolarForecast/'; # Basispfad Abruf contrib SolarForecast Files my $bPath = 'https://svn.fhem.de/trac/browser/trunk/fhem/contrib/SolarForecast/'; # Basispfad Abruf contrib SolarForecast Files
my $pPath = '?format=txt'; # Download Format my $pPath = '?format=txt'; # Download Format
@ -5756,6 +5761,10 @@ sub _attrInverterDev { ## no critic "not used"
delete $data{$type}{$name}{circular}{99}{attrInvChangedTs}; delete $data{$type}{$name}{circular}{99}{attrInvChangedTs};
} }
delete $data{$type}{$name}{current}{invertercapi01};
delete $data{$type}{$name}{current}{iconi01};
InternalTimer (gettimeofday()+0.5, 'FHEM::SolarForecast::centralTask', [$name, 0], 0);
InternalTimer (gettimeofday() + 2, 'FHEM::SolarForecast::createAssociatedWith', $hash, 0); InternalTimer (gettimeofday() + 2, 'FHEM::SolarForecast::createAssociatedWith', $hash, 0);
InternalTimer (gettimeofday() + 3, 'FHEM::SolarForecast::writeCacheToFile', [$name, 'plantconfig', $plantcfg.$name], 0); # Anlagenkonfiguration File schreiben InternalTimer (gettimeofday() + 3, 'FHEM::SolarForecast::writeCacheToFile', [$name, 'plantconfig', $plantcfg.$name], 0); # Anlagenkonfiguration File schreiben
@ -8195,10 +8204,10 @@ sub __calcPVestimates {
$pvsum = $peaksum if($peaksum && $pvsum > $peaksum); # Vorhersage nicht größer als die Summe aller PV-Strings Peak $pvsum = $peaksum if($peaksum && $pvsum > $peaksum); # Vorhersage nicht größer als die Summe aller PV-Strings Peak
my $invcapacity = CurrentVal ($hash, 'invertercapacity', 0); # Max. Leistung des Invertrs my $invcap = CurrentVal ($hash, 'invertercapi01', 0); # Max. Leistung des Invertrs
if ($invcapacity && $pvsum > $invcapacity) { if ($invcap && $pvsum > $invcap) {
$pvsum = $invcapacity; # PV Vorhersage auf WR Kapazität begrenzen $pvsum = $invcap; # PV Vorhersage auf WR Kapazität begrenzen
debugLog ($paref, "radiationProcess", "PV forecast start time $wantdt limited to $pvsum Watt due to inverter capacity"); debugLog ($paref, "radiationProcess", "PV forecast start time $wantdt limited to $pvsum Watt due to inverter capacity");
} }
@ -8406,8 +8415,6 @@ sub _transferInverterValues {
my ($pvread,$pvunit) = split ":", $h->{pv}; # Readingname/Unit für aktuelle PV Erzeugung my ($pvread,$pvunit) = split ":", $h->{pv}; # Readingname/Unit für aktuelle PV Erzeugung
my ($edread,$etunit) = split ":", $h->{etotal}; # Readingname/Unit für Energie total (PV Erzeugung) my ($edread,$etunit) = split ":", $h->{etotal}; # Readingname/Unit für Energie total (PV Erzeugung)
$data{$type}{$name}{current}{invertercapacity} = $h->{capacity} if(defined $h->{capacity}); # optionale Angabe max. WR-Leistung
return if(!$pvread || !$edread); return if(!$pvread || !$edread);
my $pvuf = $pvunit =~ /^kW$/xi ? 1000 : 1; my $pvuf = $pvunit =~ /^kW$/xi ? 1000 : 1;
@ -8415,7 +8422,7 @@ sub _transferInverterValues {
$pv = $pv < 0 ? 0 : sprintf("%.0f", $pv); # Forum: https://forum.fhem.de/index.php/topic,117864.msg1159718.html#msg1159718, https://forum.fhem.de/index.php/topic,117864.msg1166201.html#msg1166201 $pv = $pv < 0 ? 0 : sprintf("%.0f", $pv); # Forum: https://forum.fhem.de/index.php/topic,117864.msg1159718.html#msg1159718, https://forum.fhem.de/index.php/topic,117864.msg1166201.html#msg1166201
storeReading ('Current_PV', $pv.' W'); storeReading ('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}{generationi01} = $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 push @{$data{$type}{$name}{current}{genslidereg}}, $pv; # Schieberegister PV Erzeugung
limitArray ($data{$type}{$name}{current}{genslidereg}, $slidenumdef); limitArray ($data{$type}{$name}{current}{genslidereg}, $slidenumdef);
@ -8434,7 +8441,7 @@ sub _transferInverterValues {
if (!$histetot) { # etotal der aktuelle Stunde gesetzt ? if (!$histetot) { # etotal der aktuelle Stunde gesetzt ?
writeToHistory ( { paref => $paref, key => 'etotal', val => $etotal, hour => $nhour } ); writeToHistory ( { paref => $paref, key => 'etotal', val => $etotal, hour => $nhour } );
$etotsvd = CurrentVal ($hash, 'etotal', $etotal); $etotsvd = CurrentVal ($hash, 'etotali01', $etotal);
$ethishour = int ($etotal - $etotsvd); $ethishour = int ($etotal - $etotsvd);
} }
else { else {
@ -8445,12 +8452,15 @@ sub _transferInverterValues {
writeToHistory ( { paref => $paref, key => 'etotal', val => $etotal, hour => $nhour } ); writeToHistory ( { paref => $paref, key => 'etotal', val => $etotal, hour => $nhour } );
$etotsvd = CurrentVal ($hash, 'etotal', $etotal); $etotsvd = CurrentVal ($hash, 'etotali01', $etotal);
$ethishour = int ($etotal - $etotsvd); $ethishour = int ($etotal - $etotsvd);
} }
} }
$data{$type}{$name}{current}{etotal} = $etotal; # aktuellen etotal des WR speichern $data{$type}{$name}{current}{etotali01} = $etotal; # aktuellen etotal des WR speichern
$data{$type}{$name}{current}{namei01} = $indev; # Name des Inverterdevices
$data{$type}{$name}{current}{invertercapi01} = $h->{capacity} if(defined $h->{capacity}); # optionale Angabe max. WR-Leistung
$data{$type}{$name}{current}{iconi01} = $h->{icon} if($h->{icon}); # Icon des Inverters
if ($ethishour < 0) { if ($ethishour < 0) {
$ethishour = 0; $ethishour = 0;
@ -8500,8 +8510,6 @@ sub _transferProducerValues {
next if(!$pcread || !$edread); next if(!$pcread || !$edread);
$data{$type}{$name}{current}{'iconp'.$prn} = $h->{icon} if($h->{icon}); # Icon des Producers
my $pu = $pcunit =~ /^kW$/xi ? 1000 : 1; my $pu = $pcunit =~ /^kW$/xi ? 1000 : 1;
my $p = ReadingsNum ($prdev, $pcread, 0) * $pu; # aktuelle Erzeugung (W) my $p = ReadingsNum ($prdev, $pcread, 0) * $pu; # aktuelle Erzeugung (W)
$p = $p < 0 ? 0 : $p; $p = $p < 0 ? 0 : $p;
@ -8531,8 +8539,9 @@ sub _transferProducerValues {
} }
$data{$type}{$name}{current}{'etotalp'.$prn} = $etotal; # aktuellen etotal des WR speichern $data{$type}{$name}{current}{'etotalp'.$prn} = $etotal; # aktuellen etotal des WR speichern
$data{$type}{$name}{current}{'namep' .$prn} = $prdev; # Name des Producerdevices $data{$type}{$name}{current}{'namep'. $prn} = $prdev; # Name des Producerdevices
$data{$type}{$name}{current}{'aliasp' .$prn} = AttrVal ($prdev, 'alias', $prdev); # Alias Producer $data{$type}{$name}{current}{'aliasp'. $prn} = AttrVal ($prdev, 'alias', $prdev); # Alias Producer
$data{$type}{$name}{current}{'iconp'. $prn} = $h->{icon} if($h->{icon}); # Icon des Producers
if ($ethishour < 0) { if ($ethishour < 0) {
$ethishour = 0; $ethishour = 0;
@ -9203,12 +9212,12 @@ sub _createSummaries {
push @{$data{$type}{$name}{current}{h4fcslidereg}}, int $next4HoursSum->{PV}; # Schieberegister 4h Summe Forecast push @{$data{$type}{$name}{current}{h4fcslidereg}}, int $next4HoursSum->{PV}; # Schieberegister 4h Summe Forecast
limitArray ($data{$type}{$name}{current}{h4fcslidereg}, $slidenumdef); limitArray ($data{$type}{$name}{current}{h4fcslidereg}, $slidenumdef);
my $gcon = CurrentVal ($hash, "gridconsumption", 0); # aktueller Netzbezug my $gcon = CurrentVal ($hash, 'gridconsumption', 0); # aktueller Netzbezug
my $tconsum = CurrentVal ($hash, "tomorrowconsumption", undef); # Verbrauchsprognose für folgenden Tag my $tconsum = CurrentVal ($hash, 'tomorrowconsumption', undef); # Verbrauchsprognose für folgenden Tag
my $pvgen = CurrentVal ($hash, "generation", 0); my $pvgen = CurrentVal ($hash, 'generationi01', 0);
my $gfeedin = CurrentVal ($hash, "gridfeedin", 0); my $gfeedin = CurrentVal ($hash, 'gridfeedin', 0);
my $batin = CurrentVal ($hash, "powerbatin", 0); # aktuelle Batterieladung my $batin = CurrentVal ($hash, 'powerbatin', 0); # aktuelle Batterieladung
my $batout = CurrentVal ($hash, "powerbatout", 0); # aktuelle Batterieentladung my $batout = CurrentVal ($hash, 'powerbatout', 0); # aktuelle Batterieentladung
my $othprod = 0; # Summe Otherproducer my $othprod = 0; # Summe Otherproducer
@ -13954,7 +13963,7 @@ sub _flowGraphic {
my $cgfi = ReadingsNum ($name, 'Current_GridFeedIn', 0); my $cgfi = ReadingsNum ($name, 'Current_GridFeedIn', 0);
my $csc = ReadingsNum ($name, 'Current_SelfConsumption', 0); my $csc = ReadingsNum ($name, 'Current_SelfConsumption', 0);
my $cc = CurrentVal ($hash, 'consumption', 0); my $cc = CurrentVal ($hash, 'consumption', 0);
my $cpv = ReadingsNum ($name, 'Current_PV', 0); my $cpv = CurrentVal ($hash, 'generationi01', 0);
my $batin = ReadingsNum ($name, 'Current_PowerBatIn', undef); my $batin = ReadingsNum ($name, 'Current_PowerBatIn', undef);
my $batout = ReadingsNum ($name, 'Current_PowerBatOut', undef); my $batout = ReadingsNum ($name, 'Current_PowerBatOut', undef);
my $soc = ReadingsNum ($name, 'Current_BatCharge', 100); my $soc = ReadingsNum ($name, 'Current_BatCharge', 100);
@ -14092,7 +14101,7 @@ END0
for my $prnxnum (@producers) { for my $prnxnum (@producers) {
my $palias = CurrentVal ($hash, 'aliasp'.$prnxnum, 'Producer'.$prnxnum); my $palias = CurrentVal ($hash, 'aliasp'.$prnxnum, 'Producer'.$prnxnum);
my $picon = __substituteIcon ( { hash => $hash, # Icon des Producerdevices my ($picon) = __substituteIcon ( { hash => $hash, # Icon des Producerdevices
name => $name, name => $name,
pn => $prnxnum, pn => $prnxnum,
pcurr => $ppcurr->{$prnxnum} pcurr => $ppcurr->{$prnxnum}
@ -14126,7 +14135,7 @@ END0
for my $c (@consumers) { for my $c (@consumers) {
my $calias = ConsumerVal ($hash, $c, "alias", ""); # Name des Consumerdevices my $calias = ConsumerVal ($hash, $c, "alias", ""); # Name des Consumerdevices
$currentPower = $cpcurr->{$c}; $currentPower = $cpcurr->{$c};
my $cicon = __substituteIcon ({hash => $hash, name => $name, cn => $c, pcurr => $currentPower}); # Icon des Consumerdevices my ($cicon) = __substituteIcon ({hash => $hash, name => $name, cn => $c, pcurr => $currentPower}); # Icon des Consumerdevices
$cc_dummy -= $currentPower; $cc_dummy -= $currentPower;
$ret .= '<g id="consumer_'.$c.'" fill="grey" transform="translate('.$pos_left.',485),scale(0.1)">'; $ret .= '<g id="consumer_'.$c.'" fill="grey" transform="translate('.$pos_left.',485),scale(0.1)">';
@ -14139,22 +14148,15 @@ END0
## Sonne / Mond Icon ## Sonne / Mond Icon
###################### ######################
my ($smicon, $smtxt); my ($smicon, $smtxt) = __substituteIcon ( { hash => $hash,
name => $name,
my $don = NexthoursVal ($hash, 'NextHour00', 'DoN', 0); # Tag oder Nacht in => '01',
don => NexthoursVal ($hash, 'NextHour00', 'DoN', 0), # Tag oder Nacht
if ($don) { pcurr => $cpv
my $suncolor = $cpv ? 'orange' : 'grey';
$smicon = $sunicondef.'@'.$suncolor;
$smtxt = 'die Sonne ist aufgegangen';
}
else {
my $moonPhaseI = CurrentVal ($hash, 'moonPhaseI', $moonicondef);
$smicon = $hmoon{$moonPhaseI}{icon}.'@lightblue';
$smtxt = $hmoon{$moonPhaseI}{$lang};
} }
);
$ret .= '<g id="Sonne" fill="grey" transform="translate(355,165),scale(0.12)">'; # translate(X-Koordinate,Y-Koordinate), scale(<Größe>)-> Koordinaten ändern sich bei Größenänderung $ret .= '<g id="Sonne" fill="grey" transform="translate(360,165),scale(0.10)">'; # translate(X-Koordinate,Y-Koordinate), scale(<Größe>)-> Koordinaten ändern sich bei Größenänderung
$ret .= "<title>$smtxt</title>".FW_makeImage($smicon, ''); $ret .= "<title>$smtxt</title>".FW_makeImage($smicon, '');
$ret .= '</g> '; $ret .= '</g> ';
@ -14186,7 +14188,7 @@ END1
my $dumtxt = $htitles{dumtxt}{$lang}; my $dumtxt = $htitles{dumtxt}{$lang};
my $dumcol = $cc_dummy <= 0 ? '@grey' : q{}; # Einfärbung Consumer Dummy my $dumcol = $cc_dummy <= 0 ? '@grey' : q{}; # Einfärbung Consumer Dummy
$ret .= '<g id="consumer_X" fill="grey" transform="translate(520,360),scale(0.09)">'; $ret .= '<g id="consumer_X" fill="grey" transform="translate(520,360),scale(0.09)">';
$ret .= "<title>$dumtxt</title>".FW_makeImage($consicondef.$dumcol, ''); $ret .= "<title>$dumtxt</title>".FW_makeImage($cicondef.$dumcol, '');
$ret .= '</g> '; $ret .= '</g> ';
} }
@ -14432,6 +14434,8 @@ return $ret;
# und setze ggf. Ersatzwerte # und setze ggf. Ersatzwerte
# $cn - Consumernummer (01...max) # $cn - Consumernummer (01...max)
# $pn - Producernummer (01...max) # $pn - Producernummer (01...max)
# $in - Inverter, Smartloader (01..max)
# $don - Day or Night
# $pcurr - aktuelle Leistung / Verbrauch # $pcurr - aktuelle Leistung / Verbrauch
################################################################ ################################################################
sub __substituteIcon { sub __substituteIcon {
@ -14440,33 +14444,44 @@ sub __substituteIcon {
my $name = $paref->{name}; my $name = $paref->{name};
my $cn = $paref->{cn}; my $cn = $paref->{cn};
my $pn = $paref->{pn}; my $pn = $paref->{pn};
my $in = $paref->{in};
my $don = $paref->{don};
my $pcurr = $paref->{pcurr}; my $pcurr = $paref->{pcurr};
my $lang = $paref->{lang};
my ($color, $icon); my ($color, $icon);
my $txt = '';
if ($cn) { # Icon Consumer if ($cn) { # Icon Consumer
$icon = ConsumerVal ($hash, $cn, 'icon', $consicondef); ($icon, $color) = split '@', ConsumerVal ($hash, $cn, 'icon', $cicondef);
}
elsif ($pn) {
$icon = CurrentVal ($hash, 'iconp'.$pn, $prodicondef); # Icon Producer
}
($icon, $color) = split '@', $icon;
if ($cn) {
if (!$color) { if (!$color) {
$color = isConsumerLogOn ($hash, $cn, $pcurr) ? 'darkorange' : ''; $color = isConsumerLogOn ($hash, $cn, $pcurr) ? $ciconcoldef : '';
} }
} }
elsif ($pn) { elsif ($pn) { # Icon Producer
($icon, $color) = split '@', CurrentVal ($hash, 'iconp'.$pn, $prodicondef);
if (!$pcurr) { if (!$pcurr) {
$color = 'grey'; $color = 'grey';
} }
} }
elsif ($in) { # Inverter, Smartloader
if ($don || $pcurr) { # Tag
($icon, $color) = split '@', CurrentVal ($hash, 'iconi'.$in, $invicondef);
$color = $pcurr ? ($color ? $color : $inviconcoldef) : $inactcoldef;
}
else { # Nacht -> Mondphase
my $mpi = CurrentVal ($hash, 'moonPhaseI', $moonicondef);
$icon = $hmoon{$mpi}{icon}.'@'.$mooncoldef;
($icon, $color) = split '@', $icon;
$txt = $hmoon{$mpi}{$lang};
}
}
$icon .= '@'.$color if($color); $icon .= '@'.$color if($color);
return $icon; return ($icon, $txt);
} }
################################################################ ################################################################
@ -18600,7 +18615,8 @@ return $def;
# Usage: # Usage:
# CurrentVal ($hash, $key, $def) # CurrentVal ($hash, $key, $def)
# #
# $key: generation - aktuelle PV Erzeugung # $key: generationiXX - aktuelle PV Erzeugung Inverter XX
# generationpXX - aktuelle Erzeugung Producer XX
# aiinitstate - Initialisierungsstatus der KI # aiinitstate - Initialisierungsstatus der KI
# aitrainstate - Traisningsstatus der KI # aitrainstate - Traisningsstatus der KI
# aiaddistate - Add Instanz Status der KI # aiaddistate - Add Instanz Status der KI
@ -18622,7 +18638,7 @@ return $def;
# temp - aktuelle Außentemperatur # temp - aktuelle Außentemperatur
# surplus - aktueller PV Überschuß # surplus - aktueller PV Überschuß
# tomorrowconsumption - Verbrauch des kommenden Tages # tomorrowconsumption - Verbrauch des kommenden Tages
# invertercapacity - Bemessungsleistung der Wechselrichters (max. W) # invertercapXX - Bemessungsleistung der Wechselrichters XX (max. W)
# allstringspeak - Peakleistung aller Strings nach temperaturabhängiger Korrektur # allstringspeak - Peakleistung aller Strings nach temperaturabhängiger Korrektur
# allstringscount - aktuelle Anzahl der Anlagenstrings # allstringscount - aktuelle Anzahl der Anlagenstrings
# tomorrowconsumption - erwarteter Gesamtverbrauch am morgigen Tag # tomorrowconsumption - erwarteter Gesamtverbrauch am morgigen Tag
@ -20941,7 +20957,8 @@ to ensure that the system configuration is correct.
<br> <br>
<a id="SolarForecast-attr-setupInverterDev"></a> <a id="SolarForecast-attr-setupInverterDev"></a>
<li><b>setupInverterDev &lt;Inverter Device Name&gt; pv=&lt;Readingname&gt;:&lt;Unit&gt; etotal=&lt;Readingname&gt;:&lt;Unit&gt; [capacity=&lt;max. WR-Leistung&gt;] </b> <br><br> <li><b>setupInverterDev &lt;Inverter Device Name&gt; pv=&lt;Readingname&gt;:&lt;Unit&gt; etotal=&lt;Readingname&gt;:&lt;Unit&gt;
[capacity=&lt;max. WR-Leistung&gt;] [icon=&lt;Icon&gt;[@&lt;Farbe&gt;]] </b> <br><br>
Specifies any Device and its Readings to deliver the current PV generation values. Specifies any Device and its Readings to deliver the current PV generation values.
It can also be a dummy device with appropriate readings. It can also be a dummy device with appropriate readings.
@ -20953,6 +20970,7 @@ to ensure that the system configuration is correct.
<ul> <ul>
<table> <table>
<colgroup> <col width="15%"> <col width="85%"> </colgroup> <colgroup> <col width="15%"> <col width="85%"> </colgroup>
<tr><td> <b>icon</b> </td><td>Icon and, if applicable, color for activity to display the inverter in the flow chart (optional) </td></tr>
<tr><td> <b>pv</b> </td><td>Reading which provides the current PV generation as a positive value </td></tr> <tr><td> <b>pv</b> </td><td>Reading which provides the current PV generation as a positive value </td></tr>
<tr><td> <b>etotal</b> </td><td>Reading which provides the total PV energy generated (a steadily increasing counter). </td></tr> <tr><td> <b>etotal</b> </td><td>Reading which provides the total PV energy generated (a steadily increasing counter). </td></tr>
<tr><td> </td><td>If the reading violates the specification of a continuously rising counter, </td></tr> <tr><td> </td><td>If the reading violates the specification of a continuously rising counter, </td></tr>
@ -20966,7 +20984,7 @@ to ensure that the system configuration is correct.
<ul> <ul>
<b>Example: </b> <br> <b>Example: </b> <br>
attr &lt;name&gt; setupInverterDev STP5000 pv=total_pac:kW etotal=etotal:kWh capacity=5000 attr &lt;name&gt; setupInverterDev STP5000 pv=total_pac:kW etotal=etotal:kWh capacity=5000 icon=solar@red
</ul> </ul>
<br> <br>
@ -21057,7 +21075,7 @@ to ensure that the system configuration is correct.
<ul> <ul>
<table> <table>
<colgroup> <col width="15%"> <col width="85%"> </colgroup> <colgroup> <col width="15%"> <col width="85%"> </colgroup>
<tr><td> <b>icon</b> </td><td>Icon and, if applicable, color for displaying the producer in the flow chart (optional) </td></tr> <tr><td> <b>icon</b> </td><td>Icon and, if applicable, color for activity to display the producer in the flow chart (optional) </td></tr>
<tr><td> <b>pcurr</b> </td><td>Reading which returns the current generation as a positive value or a self-consumption (special case) as a negative value </td></tr> <tr><td> <b>pcurr</b> </td><td>Reading which returns the current generation as a positive value or a self-consumption (special case) as a negative value </td></tr>
<tr><td> <b>etotal</b> </td><td>Reading which supplies the total energy generated (a continuously ascending counter) </td></tr> <tr><td> <b>etotal</b> </td><td>Reading which supplies the total energy generated (a continuously ascending counter) </td></tr>
<tr><td> </td><td>If the reading violates the specification of a continuously rising counter, </td></tr> <tr><td> </td><td>If the reading violates the specification of a continuously rising counter, </td></tr>
@ -23288,7 +23306,8 @@ die ordnungsgemäße Anlagenkonfiguration geprüft werden.
<br> <br>
<a id="SolarForecast-attr-setupInverterDev"></a> <a id="SolarForecast-attr-setupInverterDev"></a>
<li><b>setupInverterDev &lt;Inverter Device Name&gt; pv=&lt;Readingname&gt;:&lt;Einheit&gt; etotal=&lt;Readingname&gt;:&lt;Einheit&gt; [capacity=&lt;max. WR-Leistung&gt;] </b> <br><br> <li><b>setupInverterDev &lt;Inverter Device Name&gt; pv=&lt;Readingname&gt;:&lt;Einheit&gt; etotal=&lt;Readingname&gt;:&lt;Einheit&gt;
[capacity=&lt;max. WR-Leistung&gt;] [icon=&lt;Icon&gt;[@&lt;Farbe&gt;]] </b> <br><br>
Legt ein beliebiges Device und dessen Readings zur Lieferung der aktuellen PV Erzeugungswerte fest. Legt ein beliebiges Device und dessen Readings zur Lieferung der aktuellen PV Erzeugungswerte fest.
Es kann auch ein Dummy Device mit entsprechenden Readings sein. Es kann auch ein Dummy Device mit entsprechenden Readings sein.
@ -23300,6 +23319,7 @@ die ordnungsgemäße Anlagenkonfiguration geprüft werden.
<ul> <ul>
<table> <table>
<colgroup> <col width="15%"> <col width="85%"> </colgroup> <colgroup> <col width="15%"> <col width="85%"> </colgroup>
<tr><td> <b>icon</b> </td><td>Icon und ggf. Farbe bei Aktivität zur Darstellung des Inverters in der Flowgrafik (optional) </td></tr>
<tr><td> <b>pv</b> </td><td>Reading welches die aktuelle PV-Erzeugung als positiven Wert liefert </td></tr> <tr><td> <b>pv</b> </td><td>Reading welches die aktuelle PV-Erzeugung als positiven Wert liefert </td></tr>
<tr><td> <b>etotal</b> </td><td>Reading welches die gesamte erzeugte PV-Energie liefert (ein stetig aufsteigender Zähler) </td></tr> <tr><td> <b>etotal</b> </td><td>Reading welches die gesamte erzeugte PV-Energie liefert (ein stetig aufsteigender Zähler) </td></tr>
<tr><td> </td><td>Sollte des Reading die Vorgabe eines stetig aufsteigenden Zählers verletzen, behandelt </td></tr> <tr><td> </td><td>Sollte des Reading die Vorgabe eines stetig aufsteigenden Zählers verletzen, behandelt </td></tr>
@ -23313,7 +23333,7 @@ die ordnungsgemäße Anlagenkonfiguration geprüft werden.
<ul> <ul>
<b>Beispiel: </b> <br> <b>Beispiel: </b> <br>
attr &lt;name&gt; setupInverterDev STP5000 pv=total_pac:kW etotal=etotal:kWh capacity=5000 attr &lt;name&gt; setupInverterDev STP5000 pv=total_pac:kW etotal=etotal:kWh capacity=5000 icon=solar@red
</ul> </ul>
<br> <br>
@ -23404,7 +23424,7 @@ die ordnungsgemäße Anlagenkonfiguration geprüft werden.
<ul> <ul>
<table> <table>
<colgroup> <col width="15%"> <col width="85%"> </colgroup> <colgroup> <col width="15%"> <col width="85%"> </colgroup>
<tr><td> <b>icon</b> </td><td>Icon und ggf. Farbe zur Darstellung des Producers in der Flowgrafik (optional) </td></tr> <tr><td> <b>icon</b> </td><td>Icon und ggf. Farbe bei Aktivität zur Darstellung des Producers in der Flowgrafik (optional) </td></tr>
<tr><td> <b>pcurr</b> </td><td>Reading welches die aktuelle Erzeugung als positiven Wert oder einen Eigenverbrauch (Sonderfall) als negativen Wert liefert </td></tr> <tr><td> <b>pcurr</b> </td><td>Reading welches die aktuelle Erzeugung als positiven Wert oder einen Eigenverbrauch (Sonderfall) als negativen Wert liefert </td></tr>
<tr><td> <b>etotal</b> </td><td>Reading welches die gesamte erzeugte Energie liefert (ein stetig aufsteigender Zähler) </td></tr> <tr><td> <b>etotal</b> </td><td>Reading welches die gesamte erzeugte Energie liefert (ein stetig aufsteigender Zähler) </td></tr>
<tr><td> </td><td>Sollte des Reading die Vorgabe eines stetig aufsteigenden Zählers verletzen, behandelt </td></tr> <tr><td> </td><td>Sollte des Reading die Vorgabe eines stetig aufsteigenden Zählers verletzen, behandelt </td></tr>