Chapitre 2 : Cracker le contrôle Bluetooth avec Python
Introduction
Dans le Chapitre 1, nous avons établi les bases du contrôle des radiateurs Terma MOA Blue à l'aide d'un Raspberry Pi, d'un Docker et Python.
Il est maintenant temps d’approfondir :
-
Comment fonctionne BLE et comment nous l'avons utilisé pour communiquer avec les radiateurs.
-
Débogage des connexions Bluetooth à l'aide de bluetoothctl.
-
Données d'encodage et de décodage pour les réglages de température et de mode.
-
Le script Python qui rassemble tout cela.
Bluetooth Low Energy (BLE) – Aperçu rapide
Les radiateurs Terma MOA Blue utilisent le Bluetooth Low Energy (BLE) pour la communication. Les appareils BLE exposent des caractéristiques du GATT, qui agissent comme des points de données que vous pouvez lire à partir de ou écrire dans.
Concepts clés :
-
UUID : ID uniques identifiant des points de données spécifiques, comme la température ou le mode.
-
Caractéristiques : Propriétés BLE contenant les données réelles.
-
Descripteurs : Métadonnées supplémentaires sur les caractéristiques.
-
Opérations d'écriture ou de lecture : Certaines caractéristiques ne prennent en charge que les lectures (par exemple, la température actuelle), tandis que d'autres autorisent les écritures (par exemple, le réglage de la température).
Débogage des connexions Bluetooth avec bluetoothctl
Avant d'automatiser le processus avec Python, nous avons utilisé bluetoothctl pour les tests manuels et le débogage.
Étape 1 : Rechercher des appareils
bluetoothctl
scan on
Recherchez les appareils nommés "Terma Wireless".
-
Assurez-vous que le radiateur est en mode d'appairage : Appuyez et maintenez enfoncé le bouton de température pendant 5 secondes jusqu'à ce que le voyant clignote. Cela active le mode d’appairage.
-
Identifiez l'appareil le plus proche : L'appareil avec la valeur RSSI la plus basse (par exemple, RSSI : -50) est probablement le appareil de chauffage le plus proche. Les valeurs RSSI inférieures (plus négatives) indiquent des signaux plus faibles, alors concentrez-vous sur le signal le plus fort.
Étape 2 : Associer avec le radiateur
pair <DEVICE_ADDRESS>
Lorsque vous y êtes invité, saisissez le code PIN 123456.
Étape 3 : Faites confiance et connectez-vous
trust <DEVICE_ADDRESS>
connect <DEVICE_ADDRESS>
Étape 4 : Lire les caractéristiques
Une fois connecté, utilisez :
bluetoothctl
scan on
Cela affiche les UUID disponibles pour la lecture et l'écriture de données.
Remarques importantes :
-
Oubliez d'abord les autres appareils :
- Si le radiateur est déjà couplé avec un autre appareil (par exemple, une application téléphonique), vous devrez le dissocier de cet appareil avant de continuer.
Les radiateurs ne peuvent maintenir un seul appariement actif à la fois.
-
Reconnexion après des échecs :
- Si le radiateur a été connecté avec succès mais ne parvient pas à se reconnecter par la suite, suivez les étapes suivantes :
pair <DEVICE_ADDRESS>
- Puis ré-appairez en suivant les étapes ci-dessus.
-
Une connexion initiale est requise pour le script Python :
- La première connexion doit être établie manuellement via bluetoothctl.
- Une fois couplé, le script Python pourra interagir avec le radiateur.
- Cependant, si vous associez ultérieurement le radiateur à un autre appareil (interrompant la connexion), vous devrez supprimer et reconnecter manuellement du Raspberry Pi avant d'exécuter à nouveau le script. .
Cracker le format de données du radiateur
Encodage de la température
Les radiateurs codent les températures sous forme de deux octets (petit-boutiste) avec une précision de 0,1°C.
Exemple :
trust <DEVICE_ADDRESS>
connect <DEVICE_ADDRESS>
Décodage Python :
info <DEVICE_ADDRESS>
Encodage Python :
remove <DEVICE_ADDRESS>
Mode d'encodage
Les modes de fonctionnement sont stockés sous forme de octets simples avec des valeurs spécifiques :
-
0 : Désactivé
-
5 : Manuel (température ambiante)
-
6 : Manuel (Température de l'élément chauffant)
-
33 : Mode élément chauffant vérifié (Hex : 0x21)
Décodage Python :
Hex: 012d → Decoded: 30.1°C
Encodage Python :
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)
Principales leçons apprises
-
Défis de couplage Bluetooth :
- L'appairage manuel nécessitait souvent d'activer le mode d'appairage et de ressaisir le code PIN.
- Faire confiance à l'appareil était essentiel pour éviter les déconnexions.
-
Erreurs d'encodage :
- Tentatives initiales utilisées 256 mise à l'échelle au lieu de 255 pour le codage de la température.
- La correction à la mise à l'échelle little-endian de 0,1°C a résolu les erreurs de décodage.
-
Problèmes de gestion des modes :
- Les modes BLE n'étaient pas bien documentés et nous avons dû procéder à une rétro-ingénierie des valeurs.
- Test confirmé 33 (0x21) a fonctionné pour le mode Température manuelle de l'élément chauffant.
Quelle est la prochaine étape ?
Dans le prochain chapitre, je vais :
- Développez le script pour prendre en charge plusieurs radiateurs.
- Introduisez l'intégration Docker pour un déploiement plus facile.
- Commencez à explorer les configurations d'automatisation avec Home Assistant.
Commentaires et suggestions ?
Consultez le dépôt GitHub :
? GitHub - ha-hudsonread-heater-control
Faites-moi part de vos réflexions et suggestions dans les commentaires ci-dessous !
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!