Donnerstag, 2. Februar 2017

FHEM - die Kommandozeile wird groß

Entwicklungen laufen ja manchmal unbemerkt an einem vorbei. Die Entwickler haben sich was gutes überlegt reden aber meist wenig darüber.
Seit einiger Zeit gibt es unter jeder definierten "Entität" den Punkt Raw definition
Wenn man da drauf klickt öffnet sich ein Fenster mit der Definition und allen zu Attributen und Status Informationen. Man kann die kopieren und an andere Stelle weiterverwenden Sehr einfach und praktisch.
Man kann aber auch einfach etwas verändern, oder auch alles rauslöschen und etwas völlig neues hineinschreiben/kopieren. In dem Moment wo man dies tut, erscheint unten ein neuer Button:
Execute commands. Das kann man wörtlich nehmen, es passiert in diesem Moment nichts unmittelbar in dieser Definition wo man steht, sondern die Zeilen werden geprüft und in FHEM übernommen! Man braucht also kein Telnet Fenster mehr um ganze Code Blöcke zu übernehmen, man muss dazu auch nicht die fhem.cfg direkt editieren (gar nicht zu empfehlen). Im Wiki ist die Sache näher beschrieben. Der kleine Codeblock zum ausprobieren erzeugt einen neuen Menüeintrag im FHEM Web
um schnell auf einen Eingabe Dummy zu springen.
define Import dummy
attr Import group Entwicklung
attr Import room Entwicklung
attr WEB menuEntries CodeImport,/fhem?detail=Import#
Diese Ergänzung wandert direkt in meine Standard Installation.

Mittwoch, 1. Februar 2017

EasyBox zerflashed - und nun?

Ich wollte schon immer mal OpenWrt auf einen alten Router flashen. Um zu sehen wie OpenWrt so geht ...
Man kann ja die alten Dinger durchaus einfach noch zum AccessPoint umkonfigurieren. Sie liegen eh in der Kiste und bevor man was neues kauft!?
Ok, die kleinen Repeater verbrauchen nur um die 2 Watt, so eine EasyBox verbraucht ca. 7 Watt. Die Wirtschaftlichkeit schwindet also innerhalb von 2 Jahren.
Die Anleitungen zum EasyBox 803A flashen sind schon etwas alt, nicht mehr ganz aktuell und die Quellen zu manchen Dateien ziemlich versteckt. Aber nicht nur das, ich habe auch erstmal nicht richtig kapiert was zu tun ist. Ein falscher Befehl und Box bootet nicht mehr, deswegen ein kurzes HowTo mit dem was ich getan habe.
Aktuell Juni 2018: Es gibt eine neues OpenWrt Seite und einen überarbeiteten Artikel, der ist wesentlich besser lesbar als der Alte und ich hoffe die Links sind aktuell.

Vorbereitung

In diesem Wiki steht so ziemlich alles drin was man wissen muss. Ich beschreibe hier nur die wichtigsten Dinge und die Vorgänge die mir nicht klar waren.
Man muss die Box aufmachen um an die serielle Schnittstelle zu kommen. Ich habe einen FTDI Adapter mit 3,3 Volt Interface an meinen Raspberry Pi 2 gesteckt. Der Pi 1 war zum Auslesen der Box irgendwie nicht geeignet. Keine Ahnung warum, das brntool brachte lauter "!" und konnte offenbar nichts lesen! Die UART des Pi selbst hätte sicher auch funktioniert. Mit dem USB Kabel war es irgendwie handlicher.
Die beiden Python Scripte brntool und  ubootwrite  benötigen neben python noch das debian Modul python-serial. Wichtigstes Tool ist ein serielles Terminalprogramm. Ich habe hierbei mit screen gearbeitet -> einfache Kommandozeile und hat gut funktioniert. Auf einem frischen raspbian jessie braucht man nur 2 Pakete installieren:
sudo apt-get update && sudo apt-get install screen python-serial

Das U-Boot

Zentrales Tool zum Zugriff auf die Box ist der Bootloader u-boot. Die richtigen Dateien habe ich nach langer Suche hier gefunden, die Versionen im download bei OpenWrt sind zu alt und unvollständig. Für das temporäre Laden in den RAM wird die Datei openwrt-lantiq-arv752dpw22_brn-u-boot genommen, für das Flashen auf die Box wird die Datei openwrt-lantiq-arv752dpw22_nor-u-boot verwendet. Für das Recover braucht man noch von hier die u-boot.asc.
Hinweis: Der Originale Quelle für diese Datei war https://downloads.openwrt.org/attitude_adjustment/12.09-rc1/lantiq/danube/uboot-lantiq-arv752DPW22_ramboot/
Leider ist diese Datei dort nicht mehr auffindbar. Nur aus diesem Grund biete ich die unveränderte Original Datei hier zum download an.

Terminal

Bei der folgenden Arbeit macht es sich gut zwei Terminalfenster zu öffnen, eines für screen (TS) und eines für Kommandos (TK). Bei der Arbeit mit ubootwrite.py muss screen generell geschlossen werden (ctrl+a k y) bei allen anderen seriellen Zugriffen (cp, sx) war das nicht notwendig.

Datensicherung

Bevor man irgendetwas tut, sollte man wie im wiki beschrieben die Original Firmware sichern! Zweimal oder dreimal und vergleichen. Leider dauert das pro Sicherung ca. 1h!

Dateien bereitstellen

Das aktuelle Image von OpenWrt findet man im download Bereich in den Unterordnern <aktuelle Version>/lantiq/xway/....ARV752DPW22-squashfs.image
Folgende Dateien befinden sich im /home/pi
-rw-r--r-- 1 root root 8388608 Jan 29 21:26 ARV752DPW22_orig.dump
-rwxr-xr-x 1 pi   pi      2964 Jan 29 16:42 brntool.py
-rw-r--r-- 1 pi   pi   4718596 Jan 29 22:15 openwrt-15.05.1-lantiq-xway-ARV752DPW22-squashfs.image
-rw-r--r-- 1 pi   pi    182916 Jan 31 23:35 openwrt-lantiq-arv752dpw22_brn-u-boot.img
-rw-r--r-- 1 pi   pi    185572 Jan 31 23:35 openwrt-lantiq-arv752dpw22_nor-u-boot.img
-rw-r--r-- 1 pi   pi    253039 Jan 30 11:43 u-boot.asc
-rwxr-xr-x 1 pi   pi      7502 Jan 30 12:36 ubootwrite.py

Ich habe bei meinen ersten Versuchen einen Befehl falsch eingegeben, das wars: bootloader gelöscht. Jetzt war Recovery angesagt, deswegen geht es damit los. Das wichtige Bild für den UART Modus muss man sich genau einprägen. Der UART Modus ist handwerklich anspruchsvoll!

HowTo

EasyBox recover auf Original

UART Modus starten:
Kabel mit Spitze an 3,3 Volt serial Connector, spitze Pinzette, Stirnlampe, Lupenbrille, HM Steckdose in FHEM mit 6 Sek Einschaltverzögerung.
TS: screen /dev/ttyUSB0 115200
Spitze oben an R65 halten -> Steckdose ein -> schnell R80 mit Pinzette kurzschließen -> UART Modus muss beim Start erscheinen!
TK: cat u-boot.asc > /dev/ttyUSB0
TS: Bei Aufforderung eine Taste drücken bzw. später crtl+c
TS: screen beenden
TK: python ./ubootwrite.py --addr=0x80040000 --write=/home/pi/ARV752DPW22_orig.dump --verbose
# Warten bis Übertragung von ubootwrite beendet ist!
TS: screen /dev/ttyUSB0 115200
TS: crc32 80040000 00800000
TS: protect off all
TS: erase b0000000 +00800000
TS: cp.b  80040000  b0000000 00800000
Wenn fertig dann Power Reset. Die Box läuft wieder Original

Ohne Fehler auf OpenWrt flashen

Zunächst  wird die Box mit dem originalen brn Boot Loader gestartet, man muss dazu ganz kurz nach dem Start dreimal die Leertaste drücken. Screen muss also beim Einschalten schon aktiv sein!
Anschließend wird u-boot in den Speicher geladen.
Ab Adresse 0x80000000 beginnt der RAM, ab Adresse 0xB0000000 der Flash.
Im Original belegt der Bootloader bis 1FFFF ab 0xB0020000 beginnt das Haupt Image.
Bei OpenWrt belegt der Bootloader bis 3FFFF das Hauptimage beginnt ab 0xB0040000.

u-boot in den Speicher

TS: screen /dev/ttyUSB0 115200
TS: nach Reset -> drei mal space
TS: m startet den Upload in den Speicher 0x80002000
TK: sx openwrt-lantiq-arv752dpw22_brn-u-boot </dev/ttyUSB0 >/dev/ttyUSB0
TS: enter -> Übertragung abwarten dann Y drücken
TS: Bei Aufforderung eine Taste drücken bzw. später crtl+c
TS: screen beenden

u-boot in den Flash schreiben

TK: python ./ubootwrite.py --addr=0x80500000 --write=/home/pi/openwrt-lantiq-arv752dpw22_nor-u-boot.img --verbose
# Warten bis Übertragung von ubootwrite beendet ist!
TS: screen /dev/ttyUSB0 115200
TS: crc32 0x80500000 0x0002D4E4 (Mit der Ausgabe in TK vergleichen)
TS: protect off 0xB0000000 0xB002FFFF
TS: erase 0xB0000000 0xB002FFFF
TS: cp.b 0x80500000 0xB0000000 0x2D4E4
TS: protect on 0xB0000000 0xB002FFFF

Man kann jetzt zum Test booten oder OpenWrt in den Flash schreiben

Wenn der neue u-boot Loader im flash startet war das schon mal erfolgreich.
TS: reset
TS: Bei Aufforderung eine Taste drücken bzw. später crtl+c

OpenWrt in den Flash schreiben

TS: screen beenden
TK: python ./ubootwrite.py --addr=0x80040000 --write=/home/pi/openwrt-15.05.1-lantiq-xway-ARV752DPW22-squashfs.image --verbose
# Warten bis Übertragung von ubootwrite beendet ist!
TS: screen /dev/ttyUSB0 115200
TS: crc32 80040000 00480004 (Mit der Ausgabe in TK vergleichen)
TS: protect off b0040000 +00480004
TS: erase b0040000 +00480004
TS: cp.b  80040000  b0040000 00480004
TS: protect on b0040000 +00480004
TS: reset

Zum Schluss

Das war mein Vorgehen, man muss natürlich nicht das Original zurückschreiben. Diesen Schritt kann man für "nur" OpenWrt überspringen.

Kleiner Nachtrag 5.12.2017

Das OpenWrt Projekt (oder das xxWrt Projekt?) hat sich irgendwie "seitwärts" weiter entwickelt. OpenWrt steht auf dem Stand 15.05 von 2016. Durch etwas "Zufall" findet man das LEDE Projekt und wenn man noch weiter sucht, findet man auch für die Easybox noch aktuelle Downloads und auch die Datei /lantiq/xway/lede-17.01.4-lantiq-xway-ARV8539PW22-squashfs-sysupgrade.bin.
Ich musste die Datei zweimal flashen, beim ersten Mal hat es nicht funktioniert. Eventuell wird beim harten Reset (weil nach dem Flash nix mehr geht) der Speicher freigeräumt ohne den der Flashvorgang nicht möglich ist.
Bei aktuellen Routern sind diese Informationen im Wiki entsprechend verlinkt. Dadurch bin ich drauf gekommen.