HomeMatic Firmware Update

Aus FHEMWiki
Version vom 17. März 2016, 19:22 Uhr von Ph1959de (Diskussion | Beiträge) (RandNotiz unter das Bild "gezwungen")

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 unter FHEM

FW Updates sind in FHEM möglich. Benötigt wird dafür ein CUL oder ein HM-CFG-USB. 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.

Um das Update durchführen zu können, wird die in dem entsprechenden Zip-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.

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.

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.

Tool zur Firmware Versionsprüfung

Beispiel einer Liste der relevanten Firmware Updates

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.


Info green.pngErläuterungen zum Screenshot:
  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. Aktualisierung dieser Liste anfordern

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

  • formatiert für die eigentlich nicht empfohlene Direkteingabe in die fhem.cfg,
    • daher die Markierung von Zeilenumbrüchen mit \
    • und die teilweise Verdoppelung der ;) sind
  • sind ohne Veränderungen jeweils als (teilweise sehr lange) Einzeiler für jedes define... und attr... aufzufassen
  • einzig das userReadings Attribut ist für eine übersichtlichere Darstellung formatiert. Dieses Attribut lässt sich auch in der Web-Oberfläche in einem separaten Fenster mit Syntaxhervorhebung (nach-)bearbeiten.

Sollte 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.

define eq3 HTTPMOD http://www.eq-3.de/ajax/downloads.php 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
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 <a.href=\"(\/Downloads\/Software\/Firmware\/[^"]+)\"
attr eq3 readingMaxAge 10
attr eq3 readingMaxAgeReplacementMode delete
attr eq3 requestData.* suchtext=&suche_in=2&downloadart=11
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,$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;; }
attr eq3 userReadings 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;;\
}
attr eq3 webCmd reread

Links