From 2acaeef18881e0cddab63501ac6360b3298c1075 Mon Sep 17 00:00:00 2001 From: nasseeder1 Date: Tue, 11 May 2021 16:42:32 +0000 Subject: [PATCH] 76_SolarForecast.pm: contrib 0.44.0 git-svn-id: https://svn.fhem.de/fhem/trunk@24418 2b470e98-0d58-463d-a4d8-8e2adae1ed80 --- fhem/contrib/DS_Starter/76_SolarForecast.pm | 279 ++++++++++++++------ 1 file changed, 192 insertions(+), 87 deletions(-) diff --git a/fhem/contrib/DS_Starter/76_SolarForecast.pm b/fhem/contrib/DS_Starter/76_SolarForecast.pm index 902f5f047..922c5218c 100644 --- a/fhem/contrib/DS_Starter/76_SolarForecast.pm +++ b/fhem/contrib/DS_Starter/76_SolarForecast.pm @@ -50,6 +50,7 @@ BEGIN { AnalyzePerlCommand AttrVal AttrNum + CommandSet data defs delFromDevAttrList @@ -115,6 +116,7 @@ BEGIN { # Versions History intern my %vNotesIntern = ( + "0.44.0" => "10.05.2021 consumptionForecast for attr beamXContent, consumer are switched on/off ", "0.43.0" => "08.05.2021 plan Consumers ", "0.42.0" => "01.05.2021 new attr consumerXX, currentMeterDev is mandatory, new getter valConsumerMaster ". "new commandref ancor syntax ", @@ -455,10 +457,10 @@ sub Initialize { $hash->{AttrList} = "autoRefresh:selectnumbers,120,0.2,1800,0,log10 ". "autoRefreshFW:$fwd ". "beam1Color:colorpicker,RGB ". - "beam1Content:forecast,real,gridconsumption ". + "beam1Content:forecast,real,gridconsumption,consumptionForecast ". "beam1FontColor:colorpicker,RGB ". "beam2Color:colorpicker,RGB ". - "beam2Content:forecast,real,gridconsumption ". + "beam2Content:forecast,real,gridconsumption,consumptionForecast ". "beam2FontColor:colorpicker,RGB ". "beamHeight ". "beamWidth ". @@ -1057,6 +1059,9 @@ sub _setreset { ## no critic "not used" delete $data{$type}{$name}{current}{tomorrowconsumption}; delete $data{$type}{$name}{current}{gridfeedin}; delete $data{$type}{$name}{current}{consumption}; + delete $data{$type}{$name}{current}{autarkyrate}; + delete $data{$type}{$name}{current}{selfconsumption}; + delete $data{$type}{$name}{current}{selfconsumptionrate}; } if($prop eq "currentBatteryDev") { @@ -1498,10 +1503,10 @@ sub centralTask { RemoveInternalTimer($hash, "FHEM::SolarForecast::centralTask"); ### 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} if(!$i); # evtl. vorhandene leere Schlüssel entfernen - } + # delete $data{$type}{$name}{pvhist}{$i} if(!$i); # evtl. vorhandene leere Schlüssel entfernen + #} #deleteReadingspec ($hash, "Today_Hour.*_Consumption"); #deleteReadingspec ($hash, "ThisHour_.*"); @@ -1867,7 +1872,7 @@ sub _transferDWDForecastValues { $time_str = "NextHour".sprintf "%02d", $num; $epoche = $t + (3600*$num); - my ($ta,$tsdef,$realts) = TimeAdjust ($epoche); + my ($ta,$tsdef,$realts) = timestampToTimestring ($epoche); $data{$type}{$name}{nexthours}{$time_str}{pvforecast} = $calcpv; $data{$type}{$name}{nexthours}{$time_str}{starttime} = $tsdef; @@ -2300,8 +2305,11 @@ sub _manageConsumerData { $data{$type}{$name}{consumers}{$c}{mintime} = (ceil($runhours/$dnum)) * 60; # Durchschnittslaufzeit in Minuten } - __calcEnergyPieces ($hash, $c); # Energieverbrauch auf einzelne Stunden für Planungsgrundlage aufteilen - __planSwitchTimes ($hash, $c); # Consumer Switch Zeiten planen + $paref->{consumer} = $c; + + __calcEnergyPieces ($paref); # Energieverbrauch auf einzelne Stunden für Planungsgrundlage aufteilen + __planSwitchTimes ($paref); # Consumer Switch Zeiten planen + __switchConsumer ($paref); # Consumer schalten ## consumer Hash ergänzen, Reading generieren ############################################### @@ -2316,15 +2324,17 @@ sub _manageConsumerData { my $startts = ConsumerVal ($hash, $c, "planswitchon", ""); my $stopts = ConsumerVal ($hash, $c, "planswitchoff", ""); - my (undef,$starttime) = TimeAdjust ($startts) if($startts); - my (undef,$stoptime) = TimeAdjust ($stopts) if($stopts); - + my (undef,undef,undef,$starttime) = timestampToTimestring ($startts) if($startts); + my (undef,undef,undef,$stoptime) = timestampToTimestring ($stopts) if($stopts); + $data{$type}{$name}{consumers}{$c}{state} = $costate; push @$daref, "consumer${c}<>" ."name='$alias' state='$costate' planningstate='$pstate' "; # Consumer Infos push @$daref, "consumer${c}_planned_start<>"."$starttime" if($startts); # Consumer Start geplant push @$daref, "consumer${c}_planned_stop<>". "$stoptime" if($stopts); # Consumer Stop geplant } + + delete $paref->{consumer}; return; } @@ -2334,11 +2344,12 @@ return; # aufteilen ################################################################### sub __calcEnergyPieces { - my $hash = shift; - my $c = shift; + my $paref = shift; + my $hash = $paref->{hash}; + my $name = $paref->{name}; + my $c = $paref->{consumer}; - my $name = $hash->{NAME}; - my $type = $hash->{TYPE}; + my $type = $hash->{TYPE}; delete $data{$type}{$name}{consumers}{$c}{epieces}; @@ -2382,13 +2393,14 @@ return; # Consumer Schaltzeiten planen ################################################################### sub __planSwitchTimes { - my $hash = shift; - my $c = shift; + my $paref = shift; + my $hash = $paref->{hash}; + my $name = $paref->{name}; + my $c = $paref->{consumer}; return if(ConsumerVal ($hash, $c, "planstate", undef)); # Verbraucher ist schon geplant/gestartet/fertig - my $name = $hash->{NAME}; - my $type = $hash->{TYPE}; + my $type = $hash->{TYPE}; my $nh = $data{$type}{$name}{nexthours}; my $maxkey = (scalar keys %{$data{$type}{$name}{nexthours}}) - 1; @@ -2433,6 +2445,7 @@ sub __planSwitchTimes { my $epiece1 = (~0 >> 1); my $epieces = ConsumerVal ($hash, $c, "epieces", ""); + if(ref $epieces eq "HASH") { $epiece1 = $data{$type}{$name}{consumers}{$c}{epieces}{1}; } @@ -2447,12 +2460,12 @@ sub __planSwitchTimes { my ($startts,$stopts,$stoptime); - if($mode eq "can") { # Verbraucher kann geplant werden + if($mode eq "can") { # Verbraucher kann geplant werden for my $ts (sort{$a<=>$b} keys %mtimes) { - if($mtimes{$ts}{surplus} >= $epiece1) { # die früheste Startzeit sofern Überschuß größer als Bedarf - $startts = timestringToTimestamp ($mtimes{$ts}{starttime}); # Unix Timestamp für geplanten Switch on - $stopts = $startts + $stopdiff; - (undef,$stoptime) = TimeAdjust ($stopts); + if($mtimes{$ts}{surplus} >= $epiece1) { # die früheste Startzeit sofern Überschuß größer als Bedarf + $startts = timestringToTimestamp ($mtimes{$ts}{starttime}); # Unix Timestamp für geplanten Switch on + $stopts = $startts + $stopdiff; + (undef,undef,undef,$stoptime) = timestampToTimestring ($stopts); $data{$type}{$name}{consumers}{$c}{planswitchon} = $startts; $data{$type}{$name}{consumers}{$c}{planswitchoff} = $stopts; @@ -2461,16 +2474,16 @@ sub __planSwitchTimes { } } } - else { # Verbraucher _muß_ geplant werden + else { # Verbraucher _muß_ geplant werden for my $o (sort{$a<=>$b} keys %max) { - next if(!$max{$o}{today}); # der max-Wert ist _nicht_ heute + next if(!$max{$o}{today}); # der max-Wert ist _nicht_ heute - my $maxts = timestringToTimestamp ($max{$o}{starttime}); # Unix Timestamp des max. Überschusses heute - my $half = ceil ($mintime / 2 / 60); # die halbe Gesamtlaufzeit in h als Vorlaufzeit einkalkulieren - $startts = $maxts - ($half * 3600); - my (undef,$starttime) = TimeAdjust ($startts); - $stopts = $startts + $stopdiff; - (undef,$stoptime) = TimeAdjust ($stopts); + my $maxts = timestringToTimestamp ($max{$o}{starttime}); # Unix Timestamp des max. Überschusses heute + my $half = ceil ($mintime / 2 / 60); # die halbe Gesamtlaufzeit in h als Vorlaufzeit einkalkulieren + $startts = $maxts - ($half * 3600); + my (undef,undef,undef,$starttime) = timestampToTimestring ($startts); + $stopts = $startts + $stopdiff; + (undef,undef,undef,$stoptime) = timestampToTimestring ($stopts); $data{$type}{$name}{consumers}{$c}{planstate} = "planned: ".$starttime." - ".$stoptime; $data{$type}{$name}{consumers}{$c}{planswitchon} = $startts; # Unix Timestamp für geplanten Switch on @@ -2480,7 +2493,66 @@ sub __planSwitchTimes { } my $planstate = ConsumerVal ($hash, $c, "planstate", ""); - Log3($name, 3, qq{$name - Consumer "$calias" planned: $planstate}) if($planstate); + Log3($name, 3, qq{$name - Consumer "$calias" $planstate}) if($planstate); + +return; +} + +################################################################ +# Planungsdaten Consumer prüfen und ggf. starten/stoppen +################################################################ +sub __switchConsumer { + my $paref = shift; + my $hash = $paref->{hash}; + my $name = $paref->{name}; + my $c = $paref->{consumer}; + my $t = $paref->{t}; # aktueller Unixtimestamp + my $state = $paref->{state}; + + my $type = $hash->{TYPE}; + + my $pstate = ConsumerVal ($hash, $c, "planstate", ""); + my $cname = ConsumerVal ($hash, $c, "name", ""); # Consumer Device Name + my $startts = ConsumerVal ($hash, $c, "planswitchon", ""); # geplante Unix Startzeit + my $stopts = ConsumerVal ($hash, $c, "planswitchoff", ""); # geplante Unix Stopzeit + my $calias = ConsumerVal ($hash, $c, "alias", ""); # Consumer Device Alias + + my $stoptime; + + ## Verbraucher einschalten + ############################ + my $oncom = ConsumerVal ($hash, $c, "oncom", ""); # Set Command für "on" + if($oncom && $pstate =~ /planned/xs && $t >= $startts) { # Verbraucher Start ist geplant && Startzeit überschritten + + my $surplus = CurrentVal ($hash, "surplus", 0); # aktueller Überschuß + my $mode = ConsumerVal ($hash, $c, "mode", $defcmode); # Consumer Planungsmode + my $power = ConsumerVal ($hash, $c, "power", 0); # Consumer nominale Leistungsaufnahme (W) + + if($mode eq "must" || $surplus >= $power) { # "Muss"-Planung oder Überschuß > Leistungsaufnahme + CommandSet(undef,"$cname $oncom"); + my (undef,undef,undef,$starttime) = timestampToTimestring ($t); + my $stopdiff = ceil(ConsumerVal ($hash, $c, "mintime", $defmintime) / 60) * 3600; + (undef,undef,undef,$stoptime) = timestampToTimestring ($t + $stopdiff); + $data{$type}{$name}{consumers}{$c}{planstate} = "switched on: ".$starttime." - ".$stoptime; + $data{$type}{$name}{consumers}{$c}{planswitchon} = $t; + $data{$type}{$name}{consumers}{$c}{planswitchoff} = $t + $stopdiff; + $state = qq{Consumer "$calias" switched on}; + Log3($name, 3, "$name - $state"); + } + } + + ## Verbraucher ausschalten + ############################ + my $offcom = ConsumerVal ($hash, $c, "offcom", ""); # Set Command für "off" + if($offcom && $pstate !~ /switched\soff/xs && $t >= $stopts) { # Verbraucher nicht switched off && Stopzeit überschritten + CommandSet(undef,"$cname $offcom"); + (undef,undef,undef,$stoptime) = timestampToTimestring ($t); + $data{$type}{$name}{consumers}{$c}{planstate} = "switched off: ".$stoptime; + $state = qq{Consumer "$calias" switched off}; + Log3($name, 3, "$name - $state"); + } + + $paref->{state} = $state; return; } @@ -2631,14 +2703,14 @@ sub _estConsumptionForecast { }; for my $k (sort keys %{$data{$type}{$name}{nexthours}}) { - my $nhts = NexthoursVal ($hash, $k, "starttime", undef); # Startzeit - next if(!$nhts); + my $nhtime = NexthoursVal ($hash, $k, "starttime", undef); # Startzeit + next if(!$nhtime); $dnum = 0; $consumerco = 0; $min = (~0 >> 1); $max = -(~0 >> 1); - my $utime = timestringToTimestamp ($nhts); + my $utime = timestringToTimestamp ($nhtime); my $nhday = strftime "%a", localtime($utime); # Wochentagsname des NextHours Key my $nhhr = sprintf("%02d", (int (strftime "%H", localtime($utime))) + 1); # Stunde des Tages vom NextHours Key (01,02,...24) @@ -2653,7 +2725,7 @@ sub _estConsumptionForecast { my $hcon = HistoryVal ($hash, $m, $nhhr, "con", 0); next if(!$hcon); - for my $c (sort{$a<=>$b} keys %{$acref}) { # Verbrauch aller registrierten Verbraucher aufaddieren + for my $c (sort{$a<=>$b} keys %{$acref}) { # historischer Verbrauch aller registrierten Verbraucher aufaddieren $consumerco += HistoryVal ($hash, $m, $nhhr, "csme${c}", 0); } @@ -2671,7 +2743,15 @@ sub _estConsumptionForecast { my $conavg = int(($conh->{$nhhr}/$dnum)-$hdiff); $data{$type}{$name}{nexthours}{$k}{confc} = $conavg; # Durchschnittsverbrauch aller gleicher Wochentage pro Stunde - Log3($name, 4, "$name - estimated Consumption for $nhday -> starttime: $nhts, con: $conavg, days for avg: $dnum, hist. consumption registered consumers: $consumerco"); + if(NexthoursVal ($hash, $k, "today", 0)) { # nur Werte des aktuellen Tag speichern + $paref->{confc} = $conavg; + $paref->{nhour} = sprintf("%02d",$nhhr); + $paref->{histname} = "confc"; + setPVhistory ($paref); + delete $paref->{histname}; + } + + Log3($name, 4, "$name - estimated Consumption for $nhday -> starttime: $nhtime, con: $conavg, days for avg: $dnum, hist. consumption registered consumers: $consumerco"); } } @@ -2853,6 +2933,7 @@ sub _calcSummaries { my $consumption = int ($pvgen - $gfeedin + $gcon - $batin + $batout); my $selfconsumption = int ($pvgen - $gfeedin); + my $surplus = int ($pvgen-$consumption); # aktueller Überschuß my $selfconsumptionrate = 0; my $autarkyrate = 0; $selfconsumptionrate = sprintf("%.0f", $selfconsumption / $pvgen * 100) if($pvgen); @@ -2862,6 +2943,7 @@ sub _calcSummaries { $data{$type}{$name}{current}{selfconsumption} = $selfconsumption; $data{$type}{$name}{current}{selfconsumptionrate} = $selfconsumptionrate; $data{$type}{$name}{current}{autarkyrate} = $autarkyrate; + $data{$type}{$name}{current}{surplus} = $surplus; push @$daref, "Current_Consumption<>". $consumption. " W"; push @$daref, "Current_SelfConsumption<>". $selfconsumption. " W"; @@ -3333,7 +3415,7 @@ sub forecastGraphic { ## Update-Icon ############## my $upicon; - if ($upstate =~ /updated|successfully/ix) { + if ($upstate =~ /updated|successfully|switched/ix) { $upicon = ""; } elsif ($upstate =~ /running/ix) { @@ -4011,34 +4093,6 @@ sub weather_icon { return 'unknown',''; } -################################################################ -# Timestamp berechnen -################################################################ -sub TimeAdjust { - my $epoch = shift; - - my ($lyear,$lmonth,$lday,$lhour) = (localtime($epoch))[5,4,3,2]; - my $ts; - - $lyear += 1900; # year is 1900 based - $lmonth++; # month number is zero based - - my ($sec,$min,$hour,$day,$mon,$year) = (localtime(time))[0,1,2,3,4,5]; # Standard f. z.B. Readingstimstamp - $year += 1900; - $mon++; - my $realts = sprintf("%04d-%02d-%02d %02d:%02d:%02d", $year,$mon,$day,$hour,$min,$sec); - my $tsdef = sprintf("%04d-%02d-%02d %02d:%s", $lyear,$lmonth,$lday,$lhour,"00:00"); # engl. Variante für Logging-Timestamps etc. - - if(AttrVal("global","language","EN") eq "DE") { - $ts = sprintf("%02d.%02d.%04d %02d:%s", $lday,$lmonth,$lyear,$lhour,"00:00"); - } - else { - $ts = $tsdef; - } - -return ($ts,$tsdef,$realts); -} - ################################################################ # benötigte Attribute im DWD Device checken ################################################################ @@ -4449,6 +4503,7 @@ sub setPVhistory { my $gcthishour = $paref->{gctotthishour} // 0; # Netzbezug my $fithishour = $paref->{gftotthishour} // 0; # Netzeinspeisung my $con = $paref->{con} // 0; # realer Hausverbrauch Energie + my $confc = $paref->{confc} // 0; # Verbrauchsvorhersage my $consumerco = $paref->{consumerco}; # Verbrauch eines Verbrauchers my $wid = $paref->{wid} // -1; my $wcc = $paref->{wcc} // 0; # Wolkenbedeckung @@ -4485,6 +4540,18 @@ sub setPVhistory { $data{$type}{$name}{pvhist}{$day}{99}{pvfc} = $pvfcsum; } + if($histname eq "confc") { # prognostizierter Hausverbrauch + $val = $confc; + $data{$type}{$name}{pvhist}{$day}{$nhour}{confc} = $confc; + + my $confcsum = 0; + for my $k (keys %{$data{$type}{$name}{pvhist}{$day}}) { + next if($k eq "99"); + $confcsum += HistoryVal ($hash, $day, $k, "confc", 0); + } + $data{$type}{$name}{pvhist}{$day}{99}{confc} = $confcsum; + } + if($histname eq "cons") { # bezogene Energie $val = $gcthishour; $data{$type}{$name}{pvhist}{$day}{$nhour}{gcons} = $gcthishour; @@ -4597,6 +4664,7 @@ sub listDataPool { my $pvfc = HistoryVal ($hash, $day, $key, "pvfc", "-"); my $gcon = HistoryVal ($hash, $day, $key, "gcons", "-"); my $con = HistoryVal ($hash, $day, $key, "con", "-"); + my $confc = HistoryVal ($hash, $day, $key, "confc", "-"); my $gfeedin = HistoryVal ($hash, $day, $key, "gfeedin", "-"); my $wid = HistoryVal ($hash, $day, $key, "weatherid", "-"); my $wcc = HistoryVal ($hash, $day, $key, "wcc", "-"); @@ -4606,7 +4674,7 @@ sub listDataPool { my $dayname = HistoryVal ($hash, $day, $key, "dayname", undef); $ret .= "\n " if($ret); - $ret .= $key." => pvrl: $pvrl, pvfc: $pvfc, gcon: $gcon, con: $con, gfeedin: $gfeedin"; + $ret .= $key." => pvfc: $pvfc, pvrl: $pvrl, confc: $confc, con: $con, gcon: $gcon, gfeedin: $gfeedin"; $ret .= "\n "; $ret .= "wid: $wid"; $ret .= ", wcc: $wcc"; @@ -4719,7 +4787,8 @@ sub listDataPool { } $sq .= "\n" if($sq); - $sq .= $idx." => pvfc: $pvfc, pvrl: $pvrl, gcon: $gcons, gfeedin: $gfeedin, wcc: $wccv, wrp: $wrprb, temp=$temp, wid: $wid, wtxt: $wtxt\n"; + $sq .= $idx." => pvfc: $pvfc, pvrl: $pvrl, gcon: $gcons, gfeedin: $gfeedin, wcc: $wccv, wrp: $wrprb\n"; + $sq .= " temp=$temp, wid: $wid, wtxt: $wtxt\n"; $sq .= " corr: $pvcf\n"; $sq .= " quality: $cfq"; } @@ -4847,6 +4916,35 @@ sub limitArray { return; } +################################################################ +# Timestrings berechnen +################################################################ +sub timestampToTimestring { + my $epoch = shift; + + my ($lyear,$lmonth,$lday,$lhour,$lmin,$lsec) = (localtime($epoch))[5,4,3,2,1,0]; + my $ts; + + $lyear += 1900; # year is 1900 based + $lmonth++; # month number is zero based + + my ($sec,$min,$hour,$day,$mon,$year) = (localtime(time))[0,1,2,3,4,5]; # Standard f. z.B. Readingstimstamp + $year += 1900; + $mon++; + my $realts = sprintf("%04d-%02d-%02d %02d:%02d:%02d", $year,$mon,$day,$hour,$min,$sec); + my $tsdef = sprintf("%04d-%02d-%02d %02d:%s", $lyear,$lmonth,$lday,$lhour,"00:00"); # engl. Variante für Logging-Timestamps etc. (Minute/Sekunde == 00) + my $tsfull = sprintf("%04d-%02d-%02d %02d:%02d:%02d", $lyear,$lmonth,$lday,$lhour,$lmin,$lsec); # engl. Variante Vollzeit + + if(AttrVal("global","language","EN") eq "DE") { + $ts = sprintf("%02d.%02d.%04d %02d:%s", $lday,$lmonth,$lyear,$lhour,"00:00"); + } + else { + $ts = $tsdef; + } + +return ($ts,$tsdef,$realts,$tsfull); +} + ################################################################ # einen Zeitstring YYYY-MM-TT hh:mm:ss in einen Unix # Timestamp umwandeln @@ -4973,6 +5071,9 @@ sub deleteConsumerPlanning { delete $data{$type}{$name}{consumers}{$c}{planstate}; delete $data{$type}{$name}{consumers}{$c}{planswitchon}; + delete $data{$type}{$name}{consumers}{$c}{planswitchoff}; + + deleteReadingspec ($hash, "consumer${c}.*" ); return; } @@ -4986,6 +5087,7 @@ return; # $hod: Stunde des Tages (01,02,...,24,99) # $key: pvrl - realer PV Ertrag # pvfc - PV Vorhersage +# confc - Vorhersage Hausverbrauch (Wh) # gcons - realer Netzbezug # gfeedin - reale Netzeinspeisung # weatherid - Wetter ID @@ -5661,7 +5763,7 @@ verfügbare Globalstrahlung ganz spezifisch in elektrische Energie umgewandelt. - + @@ -5688,15 +5790,16 @@ verfügbare Globalstrahlung ganz spezifisch in elektrische Energie umgewandelt.
pvfc erwartete PV Erzeugung
today =1 wenn Startdatum am aktuellen Tag
today =1 wenn Startdatum am aktuellen Tag
confc erwarteter Energieverbrauch
wid ID des vorhergesagten Wetters
wcc vorhergesagter Grad der Bewölkung
- - - - - - - + + + + + + + + - + @@ -5800,10 +5903,11 @@ verfügbare Globalstrahlung ganz spezifisch in elektrische Energie umgewandelt.
pvfc der prognostizierte PV Ertrag (Wh) der jeweiligen Stunde
pvrl reale PV Erzeugung (Wh) der jeweiligen Stunde
gcon realer Leistungsbezug (Wh) aus dem Stromnetz der jeweiligen Stunde
con realer Energieverbrauch (Wh) des Hauses der jeweiligen Stunde
gfeedin reale Einspeisung (Wh) in das Stromnetz der jeweiligen Stunde
wid Identifikationsnummer des Wetters in der jeweiligen Stunde
wcc effektive Wolkenbedeckung der jeweiligen Stunde
pvfc der prognostizierte PV Ertrag (Wh)
pvrl reale PV Erzeugung (Wh)
gcon realer Leistungsbezug (Wh) aus dem Stromnetz
confc erwarteter Energieverbrauch
con realer Energieverbrauch (Wh) des Hauses
gfeedin reale Einspeisung (Wh) in das Stromnetz
wid Identifikationsnummer des Wetters
wcc effektive Wolkenbedeckung
wrp Wahrscheinlichkeit von Niederschlag > 0,1 mm während der jeweiligen Stunde
pvcorrf abgeleiteter Autokorrekturfaktor der jeweiligen Stunde
pvcorrf abgeleiteter Autokorrekturfaktor
csmtXX gemessene Summe Energieverbrauch von ConsumerXX
csmeXX Energieverbrauch von ConsumerXX in der jeweiligen Stunde bzw. des Tages
hourscsmeXX gemessene Aktivstunden von ConsumerXX des Tages
- - - - + + + + +
forecast Vorhersage der PV-Erzeugung (default)
real tatsächliche PV-Erzeugung
gridconsumption Energie Bezug aus dem Netz
forecast prognostizierte PV-Erzeugung (default)
real reale PV-Erzeugung
gridconsumption Energie Bezug aus dem Netz
consumptionForecast prognostizierter Energieverbrauch
@@ -5821,12 +5925,13 @@ verfügbare Globalstrahlung ganz spezifisch in elektrische Energie umgewandelt. +