Heim >Backend-Entwicklung >Python-Tutorial >Erstellen einer intelligenten Heizungssteuerung mit Python, Docker und Bluetooth #2

Erstellen einer intelligenten Heizungssteuerung mit Python, Docker und Bluetooth #2

DDD
DDDOriginal
2024-12-30 15:26:09170Durchsuche

Building a Smart Heater Controller with Python, Docker, and Bluetooth #2

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:

  1. Vergessen Sie zuerst andere Geräte:
  2. 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.
  3. Heizungen können jeweils nur eine aktive Kopplung aufrechterhalten.

  4. 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.
  1. 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

  1. 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.
  2. 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.
  3. 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!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn