Anwendungsbeispiel JsonMod #6: eq3 / homematic firmware check

Begonnen von yersinia, 16 April 2020, 13:08:51

Vorheriges Thema - Nächstes Thema

wendeling

ok, ich sehe schon für die nicht IP Geräte werden wohl bald keine updates mehr angeboten.
Aber dann sollten die auch den Verkauf stoppen !

Versändnisfrage:
IP Geräte funktionieren ja nicht direkt mit FHEM wie die normalen Homatic Gerte ?!

richtig ?

Gruß
Wendelin

yersinia

#31
Zitat von: wendeling am 22 April 2020, 12:15:26
ok, ich sehe schon für die nicht IP Geräte werden wohl bald keine updates mehr angeboten.
Aber dann sollten die auch den Verkauf stoppen !
NEIN! Die nicht HmIP HM Geräte sollen schön im Verkauf bleiben, da es gut funktioniert, imho.
Denn: nicht für alle HM Geräte benötigt man zwingend immer neuere Firmware, zb für den HM-SEC-SCO. Was willste da mit neuer Firmware?

Zitat von: wendeling am 22 April 2020, 12:15:26Versändnisfrage:IP Geräte funktionieren ja nicht direkt mit FHEM wie die normalen Homatic Gerte ?!
Für diese Frage bitte einmal das Wiki bzw. das Board Homematic bemühen, das wird hier sonst OT. Für die HmIP Geräte hast du dann sowieso eine CCU die das mit der fw für dich regelt.
viele Grüße, yersinia
----
FHEM 6.3 (SVN) on RPi 4B with RasPi OS Bullseye (perl 5.32.1) | FTUI
nanoCUL->2x868(1x ser2net)@tsculfw, 1x433@Sduino | MQTT2 | Tasmota | ESPEasy
VCCU->14xSEC-SCo, 7xCC-RT-DN, 5xLC-Bl1PBU-FM, 3xTC-IT-WM-W-EU, 1xPB-2-WM55, 1xLC-Sw1PBU-FM, 1xES-PMSw1-Pl


yersinia

Zitat von: yersinia am 16 April 2020, 13:08:51Hier kommt es in einem -mir bekannten- Fall zu einem Missmatch weil eq-3 HM-LC-Bl1PBU-FM definiert, das entsprechende HM Device aber HM-LC-BL1PBU-FM beinhaltet.
Ich hab es geschafft, dieses Problem zu umgehen und kann nun eine bessere Lösung anbieten. Aktualisiertes RAW und erweiterte Details im ersten post.
viele Grüße, yersinia
----
FHEM 6.3 (SVN) on RPi 4B with RasPi OS Bullseye (perl 5.32.1) | FTUI
nanoCUL->2x868(1x ser2net)@tsculfw, 1x433@Sduino | MQTT2 | Tasmota | ESPEasy
VCCU->14xSEC-SCo, 7xCC-RT-DN, 5xLC-Bl1PBU-FM, 3xTC-IT-WM-W-EU, 1xPB-2-WM55, 1xLC-Sw1PBU-FM, 1xES-PMSw1-Pl

yersinia

Seit heute morgen gibt es eine neue JsonMod Revision 22651 mit neuen Funktionen.
Dies ermöglicht ein kleines Update zum homematic firmware check - post #1 ist aktualisiert.
Dank geht an herrmannj für die Weiterentwicklung von JsonMod! :)
viele Grüße, yersinia
----
FHEM 6.3 (SVN) on RPi 4B with RasPi OS Bullseye (perl 5.32.1) | FTUI
nanoCUL->2x868(1x ser2net)@tsculfw, 1x433@Sduino | MQTT2 | Tasmota | ESPEasy
VCCU->14xSEC-SCo, 7xCC-RT-DN, 5xLC-Bl1PBU-FM, 3xTC-IT-WM-W-EU, 1xPB-2-WM55, 1xLC-Sw1PBU-FM, 1xES-PMSw1-Pl

paul79

Hallo,

ich habe es wie vorn beschrieben eingerichtet und bekomme folgende Fehler:

2020.11.24 21:43:48 1: PERL WARNING: Use of uninitialized value $name in substitution (s///) at /usr/lib/arm-linux-gnueabihf/perl/5.24/Encode.pm line 105.
2020.11.24 21:43:48 1: PERL WARNING: Use of uninitialized value $name in exists at /usr/lib/arm-linux-gnueabihf/perl/5.24/Encode.pm line 108.
2020.11.24 21:43:48 1: PERL WARNING: Use of uninitialized value $name in lc at /usr/lib/arm-linux-gnueabihf/perl/5.24/Encode.pm line 109.
2020.11.24 21:43:48 1: PERL WARNING: Use of uninitialized value $find in exists at /usr/lib/arm-linux-gnueabihf/perl/5.24/Encode/Alias.pm line 25.
2020.11.24 21:43:48 1: PERL WARNING: Use of uninitialized value $find in hash element at /usr/lib/arm-linux-gnueabihf/perl/5.24/Encode/Alias.pm line 26.
2020.11.24 21:43:48 1: PERL WARNING: Use of uninitialized value $find in pattern match (m//) at /usr/lib/arm-linux-gnueabihf/perl/5.24/Encode/Alias.pm line 31.
2020.11.24 21:43:48 1: PERL WARNING: Use of uninitialized value $find in lc at /usr/lib/arm-linux-gnueabihf/perl/5.24/Encode/Alias.pm line 40.
2020.11.24 21:43:48 1: PERL WARNING: Use of uninitialized value $find in string eq at /usr/lib/arm-linux-gnueabihf/perl/5.24/Encode/Alias.pm line 44.
2020.11.24 21:43:48 1: PERL WARNING: Use of uninitialized value $find in hash element at /usr/lib/arm-linux-gnueabihf/perl/5.24/Encode/Alias.pm line 57.
2020.11.24 21:43:48 1: PERL WARNING: Use of uninitialized value $find in lc at /usr/lib/arm-linux-gnueabihf/perl/5.24/Encode/Alias.pm line 58.
2020.11.24 21:43:48 1: PERL WARNING: Use of uninitialized value $find in hash element at /usr/lib/arm-linux-gnueabihf/perl/5.24/Encode/Alias.pm line 77.
2020.11.24 21:43:48 1: PERL WARNING: Use of uninitialized value $name in string ne at /usr/lib/arm-linux-gnueabihf/perl/5.24/Encode.pm line 114.
2020.11.24 21:43:48 1: PERL WARNING: Use of uninitialized value $name in hash element at /usr/lib/arm-linux-gnueabihf/perl/5.24/Encode.pm line 118.
2020.11.24 21:43:48 1: PERL WARNING: Use of uninitialized value $a[1] in subtraction (-) at ./FHEM/99_Utils.pm line 21.


Weiß jemand was ich die Fehler weg bekomme?

Gruß Paul
FHEM5.7 auf Pi3
Busware CUL433 (IT), JeeLink Lacrosse, HM-MOD-RPI-PCB, HM, TabletUI

yersinia

Ich sehe erstmal keinen Zusammenhang zu diesem Template noch zu JsonMod. Mich wundert auch diese Pfadangabe:
/usr/lib/arm-linux-gnueabihf/perl/5.24/
Welches OS und Perl-Version nutzt du?

Kannst du bitte mal verbose auf 5 stellen und stacktrace einschalten sowie die Log-Ausgabe mit diesen Warnings posten?
viele Grüße, yersinia
----
FHEM 6.3 (SVN) on RPi 4B with RasPi OS Bullseye (perl 5.32.1) | FTUI
nanoCUL->2x868(1x ser2net)@tsculfw, 1x433@Sduino | MQTT2 | Tasmota | ESPEasy
VCCU->14xSEC-SCo, 7xCC-RT-DN, 5xLC-Bl1PBU-FM, 3xTC-IT-WM-W-EU, 1xPB-2-WM55, 1xLC-Sw1PBU-FM, 1xES-PMSw1-Pl

mcp

Hallo yersinia,

ich habe das von Dir mal für mich umgebaut damit HmIP Updates gefunden werden, ich habe nur Homematic IP Geräte, nichts von Homematic.

Ebenso musste ich an einer Stelle uc() benutzen da sonst das aktuelle Update für HmIP-FALMOT-C12 nicht gefunden wurde, sondern nur das für HMIP-PSM. Die Groß-/Kleinschreibung ist leider nicht durchweg konstant. Evtl. sollte man besser case-insensitive matchen.

Lange Rede kurzer Sinn: evtl. kannst Du das ja noch erweitern so daß Homematic und Homematic IP gemeinsam funktionieren können.

anyway, vielen Dank dafür :)
Maintainer: 98_vitoconnect.pm
Raspberry Pi 4B, 4 GB RAM, 32 GB SD Karte
Raspbian Bullseye 32-bit, FHEM up2date

yersinia

Danke für das wertvolle Feedback mcp!  :) Da ich kein HomematicIP habe, war mir das gar nicht bewusst.

Zitat von: mcp am 25 November 2020, 15:09:22Ebenso musste ich an einer Stelle uc() benutzen da sonst das aktuelle Update für HmIP-FALMOT-C12 nicht gefunden wurde, sondern nur das für HMIP-PSM. Die Groß-/Kleinschreibung ist leider nicht durchweg konstant. Evtl. sollte man besser case-insensitive matchen.

Lange Rede kurzer Sinn: evtl. kannst Du das ja noch erweitern so daß Homematic und Homematic IP gemeinsam funktionieren können.
Ich ging davon aus, dass alle Homematic-Devices, welche über CUL_HM definiert werden, eine Modellbezeichnung in Großbuchstaben haben (Quelle). Oder wird HmIP nicht über CUL_HM abgebildet?

Mich interessiert, was du wie umgebaut hast, damit es bei dir funktioniert.
Ich hätte jetzt einfach die Modellabfrage ebenfalls in uc() gepackt im userReadings Attribut (Zeile 11):
my $md = uc(AttrVal($dev,"model","?"));
Da Readings als auch das Device-model dann in Großbuchstaben sind, sollte das besser funktionieren.
viele Grüße, yersinia
----
FHEM 6.3 (SVN) on RPi 4B with RasPi OS Bullseye (perl 5.32.1) | FTUI
nanoCUL->2x868(1x ser2net)@tsculfw, 1x433@Sduino | MQTT2 | Tasmota | ESPEasy
VCCU->14xSEC-SCo, 7xCC-RT-DN, 5xLC-Bl1PBU-FM, 3xTC-IT-WM-W-EU, 1xPB-2-WM55, 1xLC-Sw1PBU-FM, 1xES-PMSw1-Pl

mcp

Hallo yersinia,

das Model und die Firmware sind bei HmIP in den Internals gespeichert, daher habe ich aus AttrVal InternalVal gemacht, die Abfrage der Devices mittels TYPE=HMCCUDEV und das DEF auf 14 Stellen erweitert, und ja, $md habe ich auch uppercased ... Sieht dann aber im Listing nicht mehr sooo schön aus, ich finde die Schreibweise HmIP sieht deutlich besser aus als HMIP - aber ist Geschmackssache :)

Hier ein Diff zwischen Deinem Code und meinen Änderungen:


--- old.txt     2020-11-25 15:30:49.572562527 +0100
+++ new.txt     2020-11-25 15:32:41.097183803 +0100
@@ -31,15 +31,15 @@ attr homematic_fw_check stateFormat {       my
          $ret .= '<br /><div style="display:table;;width:100%;;">';;\
                $ret .= '<div style="display:table-row;;">';;\
              $ret .= '<div style="display:table-cell;;'.$cellstyle.'width:50%;;font-weight:bold;;">device</div>';;\
-                 $ret .= '<div style="display:table-cell;;'.$cellstyle.'width:30%;;font-weight:bold;;">model</div>';;\
-                 $ret .= '<div style="display:table-cell;;'.$cellstyle.'width:10%;;font-weight:bold;;">current</div>';;\
-                 $ret .= '<div style="display:table-cell;;'.$cellstyle.'width:10%;;font-weight:bold;;">new</div>';;\
+                 $ret .= '<div style="display:table-cell;;'.$cellstyle.'width:40%;;font-weight:bold;;">model</div>';;\
+                 $ret .= '<div style="display:table-cell;;'.$cellstyle.'width:5%;;font-weight:bold;;">current</div>';;\
+                 $ret .= '<div style="display:table-cell;;'.$cellstyle.'width:5%;;font-weight:bold;;">new</div>';;\
                $ret .= '</div>';; #header\
       my @devices = split(' ',$check);;\
       foreach my $devStr (@devices) {\
            my ($dev,$readingStr) = $devStr =~ m/([^\s]+)[(]([^\s]+)[)]/;;\
                my $md = $readingStr;;\
-        my $ofw = AttrVal($dev,"firmware","0.0");;\
+        my $ofw = InternalVal($dev,"firmware","0.0");;\
         my $nfw = ReadingsVal($name,$md,"none");;\
                my $fw_link = "https://ccu3-update.homematic.com/firmware/download?cmd=download&serial=0&product=".$md;;\
                $ret .= '<div style="display:table-row;;" onmouseover="this.style.background=\''.$highlightcolor.'\';;" onmouseout="this.style.background=\'transparent\';;">';;\
@@ -61,7 +61,7 @@ attr homematic_fw_check stateFormat { my
       }\
          $ret .= '</div>';; #table\
     }\
-       $ret .= "<div style=\"text-align:left;;\">(next check: ".$nextCheck.")</div>";;\
+       $ret .= "<br><div style=\"text-align:left;;\">(next check: ".$nextCheck.")</div>";;\
        $ret .= '</div>';;\
   return $ret;;\
}
@@ -77,12 +77,12 @@ attr homematic_fw_check userReadings new
                                        HM-LC-SW1-DR HM-LC-BL1PBU-FM);; #cur_model fw_alias\
   if (ReadingsVal($name,".computedReadings","none") ne "none") {\
        my @devices = split(',',ReadingsVal($name,".computedReadings","none"));;\
-       foreach my $dev (devspec2array("TYPE=CUL_HM:FILTER=DEF=......:FILTER=subType!=(virtual|)")) {\
-         my $md = AttrVal($dev,"model","?");;\
+       foreach my $dev (devspec2array("TYPE=HMCCUDEV:FILTER=DEF=..............:FILTER=subType!=(virtual)")) {\
+         my $md = uc(InternalVal($dev,"ccutype","?"));;\
          if(($fwaliasmode eq "convert2Alias") && (exists($modelalias{$md}))) {\
                $md = $modelalias{$md};;\
          }\
-         my $v = AttrVal($dev,"firmware","0.0");;\
+         my $v = InternalVal($dev,"firmware","0.0");;\
          my ($h,$l) = split('\.',$v);;\
          if ((ReadingsVal($name,$md,"none") ne "none") || ($newfwonly eq "all")) {\
                my $fwv = ReadingsVal($name,$md,"0.0");;\



die erste Änderung im Diff ist nur damit es besser aussieht. Der Name HMIP-FALMOT-C12 ist zu lang für 30% ;)
die 3te Änderung mit dem <br> finde ich persönlich hübscher, dann ist der next check Text nicht direkt an dem Device Listing mit dran.

Maintainer: 98_vitoconnect.pm
Raspberry Pi 4B, 4 GB RAM, 32 GB SD Karte
Raspbian Bullseye 32-bit, FHEM up2date

yersinia

Cool. Danke. :) Das hab ich 1:1 so übernommen, aber als eigenes Template - mir ist noch nicht klar, wie man die beiden Selektionen zusammenführen könnte:
devspec2array("TYPE=CUL_HM:FILTER=DEF=......:FILTER=subType!=(virtual|)")
devspec2array("TYPE=HMCCUDEV:FILTER=DEF=..............:FILTER=subType!=(virtual)")
viele Grüße, yersinia
----
FHEM 6.3 (SVN) on RPi 4B with RasPi OS Bullseye (perl 5.32.1) | FTUI
nanoCUL->2x868(1x ser2net)@tsculfw, 1x433@Sduino | MQTT2 | Tasmota | ESPEasy
VCCU->14xSEC-SCo, 7xCC-RT-DN, 5xLC-Bl1PBU-FM, 3xTC-IT-WM-W-EU, 1xPB-2-WM55, 1xLC-Sw1PBU-FM, 1xES-PMSw1-Pl

mcp

TYPE=CUL_HM|HMCCUDEV:FILTER=DEF=(......|..............):FILTER=subType!=virtual

die Pipe nach virtual kann IMHO so oder so weg.

und dann evtl. in der Schleife via InternalVal abfragen ob TYPE CUL_HM oder HMCCUDEV ist und dann entsprechend AttrVal oder InternalVal für Model und Firmware Version abfragen.

oder AttrVal abfragen und wenn das leer ist InternalVal abfragen und wenn das auch leer ist erst einen default setzen.

... irgendwie so.

oder halt 2 Templates :)

Danke Dir.
Maintainer: 98_vitoconnect.pm
Raspberry Pi 4B, 4 GB RAM, 32 GB SD Karte
Raspbian Bullseye 32-bit, FHEM up2date

yersinia

#42
Zitat von: mcp am 25 November 2020, 16:30:15
TYPE=CUL_HM|HMCCUDEV:FILTER=DEF=(......|..............):FILTER=subType!=virtual

und dann evtl. in der Schleife via InternalVal abfragen ob TYPE CUL_HM oder HMCCUDEV ist und dann entsprechend AttrVal oder InternalVal für Model und Firmware Version abfragen.

oder AttrVal abfragen und wenn das leer ist InternalVal abfragen und wenn das auch leer ist erst einen default setzen.

oder halt 2 Templates :)
ja, sowas dachte ich auch! :) Kannst du das hier mal bei dir testen? Da pack ich die beiden devspec2array zusammen
defmod homematic_fw_check_TEST JsonMod https://update.homematic.com/firmware/api/firmware/search/DEVICE
attr homematic_fw_check_TEST userattr updatableDevicesMode:onlyUpdatable,all useFwAliasMode:normal,convert2Alias
attr homematic_fw_check_TEST interval 0 12 * * *
attr homematic_fw_check_TEST readingList multi(jsonPath('$[*]'), uc(property('type')), property('version'));;
attr homematic_fw_check_TEST room fw-checks
attr homematic_fw_check_TEST stateFormat { my $ret = "";;\
my $highlightcolor = "DarkSlateGray";;\
my $lastCheck = POSIX::strftime("%d.%m. %H:%M",localtime(time_str2num(ReadingsTimestamp($name,".computedReadings","2000-01-01 00:00:00"))));;\
my $nextCheck = POSIX::strftime("%d.%m. %H:%M",localtime(time_str2num(InternalVal($name,"NEXT","2000-01-01 00:00:00"))));;\
my $cellstyle = "padding:3pt;;border-bottom:1px dotted lightgray;;";;\
$ret .= '<div style="text-align:left;;">';;\
$ret .= '<div>last <a title="eq3-downloads" href="http://www.eq-3.de/service/downloads.html" rel="noopener noreferrer" target="_blank">homematic</a>-fw-check => ';;\
$ret .= $lastCheck;;\
$ret .= '</div>';;\
if(AttrVal($name,"updatableDevicesMode","") eq "all") {\
$ret .= "<div>Attribute <font style=\"color:yellow;;\">updatableDevicesMode</font> is set to <font style=\"color:yellow;;font-weight:bold;;\">all</font> = <font style=\"font-style:italic;;\">all found Devices</font> will be displayed.</div>";;\
}\
if(AttrVal($name,"useFwAliasMode","") eq "convert2Alias") {\
$ret .= "<div>Attribute <font style=\"color:yellow;;\">useFwAliasMode</font> is set to <font style=\"color:yellow;;font-weight:bold;;\">convert2Alias</font> = Device model is replaced where applicable.</div>";;\
}\
    my $check = ReadingsVal($name,"newFwForDevices","error => no or wrong data from eq3-server!");;\
    if($check eq "no fw-updates needed!") {\
      $ret .= '<div style="color:limegreen;;font-weight:bold;;">';;\
      $ret .= $check;;\
  $ret .= "</div>";;\
    } elsif($check eq "error => no or wrong data from eq3-server!") {\
      $ret .= '<div style="color:red;;font-weight:bold;;">';;\
      $ret .= $check;;\
      $ret .= '</div>';;\
    } else {\
  $ret .= '<br /><div style="display:table;;width:100%;;">';;\
$ret .= '<div style="display:table-row;;">';;\
      $ret .= '<div style="display:table-cell;;'.$cellstyle.'width:50%;;font-weight:bold;;">device</div>';;\
  $ret .= '<div style="display:table-cell;;'.$cellstyle.'width:40%;;font-weight:bold;;">model</div>';;\
  $ret .= '<div style="display:table-cell;;'.$cellstyle.'width:5%;;font-weight:bold;;">current</div>';;\
  $ret .= '<div style="display:table-cell;;'.$cellstyle.'width:5%;;font-weight:bold;;">new</div>';;\
$ret .= '</div>';; #header\
      my @devices = split(' ',$check);;\
      foreach my $devStr (@devices) {\
    my ($dev,$readingStr) = $devStr =~ m/([^\s]+)[(]([^\s]+)[)]/;;\
        #my $md = AttrVal($dev,"model","?");;\
my $md = $readingStr;;\
        my $ofw = InternalVal($dev,"firmware",AttrVal($dev,"firmware","0.0"));;\
        my $nfw = ReadingsVal($name,$md,"none");;\
my $fw_link = "https://ccu3-update.homematic.com/firmware/download?cmd=download&serial=0&product=".$md;;\
$ret .= '<div style="display:table-row;;" onmouseover="this.style.background=\''.$highlightcolor.'\';;" onmouseout="this.style.background=\'transparent\';;">';;\
$ret .= '<div style="display:table-cell;;'.$cellstyle.'width:50%;;">';;\
        $ret .= '<a href="/fhem?detail='.$dev.'" target="_blank">';;\
        $ret .= AttrVal($dev,"alias",$dev);;\
        $ret .= '</a></div>';;\
$ret .= '<div style="display:table-cell;;'.$cellstyle.'width:40%;;font-weight:bold;;color:lightgrey;;">';;\
        $ret .= $md;;\
        $ret .= '</div>';;\
$ret .= '<div style="display:table-cell;;'.$cellstyle.'width:5%;;font-weight:bold;;color:lightgrey;;">';;\
        $ret .= $ofw;;\
        $ret .= '</div>';;\
$ret .= '<div style="display:table-cell;;'.$cellstyle.'width:5%;;font-weight:bold;;color:red;;">';;\
        $ret .= '<a title="download firmware file" href="'.$fw_link.'" rel="noopener noreferrer" target="_blank" style="color:red;;">';;\
        $ret .= $nfw;;\
        $ret .= '</a></div>';;\
$ret .= '</div>';; #row\
      }\
  $ret .= '</div><br \/>';; #table\
    }\
$ret .= "<div style=\"text-align:left;;\">(next check: ".$nextCheck.")</div>";;\
$ret .= '</div>';;\
  return $ret;;\
}
attr homematic_fw_check_TEST updatableDevicesMode all
attr homematic_fw_check_TEST update-on-start 0
attr homematic_fw_check_TEST useFwAliasMode normal
attr homematic_fw_check_TEST userReadings newFwForDevices {\
  my $ret = "";;\
  my $newfwonly = AttrVal($name,"updatableDevicesMode","");;\
  my $fwaliasmode = AttrVal($name,"useFwAliasMode","");;\
  my %modelalias = qw(HM-LC-JAPBU-FM HM-LC-BL1PBU-FM\
  HM-LC-SW2PBU-FM HM-LC-BL1PBU-FM\
  HM-LC-SW1-DR HM-LC-BL1PBU-FM);; #cur_model fw_alias\
  if (ReadingsVal($name,".computedReadings","none") ne "none") {\
  my @devices = split(',',ReadingsVal($name,".computedReadings","none"));;\
my @hmdevs = devspec2array("TYPE=CUL_HM:FILTER=DEF=......:FILTER=subType!=virtual");;\
my @hmipdevs = devspec2array("TYPE=HMCCUDEV:FILTER=DEF=..............:FILTER=subType!=virtual");;\
push(@hmdevs, @hmipdevs);;\
foreach my $dev (@hmdevs) {\
  my $md = uc(InternalVal($dev,"ccutype",AttrVal($dev,"model","?")));;\
  if(($fwaliasmode eq "convert2Alias") && (exists($modelalias{$md}))) {\
  $md = $modelalias{$md};;\
  }\
  my $v = InternalVal($dev,"firmware",AttrVal($dev,"firmware","0.0"));;\
  my ($h,$l) = split('\.',$v);;\
  if ((ReadingsVal($name,$md,"none") ne "none") || ($newfwonly eq "all")) {\
my $fwv = ReadingsVal($name,$md,"0.0");;\
my ($fwh, $fwl) = split('\.',$fwv);;\
if(($newfwonly eq "all") || (($fwh > $h) || (($fwh == $h) && ($fwl > $l)))) {\
  $ret .= $dev."(".$md.") ";;\
}\
  }\
}\
  } else {\
$ret = "error => no or wrong data from eq3-server!";;\
  }\
  return ($ret eq "")?"no fw-updates needed!":$ret;;\
}
attr homematic_fw_check_TEST verbose 3
attr homematic_fw_check_TEST webCmd reread

Ich hab das bei mir getestet und das sieht erstmal gut aus.

Oder noch etwas einfacher (mit deinem devspec Vorschlag):
defmod homematic_fw_check_TEST JsonMod https://update.homematic.com/firmware/api/firmware/search/DEVICE
attr homematic_fw_check_TEST userattr updatableDevicesMode:onlyUpdatable,all useFwAliasMode:normal,convert2Alias
attr homematic_fw_check_TEST interval 0 12 * * *
attr homematic_fw_check_TEST readingList multi(jsonPath('$[*]'), uc(property('type')), property('version'));;
attr homematic_fw_check_TEST room fw-checks
attr homematic_fw_check_TEST stateFormat { my $ret = "";;\
my $highlightcolor = "DarkSlateGray";;\
my $lastCheck = POSIX::strftime("%d.%m. %H:%M",localtime(time_str2num(ReadingsTimestamp($name,".computedReadings","2000-01-01 00:00:00"))));;\
my $nextCheck = POSIX::strftime("%d.%m. %H:%M",localtime(time_str2num(InternalVal($name,"NEXT","2000-01-01 00:00:00"))));;\
my $cellstyle = "padding:3pt;;border-bottom:1px dotted lightgray;;";;\
$ret .= '<div style="text-align:left;;">';;\
$ret .= '<div>last <a title="eq3-downloads" href="http://www.eq-3.de/service/downloads.html" rel="noopener noreferrer" target="_blank">homematic</a>-fw-check => ';;\
$ret .= $lastCheck;;\
$ret .= '</div>';;\
if(AttrVal($name,"updatableDevicesMode","") eq "all") {\
$ret .= "<div>Attribute <font style=\"color:yellow;;\">updatableDevicesMode</font> is set to <font style=\"color:yellow;;font-weight:bold;;\">all</font> = <font style=\"font-style:italic;;\">all found Devices</font> will be displayed.</div>";;\
}\
if(AttrVal($name,"useFwAliasMode","") eq "convert2Alias") {\
$ret .= "<div>Attribute <font style=\"color:yellow;;\">useFwAliasMode</font> is set to <font style=\"color:yellow;;font-weight:bold;;\">convert2Alias</font> = Device model is replaced where applicable.</div>";;\
}\
    my $check = ReadingsVal($name,"newFwForDevices","error => no or wrong data from eq3-server!");;\
    if($check eq "no fw-updates needed!") {\
      $ret .= '<div style="color:limegreen;;font-weight:bold;;">';;\
      $ret .= $check;;\
  $ret .= "</div>";;\
    } elsif($check eq "error => no or wrong data from eq3-server!") {\
      $ret .= '<div style="color:red;;font-weight:bold;;">';;\
      $ret .= $check;;\
      $ret .= '</div>';;\
    } else {\
  $ret .= '<br /><div style="display:table;;width:100%;;">';;\
$ret .= '<div style="display:table-row;;">';;\
      $ret .= '<div style="display:table-cell;;'.$cellstyle.'width:50%;;font-weight:bold;;">device</div>';;\
  $ret .= '<div style="display:table-cell;;'.$cellstyle.'width:40%;;font-weight:bold;;">model</div>';;\
  $ret .= '<div style="display:table-cell;;'.$cellstyle.'width:5%;;font-weight:bold;;">current</div>';;\
  $ret .= '<div style="display:table-cell;;'.$cellstyle.'width:5%;;font-weight:bold;;">new</div>';;\
$ret .= '</div>';; #header\
      my @devices = split(' ',$check);;\
      foreach my $devStr (@devices) {\
    my ($dev,$readingStr) = $devStr =~ m/([^\s]+)[(]([^\s]+)[)]/;;\
        #my $md = AttrVal($dev,"model","?");;\
my $md = $readingStr;;\
        my $ofw = InternalVal($dev,"firmware",AttrVal($dev,"firmware","0.0"));;\
        my $nfw = ReadingsVal($name,$md,"none");;\
my $fw_link = "https://ccu3-update.homematic.com/firmware/download?cmd=download&serial=0&product=".$md;;\
$ret .= '<div style="display:table-row;;" onmouseover="this.style.background=\''.$highlightcolor.'\';;" onmouseout="this.style.background=\'transparent\';;">';;\
$ret .= '<div style="display:table-cell;;'.$cellstyle.'width:50%;;">';;\
        $ret .= '<a href="/fhem?detail='.$dev.'" target="_blank">';;\
        $ret .= AttrVal($dev,"alias",$dev);;\
        $ret .= '</a></div>';;\
$ret .= '<div style="display:table-cell;;'.$cellstyle.'width:40%;;font-weight:bold;;color:lightgrey;;">';;\
        $ret .= $md;;\
        $ret .= '</div>';;\
$ret .= '<div style="display:table-cell;;'.$cellstyle.'width:5%;;font-weight:bold;;color:lightgrey;;">';;\
        $ret .= $ofw;;\
        $ret .= '</div>';;\
$ret .= '<div style="display:table-cell;;'.$cellstyle.'width:5%;;font-weight:bold;;color:red;;">';;\
        $ret .= '<a title="download firmware file" href="'.$fw_link.'" rel="noopener noreferrer" target="_blank" style="color:red;;">';;\
        $ret .= $nfw;;\
        $ret .= '</a></div>';;\
$ret .= '</div>';; #row\
      }\
  $ret .= '</div><br \/>';; #table\
    }\
$ret .= "<div style=\"text-align:left;;\">(next check: ".$nextCheck.")</div>";;\
$ret .= '</div>';;\
  return $ret;;\
}
attr homematic_fw_check_TEST updatableDevicesMode all
attr homematic_fw_check_TEST update-on-start 0
attr homematic_fw_check_TEST useFwAliasMode normal
attr homematic_fw_check_TEST userReadings newFwForDevices {\
  my $ret = "";;\
  my $newfwonly = AttrVal($name,"updatableDevicesMode","");;\
  my $fwaliasmode = AttrVal($name,"useFwAliasMode","");;\
  my %modelalias = qw(HM-LC-JAPBU-FM HM-LC-BL1PBU-FM\
  HM-LC-SW2PBU-FM HM-LC-BL1PBU-FM\
  HM-LC-SW1-DR HM-LC-BL1PBU-FM);; #cur_model fw_alias\
  if (ReadingsVal($name,".computedReadings","none") ne "none") {\
  my @devices = split(',',ReadingsVal($name,".computedReadings","none"));;\
foreach my $dev (devspec2array("TYPE=CUL_HM|HMCCUDEV:FILTER=DEF=(......|..............):FILTER=subType!=virtual")) {\
  my $md = uc(InternalVal($dev,"ccutype",AttrVal($dev,"model","?")));;\
  if(($fwaliasmode eq "convert2Alias") && (exists($modelalias{$md}))) {\
  $md = $modelalias{$md};;\
  }\
  my $v = InternalVal($dev,"firmware",AttrVal($dev,"firmware","0.0"));;\
  my ($h,$l) = split('\.',$v);;\
  if ((ReadingsVal($name,$md,"none") ne "none") || ($newfwonly eq "all")) {\
my $fwv = ReadingsVal($name,$md,"0.0");;\
my ($fwh, $fwl) = split('\.',$fwv);;\
if(($newfwonly eq "all") || (($fwh > $h) || (($fwh == $h) && ($fwl > $l)))) {\
  $ret .= $dev."(".$md.") ";;\
}\
  }\
}\
  } else {\
$ret = "error => no or wrong data from eq3-server!";;\
  }\
  return ($ret eq "")?"no fw-updates needed!":$ret;;\
}
attr homematic_fw_check_TEST verbose 3
attr homematic_fw_check_TEST webCmd reread

Scheint bei mir auch zu funktionieren.
viele Grüße, yersinia
----
FHEM 6.3 (SVN) on RPi 4B with RasPi OS Bullseye (perl 5.32.1) | FTUI
nanoCUL->2x868(1x ser2net)@tsculfw, 1x433@Sduino | MQTT2 | Tasmota | ESPEasy
VCCU->14xSEC-SCo, 7xCC-RT-DN, 5xLC-Bl1PBU-FM, 3xTC-IT-WM-W-EU, 1xPB-2-WM55, 1xLC-Sw1PBU-FM, 1xES-PMSw1-Pl

mcp

#43
habe die 2te Variante getestet, klappt out-of-the-box :)

wenn das für dich auch klappt würde ich sagen haben wir nun HM und HmIP in einem :)

Herzlichen Dank.

Wollte es eigentlich noch bei einem Freund testen der HM-only hat, aber sein FHEM ist leider asbach-uralt, das funktioniert da nicht wirklich - muss er halt mal updaten (Chris: update doch mal ;-))
Maintainer: 98_vitoconnect.pm
Raspberry Pi 4B, 4 GB RAM, 32 GB SD Karte
Raspbian Bullseye 32-bit, FHEM up2date

yersinia

Zitat von: mcp am 25 November 2020, 16:55:50habe die 2te Variante getestet, klappt out-of-the-box :)

wenn das für dich auch klappt würde ich sagen haben wir nun HM und HmIP in einem :)
DANK DIR für das Feedback, Input und Testen! :D

Hab den ersten Post entsprechend aktualisiert.
viele Grüße, yersinia
----
FHEM 6.3 (SVN) on RPi 4B with RasPi OS Bullseye (perl 5.32.1) | FTUI
nanoCUL->2x868(1x ser2net)@tsculfw, 1x433@Sduino | MQTT2 | Tasmota | ESPEasy
VCCU->14xSEC-SCo, 7xCC-RT-DN, 5xLC-Bl1PBU-FM, 3xTC-IT-WM-W-EU, 1xPB-2-WM55, 1xLC-Sw1PBU-FM, 1xES-PMSw1-Pl