eq3 firmware check funkioniert nicht mehr

Begonnen von slor, 25 Oktober 2017, 23:34:14

Vorheriges Thema - Nächstes Thema

mar3d@RPi3

#165
 :o ich bin aber noch am basteln  ;D
Internals:
   DEF        ([$SELF:state] eq "update")
({
my $MODEL = "HM-TC-IT-WM-W-EU";
my $model = "hm_tc_it_wm_w_eu";
my $version = "V1_4_002";
my $file = $model."_update_".$version."_171018.tgz";
fhem ("setreading $SELF File $file");
## my $fw = "";
my $ls = `ls ./Downloads`;
if ($ls =~ $file) {
fhem ("setreading $SELF Downloadinfo Datei vorhanden, kein Download")
}
else {
## system("wget https://www.eq-3.de/Downloads/Software/Firmware/$file -P ./Downloads -o ./Downloads/HM_FwUpdate.dlinfo");
##neuer Link#https://ccu3-update.homematic.com/firmware/download?cmd=download&serial=0&product=$model
system("wget https://ccu3-update.homematic.com/firmware/download?cmd=download&serial=0&product=$model -P ./Downloads -o ./Downloads/HM_FwUpdate.dlinfo");
my $downloadinfo = `cat ./Downloads/HM_FwUpdate.dlinfo`;
fhem ("setreading $SELF Downloadinfo $downloadinfo");
## system("tar xvzf $file")
}
## fhem ("set HM_618409 fwUpdate ./Download/$fw")
})
   FUUID      5e3ec562-f33f-0125-c815-cc801e115a89c0b2
   MODEL      FHEM
   NAME       HM_FwUpdate_doif
   NOTIFYDEV  HM_FwUpdate_doif,global
   NR         897
   NTFY_ORDER 50-HM_FwUpdate_doif
   STATE      initialized
   TYPE       DOIF
   VERSION    20929 2020-01-10 09:44:35
   .attraggr:
   .attrminint:
   READINGS:
     2020-02-15 12:53:21   cmd             0
     2020-02-08 19:43:36   downloadinfo    Datei vorhanden, kein Download
     2020-02-08 19:33:56   file            HM-TC-IT-WM-W-EU-1.4.2.tgz
     2020-02-15 12:53:21   mode            enabled
     2020-02-15 12:53:21   state           initialized
   Regex:
     accu:
     cond:
       HM_FwUpdate_doif:
         0:
           state      ^HM_FwUpdate_doif$:^state:
   condition:
     0          ::ReadingValDoIf($hash,'HM_FwUpdate_doif','state') eq "update"
   do:
     0:
       0          { my $MODEL = "HM-TC-IT-WM-W-EU"; my $model = "hm_tc_it_wm_w_eu"; my $version = "V1_4_002"; my $file = $model."_update_".$version."_171018.tgz"; fhem ("setreading HM_FwUpdate_doif File $file");  my $ls = `ls ./Downloads`; if ($ls =~ $file) { fhem ("setreading HM_FwUpdate_doif Downloadinfo Datei vorhanden, kein Download") } else {  #neuer Link#https://ccu3-update.homematic.com/firmware/download?cmd=download&serial=0&product=$model system("wget https://ccu3-update.homematic.com/firmware/download?cmd=download&serial=0&product=$model -P ./Downloads -o ./Downloads/HM_FwUpdate.dlinfo"); my $downloadinfo = `cat ./Downloads/HM_FwUpdate.dlinfo`; fhem ("setreading HM_FwUpdate_doif Downloadinfo $downloadinfo"); system("tar xvzf $file") } fhem ("set HM_618409 fwUpdate ./Download/$fw") }
     1:
   helper:
     DEVFILTER  ^global$|^HM_FwUpdate_doif$
     NOTIFYDEV  global|HM_FwUpdate_doif
     globalinit 1
     last_timer 0
     sleeptimer -1
   readings:
     all         HM_FwUpdate_doif:state
   uiState:
   uiTable:
Attributes:

hauptsächlich geht es um die Zeile mit dem wget

Otto123

Naja deine zweite wget Zeile will die ccu3 Software laden? Und serial fehlt irgendwie :)
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

mar3d@RPi3

#167
https://ccu3-update.homematic.com/firmware/download?cmd=download&serial=0&product=HM-TC-IT-WM-W-EU
im Browser lädt er die Datei für HM-TC-IT-WM-W-EU herunter
vielleicht ist wget auch die falsche wahl ¯\_(ツ)_/¯

Otto123

Naja da machen die irgendwas mit dem Browser...
Der Server sperrt ja auch den Zugriff nach drei Versuchen :(
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

mar3d@RPi3

#169
ich habe noch das hier gefunden:
curl --output ./Downloads/HM-TC-IT-WM-W-EU-1.4.2.tgz 'http://ccu3-update.homematic.com/firmware/download?cmd=download&serial=0&product=HM-TC-IT-WM-W-EU'
damit lädt die aktuelle fw und wird auch gleich gespeichert wo ich möchte. In meinem DOIF also in der Art:
system("curl --output ./Downloads/$file 'http://ccu3-update.homematic.com/firmware/download?cmd=download&serial=0&product=$MODEL'");
manchmal steht man einfach auf dem Schlauch. DANKE

mar3d@RPi3

#170
bleibt nur eins:
Trotz
attr <alle HMDevices> event-on-update-reading fwUpdate
wird das Reading fwUpdate auf "done" gesetzt ABER ohne EVENT.
Ich habe mir also erstmal ein notify für das Log geschrieben:
defmod HM_FwUpdate_notify notify .*CUL_HM.fwUpdate.completed set HM_FwUpdate_doif update_done
attr HM_FwUpdate_notify readLog 1

mar3d@RPi3

#171
Hier noch einmal mein fertiges DOIF, mit sortby direkt unter das Firmware-HTTPMOD platziert. Hier erscheint immer ein Button mit der Aktion die als nächstes erfolgt und macht immer das Update für des erste, aufgelistete Gerät:

DEF
([$SELF:"^reread$"] or [eQ3:"^reread$"])
({
my $newFwForDev1 = (split(/,/m,ReadingsVal("eQ3","newFwForDevices","???")))[0];
## fhem ("setreading $SELF NewFwForDev1 $newFwForDev1");
if ($newFwForDev1 =~ "Keine") {
fhem ("defmod status_HM_FwUpdate_doif at +00:00:01 set $SELF Keine");
}
else {
my $HMDevice = (split(/ /m,$newFwForDev1))[0];
fhem ("setreading $SELF HMDevice $HMDevice");
my $HMAlias = AttrVal("$HMDevice","alias","???");
fhem ("setreading $SELF HMDeviceAlias $HMAlias")
}
}
trigger WEB JS:location.reload()
)
DOELSEIF ([$SELF:"^Keine$"])
(trigger WEB JS:location.reload())
DOELSEIF ([$SELF:"^update$"])
({
my $newFwForDev1 = (split(/,/m,ReadingsVal("eQ3","newFwForDevices","???")))[0];
## fhem ("setreading $SELF NewFwForDev1 $newFwForDev1");
my $HMDevice = (split(/ /m,$newFwForDev1))[0];
fhem ("setreading $SELF HMDevice $HMDevice");
my $HMAlias = AttrVal("$HMDevice","alias","???");
fhem ("setreading $SELF HMDeviceAlias $HMAlias");
my $HMSerial = ReadingsVal("$HMDevice","D-serialNr","???");
fhem ("setreading $SELF HMDeviceSerial $HMSerial");
my $MODEL = (split(/ /m,$newFwForDev1))[1];
$MODEL =~ s/\(//g;
my $VERSION = (split(/ /m,$newFwForDev1))[5];
$VERSION =~ s/nfw_//g;
$VERSION =~ s/\)//g;
my $file = $MODEL."-".$VERSION.".tgz";
## fhem ("setreading $SELF File $file");
my $fw = "???";
my $extraktinfo = "???";
my $ls = `ls ./Downloads`,1;
if ($ls =~ $file) {
fhem ("setreading $SELF Downloadinfo Datei vorhanden, kein erneuter Download")
}
else {
my $downloadinfo = `curl --output ./Downloads/$file 'http://ccu3-update.homematic.com/firmware/download?cmd=download&serial=0&product=$MODEL'`,1;
fhem ("setreading $SELF Downloadinfo $downloadinfo")
}
my $tar = `tar tf ./Downloads/$file`,1;
## fhem ("setreading $SELF TAR $tar");
my $tar0 = (split(/\n/m,$tar))[0];
## fhem ("setreading $SELF TAR0 $tar0");
my $tar1 = (split(/\n/m,$tar))[1];
## fhem ("setreading $SELF TAR1 $tar1");
my $tar2 = (split(/\n/m,$tar))[2];
## fhem ("setreading $SELF TAR2 $tar2");
if ($tar0 =~ ".eq3") {
$fw = "$tar0"
}
elsif ($tar1 =~ ".eq3") {
$fw = "$tar1"
}
elsif ($tar2 =~ ".eq3") {
$fw = "$tar2"
}
else {
$fw = "???"
}
## fhem ("setreading $SELF Firmware $fw");
my $link = "./Downloads/fw_$MODEL/"."$fw";
## fhem ("setreading $SELF FirmwareLink $link");
if ($ls =~ "fw_$MODEL") {
my $lsM = `ls ./Downloads/fw_$MODEL`,1;
## fhem ("setreading $SELF LsM $lsM");
if ($lsM =~ "$fw") {
$extraktinfo = "Firmware-Datei vorhanden, kein erneutes Entpacken"
}
else {
$extraktinfo = `tar vxf ./Downloads/$file -C ./Downloads/fw_$MODEL`,1
}
}
else {
system("mkdir ./Downloads/fw_$MODEL");
## tar vxf ./Downloads/HM-TC-IT-WM-W-EU-1.4.2.tgz -C ./Downloads/fw_HM-TC-IT-WM-W-EU
$extraktinfo = `tar vxf ./Downloads/$file -C ./Downloads/fw_$MODEL`,1
}
fhem ("setreading $SELF Extraktinfo $extraktinfo");
fhem ("set $HMDevice fwUpdate ./Downloads/fw_$MODEL/$fw")
}
trigger WEB JS:location.reload()
)
DOELSEIF (["^HM_......$:^fwUpdate:.done$"])
(trigger WEB JS:location.reload())
DOELSEIF ([$SELF:"^hmPairSerial$"])
({
fhem ("set VCCU hmPairSerial ".ReadingsVal("$SELF","HMDeviceSerial","HMDeviceSerial"))
})
(trigger WEB JS:location.reload())
DOELSEIF (["^HM_......$:^D-firmware:.*$"])
({
fhem ("set eQ3 reread")
})


Attributes
addStateEvent
1

cmdState
reread|update|update_done|hmPairSerial|D-firmware

event-on-update-reading
state,Downloadinfo,Extraktinfo

group
Homematic Update

room
Homematic,system

selftrigger
wait

setList
reread update hmPairSerial

sortby
2

uiTable
{$SHOWNODEVICELINE = "system";
sub RET_HM_FwUpdate_doif {
if (ReadingsVal("$SELF","state","") eq "reread") {
my $ret = ReadingsVal("$SELF","HMDevice","HMDevice")." ".ReadingsVal("$SELF","HMDeviceAlias","HMDeviceAlias");
return $ret
}
elsif (ReadingsVal("$SELF","state","") eq "update") {
my $ret = ReadingsVal("$SELF","HMDevice","HMDevice")." ".ReadingsVal("$SELF","HMDeviceAlias","HMDeviceAlias")." <b>updating<marquee width=20 direction=right>...</marquee></b>";
return $ret
}
elsif (ReadingsVal("$SELF","state","") eq "update_done") {
my $ret = ReadingsVal("$SELF","HMDevice","HMDevice").'<br>'.ReadingsVal("$SELF","HMDeviceAlias","HMDeviceAlias");
return $ret
}
elsif (ReadingsVal("$SELF","state","") eq "hmPairSerial") {
my $ret = "Zum Erkennen des neuen Softwarestandes, jetzt bitte die Anlerntaste am Homematic-Gerät ".ReadingsVal("$SELF","HMDevice","HMDevice")." ".ReadingsVal("$SELF","HMDeviceAlias","HMDeviceAlias")." drücken!";
return $ret
}
}
sub STA_HM_FwUpdate_doif {
if (ReadingsVal("$SELF","state","") eq "reread") {
return "update"
}
elsif (ReadingsVal("$SELF","state","") eq "update_done") {
return "hmPairSerial"
}
elsif (ReadingsVal("$SELF","state","") eq "hmPairSerial") {
return "reread"
}
elsif (ReadingsVal("$SELF","state","") eq "initialized") {
return "reread"
}
}
}
'<div style="text-align:justify">'.(RET_HM_FwUpdate_doif).'</div>'
WID([$SELF],"uzsuSelectRadio,".(STA_HM_FwUpdate_doif)."")

wait
1:0.1:0.1:0.1:0.1:0.1

Migul47

Hallo,

dort sind aber nicht alle aufgelistet, oder? Mein HM-ES-TX-WM hat FW1.2 und es gibt eine 2.5 dafür.

yersinia

Zitat von: Migul47 am 24 Februar 2020, 19:59:53Mein HM-ES-TX-WM hat FW1.2 und es gibt eine 2.5 dafür.
Was die Quelle nicht hergibt, kann auch das device nicht finden.
Allerdings gibt es diese bei eq-3.
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

Pfriemler

Obacht: Für die Energiemonitore gibt es mit dem Sprung auf V2.x etliche Änderungen. Ein Update macht nur für IEC-Interfaces Sinn. Ferraris-Sensoren bzw. einfache Kontakte werden in 2.x. nicht mehr unterstützt.
"Änd're nie in fhem.cfg, denn das tut hier allen weh!" *** Wheezy@Raspi(3), HMWLAN+HMUART, CUL868(SlowRF) für FHT+KS+FS20, miniCUL433, Rademacher DuoFern *** "... kaum macht man es richtig, funktioniert es ..."

Migul47

Hallo,

Ich habe auch nicht vor ein Update zu machen. Solange es geht, lang es nicht an. Ich wollte nur daruf hinweisen, das dort nicht alle Firmware gelistet wird.

Beetle2003

Zitat von: mar3d@RPi3 am 20 Februar 2020, 18:19:44
Hier noch einmal mein fertiges DOIF, mit sortby direkt unter das Firmware-HTTPMOD platziert. Hier erscheint immer ein Button mit der Aktion die als nächstes erfolgt und macht immer das Update für des erste, aufgelistete Gerät:

DEF
([$SELF:"^reread$"] or [eQ3:"^reread$"])
({
my $newFwForDev1 = (split(/,/m,ReadingsVal("eQ3","newFwForDevices","???")))[0];
## fhem ("setreading $SELF NewFwForDev1 $newFwForDev1");
if ($newFwForDev1 =~ "Keine") {
fhem ("defmod status_HM_FwUpdate_doif at +00:00:01 set $SELF Keine");
}
else {
my $HMDevice = (split(/ /m,$newFwForDev1))[0];
fhem ("setreading $SELF HMDevice $HMDevice");
my $HMAlias = AttrVal("$HMDevice","alias","???");
fhem ("setreading $SELF HMDeviceAlias $HMAlias")
}
}
trigger WEB JS:location.reload()
)
DOELSEIF ([$SELF:"^Keine$"])
(trigger WEB JS:location.reload())
DOELSEIF ([$SELF:"^update$"])
({
my $newFwForDev1 = (split(/,/m,ReadingsVal("eQ3","newFwForDevices","???")))[0];
## fhem ("setreading $SELF NewFwForDev1 $newFwForDev1");
my $HMDevice = (split(/ /m,$newFwForDev1))[0];
fhem ("setreading $SELF HMDevice $HMDevice");
my $HMAlias = AttrVal("$HMDevice","alias","???");
fhem ("setreading $SELF HMDeviceAlias $HMAlias");
my $HMSerial = ReadingsVal("$HMDevice","D-serialNr","???");
fhem ("setreading $SELF HMDeviceSerial $HMSerial");
my $MODEL = (split(/ /m,$newFwForDev1))[1];
$MODEL =~ s/\(//g;
my $VERSION = (split(/ /m,$newFwForDev1))[5];
$VERSION =~ s/nfw_//g;
$VERSION =~ s/\)//g;
my $file = $MODEL."-".$VERSION.".tgz";
## fhem ("setreading $SELF File $file");
my $fw = "???";
my $extraktinfo = "???";
my $ls = `ls ./Downloads`,1;
if ($ls =~ $file) {
fhem ("setreading $SELF Downloadinfo Datei vorhanden, kein erneuter Download")
}
else {
my $downloadinfo = `curl --output ./Downloads/$file 'http://ccu3-update.homematic.com/firmware/download?cmd=download&serial=0&product=$MODEL'`,1;
fhem ("setreading $SELF Downloadinfo $downloadinfo")
}
my $tar = `tar tf ./Downloads/$file`,1;
## fhem ("setreading $SELF TAR $tar");
my $tar0 = (split(/\n/m,$tar))[0];
## fhem ("setreading $SELF TAR0 $tar0");
my $tar1 = (split(/\n/m,$tar))[1];
## fhem ("setreading $SELF TAR1 $tar1");
my $tar2 = (split(/\n/m,$tar))[2];
## fhem ("setreading $SELF TAR2 $tar2");
if ($tar0 =~ ".eq3") {
$fw = "$tar0"
}
elsif ($tar1 =~ ".eq3") {
$fw = "$tar1"
}
elsif ($tar2 =~ ".eq3") {
$fw = "$tar2"
}
else {
$fw = "???"
}
## fhem ("setreading $SELF Firmware $fw");
my $link = "./Downloads/fw_$MODEL/"."$fw";
## fhem ("setreading $SELF FirmwareLink $link");
if ($ls =~ "fw_$MODEL") {
my $lsM = `ls ./Downloads/fw_$MODEL`,1;
## fhem ("setreading $SELF LsM $lsM");
if ($lsM =~ "$fw") {
$extraktinfo = "Firmware-Datei vorhanden, kein erneutes Entpacken"
}
else {
$extraktinfo = `tar vxf ./Downloads/$file -C ./Downloads/fw_$MODEL`,1
}
}
else {
system("mkdir ./Downloads/fw_$MODEL");
## tar vxf ./Downloads/HM-TC-IT-WM-W-EU-1.4.2.tgz -C ./Downloads/fw_HM-TC-IT-WM-W-EU
$extraktinfo = `tar vxf ./Downloads/$file -C ./Downloads/fw_$MODEL`,1
}
fhem ("setreading $SELF Extraktinfo $extraktinfo");
fhem ("set $HMDevice fwUpdate ./Downloads/fw_$MODEL/$fw")
}
trigger WEB JS:location.reload()
)
DOELSEIF (["^HM_......$:^fwUpdate:.done$"])
(trigger WEB JS:location.reload())
DOELSEIF ([$SELF:"^hmPairSerial$"])
({
fhem ("set VCCU hmPairSerial ".ReadingsVal("$SELF","HMDeviceSerial","HMDeviceSerial"))
})
(trigger WEB JS:location.reload())
DOELSEIF (["^HM_......$:^D-firmware:.*$"])
({
fhem ("set eQ3 reread")
})


Attributes
addStateEvent
1

cmdState
reread|update|update_done|hmPairSerial|D-firmware

event-on-update-reading
state,Downloadinfo,Extraktinfo

group
Homematic Update

room
Homematic,system

selftrigger
wait

setList
reread update hmPairSerial

sortby
2

uiTable
{$SHOWNODEVICELINE = "system";
sub RET_HM_FwUpdate_doif {
if (ReadingsVal("$SELF","state","") eq "reread") {
my $ret = ReadingsVal("$SELF","HMDevice","HMDevice")." ".ReadingsVal("$SELF","HMDeviceAlias","HMDeviceAlias");
return $ret
}
elsif (ReadingsVal("$SELF","state","") eq "update") {
my $ret = ReadingsVal("$SELF","HMDevice","HMDevice")." ".ReadingsVal("$SELF","HMDeviceAlias","HMDeviceAlias")." <b>updating<marquee width=20 direction=right>...</marquee></b>";
return $ret
}
elsif (ReadingsVal("$SELF","state","") eq "update_done") {
my $ret = ReadingsVal("$SELF","HMDevice","HMDevice").'<br>'.ReadingsVal("$SELF","HMDeviceAlias","HMDeviceAlias");
return $ret
}
elsif (ReadingsVal("$SELF","state","") eq "hmPairSerial") {
my $ret = "Zum Erkennen des neuen Softwarestandes, jetzt bitte die Anlerntaste am Homematic-Gerät ".ReadingsVal("$SELF","HMDevice","HMDevice")." ".ReadingsVal("$SELF","HMDeviceAlias","HMDeviceAlias")." drücken!";
return $ret
}
}
sub STA_HM_FwUpdate_doif {
if (ReadingsVal("$SELF","state","") eq "reread") {
return "update"
}
elsif (ReadingsVal("$SELF","state","") eq "update_done") {
return "hmPairSerial"
}
elsif (ReadingsVal("$SELF","state","") eq "hmPairSerial") {
return "reread"
}
elsif (ReadingsVal("$SELF","state","") eq "initialized") {
return "reread"
}
}
}
'<div style="text-align:justify">'.(RET_HM_FwUpdate_doif).'</div>'
WID([$SELF],"uzsuSelectRadio,".(STA_HM_FwUpdate_doif)."")

wait
1:0.1:0.1:0.1:0.1:0.1


Danke, war die Lösung. Nun funktioniert es.

yersinia

#177
Für Interessierte, es gibt dies jetzt auch als JsonMod Device: Anwendungsfall JsonMod #6: eq3 / homematic firmware check

btw, das dort beschriebene Problem trifft auch auf diese Versions-prüfung zu:
Zitat von: yersinia am 16 April 2020, 13:08:51
Die Versionsprüfung basiert bei den HM-Devices auf zwei Attributen: model und firmware. Hier 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.

EDIT: hab einen Weg gefunden, das zu umschiffen (das gleiche RAW wie in meinen ursprünglichen post):
defmod hm_fw_check HTTPMOD https://update.homematic.com/firmware/api/firmware/search/DEVICE 86400
attr hm_fw_check userattr reading01AutoNumLen reading01Name reading01RegOpt reading01Regex reading02AutoNumLen reading02Name reading02RegOpt reading02Regex readingMaxAge readingMaxAgeReplacementMode:text,reading,internal,expression,delete showNewFWOnly:yes,no
attr hm_fw_check enableControlSet 1
attr hm_fw_check icon hm_ccu
attr hm_fw_check reading01AutoNumLen 2
attr hm_fw_check reading01Name hmfw-type
attr hm_fw_check reading01RegOpt g
attr hm_fw_check reading01Regex (?i)"type":"((?:\w+[-]*){1,})
attr hm_fw_check reading02AutoNumLen 2
attr hm_fw_check reading02Name hmfw-version
attr hm_fw_check reading02RegOpt g
attr hm_fw_check reading02Regex (?si)"version":"(\d+[.]\d+[.]\d+)
attr hm_fw_check readingMaxAge 10
attr hm_fw_check readingMaxAgeReplacementMode delete
attr hm_fw_check room fw-checks
attr hm_fw_check showError 1
attr hm_fw_check showMatched 1
attr hm_fw_check showNewFWOnly yes
attr hm_fw_check stateFormat {   my $ret ="";;;;\
    my $lastCheck = ReadingsTimestamp($name,"MATCHED_READINGS","???");;;;\
    $ret .= '<div style="text-align:left">';;;;\
    $ret .= 'last <a title="eq3-downloads" href="http://www.eq-3.de/service/downloads.html">homematic</a>-fw-check => '.$lastCheck;;;;\
    $ret .= '<br><br><pre>';;;;\
    $ret .= "| device                         | model                   | cur_fw | new_fw |<br>";;;;\
    $ret .= "------------------------------------------------------------------------------<br>";;;;\
    my $check = ReadingsVal($name,"newFwForDevices","error => no or wrong data from eq3-server!");;;;\
    if($check eq "no fw-updates needed!") {\
      $ret .= '| <b style="color:green">';;;;\
      $ret .= sprintf("%-74s",$check);;;;\
      $ret .= '</b> |';;;;\
    } elsif($check eq "error => no or wrong data from eq3-server!") {\
      $ret .= '| <b style="color:red">';;;;\
      $ret .= sprintf("%-74s",$check);;;;\
      $ret .= '</b> |';;;;\
    } else {\
      my @devices = split(',',$check);;;;\
      foreach my $devStr (@devices) {\
        my ($dev,$md,$idx,$ofw,$nfw) = $devStr =~ m/([^\s]+)\s[(]([^\s]+)\s[(](\d+)[)]\sofw_([\d\.]+)\s=>\snfw_([\d\.]+)/;;;;\
        my $fw_link = "https://ccu3-update.homematic.com/firmware/download?cmd=download&serial=0&product=".$md;;;;\
        $ret .= '| <a href="/fhem?detail='.$dev.'" target="_blank"><b>';;;;\
        $ret .= sprintf("%-30s",$dev);;;;\
        $ret .= '</b></a> | ';;;;\
        $ret .= '<b'.(($md eq "?")?' title="missing attribute model => set device in teach mode to receive missing data" style="color:yellow;;"':' style="color:lightgray;;"').'>';;;;\
        $ret .= sprintf("%-23s",$md);;;;\
        $ret .= '</b> | ';;;;\
        $ret .= '<b'.(($ofw eq "0.0")?' title="missing attribute firmware => set device in teach mode to receive missing data" style="color:yellow"':' style="color:lightgray;;"').'>';;;;\
        $ret .= sprintf("%6s",$ofw);;;;\
        $ret .= '</b> | ';;;;\
        $ret .= '<a title="download firmware file" href="'.$fw_link.'" target="_blank"><b style="color:red;;">';;;;\
        $ret .= sprintf("%6s",$nfw);;;;\
        $ret .= '</b></a> | ';;;;\
        $ret .= "<br />";;;;\
      }\
    }\
    $ret .= '</pre></div>';;;;\
  return $ret;;;;\
}
attr hm_fw_check userReadings newFwForDevices:MATCHED_READINGS.* {\
  my $ret = "";;;;\
  my $newfwonly = AttrVal($name,"showNewFWOnly","yes");;;;\
  if (ReadingsVal($name,"UNMATCHED_READINGS","?") eq "") {\
    my @eq3FwList = map { \
sprintf(uc(ReadingsVal($name,"hmfw-type-".$_,"?")).":".ReadingsVal($name,"hmfw-version-".$_,"?").":".$_);;;;\
} ReadingsVal($name,"MATCHED_READINGS","?")=~ m/hmfw-version-(\d\d)/g;;;;\
\
foreach my $dev (devspec2array("TYPE=CUL_HM:FILTER=DEF=......:FILTER=subType!=(virtual|)")) {\
      my $md = AttrVal($dev,"model","?");;;;\
      my $v = AttrVal($dev,"firmware","0.0");;;;\
      my ($h,$l) = split('\.',$v);;;;\
      foreach my $newFW (grep m/^${md}:/i,@eq3FwList) {\
my ($fwmd, $fwv, $idx) = $newFW =~ m/([^:]+):(\d+[.]\d+[.]\d+):(\d+)$/;;;;\
my ($fwh, $fwl) = split('\.',$fwv);;;;\
if(($newfwonly eq "no") || (($fwh > $h) || (($fwh == $h) && ($fwl > $l)))) {\
          $ret .= "," if($ret ne "");;;;\
  $ret .= $dev." (".$md." (".$idx.") ofw_".$v." => nfw_".$fwv.")";;;;\
        }\
      }\
    }\
  } else {\
    $ret = "error => no or wrong data from eq3-server!";;;;\
  }\
  return ($ret eq "")?"no fw-updates needed!":$ret;;;;\
}
attr hm_fw_check webCmd reread
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

Anbei eine neuere Version, welche HmIP mit einschließt. Der HmIP-Input kommt von mcp aus dem JsonMod Thread.

defmod hm_fw_check HTTPMOD https://update.homematic.com/firmware/api/firmware/search/DEVICE 86400
attr hm_fw_check userattr reading01AutoNumLen reading01Name reading01RegOpt reading01Regex reading02AutoNumLen reading02Name reading02RegOpt reading02Regex readingMaxAge readingMaxAgeReplacementMode:text,reading,internal,expression,delete showNewFWOnly:yes,no
attr hm_fw_check do_not_notify 1
attr hm_fw_check enableControlSet 1
attr hm_fw_check icon hm_ccu
attr hm_fw_check reading01AutoNumLen 2
attr hm_fw_check reading01Name hmfw-type
attr hm_fw_check reading01RegOpt g
attr hm_fw_check reading01Regex (?i)"type":"((?:\w+[-]*){1,})
attr hm_fw_check reading02AutoNumLen 2
attr hm_fw_check reading02Name hmfw-version
attr hm_fw_check reading02RegOpt g
attr hm_fw_check reading02Regex (?si)"version":"(\d+[.]\d+[.]\d+)
attr hm_fw_check readingMaxAge 10
attr hm_fw_check readingMaxAgeReplacementMode delete
attr hm_fw_check room fw-checks
attr hm_fw_check showError 1
attr hm_fw_check showMatched 1
attr hm_fw_check showNewFWOnly yes
attr hm_fw_check stateFormat {   my $ret ="";;\
    my $lastCheck = POSIX::strftime("%d.%m. %H:%M",localtime(time_str2num(ReadingsTimestamp($name,"MATCHED_READINGS","2000-01-01 00:00:00"))));;\
my $nextCheck = POSIX::strftime("%d.%m. %H:%M",localtime(time_str2num(InternalVal($name,"TRIGGERTIME_FMT","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">homematic</a>-fw-check => '.$lastCheck;;\
    $ret .= '</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 .= '<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,$idx) = $devStr =~ m/([^\s]+)\s[(](\d+)[)]/;;\
my $md = ReadingsVal($name,("hmfw-type-".$idx),"?");;\
#my $ofw = AttrVal($dev,"firmware","?");;\
my $ofw = InternalVal($dev,"firmware",AttrVal($dev,"firmware","0.0"));;\
my $nfw = ReadingsVal($name,("hmfw-version-".$idx),"none");;\
        my $fw_link = "https://ccu3-update.homematic.com/firmware/download?cmd=download&serial=0&product=".$md;;\
$ret .= '<div style="display:table-row;;">';;\
$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:30%;;font-weight:bold;;color:lightgrey;;">';;\
        $ret .= $md;;\
        $ret .= '</div>';;\
$ret .= '<div style="display:table-cell;;'.$cellstyle.'width:10%;;font-weight:bold;;color:lightgrey;;">';;\
        $ret .= $ofw;;\
        $ret .= '</div>';;\
$ret .= '<div style="display:table-cell;;'.$cellstyle.'width:10%;;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>';; #table\
    }\
$ret .= "<div style=\"text-align:left;;\">(next check: ".$nextCheck.")</div>";;\
    $ret .= '</div>';;\
  return $ret;;\
}
attr hm_fw_check userReadings newFwForDevices:MATCHED_READINGS.* {\
  my $ret = "";;\
  my $newfwonly = AttrVal($name,"showNewFWOnly","yes");;\
  if (ReadingsVal($name,"UNMATCHED_READINGS","?") eq "") {\
    my @eq3FwList = map { \
sprintf(uc(ReadingsVal($name,"hmfw-type-".$_,"?")).":".ReadingsVal($name,"hmfw-version-".$_,"?").":".$_);;\
} ReadingsVal($name,"MATCHED_READINGS","?")=~ m/hmfw-version-(\d\d)/g;;\
\
foreach my $dev (devspec2array("TYPE=CUL_HM|HMCCUDEV:FILTER=DEF=(......|..............):FILTER=subType!=virtual")) {\
  my $md = uc(InternalVal($dev,"ccutype",AttrVal($dev,"model","?")));;\
  my $v = InternalVal($dev,"firmware",AttrVal($dev,"firmware","0.0"));;\
      my ($h,$l) = split('\.',$v);;\
      foreach my $newFW (grep m/^${md}:/i,@eq3FwList) {\
my ($fwmd, $fwv, $idx) = $newFW =~ m/([^:]+):(\d+[.]\d+[.]\d+):(\d+)$/;;\
my ($fwh, $fwl) = split('\.',$fwv);;\
if(($newfwonly eq "no") || (($fwh > $h) || (($fwh == $h) && ($fwl > $l)))) {\
          $ret .= "," if($ret ne "");;\
  $ret .= $dev." (".$idx.")";;\
        }\
      }\
    }\
  } else {\
    $ret = "error => no or wrong data from eq3-server!";;\
  }\
  return ($ret eq "")?"no fw-updates needed!":$ret;;\
}
attr hm_fw_check webCmd reread

Ich hab es für Homematic-only (hab leider kein HmIP) getestet und es funktioniert wie zuvor.
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

Beta-User

Evtl. wäre es sinnvoll, das auch in dem "Vorschläge"-Thread zu posten; bin nicht sicher, ob der aktuelle Maintainer von httpmod.template hier mitliest ;) ...

(@yersinia: Möchtest du das Thema attrTemplate nicht evtl. nochmal bei JSONMOD anschieben und das übernehmen?)
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: MiLight@ESP-GW, BT@OpenMQTTGw | MySensors: seriell, v.a. 2.3.1@RS485 | ZWave | ZigBee@deCONZ | SIGNALduino | MapleCUN | RHASSPY
svn: u.a MySensors, Weekday-&RandomTimer, Twilight,  div. attrTemplate-files