HM-LC-Sw1PBU-FM Alternative Firmware
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 | der Switch_01 (Kanal 3 des Aktors) ist der virtuellen Kanal. Wenn man den einschaltet, brennt das Licht, er berücksichtigt also einen ggf. schon bestehenden Stromfluss. 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. |
Switch_2 | der Switch_02 ist das Relais und funktioniert so , wie die HM-eigene Firmware vorher auch funktioniert hat. Relais an/aus. Den braucht man also "eigentlich nicht". |
Integration des Schalters in FHEM
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 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 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,...).
set <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
Hat man alle Files des Bootloader heruntergeladen, so ist die Datei devices/HM-LC-Sw1PBU-FM.h zu öffnen und der Serial und HMID einzutragen. Nur damit funktioniert später OTA korrekt. Anschließend mit "make HM_LC_Sw1PBU_FM" ist der Botloader zu komplilieren
Bootloader flashen
Je nachdem welchen Bootloader man auf das Device gebracht hat, muss man nun die Fuses korrekt 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 -c stk500v2 -P /dev/ttyUSB0 -U lfuse:w:0xFD:m -U hfuse:w:0xD8:m -U lock:w:0x3F:m
- Bootloader flashen
avrdude -p m644 -P gpio -c gpio -U flash:w:bootloader_HM-LC-Sw1PBU-FM.hex avrdude -p m644 -c stk500v2 -P /dev/ttyUSB0 -U flash:w:bootloader_HM-LC-Sw1PBU-FM.hex
Firmware bauen
- Firmware mit arduino bauen
- HMID auf die des originalen Gerätes setzen
- Seriennummer ist, wenn man sie nicht ändert, KEQ0123456
Firmware per Programmer flashen
avrdude -p m644 -P gpio -c gpio -U flash:w:firmware_HM_LC_Sw1PBU-FM.hex avrdude -p m644 -c stk500v2 -P /dev/ttyUSB0 -U flash:w:firmware_HM_LC_Sw1PBU-FM.hex
Firmware OTA flashen
Als Erstes muss der Bootloader 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
Konvertieren der Hex-Datei in das eq3 format mittels hex2eq3.php (die php-cli muss installiert sein)
Für einen 4k Bootloader:
Für einen 8k Bootloader:
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
Alternativ in Einzelschritten:
- 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):
srec_cat <MyFirmware.hex> -intel -fill 0xFF 0x0000 0xDFFE -Cyclic_Redundancy_Check_16_Little_Endian 0xDFFE -o <MyFirmware.bin> -binary
- For 32k devices with 4k bootloader space like (Atmega328p):
srec_cat <MyFirmware.hex> -intel -fill 0xFF 0x0000 0x6FFE -Cyclic_Redundancy_Check_16_Little_Endian 0x6FFE -o <MyFirmware.bin> -binary
- konvertieren der Binärdatei in das eq3 format mittels bin2eq3.php (die php-cli muss installiert sein)
php bin2eq3.php <MyFirmware.bin> <MyFirmware.eq3>
- 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
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 KEQ0123456
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
- 99_Asksin_HM_LC_Sw1PBU_FM_CustomFW.pm in FHEM installieren
- Gerät mit FHEM pairen (Config Taster > 5sek drücken, siehe Bemerkungen oben)
- Andere Geräte mit dem Gerät peeren und Spaß haben
UART nutzen
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