';
- }
-
+ }
+
$v->{$k} = $attrcmd;
$u->{$k} = q{};
-
+
debugLog ($paref, 'graphic', "graphicHeaderOwnspec - attr-command genereated:\n$attrcmd");
next;
}
-
+
$v->{$k} = ReadingsVal ($dev, $elm, '');
-
+
if ($v->{$k} =~ /^\s*(-?\d+(\.\d+)?)/xs) {
($v->{$k}, $u->{$k}) = split /\s+/, ReadingsVal ($dev, $elm, ''); # Value und Unit trennen wenn Value numerisch
}
-
+
$v->{$k} //= q{};
$u->{$k} //= q{};
-
- $paref->{dev} = $dev;
+
+ $paref->{dev} = $dev;
$paref->{rdg} = $elm;
$paref->{val} = $v->{$k};
$paref->{unit} = $u->{$k};
-
+
($v->{$k}, $u->{$k}) = ___ghoValForm ($paref);
-
+
delete $paref->{dev};
delete $paref->{rdg};
delete $paref->{val};
delete $paref->{unit};
-
+
next if(!$u->{$k});
-
+
if ($uatr eq 'kWh') {
if ($u->{$k} =~ /^Wh/xs) {
$v->{$k} = sprintf "%.1f",($v->{$k} / 1000);
$u->{$k} = 'kWh';
}
}
-
+
if ($uatr eq 'Wh') {
if ($u->{$k} =~ /^kWh/xs) {
$v->{$k} = sprintf "%.0f",($v->{$k} * 1000);
@@ -9748,7 +9760,7 @@ return $ownv;
################################################################
# liefert ein FHEMWEB set/attr Widget zurück
-################################################################
+################################################################
sub ___getFWwidget {
my $name = shift;
my $dev = shift // $name; # Device des Elements, default=$name
@@ -9757,40 +9769,40 @@ sub ___getFWwidget {
my $ctyp = shift // 'set'; # Kommandotyp: set/attr
return if(!$elm);
-
+
my $widget = '';
my ($current, $reading);
-
+
if ($dev ne $name) { # Element eines anderen Devices verarbeiten
if ($ctyp eq 'set') {
$allc = ' '.FW_widgetOverride ($dev, getAllSets($dev), 'set').' '; # Leerzeichen wichtig für Regexvergleich
}
elsif ($ctyp eq 'attr') {
- $allc = ' '.FW_widgetOverride ($dev, getAllAttr($dev), 'attr').' ';
+ $allc = ' '.FW_widgetOverride ($dev, getAllAttr($dev), 'attr').' ';
}
}
if ($allc =~ /\s$elm:?(.*?)\s/xs) { # Element in allen Sets oder Attr enthalten
my $arg = $1;
-
+
if (!$arg || $arg eq 'textField' || $arg eq 'textField-long') { # Label (Reading) ausblenden -> siehe fhemweb.js function FW_createTextField Zeile 1657
- $arg = 'textFieldNL';
+ $arg = 'textFieldNL';
}
-
+
if ($arg !~ /^\#/xs && $arg !~ /^$allwidgets/xs) {
- $arg = '#,'.$arg;
+ $arg = '#,'.$arg;
}
-
+
if ($arg =~ 'slider') { # Widget slider in selectnumbers für Kopfgrafik umsetzen
- my ($wid, $min, $step, $max, $float) = split ",", $arg;
+ my ($wid, $min, $step, $max, $float) = split ",", $arg;
$arg = "selectnumbers,$min,$step,$max,0,lin";
}
-
+
if ($ctyp eq 'attr') { # Attributwerte als verstecktes Reading abbilden
$current = AttrVal ($dev, $elm, '');
$reading = '.'.$dev.'_'.$elm;
}
- else {
+ else {
$current = ReadingsVal ($dev, $elm, '');
if($dev ne $name) {
$reading = '.'.$dev.'_'.$elm; # verstecktes Reading in SolCast abbilden wenn Set-Kommando aus fremden Device
@@ -9799,31 +9811,31 @@ sub ___getFWwidget {
$reading = $elm;
}
}
-
+
if ($reading && $reading =~ /^\./xs) { # verstecktes Reading für spätere Löschung merken
push @widgetreadings, $reading;
readingsSingleUpdate ($defs{$name}, $reading, $current, 0);
}
-
- $widget = ___widgetFallback ( { name => $name,
+
+ $widget = ___widgetFallback ( { name => $name,
dev => $dev,
- ctyp => $ctyp,
+ ctyp => $ctyp,
elm => $elm,
reading => $reading,
- arg => $arg
- }
+ arg => $arg
+ }
);
-
+
if (!$widget) {
$widget = FW_pH ("cmd=$ctyp $dev $elm", $elm, 0, "", 1, 1);
}
}
-
+
return $widget;
}
################################################################
-# adaptierte FW_widgetFallbackFn aus FHEMWEB
+# adaptierte FW_widgetFallbackFn aus FHEMWEB
################################################################
sub ___widgetFallback {
my $pars = shift;
@@ -9837,16 +9849,16 @@ sub ___widgetFallback {
return '' if(!$arg || $arg eq "noArg");
my $current = ReadingsVal ($name, $reading, undef);
-
+
if (!defined $current) {
$reading = 'state';
$current = ' ';
}
-
- if ($current =~ /(().*?)/xs) { # Eleminierung von störenden HTML Elementen aus aktuellem Readingwert
+
+ if ($current =~ /(( | ).*?)/xs) { # Eleminierung von störenden HTML Elementen aus aktuellem Readingwert
$current = ' ';
}
-
+
$current =~ s/$elm //;
$current = ReplaceEventMap ($dev, $current, 1);
@@ -9855,7 +9867,7 @@ sub ___widgetFallback {
}
################################################################
-# ownHeader ValueFormat
+# ownHeader ValueFormat
################################################################
sub ___ghoValForm {
my $paref = shift;
@@ -9866,7 +9878,7 @@ sub ___ghoValForm {
my $val = $paref->{val};
my $unit = $paref->{unit};
my $type = $paref->{type};
-
+
my $fn = $data{$type}{$name}{func}{ghoValForm};
return ($val, $unit) if(!$fn || !$dev || !$rdg || !defined $val);
@@ -9875,25 +9887,25 @@ sub ___ghoValForm {
my $VALUE = $val;
my $UNIT = $unit;
my $err;
-
- if (!ref $fn && $fn =~ m/^\{.*\}$/xs) { # normale Funktionen
+
+ if (!ref $fn && $fn =~ m/^\{.*\}$/xs) { # normale Funktionen
my $efn = eval $fn;
-
+
if ($@) {
Log3 ($name, 2, "$name - ERROR in execute graphicHeaderOwnspecValForm: ".$@);
$err = $@;
- }
+ }
else {
if (ref $efn ne 'HASH') {
$val = $VALUE;
$unit = $UNIT;
}
else {
- $fn = $efn;
+ $fn = $efn;
}
}
}
-
+
if (ref $fn eq 'HASH') { # Funktionshash
my $vf = "";
$vf = $fn->{$rdg} if(exists $fn->{$rdg});
@@ -9901,28 +9913,28 @@ sub ___ghoValForm {
$vf = $fn->{"$rdg.$val"} if(exists $fn->{"$rdg.$val"});
$vf = $fn->{"$dev.$rdg.$val"} if(exists $fn->{"$dev.$rdg.$val"});
$fn = $vf;
-
+
if ($fn =~ m/^%/xs) {
$val = sprintf $fn, $val;
- }
+ }
elsif ($fn ne "") {
my $vnew = eval $fn;
-
+
if ($@) {
Log3 ($name, 2, "$name - ERROR in execute graphicHeaderOwnspecValForm: ".$@);
$err = $@;
- }
+ }
else {
$val = $vnew;
}
}
}
-
+
if ($val =~ /^\s*(-?\d+(\.\d+)?)/xs) { # Value und Unit numerischer Werte trennen
- ($val, my $u1) = split /\s+/, $val;
+ ($val, my $u1) = split /\s+/, $val;
$unit = $u1 ? $u1 : $unit;
}
-
+
if ($err) {
$err = (split "at", $err)[0];
$paref->{state} = 'ERROR - graphicHeaderOwnspecValForm: '.$err;
@@ -10720,24 +10732,24 @@ sub __weatherOnBeam {
$ret .= " | | "; # freier Platz am Anfang
for my $i (0..($maxhours * 2) - 1) {
- last if (!exists ($hfcg->{$i}{weather}));
-
+ last if (!exists ($hfcg->{$i}{weather}));
+
$hfcg->{$i}{weather} = 999 if(!defined $hfcg->{$i}{weather});
my $wcc = $hfcg->{$i}{wcc} // '-'; # Bewölkungsgrad ergänzen
-
+
debugLog ($paref, 'graphic', "weather id beam number >$i< (start hour $hfcg->{$i}{time_str}): wid $hfcg->{$i}{weather} / wcc $wcc") if($ii < $maxhours);
-
+
if (!$show_night && $hfcg->{$i}{weather} > 99
&& !$hfcg->{$i}{beam1}
- && !$hfcg->{$i}{beam2}) {
-
+ && !$hfcg->{$i}{beam2}) {
+
debugLog ($paref, 'graphic', "weather id >$i< don't show night condition ... is skipped") if($ii < $maxhours);
next;
};
# Lässt Nachticons aber noch durch wenn es einen Wert gibt , ToDo : klären ob die Nacht richtig gesetzt wurde
$ii++; # wieviele Stunden Icons haben wir bisher beechnet ?
last if($ii > $maxhours);
- # ToDo : weather_icon sollte im Fehlerfall Title mit der ID besetzen um in FHEMWEB sofort die ID sehen zu können
+ # ToDo : weather_icon sollte im Fehlerfall Title mit der ID besetzen um in FHEMWEB sofort die ID sehen zu können
my ($icon_name, $title) = $hfcg->{$i}{weather} > 100 ?
weather_icon ($name, $lang, $hfcg->{$i}{weather}-100) :
weather_icon ($name, $lang, $hfcg->{$i}{weather});
@@ -11179,7 +11191,7 @@ sub formatVal6 {
my $v = shift;
my $kw = shift;
my $w = shift;
-
+
my $n = ' '; # positive Zahl
if ($v < 0) {
@@ -11712,7 +11724,7 @@ sub __calcNewFactor {
$dnum = 1;
$factor = sprintf "%.2f", ($pvre / $pvfc);
}
-
+
$factor = 1.00 if(1 * $factor == 0); # 0.00-Werte ignorieren (Schleifengefahr)
return ($factor, $dnum);
@@ -12350,7 +12362,7 @@ sub setPVhistory {
}
$data{$type}{$name}{pvhist}{$day}{99}{batout} = $batoutsum;
}
-
+
if ($histname eq "batmaxsoc") { # max. erreichter SOC des Tages
$val = $batmaxsoc;
$data{$type}{$name}{pvhist}{$day}{99}{batmaxsoc} = $batmaxsoc;
@@ -13186,7 +13198,7 @@ sub checkPlantConfig {
my $aiusemsg = CurrentVal ($hash, 'aicanuse', '');
my ($cset, $lat, $lon) = locCoordinates();
my $einstds = "";
-
+
if (!$eocr || $eocr ne '.*') {
$einstds = 'to .*' if($eocr ne '.*');
$result->{'Common Settings'}{state} = $info;
@@ -13201,7 +13213,7 @@ sub checkPlantConfig {
$result->{'Common Settings'}{note} .= qq{If the local attribute "ctrlLanguage" or the global attribute "language" is changed to "DE" most of the outputs are in German.
};
$result->{'Common Settings'}{info} = 1;
}
-
+
if (!$lat) {
$result->{'Common Settings'}{state} = $warn;
$result->{'Common Settings'}{result} .= qq{Attribute latitude in global device is not set.
};
@@ -13222,22 +13234,22 @@ sub checkPlantConfig {
$result->{'Common Settings'}{note} .= qq{$aiusemsg.
};
$result->{'Common Settings'}{info} = 1;
}
-
+
my ($cmerr, $cmupd, $cmmsg, $cmrec) = checkModVer ($name, '76_SolarForecast', 'https://fhem.de/fhemupdate/controls_fhem.txt');
-
+
if (!$cmerr && !$cmupd) {
$result->{'Common Settings'}{note} .= qq{$cmmsg
};
$result->{'Common Settings'}{note} .= qq{checked module:
};
$result->{'Common Settings'}{note} .= qq{76_SolarForecast
};
}
-
+
if ($cmerr) {
$result->{'Common Settings'}{state} = $warn;
$result->{'Common Settings'}{result} .= qq{$cmmsg
};
$result->{'Common Settings'}{note} .= qq{$cmrec
};
$result->{'Common Settings'}{warn} = 1;
}
-
+
if ($cmupd) {
$result->{'Common Settings'}{state} = $warn;
$result->{'Common Settings'}{result} .= qq{$cmmsg
};
@@ -13395,7 +13407,7 @@ sub checkPlantConfig {
$result->{'Common Settings'}{note} .= qq{pvCorrectionFactor_Auto, vrmCredentials, event-on-change-reading, ctrlLanguage
};
}
}
-
+
## FTUI Widget Support
########################
my $tpath = "$root/www/tablet/css";
@@ -13403,44 +13415,44 @@ sub checkPlantConfig {
$err = 0;
if (!-d $tpath) {
- $result->{'FTUI Widget Files'}{result} .= $hqtxt{widnin}{$lang};
+ $result->{'FTUI Widget Files'}{result} .= $hqtxt{widnin}{$lang};
$result->{'FTUI Widget Files'}{note} .= qq{There is no need to install SolarForecast FTUI widgets.
};
}
else {
- my $cfurl = $bPath.$cfile.$pPath;
-
- for my $file (@fs) {
+ my $cfurl = $bPath.$cfile.$pPath;
+
+ for my $file (@fs) {
($cmerr, $cmupd, $cmmsg, $cmrec) = checkModVer ($name, $file, $cfurl);
$err = 1 if($cmerr);
$upd = 1 if($cmupd);
- }
-
+ }
+
if ($err) {
$result->{'FTUI Widget Files'}{state} = $warn;
$result->{'FTUI Widget Files'}{result} .= $hqtxt{widerr}{$lang}.'
';
$result->{'FTUI Widget Files'}{result} .= $cmmsg.'
';
- $result->{'FTUI Widget Files'}{note} .= qq{Update the FHEM Tablet UI Widget Files with the command:
};
+ $result->{'FTUI Widget Files'}{note} .= qq{Update the FHEM Tablet UI Widget Files with the command:
};
$result->{'FTUI Widget Files'}{note} .= qq{"get $name ftuiFramefiles".
};
- $result->{'FTUI Widget Files'}{note} .= qq{After that do the test again. If the error is permanent, please inform the maintainer.
};
+ $result->{'FTUI Widget Files'}{note} .= qq{After that do the test again. If the error is permanent, please inform the maintainer.
};
$result->{'FTUI Widget Files'}{warn} = 1;
-
+
$upd = 0;
}
if ($upd) {
$result->{'FTUI Widget Files'}{state} = $warn;
$result->{'FTUI Widget Files'}{result} .= $hqtxt{widnup}{$lang};
- $result->{'FTUI Widget Files'}{note} .= qq{Update the FHEM Tablet UI Widget Files with the command:
};
- $result->{'FTUI Widget Files'}{note} .= qq{"get $name ftuiFramefiles".
};
- $result->{'FTUI Widget Files'}{warn} = 1;
- }
-
+ $result->{'FTUI Widget Files'}{note} .= qq{Update the FHEM Tablet UI Widget Files with the command:
};
+ $result->{'FTUI Widget Files'}{note} .= qq{"get $name ftuiFramefiles".
};
+ $result->{'FTUI Widget Files'}{warn} = 1;
+ }
+
if (!$result->{'FTUI Widget Files'}{fault} && !$result->{'FTUI Widget Files'}{warn} && !$result->{'FTUI Widget Files'}{info}) {
$result->{'FTUI Widget Files'}{result} .= $hqtxt{widok}{$lang};
$result->{'FTUI Widget Files'}{note} .= qq{checked Files:
};
$result->{'FTUI Widget Files'}{note} .= (join ', ', @fs).qq{
};
- }
+ }
}
## Ausgabe
@@ -14054,7 +14066,7 @@ sub isAddSwitchOffCond {
my $c = shift;
my $cond = shift // q{};
my $hyst = shift // 0; # Hysterese
-
+
my $swoff = 0;
my $info = q{};
my $err = q{};
@@ -14085,26 +14097,26 @@ sub isAddSwitchOffCond {
$swoff = 1;
}
else {
- $info = qq{value "$condval" doesn't match the Regex "$swoffcondregex" \n};
+ $info = qq{value "$condval" doesn't match the Regex "$swoffcondregex" \n};
$swoff = 0;
}
if ($hyst && isNumeric ($condval)) { # Hysterese berücksichtigen
$condval -= $hyst;
-
+
if ($condval =~ m/^$swoffcondregex$/x) {
$info = qq{value "$condval" (included hysteresis = $hyst) matches the Regex "$swoffcondregex" \n};
$info .= "-> !Interrupt! ";
- $swoff = 1;
+ $swoff = 1;
}
else {
$info = qq{device: "$dswoffcond", reading: "$rswoffcond" , value: "$condval" (included hysteresis = $hyst) doesn't match Regex: "$swoffcondregex" \n};
- $swoff = 0;
+ $swoff = 0;
}
}
-
- $info .= qq{-> the effect depends on the switch context\n};
- }
+
+ $info .= qq{-> the effect depends on the switch context\n};
+ }
return ($swoff, $info, $err);
}
@@ -14220,7 +14232,7 @@ sub isBatteryUsed {
my $badev = ReadingsVal($name, 'currentBatteryDev', ''); # aktuelles Meter device für Batteriewerte
my ($a,$h) = parseParams ($badev);
$badev = $a->[0] // "";
-
+
return if(!$badev || !$defs{$badev});
return ($badev, $a ,$h);
@@ -14800,7 +14812,7 @@ return;
# batin - Batterieladung der Stunde (Wh)
# batouttotal - totale Batterieentladung (Wh)
# batout - Batterieentladung der Stunde (Wh)
-# batmsoc - max. SOC des Tages (%)
+# batmsoc - max. SOC des Tages (%)
# batsetsoc - optimaler (berechneter) SOC (%) für den Tag
# weatherid - Wetter ID
# wcc - Grad der Bewölkung
@@ -14857,7 +14869,7 @@ return $def;
# pvcorrf - PV Autokorrekturfaktoren (HASH)
# lastTsMaxSocRchd - Timestamp des letzten Erreichens von SoC >= maxSoC
# nextTsMaxSocChge - Timestamp bis zu dem die Batterie mindestens einmal maxSoC erreichen soll
-# days2care - verbleibende Tage bis der Batterie Pflege-SoC (default $maxSoCdef) erreicht sein soll
+# days2care - verbleibende Tage bis der Batterie Pflege-SoC (default $maxSoCdef) erreicht sein soll
# tdayDvtn - heutige Abweichung PV Prognose/Erzeugung in %
# ydayDvtn - gestrige Abweichung PV Prognose/Erzeugung in %
# initdayfeedin - initialer Wert für "gridfeedin" zu Beginn des Tages (Wh)
@@ -15391,7 +15403,7 @@ to ensure that the system configuration is correct.
-
+
- consumerNewPlanning <Consumer number>
@@ -15426,8 +15438,8 @@ to ensure that the system configuration is correct.
- - currentBatteryDev <Battery Device Name> pin=<Readingname>:<Unit> pout=<Readingname>:<Unit>
- [intotal=<Readingname>:<Unit>] [outtotal=<Readingname>:<Unit>]
+
- currentBatteryDev <Battery Device Name> pin=<Readingname>:<Unit> pout=<Readingname>:<Unit>
+ [intotal=<Readingname>:<Unit>] [outtotal=<Readingname>:<Unit>]
[cap=<Option>] [charge=<Readingname>]
Specifies an arbitrary Device and its Readings to deliver the battery performance data.
@@ -15444,7 +15456,7 @@ to ensure that the system configuration is correct.
outtotal | Reading which provides the total battery discharge as a continuous counter (optional) |
cap | installed battery capacity (optional). Option can be: |
| numerical value - direct indication of the battery capacity in Wh |
- | <Readingname>:<unit> - Reading which provides the capacity and unit (Wh, kWh) |
+ | <Readingname>:<unit> - Reading which provides the capacity and unit (Wh, kWh) |
charge | Reading which provides the current state of charge (SOC in percent) (optional) |
Unit | the respective unit (W,Wh,kW,kWh) |
@@ -15613,10 +15625,10 @@ to ensure that the system configuration is correct.
If there is no device of type DWD_OpenData yet, it must be defined in advance
(look at DWD_OpenData Commandref).
To obtain a good radiation forecast, a DWD station located near the plant site should be used.
- Unfortunately, not all
- DWD stations
+ Unfortunately, not all
+ DWD stations
provide the required Rad1h values.
- Explanations of the stations are listed in
+ Explanations of the stations are listed in
Stationslexikon.
At least the following attributes must be set in the selected DWD_OpenData Device:
@@ -16036,28 +16048,28 @@ to ensure that the system configuration is correct.
-
+
- ftuiFramefiles
- SolarForecast provides widgets for
+ SolarForecast provides widgets for
FHEM Tablet UI v2 (FTUI2).
- If FTUI2 is installed on the system, the files for the framework can be loaded into the FTUI directory structure
+ If FTUI2 is installed on the system, the files for the framework can be loaded into the FTUI directory structure
with this command.
The setup and use of the widgets is described in Wiki
SolarForecast FTUI Widget.
-
+
- html
The SolarForecast graphic is retrieved and displayed as HTML code.
Note: By the attribute graphicHeaderOwnspec
- generated set or attribute commands in the user-specific area of the header are generally hidden for technical
+ generated set or attribute commands in the user-specific area of the header are generally hidden for technical
reasons.
- One of the following selections can be given as an argument to the command:
+ One of the following selections can be given as an argument to the command:
@@ -16604,6 +16616,55 @@ to ensure that the system configuration is correct.
+
+ - ctrlBatSocManagement lowSoc=<Value> upSoC=<Value> [maxSoC=<Value>] [careCycle=<Value>]
+ If a battery device (currentBatteryDev) is installed, this attribute activates the battery SoC management.
+ The Battery_OptimumTargetSoC reading contains the optimum minimum SoC calculated by the module.
+ The Battery_ChargeRequest reading is set to '1' if the current SoC has fallen below the minimum SoC.
+ In this case, the battery should be forcibly charged, possibly with mains power.
+ The readings can be used to control the SoC (State of Charge) and to control the charging current used for the
+ battery.
+ The module itself does not control the battery.
+
+
+
+
+ lowSoc | lower minimum SoC, the battery is not discharged lower than this value (> 0) |
+ upSoC | upper minimum SoC, the usual value of the optimum SoC is between 'lowSoC' |
+ | and this value. |
+ maxSoC | Maximum minimum SoC, SoC value that must be reached at least every 'careCycle' days |
+ | in order to balance the charge in the storage network. |
+ | The specification is optional (<= 100, default: 95) |
+ careCycle | Maximum interval in days that may occur between two states of charge |
+ | of at least 'maxSoC'. The specification is optional (default: 20) |
+
+
+
+
+ All values are whole numbers in %. The following applies: 'lowSoc' < 'upSoC' < 'maxSoC'.
+ The optimum SoC is determined according to the following scheme:
+
+
+
+ 1. | Starting from 'lowSoc', the minimum SoC is increased by 5% on the following day but not higher than |
+ | 'upSoC', if 'maxSoC' has not been reached on the current day. |
+ 2. | If 'maxSoC' is reached (again) on the current day, the minimum SoC is reduced by 5%, but not lower than 'lowSoc'. |
+ 3. | Minimum SoC is reduced so that the predicted PV energy of the current or following day |
+ | can be absorbed by the battery. Minimum SoC is not reduced lower than 'lowSoc'. |
+ 4. | The module records the last point in time at the 'maxSoC' level in order to ensure a charge to 'maxSoC' |
+ | at least every 'careCycle' days. For this purpose, the optimized SoC is changed depending on the remaining days |
+ | until the next 'careCycle' point in such a way that 'maxSoC' is mathematically achieved by a daily 5% SoC increase |
+ | at the 'careCycle' time point. If 'maxSoC' is reached in the meantime, the 'careCycle' period starts again. |
+
+
+
+
+ Example:
+ attr <name> ctrlBatSocManagement lowSoc=10 upSoC=50 maxSoC=99 careCycle=25
+
+
+
+
- ctrlConsRecommendReadings
Readings of the form consumerXX_ConsumptionRecommended are created for the selected consumers (number).
@@ -16719,7 +16780,7 @@ to ensure that the system configuration is correct.
- ctrlStatisticReadings
- Readings are created for the selected key figures and indicators with the
+ Readings are created for the selected key figures and indicators with the
naming scheme 'statistic_<indicator>'. Selectable key figures / indicators are:
@@ -17004,7 +17065,7 @@ to ensure that the system configuration is correct.
| in today:statistic_todayBatIn |
| out today:statistic_todayBatOut |
| : |
- | : |
+ | : |
| #Settings |
| Autocorrection:pvCorrectionFactor_Auto : : : |
| Consumer<br>Replanning:consumerNewPlanning : : : |
@@ -17013,29 +17074,29 @@ to ensure that the system configuration is correct.
| History:graphicHistoryHour : : : |
| GraphicSize:flowGraphicSize : : : |
| ShowNight:graphicShowNight : : : |
- | Debug:ctrlDebug : : : |
+ | Debug:ctrlDebug : : : |
-
+
- graphicHeaderOwnspecValForm
- The readings to be displayed with the attribute
- graphicHeaderOwnspec can be manipulated with sprintf and
+ The readings to be displayed with the attribute
+ graphicHeaderOwnspec can be manipulated with sprintf and
other Perl operations.
There are two basic notation options that cannot be combined with each other.
- The notations are always specified within two curly brackets {...}.
-
+ The notations are always specified within two curly brackets {...}.
+
Notation 1:
- A simple formatting of readings of your own device with sprintf is carried out as shown in line
+ A simple formatting of readings of your own device with sprintf is carried out as shown in line
'Current_AutarkyRate' or 'Current_GridConsumption'.
Other Perl operations are to be bracketed with (). The respective readings values and units are available via
the variables $VALUE and $UNIT.
- Readings of other devices are specified by '<Device>.<Reading>'.
+ Readings of other devices are specified by '<Device>.<Reading>'.
-
+
@@ -17049,13 +17110,13 @@ to ensure that the system configuration is correct.
-
+
Notation 2:
The manipulation of reading values and units is done via Perl If ... else structures.
- The device, reading, reading value and unit are available to the structure with the variables $DEVICE, $READING,
+ The device, reading, reading value and unit are available to the structure with the variables $DEVICE, $READING,
$VALUE and $UNIT.
If the variables are changed, the new values are transferred to the display accordingly.
-
+
@@ -17070,7 +17131,7 @@ to ensure that the system configuration is correct.
| } |
} | |
-
+
@@ -17350,7 +17411,7 @@ die ordnungsgemäße Anlagenkonfiguration geprüft werden.
-
+
- batteryTrigger <1on>=<Wert> <1off>=<Wert> [<2on>=<Wert> <2off>=<Wert> ...]
@@ -17407,8 +17468,8 @@ die ordnungsgemäße Anlagenkonfiguration geprüft werden.
- - currentBatteryDev <Batterie Device Name> pin=<Readingname>:<Einheit> pout=<Readingname>:<Einheit>
- [intotal=<Readingname>:<Einheit>] [outtotal=<Readingname>:<Einheit>]
+
- currentBatteryDev <Batterie Device Name> pin=<Readingname>:<Einheit> pout=<Readingname>:<Einheit>
+ [intotal=<Readingname>:<Einheit>] [outtotal=<Readingname>:<Einheit>]
[cap=<Option>] [charge=<Readingname>]
Legt ein beliebiges Device und seine Readings zur Lieferung der Batterie Leistungsdaten fest.
@@ -17596,10 +17657,10 @@ die ordnungsgemäße Anlagenkonfiguration geprüft werden.
(siehe DWD_OpenData Commandref).
Um eine gute Strahlungsprognose zu erhalten, sollte eine nahe dem Anlagenstandort gelegene DWD-Station genutzt
werden.
- Leider liefern nicht alle
- DWD-Stationen
+ Leider liefern nicht alle
+ DWD-Stationen
die benötigten Rad1h-Werte.
- Erläuterungen zu den Stationen sind im
+ Erläuterungen zu den Stationen sind im
Stationslexikon aufgeführt.
Im ausgewählten DWD_OpenData Device müssen mindestens die folgenden Attribute gesetzt sein:
@@ -18020,29 +18081,29 @@ die ordnungsgemäße Anlagenkonfiguration geprüft werden.
-
+
- ftuiFramefiles
- SolarForecast stellt Widgets für
+ SolarForecast stellt Widgets für
FHEM Tablet UI v2 (FTUI2) zur Verfügung.
Ist FTUI2 auf dem System installiert, können die Dateien für das Framework mit diesem Kommando in die
FTUI-Verzeichnisstruktur geladen werden.
Die Einrichtung und Verwendung der Widgets ist im Wiki
- SolarForecast FTUI Widget
+ SolarForecast FTUI Widget
beschrieben.
-
+
- html
Die SolarForecast Grafik wird als HTML-Code abgerufen und wiedergegeben.
Hinweis: Durch das Attribut graphicHeaderOwnspec
- generierte set-Kommandos oder Attribut-Befehle im Anwender spezifischen Bereich des Headers werden aus technischen
+ generierte set-Kommandos oder Attribut-Befehle im Anwender spezifischen Bereich des Headers werden aus technischen
Gründen generell ausgeblendet.
- Als Argument kann dem Befehl eine der folgenden Selektionen mitgegeben werden:
+ Als Argument kann dem Befehl eine der folgenden Selektionen mitgegeben werden:
@@ -18586,55 +18647,58 @@ die ordnungsgemäße Anlagenkonfiguration geprüft werden.
regelmäßig neu geladen werden sollen.
-
+
- ctrlBatSocManagement lowSoc=<Wert> upSoC=<Wert> [maxSoC=<Wert>] [careCycle=<Wert>]
- Sofern ein Batterie Device (currentBatteryDev) installiert ist, aktiviert dieses Attribut das Batterie
- SoC-Management.
- Dadurch wird das Reading Battery_OptimumTargetSoC erstellt.
- Dieses Reading kann zur Steuerung des SoC (State of Charge) im Batterie Device verwendet werden.
-
- Anzugeben sind:
-
+ Sofern ein Batterie Device (currentBatteryDev) installiert ist, aktiviert dieses Attribut das Batterie
+ SoC-Management.
+ Das Reading Battery_OptimumTargetSoC enthält den vom Modul berechneten optimalen Mindest-SoC.
+ Das Reading Battery_ChargeRequest wird auf '1' gesetzt, wenn der aktuelle SoC unter den Mindest-SoC gefallen
+ ist.
+ In diesem Fall sollte die Batterie, unter Umständen mit Netzstrom, zwangsgeladen werden.
+ Die Readings können zur Steuerung des SoC (State of Charge) sowie zur Steuerung des verwendeten Ladestroms
+ der Batterie verwendet werden.
+ Durch das Modul selbst findet keine Steuerung der Batterie statt.
+
lowSoc | unterer Mindest-SoC, die Batterie wird nicht tiefer als dieser Wert entladen (> 0) |
upSoC | oberer Mindest-SoC, der übliche Wert des optimalen SoC bewegt sich zwischen 'lowSoC' |
| und diesem Wert. |
- maxSoC | maximaler Mindest-SoC, SoC Wert der mindestens im Abstand von 'careCycle' Tagen erreicht |
+ maxSoC | maximaler Mindest-SoC, SoC Wert der mindestens im Abstand von 'careCycle' Tagen erreicht |
| werden muß um den Ladungsausgleich im Speicherverbund auszuführen. |
| Die Angabe ist optional (<= 100, default: 95) |
careCycle | maximaler Abstand in Tagen, der zwischen zwei Ladungszuständen von mindestens 'maxSoC' |
- | auftreten darf. Die Angabe ist optional (default: 30) |
+ | auftreten darf. Die Angabe ist optional (default: 20) |
-
-
-
+
+
+
Alle Werte sind ganze Zahlen in %. Dabei gilt: 'lowSoc' < 'upSoC' < 'maxSoC'.
Die Ermittlung des optimalen SoC erfolgt nach folgendem Schema:
-
+
1. | Ausgehend von 'lowSoc' wird der Mindest-SoC am folgenden Tag um 5%, aber nicht höher als |
| 'upSoC' inkrementiert, sofern am laufenden Tag 'maxSoC' nicht erreicht wurde. |
2. | Wird am laufenden Tag 'maxSoC' (wieder) erreicht, wird Mindest-SoC um 5%, aber nicht tiefer als 'lowSoc', verringert. |
- 3. | Mindest-SoC wird soweit verringert, dass die prognostizierte PV Energie des aktuellen bzw. des folgenden Tages |
+ 3. | Mindest-SoC wird soweit verringert, dass die prognostizierte PV Energie des aktuellen bzw. des folgenden Tages |
| von der Batterie aufgenommen werden kann. Mindest-SoC wird nicht tiefer als 'lowSoc' verringert. |
- 4. | Das Modul erfasst den letzten Zeitpunkt am 'maxSoC'-Level, um eine Ladung auf 'maxSoC' mindestens alle 'careCycle' |
- | Tage zu realisieren. Zu diesem Zweck wird der optimierte SoC in Abhängigkeit der Resttage bis zum nächsten |
- | 'careCycle' Zeitpunkt derart verändert, dass durch eine tägliche 5% SoC-Steigerung 'maxSoC' am 'careCycle' Punkt |
- | rechnerisch erreicht wird. Wird zwischenzeitlich 'maxSoC' erreicht, beginnt der 'careCycle' Zeitraum erneut. |
+ 4. | Das Modul erfasst den letzten Zeitpunkt am 'maxSoC'-Level, um eine Ladung auf 'maxSoC' mindestens alle 'careCycle' |
+ | Tage zu realisieren. Zu diesem Zweck wird der optimierte SoC in Abhängigkeit der Resttage bis zum nächsten |
+ | 'careCycle' Zeitpunkt derart verändert, dass durch eine tägliche 5% SoC-Steigerung 'maxSoC' am 'careCycle' Zeitpunkt |
+ | rechnerisch erreicht wird. Wird zwischenzeitlich 'maxSoC' erreicht, beginnt der 'careCycle' Zeitraum erneut. |
Beispiel:
attr <name> ctrlBatSocManagement lowSoc=10 upSoC=50 maxSoC=99 careCycle=25
-
+
-
-
+
+
ctrlConsRecommendReadings
Für die ausgewählten Consumer (Nummer) werden Readings der Form consumerXX_ConsumptionRecommended erstellt.
@@ -18750,7 +18814,7 @@ die ordnungsgemäße Anlagenkonfiguration geprüft werden.
ctrlStatisticReadings
- Für die ausgewählten Kennzahlen und Indikatoren werden Readings mit dem
+ Für die ausgewählten Kennzahlen und Indikatoren werden Readings mit dem
Namensschema 'statistic_<Indikator>' erstellt. Auswählbare Kennzahlen / Indikatoren sind:
@@ -18761,7 +18825,7 @@ die ordnungsgemäße Anlagenkonfiguration geprüft werden.
currentAPIinterval | das aktuelle Abrufintervall der SolCast API (nur Model SolCastAPI) in Sekunden |
currentRunMtsConsumer_XX | die Laufzeit (Minuten) des Verbrauchers "XX" seit dem letzten Einschalten. (0 - Verbraucher ist aus) |
dayAfterTomorrowPVforecast | liefert die Vorhersage der PV Erzeugung für Übermorgen (sofern verfügbar) ohne Autokorrektur (Rohdaten). |
- daysUntilBatteryCare | Tage bis zur nächsten Batteriepflege (Erreichen der Ladung 'maxSoC' aus Attribut ctrlBatSocManagement) |
+ daysUntilBatteryCare | Tage bis zur nächsten Batteriepflege (Erreichen der Ladung 'maxSoC' aus Attribut ctrlBatSocManagement) |
lastretrieval_time | der letzte Abrufzeitpunkt der API (nur Model SolCastAPI, ForecastSolarAPI) |
lastretrieval_timestamp | der Timestamp der letzen Abrufzeitpunkt der API (nur Model SolCastAPI, ForecastSolarAPI) |
response_message | die letzte Statusmeldung der API (nur Model SolCastAPI, ForecastSolarAPI) |
@@ -19035,7 +19099,7 @@ die ordnungsgemäße Anlagenkonfiguration geprüft werden.
| in heute:statistic_todayBatIn |
| out heute:statistic_todayBatOut |
| : |
- | : |
+ | : |
| #Settings |
| Autokorrektur:pvCorrectionFactor_Auto : : : |
| Consumer<br>Neuplanung:consumerNewPlanning : : : |
@@ -19049,23 +19113,23 @@ die ordnungsgemäße Anlagenkonfiguration geprüft werden.
-
+
graphicHeaderOwnspecValForm
- Die mit dem Attribut graphicHeaderOwnspec anzuzeigenden
+ Die mit dem Attribut graphicHeaderOwnspec anzuzeigenden
Readings können mit sprintf und anderen Perl Operationen manipuliert werden.
Es stehen zwei grundsätzliche, miteinander nicht kombinierbare Möglichkeiten der Notation zur Verfügung.
- Die Angabe der Notationen erfolgt grundsätzlich innerhalb von zwei geschweiften Klammern {...}.
-
+ Die Angabe der Notationen erfolgt grundsätzlich innerhalb von zwei geschweiften Klammern {...}.
+
Notation 1:
- Eine einfache Formatierung von Readings des eigenen Devices mit sprintf erfolgt wie in Zeile
+ Eine einfache Formatierung von Readings des eigenen Devices mit sprintf erfolgt wie in Zeile
'Current_AutarkyRate' bzw. 'Current_GridConsumption' angegeben.
Andere Perl Operationen sind mit () zu klammern. Die jeweiligen Readingswerte und Einheiten stehen über
die Variablen $VALUE und $UNIT zur Verfügung.
- Readings anderer Devices werden durch die Angabe '<Device>.<Reading>' spezifiziert.
+ Readings anderer Devices werden durch die Angabe '<Device>.<Reading>' spezifiziert.
-
+
@@ -19079,13 +19143,13 @@ die ordnungsgemäße Anlagenkonfiguration geprüft werden.
-
+
Notation 2:
Die Manipulation von Readingwerten und Einheiten erfolgt über Perl If ... else Strukturen.
- Der Struktur stehen Device, Reading, Readingwert und Einheit mit den Variablen $DEVICE, $READING, $VALUE und
+ Der Struktur stehen Device, Reading, Readingwert und Einheit mit den Variablen $DEVICE, $READING, $VALUE und
$UNIT zur Verfügung.
Bei Änderung der Variablen werden die neuen Werte entsprechend in die Anzeige übernommen.
-
+
@@ -19100,7 +19164,7 @@ die ordnungsgemäße Anlagenkonfiguration geprüft werden.
| } |
} | |
-
+