HM-LC-Sw1PBU-FM Alternative Firmware am Raspi bauen u. flashen
1fach Schaltaktor HM-LC-Sw1PBU-FM mit alternativer Firmware
- Sinn und Zweck: Der Schalter bietet mit der alternativen Firmware die Möglichkeit ihn in Wechselschaltungen zu integrieren. In einer normalen Wechselschaltung ist es nicht möglich, den Schaltzustand der Lampe zu erkennen. Das Funktioniert nur wenn der Schaltzustand(Leistungsaufnahme) von Funkschalter erkannt werden kann.
- Vorwort: Dieser Artikel ist eigentlich nur eine Zusammenfassung dessen, was bereits in HM-LC-Sw1PBU-FM_Alternative_Firmware#Bootloader_flashen steht! Dort stammen auch alle Tools, Hilfsprogramme und Informationen her.
Ich habe lediglich alles auf das Flashen am Raspberry Pi ausgerichtet. Mein Dank gilt den Programmierern der Firmware und allen Leuten, die das Projekt mit- und weiterentwickelt haben.
Vorbereitung
- Windows 7 Desktop-Rechner mit Browser, Text-Editor, puTTY und WinSCP. Man kann zwar alle Schritte auch direkt auf dem Raspi durchführen - ich finde den Windows-Rechner aber praktischer
- Raspbian Jessie mit Pixel downloaden [1]. Kernel 4.4 Release 2016 09 23
- Mit WinDiskImager auf min. 8GB SD-Karte spielen, s. auch [2]
- Raspberry Pi 2B
- Die Pins des Raspi müssen nach folgendem Schema mit den Lötpads des HM-LC-Sw1PBU-FM verbunden werden. Die Messpunkte (MP) befinden sich auf der inneren, festgeschraubten, Platine des HM-Schalters
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
- Hinweis: Den Schalter während des gesamten Prozesses nicht mit 230V verbinden. Während des gesamtem Flash-Vorgangs kann die Spannungsvorsorgung aus dem Raspi genutzt werden
- Nachdem Raspbian sich installiert hat, geht man auf die Linux-Konsole. Entweder direkt oder per puTTY über SSH. Auf dem Raspi arbeite ich gerne als User root, deswegen vergebe ich diesem ein Passwort:
sudo passwd root // user root werden su - root
- Raspi OS updaten
apt-get update && apt-get upgrade && apt-get dist-upgrade
- Software installieren: C-Compiler, arduino-IDE
apt-get install arduino gcc-avr
- (Optional) Über raspi-config -> Internationialisation Options Keyboard-Layout, Locale, Timezone anpassen
- Über raspi-config -> Advanced Options SPI, Serial, I2C ausschalten (falls aktiv)
- reboot
- Verzeichnis für Downloads auf dem Raspi erstellen und dorthin wechseln
mkdir /root/hm_switch mkdir /root/hm_switch/flash cd /root/hm_switch
- Bootloader-Umgebung herunterladen
git clone https://github.com/jabdoa2/Asksin_OTA_Bootloader
- Firmware herunterladen
git clone https://github.com/jabdoa2/Asksin_HM_LC_Sw1PBU_FM
- Dateien aus [3] herunterladen und auf dem Raspi in's erstellte Verzeichnis /root/hm_switch kopieren. Da ich nicht weiß, wie man per wget Dateien eines Cloud-Servers auf einer Linux-Maschine kopiert, führe ich diesen Vorgang mit WinSCP durch.
- Das Modul 99_Asksin_HM_LC_Sw1PBU_FM_CustomFW.pm muss in die fhem-Installation (/opt/fhem/FHEM) kopiert werden. Ansonsten wird der Schalter beim Anlernen nicht erkannt
- Da die Programming-Software aus dem original Repository nicht verwendet werden kann, muss die Version aus dem Dowload installiert werden
dpkg -i avrdude_5.10-4_armhf.deb
- In der .conf steht die Definition der Anschlüsse für den Raspi. Diese entpacken und nach /etc kopieren
gunzip avrdude.conf.gz && cp avrdude.conf /etc/
Arduino-IDE einrichten /Firmware bauen
- Die IDE wird zum späteren Kompilieren der Firmware benötigt - es ist keine Arduino-Hardware erforderlich!
- Build-Pfad für Arduino-IDE erstellen:
mkdir /home/pi/build && chmod -R 777 /home/pi/build
- In den Ordner /usr/share/arduino/hardware wechseln und Hardware-Board für den ATMega644 laden
cd /usr/share/arduino/hardware git clone https://github.com/jabdoa2/jabduino
- Um alle Pfade und Dateien zu erzeugen, muss die Arduino-IDE aufgerufen und anschließend direkt wieder geschlossen werden. Das kann man in der grafischen Umgebung des Raspis, oder über ein entferntes X-Terminal tun.
- 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. Über die Konsole dort folgende Änderungen machen, bzw. Einträge hinzufügen
... build.path=/home/pi/build ... export.delete_target_folder=false ... preproc.save_build_files=true ...
- Firmware-Quellen in den Sketchbook-Ordner von User pi kopieren und Rechte für alle setzen
cp -R /root/hm_switch/Asksin_HM_LC_Sw1PBU_FM/ /home/pi/sketchbook/ && chmod -R 777 /home/pi/sketchbook/
- Wieder in die grafische IDE wechseln
- Tools -> Board -> "Jabduino ATmega644A" auswählen
- File -> Sketchbook -> "Asksin_HM_LC_Sw1PBU_FM" öffnen
- 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.
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.
- Beispiel (Auszug aus Register.h mit Zeilenangaben)
<16>/* Serial ID 10 byte */ 'K','E','Q','0','0','0','0','0','0','7', // serial ID, needed for pairing <22> const uint8_t HMID[3] = { 0x08, 0x15, 0x07 }; // 081507
- Die beiden geänderten Dateien speichern und mit Sketch -> Überprüfen / Kompilieren kompilieren. Im unteren Fenster auf Fehlermeldungen achten!
- Wenn dies funktioniert hat, sollte im Ordner /home/pi/build die Datei Asksin_HM_LC_Sw1PBU_FM.cpp.hex mit aktuellem Datum erzeugt worden sein.
Bootloader
- Datei /root/hm_switch/Asksin_OTA_Bootloader/devices/HM-LC-Sw1PBU-FM.h editieren und dabei Seriennummer, HMID und die Typ setzen. Seriennummer und HMID müssen in eurer Umgebung eindeutig sein, Typ ist: 0xF0A9
nano /root/hm_switch/Asksin_OTA_Bootloader/devices/HM-LC-Sw1PBU-FM.h
- Beispiel: HMID -> 081507, Seriennummer: KEQ0000007
/ The model type (not used from bootloader) #define HM_TYPE 0xF0, 0xA9 // 10 bytes serial number. Must be unique for each device #define HM_SERIAL 'K', 'E', 'Q', '0', '0', '0', '0', '0', '0', '7' // 3 bytes The device address (hm_id) #define HM_ID 0x08, 0x15, 0x07
- Eine Verzeichnisebene höher und Bootloader bauen:
cd /root/hm_switch/Asksin_OTA_Bootloader/ make clean HM_LC_Sw1PBU_FM_8k
Dabei sollte die Datei bootloader_HM-LC-Sw1PBU-FM.hex herauskommen. Diese wird später auf den Schalter geflasht
Flashen
- Erzeugte Bootloader-Datei und Firmware in ein Verzeichnis kopieren:
cp /home/pi/build/Asksin_HM_LC_Sw1PBU_FM.cpp.hex /root/hm_switch/flash/firmware.hex && cp /root/hm_switch/Asksin_OTA_Bootloader/Bootloader-AskSin-OTA-HM_LC_Sw1PBU_FM_8k.hex /root/hm_switch/flash/bootloader.hex cd /root/hm_switch/flash/
- 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
- Fuses setzen
avrdude -p m644p -P gpio -c gpio -U lfuse:w:0xFD:m -U hfuse:w:0xD8:m -U lock:w:0x3F: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.
- Bootloader flashen
avrdude -p m644p -P gpio -c gpio -U flash:w:bootloader.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.
- Firmware flashen (aus der Arduino-IDE)
avrdude -p m644p -P gpio -c gpio -U flash:w:firmware.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.