Kapitel 2: Bluetooth-Steuerung mit Python knacken
Einführung
In Kapitel 1 legen wir die Grundlage für die Steuerung von Terma MOA Blue-Heizgeräten mit einem Raspberry Pi, Docker und Python.
Jetzt ist es an der Zeit, tiefer einzutauchen:
-
Wie BLE funktioniert und wie wir es zur Kommunikation mit den Heizgeräten genutzt haben.
-
Debuggen von Bluetooth-Verbindungen mit bluetoothctl.
-
Daten kodieren und dekodieren für Temperatur- und Moduseinstellungen.
-
Das Python-Skript, das alles zusammenbringt.
Bluetooth Low Energy (BLE) – Kurzübersicht
Die Terma MOA Blue-Heizgeräte nutzen Bluetooth Low Energy (BLE) für die Kommunikation. BLE-Geräte stellen GATT-Merkmale bereit, die sich wie Datenpunkte verhalten, die Sie auslesen oder beschreiben können.
Schlüsselkonzepte:
-
UUIDs: Eindeutige IDs, die bestimmte Datenpunkte wie Temperatur oder Modus identifizieren.
-
Eigenschaften: BLE-Eigenschaften, die die tatsächlichen Daten enthalten.
-
Deskriptoren: Zusätzliche Metadaten zu Merkmalen.
-
Schreib- vs. Lesevorgänge: Einige Merkmale unterstützen nur Lesevorgänge (z. B. aktuelle Temperatur), während andere Schreibvorgänge zulassen (z. B. Einstellen der Temperatur).
Debuggen von Bluetooth-Verbindungen mit Bluetoothctl
Bevor wir den Prozess mit Python automatisierten, verwendeten wir bluetoothctl für manuelles Testen und Debuggen.
Schritt 1: Nach Geräten suchen
bluetoothctl
scan on
Suchen Sie nach Geräten mit dem Namen „Terma Wireless“.
-
Stellen Sie sicher, dass sich das Heizgerät im Kopplungsmodus befindet:Drücken Sie die Temperaturtaste und halten Sie sie 5 Sekunden lang gedrückt bis das Licht blinkt. Dadurch wird der Pairing-Modus aktiviert.
-
Identifizieren Sie das nächstgelegene Gerät: Das Gerät mit dem niedrigsten RSSI-Wert (z. B. RSSI: -50) ist wahrscheinlich die nächste Heizung. Niedrigere (negativere) RSSI-Werte weisen auf schwächere Signale hin. Konzentrieren Sie sich daher auf das stärkste Signal.
Schritt 2: Mit der Heizung koppeln
pair <DEVICE_ADDRESS>
Geben Sie bei Aufforderung den PIN-Code 123456 ein.
Schritt 3: Vertrauen und verbinden
trust <DEVICE_ADDRESS>
connect <DEVICE_ADDRESS>
Schritt 4: Merkmale lesen
Sobald die Verbindung hergestellt ist, verwenden Sie:
bluetoothctl
scan on
Hier werden die verfügbaren UUIDs zum Lesen und Schreiben von Daten angezeigt.
Wichtige Hinweise:
-
Vergessen Sie zuerst andere Geräte:
- Wenn das Heizgerät bereits mit einem anderen Gerät (z. B. einer Telefon-App) gekoppelt ist, müssen Sie es von diesem Gerät entkoppeln, bevor Sie fortfahren können.
Heizungen können jeweils nur eine aktive Kopplung aufrechterhalten.
-
Wiederverbindung nach Fehlern:
- Wenn die Heizung erfolgreich angeschlossen wurde, die Verbindung später jedoch nicht wiederhergestellt werden konnte, führen Sie die folgenden Schritte aus:
pair <DEVICE_ADDRESS>
- Dann erneutes Koppeln mit den oben genannten Schritten.
-
Für Python-Skript ist eine erste Verbindung erforderlich:
- Die erste Verbindung muss manuell über Bluetoothctl hergestellt werden.
- Nach der Kopplung kann das Python-Skript mit der Heizung interagieren.
- Wenn Sie das Heizgerät jedoch später mit einem anderen Gerät koppeln (die Verbindung unterbrechen), müssen Sie es manuell vom Raspberry Pi entfernen und erneut verbinden, bevor Sie das Skript erneut ausführen .
Das Datenformat des Heizgeräts knacken
Temperaturkodierung
Die Heizungen kodieren Temperaturen als zwei Bytes (Little-Endian) mit einer 0,1°C-Genauigkeit.
Beispiel:
trust <DEVICE_ADDRESS>
connect <DEVICE_ADDRESS>
Python-Dekodierung:
info <DEVICE_ADDRESS>
Python-Codierung:
remove <DEVICE_ADDRESS>
Moduskodierung
Betriebsmodi werden als einzelne Bytes mit bestimmten Werten gespeichert:
-
0: Aus
-
5: Manuell (Raumtemperatur)
-
6: Manuell (Heizelementtemperatur)
-
33: Verifizierter Heizelementmodus (Hex: 0x21)
Python-Dekodierung:
Hex: 012d → Decoded: 30.1°C
Python-Codierung:
def decode_temperature(data):
current_temp = ((data[1] << 8) | data[0]) / 10
target_temp = ((data[3] << 8) | data[2]) / 10
return round(current_temp, 1), round(target_temp, 1)
Wichtige Erkenntnisse
-
Herausforderungen beim Bluetooth-Pairing:
- Manuelles Pairing erfordert oft die Aktivierung des Pairing-Modus und die erneute Eingabe der PIN.
- Das Vertrauen in das Gerät war von entscheidender Bedeutung, um Verbindungsabbrüche zu vermeiden.
-
Kodierungsfehler:
- Erste Versuche verwendeten 256-Skalierung anstelle von 255 für die Temperaturkodierung.
- Durch die Korrektur der Little-Endian-0,1°C-Skalierung wurden Decodierungsfehler behoben.
-
Probleme bei der Modushandhabung:
- BLE-Modi waren nicht gut dokumentiert und wir mussten die Werte rückentwickeln.
- Test bestätigt 33 (0x21) funktionierte im Modus Manuelle Heizelementtemperatur.
Was kommt als nächstes?
Im nächsten Kapitel werde ich:
- Erweitern Sie das Skript, um mehrere Heizungen zu unterstützen.
- Führen Sie die Docker-Integration für eine einfachere Bereitstellung ein.
- Erkunden Sie Automatisierungseinstellungen mit Home Assistant.
Feedback und Vorschläge?
Sehen Sie sich das GitHub-Repo an:
? GitHub – ha-hudsonread-heater-control
Teilen Sie mir Ihre Gedanken und Vorschläge in den Kommentaren unten mit!
Das obige ist der detaillierte Inhalt vonErstellen einer intelligenten Heizungssteuerung mit Python, Docker und Bluetooth #2. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!