ESP32 + Xiaomi LYWSD03MMC

Bonjour

Xiaomi / Mijia produit toute une série de capteurs domotiques intéressants, connectables en BLE et utilisables hors écosystème Xiaomi. Ils utilisent des puces de qualité (SHT35 ...), la fabrication semble également de qualité.

En complément des capteurs XIAOMI température+hygrométrie ronds (LYWSDCGQ) déjà en fonctionnement à mon domicile, je viens de faire venir des LYWSD03MMC, modèles plus récents, plus petits, de forme carrée, moins coûteux (4€ environ) et disposant de fonctionnalités supplémentaires (mise à jour par OTA, mémorisation d'un historique...)
capteur2.png

Je présente içi la lecture en Bluetooth BLE par un ESP32 d'un capteur LYWSD03MMC à l'aide d'un code fonctionnel de KarolKalinski (mes tentatives d'écriture de code perso ont échoué faute d'une compréhension suffisante de la librairie BLE pour ESP32......)

Prérequis : Un seul, connaître l'adresse MAC du capteur à interroger (faisable avec diverses applications pour Android : nRF Connect ou BlueFruit Connect, avec les outils BLE de Linux et sans doute d'autre procédés.....)

Principe : Avec le firmware d'usine ce modèle de capteur LYWSD03MMC ne diffuse pas en clair dans sa trame d'advertising les mesures de °C , %H et état de la pile CR2032
Les infos sont par contre récupérables en clair (non cryptées) par connection (adresse MAC du capteur) puis en s'intéressant à un service spécifique et à l'une de ses caractéristiques qui, après enregistrement envoie les données par notification. ( L'ESP32 se comporte en client BLE)

On verra plus loin qu'un firmware alternatif, flashable par OTA, modifie le comportement pour diffuser en clair les données dans la trame d'advertising, rendant alors inutile la connection, une simple écoute (scan) suffisant alors

Le code (fonctionnel) de KarolKalinski est ici : esp32-snippets/Mijia-LYWSD03MMC-Client at master · karolkalinski/esp32-snippets · GitHub

Résultat :
Starting MJ client...
Connected
- Found our service
- Found our characteristic
Notify callback for characteristic ebe0ccc1-7a0a-4b0c-8a1a-6ff2997da3a6
temp = 21.9 : humidity = 44.0
Disconnected

/!\ Si l'ESP32 plante à l'exécution avec le message 'Stack smashing protect failure!' , c'est très probablement en raison de la présence d'une librairie ESP32BLE ancienne dans le répertoire libraries d'Arduino. A éliminer pour que le compilateur prenne la version récente venant désormais avec l'extension ESP32 pour IDE Arduino.

capteur2.png

A Suivre : Récupération de l'historique mémorisé dans le capteur

Un constat : l'application Xiaomi Home fournit pour ce capteur un historique des 5 dernières heures.
Les données ont été acquises par le capteur lui même et y sont mémorisées , comme pour le LYWSD02MMC (qui fait en plus horloge et contient une RTC)
historique.png

En attendant de pouvoir le faire avec un ESP32 sous IDE Arduino voici une librairie LYWSD02 pour Python qui fonctionne avec un LYWSD03MMC
J'ai déjà pu extraire un historique des 155 couples horodatés °C ,%H en utilisant client.hystory-data

librairie Python LYWSD02MMC : GitHub - h4/lywsd02
(Avec récupération de l'historique)

historique.png

A suivre : hack, firmware alternatif

... et pour 4€ on a en prime un nouveau terrain de jeu pour du hacking !!

Ce dépot présente un firmware alternatif, un outil WEB de flashage OTA, un lien vers la doc du soc BLE (TLST8251) et un lien vers un sdk ..... GitHub - atc1441/ATC_MiThermometer: Custom firmware for the Xiaomi Thermometer LYWSD03MMC and Telink Flasher via USB to Serial converter

J'ai testé le flashage par OTA. U n des mes LYWSD03MMC utilise le firmare alternatif ATC et diffuse en clair (hexa) les infos °C, %H et état de la batterie dans la trame d'advertising (après l'adresse MAC on a 0x00db pour 21,9 °C , 0x28 pour 40%H, le reste pour l'état de la batterie
ADV-OK.png

ADV-OK.png

Très intéressant et très complet, merci Al1!
0xDB vaut 219 en décimal, d'où la valeur de température.

Bonjour Al1
interessant , d’autant plus que l'on est pas tenu par un "écosystème" plus ou moins "opaquee

Un article de Hackaday sur ce petit device, daté du 8 décembre. Il présente, entre autres, un outil de flashage :

Bonjour lesept

C'est l'outil de flashage proposé sur le lien du firmware alternatif ATC mentionné dans mon message #2

Je m'en suis servi , il fonctionne et permet en plus de configurer quelques paramètres de fonctionnement du capteur.

EDIT : il permet également la réinstallation du firmware d'origine

Cet outil ('Web Flasher') met en oeuvre la fonctionalité OTA du capteur
.
Une possibilité de flashage par port série existe également, je ne l'ai pas testée.

Je m'intéressait au firmware alternatif pour contourner l'obstacle de la récupération des infos de capteurs en firmware d'usine à l'aide d'un ESP32. Ayant ensuite trouvé le code proposé par KarolKalinski (voir message #1) je reflashe par OTA mes capteurs en firmware d'usine (c'est aussi expliqué sur le dépot du firmware alternatif ACT)

Un second lot de deux capteurs devrait arriver prochainement , cette fois ci à 5,83€ les deux capteurs, port compris

Comment se passe la com en BLE? Vois-tu des difficultés liées à la distance, au nombre de murs à traverser, ou autres obstacles ? Ou bien la communication est-elle bonne ?

Actuellement parmi les connections en cours j'en ai une fiable d'une dizaine de mètres + mur béton de 15cm entre ce type de capteur et un Raspberry PI Zero W. (Le Rasberry Pi Zero W est au sol , ce n'est pas le positionnement optimal pour son antenne)

Pas fait d'essai de portée avec ces capteurs et des
ESP32 avec leurs antennes variées