Explorer le micrologiciel personnalisé sur les thermomètres Xiaomi

Si nous avons appris quelque chose au fil des ans, c'est que les pirates adorent connaître la température. Sérieusement. Une promenade dans les archives ici à Hackaday révèle un nombre impressionnant de gadgets sur mesure pour enregistrer, afficher et transmettre les conditions actuelles. Des stations météorologiques extérieures à un ESP8266 avec un DHT11 soudé, l'art antérieur ne manque pas si vous souhaitez commencer à collecter vos propres données environnementales.

Maintenant, évidemment, nous sommes de grands fans de bricolage ici, c'est en quelque sorte le but de tout le site Web. Mais il est indéniable qu'il peut être difficile de rivaliser avec les économies d'échelle, en particulier lorsqu'il s'agit de produits importés. Même le pirate informatique le plus expérimenté aurait du mal à construire quelque chose comme le Xiaomi LYWSD03MMC. Pour aussi peu que 4 USD chacun, vous disposez d'un capteur économe en énergie avec un écran LCD intégré qui diffuse la température et l'humidité actuelles via Bluetooth Low Energy.

Vous pourriez probablement construire le vôtre… mais pourquoi ?

C'est à peu près la plate-forme idéale pour mettre en place un système de surveillance de l'environnement dans toute la maison, à un détail près : il est conçu pour fonctionner dans le cadre du système domotique de Xiaomi, et pas nécessairement dans les configurations piratées que les gens comme nous ont à la maison . Mais c'était avant qu'Aaron Christophel ne s'occupe de l'affaire.

Nous avons d'abord apporté des nouvelles de son

projet ambitieux de création d'un firmware open source pour ces capteurs low-cost

le mois dernier, et sans surprise, il a suscité pas mal d'intérêt. Après tout, les gens qui prennent des pièces de matériel existantes, les améliorent et partagent la façon dont ils l'ont fait avec le monde est un principe fondamental de cette communauté.

Croyant qu'un projet aussi bien conçu méritait un second regard, et franchement parce que je voulais commencer à surveiller les conditions dans ma propre maison à moindre coût, j'ai décidé de commander un pack de thermomètres Xiaomi et de plonger.

Installation du micrologiciel

L'un des aspects les plus attrayants du micrologiciel « ATC » d'Aaron est certainement sa facilité d'installation. Vous vous attendriez à ce que quelque chose comme cela nécessite de casser le boîtier et de connecter un adaptateur USB vers UART, et pendant que vous

pouvez

emprunter cette voie si vous en avez besoin, 99% des utilisateurs seront

à l'aide de l'outil de flashage « Web Bluetooth » extrêmement astucieux

.

En théorie, vous devriez pouvoir installer le micrologiciel ATC à partir de n'importe quel ordinateur exécutant un navigateur Web suffisamment moderne, mais votre kilométrage peut varier avec une telle fonctionnalité de pointe. Mon bureau Linux ne pouvait pas du tout se connecter aux thermomètres, et l'essayer sur un Chromebook ne fonctionnait qu'occasionnellement. Votre meilleur pari sera probablement un smartphone ou une tablette, et je n'ai eu aucun problème à faire clignoter plusieurs des thermomètres à l'aide de mon Pixel 4a.

Tout compte fait, le processus de clignotement prend un peu moins d'une minute. Après avoir tiré sur la languette à l'arrière du thermomètre, appuyez sur « Connecter » sur le clignotant et attendez qu'il apparaisse sur la liste des appareils Bluetooth locaux. Après la connexion, vous devez appuyer sur le bouton « Activer », qui établit apparemment la connexion sécurisée requise par le micrologiciel d'origine avant de permettre une mise à niveau sans fil (OTA).

Une fois le processus d'activation terminé, vous sélectionnez un binaire de micrologiciel, appuyez sur « Démarrer le clignotement » et attendez que l'indicateur de progression s'approche de 100 %. Cela prend environ 30 secondes, puis le thermomètre doit immédiatement redémarrer dans le nouveau micrologiciel. S'il ne se réveille pas après le processus de clignotement, Aaron dit que vous pouvez simplement retirer la batterie et qu'elle devrait s'arranger. J'ai suivi ce processus plusieurs fois maintenant sans jamais avoir besoin de retirer une batterie, donc c'est probablement un problème assez rare.

Si jamais vous en avez besoin, le même processus peut être utilisé pour remettre le micrologiciel d'origine sur l'appareil. Aaron n'a pas d'image de firmware en stock dans le référentiel GitHub (probablement pour éviter une revendication de droit d'auteur), mais dans la documentation, il vous explique comment en extraire une copie à partir d'un fichier de mise à jour officiel.

Maintenant, le lecteur plus soucieux de la sécurité peut se demander si cela signifie qu'un nerd militant peut contourner les thermomètres Xiaomi des gens. Malheureusement, c'est le cas. Cet outil permettra à toute personne à portée Bluetooth de flasher ce qu'elle veut sur le Xiaomi LYWSD03MMC, qu'il dispose ou non d'un firmware personnalisé. Cela dit, il a déjà été question d'ajouter une sorte de mécanisme d'authentification au micrologiciel ATC pour se défendre contre de telles attaques ; ce qui le rend nettement plus sécurisé que le firmware d'origine.

Se mettre à l'aise

L'outil de flashage Web ne se contente pas d'installer le micrologiciel ATC, il fournit également une interface facile à utiliser pour le configurer. Après vous être connecté à l'appareil, il vous suffit de faire défiler un peu vers le bas et d'appuyer simplement sur les différentes options pour les activer ou les désactiver.

La première chose que j'ai faite a été de désactiver l'étrange visage souriant de l'art ASCII et, en tant que païen américain, j'ai également changé l'affichage en Fahrenheit. Le fait que vous puissiez entrer des valeurs de décalage pour la température et l'humidité est pratique, bien que cela puisse devenir inutile à l'avenir, car Aaron dit qu'une routine d'étalonnage plus robuste figure sur la liste TODO.

L'affichage du niveau de la batterie à l'écran est une fonctionnalité intéressante qui est activée par défaut, mais personnellement, je l'ai désactivée. Le problème est que le pourcentage de la batterie et l'humidité relative doivent partager le plus petit ensemble de chiffres en bas à droite de l'écran LCD. Ils alternent toutes les cinq secondes environ, ce qui en pratique semble juste assez rapide pour qu'il soit parfois difficile de savoir lequel vous regardez. De plus, lorsque la batterie CR2032 à l'intérieur est censée durer jusqu'à un an, ai-je vraiment besoin de voir le niveau de la batterie si souvent ?

J'étais un peu confus par « Intervalle de publicité » au début. J'ai supposé que ce serait la fréquence à laquelle le thermomètre envoie un paquet BLE, mais en pratique, il les envoie toutes les quelques secondes, quelle que soit la modification de ce paramètre. Qu'est-ce que ce paramètre

réellement

changements est la fréquence à laquelle les données de température diffusées sont mises à jour. La valeur par défaut est d'une minute, vous devez donc vous attendre à obtenir une vingtaine de paquets contenant les mêmes valeurs de température et d'humidité avant d'être actualisés. Définir l'intervalle de mise à jour à 10 secondes vous donnerait des données plus granulaires, mais probablement au détriment de la durée de vie de la batterie.

Constructions personnalisées

Bien qu'Aaron n'entre pas trop dans les détails sur la page du projet, il est assez facile de compiler votre propre firmware pour le thermomètre qui peut ensuite être flashé avec l'outil Web. Sous Linux, tout ce que j'avais à faire était d'extraire l'archive tar Xiaomi Telink TLSR825X et d'ajouter le répertoire à ma variable d'environnement $PATH. À partir de là, j'ai pu créer le firmware ATC et commencer à fouiller dans le code.

Les noms personnalisés ne sont qu'à quelques lignes de code.

Si vous aimez la programmation C de bas niveau, il existe un certain nombre de problèmes dans le référentiel GitHub que vous pourriez probablement aider. Il semble que le principal actuellement soit l'établissement d'un stockage flash persistant, ce qui ouvrirait la voie à la possibilité de conserver la configuration malgré les changements de batterie et des fonctionnalités plus avancées telles que l'enregistrement de la température locale.

Pour mes propres besoins, il était assez facile de trouver la partie du code qui modifie le nom du périphérique Bluetooth. Si vous comptez les parsemer dans toute la maison, voir quelque chose comme "ATC_BEDROOM" sera certainement plus utile que le schéma de nommage par défaut qui utilise les derniers caractères de l'adresse MAC.

Extraire les données

Maintenant, pour être clair, vous ne

avoir besoin

pour installer le micrologiciel d'Aaron afin d'utiliser les données de ces thermomètres dans vos propres projets.

Il y a au moins un outil

qui vous permet de tirer la température, l'humidité et le niveau de batterie des capteurs hors de la boîte, et

ils sont également pris en charge dans ESPHome

. Mais le problème avec le firmware d'origine est que vous devez vous connecter à chaque capteur pour lire ses données, ce qui est un processus lent et énergivore. L'une des principales améliorations du micrologiciel d'Aaron est que les données sont constamment diffusées en clair sous la forme d'une publicité BLE ; ce qui signifie que tout appareil à proximité peut renifler les valeurs directement sans établir de connexion ou d'appairage.

À cette fin, il existe quelques packages qui valent la peine d'être examinés. Au moment d'écrire ces lignes, il y a une pull request à

ajouter la prise en charge du micrologiciel ATC à aioblescan

, un simple outil Python 3 qui videra les données des paquets BLE vers le terminal. Un petit script vous permettrait d'analyser facilement la sortie d'aioblescan et de mélanger les informations comme bon vous semble.

J'ai également

eu de la chance avec py-bluetooth-utils

, une bibliothèque conçue pour travailler avec des publicités BLE. Sur la base de quelques exemples inclus avec le projet, j'ai mis au point ce script minimal qui devrait vous aider à démarrer :

#!/usr/bin/env python3import sysfrom datetime import datetimeimport bluetooth._bluetooth as bluezfrom bluetooth_utils import (toggle_device, enable_le_scan, parse_le_advertising_events, disable_le_scan, raw_packet_to_vicetry)# Utilisez 0 pour hci0dev_id = 0 pour hci0dev_id, disable_le_scan, raw_packet_to_vice(try) hci_open_dev(dev_id)except:print("Impossible d'ouvrir le périphérique Bluetooth %i" % dev_id)raise# Définissez le filtre sur "True" pour voir un seul paquet par périphériqueenable_le_scan(sock, filter_duplicates=False)try:def le_advertise_packet_handler(mac, adv_type, data, rssi):data_str = raw_packet_to_str(data)# Vérifier le préambule ATC data_str[6:10] == '1a18':temp = int(data_str[22:26], 16) / 10hum = int(data_str[26: 28], 16)batt = int(data_str[28:30], 16)print("%s - Périphérique : %s Temp : %sc Humidité : %s%% Batt : %s%%" % \ (datetime. now().strftime("%Y-%m-%d %H:%M:%S"), mac, temp, hum, batt))# Appelé sur le nouveau LE packetparse_le_advertising_events(sock,handler=le_advertise_packet_handler,debug= False)# Scan jusqu'à Ctrl-Csauf KeyboardInterru pt:disable_le_scan(chaussette)

Fais-le

Si vous ne pouvez pas le dire, je

vraiment

comme le firmware personnalisé d'Aaron Christophel pour le Xiaomi LYWSD03MMC. Pour autant que je sache, il n'y a absolument aucune raison de ne pas l'installer si vous avez déjà certains de ces thermomètres qui traînent. Dans son état actuel, il vous donne un meilleur contrôle sur le matériel et sur ce que vous pouvez en faire, et les fonctionnalités actuellement en cours de planification promettent d'aller encore plus loin. Pouvoir enregistrer localement les données de température sur le thermomètre et les télécharger sur BLE à une date ultérieure est certainement quelque chose à surveiller.

Pour aussi bon marché que soient ces petits thermomètres, je vous recommande fortement d'en ajouter quelques-uns à votre prochaine commande de pièces. Même si vous n'avez pas encore d'idée en tête pour eux, je ne serais pas surpris si quelque chose vous venait après avoir passé un après-midi à hacker leur firmware.

Articles populaires