Skip to content

OpenHAB vs Xiaomi Sensoren

^ v M ><
Vor einiger Zeit habe ich angefangen, mit OpenHAB das Monitoring von meinen Servern auf die ganze Wohnung auszuweiten. U.a. wäre es schön zu wissen, ob ich den Tiefkühler im Keller wieder geschlossen oder doch die Tür aus lauter Senilität offen gelassen habe. Entsprechende Sensoren gibt es schon für relativ wenig Geld z.B. von Xiaomi (oder für massiv mehr Geld auch von anderen Herstellern, ob die dann einfacher einzubinden sind, ist die grosse Frage). Allerdings ist die Einbindung der Xiaomi-Sensoren in OpenHAB eine chinesische Oper in mehreren Akten:

Akt 1: Das Starterset

Das Starterset gibt's für rund 80.- und es kommt mit einem Druckschalter, zwei Türsensoren und zwei Bewegungsmeldern sowie der Basisstation. Gemäss Beschreibung ist alles ganz einfach: Die Basisstation starten, auf einem Android-Telefon die Mihome-App installieren, als Serverstandort "Mainland China" wählen, App mit der Basisstation verbinden, über ein verstecktes Menü den Developer-Mode aktivieren, den Key auslesen und damit die Basisstation in OpenHAB integrieren.
Dann wäre alles ganz einfach mit einem Datenfluss Sensor -> Xiaomi-Hub -> OpenHAB.
Ja, aber...
Genau, denn das ganze geht nur mit der Basisstation "Mainland China Edition", welche in Europa nicht erhältlich ist. Vermutlich kann man sie über einen chinesischen Grosshändler von Übersee liefern lassen (Reisestromadapter nicht vergessen, chinesische Stecker passen nicht in europäische Steckdosen). Aber die EU-Edition ist unbrauchbar:
- wählt man in der App Serverstandort "Mainland China", so lässt sich die Basisstation nicht finden und somit auch nicht verbinden
- wählt man Serverstandort "Europa", so fehlt das versteckte Menü, um den Developer-Mode zu aktivieren.

Akt 2: Veraltete App

Mit etwas Recherche ergab sich, dass auf dubiosen Seiten eine veraltete Version der Mihome-App zu finden ist, welche einen Fehler enthält: Sie schreibt ein Debug-Log. Worin der Zugriffskey zu finden ist. Leider hilft der alleine nicht weiter. Damit kann man zwar über die Xiaomi Mi IO Erweiterung von OpenHAB den Hub einbinden. Aber das war auch schon alles. Auf die Sensoren hat man deswegen noch keinen Zugriff. Dafür müsste weiterhin der Developer-Mode aktiviert werden, welcher auch einen Telnet-Zugang auf dem Gerät öffnet.

Nun gäbe es noch zwei weitere Optionen: Eine modifizierte Mihome-App von einer russischen Website, die komplett in kyrillisch gehalten ist. Nun äääh... Njet! Oder aber den Lötkolben auspacken, den seriellen Port abgreifen, sich damit Terminal-Zugang verschaffen und darüber den Telnet-Server aktivieren. Nun, da dies mit guter Wahrscheinlichkeit das Gerät schrotten kann, lasse ich das auch (vorerst) lieber. Immerhin könnte ich es noch weiterverkaufen, solange es noch funktioniert.

Akt 3: Der Aqara-Hub

Ein erneuter Blick in die Dokumentation des Mihome-Bindings zeigt: Der Hub in Version 3 (welcher als Aqara Hub für Apple Homekit im Handel ist), soll etwas zugänglicher sein. Der kostet leider alleine schon fast so viel wie das ganze Set. Und kann dann genau so wenig. Entsprechend habe ich den umgehend wieder zurückgesendet...

Akt 4: Billiger Zigbee-Stick

Die Xiaomi-Geräte halten sich, wie aller proprietärer Müll, natürlich nie ganz genau an die Standards. Aber immerhin genug, dass das Protokoll noch knapp als Zigbee durchgeht. Also habe ich für 9€+3.50€ Versand beim reichsten Mann der Welt einen USB-Zigbee-Stick gekauft. Zu meiner grossen Überraschung wurde dieser, obwohl Elektrogerät, vom reichsten Mann der Welt seinem Marktplatz aus Deutschland über den Rhein versendet. Sehr unüblich. Und kam auch superschnell an. Ebenfalls unüblich.
Es handelt sich um einen simplen USB-Stick mit CC2531-Chip und zigbee2mqtt-kompatibler Firmware vorinstalliert. Sehr genial!

Grundsätzlich würde OpenHAB zwar den Zigbee-Stick direkt über das Zigbee-Binding ansprechen können. Der Datenfluss wäre dann Sensor -> USB-Stick -> OpenHAB. Aber da war doch bei Xiaomi was mit Protokollstandard und sich daran halten. So lassen sich die Sensoren zwar einbinden, werden aber als "offline" angezeigt und es lässt sich kein Status abfragen. Es gilt also wie üblich: wieso einfach, wenn es auch kompliziert geht?

Nun beginnt die von-hinten-durch-die-Brust-ins-Auge-Installation für den Datenfluss Sensor -> USB-Stick -> zigbee2mqtt -> mqtt-broker -> OpenHAB.
Als erstes wird der Stick angeschlossen, dieser wird als USB-Serial-Gerät /dev/ttyACM0 erkannt.
Nun muss ein MQTT-Broker installiert werden, z.B. mosquitto aus den Debian-Paketquellen. Dieser wird ohne weitere Konfiguration gestartet.
Als nächstes wird zigbee2mqtt mit gefühlt zweitausend Node.JS-Abhängigkeiten installiert (u.a. npm aus den Debian Backports, wenn man Debian Stable als Basis nutzt). Dies ist, im Gegensatz zum später folgenden OpenHAB-Teil, hervorragend dokumentiert, so dass sich dieser Teil eher als Malen-nach-Zahlen denn Systemadministration anfühlt.
Nun können die Geräte im Prinzip schon eingebunden werden. Dazu einfach den Sensor mit der in der Packung beiliegenden SIM-Pin resetten, und gut. Gemäss Anleitung kann es sein, dass man den Vorgang mehrmals wiederholen muss, bei den ersten beiden Sensoren hat es aber jeweils auf anhieb geklappt. Ein Blick in journalctl -u zigbee2mqtt -f zeigt denn auch gleich Aktivität an.
Jetzt kommt der harte Teil: OpenHAB mit MQTT verbinden. Das ist sehr oberflächlich und abstrakt dokumentiert. Dazu kommt beim Googeln nach Lösungen das Chaos mit Anleitungen für MQTT1- und MQTT2-Binding hinzu. Welche nun bei meiner Installation gilt? Böh? Letztendlich habe ich die Anleitungen für MQTT2 befolgt, das hat irgendwann auch funktioniert. Vermutlich: MQTT1==OpenHAB1, MQTT2==OpenHAB2 (und bei mir läuft 2.5).

Wie also vorgehen:
In der zigbee2mqtt-Konfigurationsdatei /opt/zigbee2mqtt/data/configuration.yaml den Output nicht als JSON sondern Attribut ausgeben lassen. Dazu folgende Zeilen einfügen, speichern, zigbee2mqtt neu starten:
experimental:
    output: attribute
Und wenn wir schon in der Konfiguration herumfummelt, sollte man auch gleich den Sensoren vernünftige friendly_name vergeben.
Zuerst das MQTT-Binding in OpenHAB installieren.
Dann in /etc/openhab2/things/ eine .things-Datei mit den nötigen Einträgen erstellen. Irgendwann habe ich im Forum halbwegs taugliche Anleitungen gefunden...
Und sich nun wundern, dass die Things zwar im GUI auftauchen, aber keinerlei Daten gelesen werden... Signalstärke? NaN. Batterielevel? NaN. Zustand? Off. grrrmpf. Nach langem Debuggen (ja, zigbee2mqtt schreibt in mosquitto, mittels mosquitto_sub -v -t '#' kann man da schön mitlesen) irgendwann einfach mal den spontanen Windows-Reflex ausgelöst und OpenHAB selbst neugestartet. Uuund! Bingo! Alles tut. So einfach! Der Neustart ist übrigens für jedes neu hinzugefügte (oder umbenannte) Gerät nötig.

Das Finale: die OpenHAB-Things-Datei

Bridge mqtt:broker:MosquittoMqttBroker "Mosquitto MQTT Broker" [ host="127.0.0.1", secure=false] {
  Thing topic xdoor1 "Xiaomi Door Sensor" @ "Location" {
  Channels:
    Type switch : contact "contact" [ stateTopic = "zigbee2mqtt/xdoor1/contact", on="true", off="false" ]
    Type number : voltage "voltage" [ stateTopic = "zigbee2mqtt/xdoor1/voltage" ]
    Type number : battery "battery" [ stateTopic = "zigbee2mqtt/xdoor1/battery" ]
    Type number : linkquality "linkquality" [ stateTopic = "zigbee2mqtt/xdoor1/linkquality" ]
  }
}

Weitere Sensoren lassen sich nun einfach dem Bridge-Block hinzufügen. Mit etwas mehr Tippaufwand lassen sich auch Sensoren ausserhalb des Bridge-Blocks definieren:
Thing mqtt:topic:MosquittoMqttBroker:BodySensor "Xiaomi Body Sensor" (mqtt:broker:MosquittoMqttBroker) @ "Location" {
  Channels:
    Type switch : occupancy "occupancy" [ stateTopic = "zigbee2mqtt/xbody1/occupancy", on="true", off="false" ]
    Type number : voltage "voltage" [ stateTopic = "zigbee2mqtt/xbody1/voltage" ]
    Type number : battery "battery" [ stateTopic = "zigbee2mqtt/xbody1/battery" ]
    Type number : linkquality "linkquality" [ stateTopic = "zigbee2mqtt/xbody1/linkquality" ]
}
Die vorhandenen Channels lassen sich per mosquitto_sub oder journalctl herausfinden. Sobald man einen Sensor stimuliert, sendet er alle diese Angaben an den Zigbee-Controller.

Applaus

Natürlich is OpenHAB gerade in Kombination mit Zigbee (oder Z-Wave) bezüglich Möglichkeiten ein Fass ohne Boden. Schon ohne Funkanbindung lässt sich einiges an Technik anbinden: Drucker, Mail- und XMPP-Konten, WLAN (bzw dazu verbundene Endgeräte), Telefonanlagen, mpd (Music Player Daemon), Videokameras (z.B. via Zoneminder - aber das wäre ein Blogeintrag für sich). Mit Zigbee wird alles noch viel wilder. Nach den Sensoren kann das ganze restliche Haus eingebunden werden, von Lampen, Heizung und Rolladensteuerung über die Waschmaschine zum Rasenmäher bis zur Wallbox des Elektrofahrzeugs.
Wenn weitere Zigbee-Sensoren/Aktuatoren etwas weiter weg aufgestellt werden sollen, nimmt man einfach einen Raspberry Pi, schliesst daran einen weiteren USB-Stick an, installiert zigbee2mqtt und lässt damit die Sensordaten übers Netzwerk an den MQTT-Broker auf der OpenHAB-Maschine senden.

Die Covid Tracing App des Bundes...

^ v M ><
Was sagt der Hersteller: WIR RESCHPEKTIEREN DEN DATENSCHUTZ, IM FALL!

Schlimm genug: Die App verbindet sich mehrmals täglich zu Servern "des Bundes" (mehr dazu gleich), "um Konfigurationsdaten zu laden". Yeah right. Alleine das macht prinzipiell rückverfolgbar. Theoretisch wissen sie somit, wann ich zuhause, im Mobilnetz, im Büro, bei Freunden, an bestimmten SBB-Bahnhöfen, im Ausland oder zufällig mit Staatsfeinden ins gleiche WLAN eingeloggt bin.
Praktisch wird es nicht ganz einfach sein, da bei der Serververbindung nur eine begrenzte Menge Informationen über mein Telefon mitgegeben wird (App UserAgent Config Abruf).
Dies natürlich unter der Voraussetzung, dass die zu installierende Version aus dem Appstore dem entspricht, was da bei Microsoft-Github publiziert wird.

Ein weiterer Blick in den Sourcecode in Kombination mit ein paar DNS-Lookups macht alles noch viel schlimmer.

Verbindungen aufgebaut werden zu folgenden vier URLs:
https://codegen-service.bag.admin.ch/
https://www.pt.bfs.admin.ch/
https://www.pt.bfs.admin.ch/
https://www.pt1.bfs.admin.ch/
Und sind die wenigstens in der Schweiz, bei einem Schweizer Provider gehostet?

dig +short codegen-service.bag.admin.ch
162.23.137.58
$ dig +short www.pt-d.bfs.admin.ch
dhubv7mx4v0yy.cloudfront.net.
13.226.154.78
13.226.154.73
13.226.154.33
13.226.154.13
$ dig +short www.pt-d.bfs.admin.ch
dhubv7mx4v0yy.cloudfront.net.
13.226.154.13
13.226.154.73
13.226.154.78
13.226.154.33
$ dig +short www.pt1-d.bfs.admin.ch
pt1-d.bit.admin.ch.
162.23.137.59
$ dig +short www.pt1.bfs.admin.ch
pt1.bit.admin.ch.
162.23.137.65

Aber wem gehören diese Server denn?
$ whois 13.226.154.78
[..]
Organization: Amazon Technologies Inc. (AT-88-Z)

Natürlich! Immerhin: Dafür wurden sie ja schon kritisiert. Und das haben sie auch von Anfang an so angesagt. Leider haben es entweder der Bund oder die Medien ([1] [2]) da nicht ganz genau genommen mit der Wahrheit, wird doch behauptet, man nehme die Server von Amazon Deutschland.

Doch ein GeoIP-Lookup der hinter den CloudFlare verteilten Amazon-Server zeigt:
$ geoiplookup 13.226.154.78
GeoIP Country Edition: US, United States

Und wo gehen meine Datenpakete denn so überall durch, auf dem Weg zu Uncle Sam?
traceroute to 13.226.154.78 (13.226.154.78), 30 hops max, 60 byte packets
[..]
9 pd9ef372e.dip0.t-ipconnect.de (217.239.55.46) 30.289 ms 30.243 ms 29.741 ms
10 xe-5-2-0-0.ldn4nqp1.uk.ip.tdc.net (80.150.170.174) 32.190 ms 31.931 ms 32.210 ms
[..]

Schlaaaand und extraeuropäisches Territorium (UK)! Können wir da nicht noch die Russen und die Chinesen irgendwie auch involvieren?

Immerhin: Der IP-Range 162.23.0.0/16 gehört dem Bund und routet in die Schweiz.
Und: Alle Verbindungen werden zumindest verschlüsselt aufgebaut und die Zertifikate sind im Code gepinnt (uuuh, ich seh schon den Totalausfall kommen, wenn die Zertifikate erneuert werden müssen...).

Fazit: Es ist schlimm. Aber es könnte wirklich sehr viel schlimmer sein. V.a. in Anbetracht dessen, dass das arbeitende Steuergelder sind.

Konsequenz: Installiert, aber nur auf dem Zweittelefon, in dem keine SIM-Karte eingesetzt ist, das kaum ein WLAN ausser meinem daheim kennt und bei dem es mir egal ist, wenn der Akku nach 30 Minuten alle ist.

Gibt es noch brauchbare Mobiltelefone?

^ v M ><
So, dieses Jahr hatte ich ja schon viel Spass mit Telefonen. Erst verreckt das Samsung S5 mal so ganz spontan in den Ferien. Als Ersatz gab es dann das günstigste vor Ort erhältliche Telefon (Neo Spark), welche sich als Zwischengerät ganz gut macht, aber langfristig nicht brauchbar ist (zu schlechtes Display, zu lahmer Prozessor). Dann spinnt plötzlich mein noch keine zwei Monate altes Moto Z...

Aber wenn ich jetzt schon frustriert losrante, dann richtig. Holen wir also zum Rundumschlag gegen die Elektroschrotthersteller aus. In Sachen mobiler Kommunikations- und Unterhaltungszentralen mit staatlicher Komplettüberwachungsschnittstelle hat man heute grundsätzlich die Wahl zwischen teuren und billigen Geräten. Und die sind in ihren Vor- und Nachteilen diametral gegensätzlich.

Billige Geräte haben neben dem tiefen Preis ihre Vorteile:
+ SD-Kartenslot
+ DualSIM
+ Klinkenbuchse für Kopfhörer
+ wechselbare Akkus
+ weitgehend unmodifiziertes Android
+ relativ robuste Bauweise
Aber irgendwie müssen die niedrigen Preise gerechtfertigt werden:
- mieses Display, wovon man blind wird. Dazu ist die Auflösung so gering, dass diverse Apps nicht installierbar sind.
- lahmer Prozessor und wenig RAM
- keine Android-Sicherheitsupdates (sell&forget)
- meist kein 4G oder andere brandaktuelle Funkübertragungsmodi

Teure Geräte weisen hingegen folgende Pluspunkte auf:
+ gutes Display mit hoher Auflösung, schöner Farbwiedergabe und Lesbarkeit bei Tageslicht draussen
+ zeitgemäss schneller Prozessor
+ mit etwas Glück während bis zu zwei Jahren alle paar Monate ein Android-Sicherheitsupdate, das ausgewählte Sicherheitslücken stopft
+ mit noch etwas mehr Glück gibt es alternative ROMs, die auch noch Jahre später im Wochentakt Updates veröffentlichen
Doch nicht alles was glänzt ist Gold:
- fest verbauter Akku mit viel zu kurzer Laufzeit
- SD-Kartenslot wird zum selten gewordenen Fundstück
- DualSIM? Vielleicht gegen ganz happigen Aufpreis. Und dann nur im Austausch gegen die SD-Karte
- grausam verunstaltete und unbedienbare Herstelleroberfläche (die dann als Ausrede dafür dient, Sicherheitsupdates viel zu spät oder gar nicht zu veröffentlichen)
- tonnenweise unnütze, nicht deinstallierbare Bloatware, welche den internen Speicher vollmüllt
- immer öfter eine fehlende Klinkenbuchse
- filigran-empfindliche Bauweise (Displays gehen bis über den Rand, Komponenten mangelhaft verbunden, Elektronik geht schon beim Anschauen kaputt)

Doch mal kurz der Reihe nach. Was war mit dem S5? Das Display hatte schon länger einen Wackelkontakt, nachdem das Telefon einen Sturz aus 80cm Höhe auf einen Turnhallenboden (die sind relativ weich...) erdulden musste. Es ist mir in sitzender Position aus der Hosentasche gefallen. Und ein paar Monate später so mitten in Dubrovnik beschloss der Wackelkontakt jetzt permanent keinen Kontakt zu geben. Da ich LineageOS installiert hatte, war natürlich auch die Garantie futsch. Die Reparatur würde gleich viel wie ein Neugerät kosten. Also ab in die Tonne damit.

Was war nun mit dem Moto Z? Nun, Ich war wieder einmal unterwegs und hatte grobfahrlässigerweise vergessen, ein Backup-Telefon mitzunehmen. Das Gerät wurde auf dem Flug von Zürich nach Dubai noch etwas zum Musikhören (Musik liegt auf der SD-Karte) genutzt. In Dubai habe ich den Anschlussflug gesucht und dafür mit dem Telefon auf der Flughafenwebseite das Gate ausfindig machen wollen. Plötzlich zeigt Firefox keinen Inhalt sondern nur noch eine schwarze Fläche an. Hmm, na gut, Flughafenseite futsch? Nein, tritt auch sonstwo auf. Also gut, Firefox neu gestartet. Problem bleibt. Na schön, Methode Windows angewendet und das Telefon neu gestartet. Ganz dumme Idee. Ab jetzt hängt das Gerät im Reboot Loop. Per Zufall in den Bootloader gelangt. Cache Reset. Nützt nix. hmmm. Schweren Herzens Factory Reset durchgeführt. Nützt nix. Also gut, SIM/SD-Tray raus. Geht wieder. FUCK YOU! Herumgespielt. Mit SD ohne SIM: Reboot Loop. Mit SIM ohne SD: startet.
Na schön, dann müssen wir halt den ganzen Drecksmüll wieder neu installieren, um das Gerät wieder benutzen zu können. Aber nein, das geht nicht. Das Flughafen-Wifi verlangt Authentifizierung. Der Setup-Manager kann aber keine Wifi-Login-Portalseiten anzeigen und weigert sich ohne funktionierende Internetverbindung das Gerät einzurichten. Überspringbar ist er auch nicht, es muss zwingend ein Google-Konto hinzugefügt werden. Danke Google. Danke Motorola. Alle Daten umsonst verloren und das Telefon taugt bis auf weiteres nur noch als Briefbeschwerer.
Immerhin: Das Herstellerandroid ist nicht komplett unbenutzbar, so dass ich es bislang ohne LineageOS ausgehalten habe. Daher ist noch Garantie drauf. Mal schauen, wie viele Monate es dauern wird, den Rotz repariert zu bekommen.

War denn nun die SD-Karte kaputt? Nein, ein Test unter Linux und einem anderen Android-Telefon zeigt, dass die Karte einwandfrei ist. Im Gegentest mit anderen SD-Karten bleibt der Bootloop reproduzierbar. Aber selbst wenn: Es darf nicht sein, dass wegen so einer Lappalie wie eine(r/m) defekten SD- oder SIM-Karte(nslot) das System anfängt merkwürdige Verhaltensweisen zu zeigen oder sogar nicht mehr starten kann. Das ist eindeutig ein Versagen der Entwickler von entweder Google oder Motorola oder beiden. Jedes lumpige Desktop-Betriebssystem bekommt es fertig, bei fehlerhaften externen Datenträgern noch irgendwie zu starten, oder zumindest eine halbwegs aussagekräftige Fehlermeldung auszugeben. Sogar Windows kann das seit 20 Jahren.

Da das Gerät gerade mal zwei Monate alt geworden ist, kann ich nur spekulieren, dass der für geplante Obsoleszenz zuständige Entwickler bei Motorola geschlampt und sich in der Einheit vertan hat. Statt zwei Jahre bekam der SD-Slot somit halt nur zwei Monate. Handkehrum stellt Google hunderte Entwickler an, die als Einstellungsvoraussetzung über einen Doktortitel verfügen müssen, zahlt denen 200'000 Franken Einstiegsgehalt und dann sind diese Leute offenbar allesamt zu dumm zum Scheissen. Das kann doch alles nicht wahr sein! Android 2017 ist schlimmer als Windows 95! In jedem Aspekt!

Leider gibt es aber auch keine Alternative zu Android. Die ganzen Hoffnungsträger sind bereits eingestampft (Maemo, FirefoxOS, Ubuntu Phone), kommen nicht in die Puschen (Jolla), liegen im Sterben (Windows, Blackberry) oder sind proprietär (Apple, Windows, Blackberry). Bei den iPhones kommt noch dazu, dass die von vorneherein ohne SD-Kartenslot daherkommen.

So langsam muss ich mir überlegen, nicht aus einem Raspberry Pi, einem UMTS-Stick und einem Batteriepack etwas selber zusammenzufummeln. Das macht dann wenigstens, was ich will und ist einfach reparierbar (wenn auch unhandlich, unpraktisch und unsexy). Oder ich muss mit Herrenhandtasche gefüllt mit dedizierten Geräten für jeden Zweck das Haus verlassen. Zumindest fällt dann in der Regel nur ein Drittel des Geräteparks (Musikplayer, Kamera, Telefon) auf's Mal aus.

LineageOS auf Galaxy S2 (i9100) installieren

^ v M ><
Mir ist ein altes Samsung Galaxy S2 in die Hände gekommen, das für einen potentiellen Empfänger tauglich gemacht werden sollte. Bislang war bereits ein etwas in die Jahre (oder doch nur Monate?) gekommenes Cyanogenmod installiert. Aber Cyanogenmod ist tot, darum soll auf jeden Fall aktuellste Software installiert werden. Da kommt fast nur LineageOS in Frage (v.a. auch da ich damit gute Erfahrungen auf S3 und S5 gemacht habe). Da der Empfänger noch empfindlicher auf seine Privatsphäre achtet als ich, habe ich die Google-Apps weggelassen. Diese zu installieren benötigt aber nur einen weiteren Befehl und zwei Klicks mehr in der Recovery.

Leider war die Installation nicht ganz einfach, da die /system-Partition erstens nur 500MB gross ist (das ist zu klein, LineageOS verlangt mindestens 600MB), zweitens einen Defekt hat und drittens alle im Internet gefundenen Anleitungen zur Installation und Repartitionierung falsch sind, insbesondere die offizielle Anleitung von LineageOS. Ausserdem sind die meisten Anleitungen von Windows-Schafen geschrieben und nutzen Odin, während mir unter Linux Heimdall zur Verfügung steht.

Als Voraussetzung für diese Anleitung setze ich voraus, dass der Leser mit TWRP bereits vertraut ist. Ausserdem gilt ganz klar: Anwendung auf eigene Gefahr!

Beim i9100 sind ein paar Spezialitäten zu beachten, so ist das Recovery-Image in das Kernel-Image integriert.

So hat's bei mir funktioniert:
Erst sichergehen, dass auf dem Computer die aktuellsten Versionen von heimdall und adb installiert sind.
Download von PIT-Dateien (eine Art Partitionstabelle für Samsung-Geräte) von hier
Download von TWRP (Custom Recovery) von hier
Download des aktuellsten LineageOS-Build von hier
Ggf Download des su-addons und/oder gapps, wenn benötigt.
Aus lineage-14.1-*-nightly-i9100-signed.zip muss die Datei boot.img extrahiert werden.
Aus Pit_files.rar muss die gewünschte PIT-Datei extrahiert werden, ich habe I91001GB_4GB.pit (1GB /system, 4GB /data) verwendet.

Boot des Telefons in den Download-Modus mittels VolDown-Home-Power (Bestätigen mit VolUp). Anschliessend das USB-Kabel anschliessen.
Upload des neuen PIT-Files und flashen der Recovery mittels:
heimdall flash --repartition --pit I91001GB_4GB.pit --RECOVERY twrp-3.1.0-0-i9100.img --KERNEL boot.img --no-reboot

Danach das Telefon ausschalten, das USB-Kabel ausziehen, kurz die Batterie entfernen (ansonsten liess es sich bei mir nicht wieder booten), Batterie wieder einfügen.
Start des Telefons in den Recovery-Modus mittels VolUp-Home-Power
TWRP sollte nun starten. In TWRP den Menüpunkt "Wipe" -> "Advanced Wipe" -> "System" -> "Repair or Change File System" -> "Resize File System". Bei Erfolg auf "back" klicken und in der Übersicht auf "Change File System" -> "ext4". In der Übersicht wird die Dateisystemgrösse falsch angezeigt, evtl sogar als 0 Byte. Dies ignorieren. Nach erfolgter Reformatierung auf "back" klicken. In der Übersicht sollte jetzt korrekt 1007MB als Dateisystemgrösse angezeigt werden. Dasselbe Spiel für "Data" und "Internal Storage" wiederholen. Es können dabei viele rote Fehler angezeigt werden, dass Partitionen nicht eingebunden werden können. Dies kann (hier) ignoriert werden.
Nun das Telefon wieder ausschalten, Batterie raus und wieder rein, und erneut in den Recovery-Modus booten.
in TWRP erneut auf "Wipe" -> "Advanced Wipe" und einen gleichzeitigen Wipe von Dalvik, Cache, System, Data und Internal Storage durchführen. Wenn keine roten Fehlermeldungen erscheinen, kann der Flash-Vorgang beginnen. Ansonsten muss so lange mit der Reformatierung herumgespielt werden, bis es klappt.

Nun das USB-Kabel wieder anschliessen und mittels adb die zu installierenden zip-Dateien hochladen:
adb push lineage-14.1-*-nightly-i9100-signed.zip /sdcard0/
Wichtig! Der interne Speicher heisst /sdcard0/, nicht /sdcard/, wie in vielen Anleitungen behauptet!

In TWRP nun auf Install gehen und die zip-Dateien gemäss handelsüblicher Anleitungen flashen. That's it. Uff. Ja, ist kompliziert und viel unnötiger Aufwand.

Update: Ein Leser weist mich auf diese hervorragende Anleitung hin... für Windows :-P

Update: Ein weiterer Leser gibt noch zwei Tipps mit:
1. Wenn es mit dem Download der PIT-Datei nicht funktioniert, anderes USB-Kabel, bzw. anderen USB Port benutzen. Den Tipp gab's an verschiedenen Stellen und hat mir geholfen.

2. Ich habe es dann ums verrecken nicht geschafft, per "adb" etwas auf's Handy zu schieben. Ich habe es dann letztendlich auf eine Micro-SD karte kopiert, die ins Handy gesteckt und von dort installiert.

Android und Linux verknüpfen: KDE Connect (ohne KDE)

^ v M ><
Per Zufall bin ich auf eine sehr coole Software gestossen: KDEConnect. Damit lässt sich ein Android-Telefon von einem Linux-PC aus fernsteuern. Oder der Linux-PC lässt sich von einem Android-Telefon aus fernsteuern. Oder man kann recht bequem Dateien zwischen Telefon und PC austauschen. Einzige Bedingung: Beide Geräte müssen sich im gleichen lokalen Netzwerk befinden (ob WLAN, kabelgebunden oder gemischt ist egal).

Wie es der Name schon sagt, ist KDEConnect eigentlich für die KDE-Desktopoberfläche entwickelt worden. Mit ein Bisschen tricksen läuft es aber auch relativ gut unter schlankeren Desktops wie z.B. dem von mir präferierten XFCE. Als erstes sollte es auf dem Telefon installiert werden, das geht bequem aus dem Play Store (oder wie f-droid auf Google-freien Systemen). Nun kann es gleich gestartet werden und auf einen paarungsbereiten PC warten.
Danach muss es mitsamt einiger Abhängigkeiten auf eben diesem PC installiert werden (hier wie immer für Debian Jessie erklärt):
aptitude install kdeconnect qdbus-qt5 kde-runtime

Nun müssen die KDE-Hintergrunddienste initialisiert werden:
$ qdbus org.kde.kded /kded loadModule kdeconnect
true
$ kbuildsycoca4 -noincremental

Und schon sollte es tun:
$ kdeconnect-cli --list-devices
- Samsung Galaxy S III: xxxxxxxxxxxxxxx (reachable)
1 devices found
$ kdeconnect-cli --pair --device xxxxxxxxxxxxxxx

Benachrichtigungen des Telefons poppen nun fröhlich auf dem Desktop auf.

Als Feinschliff kann noch das indicator-Applet installiert werden, damit Telefoninformationen im Systray dargestellt werden. Dieses ist leider noch nicht in Debian stable enthalten und muss händisch kompiliert werden. Immerhin war der Autor aber so freundlich, schon die ganzen Debian-Paketierdaten zur Verfügung zu stellen, so dass im Handumdrehen ein .deb-Paket erstellt werden kann, das eine saubere Installation (und Deinstallation) der Software erlaubt.
$ git clone https://github.com/vikoadi/indicator-kdeconnect.git
$ aptitude install build-essential valac libappindicator3-dev libgtk-3-dev debhelper #ggf weitere Pakete nötig
cd indicator-kdeconnect
$ dpkg-buildpackage -rfakeroot -uc -b
$ cd ..
$ su
# indicator-kdeconnect_0.1_amd64.deb
# exit
$ indicator-kdeconnect


Das ist echt ein Tool, das ich schon lange gebraucht habe (ohne es zu wissen) :-)