2
0
mirror of https://github.com/fhem/fhem-mirror.git synced 2025-03-10 09:16:53 +00:00

76_SolarForecast: codechange ___getFWwidget

git-svn-id: https://svn.fhem.de/fhem/trunk@28236 2b470e98-0d58-463d-a4d8-8e2adae1ed80
This commit is contained in:
nasseeder1 2023-12-02 12:02:01 +00:00
parent 06e8a926df
commit f5d3b9f593
2 changed files with 123 additions and 119 deletions

View File

@ -116,6 +116,7 @@ BEGIN {
ReadingsTimestamp
ReadingsVal
RemoveInternalTimer
ReplaceEventMap
readingFnAttributes
setKeyValue
sortTopicNum
@ -126,7 +127,6 @@ BEGIN {
FW_pH
FW_room
FW_detail
FW_widgetFallbackFn
FW_widgetOverride
FW_wname
)
@ -151,6 +151,7 @@ BEGIN {
# Versions History intern
my %vNotesIntern = (
"1.4.2" => "02.12.2023 ___getFWwidget: codechange ___getFWwidget using __widgetFallback function ",
"1.4.1" => "01.12.2023 ___getFWwidget: adjust for FHEMWEB feature forum:#136019 ",
"1.4.0" => "29.11.2023 graphicHeaderOwnspec: can manage attr / sets of other devs by <attr|set>@<dev> ",
"1.3.0" => "27.11.2023 new Attr graphicHeaderOwnspecValForm ",
@ -457,7 +458,6 @@ my $kJtokWh = 0.00027778;
my $defmaxvar = 0.5; # max. Varianz pro Tagesberechnung Autokorrekturfaktor
my $definterval = 70; # Standard Abfrageintervall
my $defslidenum = 3; # max. Anzahl der Arrayelemente in Schieberegistern
my $webCmdFn = 'FW_widgetFallbackFn'; # FHEMWEB Widgets Funktion
my @widgetreadings = (); # Array der Hilfsreadings als Attributspeicher
my $pvhcache = $attr{global}{modpath}."/FHEM/FhemUtils/PVH_SolarForecast_"; # Filename-Fragment für PV History (wird mit Devicename ergänzt)
@ -9233,7 +9233,7 @@ return $ownv;
sub ___getFWwidget {
my $name = shift;
my $dev = shift // $name; # Device des Elements, default=$name
my $elm = shift; # zu prüfendes Element
my $elm = shift; # zu prüfendes Element (setter / attribut)
my $allc = shift; # Kommandovorrat -> ist Element enthalten?
my $ctyp = shift // 'set'; # Kommandotyp: set/attr
@ -9253,12 +9253,20 @@ sub ___getFWwidget {
if ($allc =~ /\s$elm:?(.*?)\s/xs) { # Element in allen Sets oder Attr enthalten
my $arg = $1;
$arg = 'textFieldNL' if(!$arg);
if (!$arg || $arg eq 'textField' || $arg eq 'textField-long') { # Label (Reading) ausblenden -> siehe fhemweb.js function FW_createTextField Zeile 1657
$arg = 'textFieldNL';
}
if ($arg !~ /^\#/xs && $arg !~ /^$allwidgets/xs) {
$arg = '#,'.$arg;
}
if ($arg =~ 'slider') { # Widget slider in selectnumbers für Kopfgrafik umsetzen
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;
@ -9278,41 +9286,54 @@ sub ___getFWwidget {
readingsSingleUpdate ($defs{$name}, $reading, $current, 0);
}
no strict "refs"; ## no critic 'NoStrict'
$widget = &{$webCmdFn} ($FW_wname, $name, '',$elm.' '.$reading, $arg);
use strict "refs";
if ($widget) {
my ($wc) = $widget =~ /current='((<td|<div|<\/div>).*?)'/xs; # Eleminierung von störenden HTML Elementen aus aktuellem Readingwert
if ($wc) {
$widget = (split "current=", $widget)[0];
$widget .= qq{ current='^ESC^'></div></td>};
$widget = ___widgetFallback ( { name => $name,
dev => $dev,
ctyp => $ctyp,
elm => $elm,
reading => $reading,
arg => $arg
}
);
$widget =~ s,^<td[^>]*>(.*)</td>$,$1,xs;
$widget =~ s,></div>, type='$ctyp'></div>,xs;
}
else {
if (!$widget) {
$widget = FW_pH ("cmd=$ctyp $dev $elm", $elm, 0, "", 1, 1);
}
my ($sc) = $widget =~ /dev='(.*?)'/xs; # Device in Widget korrigieren/sublimieren
$widget =~ s/$sc/$dev/ if(defined $sc);
if ($arg eq 'textField' || $arg eq 'textField-long') { # Label (Reading) ausblenden -> siehe fhemweb.js function FW_createTextField Zeile 1657
$widget =~ s/arg='textField/arg='textFieldNL/xs;
}
if ($arg =~ 'slider') { # Widget slider in selectnumbers für Kopfgrafik umsetzen
my ($wid, $min, $step, $max, $float) = split ",", $arg;
$widget =~ s/arg='(.*?)'/arg='selectnumbers,$min,$step,$max,0,lin'/xs;
}
}
return $widget;
}
################################################################
# adaptierte FW_widgetFallbackFn aus FHEMWEB
################################################################
sub ___widgetFallback {
my $pars = shift;
my $name = $pars->{name};
my $dev = $pars->{dev};
my $ctyp = $pars->{ctyp};
my $elm = $pars->{elm};
my $reading = $pars->{reading};
my $arg = $pars->{arg};
return '' if(!$arg || $arg eq "noArg");
my $current = ReadingsVal ($name, $reading, undef);
if (!defined $current) {
$reading = 'state';
}
if ($current =~ /((<td|<div|<\/div>).*?)/xs) { # Eleminierung von störenden HTML Elementen aus aktuellem Readingwert
$current = ' ';
}
$current =~ s/$elm //;
$current = ReplaceEventMap ($dev, $current, 1);
return "<div class='fhemWidget' cmd='$elm' reading='$reading' ".
"dev='$dev' arg='$arg' current='$current' type='$ctyp'></div>";
}
################################################################
# ownHeader ValueFormat
################################################################

View File

@ -116,6 +116,7 @@ BEGIN {
ReadingsTimestamp
ReadingsVal
RemoveInternalTimer
ReplaceEventMap
readingFnAttributes
setKeyValue
sortTopicNum
@ -126,7 +127,6 @@ BEGIN {
FW_pH
FW_room
FW_detail
FW_widgetFallbackFn
FW_widgetOverride
FW_wname
)
@ -151,6 +151,8 @@ BEGIN {
# Versions History intern
my %vNotesIntern = (
"1.4.2" => "02.12.2023 ___getFWwidget: codechange ___getFWwidget using __widgetFallback function ",
"1.4.1" => "01.12.2023 ___getFWwidget: adjust for FHEMWEB feature forum:#136019 ",
"1.4.0" => "29.11.2023 graphicHeaderOwnspec: can manage attr / sets of other devs by <attr|set>@<dev> ",
"1.3.0" => "27.11.2023 new Attr graphicHeaderOwnspecValForm ",
"1.2.0" => "25.11.2023 graphicHeaderOwnspec: show readings of other devs by <reaging>@<dev>, Set/reset batteryTrigger ",
@ -456,7 +458,6 @@ my $kJtokWh = 0.00027778;
my $defmaxvar = 0.5; # max. Varianz pro Tagesberechnung Autokorrekturfaktor
my $definterval = 70; # Standard Abfrageintervall
my $defslidenum = 3; # max. Anzahl der Arrayelemente in Schieberegistern
my $webCmdFn = 'FW_widgetFallbackFn'; # FHEMWEB Widgets Funktion
my @widgetreadings = (); # Array der Hilfsreadings als Attributspeicher
my $pvhcache = $attr{global}{modpath}."/FHEM/FhemUtils/PVH_SolarForecast_"; # Filename-Fragment für PV History (wird mit Devicename ergänzt)
@ -1096,49 +1097,9 @@ sub Initialize {
# $hash->{FW_addDetailToSummary} = 1;
# $hash->{FW_atPageEnd} = 1; # wenn 1 -> kein Longpoll ohne informid in HTML-Tag
$hash->{AttrRenameMap} = { "beam1Color" => "graphicBeam1Color",
"beam1Content" => "graphicBeam1Content",
"beam1FontColor" => "graphicBeam1FontColor",
"beam2Color" => "graphicBeam2Color",
"beam2Content" => "graphicBeam2Content",
"beam2FontColor" => "graphicBeam2FontColor",
"beamHeight" => "graphicBeamHeight",
"beamWidth" => "graphicBeamWidth",
"historyHour" => "graphicHistoryHour",
"hourCount" => "graphicHourCount",
"hourStyle" => "graphicHourStyle",
"layoutType" => "graphicLayoutType",
"maxValBeam" => "graphicBeam1MaxVal",
"showDiff" => "graphicShowDiff",
"showNight" => "graphicShowNight",
"showWeather" => "graphicShowWeather",
"spaceSize" => "graphicSpaceSize",
"weatherColor" => "graphicWeatherColor",
"weatherColorNight" => "graphicWeatherColorNight",
"htmlStart" => "graphicStartHtml",
"htmlEnd" => "graphicEndHtml",
"showHeader" => "headerShow",
"headerDetail" => "graphicHeaderDetail",
"headerShow" => "graphicHeaderShow",
"cloudFactorDamping" => "affectCloudfactorDamping",
"rainFactorDamping" => "affectRainfactorDamping",
"numHistDays" => "affectNumHistDays",
"maxVariancePerDay" => "affectMaxDayVariance",
"follow70percentRule"=> "affect70percentRule",
"Wh_kWh" => "graphicEnergyUnit",
"autoRefreshFW" => "ctrlAutoRefreshFW",
"autoRefresh" => "ctrlAutoRefresh",
"showLink" => "ctrlShowLink",
"debug" => "ctrlDebug",
"optimizeSolCastAPIreqInterval" => "ctrlOptimizeSolCastInterval",
"interval" => "ctrlInterval",
"createStatisticReadings" => "ctrlStatisticReadings",
"createConsumptionRecReadings" => "ctrlConsRecommendReadings",
"createTomorrowPVFcReadings" => "ctrlNextDayForecastReadings",
"preferredChargeBattery" => "affectBatteryPreferredCharge",
"sameWeekdaysForConsfc" => "affectConsForecastIdentWeekdays",
"ctrlOptimizeSolCastInterval" => "ctrlSolCastAPIoptimizeReq",
};
# $hash->{AttrRenameMap} = { "beam1Color" => "graphicBeam1Color",
# "beam1Content" => "graphicBeam1Content",
# };
eval { FHEM::Meta::InitMod( __FILE__, $hash ) }; ## no critic 'eval'
@ -9155,8 +9116,8 @@ sub __createOwnSpec {
return if(!$spec || !$show);
my $allsets = FW_widgetOverride ($name, getAllSets ($name), 'set')." ";
my $allattrs = FW_widgetOverride ($name, getAllAttr ($name), 'attr')." "; # Leerzeichen am Ende wichtig für Regexvergleich
my $allsets = ' '.FW_widgetOverride ($name, getAllSets ($name), 'set').' ';
my $allattrs = ' '.FW_widgetOverride ($name, getAllAttr ($name), 'attr').' '; # Leerzeichen wichtig für Regexvergleich
my @fields = split (/\s+/sx, $spec);
@ -9272,7 +9233,7 @@ return $ownv;
sub ___getFWwidget {
my $name = shift;
my $dev = shift // $name; # Device des Elements, default=$name
my $elm = shift; # zu prüfendes Element
my $elm = shift; # zu prüfendes Element (setter / attribut)
my $allc = shift; # Kommandovorrat -> ist Element enthalten?
my $ctyp = shift // 'set'; # Kommandotyp: set/attr
@ -9283,28 +9244,41 @@ sub ___getFWwidget {
if ($dev ne $name) { # Element eines anderen Devices verarbeiten
if ($ctyp eq 'set') {
$allc = FW_widgetOverride ($dev, getAllSets($dev), 'set')." "; # Leerzeichen am Ende wichtig für Regexvergleich
$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 =~ /$elm:?(.*?)\s/xs) { # Element in allen Sets oder Attr enthalten
if ($allc =~ /\s$elm:?(.*?)\s/xs) { # Element in allen Sets oder Attr enthalten
my $arg = $1;
$arg = 'textFieldNL' if(!$arg);
if (!$arg || $arg eq 'textField' || $arg eq 'textField-long') { # Label (Reading) ausblenden -> siehe fhemweb.js function FW_createTextField Zeile 1657
$arg = 'textFieldNL';
}
if ($arg !~ /^\#/xs && $arg !~ /^$allwidgets/xs) {
$arg = '#,'.$arg;
}
if ($arg =~ 'slider') { # Widget slider in selectnumbers für Kopfgrafik umsetzen
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 { # leeren Dummy-Wert als verstecktes Reading abbilden wenn Set-Kommando nicht als gleichnamiges Reading existiert
else {
$current = ReadingsVal ($dev, $elm, '');
$reading = '.'.$dev.'_'.$elm if(!$current);
if($dev ne $name) {
$reading = '.'.$dev.'_'.$elm; # verstecktes Reading in SolCast abbilden wenn Set-Kommando aus fremden Device
}
else {
$reading = $elm;
}
}
if ($reading && $reading =~ /^\./xs) { # verstecktes Reading für spätere Löschung merken
@ -9312,45 +9286,54 @@ sub ___getFWwidget {
readingsSingleUpdate ($defs{$name}, $reading, $current, 0);
}
no strict "refs"; ## no critic 'NoStrict'
$widget = &{$webCmdFn} ($FW_wname, $dev, "",$elm, $arg);
use strict "refs";
if ($widget) {
my ($wc) = $widget =~ /current='((<td|<div|<\/div>).*?)'/xs; # Eleminierung von störenden HTML Elementen aus aktuellem Readingwert
if ($wc) {
$widget = (split "current=", $widget)[0];
$widget .= qq{ current='^ESC^'></div></td>};
$widget = ___widgetFallback ( { name => $name,
dev => $dev,
ctyp => $ctyp,
elm => $elm,
reading => $reading,
arg => $arg
}
);
$widget =~ s,^<td[^>]*>(.*)</td>$,$1,xs;
$widget =~ s,></div>, type='$ctyp'></div>,xs;
}
else {
if (!$widget) {
$widget = FW_pH ("cmd=$ctyp $dev $elm", $elm, 0, "", 1, 1);
}
eval { # Vorbelegung der Anzeige korrigieren/sublimieren
my ($sc) = $widget =~ /current='(.*?)'/xs;
my ($sr) = $widget =~ /reading='(.*?)'/xs;
$widget =~ s/$sc/$current/ if(defined $sc && defined $current);
$widget =~ s/$sr/$reading/ if(defined $sr && defined $reading);
};
if ($arg eq 'textField' || $arg eq 'textField-long') { # Label (Reading) ausblenden -> siehe fhemweb.js function FW_createTextField Zeile 1657
$widget =~ s/arg='textField/arg='textFieldNL/xs;
}
if ($arg =~ 'slider') { # Widget slider in selectnumbers für Kopfgrafik umsetzen
my ($wid, $min, $step, $max, $float) = split ",", $arg;
$widget =~ s/arg='(.*?)'/arg='selectnumbers,$min,$step,$max,0,lin'/xs;
}
}
return $widget;
}
################################################################
# adaptierte FW_widgetFallbackFn aus FHEMWEB
################################################################
sub ___widgetFallback {
my $pars = shift;
my $name = $pars->{name};
my $dev = $pars->{dev};
my $ctyp = $pars->{ctyp};
my $elm = $pars->{elm};
my $reading = $pars->{reading};
my $arg = $pars->{arg};
return '' if(!$arg || $arg eq "noArg");
my $current = ReadingsVal ($name, $reading, undef);
if (!defined $current) {
$reading = 'state';
}
if ($current =~ /((<td|<div|<\/div>).*?)/xs) { # Eleminierung von störenden HTML Elementen aus aktuellem Readingwert
$current = ' ';
}
$current =~ s/$elm //;
$current = ReplaceEventMap ($dev, $current, 1);
return "<div class='fhemWidget' cmd='$elm' reading='$reading' ".
"dev='$dev' arg='$arg' current='$current' type='$ctyp'></div>";
}
################################################################
# ownHeader ValueFormat
################################################################