HM-LC-Sw1PBU-FM Alternative Firmware: Unterschied zwischen den Versionen

Aus FHEMWiki
K (Schreibweise "HomeMatic")
 
(19 dazwischenliegende Versionen von 9 Benutzern werden nicht angezeigt)
Zeile 3: Zeile 3:


== Neue Funktionen ==
== Neue Funktionen ==
* Der Taster kann mit anderen Geräten [[Homematic Peering Beispiele|gepeert]] werden. Das ist mit der Originalfirmware nicht möglich.
* Der Taster kann mit anderen Geräten [[HomeMatic Peering Beispiele|gepeert]] werden. Das ist mit der Originalfirmware nicht möglich.
* Die alternative Firmware hat eine Stromerkennung, die hardwaretechnisch immer vorhanden ist, aber von der eQ-3 Firmware nicht benutzt wird. Es ist möglich, damit eine Wechselschaltung zu implementieren.
* Die alternative Firmware hat eine Stromerkennung, die hardwaretechnisch immer vorhanden ist, aber von der eQ-3 Firmware nicht benutzt wird. Es ist möglich, damit eine Wechselschaltung zu implementieren.


Zeile 18: Zeile 18:
|-
|-
|  Switch_1
|  Switch_1
der Switch_01 (Kanal 3 des Aktors) ist der virtuellen Kanal. <br>Wenn man den einschaltet, brennt das Licht, er berücksichtigt also einen ggf. schon bestehenden Stromfluss.<br>Wenn man den Ausschaltet, geht das Licht aus, wenn es nicht schon aus war. <br>Er zeigt weiterhin an, ob das Licht gerade an oder aus ist.
|  Switch_01 ist das Relais (Kanal 3 des Gerätes).
Er funktioniert so, wie die HM-eigene Firmware vorher auch funktioniert hat, d.h. Relais an/aus. Den braucht man also "eigentlich nicht".
|-
|-
|  Switch_2
|  Switch_2
der Switch_02 ist das Relais und funktioniert so , wie die HM-eigene Firmware vorher auch funktioniert hat. <br>Relais an/aus. Den braucht man also "eigentlich nicht".
|  Switch_02 ist der virtuelle Kanal (Kanal 4 des Gerätes). 
Wenn man den einschaltet, brennt das Licht, wenn es nicht schon an war. Wenn man den ausschaltet, geht das Licht aus, wenn es nicht schon aus war. Er zeigt weiterhin an, ob das Licht gerade an oder aus ist. Dabei wird ein ggf. bestehender Stromfluss berücksichtigt.
|}
|}
== Hinweis zum Einbau ==
Bei Einsatz in einer Wechselschaltung (oder Kreuz- und Wechselschaltung) ist der HM Schaltaktor immer auf der Seite der Verkabelung einzubauen, wo die ungeschaltete Phase zugeführt wird. Bei Einbau auf der Seite, die zur Lampe abgeht, funktioniert es nicht, da in diesem Fall im ausgeschalteten Zustand der HM-Switch stromlos ist. Es ist also nicht gleichgültig, an welchem Ende einer (Kreuz- und) Wechselschalter-Kette der HM-Switch eingebaut werden muss.


== Integration des Schalters in FHEM ==
== Integration des Schalters in FHEM ==
===Vorbereitungen===
Für die alternative Firmware existiert ein eigenes Modul. Dieses ist als Erstes zu installieren bzw nach ./FHEM zu kopieren:
:[https://github.com/jabdoa2/Asksin_HM_LC_Sw1PBU_FM/blob/master/fhem/99_Asksin_HM_LC_Sw1PBU_FM_CustomFW.pm 99_Asksin_HM_LC_Sw1PBU_FM_CustomFW.pm]
=== Anlernen ===
=== Anlernen ===
In FHEM ist der HomeMatic-CUL in den Anlernmodus zu bringen. Der ConfigButton des Schalters ist nun länger als vier Sekunden zu drücken. Wichtig: die LED darf nach Loslassen des Button nicht aufblinken; sie gibt keine Rückmeldung über den Status des Anlernvorgangs.
In FHEM ist der HomeMatic-[[CUL]] in den Anlernmodus zu bringen. Der ConfigButton des Schalters ist nun länger als vier Sekunden zu drücken. Wichtig: die LED darf nach Loslassen des Button nicht aufblinken; sie gibt keine Rückmeldung über den Status des Anlernvorgangs.


Nach dem Anlernen sollte nochmal die aktuelle Config ausgelesen werden. Das kann ein paar Sekunden dauern und ist abgeschlossen, sobald der "state" = "cmds done" ist.
Nach dem Anlernen sollte nochmal die aktuelle Config ausgelesen werden. Das kann ein paar Sekunden dauern und ist abgeschlossen, sobald der "state" = "cmds done" ist.
Zeile 34: Zeile 42:
  set <HM-LC-SW1PBU-FM_Device> regSet pairCentral <123456>
  set <HM-LC-SW1PBU-FM_Device> regSet pairCentral <123456>


Um den Schalter wie einen "normalen" Schalter wirken zu lassen, müssen noch die Buttons mit dem Switch gepeert werden. Danach bewirkt ein Tastendruck nach oben ein Einschalten, und ein Druck nach unten ein Ausschalten. Unterlässt man diesen Schritt, passiert bei einem Tastendruck am angeschlossenen Verbraucher nichts.
Um den Schalter wie einen "normalen" Schalter wirken zu lassen, müssen noch die Buttons mit dem Switch [[Peering (HomeMatic)|gepeert]] werden. Danach bewirkt ein Tastendruck nach oben ein Einschalten, und ein Druck nach unten ein Ausschalten. Unterlässt man diesen Schritt, passiert bei einem Tastendruck am angeschlossenen Verbraucher nichts.
  set <HM-LC-SW1PBU-FM_Btn_01 peerChan 0 <HM-LC-SW1PBU-FM_Sw_01 dual set  
  set <HM-LC-SW1PBU-FM_Btn_01 peerChan 0 <HM-LC-SW1PBU-FM_Sw_01 dual set  


Das erzeugt automatisch ein Peering zwischen deinen beiden internen Tastern und dem Kanal 3 (Sw_01). Damit sollte der Schalter eigentlich schon funktionieren  
Das erzeugt automatisch ein Peering zwischen deinen beiden internen Tastern und dem Kanal 3 (Sw_01). Damit sollte der Schalter eigentlich schon funktionieren  


Falls nicht, dann setzt man im Device das Register intKeysVisible auf "visib" und macht ein getConfig auf Kanal 3. Dort sieht man dann die Listen der Peers und erkennt, was dort ein Tastendruck bewirkt. In den Jump Targets (z.B . R-self01-shSwJtDlyOff) usw. muss dann bei dem Button, mit dem man '''AUS'''schalten will überall OFF stehen, und bei dem anderen Button entsprechend On.
Falls nicht, dann setzt man im Device das Register intKeyVisib auf "visib" und macht ein getConfig auf Kanal 3. Dort sieht man dann die Listen der Peers und erkennt, was dort ein Tastendruck bewirkt. In den Jump Targets (z.B . R-self01-shSwJtDlyOff) usw. muss dann bei dem Button, mit dem man '''AUS'''schalten will überall OFF stehen, und bei dem anderen Button entsprechend On.


Noch einfacher wäre es, falls vorhanden, ein Registerset von einem schon wie gewünscht konfigurierten Schalter (das kann auch einer mit Standard-FW sein) zu kopieren. Das geht mit dem Modul hminfo.  
Noch einfacher wäre es, falls vorhanden, ein Registerset von einem schon wie gewünscht konfigurierten Schalter (das kann auch einer mit Standard-FW sein) zu kopieren. Das geht mit dem Modul hminfo.


=== Reset ===
=== Reset ===
Zeile 53: Zeile 61:
Register '''intKeyVisib''' auf ''visib'' zu setzen (siehe HM-Konfiguration)-siehe auch getConfig. Danach kann man das Verhalten der „eingebauten Peers“ auslesen und verändern wie von jedem anderen Peer auch. Die internen Peers werden '''selfxx''' benannt (self01, self02,...).  
Register '''intKeyVisib''' auf ''visib'' zu setzen (siehe HM-Konfiguration)-siehe auch getConfig. Danach kann man das Verhalten der „eingebauten Peers“ auslesen und verändern wie von jedem anderen Peer auch. Die internen Peers werden '''selfxx''' benannt (self01, self02,...).  


  set <HM-LC-SW1PBU-FM_Sw_01> intKeyVisib visib
  regSet <HM-LC-SW1PBU-FM_Sw_01> intKeyVisib visib
  set <HM-LC-SW1PBU-FM_SW_01> getConfig
  set <HM-LC-SW1PBU-FM_SW_01> getConfig


Zeile 127: Zeile 135:


=== Bootloader bauen ===
=== Bootloader bauen ===
1) dirks bootloader-umgebung clonen/downloaden https://github.com/kc-GitHub/Asksin_OTA_Bootloader<br>
1) Dirks bootloader-umgebung clonen/downloaden https://github.com/kc-GitHub/Asksin_OTA_Bootloader<br>
<br>
2) devicedaten deines schalters (Serial, HMID) in devices/HM-LC-Sw1PBU-FM.h mit den originaldaten ersetzen und typ=0xF0A9 setzen (modelnummer des schalters mit alternativer firmware). damit sind die daten im flash verewigt und man braucht sich eigentlich nicht mehr darum zu kümmern. Bei einem nächsten bootloader update kann man ein beliebiges bootloader.eq3 file ota flashen. Trotzdem behält der bootloader seine daten.<br>
<br>
<br>
3a) bootloader bauen (4k):<br>
2) devicedaten des Schalters (Serial, HMID) in devices/HM-LC-Sw1PBU-FM.h mit den Originaldaten ersetzen und typ=0xF0A9 setzen (modelnummer des schalters mit alternativer firmware). Damit sind die Daten im flash verewigt und man braucht sich eigentlich nicht mehr darum zu kümmern. Bei einem nächsten Bootloader update kann man ein beliebiges bootloader.eq3 file ota flashen. Trotzdem behält der Bootloader seine daten.<br>
make clean HM_LC_Sw1PBU_FM
<br>
<br>
3b) bootloader bauen (8k):<br>
3) Bootloader bauen:<br>
  make clean HM_LC_Sw1PBU_FM_8k
  make clean HM_LC_Sw1PBU_FM_8k


=== Bootloader flashen ===
=== Bootloader flashen ===
Je nachdem welchen Bootloader man auf das Device gebracht hat, muss man nun die Fuses korrekt setzen:
Anschließend muss man nun die Fuses korrekt mit unlock(wichtig) setzen:
 
* Fuses für den 4k Bootloader setzen mit unlock (wichtig)
avrdude -p m644 -P gpio -c gpio -U lfuse:w:0xFD:m -U hfuse:w:0xDA:m -U lock:w:0x3F:m
avrdude -p m644 -c stk500v2 -P /dev/ttyUSB0 -U lfuse:w:0xFD:m -U hfuse:w:0xDA:m -U lock:w:0x3F:m


* oder(!) Fuses für den 8k Bootloader setzen mit unlock(wichtig)
  avrdude -p m644 -P gpio -c gpio -U lfuse:w:0xFD:m -U hfuse:w:0xD8:m -U lock:w:0x3F:m
  avrdude -p m644 -P gpio -c gpio -U lfuse:w:0xFD:m -U hfuse:w:0xD8:m -U lock:w:0x3F:m
  avrdude -p m644 -c stk500v2 -P /dev/ttyUSB0 -U lfuse:w:0xFD:m -U hfuse:w:0xD8:m -U lock:w:0x3F:m
  avrdude -p m644 -c stk500v2 -P /dev/ttyUSB0 -U lfuse:w:0xFD:m -U hfuse:w:0xD8:m -U lock:w:0x3F:m


und final den Bootloader flashen
avrdude -p m644 -P gpio -c gpio -U flash:w:bootloader_HM-LC-Sw1PBU-FM_8k.hex
avrdude -p m644 -c stk500v2 -P /dev/ttyUSB0 -U flash:w:bootloader_HM-LC-Sw1PBU-FM_8k.hex


* Bootloader flashen
=== Firmware bauen ===
avrdude -p m644 -P gpio -c gpio -U flash:w:bootloader_HM-LC-Sw1PBU-FM.hex
==== 1. Firmware mit arduino-IDE ====
avrdude -p m644 -c stk500v2 -P /dev/ttyUSB0 -U flash:w:bootloader_HM-LC-Sw1PBU-FM.hex
''Hinweis:'' Die folgenden Schritte wurden auf einem Raspberry Pi 2 mit Debian Jessie durchgeführt und folgen größtenteils der howtoBuild.txt von Mr.P aus [https://owncloud.isengard.at/index.php/s/8992affb68e8c1dcbe532152628ad9a5]
* In manchen Adruino-IDE Umgebungen werden Builds gelöscht, bevor sie auf die Hardware gespielt werden. Das muss verhindert werden! Bei Raspbian Jessie und dem User pi befinden sich die Voreinstellungen der IDE in /home/pi/.arduino/preferences.txt. Dort folgende Änderungen machen, bzw. Einträge hinzufügen
<pre>
...
build.path=/home/pi/build
...
export.delete_target_folder=false
...
preproc.save_build_files=true
...
</pre>
* Auf den raspi in den Ordner ''/usr/share/arduino/hardware'' wechseln. Hardware-Board für den ATMega644 laden
<pre>
git clone https://github.com/jabdoa2/jabduino
</pre>
* Arduino im grafischen Frontend (oder X-Terminal) starten. unter <File>/<Preferences> findet man den Sketchbook-Ordner
* Über die Konsole in den Sketchbook-Ordner wechseln. Für User "pi" idR ''/home/pi/sketchbook''
* Dort die Firmware-Quellen einfügen
<pre>
git clone https://github.com/jabdoa2/Asksin_HM_LC_Sw1PBU_FM.git
</pre>
* Wieder in die Arduino-Umgebung wechseln, unter <File>/<Sketchbook>/<Asksin_HM_LC_Sw1PBU_FM> öffnen
* unter <Tools>/<Board> "Jabduino ATmega644A" auswählen
* In der Datei ''Asksin_HM_LC_Sw1PBU_FM'' den Wert in Zeile 64 eventuell "const unsigned long minImpulsLength = 5000;" ändern. Der dort eingetragene Wert gilt als Schwellwert, wann der Schalter erkennen soll, dass ein angeschlossener Wechselschalter gedrückt wurde und somit erkannt wird, dass Strom fließt.
* in der Datei ''Register.h'' in Zeile 22 den Wert von HMID[3] ändern. Z.B.: "const uint8_t  HMID[3]    = { 0x20, 0x85, 0x57 };    // 208557"
Zusätzlich kann die eigene Zentrale bereits als Default-Wert in den Schalter eingetragen werden. Dadurch entfällt ein unter Umständen notwendiges Peering. Dafür muss die Zeile 347 von '//#define firstLoad' in '#define firstLoad' geändert werden
In den Zeilen 354 bis 356 die Werte für die FHEM-Zentral-ID einfügen (Reading: D-HMIdOriginal  2CC71D)
reg.ch_0.pairCentral[0] = 0x2C;
reg.ch_0.pairCentral[1] = 0xC7;
reg.ch_0.pairCentral[2] = 0x1D;
Auch andere Default-Werte wie Peerings und Schaltverhalten können an dieser Stelle verändert werden. Sollte das nicht gewünscht sein, sind diese Zeilen entweder auszukommentieren oder einfach zu löschen.
* Alle Dateien speichern
* <Sketch>/<Verifiy/Compile> alles kompilieren
* Im oben definierten Build-Path (/home/pi/build) sollte jetzt eine Datei ''Asksin_HM_LC_Sw1PBU_FM.cpp.hex'' stehen. Das ist unsere fertige Firmware, die auf den Schalter geflasht werden muss


=== Firmware bauen ===
=== Firmware über Raspberry Pi flashen ===
* Firmware mit arduino bauen
* Hinweis: In älteren Beschreibungen findet man häufig die Ziel-Plattform m644. Diese unterscheidet sich praktisch in der Stromaufnahme des Chips, führt beim avrdude aber zu '''Fehlermeldungen''', deshalb auf '''m6444p''' achten
* HMID auf die des originalen Gerätes setzen
* 1. '''Fuses''' setzen
* Seriennummer ist, wenn man sie nicht ändert, KEQ0123456
''avrdude -p m644p -P gpio -c gpio -U lfuse:w:0xFD:m -U hfuse:w:0xD8:m''
<pre>
avrdude: AVR device initialized and ready to accept instructions
Reading | ################################################## | 100% 0.00s
avrdude: Device signature = 0x1e960a
avrdude: reading input file "0xFD"
avrdude: writing lfuse (1 bytes):
Writing | ################################################## | 100% 0.00s
avrdude: 1 bytes of lfuse written
avrdude: verifying lfuse memory against 0xFD:
avrdude: load data lfuse data from input file 0xFD:
avrdude: input file 0xFD contains 1 bytes
avrdude: reading on-chip lfuse data:
Reading | ################################################## | 100% 0.00s
avrdude: verifying ...
avrdude: 1 bytes of lfuse verified
avrdude: reading input file "0xD8"
avrdude: writing hfuse (1 bytes):
Writing | ################################################## | 100% 0.00s
avrdude: 1 bytes of hfuse written
avrdude: verifying hfuse memory against 0xD8:
avrdude: load data hfuse data from input file 0xD8:
avrdude: input file 0xD8 contains 1 bytes
avrdude: reading on-chip hfuse data:
Reading | ################################################## | 100% 0.00s
avrdude: verifying ...
avrdude: 1 bytes of hfuse verified
avrdude: safemode: Fuses OK
avrdude done.  Thank you.
</pre>
* 2. '''Bootloader''' flashen (falls noch nicht geschehen, wie  [[HM-LC-Sw1PBU-FM_Alternative_Firmware#Bootloader_flashen|oben]] beschrieben)
''avrdude -p m644p -P gpio -c gpio -U flash:w:bootloader_HM-LC-Sw1PBU-FM.hex''
<pre>
avrdude: AVR device initialized and ready to accept instructions
Reading | ################################################## | 100% 0.00s
avrdude: Device signature = 0x1e960a
avrdude: NOTE: FLASH memory has been specified, an erase cycle will be performed
        To disable this feature, specify the -D option.
avrdude: erasing chip
avrdude: reading input file "bootloader_HM-LC-Sw1PBU-FM.hex"
avrdude: input file bootloader_HM-LC-Sw1PBU-FM.hex auto detected as Intel Hex
avrdude: writing flash (61372 bytes):
Writing | ################################################## | 100% 30.86s
avrdude: 61372 bytes of flash written
avrdude: verifying flash memory against bootloader_HM-LC-Sw1PBU-FM.hex:
avrdude: load data flash data from input file bootloader_HM-LC-Sw1PBU-FM.hex:
avrdude: input file bootloader_HM-LC-Sw1PBU-FM.hex auto detected as Intel Hex
avrdude: input file bootloader_HM-LC-Sw1PBU-FM.hex contains 61372 bytes
avrdude: reading on-chip flash data:
Reading | ################################################## | 100% 28.95s
avrdude: verifying ...
avrdude: 61372 bytes of flash verified
avrdude: safemode: Fuses OK
avrdude done.  Thank you.
</pre>
* 3. '''Firmware''' flashen (aus der Arduino-IDE)
''avrdude -p m644p -P gpio -c gpio -U flash:w:Asksin_HM_LC_Sw1PBU_FM.cpp.hex''
<pre>
avrdude: AVR device initialized and ready to accept instructions
Reading | ################################################## | 100% 0.00s
avrdude: Device signature = 0x1e960a
avrdude: NOTE: FLASH memory has been specified, an erase cycle will be performed
        To disable this feature, specify the -D option.
avrdude: erasing chip
avrdude: reading input file "Asksin_HM_LC_Sw1PBU_FM.cpp.hex"
avrdude: input file Asksin_HM_LC_Sw1PBU_FM.cpp.hex auto detected as Intel Hex
avrdude: writing flash (19042 bytes):
Writing | ################################################## | 100% 9.79s
avrdude: 19042 bytes of flash written
avrdude: verifying flash memory against Asksin_HM_LC_Sw1PBU_FM.cpp.hex:
avrdude: load data flash data from input file Asksin_HM_LC_Sw1PBU_FM.cpp.hex:
avrdude: input file Asksin_HM_LC_Sw1PBU_FM.cpp.hex auto detected as Intel Hex
avrdude: input file Asksin_HM_LC_Sw1PBU_FM.cpp.hex contains 19042 bytes
avrdude: reading on-chip flash data:
Reading | ################################################## | 100% 9.28s
avrdude: verifying ...
avrdude: 19042 bytes of flash verified
avrdude: safemode: Fuses OK
avrdude done.  Thank you.
</pre>


=== Firmware per Programmer flashen ===
Oder man flasht die Firmware, wie im folgenden Abschnitt beschrieben, OTA (over the air). Das funktioniert mit dem Bootloader natürlich nicht. Dieser kann nur über einen Programmer oder Raspberry Pi auf den Schalter geflasht werden.
avrdude -p m644 -P gpio -c gpio -U flash:w:firmware_HM_LC_Sw1PBU-FM.hex
Der Vorteil bei OTA ist, dass für ein Update der Firmware der Schalter nicht mehr ausgebaut werden müsste.
avrdude -p m644 -c stk500v2 -P /dev/ttyUSB0 -U flash:w:firmware_HM_LC_Sw1PBU-FM.hex


=== Firmware OTA flashen ===
=== Firmware OTA flashen ===
Als Erstes muss der Bootloader aktiviert werden. Dazu ist das Device zu resetten:<br>
====1. Konvertieren in das eq3 Format====
Konvertieren der Hex-Datei in das eq3 format mittels [https://github.com/kc-GitHub/Wettersensor/blob/master/Contrib/hex2eq3.php hex2eq3.php] (die php-cli muss installiert sein)
 
php hex2eq3.php --inFile Asksin_HM_LC_Sw1PBU_FM.cpp.hex --outFile HM_LC_Sw1PBU_FM.eq3 --spmPageSize 256 --hexEndAddress 0xDFFE --outFormat eq3 --withCrcCheck --pathTo-srec_cat /usr/bin/srec_cat
 
====2. Flashvorgang starten====
Im flash-ota Tool eq3 das Device, die File- und Seriennummer eingeben<br>
Solltet ihr mittels CUL, COC oder HM-CFG-USB-2 direkt auf eurem Raspberry flashen, könnt ihr das bereitgestellte [https://owncloud.isengard.at/public.php?service=files&t=8992affb68e8c1dcbe532152628ad9a5&path=%2F&files=flash-ota&download flash-ota Binary] verwenden. Ansonsten einfach [https://git.zerfleddert.de/cgi-bin/gitweb.cgi/hmcfgusb herunterladen] und für euer System selbst kompilieren:
 
Wenn ihr einen HM-CFG-USB-2 verwendet, wird flash-ota mittels:
flash-ota -f firmware_HM-LC-Sw1PBU-FM.eq3 -s <SerialNr>
gestartet. Bei Verwendung eines CUL oder COC, muss das Device mit angegeben werden:
flash-ota -f firmware_HM-LC-Sw1PBU-FM.eq3 -s <SerialNr> -c /dev/ttyAMA0 # für den COC
flash-ota -f firmware_HM-LC-Sw1PBU-FM.eq3 -s <SerialNr> -c /dev/ttyACM0 # für den CUL
 
====3. Bootloader aktivieren====
Zum Abschluss muss der Bootloader im Device/Schalter aktiviert werden. Dazu ist das Device zu resetten:<br>
* Netzversorgung vom schalter ausschalten, config taster drücken und halten, spannung einschalten und weiterhin gedrückt halten bis erstes blinken erscheint. <br>
* Netzversorgung vom schalter ausschalten, config taster drücken und halten, spannung einschalten und weiterhin gedrückt halten bis erstes blinken erscheint. <br>
oder falls das Device bereits in FHEM angelegt und gepaired ist:<br>
oder falls das Device bereits in FHEM angelegt und gepaired ist:<br>
* Device in fhem ein "set <device> reset" absetzen, danach innerhalb von 10sek die ConfigTaste für ???-sek drücken
* Device in fhem ein "set <device> reset" absetzen, danach innerhalb von 10sek die ConfigTaste für ???-sek drücken
<br>
* Dies funktioniert mit der Firmware ohne Änderungen definitiv nicht. Es löst ausschließlich einen Werksreset im Schalter aus
Konvertieren der Hex-Datei in das eq3 format mittels [https://github.com/kc-GitHub/Wettersensor/blob/master/Contrib/hex2eq3.php hex2eq3.php] (die php-cli muss installiert sein)
Um den Bootloader am Schalter selbst zu aktivieren, ohne den Schalter stromlos zu machen, muss die Firmware, hier '''Asksin_HM_LC_Sw1PBU_FM.ino''' und '''register.h''', gemäß {{Link2Forum|Topic=18071|Message=275891|LinkText=Forum}} ('''Danke''' Frank!) angepasst werden.
<br>
<b> Für einen 4k Bootloader:</b><br>
<br>
<br>
<b> Für einen 8k Bootloader:</b><br>
php contrib\hex2eq3.php --inFile Bootloader-AskSin-OTA-HM_LC_Sw1PBU_FM_8k.hex --outFile Bootloader-AskSin-OTA-HM_LC_Sw1PBU_FM_8k.eq3 --spmPageSize 256 --hexEndAddress 0xDFFE --outFormat eq3 --markAsBootloaderUpdate --withCrcCheck --pathTo-srec_cat e:\programme\srecord-1.64-win32\srec_cat.exe
<br>
Alternativ in Einzelschritten:
<br>
* For 64k devices with 4k bootloader space like (Atmega644):
srec_cat <MyFirmware.hex> -intel -fill 0xFF 0x0000 0xEFFE -Cyclic_Redundancy_Check_16_Little_Endian 0xEFFE -o  <MyFirmware.bin> -binary


* For 64k devices with 8k bootloader space like (Atmega644):
Nach diesen Änderungen hat der Schalter unter anderem ein Bootmenü mit 3 Menüoptionen:
srec_cat <MyFirmware.hex> -intel -fill 0xFF 0x0000 0xDFFE -Cyclic_Redundancy_Check_16_Little_Endian 0xDFFE -o  <MyFirmware.bin> -binary
* Option 1: Manueller Reboot '''-> diese ist zu wählen'''
* Option 2: enable software reboot (fhem kann durch set fwupdate das Booten einleiten, weiterführende Lektüre {{Link2Forum|Topic=23329|LinkText=hier}}.
* Option 3: disable software reboot (das automatische Booten wird verhindert, default)
Man gelangt in das Menü, indem man das lange Drücken des Config-Tasters über die ersten 3 Sekunden verlängert. Alle 3 Sekunden erfolgt ein Umschalten in die nächste Bootmenüoption.


* For 32k devices with 4k bootloader space like (Atmega328p):
Die augenblickliche Option wird durch Blinken angezeigt:
srec_cat <MyFirmware.hex> -intel -fill 0xFF 0x0000 0x6FFE -Cyclic_Redundancy_Check_16_Little_Endian 0x6FFE -o  <MyFirmware.bin> -binary
* Option 1 1x blinken
<br>
* Option 2 2x blinken
<br>
* Option 3 3x blinken
* konvertieren der Binärdatei in das eq3 format mittels [https://github.com/jabdoa2/Asksin_OTA_Bootloader/blob/master/bin2eq3.php bin2eq3.php] (die php-cli muss installiert sein)
Nach der 3. Option gelangt man wieder zur 1. Option, usw ... <br>
php bin2eq3.php <MyFirmware.bin> <MyFirmware.eq3>  
Wird der Config-Taster nach dem jeweiligen Blinken losgelassen, wird die entsprechende Menüoption ausgeführt.
 
* nur für die Windows-User mit dem windows homematic tool:
tar -czf <MyFirmware.tar.gz> <MyFirmware.eq3>
 
* im  Windows flasher: in den Flasher die Seriennummer eingeben und die *.tar.gz Firmware laden


* per Linux: im flash-ota Tool eq3 das Device, die File- und Seriennummer eingeben<br>
Jetzt sollte man beim Flashtool etwas sehen. Während des flashens blinkt auch die LED auf dem Schalter analog den übertragenen Datenblöcken
Solltet ihr mittels CUL, COC oder HM-CFG-USB-2 direkt auf eurem Raspberry flashen, könnt ihr das bereitgestellte [https://owncloud.isengard.at/public.php?service=files&t=8992affb68e8c1dcbe532152628ad9a5&path=%2F&files=flash-ota&download flash-ota Binary] verwenden. Ansonsten einfach [https://git.zerfleddert.de/cgi-bin/gitweb.cgi/hmcfgusb herunterladen] und für euer System selbst kompilieren:


Wenn ihr einen HM-CFG-USB-2 verwendet, wird flash-ota mittels:
===Bootloader OTA flashen===
flash-ota -f firmware_HM-LC-Sw1PBU-FM.eq3 -s KEQ0123456
Soll später ein neuer Bootloader mit neuen Features installiert werden, so kann dieser ebenfalls OTA geflashed werden ohne Schalter ausbauen und Löten.
gestartet. Bei Verwendung eines CUL oder COC, muss das Device mit angegeben werden:
flash-ota -f firmware_HM-LC-Sw1PBU-FM.eq3 -s KEQ0123456 -c /dev/ttyAMA0 # für den COC
flash-ota -f firmware_HM-LC-Sw1PBU-FM.eq3 -s KEQ0123456 -c /dev/ttyACM0 # für den CUL
Danach noch einmal den Schalter neu starten und es kann losgehen. :-)


=== Gerät nutzen ===
Der Bootloader ist zu bauen wie im Abschnitt zuvor erklärt. Anschließend mit dem hex2eq3 Tool konvertiert:
* 99_Asksin_HM_LC_Sw1PBU_FM_CustomFW.pm in FHEM installieren
php contrib\hex2eq3.php --inFile Bootloader-AskSin-OTA-HM_LC_Sw1PBU_FM_8k.hex --outFile Bootloader-AskSin-OTA-HM_LC_Sw1PBU_FM_8k.eq3 --spmPageSize 256 --hexEndAddress 0xDFFE --outFormat eq3 --markAsBootloaderUpdate --withCrcCheck --pathTo-srec_cat /usr/bin/srec_cat
* Gerät mit FHEM pairen (Config Taster > 5sek drücken, siehe Bemerkungen oben)
Der anschließende OTA Flashvorgang erfolgt analog dem Firmware-OTA-Flash wie weiter oben beschrieben
* Andere Geräte mit dem Gerät peeren und Spaß haben


=== UART nutzen ===
=== UART nutzen ===
Statt /dev/ttyXXX das eigene Interface einfügen:
Für Debuggingausgaben für Entwickler: Statt /dev/ttyXXX das eigene Interface einfügen:
* /dev/ttyUSB0 (USB Interface)
* /dev/ttyUSB0 (USB Interface)
* /dev/ttyAMA0 (Raspberry PI)
* /dev/ttyAMA0 (Raspberry PI)
Zeile 219: Zeile 330:
Öffnen
Öffnen
* Direkt in der Arduino IDE (Tools -> Serial Monitor)
* Direkt in der Arduino IDE (Tools -> Serial Monitor)
* Mit screen
* Mit ''screen''
  screen /dev/ttyXXX 57600,CS8,ixon,ixoff
  screen /dev/ttyXXX 57600,CS8,ixon,ixoff
* Mit minicom
* Mit ''minicom''
  sudo apt-get install minicom
  sudo apt-get install minicom
  minicom -b 57600 -o -D /dev/ttyXXX -w
  minicom -b 57600 -o -D /dev/ttyXXX -w
Zeile 229: Zeile 340:
* Bootloader: [https://github.com/jabdoa2/Asksin_OTA_Bootloader]
* Bootloader: [https://github.com/jabdoa2/Asksin_OTA_Bootloader]
* Arduino Port für Atmega 644: [https://github.com/jabdoa2/jabduino]
* Arduino Port für Atmega 644: [https://github.com/jabdoa2/jabduino]
* Flashen mit RaspberryPi: [https://owncloud.isengard.at/public.php?service=files&t=8992affb68e8c1dcbe532152628ad9a5]
* Firmware bauen und flashen mit dem RaspberryPi: [https://owncloud.isengard.at/public.php?service=files&t=8992affb68e8c1dcbe532152628ad9a5]


[[Kategorie:HomeMatic Components]]
[[Kategorie:HomeMatic Components]]
[[Kategorie:Schalter (Sender)]]
[[Kategorie:Schalter (Sender)]]
[[Kategorie:Schalter (Empfänger)]]
[[Kategorie:Schalter (Empfänger)]]

Aktuelle Version vom 3. Dezember 2021, 12:43 Uhr

X mark.svgBei den hier gezeigten Modifikationen geht die Garantie verloren und das Gerät verliert seine Zertifizierungen!

Um die alternative Firmware auf den HM-LC-Sw1PBU-FM flashen zu können, muss das Gerät geöffnet und ein Programmer angelötet werden.

Neue Funktionen

  • Der Taster kann mit anderen Geräten gepeert werden. Das ist mit der Originalfirmware nicht möglich.
  • Die alternative Firmware hat eine Stromerkennung, die hardwaretechnisch immer vorhanden ist, aber von der eQ-3 Firmware nicht benutzt wird. Es ist möglich, damit eine Wechselschaltung zu implementieren.

Folgende Kanäle sind jetzt verfügbar

Kanal Bezeichnung
Button_1 Taster oben
Button_2 Taster unten
Switch_1 Switch_01 ist das Relais (Kanal 3 des Gerätes).

Er funktioniert so, wie die HM-eigene Firmware vorher auch funktioniert hat, d.h. Relais an/aus. Den braucht man also "eigentlich nicht".

Switch_2 Switch_02 ist der virtuelle Kanal (Kanal 4 des Gerätes).

Wenn man den einschaltet, brennt das Licht, wenn es nicht schon an war. Wenn man den ausschaltet, geht das Licht aus, wenn es nicht schon aus war. Er zeigt weiterhin an, ob das Licht gerade an oder aus ist. Dabei wird ein ggf. bestehender Stromfluss berücksichtigt.

Hinweis zum Einbau

Bei Einsatz in einer Wechselschaltung (oder Kreuz- und Wechselschaltung) ist der HM Schaltaktor immer auf der Seite der Verkabelung einzubauen, wo die ungeschaltete Phase zugeführt wird. Bei Einbau auf der Seite, die zur Lampe abgeht, funktioniert es nicht, da in diesem Fall im ausgeschalteten Zustand der HM-Switch stromlos ist. Es ist also nicht gleichgültig, an welchem Ende einer (Kreuz- und) Wechselschalter-Kette der HM-Switch eingebaut werden muss.

Integration des Schalters in FHEM

Vorbereitungen

Für die alternative Firmware existiert ein eigenes Modul. Dieses ist als Erstes zu installieren bzw nach ./FHEM zu kopieren:

99_Asksin_HM_LC_Sw1PBU_FM_CustomFW.pm

Anlernen

In FHEM ist der HomeMatic-CUL in den Anlernmodus zu bringen. Der ConfigButton des Schalters ist nun länger als vier Sekunden zu drücken. Wichtig: die LED darf nach Loslassen des Button nicht aufblinken; sie gibt keine Rückmeldung über den Status des Anlernvorgangs.

Nach dem Anlernen sollte nochmal die aktuelle Config ausgelesen werden. Das kann ein paar Sekunden dauern und ist abgeschlossen, sobald der "state" = "cmds done" ist.

set <HM-LC-SW1PBU-FM_Device> getConfig

Möchte man erneut pairen, so geht dies am einfachsten mit:

set <HM-LC-SW1PBU-FM_Device> regSet pairCentral <123456>

Um den Schalter wie einen "normalen" Schalter wirken zu lassen, müssen noch die Buttons mit dem Switch gepeert werden. Danach bewirkt ein Tastendruck nach oben ein Einschalten, und ein Druck nach unten ein Ausschalten. Unterlässt man diesen Schritt, passiert bei einem Tastendruck am angeschlossenen Verbraucher nichts.

set <HM-LC-SW1PBU-FM_Btn_01 peerChan 0 <HM-LC-SW1PBU-FM_Sw_01 dual set 

Das erzeugt automatisch ein Peering zwischen deinen beiden internen Tastern und dem Kanal 3 (Sw_01). Damit sollte der Schalter eigentlich schon funktionieren

Falls nicht, dann setzt man im Device das Register intKeyVisib auf "visib" und macht ein getConfig auf Kanal 3. Dort sieht man dann die Listen der Peers und erkennt, was dort ein Tastendruck bewirkt. In den Jump Targets (z.B . R-self01-shSwJtDlyOff) usw. muss dann bei dem Button, mit dem man AUSschalten will überall OFF stehen, und bei dem anderen Button entsprechend On.

Noch einfacher wäre es, falls vorhanden, ein Registerset von einem schon wie gewünscht konfigurierten Schalter (das kann auch einer mit Standard-FW sein) zu kopieren. Das geht mit dem Modul hminfo.

Reset

Um den Schalter zu resetten ist der ConfigButton 2x hintereinander für > 4sek zu drücken. Auch hier liefert die LED keinerlei Rückmeldung über den Status. Blinks die LED trotzdem auf, so wurde das Drücken des Buttons nicht als "lang" erkannt. Alternativ kann ein Reset über FHEM ausgelöst werden:

set <HM-LC-SW1PBU-FM_Device> reset

Advanced settings

Interne Peers Ein Kanal kann interne Peers haben. Beispiele sind die meisten Schalter oder Dimmer an welchen direkt ein mechanischer Schalter angeschlossen werden kann, oder ein Bedienschalter direkt eingebaut ist. Die Firmware (FW) des Kanals behandelt diesen wie einen externen Peer, nur ist er automatisch eingerichtet. Es stehen die identischen Register wie bei 'normalen' Peers zu Verfügung. Diese Peers sind nicht automatisch sichtbar, können aber sichtbar geschaltet werden. Hierzu ist das Register intKeyVisib auf visib zu setzen (siehe HM-Konfiguration)-siehe auch getConfig. Danach kann man das Verhalten der „eingebauten Peers“ auslesen und verändern wie von jedem anderen Peer auch. Die internen Peers werden selfxx benannt (self01, self02,...).

regSet <HM-LC-SW1PBU-FM_Sw_01> intKeyVisib visib
set <HM-LC-SW1PBU-FM_SW_01> getConfig

Beispiel: Schaut man in die Readings des Devices und sieht ein: R-self01-shActionType off bedeutet dies, dass der Button 1 (der nach "oben") deaktiviert ist für diesen Peer und somit keine Funktion hat. Dieser ist auf "jmpToTarget" zu setzen und dann noch die folgenden auf "on":

  • R-self01-shSwJtDlyOff
  • R-self01-shSwJtDlyOn
  • R-self01-shSwJtOff
  • R-self01-shSwJtOn

Für Button 2 das selbe, aber eben nicht "on" sondern off. Natürlich kann man es auch anders nutzen. Z.b. einen Button als Toggle und den anderen Button für etwas völlig anderes. Das ist ja das schöne, dass dies bei der CustomFW möglich ist.

Beispiel das ein kurzer Tastendruck - oben oder unten - ein Toggle bewirkt:

set <HM_LC_Sw1PBU_FM_Sw_01> regSet shActionType  jmpToTarget self01;
set <HM_LC_Sw1PBU_FM_Sw_01> regSet shSwJtOn      dlyOff      self01;
set <HM_LC_Sw1PBU_FM_Sw_01> regSet shSwJtOff     dlyOn       self01;
set <HM_LC_Sw1PBU_FM_Sw_01> regSet shSwJtDlyOn   on          self01;
set <HM_LC_Sw1PBU_FM_Sw_01> regSet shSwJtDlyOff  off         self01;

set <HM_LC_Sw1PBU_FM_Sw_01> regSet shActionType  jmpToTarget self02;
set <HM_LC_Sw1PBU_FM_Sw_01> regSet shSwJtOn      dlyOff      self02;
set <HM_LC_Sw1PBU_FM_Sw_01> regSet shSwJtOff     dlyOn       self02;
set <HM_LC_Sw1PBU_FM_Sw_01> regSet shSwJtDlyOn   on          self02;
set <HM_LC_Sw1PBU_FM_Sw_01> regSet shSwJtDlyOff  off         self02;

Vorgehen zum Flashen

Anpassung des Strom-Schwellwertes bei LowCurrent Verbrauchern

Werden am Schalter nur sehr schwache Verbraucher angeschlossen, so kann u.U. die Statuserkennung (Verbraucher an/aus) nicht korrekt funktionieren. Ändern kann man das in Asksin_HM_LC_Sw1PBU_FM.ino, und zwar hier:

const unsigned long minImpulsLength = 5000;

Dabei entsprechen anscheinend die 5000 dem Schwellwert 500, die kann man jetzt z.B. auf 500 setzen, also Schwellwert 50.

Man muss ein wenig aufpassen, das nicht zu niedrig zu setzen, damit es zu keinen Fehlerkennungen bei Spannungsspitzen im Hausnetz kommt... Beim Autor ist im ausgeschalteten Zustand der Lampe der Wert aber deutlich unter 50...

Vorbereitung der Platine des Schalters

An der fertigen Platine sind an den folgenden Kontakten Kabel zum Anschluss an das Programmiergerät anzulöten.
Wenn man den HM-LC-SW1PBU-FM vor sich liegen hat, liegen die Pins in folgender Reihenfolge:

Reihe 1: MP3 / MP5 / MP6
Reihe 2: MP15 / MP4 / MP2

Anschluss der einzelnen PINs bei Verwendung der GPIO-Ports des Raspberry PI

Raspberry PIN | Beschreibung | HM-LC-Sw1PBU-FM
--------------|--------------|----------------
   Pin #17    |    3,3V      |    MP2
   Pin #19    |    MOSI      |    MP4
   Pin #21    |    MISO      |    MP5
   Pin #23    |    SCLK      |    MP6
   Pin #24    |    Reset     |    MP3
   Pin #25    |    GND       |    MP15

Anschluss der einzelnen PIns bei Nutzung eines ISP-Programmers

Bei Nutzung eines "MySmartUSB light" ist dieser vorher mittels mitgeliefertem Windowsprogramm auf 3V zu umzustellen.

 ISP-6 PIN   | Beschreibung | HM-LC-Sw1PBU-FM
-------------|--------------|----------------
   Pin #2    |    3,3V      |    MP2
   Pin #4    |    MOSI      |    MP4
   Pin #1    |    MISO      |    MP5
   Pin #3    |    SCLK      |    MP6
   Pin #5    |    Reset     |    MP3
   Pin #6    |    GND       |    MP15

Wichtig beim Raspberry Pi ist, dass man nicht die von Raspbian ausgelieferte Version des 'avrdude' nutzen kann, sondern eine adaptierte Version verwendet werden muss. Alle notwendigen Dateien zum Flashen (bereits alles fertig und lauffähig) inkl. einem kleinen HowTo sind im unten stehenden Link 'Flashen mit RaspberryPi' vorhanden.

Vorwort zum flashen per avrdude

Alle folgenden avrdude befehle beziehen sich in der Reihenfolge auf folgende Programmer. Es ist für den jeweiligen Programmer nur der betreffende Befehle abzusetzen

* Raspberry Pi
* MySmartUSB light (MyAVR)

Die aktuelle Konfiguration der Fuses kann jederzeit ausgelesen werden mit folgendem Befehl:

avrdude -p m644 -P gpio -c gpio -v
avrdude -p m644 -c stk500v2 -P /dev/ttyUSB0 -v

Bootloader bauen

1) Dirks bootloader-umgebung clonen/downloaden https://github.com/kc-GitHub/Asksin_OTA_Bootloader

2) devicedaten des Schalters (Serial, HMID) in devices/HM-LC-Sw1PBU-FM.h mit den Originaldaten ersetzen und typ=0xF0A9 setzen (modelnummer des schalters mit alternativer firmware). Damit sind die Daten im flash verewigt und man braucht sich eigentlich nicht mehr darum zu kümmern. Bei einem nächsten Bootloader update kann man ein beliebiges bootloader.eq3 file ota flashen. Trotzdem behält der Bootloader seine daten.

3) Bootloader bauen:

make clean HM_LC_Sw1PBU_FM_8k

Bootloader flashen

Anschließend muss man nun die Fuses korrekt mit unlock(wichtig) setzen:

avrdude -p m644 -P gpio -c gpio -U lfuse:w:0xFD:m -U hfuse:w:0xD8:m -U lock:w:0x3F:m
avrdude -p m644 -c stk500v2 -P /dev/ttyUSB0 -U lfuse:w:0xFD:m -U hfuse:w:0xD8:m -U lock:w:0x3F:m

und final den Bootloader flashen

avrdude -p m644 -P gpio -c gpio -U flash:w:bootloader_HM-LC-Sw1PBU-FM_8k.hex
avrdude -p m644 -c stk500v2 -P /dev/ttyUSB0 -U flash:w:bootloader_HM-LC-Sw1PBU-FM_8k.hex

Firmware bauen

1. Firmware mit arduino-IDE

Hinweis: Die folgenden Schritte wurden auf einem Raspberry Pi 2 mit Debian Jessie durchgeführt und folgen größtenteils der howtoBuild.txt von Mr.P aus [1]

  • In manchen Adruino-IDE Umgebungen werden Builds gelöscht, bevor sie auf die Hardware gespielt werden. Das muss verhindert werden! Bei Raspbian Jessie und dem User pi befinden sich die Voreinstellungen der IDE in /home/pi/.arduino/preferences.txt. Dort folgende Änderungen machen, bzw. Einträge hinzufügen
...
build.path=/home/pi/build
...
export.delete_target_folder=false
...
preproc.save_build_files=true
...
  • Auf den raspi in den Ordner /usr/share/arduino/hardware wechseln. Hardware-Board für den ATMega644 laden
git clone https://github.com/jabdoa2/jabduino
  • Arduino im grafischen Frontend (oder X-Terminal) starten. unter <File>/<Preferences> findet man den Sketchbook-Ordner
  • Über die Konsole in den Sketchbook-Ordner wechseln. Für User "pi" idR /home/pi/sketchbook
  • Dort die Firmware-Quellen einfügen
git clone https://github.com/jabdoa2/Asksin_HM_LC_Sw1PBU_FM.git
  • Wieder in die Arduino-Umgebung wechseln, unter <File>/<Sketchbook>/<Asksin_HM_LC_Sw1PBU_FM> öffnen
  • unter <Tools>/<Board> "Jabduino ATmega644A" auswählen
  • In der Datei Asksin_HM_LC_Sw1PBU_FM den Wert in Zeile 64 eventuell "const unsigned long minImpulsLength = 5000;" ändern. Der dort eingetragene Wert gilt als Schwellwert, wann der Schalter erkennen soll, dass ein angeschlossener Wechselschalter gedrückt wurde und somit erkannt wird, dass Strom fließt.
  • in der Datei Register.h in Zeile 22 den Wert von HMID[3] ändern. Z.B.: "const uint8_t HMID[3] = { 0x20, 0x85, 0x57 }; // 208557"

Zusätzlich kann die eigene Zentrale bereits als Default-Wert in den Schalter eingetragen werden. Dadurch entfällt ein unter Umständen notwendiges Peering. Dafür muss die Zeile 347 von '//#define firstLoad' in '#define firstLoad' geändert werden In den Zeilen 354 bis 356 die Werte für die FHEM-Zentral-ID einfügen (Reading: D-HMIdOriginal 2CC71D) reg.ch_0.pairCentral[0] = 0x2C; reg.ch_0.pairCentral[1] = 0xC7; reg.ch_0.pairCentral[2] = 0x1D; Auch andere Default-Werte wie Peerings und Schaltverhalten können an dieser Stelle verändert werden. Sollte das nicht gewünscht sein, sind diese Zeilen entweder auszukommentieren oder einfach zu löschen.

  • Alle Dateien speichern
  • <Sketch>/<Verifiy/Compile> alles kompilieren
  • Im oben definierten Build-Path (/home/pi/build) sollte jetzt eine Datei Asksin_HM_LC_Sw1PBU_FM.cpp.hex stehen. Das ist unsere fertige Firmware, die auf den Schalter geflasht werden muss

Firmware über Raspberry Pi flashen

  • Hinweis: In älteren Beschreibungen findet man häufig die Ziel-Plattform m644. Diese unterscheidet sich praktisch in der Stromaufnahme des Chips, führt beim avrdude aber zu Fehlermeldungen, deshalb auf m6444p achten
  • 1. Fuses setzen

avrdude -p m644p -P gpio -c gpio -U lfuse:w:0xFD:m -U hfuse:w:0xD8:m

avrdude: AVR device initialized and ready to accept instructions
Reading | ################################################## | 100% 0.00s
avrdude: Device signature = 0x1e960a
avrdude: reading input file "0xFD"
avrdude: writing lfuse (1 bytes):
Writing | ################################################## | 100% 0.00s
avrdude: 1 bytes of lfuse written
avrdude: verifying lfuse memory against 0xFD:
avrdude: load data lfuse data from input file 0xFD:
avrdude: input file 0xFD contains 1 bytes
avrdude: reading on-chip lfuse data:
Reading | ################################################## | 100% 0.00s
avrdude: verifying ...
avrdude: 1 bytes of lfuse verified
avrdude: reading input file "0xD8"
avrdude: writing hfuse (1 bytes):
Writing | ################################################## | 100% 0.00s
avrdude: 1 bytes of hfuse written
avrdude: verifying hfuse memory against 0xD8:
avrdude: load data hfuse data from input file 0xD8:
avrdude: input file 0xD8 contains 1 bytes
avrdude: reading on-chip hfuse data:
Reading | ################################################## | 100% 0.00s
avrdude: verifying ...
avrdude: 1 bytes of hfuse verified
avrdude: safemode: Fuses OK
avrdude done.  Thank you.
  • 2. Bootloader flashen (falls noch nicht geschehen, wie oben beschrieben)

avrdude -p m644p -P gpio -c gpio -U flash:w:bootloader_HM-LC-Sw1PBU-FM.hex

avrdude: AVR device initialized and ready to accept instructions
Reading | ################################################## | 100% 0.00s
avrdude: Device signature = 0x1e960a
avrdude: NOTE: FLASH memory has been specified, an erase cycle will be performed
         To disable this feature, specify the -D option.
avrdude: erasing chip
avrdude: reading input file "bootloader_HM-LC-Sw1PBU-FM.hex"
avrdude: input file bootloader_HM-LC-Sw1PBU-FM.hex auto detected as Intel Hex
avrdude: writing flash (61372 bytes):
Writing | ################################################## | 100% 30.86s
avrdude: 61372 bytes of flash written
avrdude: verifying flash memory against bootloader_HM-LC-Sw1PBU-FM.hex:
avrdude: load data flash data from input file bootloader_HM-LC-Sw1PBU-FM.hex:
avrdude: input file bootloader_HM-LC-Sw1PBU-FM.hex auto detected as Intel Hex
avrdude: input file bootloader_HM-LC-Sw1PBU-FM.hex contains 61372 bytes
avrdude: reading on-chip flash data:
Reading | ################################################## | 100% 28.95s
avrdude: verifying ...
avrdude: 61372 bytes of flash verified
avrdude: safemode: Fuses OK
avrdude done.  Thank you.
  • 3. Firmware flashen (aus der Arduino-IDE)

avrdude -p m644p -P gpio -c gpio -U flash:w:Asksin_HM_LC_Sw1PBU_FM.cpp.hex

avrdude: AVR device initialized and ready to accept instructions
Reading | ################################################## | 100% 0.00s
avrdude: Device signature = 0x1e960a
avrdude: NOTE: FLASH memory has been specified, an erase cycle will be performed
         To disable this feature, specify the -D option.
avrdude: erasing chip
avrdude: reading input file "Asksin_HM_LC_Sw1PBU_FM.cpp.hex"
avrdude: input file Asksin_HM_LC_Sw1PBU_FM.cpp.hex auto detected as Intel Hex
avrdude: writing flash (19042 bytes):
Writing | ################################################## | 100% 9.79s
avrdude: 19042 bytes of flash written
avrdude: verifying flash memory against Asksin_HM_LC_Sw1PBU_FM.cpp.hex:
avrdude: load data flash data from input file Asksin_HM_LC_Sw1PBU_FM.cpp.hex:
avrdude: input file Asksin_HM_LC_Sw1PBU_FM.cpp.hex auto detected as Intel Hex
avrdude: input file Asksin_HM_LC_Sw1PBU_FM.cpp.hex contains 19042 bytes
avrdude: reading on-chip flash data:
Reading | ################################################## | 100% 9.28s
avrdude: verifying ...
avrdude: 19042 bytes of flash verified
avrdude: safemode: Fuses OK
avrdude done.  Thank you.

Oder man flasht die Firmware, wie im folgenden Abschnitt beschrieben, OTA (over the air). Das funktioniert mit dem Bootloader natürlich nicht. Dieser kann nur über einen Programmer oder Raspberry Pi auf den Schalter geflasht werden. Der Vorteil bei OTA ist, dass für ein Update der Firmware der Schalter nicht mehr ausgebaut werden müsste.

Firmware OTA flashen

1. Konvertieren in das eq3 Format

Konvertieren der Hex-Datei in das eq3 format mittels hex2eq3.php (die php-cli muss installiert sein)

php hex2eq3.php --inFile Asksin_HM_LC_Sw1PBU_FM.cpp.hex --outFile HM_LC_Sw1PBU_FM.eq3 --spmPageSize 256 --hexEndAddress 0xDFFE --outFormat eq3 --withCrcCheck --pathTo-srec_cat /usr/bin/srec_cat

2. Flashvorgang starten

Im flash-ota Tool eq3 das Device, die File- und Seriennummer eingeben
Solltet ihr mittels CUL, COC oder HM-CFG-USB-2 direkt auf eurem Raspberry flashen, könnt ihr das bereitgestellte flash-ota Binary verwenden. Ansonsten einfach herunterladen und für euer System selbst kompilieren:

Wenn ihr einen HM-CFG-USB-2 verwendet, wird flash-ota mittels:

flash-ota -f firmware_HM-LC-Sw1PBU-FM.eq3 -s <SerialNr>

gestartet. Bei Verwendung eines CUL oder COC, muss das Device mit angegeben werden:

flash-ota -f firmware_HM-LC-Sw1PBU-FM.eq3 -s <SerialNr> -c /dev/ttyAMA0 # für den COC
flash-ota -f firmware_HM-LC-Sw1PBU-FM.eq3 -s <SerialNr> -c /dev/ttyACM0 # für den CUL

3. Bootloader aktivieren

Zum Abschluss muss der Bootloader im Device/Schalter aktiviert werden. Dazu ist das Device zu resetten:

  • Netzversorgung vom schalter ausschalten, config taster drücken und halten, spannung einschalten und weiterhin gedrückt halten bis erstes blinken erscheint.

oder falls das Device bereits in FHEM angelegt und gepaired ist:

  • Device in fhem ein "set <device> reset" absetzen, danach innerhalb von 10sek die ConfigTaste für ???-sek drücken
  • Dies funktioniert mit der Firmware ohne Änderungen definitiv nicht. Es löst ausschließlich einen Werksreset im Schalter aus

Um den Bootloader am Schalter selbst zu aktivieren, ohne den Schalter stromlos zu machen, muss die Firmware, hier Asksin_HM_LC_Sw1PBU_FM.ino und register.h, gemäß Forum (Danke Frank!) angepasst werden.

Nach diesen Änderungen hat der Schalter unter anderem ein Bootmenü mit 3 Menüoptionen:

  • Option 1: Manueller Reboot -> diese ist zu wählen
  • Option 2: enable software reboot (fhem kann durch set fwupdate das Booten einleiten, weiterführende Lektüre hier.
  • Option 3: disable software reboot (das automatische Booten wird verhindert, default)

Man gelangt in das Menü, indem man das lange Drücken des Config-Tasters über die ersten 3 Sekunden verlängert. Alle 3 Sekunden erfolgt ein Umschalten in die nächste Bootmenüoption.

Die augenblickliche Option wird durch Blinken angezeigt:

  • Option 1 1x blinken
  • Option 2 2x blinken
  • Option 3 3x blinken

Nach der 3. Option gelangt man wieder zur 1. Option, usw ...
Wird der Config-Taster nach dem jeweiligen Blinken losgelassen, wird die entsprechende Menüoption ausgeführt.

Jetzt sollte man beim Flashtool etwas sehen. Während des flashens blinkt auch die LED auf dem Schalter analog den übertragenen Datenblöcken

Bootloader OTA flashen

Soll später ein neuer Bootloader mit neuen Features installiert werden, so kann dieser ebenfalls OTA geflashed werden ohne Schalter ausbauen und Löten.

Der Bootloader ist zu bauen wie im Abschnitt zuvor erklärt. Anschließend mit dem hex2eq3 Tool konvertiert:

php contrib\hex2eq3.php --inFile Bootloader-AskSin-OTA-HM_LC_Sw1PBU_FM_8k.hex --outFile Bootloader-AskSin-OTA-HM_LC_Sw1PBU_FM_8k.eq3 --spmPageSize 256 --hexEndAddress 0xDFFE --outFormat eq3 --markAsBootloaderUpdate --withCrcCheck --pathTo-srec_cat /usr/bin/srec_cat

Der anschließende OTA Flashvorgang erfolgt analog dem Firmware-OTA-Flash wie weiter oben beschrieben

UART nutzen

Für Debuggingausgaben für Entwickler: Statt /dev/ttyXXX das eigene Interface einfügen:

  • /dev/ttyUSB0 (USB Interface)
  • /dev/ttyAMA0 (Raspberry PI)
  • /dev/ttyS0 (normaler Serieller Port)

Öffnen

  • Direkt in der Arduino IDE (Tools -> Serial Monitor)
  • Mit screen
screen /dev/ttyXXX 57600,CS8,ixon,ixoff
  • Mit minicom
sudo apt-get install minicom
minicom -b 57600 -o -D /dev/ttyXXX -w

Links

  • Firmware: [2]
  • Bootloader: [3]
  • Arduino Port für Atmega 644: [4]
  • Firmware bauen und flashen mit dem RaspberryPi: [5]