From 7e0d652f64ebb4fe3f80952749b72e04579f988d Mon Sep 17 00:00:00 2001 From: DS_Starter Date: Sun, 4 May 2025 12:11:03 +0000 Subject: [PATCH] 76_SolarForecast: Version 1.51.9 git-svn-id: https://svn.fhem.de/fhem/trunk@29926 2b470e98-0d58-463d-a4d8-8e2adae1ed80 --- fhem/contrib/DS_Starter/76_SolarForecast.pm | 118 ++++++++++---------- 1 file changed, 61 insertions(+), 57 deletions(-) diff --git a/fhem/contrib/DS_Starter/76_SolarForecast.pm b/fhem/contrib/DS_Starter/76_SolarForecast.pm index 889fba140..5c35aeb0b 100644 --- a/fhem/contrib/DS_Starter/76_SolarForecast.pm +++ b/fhem/contrib/DS_Starter/76_SolarForecast.pm @@ -11588,12 +11588,12 @@ sub _createSummaries { for my $in (1..MAXINVERTER) { # Summe alle Inverter $in = sprintf "%02d", $in; - my $pvi = InverterVal ($name, $in, 'igeneration', 0); - my $feed = InverterVal ($name, $in, 'ifeed', ''); - my $source = InverterVal ($name, $in, 'isource', 'pv'); + my $pvi = InverterVal ($name, $in, 'igeneration', 0); + my $feed = InverterVal ($name, $in, 'ifeed', 'default'); + my $source = InverterVal ($name, $in, 'isource', 'pv'); $pvgen += $pvi; $pv2grid += $pvi if($feed eq 'grid'); - $batout -= $pvi if($source eq 'bat'); # Doppelgenerierung vermeiden ! + $batout -= $pvi if($source eq 'bat'); # Doppelberücksichtigung Bat+Inv vermeiden ! } my $othprod = 0; # Summe Otherproducer @@ -17007,12 +17007,12 @@ sub _flowGraphic { my $exth2cdist = $paref->{flowgh2cDist}; # vertikaler Abstand Home -> Consumer Zeile my $lang = $paref->{lang}; - my $cgc = ReadingsNum ($name, 'Current_GridConsumption', 0); - my $node2grid = ReadingsNum ($name, 'Current_GridFeedIn', 0); # vom Knoten zum Grid - my $cself = ReadingsNum ($name, 'Current_SelfConsumption', 0); - my $cc = CurrentVal ($name, 'consumption', 0); + my $gcons = ReadingsNum ($name, 'Current_GridConsumption', 0); + my $node2grid = ReadingsNum ($name, 'Current_GridFeedIn', 0); # vom Inverter-Knoten zum Grid + my $cself = ReadingsNum ($name, 'Current_SelfConsumption', 0); + my $consptn = CurrentVal ($name, 'consumption', 0); - my $cc_dummy = $cc; + my $cons_dmy = $consptn; my $scale = FGSCALEDEF; my $pdist = 130; # Abstand Producer zueinander my $hasbat = 1; # initial Batterie vorhanden @@ -17067,13 +17067,13 @@ sub _flowGraphic { ## definierte Producer + Inverter ermitteln und zusammenfassen ################################################################ - my $pdcr = {}; # Hashref Producer - my $ppall = 0; # Summe Erzeugung alle nicht PV-Producer - my $pv2node = 0; # Summe PV-Erzeugung alle Inverter - my $pv2grid = 0; - my $pv2bat = 0; - my $bat2inv = 0; # Sonderfall Speisung Inverter aus Batterie statt PV - my $lfn = 0; + my $pdcr = {}; # Hashref Producer + my $ppall = 0; # Summe Erzeugung alle nicht PV-Producer + my $pv2node = 0; # Summe PV-Erzeugung alle Inverter + my $pv2grid = 0; + my $pv2bat = 0; + my $dc2inv2node = 0; # Speisung Inverter aus Gleichstromquelle (nicht PV) + my $lfn = 0; for my $pn (1..MAXPRODUCER) { $pn = sprintf "%02d", $pn; @@ -17100,15 +17100,15 @@ sub _flowGraphic { if (defined $p) { $p = __normDecPlaces ($p); - $pdcr->{$lfn}{pn} = $in; # Inverternummer - $pdcr->{$lfn}{feed} = $feed; # Eigenschaft der Energielieferung - $pdcr->{$lfn}{isource} = $isource; # Art der Energiequelle (pv oder bat) - $pdcr->{$lfn}{ptyp} = 'inverter'; # Typ des Producers - $pdcr->{$lfn}{p} = $p; # aktuelle PV - $pv2node += $p if($feed eq 'default'); # PV-Erzeugung Inverter für das Hausnetz - $pv2grid += $p if($feed eq 'grid'); # PV nur für das öffentliche Netz - $pv2bat += $p if($feed eq 'bat'); # Direktladen PV nur in die Batterie - $bat2inv += $p if($isource eq 'bat'); # Sonderfall Speisung Inverter aus Batterie statt PV + $pdcr->{$lfn}{pn} = $in; # Inverternummer + $pdcr->{$lfn}{feed} = $feed; # Eigenschaft der Energielieferung + $pdcr->{$lfn}{isource} = $isource; # Art der Energiequelle (pv oder bat) + $pdcr->{$lfn}{ptyp} = 'inverter'; # Typ des Producers + $pdcr->{$lfn}{p} = $p; # aktuelle PV + $pv2node += $p if($feed eq 'default' && $isource eq 'pv'); # PV-Erzeugung Inverter für das Hausnetz + $pv2grid += $p if($feed eq 'grid' && $isource eq 'pv'); # PV nur für das öffentliche Netz + $pv2bat += $p if($feed eq 'bat' && $isource eq 'pv'); # Direktladen PV nur in die Batterie + $dc2inv2node += $p if($feed eq 'default' && $isource eq 'bat'); # Fall Speisung Inverter aus Batterie statt PV $lfn++; } @@ -17116,30 +17116,34 @@ sub _flowGraphic { ## Batterie Werte verarbeiten ############################### - my $bat2home = $batout - $bat2inv; - $bat2home = $bat2home >= 0 ? $bat2home : 0; - my $grid2home_style = $cgc ? "$stna active_sig" : "$stna inactive"; # cgc = current GridConsumption - my $bat2home_style = $bat2home ? "$stna active_normal" : "$stna inactive"; - my $bat2inv_style = $bat2inv ? "$stna active_normal" : "$stna inactive"; # Batterie zu Inverter mit source=bat + my $node2bat = 0; # Verbindung Inv.Knoten <-> Batterie ((-) Bat -> Knoten, (+) Knoten -> Bat) + $node2bat = $pv2bat * -1 if($pv2bat); # vorbelegen falls Batterie Idle und Smartloader arbeitet + my $bat2home = 0; + #my $bat2home = $batout - $dc2inv2node; # V 1.51.9 + #$bat2home = $bat2home >= 0 ? $bat2home : 0; # V 1.51.9 + my $grid2home_style = $gcons ? "$stna active_sig" : "$stna inactive"; # GridConsumption + my $bat2home_style = $bat2home ? "$stna active_normal" : "$stna inactive"; + my $dc2inv2node_style = $dc2inv2node ? "$stna active_normal" : "$stna inactive"; # Batterie zu Inverter mit source=bat - my $cgc_direction = "M250,515 L670,590"; + my $gcons_direction = "M250,515 L670,590"; + my $bat2home_direction = "M1200,515 L730,590"; - if ($bat2home) { # Batterie wird entladen - my $cgfo = $node2grid - $pv2node; # pv2node = PV-Erzeugung Inverter für das Hausnetz + if ($batout) { # Batterie wird entladen + $node2bat = $batout + $pv2bat - $dc2inv2node; # negativ - Richtung Bat -> Inv.Knoten + $node2bat *= -1; + my $cgfo = $node2grid - ($pv2node + $dc2inv2node); # pv2node + $dc2inv2node = PV-Erzeugung Inverter für das Hausnetz if ($cgfo > 1) { $grid2home_style = "$stna active_normal"; - $cgc_direction = "M670,590 L250,515"; - $node2grid -= $cgfo; - $cgc = $cgfo; + $gcons_direction = "M670,590 L250,515"; + # $node2grid -= $cgfo; # V 1.51.9 + $gcons = $cgfo; } } - my $bat2home_direction = "M1200,515 L730,590"; - my $node2bat = $batin; - if ($batin) { # Batterie wird geladen - my $home2bat = $batin - ($ppall + $pv2node + $pv2bat); # V 1.46.4: add $ppall + $node2bat = $batin - ($pv2bat - $dc2inv2node); # positiv - Richtung Knoten -> Bat + my $home2bat = $batin - ($ppall + $pv2node + $pv2bat + $dc2inv2node); # V 1.46.4: add $ppall, V 1.51.9 add $dc2inv2node if ($home2bat > 1) { # Batterieladung anteilig aus Hausnetz $node2bat -= $home2bat; @@ -17148,7 +17152,7 @@ sub _flowGraphic { $bat2home = $home2bat; } } - + ## Producer / Inverter Koordninaten Steuerhash ################################################ my ($togrid, $tonode, $tobat, $toinv) = __sortProducer ($pdcr); # lfn Producer sortiert nach ptyp und feed @@ -17178,8 +17182,7 @@ sub _flowGraphic { ## Knotensummen Erzeuger - Batterie - Home ermitteln ###################################################### - my $pnodesum = __normDecPlaces ($ppall + $pv2node); # Erzeugung Summe im Knoten - $node2bat -= $pv2bat; # Knoten-Bat -> abzüglich Direktladung (pv2bat) + my $pnodesum = __normDecPlaces ($ppall + $pv2node + $dc2inv2node); # Erzeugung Summe im Inverter-Knoten $pnodesum += $node2bat < 0 ? abs $node2bat : 0; # V 1.46.4 - Batterie ist voll und SolarLader liefert an Knoten my $node2home = $pnodesum - $node2grid - ($node2bat > 0 ? $node2bat : 0); # V 1.46.4 - Energiefluß vom Knoten zum Haus $node2home = __normDecPlaces ($node2home); # V 1.46.4 @@ -17205,8 +17208,8 @@ sub _flowGraphic { my $svgstyle = 'width:98%; height:'.$flowgsize.'px;'; my $animation = $flowgani ? '@keyframes dash { to { stroke-dashoffset: 0; } }' : ''; # Animation Ja/Nein - my $grid_color = $node2grid ? "$stna grid_green" : - !$node2grid && !$cgc && $bat2home ? "$stna grid_gray" : + my $grid_color = $node2grid ? "$stna grid_green" : + !$node2grid && !$gcons && $bat2home ? "$stna grid_gray" : "$stna grid_red"; my $strokecolstd = CurrentVal ($name, 'strokecolstd', STROKCOLSTDDEF); @@ -17297,7 +17300,7 @@ END0 } ); - $cc_dummy -= $currentPower; + $cons_dmy -= $currentPower; $cicon = FW_makeImage ($cicon, ''); ($scale, $cicon) = __normIconScale ($name, $cicon); @@ -17356,7 +17359,7 @@ END1 name => $name, pn => '', ptyp => 'consumerdummy', - pcurr => $cc_dummy, + pcurr => $cons_dmy, lang => $lang } ); @@ -17379,7 +17382,7 @@ END1 - + END2 ## Laufketten PV->Batterie, Batterie->Home @@ -17399,11 +17402,11 @@ END3 ############################## if ($flowgconX) { my $consumer_style = "$stna inactive"; - $consumer_style = "$stna active_normal" if($cc_dummy > 1); # current consumption Dummy + $consumer_style = "$stna active_normal" if($cons_dmy > 1); # current consumption Dummy my $chain_color = ""; # Farbe der Laufkette Consumer-Dummy - if ($cc_dummy > 0.5 && CurrentVal ($name, 'strokeconsumerdyncol', 0)) { - $chain_color = 'style="stroke: #'.__dynColor ($cc_dummy, $strokeredlim).';"'; + if ($cons_dmy > 0.5 && CurrentVal ($name, 'strokeconsumerdyncol', 0)) { + $chain_color = 'style="stroke: #'.__dynColor ($cons_dmy, $strokeredlim).';"'; } $ret .= qq{}; # M790,690 → Move To (Startpunkt bei x=790, y=690), L1200,690 → Line To (Zeichnet eine Linie von 790,690 nach 1200,690) @@ -17490,19 +17493,20 @@ END3 ## Textangaben an Grafikelementen ################################### - $cc_dummy = sprintf "%.0f", $cc_dummy; # Verbrauch Dummy-Consumer - $bat2home = __normDecPlaces ($bat2home); - $node2bat = __normDecPlaces ($node2bat); + $cons_dmy = sprintf "%.0f", $cons_dmy; # Verbrauch Dummy-Consumer + $bat2home = __normDecPlaces ($bat2home); + $dc2inv2node = __normDecPlaces ($dc2inv2node); + $node2bat = __normDecPlaces ($node2bat); $ret .= qq{$pnodesum} if ($pnodesum > 0); $ret .= qq{$soc %} if ($hasbat); # Lage Text Batterieladungszustand $ret .= qq{$node2home} if ($node2home); $ret .= qq{$node2grid} if ($node2grid); - $ret .= qq{$cgc} if ($cgc); + $ret .= qq{$gcons} if ($gcons); $ret .= qq{$bat2home} if ($bat2home && $hasbat); $ret .= qq{$node2bat} if ($node2bat && $hasbat); - $ret .= qq{$cc}; # Current_Consumption Anlage - $ret .= qq{$cc_dummy} if ($flowgconX && $flowgconsPower); # Current_Consumption Dummy + $ret .= qq{$consptn}; # Current_Consumption Anlage + $ret .= qq{$cons_dmy} if ($flowgconX && $flowgconsPower); # Current_Consumption Dummy ## Textangabe Producer - in Reihenfolge: zum Grid - zum Knoten - zur Batterie ## Textangabe nur anzeigen wenn Producerzeile angezeigt werden soll