HomeMatic Firmware Update: Unterschied zwischen den Versionen

Aus FHEMWiki
KKeine Bearbeitungszusammenfassung
(Korrigiert: set eq3 attrTemplate homematic_fw_check_v2)
 
(24 dazwischenliegende Versionen von 8 Benutzern werden nicht angezeigt)
Zeile 1: Zeile 1:
Seit 2014 ist es möglich, bei einigen [[HomeMatic]] Komponenten selbst Firmware Updates durchzuführen. Vorher ging das nur per CCU oder durch Einsenden des Gerätes an ELV.
Seit 2014 ist es möglich, bei einigen [[HomeMatic]] Komponenten selbst Firmware Updates durchzuführen. Vorher ging das nur per CCU oder durch Einsenden des Gerätes an ELV.
Dabei gibt es verschiedene Möglichkeiten das Firmware Update durchzuführen. Um in Fhem die aktuelle Firmware nach dem Update angezeigt zu bekommen, ist ein erneutes Pairen mit Fhem notwendig. Es muss aber nicht gelöscht oder zurückgesetzt werden.
Dabei gibt es verschiedene Möglichkeiten das Firmware Update durchzuführen. Um in FHEM die aktuelle Firmware nach dem Update angezeigt zu bekommen, ist ein erneutes Pairen mit FHEM notwendig. Es muss aber nicht gelöscht oder zurückgesetzt werden.


== Varianten für Firmwareupdates ==
== Varianten für Firmwareupdates ==
Zeile 6: Zeile 6:
FW Updates sind in FHEM möglich. Benötigt wird dafür ein [[CUL]] oder ein [[HM-CFG-USB USB Konfigurations-Adapter|HM-CFG-USB]] oder ein [[HMUARTLGW]]. Mit einem [[HMLAN]] ist ein Update nicht möglich.
FW Updates sind in FHEM möglich. Benötigt wird dafür ein [[CUL]] oder ein [[HM-CFG-USB USB Konfigurations-Adapter|HM-CFG-USB]] oder ein [[HMUARTLGW]]. Mit einem [[HMLAN]] ist ein Update nicht möglich.


Vor dem Update ist sicherzustellen, dass das korrekte IO für das Device genutzt wird (falls mehrere IOs im System zu Verfügung stehen). Siehe Attribut IODev und IOgrp bei der Verwendung einer vCCU. Ein HMLAN kann mit dem Befehl :<code>set <HMLAN Name> close</code> temporär ausgeschlossen werden.
Vor dem Update ist sicherzustellen, dass das korrekte IO für das Device genutzt wird (falls mehrere IOs im System zu Verfügung stehen). Siehe Attribut IODev und IOgrp bei der Verwendung einer [[Virtueller Controller VCCU|VCCU]]. Ein HMLAN kann mit dem Befehl: <code>set <HMLAN Name> close</code> temporär ausgeschlossen werden.


Um das Update durchführen zu können, wird die in dem entsprechenden Zip/tgz-File vorhandene .eq3-Datei benötigt. Bitte genau darauf achten, dass nicht versehentlich eine falsches Firmware-Datei verwendet wird. Der Vorgang selbst erfolgt mittels folgendem Befehl:
Um das Update durchführen zu können, wird die in dem entsprechenden Zip/tgz-File vorhandene .eq3-Datei benötigt. Bitte genau darauf achten, dass nicht versehentlich eine falsches Firmware-Datei verwendet wird. Der Vorgang selbst erfolgt mittels folgendem Befehl:
Zeile 17: Zeile 17:
Wichtig: während des Updates können keine weiteren Nachrichten in FHEM von Homematic verarbeitet werden.
Wichtig: während des Updates können keine weiteren Nachrichten in FHEM von Homematic verarbeitet werden.


Da nach dem Update immer noch die alte FW-Version in FHEM steht, kann man entweder bei einigen Geräten die Version mit
Da nach dem Update immer noch die alte FW-Version in FHEM steht, kann man entweder bei einigen Geräten die Version mit  
:<code> set <device> getVersion </code>
:<code> set <device> getVersion </code>
auslesen oder wenn das Kommando wie z.B. bei den oben genannten Heizkörperventilen nicht zur Verfügung steht, genügt es, am Gerät selbst die Anlerntaste zu drücken (was am Beispiel der RTs bedeutet, dass die Boost-Taste für mindestens drei Sekunden gedrückt werden  muss). Nach der Aktualisierung der Firmware-Information in Fhem, muss die [[Konfiguration]] noch gespeichert werden.
auslesen oder wenn das Kommando wie z.B. bei den oben genannten Heizkörperventilen nicht zur Verfügung steht, genügt es, am Gerät selbst die Anlerntaste zu drücken (was am Beispiel der RTs bedeutet, dass die Boost-Taste für mindestens drei Sekunden gedrückt werden  muss). Nach der Aktualisierung der Firmware-Information in FHEM, muss die [[Konfiguration]] noch gespeichert werden.
 
==== Fehlersuche / Probleme beim Update via FHEM ====
* Der Firmware-Update nimmt mehrere Minuten in Anspruch (bei einem HM-LC-Bl1PBU-FM bis zu 10 Minuten). Über <code>attr <device> verbose 5</code> kann man für das HM-Device im Log den Fortschritt detaillierter beobachten.
* Sollte es zu einem Abbruch kommen, kann es dazu kommen, dass weitere FW-Update-Versuche abgebrochen werden mit der Fehlermeldung "fail:notInBootLoader" und einem grünen Dauerblinken an der Anlerntaste ({{Link2Forum|Topic=84200|Message=764555}}). In diesem Fall kann die explizite Angabe des Parameters <code><nowiki>[<time>]</nowiki></code> helfen.


=== Firmware Update mit CUL/HM-CFG-USB unter Linux ===
=== Firmware Update mit CUL/HM-CFG-USB unter Linux ===
Zeile 25: Zeile 29:


Zunächst muss sichergestellt werden, dass alle benötigten Pakete installiert sind. Um das Tool zu installieren und auszuführen, müssen die folgenden Pakete mit den gezeigten Befehlen installiert werden. Unter Debian:
Zunächst muss sichergestellt werden, dass alle benötigten Pakete installiert sind. Um das Tool zu installieren und auszuführen, müssen die folgenden Pakete mit den gezeigten Befehlen installiert werden. Unter Debian:
<source lang="bash">
<syntaxhighlight lang="bash">
sudo apt-get install libusb-1.0-0-dev git build-essential
sudo apt-get install libusb-1.0-0-dev git build-essential
</source>
</syntaxhighlight>
Unter OpenSuse 13.2 64 Bit:
Unter OpenSuse 13.2 64 Bit:
<source lang="bash">
<syntaxhighlight lang="bash">
sudo zypper install libusb-1.0-0-dev git  
sudo zypper install libusb-1.0-0-dev git  
sudo zypper install --type pattern devel_basis
sudo zypper install --type pattern devel_basis
</source>
</syntaxhighlight>


Als nächstes wird der Sourcecode für das Tool heruntergeladen (vorher z.B. in den Pfad <code>/usr/src</code> wechseln):
Als nächstes wird der Sourcecode für das Tool heruntergeladen (vorher z.B. in den Pfad <code>/usr/src</code> wechseln):
<source lang="bash">
<syntaxhighlight lang="bash">
git clone git://git.zerfleddert.de/hmcfgusb
git clone git://git.zerfleddert.de/hmcfgusb
</source>
</syntaxhighlight>
Und mit den Anweisungen
Und mit den Anweisungen
<source lang="bash">
<syntaxhighlight lang="bash">
cd hmcfgusb
cd hmcfgusb
make
make
</source>
</syntaxhighlight>
wird daraus eine ausführbare Datei erstellt.
wird daraus eine ausführbare Datei erstellt.


Weiterhin muss die nötige Firmware heruntergeladen und entpackt werden. Die offiziellen Updates gibt es unter [http://www.eq-3.de/downloads.html eq-3 Downloads]. Die Befehle, um beispielsweise die benötigte Datei für die Firmware Version 1.4 des HM-CC-RT-DN zu erhalten lauten:
Weiterhin muss die nötige Firmware heruntergeladen und entpackt werden. Die offiziellen Updates gibt es unter [http://www.eq-3.de/downloads.html eq-3 Downloads]. Die Befehle, um beispielsweise die benötigte Datei für die Firmware Version 1.4 des HM-CC-RT-DN zu erhalten lauten:
<source lang="bash">
<syntaxhighlight lang="bash">
wget http://www.eq-3.de/Downloads/Software/Firmware/hm_cc_rt_dn_update_V1_4_001_141020.tgz
wget http://www.eq-3.de/Downloads/Software/Firmware/hm_cc_rt_dn_update_V1_4_001_141020.tgz
tar xvzf hm_cc_rt_dn_update_V1_4_001_141020.tgz
tar xvzf hm_cc_rt_dn_update_V1_4_001_141020.tgz
</source>
</syntaxhighlight>
Zu guter Letzt muss noch das Tool mit einigen Parametern und der Seriennummer des HomeMatic Devices aufgerufen werden. Für ein Update mit einem CUL (<code>/dev/ttyACM0</code> ist in diesem Beispiel die Adresse des CULs) muss folgendes eingegeben werden:
Zu guter Letzt muss noch das Tool mit einigen Parametern und der Seriennummer des HomeMatic Devices aufgerufen werden. Für ein Update mit einem CUL (<code>/dev/ttyACM0</code> ist in diesem Beispiel die Adresse des CULs) muss folgendes eingegeben werden:
<source lang="bash">
<syntaxhighlight lang="bash">
sudo ./flash-ota -c /dev/ttyACM0 -f <FirmwareImageName>.eq3 -s <DeviceSerialNo>
sudo ./flash-ota -c /dev/ttyACM0 -f <FirmwareImageName>.eq3 -s <DeviceSerialNo>
</source>
</syntaxhighlight>
Für ein Update mit einem COC muss folgendes eingegeben werden (/dev/ttyAMA0):
Für ein Update mit einem COC muss folgendes eingegeben werden (/dev/ttyAMA0):
<source lang="bash">
<syntaxhighlight lang="bash">
sudo ./flash-ota -c /dev/ttyAMA0 -f <FirmwareImageName>.eq3 -s <DeviceSerialNo>
sudo ./flash-ota -c /dev/ttyAMA0 -f <FirmwareImageName>.eq3 -s <DeviceSerialNo>
</source>
</syntaxhighlight>
Für ein Update mit HM-CFG-USB
Für ein Update mit HM-CFG-USB
<source lang="bash">
<syntaxhighlight lang="bash">
sudo ./flash-ota -f <FirmwareImageName>.eq3 -s <DeviceSerialNo>
sudo ./flash-ota -f <FirmwareImageName>.eq3 -s <DeviceSerialNo>
</source>
</syntaxhighlight>
Nun muss nur noch das HomeMatic Gerät in den Update-Modus versetzt werden. Wie das geht, steht in der jeweils mit der Firmwaredatei gelieferten "readme".
Nun muss nur noch das HomeMatic Gerät in den Update-Modus versetzt werden. Wie das geht, steht in der jeweils mit der Firmwaredatei gelieferten "readme".


=== Firmware Update mit HM-CFG-USB unter Windows ===
=== Firmware Update mit HM-CFG-USB unter Windows ===
Für ein Firmwareupdate unter Windows wird das "HomeMatic Firmware Update Tool" von eq-3 benötigt: [http://www.eq-3.de/downloads.html eQ-3 Downloads]. Zur Zeit ist das Update damit nur mit dem HM-CFG-USB-2 möglich, nicht aber mit dem HM-CFG-LAN oder dem HM-CFG-USB der ersten Generation.
Für ein Firmwareupdate unter Windows wird das "HomeMatic Firmware Update Tool" von eq-3 benötigt: [https://www.eq-3.de/service/downloads.html?id=274 eQ-3 Downloads]. Zur Zeit ist das Update damit nur mit dem HM-CFG-USB-2 möglich, nicht aber mit dem HM-CFG-LAN oder dem HM-CFG-USB der ersten Generation.


Nach dem Start muss die Seriennummer des HomeMatic-Device eingegeben und die Firmware-Datei ausgewählt werden. Dann wird das Update-Tool durch einen Klick auf den entsprechenden Button in "Bereitschaft" gesetzt und anschließend muss das HomeMatic-Gerät in den Update-Modus versetzt werden. Bei Unterputz-Geräten ist das eventuell gar nicht so einfach, man kann in diesem Fall aber von FHEM aus dem Gerät ein Kommando schicken um es in den Bootloader Modus zu bringen. Dies geht mit dem Befehl
Nach dem Start muss die Seriennummer des HomeMatic-Device eingegeben und die Firmware-Datei ausgewählt werden. Dann wird das Update-Tool durch einen Klick auf den entsprechenden Button in "Bereitschaft" gesetzt und anschließend muss das HomeMatic-Gerät in den Update-Modus versetzt werden. Bei Unterputz-Geräten ist das eventuell gar nicht so einfach, man kann in diesem Fall aber von FHEM aus dem Gerät ein Kommando schicken um es in den Bootloader Modus zu bringen. Dies geht mit dem Befehl
Zeile 75: Zeile 79:
== Mögliche Probleme ==
== Mögliche Probleme ==
Lässt sich die Firmware nicht OTA auf das HomeMatic-Device flashen, kann dies folgende Ursachen haben:
Lässt sich die Firmware nicht OTA auf das HomeMatic-Device flashen, kann dies folgende Ursachen haben:
* Die Fhem-Software ist nicht auf dem neuesten Stand. Bitte vorher ein ''update'' durchführen.
* Die FHEM-Software ist nicht auf dem neuesten Stand. Bitte vorher ein ''update'' durchführen.
* '''Entfernung''' zwischen Sender und Empfänger '''zu klein'''. 1,5 bis 2 m Abstand sollten beide Geräte zueinander mindestens haben.
* '''Entfernung''' zwischen Sender und Empfänger '''zu klein'''. 1,5 bis 2 m Abstand sollten beide Geräte zueinander mindestens haben.
* '''Entfernung''' zwischen Sender und Empfänger '''zu groß'''. Überprüfen Sie die RSSI-Werte des zu flashenden Device. Schlechter als - 70 sollten sie nicht sein (also keine - 75 oder noch kleiner). Ansonsten muss der Abstand für die Dauer des Flashens verringert werden.
* '''Entfernung''' zwischen Sender und Empfänger '''zu groß'''. Überprüfen Sie die RSSI-Werte des zu flashenden Device. Schlechter als - 70 sollten sie nicht sein (also keine - 75 oder noch kleiner). Ansonsten muss der Abstand für die Dauer des Flashens verringert werden.
* Durch wiederholte Firmware-Updates oder Update-Versuche hat die [[1% Regel]] zugeschlagen. Der dort genannte Notbehelf (Funkschnittstelle kurz stromlos machen) schafft Abhilfe.


== Tool zur Firmware Versionsprüfung ==
== Tool zur Firmware Versionsprüfung ==
[[Datei:HM-FWUpdate-eQ3.png|mini|400px|right|Beispiel einer Liste der relevanten Firmware Updates<br />'''Legende:'''<br />1 - Link auf die eQ-3 Download-Seite <br />2 - Link auf die Details des HTTPMOD Device <br />3 - Link auf die Details des HomeMatic Device <br />4 - (Download) Link auf die Firmware Datei <br />5 - "reread": Aktualisierung dieser Liste auslösen]]
[[Datei:HM-FWUpdate-eQ3.png|mini|400px|left|Beispiel einer Liste der relevanten Firmware Updates<br />'''Legende:'''<br />1 - Link auf die eQ-3 Download-Seite <br />2 - Link auf die Details des HTTPMOD Device <br />3 - Link auf die Details des HomeMatic Device <br />4 - (Download) Link auf die Firmware Datei <br />5 - "reread": Aktualisierung dieser Liste auslösen]]
Im Fhem-Forum wurden unter dem Titel {{Link2Forum|Topic=47729|LinkText=...Firmware Versionsprüfung}} die erforderlichen Definitionen für ein [[HTTPMOD]]-Device vorgestellt, das  
Im FHEM-Forum wurden unter dem Titel {{Link2Forum|Topic=47729|LinkText=...Firmware Versionsprüfung}} die erforderlichen Definitionen für ein [[HTTPMOD]]-Device vorgestellt, das  
* für alle HomeMatic Devices der aktuellen Fhem-Umgebung
* für alle HomeMatic Devices der aktuellen FHEM-Umgebung
* die derzeit benutzte Firmware Version mit
* die derzeit benutzte Firmware Version mit
* einem evtl. auf der eQ-3 Seite verfügbaren Update vergleicht und
* einem evtl. auf der eQ-3 Seite verfügbaren Update vergleicht und
* alle für die aktuelle Installation relevanten Updates in einer Übersicht (siehe Screenshot) darstellt und
* alle für die aktuelle Installation relevanten Updates in einer Übersicht (siehe Screenshot) darstellt und
* einmal täglich (alle 86400 Sekunden) automatisch ausgeführt wird; dieses Intervall sollte nicht verkürzt, sondern eher verlängert werden. Im Bedarfsfall kann durch anklicken von '''''reread''''' eine sofortige Aktualisierung ausgelöst werden.
* einmal täglich (alle 86400 Sekunden) automatisch ausgeführt wird; dieses Intervall sollte nicht verkürzt, sondern eher verlängert werden. Im Bedarfsfall kann durch anklicken von '''''reread''''' eine sofortige Aktualisierung ausgelöst werden.
<br clear=all>
<br clear="all">
{{Randnotiz|RNTyp=y|RNText=Sollte eine alte (vor dem 15.3.2016) Version dieser Definitionen bereits in Benutzung sein (zu erkennen am Vorhandensein von ''<nowiki>reading0[2|3|4|5]*</nowiki>''-Attributen), dann wird empfohlen, das Device mit <code>delete eq3</code> zunächst komplett zu löschen und anschließend neu anzulegen.}}
{{Randnotiz|RNTyp=y|RNText=Sollte eine alte (vor dem 15.3.2016) Version dieser Definitionen bereits in Benutzung sein (zu erkennen am Vorhandensein von ''<nowiki>reading0[2|3|4|5]*</nowiki>''-Attributen), dann wird empfohlen, das Device mit <code>delete eq3</code> zunächst komplett zu löschen und anschließend neu anzulegen.}}
Die unten aufgeführten erforderlichen Anweisungen zur Erstellung dieser Übersicht sind
Die unten aufgeführten erforderlichen Anweisungen zur Erstellung dieser Übersicht sind
Zeile 93: Zeile 98:
* der umfangreiche Perl-Code für das Attribut ''userReadings'' ist dargestellt für die Eingabe über das [[FHEMWEB|Webinterface]]
* der umfangreiche Perl-Code für das Attribut ''userReadings'' ist dargestellt für die Eingabe über das [[FHEMWEB|Webinterface]]
* für das Attribut ''stateFormat'' ist die mehrzeilige Eingabe (zumindest derzeit, März 2016) nicht unterstützt, daher wurde der Code in eine Subroutine ausgelagert
* für das Attribut ''stateFormat'' ist die mehrzeilige Eingabe (zumindest derzeit, März 2016) nicht unterstützt, daher wurde der Code in eine Subroutine ausgelagert
<br clear=all>{{Randnotiz|RNTyp=r|RNText='''Wichtige Änderungen:'''
<br clear="all">{{Randnotiz|RNTyp=r|RNText='''Wichtige Änderungen:'''
22.05.2016 - ''reading01Regex'' und ''reading01Format'' angepasst (eQ-3)
22.05.2016 - ''reading01Regex'' und ''reading01Format'' angepasst (eQ-3)
}}<br clear=all>


=== Basis-Definitionen für Device eq3 ===
02.09.2019 {{Link2Forum|Topic=78501|LinkText=...Firmware check funktioniert nicht}}
<source lang="text">
}}<br clear="all">
define eq3 HTTPMOD http://www.eq-3.de/service/downloads.html 86400
 
attr eq3 userattr enableControlSet event-on-change-reading event-on-update-reading reading01AutoNumLen reading01Format reading01Name reading01RegOpt reading01RegOpt:s,i,g reading01Regex readingMaxAge readingMaxAgeReplacementMode readingMaxAgeReplacementMode:text,expression,delete requestData.* showError showMatched stateFormat userReadings webCmd
=== Definitionen in FHEM ===
Durch seine Historie zeigt dieser Artikel fast schon unfreiwillig die Vielfalt der Lösungswege in FHEM.
Die Beschreibung ist Modular:
* Basis
* schnell fertig mit attrTemplate
* Attribute mit der Raw Definition anlegen
* Weitere Attribute mit Perl Code in der 99_myUtils oder direkt in der DEF
Zunächst einfach nur eine Zeile für die grundlegende Definition.
<syntaxhighlight lang="text">
define eq3 HTTPMOD https://www.eq-3.de/ajax/downloads/downloads_eq3.php 604800
</syntaxhighlight>
=== Definitionen der Attribute mit attrTemplate ===
Ab September 2019 geht es ganz einfach weiter mit attrTemplate.
[[Datei:SetAttrTemplateEq3.png|tumb|400px|left|Menüauswahl set Befehl]]
<br>
<br>
* Hinter dem set Button findet man das Auswahlmenü mit attrTemplate an prominenter erster Stelle.  
* In der weiteren Klappliste weit nach unten gehen, dort findet man ''CUL_HM_firmware_update_downloader''.
* Dieses Template auswählen, set drücken, etwas warten und fertig. Das Device wird selbständig gefüllt.
* Das Device wird dem Raum CUL_HM zugewiesen
 
Man kann den set Befehl auch in der Kommandozeile oder gemeinsam mit der obigen Definition in der Raw Definition importieren.
<syntaxhighlight lang="text">
set eq3 attrTemplate homematic_fw_check_v2
 
</syntaxhighlight>
'''Vorteil:''' Sollten sich in Zukunft Änderungen am Device ergeben (weil z.B. eq3 ihre Seite ändert) kann diese Änderung über update verteilt werden. Ein erneute Zuweisung bringt dann ein aktuelles Device.
 
'''Damit ist die Definition fertig!''' Alle weiteren Schritte hier stehen nur zur vollständigen Dokumentation.
 
=== Basis Definitionen manuell ===
Die folgende Attribute Basis Definition ist einfach über die Raw Def einzufügen.
<syntaxhighlight lang="text">
attr eq3 userattr enableControlSet event-on-change-reading event-on-update-reading reading01AutoNumLen reading01Format reading01Name reading01RegOpt reading01RegOpt:s,i,g reading01Regex readingMaxAge readingMaxAgeReplacementMode readingMaxAgeReplacementMode:text,expression,delete readingMaxAgeReplacementMode:text,reading,internal,expression,delete requestData.* showError showMatched stateFormat userReadings webCmd
attr eq3 alignTime 00:45
attr eq3 enableControlSet 1
attr eq3 enableControlSet 1
attr eq3 event-on-change-reading .*
attr eq3 event-on-change-reading .*
attr eq3 event-on-update-reading LAST_ERROR,MATCHED_READINGS
attr eq3 event-on-update-reading LAST_ERROR,MATCHED_READINGS
attr eq3 reading01AutoNumLen 2
attr eq3 reading01AutoNumLen 2
attr eq3 reading01Format http://www.eq-3.de/%s
attr eq3 reading01Format https://www.eq-3.de%s
attr eq3 reading01Name fw_link
attr eq3 reading01Name fw_link
attr eq3 reading01RegOpt g
attr eq3 reading01RegOpt gi
attr eq3 reading01Regex <a.href="(Downloads\/Software\/Firmware\/[^"]+)
attr eq3 reading01Regex <a.href="(\/downloads\/software\/firmware\/hm[^"]+)
attr eq3 readingMaxAge 10
attr eq3 readingMaxAge 10
attr eq3 readingMaxAgeReplacementMode delete
attr eq3 readingMaxAgeReplacementMode delete
attr eq3 requestData.* suchtext=&suche_in=2&downloadart=11
attr eq3 requestData.* suchbegriff=&quelle=29&suchkategorie=3&themenbereich=1
attr eq3 room eq3
attr eq3 room eq3
attr eq3 showError 1
attr eq3 showError 1
attr eq3 showMatched 1
attr eq3 showMatched 1
attr eq3 stateFormat {eq3StateFormat}
attr eq3 webCmd reread
attr eq3 webCmd reread
</source>
</syntaxhighlight>
 
Es werden noch zwei Attribute benötigt, es gibt dabei die Varianten den Code direkt im Attribute einzugeben oder beide Attribute über eine Sub in die 99_myUtils.pm auszulagern. Wählt man die Variante mit der 99_myUtils muss man zuerst beide Subs dort einfügen und kann anschließend einfach diese beiden Zeil noch über die Raw Def einfügen
<syntaxhighlight lang="text">
attr eq3 stateFormat {eq3StateFormat($name)}
attr eq3 userReadings newFwForDevices:MATCHED_READINGS:.* {eq3Attr}
</syntaxhighlight>
=== Definition/Code für 99_myUtils.pm ===
Da der Code für ''userReadings'' und ''stateFormat'' recht umfangreich ist, ist es besser beides in (Sub-)Routinen in die [[99_myUtils anlegen|99_myUtils]] auszulagern:
<syntaxhighlight lang="perl">
sub eq3Attr{
#####################
# hier den Code für UserReadings einfügen
#####################
}
sub eq3StateFormat($) {
    my $name = shift @_;
#####################
#  hier den Code für eq3StateFormat($name) einfügen
#####################
}
</syntaxhighlight>
=== Definition/Code für Attribut userReadings ===
=== Definition/Code für Attribut userReadings ===
Der "Zugang" zur Eingabe des Attributs ''stateFormat'' erfolgt über die Details des Device '''eq3''' (URL: ...8083/fhem?detail=eq3).
Die Definition für das Attribut ''userReadings'' :
[[Datei:HM-FWUpdate-eQ3-userReadings.png|mini|640px|left|"Der Weg" zur Eingabe von ''userReadings''; durch Klick in das Eingabefeld öffnet sich ein separates Fenster.]]
<syntaxhighlight lang="perl">
<br clear=all>Der Perl-Code, der für das Attribut ''userReadings'' eingegeben werden muss:
attr eq3 userReadings newFwForDevices:MATCHED_READINGS:.* {\
<source lang="perl">
#  hier den Perl Code UserReadings einfügen\
newFwForDevices:MATCHED_READINGS:.* {
  my $ret = "";
  my @data;
  my @eq3FwList = map{@data = ReadingsVal("eq3","fw_link-".$_,"?") =~ m/Firmware\/(.*?)_update_V([\d_]+)_(\d\d)(\d\d)(\d\d)/;
            $data[0] =~ s/_/-/g;
            sprintf("%s:%s:%s.%s.%s:%s",$data[0],$data[1],$data[4],$data[3],"20".$data[2],$_);
            } 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}:/i,@eq3FwList) {
      my ($nh,$nl,$no,$date,$idx) = $newFw =~ m/^[^:]+:(\d+)_(\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?sprintf(".%d",$no):"")." | ".$date.")";
      }
    }
  }
  return ($ret eq "")?"no fw-updates needed!":$ret;
}
}
</source>
</syntaxhighlight>
Perlcode UserReadings
<syntaxhighlight lang="perl">
my $ret = "";
my @data;
my @eq3FwList = map{@data = ReadingsVal("eq3","fw_link-".$_,"?") =~ m/Firmware\/(.*?)_update_V([\d_]+)_(\d\d)(\d\d)(\d\d)/i;
$data[0] =~ s/_/-/g;
sprintf("%s:%s:%s.%s.%s:%s",$data[0],$data[1],$data[4],$data[3],"20".$data[2],$_);
} 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}:/i,@eq3FwList) {
  my ($nh,$nl,$no,$date,$idx) = $newFw =~ m/^[^:]+:(\d+)_(\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?sprintf(".%d",$no):"")." | ".$date.")";
  }
}
}
return ($ret eq "")?"no fw-updates needed!":$ret;
</syntaxhighlight>


=== Definition/Code für Attribut stateFormat ===
=== Definition/Code für Attribut stateFormat ===
Da der Code für ''stateFormat'' recht umfangreich ist, wäre er als Einzeiler kaum sinnvoll zu verwalten, würde also ohnehin meistens über einen externen Editor bearbeitet werden. Daher wurde er als eigene (Sub-)Routine mit dem Namen ''eq3StateFormat'' in (z.B.) [[99_myUtils anlegen|99_myUtils]] ausgelagert:
Die Definition für das Attribut ''stateFormat'' :
<source lang="perl">
<syntaxhighlight lang="perl">
sub eq3StateFormat() {
attr eq3 stateFormat {\
  my $name = "eq3";
# hier den Code für eq3StateFormat($name) einfügen\
 
  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,$date) = $devStr =~ m/^([^\s]+)\s\(([^\s]+)\s\|\sfw_(\d+\.\d+)\s=>\sfw(\d\d)_([\d\.]+)\s\|\s([^\)]+)\)$/;         
      my $link = ReadingsVal($name,"fw_link-".$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 receive missing data" style="color:yellow"':' style="color:lightgray"').'>';           
      $ret .= sprintf("%-23s",$md);         
      $ret .= '</b>';           
      $ret .= " | ";           
      $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 .= " | ";           
      $ret .= '<a title="eq3-firmware.tgz" href="'.$link.'">';         
      $ret .= '<b style="color:red">';         
      $ret .= sprintf("%6s",$nfw);         
      $ret .= '</b>';           
      $ret .= '</a>';           
      $ret .= " | ";           
      $ret .= sprintf("%-10s",$date);           
      $ret .= " |\n";       
    } 
  } 
  $ret .= '</pre>'; 
  $ret .= '</div>'; 
  return $ret;
}
}
</source>
</syntaxhighlight>
Perlcode eq3StateFormat($name)
<syntaxhighlight lang="perl">
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>';
$ret .= '<pre>';
$ret .= "| device                  | model                  | cur_fw | new_fw | release    |<br>";
$ret .= "------------------------------------------------------------------------------------<br>";
my $check = ReadingsVal($name,"newFwForDevices","error => no or wrong data from eq3-server!");
if($check eq "no fw-updates needed!") {
$ret .= '| ';
$ret .= '<b style="color:green">';
$ret .= sprintf("%-80s",$check);
$ret .= '</b>';
$ret .= ' |';
} elsif($check eq "error => no or wrong data from eq3-server!") {
$ret .= '| ';
$ret .= '<b style="color:red">';
$ret .= sprintf("%-80s",$check);
$ret .= '</b>';
$ret .= ' |';
} else {
my @devices = split(',',$check);
foreach my $devStr (@devices) {
my ($dev,$md,$ofw,$idx,$nfw,$date) = $devStr =~ m/^([^\s]+)\s\(([^\s]+)\s\|\sfw_(\d+\.\d+)\s=>\sfw(\d\d)_([\d\.]+)\s\|\s([^\)]+)\)$/;
my $link = ReadingsVal($name,"fw_link-".$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 receive missing data" style="color:yellow"':' style="color:lightgray"').'>'; 
$ret .= sprintf("%-23s",$md);
$ret .= '</b>'; 
$ret .= " | "; 
$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 .= " | "; 
$ret .= '<a title="eq3-firmware.tgz" href="'.$link.'">'; 
$ret .= '<b style="color:red">'; 
$ret .= sprintf("%6s",$nfw);
$ret .= '</b>'; 
$ret .= '</a>'; 
$ret .= " | "; 
$ret .= sprintf("%-10s",$date);
$ret .= " |<br>"; 
}
}
$ret .= '</pre>';
$ret .= '</div>';
return $ret;
</syntaxhighlight>


=== Sondersituationen ===
=== Sondersituationen ===
Zeile 209: Zeile 279:


== Links ==
== Links ==
* [http://www.eq-3.de/downloads.html Firmware Download] Seite von eq-3
* [https://www.eq-3.de/service/downloads.html Firmware Download] Seite von eq-3
* Forenthread zur {{Link2Forum|Topic=47729|LinkText="Firmware Versionsprüfung"}}
* Forenthread zur {{Link2Forum|Topic=47729|LinkText="Firmware Versionsprüfung"}}
* [http://git.zerfleddert.de/hmcfgusb/ Firmware Update Tool] von mgernoth
* [http://git.zerfleddert.de/hmcfgusb/ Firmware Update Tool] von mgernoth


[[Kategorie:HomeMatic Components]]
[[Kategorie:HomeMatic Components|1toolsAndWork]]
[[Kategorie:HOWTOS]]
[[Kategorie:HOWTOS]]

Aktuelle Version vom 21. Februar 2020, 20:09 Uhr

Seit 2014 ist es möglich, bei einigen HomeMatic Komponenten selbst Firmware Updates durchzuführen. Vorher ging das nur per CCU oder durch Einsenden des Gerätes an ELV. Dabei gibt es verschiedene Möglichkeiten das Firmware Update durchzuführen. Um in FHEM die aktuelle Firmware nach dem Update angezeigt zu bekommen, ist ein erneutes Pairen mit FHEM notwendig. Es muss aber nicht gelöscht oder zurückgesetzt werden.

Varianten für Firmwareupdates

Firmware Update mit CUL/HM-CFG-USB/HMUARTLGW unter FHEM

FW Updates sind in FHEM möglich. Benötigt wird dafür ein CUL oder ein HM-CFG-USB oder ein HMUARTLGW. Mit einem HMLAN ist ein Update nicht möglich.

Vor dem Update ist sicherzustellen, dass das korrekte IO für das Device genutzt wird (falls mehrere IOs im System zu Verfügung stehen). Siehe Attribut IODev und IOgrp bei der Verwendung einer VCCU. Ein HMLAN kann mit dem Befehl: set <HMLAN Name> close temporär ausgeschlossen werden.

Um das Update durchführen zu können, wird die in dem entsprechenden Zip/tgz-File vorhandene .eq3-Datei benötigt. Bitte genau darauf achten, dass nicht versehentlich eine falsches Firmware-Datei verwendet wird. Der Vorgang selbst erfolgt mittels folgendem Befehl:

set <device> fwUpdate <filename> [<time>]

<filename> ist der Name der .eq3 Datei inklusive absolutem oder relativem Pfad zu fhem-Root. Die Angabe von [

Bei einigen älteren FW-Versionen wie z.B. bei den HM-CC-RT-DN v1.0 geht das allerdings nicht automatisch. Um den Flashvorgang zu starten, müssen hier noch die Batterien entfernt werden und beim wiedereinlegen die beiden äußeren Knöpfe gedrückt werden. Jene Zeit, die man für eben diese Aktion benötigt, wird hier eingegeben.

Wichtig: während des Updates können keine weiteren Nachrichten in FHEM von Homematic verarbeitet werden.

Da nach dem Update immer noch die alte FW-Version in FHEM steht, kann man entweder bei einigen Geräten die Version mit

set <device> getVersion

auslesen oder wenn das Kommando wie z.B. bei den oben genannten Heizkörperventilen nicht zur Verfügung steht, genügt es, am Gerät selbst die Anlerntaste zu drücken (was am Beispiel der RTs bedeutet, dass die Boost-Taste für mindestens drei Sekunden gedrückt werden muss). Nach der Aktualisierung der Firmware-Information in FHEM, muss die Konfiguration noch gespeichert werden.

Fehlersuche / Probleme beim Update via FHEM

  • Der Firmware-Update nimmt mehrere Minuten in Anspruch (bei einem HM-LC-Bl1PBU-FM bis zu 10 Minuten). Über attr <device> verbose 5 kann man für das HM-Device im Log den Fortschritt detaillierter beobachten.
  • Sollte es zu einem Abbruch kommen, kann es dazu kommen, dass weitere FW-Update-Versuche abgebrochen werden mit der Fehlermeldung "fail:notInBootLoader" und einem grünen Dauerblinken an der Anlerntaste (Beitrag). In diesem Fall kann die explizite Angabe des Parameters [<time>] helfen.

Firmware Update mit CUL/HM-CFG-USB unter Linux

Für Linux hat mgernoth ein Updatetool erstellt.

Zunächst muss sichergestellt werden, dass alle benötigten Pakete installiert sind. Um das Tool zu installieren und auszuführen, müssen die folgenden Pakete mit den gezeigten Befehlen installiert werden. Unter Debian:

sudo apt-get install libusb-1.0-0-dev git build-essential

Unter OpenSuse 13.2 64 Bit:

sudo zypper install libusb-1.0-0-dev git 
sudo zypper install --type pattern devel_basis

Als nächstes wird der Sourcecode für das Tool heruntergeladen (vorher z.B. in den Pfad /usr/src wechseln):

git clone git://git.zerfleddert.de/hmcfgusb

Und mit den Anweisungen

cd hmcfgusb
make

wird daraus eine ausführbare Datei erstellt.

Weiterhin muss die nötige Firmware heruntergeladen und entpackt werden. Die offiziellen Updates gibt es unter eq-3 Downloads. Die Befehle, um beispielsweise die benötigte Datei für die Firmware Version 1.4 des HM-CC-RT-DN zu erhalten lauten:

wget http://www.eq-3.de/Downloads/Software/Firmware/hm_cc_rt_dn_update_V1_4_001_141020.tgz
tar xvzf hm_cc_rt_dn_update_V1_4_001_141020.tgz

Zu guter Letzt muss noch das Tool mit einigen Parametern und der Seriennummer des HomeMatic Devices aufgerufen werden. Für ein Update mit einem CUL (/dev/ttyACM0 ist in diesem Beispiel die Adresse des CULs) muss folgendes eingegeben werden:

sudo ./flash-ota -c /dev/ttyACM0 -f <FirmwareImageName>.eq3 -s <DeviceSerialNo>

Für ein Update mit einem COC muss folgendes eingegeben werden (/dev/ttyAMA0):

sudo ./flash-ota -c /dev/ttyAMA0 -f <FirmwareImageName>.eq3 -s <DeviceSerialNo>

Für ein Update mit HM-CFG-USB

sudo ./flash-ota -f <FirmwareImageName>.eq3 -s <DeviceSerialNo>

Nun muss nur noch das HomeMatic Gerät in den Update-Modus versetzt werden. Wie das geht, steht in der jeweils mit der Firmwaredatei gelieferten "readme".

Firmware Update mit HM-CFG-USB unter Windows

Für ein Firmwareupdate unter Windows wird das "HomeMatic Firmware Update Tool" von eq-3 benötigt: eQ-3 Downloads. Zur Zeit ist das Update damit nur mit dem HM-CFG-USB-2 möglich, nicht aber mit dem HM-CFG-LAN oder dem HM-CFG-USB der ersten Generation.

Nach dem Start muss die Seriennummer des HomeMatic-Device eingegeben und die Firmware-Datei ausgewählt werden. Dann wird das Update-Tool durch einen Klick auf den entsprechenden Button in "Bereitschaft" gesetzt und anschließend muss das HomeMatic-Gerät in den Update-Modus versetzt werden. Bei Unterputz-Geräten ist das eventuell gar nicht so einfach, man kann in diesem Fall aber von FHEM aus dem Gerät ein Kommando schicken um es in den Bootloader Modus zu bringen. Dies geht mit dem Befehl

set <device> fwUpdate onlyEnterBootLoader

Direkt danach sollte das Update Tool mit seiner Arbeit beginnen.

Falls das Update-Tool beim Auswählen der Firmware-Datei abstürzt ("Home Matic Firmware Update Tool funktioniert nicht mehr"), dann stimmt wahrscheinlich etwas mit der Firmware-Datei nicht. Die Datei darf nicht ausgepackt, sondern muss als ".tar.gz"-Datei, so wie sie heruntergeladen wurde, benutzt werden. Es kann Probleme geben, wenn die Datei mit dem Internet Explorer heruntergeladen wurde. Am einfachsten ist es, die Datei mit einem anderen Browser herunterzuladen.

Mögliche Probleme

Lässt sich die Firmware nicht OTA auf das HomeMatic-Device flashen, kann dies folgende Ursachen haben:

  • Die FHEM-Software ist nicht auf dem neuesten Stand. Bitte vorher ein update durchführen.
  • Entfernung zwischen Sender und Empfänger zu klein. 1,5 bis 2 m Abstand sollten beide Geräte zueinander mindestens haben.
  • Entfernung zwischen Sender und Empfänger zu groß. Überprüfen Sie die RSSI-Werte des zu flashenden Device. Schlechter als - 70 sollten sie nicht sein (also keine - 75 oder noch kleiner). Ansonsten muss der Abstand für die Dauer des Flashens verringert werden.
  • Durch wiederholte Firmware-Updates oder Update-Versuche hat die 1% Regel zugeschlagen. Der dort genannte Notbehelf (Funkschnittstelle kurz stromlos machen) schafft Abhilfe.

Tool zur Firmware Versionsprüfung

Beispiel einer Liste der relevanten Firmware Updates
Legende:
1 - Link auf die eQ-3 Download-Seite
2 - Link auf die Details des HTTPMOD Device
3 - Link auf die Details des HomeMatic Device
4 - (Download) Link auf die Firmware Datei
5 - "reread": Aktualisierung dieser Liste auslösen

Im FHEM-Forum wurden unter dem Titel ...Firmware Versionsprüfung die erforderlichen Definitionen für ein HTTPMOD-Device vorgestellt, das

  • für alle HomeMatic Devices der aktuellen FHEM-Umgebung
  • die derzeit benutzte Firmware Version mit
  • einem evtl. auf der eQ-3 Seite verfügbaren Update vergleicht und
  • alle für die aktuelle Installation relevanten Updates in einer Übersicht (siehe Screenshot) darstellt und
  • einmal täglich (alle 86400 Sekunden) automatisch ausgeführt wird; dieses Intervall sollte nicht verkürzt, sondern eher verlängert werden. Im Bedarfsfall kann durch anklicken von reread eine sofortige Aktualisierung ausgelöst werden.


Emblem-question-yellow.svgSollte eine alte (vor dem 15.3.2016) Version dieser Definitionen bereits in Benutzung sein (zu erkennen am Vorhandensein von reading0[2|3|4|5]*-Attributen), dann wird empfohlen, das Device mit delete eq3 zunächst komplett zu löschen und anschließend neu anzulegen.

Die unten aufgeführten erforderlichen Anweisungen zur Erstellung dieser Übersicht sind

  • im wesentlichen über das Webinterface eingebbar (können aber auch "en bloc" in die fhem.cfg eingetragen werden - auch wenn das eigentlich nicht empfohlen ist)
  • der umfangreiche Perl-Code für das Attribut userReadings ist dargestellt für die Eingabe über das Webinterface
  • für das Attribut stateFormat ist die mehrzeilige Eingabe (zumindest derzeit, März 2016) nicht unterstützt, daher wurde der Code in eine Subroutine ausgelagert


X mark.svgWichtige Änderungen:

22.05.2016 - reading01Regex und reading01Format angepasst (eQ-3)

02.09.2019 ...Firmware check funktioniert nicht


Definitionen in FHEM

Durch seine Historie zeigt dieser Artikel fast schon unfreiwillig die Vielfalt der Lösungswege in FHEM. Die Beschreibung ist Modular:

  • Basis
  • schnell fertig mit attrTemplate
  • Attribute mit der Raw Definition anlegen
  • Weitere Attribute mit Perl Code in der 99_myUtils oder direkt in der DEF

Zunächst einfach nur eine Zeile für die grundlegende Definition.

define eq3 HTTPMOD https://www.eq-3.de/ajax/downloads/downloads_eq3.php 604800

Definitionen der Attribute mit attrTemplate

Ab September 2019 geht es ganz einfach weiter mit attrTemplate.

Menüauswahl set Befehl



  • Hinter dem set Button findet man das Auswahlmenü mit attrTemplate an prominenter erster Stelle.
  • In der weiteren Klappliste weit nach unten gehen, dort findet man CUL_HM_firmware_update_downloader.
  • Dieses Template auswählen, set drücken, etwas warten und fertig. Das Device wird selbständig gefüllt.
  • Das Device wird dem Raum CUL_HM zugewiesen

Man kann den set Befehl auch in der Kommandozeile oder gemeinsam mit der obigen Definition in der Raw Definition importieren.

set eq3 attrTemplate homematic_fw_check_v2

Vorteil: Sollten sich in Zukunft Änderungen am Device ergeben (weil z.B. eq3 ihre Seite ändert) kann diese Änderung über update verteilt werden. Ein erneute Zuweisung bringt dann ein aktuelles Device.

Damit ist die Definition fertig! Alle weiteren Schritte hier stehen nur zur vollständigen Dokumentation.

Basis Definitionen manuell

Die folgende Attribute Basis Definition ist einfach über die Raw Def einzufügen.

attr eq3 userattr enableControlSet event-on-change-reading event-on-update-reading reading01AutoNumLen reading01Format reading01Name reading01RegOpt reading01RegOpt:s,i,g reading01Regex readingMaxAge readingMaxAgeReplacementMode readingMaxAgeReplacementMode:text,expression,delete readingMaxAgeReplacementMode:text,reading,internal,expression,delete requestData.* showError showMatched stateFormat userReadings webCmd
attr eq3 alignTime 00:45
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 https://www.eq-3.de%s
attr eq3 reading01Name fw_link
attr eq3 reading01RegOpt gi
attr eq3 reading01Regex <a.href="(\/downloads\/software\/firmware\/hm[^"]+)
attr eq3 readingMaxAge 10
attr eq3 readingMaxAgeReplacementMode delete
attr eq3 requestData.* suchbegriff=&quelle=29&suchkategorie=3&themenbereich=1
attr eq3 room eq3
attr eq3 showError 1
attr eq3 showMatched 1
attr eq3 webCmd reread

Es werden noch zwei Attribute benötigt, es gibt dabei die Varianten den Code direkt im Attribute einzugeben oder beide Attribute über eine Sub in die 99_myUtils.pm auszulagern. Wählt man die Variante mit der 99_myUtils muss man zuerst beide Subs dort einfügen und kann anschließend einfach diese beiden Zeil noch über die Raw Def einfügen

attr eq3 stateFormat {eq3StateFormat($name)}
attr eq3 userReadings newFwForDevices:MATCHED_READINGS:.* {eq3Attr}

Definition/Code für 99_myUtils.pm

Da der Code für userReadings und stateFormat recht umfangreich ist, ist es besser beides in (Sub-)Routinen in die 99_myUtils auszulagern:

sub eq3Attr{
#####################
# hier den Code für UserReadings einfügen
#####################
}
sub eq3StateFormat($) {
    my $name = shift @_;
##################### 
#  hier den Code für eq3StateFormat($name) einfügen
#####################
}

Definition/Code für Attribut userReadings

Die Definition für das Attribut userReadings :

attr eq3 userReadings newFwForDevices:MATCHED_READINGS:.* {\
#  hier den Perl Code UserReadings einfügen\
}

Perlcode UserReadings

	my $ret = "";
	my @data;
	my @eq3FwList = map{@data = ReadingsVal("eq3","fw_link-".$_,"?") =~ m/Firmware\/(.*?)_update_V([\d_]+)_(\d\d)(\d\d)(\d\d)/i; 
			$data[0] =~ s/_/-/g;
			sprintf("%s:%s:%s.%s.%s:%s",$data[0],$data[1],$data[4],$data[3],"20".$data[2],$_);
			} 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}:/i,@eq3FwList) {
		  my ($nh,$nl,$no,$date,$idx) = $newFw =~ m/^[^:]+:(\d+)_(\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?sprintf(".%d",$no):"")." | ".$date.")";
		  }
		}
	}
	return ($ret eq "")?"no fw-updates needed!":$ret;

Definition/Code für Attribut stateFormat

Die Definition für das Attribut stateFormat :

attr eq3 stateFormat {\
# hier den Code für eq3StateFormat($name) einfügen\
}

Perlcode eq3StateFormat($name)

	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>'; 	
	$ret .= '<pre>'; 	
	$ret .= "| device                  | model                   | cur_fw | new_fw | release    |<br>"; 	
	$ret .= "------------------------------------------------------------------------------------<br>"; 	
	my $check = ReadingsVal($name,"newFwForDevices","error => no or wrong data from eq3-server!"); 	
	if($check eq "no fw-updates needed!") {
		$ret .= '| ';
		$ret .= '<b style="color:green">';
		$ret .= sprintf("%-80s",$check);
		$ret .= '</b>';
		$ret .= ' |';
	} elsif($check eq "error => no or wrong data from eq3-server!") {
		$ret .= '| ';
		$ret .= '<b style="color:red">';
		$ret .= sprintf("%-80s",$check);
		$ret .= '</b>';
		$ret .= ' |';
	} else { 		
		my @devices = split(',',$check); 		
		foreach my $devStr (@devices) { 			
			my ($dev,$md,$ofw,$idx,$nfw,$date) = $devStr =~ m/^([^\s]+)\s\(([^\s]+)\s\|\sfw_(\d+\.\d+)\s=>\sfw(\d\d)_([\d\.]+)\s\|\s([^\)]+)\)$/; 			
			my $link = ReadingsVal($name,"fw_link-".$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 receive missing data" style="color:yellow"':' style="color:lightgray"').'>';  			
			$ret .= sprintf("%-23s",$md); 			
			$ret .= '</b>';  			
			$ret .= " | ";  			
			$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 .= " | ";  			
			$ret .= '<a title="eq3-firmware.tgz" href="'.$link.'">';  			
			$ret .= '<b style="color:red">';  			
			$ret .= sprintf("%6s",$nfw); 			
			$ret .= '</b>';  			
			$ret .= '</a>';  			
			$ret .= " | ";  			
			$ret .= sprintf("%-10s",$date); 			
			$ret .= " |<br>";  		
		} 	
	} 	
	$ret .= '</pre>'; 	
	$ret .= '</div>'; 	
	return $ret;

Sondersituationen

Fehlerbedingung: Attribut firmware nicht gesetzt

Das Tool überprüft gleichzeitig auch bestimmte Rahmenbedingungen, so z.B., ob bei allen HomeMatic Devices die Attribute model und firmware gesetzt sind. Sollte das nicht der Fall sein, wird das Device in der Liste

  • mit einem gelben "old_fw" Wert von 0.0 geführt; befindet sich der Mauszeiger über dem "0.0", wird der Hinweistext missing attribute firmware => set device in teach mode to receive missing data angezeigt (siehe Beispiel im Screenshot)
  • mit einem gelben ? in der Spalte "model" angezeigt; befindet sich der Mauszeiger über dem "?", wird der Hinweistext missing attribute model => set device in teach mode to receive missing data angezeigt

In diesem Fall sollte bei dem betreffenden Gerät versucht werden, mit getConfig die Daten zu aktualisieren bzw. vervollständigen.

Darüber hinaus ist zu beachten, dass die Firmware-Version in den HomeMatic Geräten zwei"teilig" (Version.Release) abgelegt ist, die Firmware Update-Dateien jedoch drei"teilige" Versionskennungen (Version_Release_???) haben. Für den Vergleich, ob neue Firmware verfügbar ist, kann natürlich nur die zweiteilige Kennung verwendet werden, eine Änderung im dritten Teil der Versionskennung kann daher nicht automatisch erkannt werden.

Links