From f5d3b9f593ae4656f318509ebe1f7d12ed11830d Mon Sep 17 00:00:00 2001 From: nasseeder1 Date: Sat, 2 Dec 2023 12:02:01 +0000 Subject: [PATCH] 76_SolarForecast: codechange ___getFWwidget git-svn-id: https://svn.fhem.de/fhem/trunk@28236 2b470e98-0d58-463d-a4d8-8e2adae1ed80 --- fhem/FHEM/76_SolarForecast.pm | 87 ++++++----- fhem/contrib/DS_Starter/76_SolarForecast.pm | 155 +++++++++----------- 2 files changed, 123 insertions(+), 119 deletions(-) diff --git a/fhem/FHEM/76_SolarForecast.pm b/fhem/FHEM/76_SolarForecast.pm index 4843626e5..04a456fdc 100644 --- a/fhem/FHEM/76_SolarForecast.pm +++ b/fhem/FHEM/76_SolarForecast.pm @@ -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 @ ", "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 @@ -9251,14 +9251,22 @@ sub ___getFWwidget { } } - if ($allc =~ /\s$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; @@ -9277,42 +9285,55 @@ sub ___getFWwidget { push @widgetreadings, $reading; readingsSingleUpdate ($defs{$name}, $reading, $current, 0); } + + $widget = ___widgetFallback ( { name => $name, + dev => $dev, + ctyp => $ctyp, + elm => $elm, + reading => $reading, + arg => $arg + } + ); - no strict "refs"; ## no critic 'NoStrict' - $widget = &{$webCmdFn} ($FW_wname, $name, '',$elm.' '.$reading, $arg); - use strict "refs"; - - if ($widget) { - my ($wc) = $widget =~ /current='(().*?)'/xs; # Eleminierung von störenden HTML Elementen aus aktuellem Readingwert - - if ($wc) { - $widget = (split "current=", $widget)[0]; - $widget .= qq{ current='^ESC^'>}; - } - - $widget =~ s,^]*>(.*)$,$1,xs; - $widget =~ s,>, type='$ctyp'>,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 =~ /(().*?)/xs) { # Eleminierung von störenden HTML Elementen aus aktuellem Readingwert + $current = ' '; + } + + $current =~ s/$elm //; + $current = ReplaceEventMap ($dev, $current, 1); + + return "
"; +} + ################################################################ # ownHeader ValueFormat ################################################################ diff --git a/fhem/contrib/DS_Starter/76_SolarForecast.pm b/fhem/contrib/DS_Starter/76_SolarForecast.pm index 4473ac0a7..04a456fdc 100644 --- a/fhem/contrib/DS_Starter/76_SolarForecast.pm +++ b/fhem/contrib/DS_Starter/76_SolarForecast.pm @@ -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 @ ", "1.3.0" => "27.11.2023 new Attr graphicHeaderOwnspecValForm ", "1.2.0" => "25.11.2023 graphicHeaderOwnspec: show readings of other devs by @, 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,74 +9244,96 @@ 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 push @widgetreadings, $reading; readingsSingleUpdate ($defs{$name}, $reading, $current, 0); } + + $widget = ___widgetFallback ( { name => $name, + dev => $dev, + ctyp => $ctyp, + elm => $elm, + reading => $reading, + arg => $arg + } + ); - no strict "refs"; ## no critic 'NoStrict' - $widget = &{$webCmdFn} ($FW_wname, $dev, "",$elm, $arg); - use strict "refs"; - - if ($widget) { - my ($wc) = $widget =~ /current='(().*?)'/xs; # Eleminierung von störenden HTML Elementen aus aktuellem Readingwert - - if ($wc) { - $widget = (split "current=", $widget)[0]; - $widget .= qq{ current='^ESC^'>}; - } - - $widget =~ s,^]*>(.*)$,$1,xs; - $widget =~ s,>, type='$ctyp'>,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 =~ /(().*?)/xs) { # Eleminierung von störenden HTML Elementen aus aktuellem Readingwert + $current = ' '; + } + + $current =~ s/$elm //; + $current = ReplaceEventMap ($dev, $current, 1); + + return "
"; +} + ################################################################ # ownHeader ValueFormat ################################################################