HM-LC-Sw1PBU-FM Alternative Firmware am Raspi bauen u. flashen

Aus FHEMWiki

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.