Funktionsanfrage: hminfo erweiterungen firmware Versionsprüfung

Begonnen von no_Legend, 18 Januar 2016, 11:44:07

Vorheriges Thema - Nächstes Thema

no_Legend

Hallo Leute,

ich bin leider keine Programmierer.

Da ich aber immer mal wieder dabei meine Firmwares auf aktualisieren und das Prüfen auf die FW immer ein ziemlich geklicke und gesuche ist,  habe ich mir folgendes vorgestellt:

1. Datei mit den Firmwareversion und den Device namen.
2. hminfo modul um check firmware erweitern. (Firmware Version des Devices in fhem, wird gegen die Datei geprüft)
3. Ausgabe der Liste mit Veralteten Firmwares der Devices

Mir ist schon bewusst, dass dies ein teilweise hoher aufwand ist die Firmwaredatei zu pflegen.
Aber ob ich das ganze nun in einen Forums Thread schreibe oder in eine datei ändert eigentlich nichts.

Programmieren kann ich das so leider nicht.
Weshalb das vll einer der Cracks hier übernehmen kann.

Was ich aber gerne bereit bin zu machen ist die Firmware Datei zu pflegen.

Denkt ihr das ist Sinvoll?

Danke und Gruß Robert
Docker FHEM immer aktuell,4x HMLAN, CUL443, CUL868 -homekit/siri -tablet ui -homebridge
Device, diverse:
Homematic, Shelly, Tasmota, MQTT, Unifi Network usw.

frank

eine aktuelle liste deiner devices bekommst du zb mit:

get hminfo param -d D-firmware

leider muss diese liste nicht immer mit der realität in den devices übereinstimmen. bei vielen devices erhält man die aktuelle fw version nur über einen manuellen druck des config tasters, also mit der anlernmessage.

eine liste der aktuell verfügbaren fw dateien könnte man eventuell mit httpmod durch parsen der eq3-download seite bekommen.
FHEM: 6.0(SVN) => Pi3(buster)
IO: CUL433|CUL868|HMLAN|HMUSB2|HMUART
CUL_HM: CC-TC|CC-VD|SEC-SD|SEC-SC|SEC-RHS|Sw1PBU-FM|Sw1-FM|Dim1TPBU-FM|Dim1T-FM|ES-PMSw1-Pl
IT: ITZ500|ITT1500|ITR1500|GRR3500
WebUI [HMdeviceTools.js (hm.js)]: https://forum.fhem.de/index.php/topic,106959.0.html

no_Legend

#2
Zitat von: frank am 18 Januar 2016, 12:13:22
eine aktuelle liste deiner devices bekommst du zb mit:

get hminfo param -d D-firmware

leider muss diese liste nicht immer mit der realität in den devices übereinstimmen. bei vielen devices erhält man die aktuelle fw version nur über einen manuellen druck des config tasters, also mit der anlernmessage.

eine liste der aktuell verfügbaren fw dateien könnte man eventuell mit httpmod durch parsen der eq3-download seite bekommen.

Das man die Aktuellen Firmwares im FHEM erst nach einem get config bekommt habe ich schon gelesen.
Jedesmal wenn ich ein Update mache, die letzte Woche gerade bei mehreren HM-CC-RT-DN gemacht, führe ich immer das get config aus.

Meinst nicht, dass das suchen auf der Homepage nicht zu viel Aufwand ist?
Oder erst mal klein Anfangen mit ner Datei und dann später über Html oder ?

Edit: @die Mods sollte das Thema besser in den Wunschlisten bereich, bitte verschieben.
Docker FHEM immer aktuell,4x HMLAN, CUL443, CUL868 -homekit/siri -tablet ui -homebridge
Device, diverse:
Homematic, Shelly, Tasmota, MQTT, Unifi Network usw.

frank

ZitatDas man die Aktuellen Firmwares im FHEM erst nach einem get config bekommt habe ich schon gelesen.
mit getconfig gibt es keine fw version. nur beim drücken des anlerntasters.
FHEM: 6.0(SVN) => Pi3(buster)
IO: CUL433|CUL868|HMLAN|HMUSB2|HMUART
CUL_HM: CC-TC|CC-VD|SEC-SD|SEC-SC|SEC-RHS|Sw1PBU-FM|Sw1-FM|Dim1TPBU-FM|Dim1T-FM|ES-PMSw1-Pl
IT: ITZ500|ITT1500|ITR1500|GRR3500
WebUI [HMdeviceTools.js (hm.js)]: https://forum.fhem.de/index.php/topic,106959.0.html

no_Legend

Zitat von: frank am 18 Januar 2016, 13:01:39
mit getconfig gibt es keine fw version. nur beim drücken des anlerntasters.

Da hab ich etwas falsch verstanden an dem Wiki eintrag.
Naja stört auch nicht hin und wieder mal ein get config zu machen. LOL
Docker FHEM immer aktuell,4x HMLAN, CUL443, CUL868 -homekit/siri -tablet ui -homebridge
Device, diverse:
Homematic, Shelly, Tasmota, MQTT, Unifi Network usw.

martinp876

Wie geschrieben kommt die fwversion nach anlernmessage. Die version wird in archconfig gespeichert.
Das ist m.e. sicherer als auf readings zu vertrauen.
Einen automatischen abgleich sehe ich nicht.

no_Legend

Zitat von: martinp876 am 18 Januar 2016, 21:52:41
Wie geschrieben kommt die fwversion nach anlernmessage. Die version wird in archconfig gespeichert.
Das ist m.e. sicherer als auf readings zu vertrauen.
Einen automatischen abgleich sehe ich nicht.

Hi Martin,

kann so was umgesetzt werden, mit relativ geringem Aufwand.
Wie gesagt, die Pflege der Datenbank traue ich mir zu.
Leider dass Programieren nicht.

Oder könnte man so was über ReadingGroup realisieren?

Gruß Robert
Docker FHEM immer aktuell,4x HMLAN, CUL443, CUL868 -homekit/siri -tablet ui -homebridge
Device, diverse:
Homematic, Shelly, Tasmota, MQTT, Unifi Network usw.

FranzB94

Hi no_Legend!

Wenn Du Dir das zutraust, dann starte doch einfach mal mit einer Datenbank. Die Informationen stehen ja auf der eQ-3 Seite. Vielleicht am Besten mit MySQL, damit kann ja auch schon geloggt werden. Und zieh Dir das ausserdem noch mal rein, was frank mit parsen gemeint hat.

@Martin: unter welchem Verzeichnis finde ich die archconfig?

martinp876

Was meint ihr mit Datenbank? Wollt ihr alle eq3 fw in fhem einbauen damit man die laden kann? Bitte nicht für mich.
Ich lade das file was ich brauche und löschen die alten. Groessermuß fhem nicht werden. Kommt ein update ziehe ich den durch, prüfen die Versionen, aus.

ArchConfig arbeitet auf dem fhem default dir oder dem in configdir festgelegtem. Das default file ist regConfig.cfg.
OK der Name ist mäßig, aber gesichert werden die registerconfigurationen.

no_Legend

Zitat von: martinp876 am 19 Januar 2016, 20:35:47
Was meint ihr mit Datenbank? Wollt ihr alle eq3 fw in fhem einbauen damit man die laden kann? Bitte nicht für mich.
Ich lade das file was ich brauche und löschen die alten. Groessermuß fhem nicht werden. Kommt ein update ziehe ich den durch, prüfen die Versionen, aus.

ArchConfig arbeitet auf dem fhem default dir oder dem in configdir festgelegtem. Das default file ist regConfig.cfg.
OK der Name ist mäßig, aber gesichert werden die registerconfigurationen.

Hi Martin,

nein keine Firmware Datei Datenbank.
Nur eine Versionsdatenbank.

Wobei ja FHEM hoch alles aus Text Dateien holt soweit ich es weis.
Oder benutzt FHEM schon im Hintergrund eine Datenbank?

Gruß Robert
Docker FHEM immer aktuell,4x HMLAN, CUL443, CUL868 -homekit/siri -tablet ui -homebridge
Device, diverse:
Homematic, Shelly, Tasmota, MQTT, Unifi Network usw.

frank

hier mal ein anfang für die datenbank, nicht sehr hübsch, aber non blocking. viele dateien sind es ja nicht, die eq3 im angebot hat.
die sub in 99_myutils, über eingabezeile starten "{getEq3FwList}" und ergebnis in fhem.log abholen.


model               | fw         | date       | link                                               
-----------------------------------------------------------------------------------------------------
HM-LC-Dim1T-Pl-3    | 2_9_0005   | 13.01.2016 | www.eq-3.de/Downloads/Software/Firmware/HM-LC-Dim1T-Pl-3_update_V2_9_0005_160113.tgz
HM-LC-Dim1L-Pl-3    | 2_9_0007   | 13.01.2016 | www.eq-3.de/Downloads/Software/Firmware/HM-LC-Dim1L-Pl-3_update_V2_9_0007_160113.tgz
HM-LC-Dim1PWM-CV    | 2_9_0005   | 13.01.2016 | www.eq-3.de/Downloads/Software/Firmware/HM-LC-Dim1PWM-CV_update_V2_9_0005_160113.tgz
HM-LC-Dim1TPBU-FM   | 2_9_0005   | 13.01.2016 | www.eq-3.de/Downloads/Software/Firmware/HM-LC-Dim1TPBU-FM_update_V2_9_0005_160113.tgz
hm-mod-re-8         | 1_2        | 11.09.2015 | www.eq-3.de/Downloads/Software/Firmware/hm-mod-re-8_update_V1_2_150911.tgz
hm_tc_it_wm_w_eu    | 1_3_002    | 27.08.2015 | www.eq-3.de/Downloads/Software/Firmware/hm_tc_it_wm_w_eu_update_V1_3_002_150827.tgz
HM-LC-Bl1PBU-FM     | 2_8_2      | 13.07.2015 | www.eq-3.de/Downloads/Software/Firmware/HM-LC-Bl1PBU-FM_update_V2_8_2_150713.tgz
HM-LC-Sw1PBU-FM     | 2_8_2      | 13.07.2015 | www.eq-3.de/Downloads/Software/Firmware/HM-LC-Sw1PBU-FM_update_V2_8_2_150713.tgz
HM-Sen-MDIR-WM55    | 1_1_2      | 13.04.2015 | www.eq-3.de/Downloads/Software/Firmware/HM-Sen-MDIR-WM55_update_V1_1_2_150413.tgz
HM-ES-PMSw1-Pl      | 2_5_0009   | 17.02.2015 | www.eq-3.de/Downloads/Software/Firmware/HM-ES-PMSw1-Pl_update_V2_5_0009_150217.tgz
hm_cc_rt_dn         | 1_4_001    | 20.10.2014 | www.eq-3.de/Downloads/Software/Firmware/hm_cc_rt_dn_update_V1_4_001_141020.tgz
hm_tc_it_wm_w_eu    | 1_2_001    | 20.10.2014 | www.eq-3.de/Downloads/Software/Firmware/hm_tc_it_wm_w_eu_update_V1_2_001_141020.tgz
hm-sen-rd-o         | 1_4_003    | 30.09.2013 | www.eq-3.de/Downloads/Software/Firmware/hm-sen-rd-o_update_V1_4_003_130930.tgz
HM-LC-Bl1PBU-FM     | 2_3_0002   | 04.12.2013 | www.eq-3.de/Downloads/Software/Firmware/HM-LC-Bl1PBU-FM_update_V2_3_0002_131204.tgz


sub getEq3FwList() {
my $err = "";
my $data = "";
my @fw = ();
my $ret = "";

HttpUtils_NonblockingGet( {
url=>'http://www.eq-3.de/db_action/download_suche.php',
data=>'suche_in=62&suchtext=&themenbereich_1=99',
callback=>sub($$$){
if($_[1]) {
$err = $_[1];
} else {
$err = "no problem";
}
$data = $_[2];

@fw = $data =~ m/<p><a.href=\"(.*?\.tgz)/g;
foreach my $fw (@fw) {
if($fw =~ m/Firmware\/(.*)_update_V(.*)_(\d\d)(\d\d)(\d\d)\.tgz$/) {
$ret .= sprintf(" %-19s | %-10s | %02d.%02d.20%02d | www.eq-3.de%s",$1,$2,$5,$4,$3,$fw)."\n";
}
}
Log 1,"ERR:".$err."\n model               | fw         | date       | link                                                \n".
                    "-----------------------------------------------------------------------------------------------------\n".$ret;
}
} );
}
FHEM: 6.0(SVN) => Pi3(buster)
IO: CUL433|CUL868|HMLAN|HMUSB2|HMUART
CUL_HM: CC-TC|CC-VD|SEC-SD|SEC-SC|SEC-RHS|Sw1PBU-FM|Sw1-FM|Dim1TPBU-FM|Dim1T-FM|ES-PMSw1-Pl
IT: ITZ500|ITT1500|ITR1500|GRR3500
WebUI [HMdeviceTools.js (hm.js)]: https://forum.fhem.de/index.php/topic,106959.0.html

frank

ich habe mir jetzt ein httpmod device definiert, dass automatisch einmal am tag bei eq3 nach fw sucht. über das userreading werden im anschluss die aktuellen fw's meiner devices mit den aktuellen von eq3 verglichen und eine liste der devices mit veralteter fw ausgegeben. bei nicht vorhandenem reading D-firmware wird als aktuelle fw version 0.0 zum vergleich gesetzt.
über stateformat sind die entsprechenden devices auch in der übersicht zu sehen.

hier die definition für httpmod:

define eq3 HTTPMOD http://www.eq-3.de/db_action/download_suche.php 86400
attr eq3 userattr enableControlSet event-on-change-reading event-on-update-reading reading01AutoNumLen reading01Format reading01Name reading01RegOpt reading01Regex reading02AutoNumLen reading02Name reading02RegOpt reading02Regex reading03AutoNumLen reading03Name reading03RegOpt reading03Regex reading04AutoNumLen reading04Name reading04RegOpt reading04Regex requestData.* showError showMatched stateFormat userReadings
attr eq3 enableControlSet 1
attr eq3 event-on-change-reading .*
attr eq3 event-on-update-reading LAST_ERROR,MATCHED_READINGS
attr eq3 reading01AutoNumLen 2
attr eq3 reading01Format www.eq-3.de%s
attr eq3 reading01Name fw_link
attr eq3 reading01RegOpt g
attr eq3 reading01Regex href=\"([^\.]+\.tgz)\"
attr eq3 reading02AutoNumLen 2
attr eq3 reading02Name fw_model
attr eq3 reading02RegOpt g
attr eq3 reading02Regex (?s)<p.class=\"name\">(?=.*?datum.*?href=\"[^\.]+\.(?:tgz|(*SKIP)(*FAIL))\").*?Kurz.Bez.:.([a-zA-Z0-9\-]+)
attr eq3 reading03AutoNumLen 2
attr eq3 reading03Name fw_version
attr eq3 reading03RegOpt g
attr eq3 reading03Regex (?s)<p.class=\"name\">(?=.*?datum.*?href=\"[^\.]+\.(?:tgz|(*SKIP)(*FAIL))\").*?Firmware.V([\d\.]+)
attr eq3 reading04AutoNumLen 2
attr eq3 reading04Name fw_release
attr eq3 reading04RegOpt g
attr eq3 reading04Regex (?s)<p.class=\"name\">(?=.*?datum.*?href=\"[^\.]+\.(?:tgz|(*SKIP)(*FAIL))\").*?datum..(\d\d\.\d\d\.\d\d\d\d)
attr eq3 requestData.* suche_in=62&suchtext=&themenbereich_1=99
attr eq3 room eq3
attr eq3 showError 1
attr eq3 showMatched 1
attr eq3 stateFormat { my $ret ="";; $ret .= '<div style="text-align:left">new fw released:<br>';; my @devices = split(',',ReadingsVal($name,"newFwForDevices","???"));; foreach my $dev (@devices) { $ret .= '<br>'.$dev;; } $ret .= '</div>';; return $ret;; }
attr eq3 userReadings newFwForDevices:MATCHED_READINGS {\
my $ret = "";;\
my @eq3FwList = map { ReadingsVal("eq3","fw_model-".$_,"?").":".ReadingsVal("eq3","fw_version-".$_,"?") \
} ReadingsVal("eq3","MATCHED_READINGS","?") =~ m/fw_link-(\d\d)/g;;\
foreach my $dev (devspec2array("TYPE=CUL_HM:FILTER=DEF=......:FILTER=subType!=(virtual|)")) {\
my $md = AttrVal($dev,"model","?");;\
my $v = ReadingsVal($dev,"D-firmware","0.0");;\
my ($h,$l) = split('\.',$v);;\
foreach my $newFw (grep m/^$md:/,@eq3FwList) {\
my ($nh,$nl) = $newFw =~ m/^[^:]+:(\d+)\.(\d+).*$/;;\
if(($nh > $h) || (($nh == $h) && ($nl > $l))) {\
$ret .= "," if($ret ne "");;\
$ret .= $dev." (".$md." | fw_".$v." => fw_".$nh.".".$nl.")";;\
}\
}\
}\
return $ret;;\
}\


ausserdem wird die aktuelle alpha version von 98_HTTPMOD.pm aus diesem thread benötigt http://forum.fhem.de/index.php/topic,45176.0.html.

(http://forum.fhem.de/index.php?action=dlattach;topic=47729.0;attach=45130;image)

im screenshot habe ich 2 devices, die fw gebrauchen könnten. ein realer dimmer und ein dummy rt ohne fw-reading.

gruss frank
FHEM: 6.0(SVN) => Pi3(buster)
IO: CUL433|CUL868|HMLAN|HMUSB2|HMUART
CUL_HM: CC-TC|CC-VD|SEC-SD|SEC-SC|SEC-RHS|Sw1PBU-FM|Sw1-FM|Dim1TPBU-FM|Dim1T-FM|ES-PMSw1-Pl
IT: ITZ500|ITT1500|ITR1500|GRR3500
WebUI [HMdeviceTools.js (hm.js)]: https://forum.fhem.de/index.php/topic,106959.0.html

no_Legend

Hi Frank,

danke für deine Hilfe sieht echt gut aus.
Werde ich heute abend wenn ich dazu komme mal testen.

Gruß Robert
Docker FHEM immer aktuell,4x HMLAN, CUL443, CUL868 -homekit/siri -tablet ui -homebridge
Device, diverse:
Homematic, Shelly, Tasmota, MQTT, Unifi Network usw.

frank

#13
jetzt neues design, mehr infos und eingebaute links.  :)

(http://forum.fhem.de/index.php?action=dlattach;topic=47729.0;attach=46097;image)

define eq3 HTTPMOD http://www.eq-3.de/db_action/download_suche.php 86400
attr eq3 userattr enableControlSet event-on-change-reading event-on-update-reading reading01AutoNumLen reading01Format reading01Name reading01RegOpt:s,i,g reading01Regex reading02AutoNumLen reading02Name reading02RegOpt:s,i,g reading02Regex reading03AutoNumLen reading03Name reading03RegOpt:s,i,g reading03Regex reading04AutoNumLen reading04Name reading04RegOpt:s,i,g reading04Regex reading05AutoNumLen reading05Format reading05Name reading05RegOpt:s,i,g reading05Regex readingMaxAge readingMaxAgeReplacementMode readingMaxAgeReplacementMode:text,expression,delete requestData.* showError showMatched stateFormat userReadings webCmd
attr eq3 enableControlSet 1
attr eq3 event-on-change-reading .*
attr eq3 event-on-update-reading LAST_ERROR,MATCHED_READINGS
attr eq3 reading01AutoNumLen 2
attr eq3 reading01Format http://www.eq-3.de%s
attr eq3 reading01Name fw_link
attr eq3 reading01RegOpt g
attr eq3 reading01Regex href=\"([^\.]+\.tgz)\"
attr eq3 reading02AutoNumLen 2
attr eq3 reading02Name fw_model
attr eq3 reading02RegOpt g
attr eq3 reading02Regex (?s)<p.class=\"name\">(?=.*?datum.*?href=\"[^\.]+\.(?:tgz|(*SKIP)(*FAIL))\").*?Kurz.Bez.:.([a-zA-Z0-9\-]+)
attr eq3 reading03AutoNumLen 2
attr eq3 reading03Name fw_version
attr eq3 reading03RegOpt g
attr eq3 reading03Regex (?s)<p.class=\"name\">(?=.*?datum.*?href=\"[^\.]+\.(?:tgz|(*SKIP)(*FAIL))\").*?Firmware.V([\d\.]+)
attr eq3 reading04AutoNumLen 2
attr eq3 reading04Name fw_release
attr eq3 reading04RegOpt g
attr eq3 reading04Regex (?s)<p.class=\"name\">(?=.*?datum.*?href=\"[^\.]+\.(?:tgz|(*SKIP)(*FAIL))\").*?datum..(\d\d\.\d\d\.\d\d\d\d)
attr eq3 reading05AutoNumLen 2
attr eq3 reading05Format http://www.eq-3.de%s
attr eq3 reading05Name fw_text
attr eq3 reading05RegOpt g
attr eq3 reading05Regex (?s)<p.class=\"name\">(?=.*?datum.*?href=\"[^\.]+\.(?:tgz|(*SKIP)(*FAIL))\").*?href=\"([^\.]+\.txt)\"
attr eq3 readingMaxAge 10
attr eq3 readingMaxAgeReplacementMode delete
attr eq3 requestData.* suche_in=62&suchtext=&themenbereich_1=99
attr eq3 room eq3
attr eq3 showError 1
attr eq3 showMatched 1
attr eq3 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/downloads.html">homematic</a>-fw-check => '.$lastCheck;; $ret .= '<br><br>';; $ret .= '<pre>';; $ret .= "| device                  | model                   | old_fw | new_fw | release    |\n";; $ret .= "------------------------------------------------------------------------------------\n";; my $check = ReadingsVal($name,"newFwForDevices","???");; if($check eq "no fw-updates needed!") { $ret .= '| '.$check.'                                                            |';; } else { my @devices = split(',',$check);; foreach my $devStr (@devices) { my ($dev,$md,$ofw,$idx,$nfw) = $devStr =~ m/^([^\s]+)\s\(([^\s]+)\s\|\sfw_(\d+\.\d+)\s=>\sfw(\d\d)_([\d\.]+)\)$/;; my $link = ReadingsVal($name,"fw_link-".$idx,"???");; my $date = ReadingsVal($name,"fw_release-".$idx,"???");; my $text = ReadingsVal($name,"fw_text-".$idx,"???");; $ret .= '| ';; $ret .= '<a href="/fhem?detail='.$dev.'">';;  $ret .= sprintf("%-23s",$dev);; $ret .= '</a>';;  $ret .= " | ";;  $ret .= '<b'.(($md eq "?")?' title="missing attribute model => set device in teach mode to recieve missing data" style="color:yellow"':' style="color:light gray"').'>';;  $ret .= sprintf("%-23s",$md);; $ret .= '</b>';;  $ret .= " | ";;  $ret .= '<b'.(($ofw eq "0.0")?' title="missing attribute firmware => set device in teach mode to recieve missing data" style="color:yellow"':' style="color:light gray"').'>';;  $ret .= sprintf("%6s",$ofw);; $ret .= '</b>';;  $ret .= " | ";;  $ret .= '<a title="eq3-firmware.tgz" href="'.$link.'">';;  $ret .= '<b style="color:red">';;  $ret .= sprintf("%6s",$nfw);; $ret .= '</b>';;  $ret .= '</a>';;  $ret .= " | ";;  $ret .= '<a title="eq3-changelog.txt" href="'.$text.'">';;  $ret .= sprintf("%-10s",$date);; $ret .= '</a>';;  $ret .= " |\n";;  } } $ret .= '</pre>';; $ret .= '</div>';; return $ret;; }
attr eq3 userReadings newFwForDevices:MATCHED_READINGS {\
my $ret = "";;\
my @eq3FwList = map { ReadingsVal("eq3","fw_model-".$_,"?").":".ReadingsVal("eq3","fw_version-".$_,"?").":".$_\
} ReadingsVal("eq3","MATCHED_READINGS","?") =~ m/fw_link-(\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}:/,@eq3FwList) {\
my ($nh,$nl,$no,$idx) = $newFw =~ m/^[^:]+:(\d+)\.(\d+)(.*?):(\d\d)$/;;\
if(($nh > $h) || (($nh == $h) && ($nl > $l))) {\
$ret .= "," if($ret ne "");;\
$ret .= $dev." (".$md." | fw_".$v." => fw".$idx."_".$nh.".".$nl.($no?$no:"").")";;\
}\
}\
}\
return ($ret eq "")?"no fw-updates needed!":$ret;;\
}
attr eq3 webCmd reread


edit: kleine änderung für den fall, dass keine neuen updates benötigt werden.
edit2: bei fehlenden device attributen model und firmware gibt es jetzt zur warnung gelbe einträge und einen tooltip zur beseitigung dieser fehler. ausserdem ist nun ein link zum jeweiligen changelog unter dem release date hinterlegt und das datum des letzten fw-checks wird angezeigt.

gruss frank
FHEM: 6.0(SVN) => Pi3(buster)
IO: CUL433|CUL868|HMLAN|HMUSB2|HMUART
CUL_HM: CC-TC|CC-VD|SEC-SD|SEC-SC|SEC-RHS|Sw1PBU-FM|Sw1-FM|Dim1TPBU-FM|Dim1T-FM|ES-PMSw1-Pl
IT: ITZ500|ITT1500|ITR1500|GRR3500
WebUI [HMdeviceTools.js (hm.js)]: https://forum.fhem.de/index.php/topic,106959.0.html

MarcelK

Wow, das ist echt cool, hab ich gleich eingebaut. Danke schön :-)