diff --git a/fhem/contrib/DS_Starter/76_SolarForecast.pm b/fhem/contrib/DS_Starter/76_SolarForecast.pm index 268e29ed6..1a6c52541 100644 --- a/fhem/contrib/DS_Starter/76_SolarForecast.pm +++ b/fhem/contrib/DS_Starter/76_SolarForecast.pm @@ -162,7 +162,8 @@ BEGIN { my %vNotesIntern = ( "1.59.6" => "20.10.2025 ___ownSpecGetFWwidget: handling of line breaks in attributes & can hamdle a key=value pair separateley ". "Width of a text field in graphicHeaderOwnspec fixed to 10 ". - "__batChargeOptTargetPower: use an average for the charging power if optPower set and charging target are not achievable ", + "__batChargeOptTargetPower: use an average for the charging power if optPower set and charging target are not achievable ". + "__createOwnSpec: an empty field can be created within a line by simply using a colon (:). ", "1.59.5" => "15.10.2025 new sub ___batAdjustPowerByMargin: implement optPower Safety margin decreasing proportionally to the linear surplus ". "new Reading Battery_TargetAchievable_XX, _batSocTarget: minor code change ", "1.59.4" => "14.10.2025 new subs, ctrlBatSocManagementXX: new key loadTarget, replace __batCapShareFactor by __batDeficitShareFactor ". @@ -12223,8 +12224,8 @@ sub __batChargeOptTargetPower { $hsurp->{$hod}{$sbn}{pneedmin} = $pneedmin > 0 ? $pneedmin : 0; # Ladeleistung abhängig von Ziel-SoC Erfüllung - ## NextHour 00 bearbeiten - ########################### + ## NextHour 00 (aktuelle Stunde) behandeln + ############################################ if ($nhr eq '00') { my $target = $needraw > 0 ? $needraw / $befficiency : 0; # Zielleistung mit Batterie Effizienzgrad erhöhen @@ -16899,10 +16900,10 @@ sub __createOwnSpec { push @vals, $f; } - my $ownv; - my $cakey; - my $rows = ceil (scalar(@vals) / $vinr); - my $col = 0; + my ($ownv, $cakey); + my $isize = INPUTSIZE; + my $rows = ceil (scalar(@vals) / $vinr); + my $col = 0; for (my $i = 1 ; $i <= $rows; $i++) { my ($h, $v, $u); @@ -16913,19 +16914,21 @@ sub __createOwnSpec { $h->{$k}{elm} //= ''; my ($elm, $dev) = split "@", $h->{$k}{elm}; # evtl. anderes Devices $dev //= $name; - - ($elm, $cakey) = split "->", $elm; # zusammengesetztes Attribut: gewünschtes Schlüssel identifizieren + $elm //= ''; + ($elm, $cakey) = split "->", $elm; # zusammengesetztes Attribut: gewünschten Schlüssel identifizieren $col++; - if (!$h->{$k}{label}) { - undef $h->{$k}{label}; - next; + if (!defined $h->{$k}{label}) { + #undef $h->{$k}{label}; + $h->{$k}{label} = ''; + #next; + $h->{$k}{elm} = ''; } ## Set-Kommandos identifizieren ################################# - my $setcmd = ___ownSpecGetFWwidget ($name, $dev, $elm, $allsets, 'set', $cakey); + my $setcmd = ___ownSpecGetFWwidget ($name, $dev, $elm, $allsets, 'set', $cakey, $isize); if ($setcmd) { if ($pah) { # bei get pageAsHtml setter/attr nicht anzeigen (js Fehler) @@ -16942,7 +16945,7 @@ sub __createOwnSpec { ## Attr-Kommandos identifizieren ################################## - my $attrcmd = ___ownSpecGetFWwidget ($name, $dev, $elm, $allattrs, 'attr', $cakey); + my $attrcmd = ___ownSpecGetFWwidget ($name, $dev, $elm, $allattrs, 'attr', $cakey, $isize); if ($attrcmd) { if ($pah) { # bei get pageAsHtml setter/attr nicht anzeigen (js Fehler) @@ -16959,11 +16962,13 @@ sub __createOwnSpec { ## Reading identifizieren ########################### - $v->{$k} = ReadingsVal ($dev, $elm, undef); + if ($elm) { + $v->{$k} = ReadingsVal ($dev, $elm, undef); - if (defined $v->{$k} && $v->{$k} =~ /^\s*(-?\d+(\.\d+)?)/xs) { - ($v->{$k}, $u->{$k}) = split /\s+/, ReadingsVal ($dev, $elm, ''); # Value und Unit trennen wenn Value numerisch - } + if (defined $v->{$k} && $v->{$k} =~ /^\s*(-?\d+(\.\d+)?)/xs) { + ($v->{$k}, $u->{$k}) = split /\s+/, ReadingsVal ($dev, $elm, ''); # Value und Unit trennen wenn Value numerisch + } + } $u->{$k} //= q{}; @@ -17000,10 +17005,10 @@ sub __createOwnSpec { $ownv .= "