Projekt :: Home Automation
2. Bluetooth Protokoll hacken
Zuletzt aktualisiert: 06.01.2017

Um die Bluetooth-Heizungsthermostate neben der übersichtlichen Android-App auch über eine eigene DIY-Steuerung ansprechen zu können, war es zuerst erforderlich, das Kommunikationsprotokoll zu kennen.

Natürlich macht eq-3 das Protokoll nicht frei verfügbar. Für Android-Nutzer gibt es da aber eine sehr nützliche Hilfe: HCI-Snoop. Diese Funktion kann in den Entwickler-Settings von Android aktiviert werden. Ich weiß nicht genau, ab welcher Version das HCI-Snooping geht. Ich vermute aber, es geht mindestens seit Android 4.4 Kitkat.

Auf meinem Huawei Mate S ist Android 6.0 installiert.
Die Entwickleroptionen müssen im Auslieferungszustand von Android zuerst aktiviert bzw. eingeblendet werden. Eine Anleitung dazu für Android 5.0 (funktioniert so normal aber auch mit allen anderen Versionen) gibt es hier.



Wie in den Bildern zu sehen, ist die Einstellung bei mir mit "Bluetooth HCI-Snoop-Protokoll aktivieren" betitelt. Bei Smartphones anderer Hersteller kann sich diese Benennung leicht unterscheiden. Sollte aber mit ein bisschen gesunden Menschenverstand aber auffindbar sein.

Nachdem die Funktion aktiviert wurde, muss das Smartphone einmal komplett neugestartet werden. Anschließend legt das Handy automatisch die Datei btsnoop_hci.log an, die permanent alle Bluetooth-Aktivitäten mitschneidet. Sowohl in die sendende als auch in die empfangende Richtung. Ins Internet gehen diese Informationen aber nicht!

Wenn die Bluetooth-App calor bt von eq-3 gestartet wird, und eins der eingetragenen Heizungsgeräte ausgewählt wurde, beginnt das Logging. Zu Beginn habe ich eine Steuerung angewählt, und einfach die Temperatur manuell verändert. Somit war es möglich herauszufinden, wo sich im Protokoll die Temperatur-Information befindet und mit welchem Befehl diese sich verändern lässt.



Im letzten Bild ist das Menü zu sehen. All diese Einstellungen sind mit den Steuerungen möglich und sollen auch später von dem DIY-Controller übernommen werden. Aber Eins nach dem Anderen.

Nach dem Beenden der App musste die angelegte Log-Datei noch auf den PC übertragen werden. Dazu ist die Android Debug Bridge (ADB) nötig. Eine entsprechende .exe-Datei wird im Android SDK mitgeliefert. Somit ist es notwendig, Android Studio mit dem SDK herunterzuladen und zu installieren. Das Studio erhält man hier.

Während der Installation solltest du dir merken, wo das SDK-Verzeichnis hin installiert wird. Wenn man es nicht manuell angibt, wird es bei Win 7/8/8.1/10 normal im Ordner C:\Benutzer\<Name>\AppData\Local\Android installiert. Wenn du den AppData-Ordner nicht findest, musst du in Windows einstellen, dass versteckte Ordner angezeigt werden. Eine Anleitung für Windows 10 gibt es hier.

In dem SDK-Ordner muss dann navigiert werden zu sdk\plattform-tools navigiert werden.

Bild Nr. 15

adb.exe ist eine Konsolenanwendung, die es ermöglicht, Befehle direkt auf dem Smartphone ausführen zu können. So können z.B. Systemdateien geöffnet und bearbeitet werden.
Nun gilt es, die bluetooth_hci.log Datei zu finden. Denn diese ist je nach Modell auch an unterschiedlichen Orten. Am einfachsten bekommt man den Pfad, wenn man in der Bluetooth-Konfigurationsdatei bt_stack.conf nachsieht.

Dazu muss die MS-Eingabeaufforderung gestartet werden (bei Win 7/8/8.1/10 einfach Windows-Taste und cmd eintippen, dann Enter drücken). Dann zu dem Pfad navigieren, wo die adb.exe ist. Dazu kann man am Einfachsten mit dem Windows-Explorer erst nach dem Pfad suchen, dann in der Adress-Leiste diesen kopieren und in die Kommandozeile einfügen. Ist das SKD auf einem anderen Laufwerk als C installiert, muss vorher mit <Laufwerksbuchstabe>: auf das Laufwerk gewechselt werden.



Mit dem Befehl adb devices kann geprüft werden, ob das angeschlossene Gerät erkannt wurde und USB-Debugging aktiv ist. Wird das Smartphone nicht angezeigt, obwohl es angeschlossen ist, muss man USB-Debugging in den Entwicklereinstellungen aktivieren.

Wenn das Gerät gefunden wurde, kann die bt_stack.conf geöffnet werden. Bei meinem Huawei Mate S befindet sich die hci_snoop.log-Datei demnach also im Pfad /data/hwzd_logs/bt/btsnoop_hci.log. mit dem Befehl adb pull /data/hwzd_logs/bt/btsnoop_hci.log kann die Datei auf den PC übertragen werden. Das kann je nach Größe ein bisschen dauern (meine Datei war fast 60 mb groß, nachdem mehrere Tage mitgeschnitten wurde). Daher ist es zu empfehlen, vor dem Start des Mitschnittes das Handy neuzustarten bzw. die Log-Datei herunterzuladen, weil dann eine neue Log-Datei erstellt wird. Sollte das nicht funktionieren, muss vor dem Neustart in den Entwicklereinstellung HCI Snoop einmal deaktiviert und dann wieder aktiviert werden.

Nun muss die Datei natürlich noch analysiert werden. Sie einfach mit einem Texteditor zu öffnen und durchzulesen wird schnell zu Frust führen. Daher empfiehlt es sich, ein passendes Analyseprogramm zu verwenden. Dafür gibt es Wireshark.
Dieses Tool ist bekannter dadurch, dass man damit auch LAN-Netzwerkverkehr auf dem PC mitschneiden kann. Das ist hilfreich, um eventuellen Hackern oder Bots auf die Schliche zu kommen oder die reine Netzwerk-Performance zu testen. In meiner Master-Projektarbeit habe ich das Tool z.B. verwendet, um die Latenzen, also die Verzögerungszeiten zwischen dem Empfang verschiedener Pakete, grafisch anzuzeigen.
Jedenfalls kann das Tool auch die bluetooth_hci.log übersichtlich anzeigen. Dazu muss die Datei lediglich mit Wireshark geöffnet werden. Das Tool gibt es übrigens auch für Linux.
Die Datei befindet sich im selben Pfad wie die adb.exe.

Bild Nr. 20

Jetzt kann durch die Liste gescrollt werden, bis die Kommandos bezüglich eq-3 gefunden werden. Zur Vereinfachung lohnt es sich, in regelmäßigen Abständen (z.B. alle 5 Sekunden) in der App Befehle durchzugeben. Die Log-Datei hat nämlich auch Zeitstempel. So lassen sich die übertragenen Daten leichter finden und unterscheiden.

Nun musste "nur noch" herausgefunden werden, was für Daten übertragen werden und was sie bedeuten. Dazu habe ich mir das Ganze in eine Textdatei geschrieben und analysiert:

412a (21) -> 42 --> 21

412c (22) -> 44 --> 22

4127 (19?) -> 39 --> 19,5

Schreiben an 3fa4....09

Antwort (Notification): 0x0201080004XX <-- XX = aktuelle Temperatur

Wie man sieht, habe ich herausgefunden, dass der Sende-Befehl immer aus zwei Byte besteht (hexadezimal): 0x41 bedeutet also "Temperatur ändern", und das letzte Byte gibt die Temperatur an. Da in 0,5°C-Schritten eingestellt werden kann, muss man die Zahl durch zwei teilen, um die Temperatur zu erhalten.

Ich habe außerdem geschaut, an welche Charakteristik der Befehl geschickt wird. Details zu Bluetooth LE werde ich hier aber (noch) nicht erläutern. Da kannst du mal bei Wikipedia, der Bluetooth SIG oder bei bluegiga.com nachschauen.

Die Antwort von der Heizungssteuerung ist eine längere Kette, die alle Einstellungen scheinbar auf einmal überträgt. Bisher konnte ich nur herausfinden, dass das letzte Byte die aktuell eingestellte (und auf dem Display angezeigte) Temperatur ist.

Mit diesen Informationen kann man schonmal einen ersten Test machen

Aktuell arbeite ich noch an der Einstellung für die Tages-Profile. Dabei kann für drei Zeiträume pro Tag eine Temperatur eingestellt werden. Das ist allerdings noch ein bisschen schwieriger zu reverse-engineeren als die reine Temperatur-Einstellung. Aber ich bleib dran ;)
1. Einleitung
Zuletzt aktualisiert: 15.12.2016

Hallo Leute!

Nach langer, langer Zeit endlich mal wieder ein schriftlicher Projektbericht!
Ich habe in letzter Zeit vieles auf Youtube ausgelagert, weil ein Video zu machen irgendwie mehr Bock gemacht hat als ein statischer Text. Allerdings habe ich in letzter Zeit auch nicht wirklich ein konkretes Projekt gehabt.

Das ändert sich nun aber!

Seit September lebe ich ja endlich nicht mehr bei meinen Eltern und habe meine erste "eigene" Wohnung. Da ich nun auch selbst für den Unterhalt aufkommen muss, ergeben sich natürlich auch die ersten Fragen, wie man da am besten ein bisschen sparen kann.
Das ist aber nicht der Hauptgrund, warum ich auf "Smart Home" machen will. Vielmehr geht es natürlich auch darum, das ganze etwas komfortabler zu machen und natürlich den Spaß an der Sache =)

Als erstes habe ich mir elektronische Heizkörperthermostate besorgt. Das ist nach langer Zeit das erste Mal, dass ich keine Fußbodenheizung mehr habe. Stattdessen gibt es hier 4 Heizkörper:

- Einer im Wohn-/Schlafzimmer (Hauptradiator)
- Einer im Bad
- Einer am PC-/Esszimmer
- Einer in der Küche

Also: 4 Thermostate. Die sollten autonom laufen (für den Anfang), aber später auch per Funk steuerbar sein. Und ich habe mich festgelegt auf Bluetooth Smart / LE / 4.0.

Warum? Na weil ich über 4 Jahre, während meiner Studienzeit, viel damit gearbeitet habe und mich mit dem Standard halt extrem gut auskenne.

Wie? Naja, Bluetooth Smart Geräte gibt es schon ein paar. Nicht ganz so viele, wie ich gedacht hätte, aber wenn man ein wenig sucht, findet man schon was.

Ich habe bei Amazon die Modelle eq-3 entdeckt. Die sind noch relativ neu, haben aber alles, was ich mir gewünscht habe, sehen recht schick aus und sind sehr günstig (ca. 14€/Stück).

Kaufen kann man die hier: http://amzn.to/2gGrc3b (okay, die sind wohl wieder etwas teurer geworden, aber lohnen sich!)



Kurzreview: Sie tun was sie sollen, sind sehr leise (sie stören mich im Schlaf nicht, wenn sie verstellen, obwohl einer quasi direkt neben meinem Ohr ist XD), Bluetooth funktioniert per Android-App recht solide.
Nur die Temperatur passt nit ganz so wie eingestellt, was nicht verwunderlich ist, da ja direkt am Heizkörper gemessen wird. Darum wollte ich ja welche, die man fernsteuern kann.

Mit Android kann man mit der HCI-Snoop-Funktion in den Entwickleroptionen die gesendeten und empfangenen Bluetooth-Pakete mitschneiden und somit recht easy das Protokoll der Thermostate nachvollziehen. Dazu aber im nächsten Artikel ;)