Capteur de présence Partie 1

lundi, mars 24, 2025 | 8 minutes de lecture | Mise à jour le lundi, mars 24, 2025

Squwal
Capteur de présence Partie 1

Dans ce premier article du blog, nous allons voir comment développer un capteur de présence zigbee pour home assistant.

Dans cet article qui sera sûrement en plusieurs parties, nous allons voir ensemble comment obtenir un capteur de présence zigbee. Cette base me servira éventuellement par la suite pour développer de nouveaux capteurs, j’ai déjà plusieurs idées en tête.

Introduction

Tout d’abord, il est bon de savoir que pour détecter la présence d’une personne dans une pièce, la solution la plus souvent utilisée est l’utilisation d’un détecteur de mouvement de type PIR. Ce genre de capteur (très souvent sur pile) détecte les personnes en mouvement en mesurant les variations du rayonnement infrarouge émis par le corps humain. C’est très efficace pour les pièces de passage (comme les couloirs ou les escaliers), mais ne permet plus de vous détecter une fois statique assis sur le canapé. Pour ce cas d’usage, les détecteurs de présence à ondes millimétriques se sont démocratisés. Dans leur principe, ils émettent des ondes millimétriques qui vont se réfléchir sur une personne, et sont assez sensibles pour détecter les micro-mouvements comme la respiration ou les battements cardiaques.

Il existe plusieurs modèles chez les fabricants habituels de domotique, et pour ma part, j’ai notamment le modèle FP-2 de chez Aqara installé dans mon séjour. Celui-ci fonctionne parfaitement tant que je suis debout, naviguant entre le salon et la salle à manger ainsi que quand je suis assis à table mais malheureusement, il n’arrive pas à détecter ma présence quand je suis sur le canapé étant assez éloigné de son emplacement de fixation. Plutôt que d’en acheter un second (vendu quand même aux alentours de 90€ hors promotion) et aussi pour le challenge, j’ai décidé d’essayer d’en réaliser un moi même.

Capteur de présence Aqara FP2

Capteur de présence Aqara FP2

Disposition de ma salle à manger, le capteur aqara se trouve derrière un rideau

Disposition de ma salle à manger, le capteur aqara se trouve derrière un rideau

Cas d’usage

Je voulais pouvoir détecter la présence d’au moins 2 personnes dans une pièce, pour par exemple mettre en pause une lecture vidéo quand ma compagne se lève du canapé. Je voulais également pouvoir connaître la distance d’une personne par rapport au capteur. Dans ma cuisine, la crédence est sur le mur opposé à la plaque de cuisson. Je ne voulais donc allumer la crédence que lorsque je me trouve devant l’évier. Et comme lorsque je fais la vaisselle je suis trop statique pour un détecteur de mouvement, je voulais une solution à base d’ondes millimétriques. Le dernier cas d’usage, détecter quand je pars de mon PC, là encore le détecteur de présence est le capteur le mieux adapté.

Matériel et environnement choisis

Dans un premier temps, j’ai fait des essais avec un ESP32-D1 mini ainsi qu’un capteur millimétrique LD2410. J’ai utilisé ESPHome pour configurer le tout, qui est un projet opensource permettant de configurer rapidement un ensemble de capteurs autour d’un microcontroleur ESP. ESPHome Il existe plusieurs tutos pour ce cas d’usage que vous pouvez facilement trouver sur internet.

Mais pour ma part je n’étais pas satisfait par ces choix :

  • Le capteur LD2410 est un capteur ne permettant de détecter qu’une seule personne à la fois.
  • Le code généré par ESPHome est assez opaque par rapport à la configuration qu’on lui passe en entrée. Sur un autre projet (que je referai surement par la suite), je n’avais pas été satisfait de la consommation du capteur, et impossible de savoir facilement si ESPHome utilisait bien les capacités Low Power de l’ESP.
  • Le protocole utilisé, bluetooth ou wifi dans le cas des ESP supportés par ESP-Home ne me plaisait pas. Mon dongle bluetooth est assez éloigné dans mon installation domotique, et je n’aime pas surcharger mon réseau wifi.

J’ai donc opté pour les choix suivants :

  • Un microcontroleur ESP32-C6 (pour sa capacité à intégrer une puce Zigbee)
  • Un capteur millimétrique LD2450 (le grand frère du LD2410, plus sensible et permettant de détecter jusqu’à 3 personnes)
  • un capteur de luminosité BH1750 (pour connaitre la luminosité de la pièce pour les scénarios de controle des lumières)
  • L’utilisation du framework ESP-IDF du constructeur du microcontroleur

Présentation de l’architecture du code

Le point d’entrée du code est la fonction app_main() dans le fichier main.c. Son but est d’initialiser la flash au plus tôt, puis de lancer la tâche zigbee qui sera la tâche principale de l’application.

La tâche zigbee initialise la stack zigbee, définit les clusters de notre capteur (je développerai plus en détail le principe des clusters zigbee dans une prochaine partie), démarre la tâche de traitement des messages zigbee. Dans une fonction de callback associée à la bonne association au réseau zigbee, une tâche de gestion des capteurs est lancée.

La tâche sensor initialise l’i2c (pour le capteur de luminosité) puis initialise le driver du BH1750, elle configure ensuite l’uart (pour le capteur de présence) puis initialise le driver du LD2450. Les données des 2 capteurs sont reçues en continu et reportées directement à l’aide des API zigbee. Les clusters sont configurés pour ne pas émettre de messages zigbee si les valeurs n’ont pas ou peu changé (exemple : un déplacement de 10 cm, ou une luminosité qui change de 5 lux ne provoquera pas l’envoi d’un nouveau message sur le réseau zigbee).

Installation

Pour l’installation complète de l’application je vous conseille de suivre les instructions sur le github : README Il est nécessaire de configurer un environnement ESP-IDF sur votre ordinateur, et je vous conseille d’installer l’extension ESP-IDF sur votre éditeur de code (Visual Studio Code conseillé). Une fois notre capteur prêt, il faut l’associer à Zigbee2mqtt.

Zigbee2mqtt (et home assistant)

Afin que home assistant puisse récupérer les données de notre capteur, il faut l’associer à zigbee2mqtt. Le problème étant que notre module DIY n’étant pas un module du commerce, il n’apparait pas dans la base de données des modules supportés par Z2M. Nous devons créer un fichier qui permettra à Z2M de reconnaitre et interpréter les données remontées par notre capteur. Ce fichier est appelé un external converter et doit se trouver à cet emplacement dans notre installation home assistant : /homeassistant/zigbee2mqtt/external_converters/squwalinc_esp32c6.js J’ai passé beaucoup de temps à faire fonctionner ce fichier, ne trouvant que très peu de documentation sur la réalisation d’un external converter pour un cluster custom. N’hésitez pas à le réutiliser !

Une fois l’external converter ajouté, il suffit de redémarrer zigbee2mqtt, activer le mode inclusion, et redémarrer le capteur. Il devrait alors remonter correctement à home assistant.

Affichage de la localisation (home assistant)

Il existe plusieurs exemples pour afficher l’emplacement des personnes sur une carte de type radar. J’en ai donc adapté un pour mon cas. La CARTE LOVELACE est disponible également sur le github. Attention aux dépendances de la carte (vertical stack et plotly).

Carte de localisation des personnes

Carte de localisation des personnes

Réalisation d’un boitier

Afin de finaliser le prototypage de ce capteur, j’ai décidé de réaliser un boitier me permettant de le positionner dans une pièce. J’ai voulu dans un premier temps une forme simple, permettant de maintenir tous les éléments en place, démontable, et facilement utilisable peu importe l’orientation (à plat sur le bureau pour les essais, puis dans la bonne orientation du LD2450).

Modélisation du boitier sous fusion 360

Modélisation du boitier sous fusion 360

Une impression 3D plus tard, on fait les essais de placement.

Essais avant branchement

Essais avant branchement

Tout s’emboite parfaitement, les différents capteurs sont bien maintenus en position horizontale. Je peux éventuellement rajouter un peu de ruban non conducteur pour me permettre de tourner le boitier dans tous les sens.

Je ne diffuse pas le boitier sur le github car cette version n’est pas optimale. En effet elle n’est pas designé pour permettre l’orientation idéale du capteur, même si cela fonctionne. Je modéliserais par la suite une version plus optimisée, si possible orientable, et je la diffuserais sur le github.

En phase de test

En phase de test

Améliorations

Il me reste plusieurs points à optimiser. Tout d’abord, concernant le code, il arrive que lorsqu’une cible n’est plus détectée, les dernières coordonnées ne soient pas effacées. Concernant le hardware, je trouve que le LD2450 ne fonctionne pas à la distance annoncée dans la datasheet (6 mètres). Je ne crois pas avoir réussi à détecter au delà de 3 mètres. Il faut que je fasse de nouveaux essais, avec une autre alimentation et peut-être une meilleure orientation. Concernant le boitier, je souhaite faire une version orientable, ainsi qu’une version plus compacte. En effet je vais essayer d’utiliser un ESP32-C6 mini afin de rendre l’ensemble beaucoup plus compact. De plus le trou pour le BH1750 pour mon boitier n’est pas assez grand ce qui fait qu’il ne reçoit pas assez de lumière pour obtenir une plage de valeur plus cohérente avec la luminosité de la pièce.

TL;DR

Pour réaliser ce capteur de présence vous avez besoin de :

  • ESP32-C6 x1
  • LD2450 x1
  • BH1750 x1

Connecter les 2 capteurs à l’ESP32-C6 Récupérer le code sur mon github Configurer l’extension ESP-IDF sur votre éditeur de code (Visual Studio Code conseillé) Connecter l’ESP32-C6 à votre ordinateur via un câble USB et sélectionner le port correspondant Cliquer sur le bouton “ESP-IDF Build, Flash & Monitor”

© 2025

🌱 Powered by Hugo with theme Dream.

A propos de moi

Bienvenue chez Squwal ! Ce blog est dédié à la domotique, à l’électronique et aux logiciels embarqués, avec un focus sur la conception et la réalisation de capteurs. Ingénieur en logiciel embarqué de formation, je partage ici mes projets pour garder une trace de mes travaux et permettre à d’autres de s’en inspirer.

N’hésitez pas à poser vos questions en commentaires, par mail ou à explorer mon GitHub pour en savoir plus ! 🚀