mirror of
https://github.com/fhem/fhem-mirror.git
synced 2025-04-07 19:04:20 +00:00
76_SolarForecast: contrib 1.37.0
git-svn-id: https://svn.fhem.de/fhem/trunk@29248 2b470e98-0d58-463d-a4d8-8e2adae1ed80
This commit is contained in:
parent
eb02c79445
commit
22615503c9
@ -156,7 +156,8 @@ BEGIN {
|
|||||||
|
|
||||||
# Versions History intern
|
# Versions History intern
|
||||||
my %vNotesIntern = (
|
my %vNotesIntern = (
|
||||||
"1.37.0" => "15.10.2024 attr setupInverterDevXX up to 03 inverters with accorded strings, setupInverterDevXX: keys strings and feed ",
|
"1.37.0" => "16.10.2024 attr setupInverterDevXX up to 03 inverters with accorded strings, setupInverterDevXX: keys strings and feed ".
|
||||||
|
"_flowGraphic: controlhash for producer ",
|
||||||
"1.36.1" => "14.10.2024 _flowGraphic: consumer distance modified by kask, Coloring of icons corrected when creating 0 ",
|
"1.36.1" => "14.10.2024 _flowGraphic: consumer distance modified by kask, Coloring of icons corrected when creating 0 ",
|
||||||
"1.36.0" => "13.10.2024 new Getter valInverter, valStrings and valProducer, preparation for multiple inverters ".
|
"1.36.0" => "13.10.2024 new Getter valInverter, valStrings and valProducer, preparation for multiple inverters ".
|
||||||
"rename setupInverterDev to setupInverterDev01, new attr affectConsForecastLastDays ".
|
"rename setupInverterDev to setupInverterDev01, new attr affectConsForecastLastDays ".
|
||||||
@ -6933,7 +6934,6 @@ sub centralTask {
|
|||||||
_transferInverterValues ($centpars); # WR Werte übertragen
|
_transferInverterValues ($centpars); # WR Werte übertragen
|
||||||
_transferAPIRadiationValues ($centpars); # Raw Erzeugungswerte aus solcastapi-Hash übertragen und Forecast mit/ohne Korrektur erstellen
|
_transferAPIRadiationValues ($centpars); # Raw Erzeugungswerte aus solcastapi-Hash übertragen und Forecast mit/ohne Korrektur erstellen
|
||||||
_calcMaxEstimateToday ($centpars); # heutigen Max PV Estimate & dessen Tageszeit ermitteln
|
_calcMaxEstimateToday ($centpars); # heutigen Max PV Estimate & dessen Tageszeit ermitteln
|
||||||
#_transferInverterValues ($centpars); # WR Werte übertragen
|
|
||||||
_transferProducerValues ($centpars); # Werte anderer Erzeuger übertragen
|
_transferProducerValues ($centpars); # Werte anderer Erzeuger übertragen
|
||||||
_transferMeterValues ($centpars); # Energy Meter auswerten
|
_transferMeterValues ($centpars); # Energy Meter auswerten
|
||||||
_transferBatteryValues ($centpars); # Batteriewerte einsammeln
|
_transferBatteryValues ($centpars); # Batteriewerte einsammeln
|
||||||
@ -14130,19 +14130,19 @@ sub _flowGraphic {
|
|||||||
my $type = $paref->{type};
|
my $type = $paref->{type};
|
||||||
my $flowgsize = $paref->{flowgsize};
|
my $flowgsize = $paref->{flowgsize};
|
||||||
my $flowgani = $paref->{flowgani};
|
my $flowgani = $paref->{flowgani};
|
||||||
my $flowgshift = $paref->{flowgshift}; # Verschiebung der Flußgrafikbox (muß negiert werden)
|
my $flowgshift = $paref->{flowgshift}; # Verschiebung der Flußgrafikbox (muß negiert werden)
|
||||||
my $flowgcons = $paref->{flowgcons}; # Verbraucher in der Energieflußgrafik anzeigen
|
my $flowgcons = $paref->{flowgcons}; # Verbraucher in der Energieflußgrafik anzeigen
|
||||||
my $flowgconTime = $paref->{flowgconsTime}; # Verbraucher Restlaufeit in der Energieflußgrafik anzeigen
|
my $flowgconTime = $paref->{flowgconsTime}; # Verbraucher Restlaufeit in der Energieflußgrafik anzeigen
|
||||||
my $flowgconX = $paref->{flowgconX};
|
my $flowgconX = $paref->{flowgconX};
|
||||||
my $flowgconPower = $paref->{flowgconsPower};
|
my $flowgconPower = $paref->{flowgconsPower};
|
||||||
my $consDist = $paref->{flowgconsDist};
|
my $cdist = $paref->{flowgconsDist}; # Abstand Consumer zueinander
|
||||||
my $css = $paref->{css};
|
my $css = $paref->{css};
|
||||||
my $lang = $paref->{lang};
|
my $lang = $paref->{lang};
|
||||||
|
|
||||||
my $style = 'width:98%; height:'.$flowgsize.'px;';
|
my $style = 'width:98%; height:'.$flowgsize.'px;';
|
||||||
my $animation = $flowgani ? '@keyframes dash { to { stroke-dashoffset: 0; } }' : ''; # Animation Ja/Nein
|
my $animation = $flowgani ? '@keyframes dash { to { stroke-dashoffset: 0; } }' : ''; # Animation Ja/Nein
|
||||||
my $cgc = ReadingsNum ($name, 'Current_GridConsumption', 0);
|
my $cgc = ReadingsNum ($name, 'Current_GridConsumption', 0);
|
||||||
my $cgfi = ReadingsNum ($name, 'Current_GridFeedIn', 0); # Summe zum Grid
|
my $node2grid = ReadingsNum ($name, 'Current_GridFeedIn', 0); # vom Knoten zum Grid
|
||||||
my $cself = ReadingsNum ($name, 'Current_SelfConsumption', 0);
|
my $cself = ReadingsNum ($name, 'Current_SelfConsumption', 0);
|
||||||
my $cc = CurrentVal ($hash, 'consumption', 0);
|
my $cc = CurrentVal ($hash, 'consumption', 0);
|
||||||
my $batin = ReadingsNum ($name, 'Current_PowerBatIn', undef);
|
my $batin = ReadingsNum ($name, 'Current_PowerBatIn', undef);
|
||||||
@ -14151,7 +14151,9 @@ sub _flowGraphic {
|
|||||||
my $cc_dummy = $cc;
|
my $cc_dummy = $cc;
|
||||||
|
|
||||||
my $scale = $fgscaledef;
|
my $scale = $fgscaledef;
|
||||||
my $hasbat = 1; # initial Batterie vorhanden
|
my $pdist = 130; # Abstand Producer zueinander
|
||||||
|
my $hasbat = 1; # initial Batterie vorhanden
|
||||||
|
my $lcp;
|
||||||
|
|
||||||
## definierte Producer + Inverter ermitteln und zusammenfassen
|
## definierte Producer + Inverter ermitteln und zusammenfassen
|
||||||
################################################################
|
################################################################
|
||||||
@ -14196,10 +14198,16 @@ sub _flowGraphic {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
my $node2grid = $cgfi; # vom Knoten zum Grid
|
my $pnodesum = __normDecPlaces ($ppall + $pv2node); # Erzeugung Summe im Knoten
|
||||||
my $pnodesum = __normDecPlaces ($ppall + $pv2node); # Erzeugung Summe im Knoten
|
my ($togrid, $tonode, $tobat) = __sortProducer ($pdcr); # lfn Producer sortiert nach ptyp und feed
|
||||||
my $producercount = keys %{$pdcr};
|
|
||||||
my @prodsorted = __sortProducer ($pdcr); # lfn Producer sortiert nach ptyp und feed
|
## Producer Koordninaten Steuerhash
|
||||||
|
#####################################
|
||||||
|
my $psorted = {
|
||||||
|
'1togrid' => { xicon => -100, xchain => 350, ychain => 420, step => 70, count => scalar @{$togrid}, sorted => $togrid }, # Producer/PV nur zu Grid
|
||||||
|
'2tonode' => { xicon => 350, xchain => 700, ychain => 200, step => $pdist, count => scalar @{$tonode}, sorted => $tonode }, # Producer/PV zum Knoten
|
||||||
|
'3tobat' => { xicon => 750, xchain => 1100, ychain => 390, step => 10, count => scalar @{$tobat}, sorted => $tobat }, # Producer/PV nur zu Batterie
|
||||||
|
};
|
||||||
|
|
||||||
## definierte Verbraucher ermitteln
|
## definierte Verbraucher ermitteln
|
||||||
#####################################
|
#####################################
|
||||||
@ -14289,41 +14297,45 @@ sub _flowGraphic {
|
|||||||
</g>
|
</g>
|
||||||
END0
|
END0
|
||||||
|
|
||||||
## Producer Liste und Icons in Grafik anzeigen
|
## Producer Icon - in Reihenfolge: zum Grid - zum Knoten - zur Batterie
|
||||||
################################################
|
#########################################################################
|
||||||
my $pos_left = 0;
|
for my $st (sort keys %{$psorted}) {
|
||||||
my $producer_start = 0;
|
my $left = 0;
|
||||||
my $producerPower = 0;
|
my $xicon = $psorted->{$st}{xicon};
|
||||||
|
my $count = $psorted->{$st}{count};
|
||||||
|
my @sorted = @{$psorted->{$st}{sorted}};
|
||||||
|
|
||||||
if ($producercount % 2) {
|
if ($count % 2) {
|
||||||
$producer_start = 350 - ($consDist * (($producercount -1) / 2));
|
$xicon = $xicon - ($pdist * ($count - 1) / 2);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
$producer_start = 350 - (($consDist / 2) * ($producercount-1));
|
$xicon = $xicon - ($pdist / 2 * ($count - 1));
|
||||||
}
|
}
|
||||||
|
|
||||||
$pos_left = $producer_start + 5;
|
$psorted->{$st}{start} = $xicon;
|
||||||
|
$left = $xicon + 5;
|
||||||
|
|
||||||
for my $lfn (@prodsorted) {
|
for my $lfn (@sorted) {
|
||||||
my $pn = $pdcr->{$lfn}{pn};
|
my $pn = $pdcr->{$lfn}{pn};
|
||||||
my ($picon, $ptxt) = __substituteIcon ( { hash => $hash, # Icon des Producerdevices
|
my ($picon, $ptxt) = __substituteIcon ( { hash => $hash, # Icon des Producerdevices
|
||||||
name => $name,
|
name => $name,
|
||||||
pn => $pn,
|
pn => $pn,
|
||||||
ptyp => $pdcr->{$lfn}{ptyp},
|
ptyp => $pdcr->{$lfn}{ptyp},
|
||||||
don => NexthoursVal ($hash, 'NextHour00', 'DoN', 0), # Tag oder Nacht
|
don => NexthoursVal ($hash, 'NextHour00', 'DoN', 0), # Tag oder Nacht
|
||||||
pcurr => $pdcr->{$lfn}{p},
|
pcurr => $pdcr->{$lfn}{p},
|
||||||
lang => $lang
|
lang => $lang
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
|
|
||||||
$picon = FW_makeImage ($picon, '');
|
$picon = FW_makeImage ($picon, '');
|
||||||
($scale, $picon) = __normIconScale ($picon, $name);
|
($scale, $picon) = __normIconScale ($picon, $name);
|
||||||
|
|
||||||
$ret .= qq{<g id="producer_$pn" fill="grey" transform="translate($pos_left,0),scale($scale)">};
|
$ret .= qq{<g id="producer_$pn" fill="grey" transform="translate($left,0),scale($scale)">};
|
||||||
$ret .= "<title>$ptxt</title>".$picon;
|
$ret .= "<title>$ptxt</title>".$picon;
|
||||||
$ret .= '</g> ';
|
$ret .= '</g> ';
|
||||||
|
|
||||||
$pos_left += $consDist;
|
$left += $pdist;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
## Knoten Icon
|
## Knoten Icon
|
||||||
@ -14345,19 +14357,19 @@ END0
|
|||||||
|
|
||||||
## Consumer Liste und Icons in Grafik anzeigen
|
## Consumer Liste und Icons in Grafik anzeigen
|
||||||
################################################
|
################################################
|
||||||
$pos_left = 0;
|
my $cons_left = 0;
|
||||||
my $consumer_start = 0;
|
my $consumer_start = 0;
|
||||||
my $currentPower = 0;
|
my $currentPower = 0;
|
||||||
|
|
||||||
if ($flowgcons) {
|
if ($flowgcons) {
|
||||||
if ($consumercount % 2) {
|
if ($consumercount % 2) {
|
||||||
$consumer_start = 350 - ($consDist * (($consumercount -1) / 2));
|
$consumer_start = 350 - ($cdist * ($consumercount -1) / 2);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
$consumer_start = 350 - (($consDist / 2) * ($consumercount-1));
|
$consumer_start = 350 - ($cdist / 2 * ($consumercount-1));
|
||||||
}
|
}
|
||||||
|
|
||||||
$pos_left = $consumer_start + 15;
|
$cons_left = $consumer_start + 15;
|
||||||
|
|
||||||
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
|
||||||
@ -14376,11 +14388,11 @@ END0
|
|||||||
$cicon = FW_makeImage ($cicon, '');
|
$cicon = FW_makeImage ($cicon, '');
|
||||||
($scale, $cicon) = __normIconScale ($cicon, $name);
|
($scale, $cicon) = __normIconScale ($cicon, $name);
|
||||||
|
|
||||||
$ret .= qq{<g id="consumer_$c" transform="translate($pos_left,505),scale($scale)">};
|
$ret .= qq{<g id="consumer_$c" transform="translate($cons_left,505),scale($scale)">};
|
||||||
$ret .= "<title>$calias</title>".$cicon;
|
$ret .= "<title>$calias</title>".$cicon;
|
||||||
$ret .= '</g> ';
|
$ret .= '</g> ';
|
||||||
|
|
||||||
$pos_left += $consDist;
|
$cons_left += $cdist;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -14428,8 +14440,8 @@ END1
|
|||||||
my $cgfi_style = $node2grid ? 'flowg active_out' : 'flowg inactive_out';
|
my $cgfi_style = $node2grid ? 'flowg active_out' : 'flowg inactive_out';
|
||||||
$ret .= << "END2";
|
$ret .= << "END2";
|
||||||
<g transform="translate(50,50),scale(0.5)" stroke-width="27" fill="none">
|
<g transform="translate(50,50),scale(0.5)" stroke-width="27" fill="none">
|
||||||
<path id="pv-home" class="$csc_style" d="M700,400 L700,580" />
|
<path id="pv-home" class="$csc_style" d="M700,400 L700,580" />
|
||||||
<path id="pv-grid" class="$cgfi_style" d="M670,400 L490,480" />
|
<path id="pv-grid" class="$cgfi_style" d="M670,400 L490,480" />
|
||||||
<path id="bat-home" class="$cgc_style" d="$cgc_direction" />
|
<path id="bat-home" class="$cgc_style" d="$cgc_direction" />
|
||||||
END2
|
END2
|
||||||
|
|
||||||
@ -14448,68 +14460,63 @@ END3
|
|||||||
if ($flowgconX) {
|
if ($flowgconX) {
|
||||||
my $consumer_style = 'flowg inactive_out';
|
my $consumer_style = 'flowg inactive_out';
|
||||||
$consumer_style = 'flowg active_in' if($cc_dummy > 1);
|
$consumer_style = 'flowg active_in' if($cc_dummy > 1);
|
||||||
my $chain_color = ""; # Farbe der Laufkette Consumer-Dummy
|
my $chain_color = ""; # Farbe der Laufkette Consumer-Dummy
|
||||||
|
|
||||||
if ($cc_dummy > 0.5) {
|
if ($cc_dummy > 0.5) {
|
||||||
$chain_color = 'style="stroke: #'.substr(Color::pahColor(0,500,1000,$cc_dummy,[0,255,0, 127,255,0, 255,255,0, 255,127,0, 255,0,0]),0,6).';"';
|
$chain_color = 'style="stroke: #'.substr(Color::pahColor(0,500,1000,$cc_dummy,[0,255,0, 127,255,0, 255,255,0, 255,127,0, 255,0,0]),0,6).';"';
|
||||||
#$chain_color = 'style="stroke: #DF0101;"';
|
#$chain_color = 'style="stroke: #DF0101;"';
|
||||||
}
|
}
|
||||||
|
|
||||||
$ret .= qq{<path id="home-consumer_X" class="$consumer_style" $chain_color d="M790,690 L930,690" />};
|
$ret .= qq{<path id="home-dummy" class="$consumer_style" $chain_color d="M790,690 L930,690" />};
|
||||||
}
|
}
|
||||||
|
|
||||||
## Producer Laufketten
|
## Producer Laufketten - in Reihenfolge: zum Grid - zum Knoten - zur Batterie
|
||||||
########################
|
###############################################################################
|
||||||
$pos_left = $producer_start * 2;
|
for my $st (sort keys %{$psorted}) {
|
||||||
my $pos_left_start_nod = 0;
|
my $left = $psorted->{$st}{start} * 2; # Übertrag aus Producer Icon Abschnitt
|
||||||
my $pos_left_start_grd = 390;
|
my $count = $psorted->{$st}{count};
|
||||||
my $distance_prd = 65;
|
my $xchain = $psorted->{$st}{xchain}; # X- Koordinate Kette am Ziel
|
||||||
|
my $ychain = $psorted->{$st}{ychain}; # Y- Koordinate Kette am Ziel
|
||||||
|
my $step = $psorted->{$st}{step};
|
||||||
|
my @sorted = @{$psorted->{$st}{sorted}};
|
||||||
|
|
||||||
if ($producercount % 2) {
|
if ($count % 2) {
|
||||||
$pos_left_start_nod = 700 - ($distance_prd * (($producercount -1) / 2));
|
$xchain = $xchain - ($pdist * ($count -1) / 2);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
$pos_left_start_nod = 700 - ((($distance_prd ) / 2) * ($producercount-1));
|
$xchain = $xchain - ($pdist / 2 * ($count - 1));
|
||||||
}
|
|
||||||
|
|
||||||
for my $lfn (@prodsorted) {
|
|
||||||
my $pn = $pdcr->{$lfn}{pn};
|
|
||||||
my $p = $pdcr->{$lfn}{p};
|
|
||||||
my $feed = $pdcr->{$lfn}{feed}; # default | grid | bat
|
|
||||||
|
|
||||||
my $consumer_style = 'flowg inactive_out';
|
|
||||||
$consumer_style = 'flowg active_out' if($p > 0);
|
|
||||||
my $chain_color = ''; # Farbe der Laufkette des Producers
|
|
||||||
|
|
||||||
if ($p) {
|
|
||||||
#$chain_color = 'style="stroke: #'.substr(Color::pahColor(0,50,100,$p,[0,255,0, 127,255,0, 255,255,0, 255,127,0, 255,0,0]),0,6).';"';
|
|
||||||
$chain_color = 'style="stroke: darkorange;"';
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if ($feed eq 'default') {
|
for my $lfn (@sorted) {
|
||||||
$ret .= qq{<path id="genproducer_$lfn " class="$consumer_style" $chain_color d=" M$pos_left,130 L$pos_left_start_nod,200" />};
|
my $pn = $pdcr->{$lfn}{pn};
|
||||||
}
|
my $p = $pdcr->{$lfn}{p};
|
||||||
elsif ($feed eq 'grid') {
|
my $consumer_style = 'flowg inactive_out';
|
||||||
$ret .= qq{<path id="genproducer_$lfn " class="$consumer_style" $chain_color d=" M$pos_left,130 $pos_left_start_grd,390" />};
|
$consumer_style = 'flowg active_out' if($p > 0);
|
||||||
}
|
my $chain_color = ''; # Farbe der Laufkette des Producers
|
||||||
|
|
||||||
$pos_left += ($consDist * 2);
|
if ($p) {
|
||||||
$pos_left_start_nod += $distance_prd;
|
#$chain_color = 'style="stroke: #'.substr(Color::pahColor(0,50,100,$p,[0,255,0, 127,255,0, 255,255,0, 255,127,0, 255,0,0]),0,6).';"';
|
||||||
$pos_left_start_grd += 10;
|
$chain_color = 'style="stroke: darkorange;"';
|
||||||
|
}
|
||||||
|
|
||||||
|
$ret .= qq{<path id="genproducer_$pn " class="$consumer_style" $chain_color d=" M$left,130 L$xchain,$ychain" />};
|
||||||
|
$left += ($pdist * 2);
|
||||||
|
$xchain += $step;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
## Consumer Laufketten
|
## Consumer Laufketten
|
||||||
########################
|
########################
|
||||||
if ($flowgcons) {
|
if ($flowgcons) {
|
||||||
$pos_left = $consumer_start * 2;
|
$cons_left = $consumer_start * 2;
|
||||||
my $pos_left_start = 0;
|
my $cons_left_start = 0;
|
||||||
my $distance_con = 65;
|
my $distance_con = 65;
|
||||||
|
|
||||||
if ($consumercount % 2) {
|
if ($consumercount % 2) {
|
||||||
$pos_left_start = 700 - ($distance_con * (($consumercount -1) / 2));
|
$cons_left_start = 700 - ($distance_con * ($consumercount -1) / 2);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
$pos_left_start = 700 - ((($distance_con ) / 2) * ($consumercount-1));
|
$cons_left_start = 700 - ($distance_con / 2 * ($consumercount-1));
|
||||||
}
|
}
|
||||||
|
|
||||||
for my $c (@consumers) {
|
for my $c (@consumers) {
|
||||||
@ -14532,9 +14539,9 @@ END3
|
|||||||
#$chain_color = 'style="stroke: #DF0101;"';
|
#$chain_color = 'style="stroke: #DF0101;"';
|
||||||
}
|
}
|
||||||
|
|
||||||
$ret .= qq{<path id="home-consumer_$c" class="$consumer_style" $chain_color d="M$pos_left_start,780 L$pos_left,880" />};
|
$ret .= qq{<path id="home-consumer_$c" class="$consumer_style" $chain_color d="M$cons_left_start,780 L$cons_left,880" />};
|
||||||
$pos_left += ($consDist * 2);
|
$cons_left += ($cdist * 2);
|
||||||
$pos_left_start += $distance_con;
|
$cons_left_start += $distance_con;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -14551,42 +14558,43 @@ END3
|
|||||||
$ret .= qq{<text class="flowg text" id="home-txt" x="600" y="710" style="text-anchor: end;">$cc</text>}; # Current_Consumption Anlage
|
$ret .= qq{<text class="flowg text" id="home-txt" x="600" y="710" style="text-anchor: end;">$cc</text>}; # Current_Consumption Anlage
|
||||||
$ret .= qq{<text class="flowg text" id="dummy-txt" x="1085" y="710" style="text-anchor: start;">$cc_dummy</text>} if ($flowgconX && $flowgconPower); # Current_Consumption Dummy
|
$ret .= qq{<text class="flowg text" id="dummy-txt" x="1085" y="710" style="text-anchor: start;">$cc_dummy</text>} if ($flowgconX && $flowgconPower); # Current_Consumption Dummy
|
||||||
|
|
||||||
my $lcp;
|
## Textangabe Producer - in Reihenfolge: zum Grid - zum Knoten - zur Batterie
|
||||||
|
###############################################################################
|
||||||
|
for my $st (sort keys %{$psorted}) {
|
||||||
|
my $left = $psorted->{$st}{start} * 2 - 70; # Übertrag aus Producer Icon Abschnitt, -XX -> Start Lage Producer Beschriftung
|
||||||
|
my @sorted = @{$psorted->{$st}{sorted}};
|
||||||
|
|
||||||
## Textangabe Producer
|
for my $lfn (@sorted) {
|
||||||
########################
|
my $pn = $pdcr->{$lfn}{pn};
|
||||||
$pos_left = $producer_start * 2 - 70; # -XX -> Start Lage Producer Beschriftung
|
$currentPower = $pdcr->{$lfn}{p};
|
||||||
|
$lcp = length $currentPower;
|
||||||
|
|
||||||
for my $lfn (@prodsorted) {
|
# Leistungszahl abhängig von der Größe entsprechend auf der x-Achse verschieben
|
||||||
my $pn = $pdcr->{$lfn}{pn};
|
###############################################################################
|
||||||
$currentPower = $pdcr->{$lfn}{p};
|
if ($lcp >= 5) {$left -= 10}
|
||||||
$lcp = length $currentPower;
|
elsif ($lcp == 4) {$left += 10}
|
||||||
|
elsif ($lcp == 3) {$left += 15}
|
||||||
|
elsif ($lcp == 2) {$left += 20}
|
||||||
|
elsif ($lcp == 1) {$left += 40}
|
||||||
|
|
||||||
# Leistungszahl abhängig von der Größe entsprechend auf der x-Achse verschieben
|
$ret .= qq{<text class="flowg text" id="producer-txt_$pn" x="$left" y="100">$currentPower</text>} if($flowgconPower); # Lage producer Consumption
|
||||||
###############################################################################
|
|
||||||
if ($lcp >= 5) {$pos_left -= 10}
|
|
||||||
elsif ($lcp == 4) {$pos_left += 10}
|
|
||||||
elsif ($lcp == 3) {$pos_left += 15}
|
|
||||||
elsif ($lcp == 2) {$pos_left += 20}
|
|
||||||
elsif ($lcp == 1) {$pos_left += 40}
|
|
||||||
|
|
||||||
$ret .= qq{<text class="flowg text" id="producer-txt_$pn" x="$pos_left" y="100">$currentPower</text>} if($flowgconPower); # Lage producer Consumption
|
# Leistungszahl wieder zurück an den Ursprungspunkt
|
||||||
|
####################################################
|
||||||
|
if ($lcp >= 5) {$left += 10}
|
||||||
|
elsif ($lcp == 4) {$left -= 10}
|
||||||
|
elsif ($lcp == 3) {$left -= 15}
|
||||||
|
elsif ($lcp == 2) {$left -= 20}
|
||||||
|
elsif ($lcp == 1) {$left -= 40}
|
||||||
|
|
||||||
# Leistungszahl wieder zurück an den Ursprungspunkt
|
$left += ($pdist * 2);
|
||||||
####################################################
|
}
|
||||||
if ($lcp >= 5) {$pos_left += 10}
|
|
||||||
elsif ($lcp == 4) {$pos_left -= 10}
|
|
||||||
elsif ($lcp == 3) {$pos_left -= 15}
|
|
||||||
elsif ($lcp == 2) {$pos_left -= 20}
|
|
||||||
elsif ($lcp == 1) {$pos_left -= 40}
|
|
||||||
|
|
||||||
$pos_left += ($consDist * 2);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
## Textangabe Consumer
|
## Textangabe Consumer
|
||||||
########################
|
########################
|
||||||
if ($flowgcons) {
|
if ($flowgcons) {
|
||||||
$pos_left = ($consumer_start * 2) - 50; # -XX -> Start Lage Consumer Beschriftung
|
$cons_left = ($consumer_start * 2) - 50; # -XX -> Start Lage Consumer Beschriftung
|
||||||
|
|
||||||
for my $c (@consumers) {
|
for my $c (@consumers) {
|
||||||
$currentPower = sprintf "%.1f", $cnsmr->{$c}{p};
|
$currentPower = sprintf "%.1f", $cnsmr->{$c}{p};
|
||||||
@ -14600,29 +14608,29 @@ END3
|
|||||||
|
|
||||||
$lcp = length $currentPower;
|
$lcp = length $currentPower;
|
||||||
|
|
||||||
#$ret .= qq{<text class="flowg text" id="consumer-txt_$c" x="$pos_left" y="1110" style="text-anchor: start;">$currentPower</text>} if ($flowgconPower); # Lage Consumer Consumption
|
#$ret .= qq{<text class="flowg text" id="consumer-txt_$c" x="$cons_left" y="1110" style="text-anchor: start;">$currentPower</text>} if ($flowgconPower); # Lage Consumer Consumption
|
||||||
#$ret .= qq{<text class="flowg text" id="consumer-txt_time_$c" x="$pos_left" y="1170" style="text-anchor: start;">$consumerTime</text>} if ($flowgconTime); # Lage Consumer Restlaufzeit
|
#$ret .= qq{<text class="flowg text" id="consumer-txt_time_$c" x="$cons_left" y="1170" style="text-anchor: start;">$consumerTime</text>} if ($flowgconTime); # Lage Consumer Restlaufzeit
|
||||||
|
|
||||||
# Verbrauchszahl abhängig von der Größe entsprechend auf der x-Achse verschieben
|
# Verbrauchszahl abhängig von der Größe entsprechend auf der x-Achse verschieben
|
||||||
##################################################################################
|
##################################################################################
|
||||||
if ($lcp >= 5) {$pos_left -= 40}
|
if ($lcp >= 5) {$cons_left -= 40}
|
||||||
elsif ($lcp == 4) {$pos_left -= 25}
|
elsif ($lcp == 4) {$cons_left -= 25}
|
||||||
elsif ($lcp == 3) {$pos_left -= 5 }
|
elsif ($lcp == 3) {$cons_left -= 5 }
|
||||||
elsif ($lcp == 2) {$pos_left += 7 }
|
elsif ($lcp == 2) {$cons_left += 7 }
|
||||||
elsif ($lcp == 1) {$pos_left += 25}
|
elsif ($lcp == 1) {$cons_left += 25}
|
||||||
|
|
||||||
$ret .= qq{<text class="flowg text" id="consumer-txt_$c" x="$pos_left" y="1110">$currentPower</text>} if ($flowgconPower); # Lage Consumer Consumption
|
$ret .= qq{<text class="flowg text" id="consumer-txt_$c" x="$cons_left" y="1110">$currentPower</text>} if ($flowgconPower); # Lage Consumer Consumption
|
||||||
$ret .= qq{<text class="flowg text" id="consumer-txt_time_$c" x="$pos_left" y="1170">$consumerTime</text>} if ($flowgconTime); # Lage Consumer Restlaufzeit
|
$ret .= qq{<text class="flowg text" id="consumer-txt_time_$c" x="$cons_left" y="1170">$consumerTime</text>} if ($flowgconTime); # Lage Consumer Restlaufzeit
|
||||||
|
|
||||||
# Verbrauchszahl wieder zurück an den Ursprungspunkt
|
# Verbrauchszahl wieder zurück an den Ursprungspunkt
|
||||||
######################################################
|
######################################################
|
||||||
if ($lcp >= 5) {$pos_left += 40}
|
if ($lcp >= 5) {$cons_left += 40}
|
||||||
elsif ($lcp == 4) {$pos_left += 25}
|
elsif ($lcp == 4) {$cons_left += 25}
|
||||||
elsif ($lcp == 3) {$pos_left += 5 }
|
elsif ($lcp == 3) {$cons_left += 5 }
|
||||||
elsif ($lcp == 2) {$pos_left -= 7 }
|
elsif ($lcp == 2) {$cons_left -= 7 }
|
||||||
elsif ($lcp == 1) {$pos_left -= 25}
|
elsif ($lcp == 1) {$cons_left -= 25}
|
||||||
|
|
||||||
$pos_left += ($consDist * 2);
|
$cons_left += ($cdist * 2);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -14642,11 +14650,13 @@ return $ret;
|
|||||||
sub __sortProducer {
|
sub __sortProducer {
|
||||||
my $pdcr = shift; # Hashref Producer
|
my $pdcr = shift; # Hashref Producer
|
||||||
|
|
||||||
my @all = ();
|
my @igrid = ();
|
||||||
my @igrid = ();
|
my @togrid = ();
|
||||||
my @prod = ();
|
my @prod = ();
|
||||||
my @idef = ();
|
my @idef = ();
|
||||||
my @ibat = ();
|
my @tonode = ();
|
||||||
|
my @ibat = ();
|
||||||
|
my @tobat = ();
|
||||||
|
|
||||||
for my $lfn (sort{$a<=>$b} keys %{$pdcr}) {
|
for my $lfn (sort{$a<=>$b} keys %{$pdcr}) {
|
||||||
my $ptyp = $pdcr->{$lfn}{ptyp}; # producer | inverter
|
my $ptyp = $pdcr->{$lfn}{ptyp}; # producer | inverter
|
||||||
@ -14658,12 +14668,12 @@ sub __sortProducer {
|
|||||||
push @ibat, $lfn if($ptyp eq 'inverter' && $feed eq 'bat');
|
push @ibat, $lfn if($ptyp eq 'inverter' && $feed eq 'bat');
|
||||||
}
|
}
|
||||||
|
|
||||||
push @all, @igrid;
|
push @togrid, @igrid;
|
||||||
push @all, @prod;
|
push @tonode, @prod;
|
||||||
push @all, @idef;
|
push @tonode, @idef;
|
||||||
push @all, @ibat;
|
push @tobat, @ibat;
|
||||||
|
|
||||||
return @all;
|
return (\@togrid, \@tonode, \@tobat);
|
||||||
}
|
}
|
||||||
|
|
||||||
################################################################
|
################################################################
|
||||||
@ -23920,7 +23930,7 @@ die ordnungsgemäße Anlagenkonfiguration geprüft werden.
|
|||||||
gfeedin=<Readingname>:<Einheit> feedtotal=<Readingname>:<Einheit>
|
gfeedin=<Readingname>:<Einheit> feedtotal=<Readingname>:<Einheit>
|
||||||
[conprice=<Feld>] [feedprice=<Feld>] </b> <br><br>
|
[conprice=<Feld>] [feedprice=<Feld>] </b> <br><br>
|
||||||
|
|
||||||
Legt ein beliebiges Device und seine Readings zur Energiemessung fest.
|
Legt ein beliebiges Device und seine Readings zur Energiemessung in bzw. aus dem öffentlichen Netz fest.
|
||||||
Das Modul geht davon aus, dass der numerische Wert der Readings positiv ist.
|
Das Modul geht davon aus, dass der numerische Wert der Readings positiv ist.
|
||||||
Es kann auch ein Dummy Device mit entsprechenden Readings sein. Die Bedeutung des jeweiligen "Readingname" ist:
|
Es kann auch ein Dummy Device mit entsprechenden Readings sein. Die Bedeutung des jeweiligen "Readingname" ist:
|
||||||
<br><br>
|
<br><br>
|
||||||
|
Loading…
x
Reference in New Issue
Block a user