RuView : détecter une présence avec les signaux WiFi (CSI), sans caméra

Un capteur PIR ne voit rien d’immobile : une personne assise sans bouger devant son écran devient invisible pour l’automatisation qui éteint la lumière. Une caméra règle le problème mais pose celui de la vie privée et du flux vidéo à sécuriser. RuView attaque le problème autrement : il lit les perturbations que le corps humain provoque sur les ondes WiFi déjà présentes dans la pièce, pour détecter une présence — même immobile — sans image et sans capteur dédié.

Ce que fait RuView

RuView (dépôt ruvnet/RuView sur GitHub, licence MIT) exploite le Channel State Information (CSI) : la façon dont un signal WiFi est déformé (amplitude, phase) en traversant une pièce où quelqu’un bouge, respire ou reste assis. Le projet capture ce signal via des nœuds ESP32, le traite pour en extraire une présence, un mouvement, un rythme respiratoire ou cardiaque, et pousse ces données vers Home Assistant.

C’est la mise en pratique, en version bricolable et open source, d’une technique étudiée depuis plusieurs années dans la recherche académique (WiFi sensing, dont des travaux type “WiFi DensePose” côté Carnegie Mellon) — avec toute la distance qui sépare un papier de recherche d’un ESP32 à 10 dollars posé sur une étagère. J’y reviens dans les points faibles, car l’écart compte.

Comment ça fonctionne : le CSI en bref

D’après la documentation du dépôt :

  1. Capture — chaque nœud ESP32 relève le CSI sur trois canaux WiFi (1, 6, 11), avec 56 sous-porteuses par canal, soit 168 “sous-porteuses virtuelles” par lien radio.
  2. Fusion multistatique — quand plusieurs nœuds sont déployés, leurs relevés sont combinés en embeddings pondérés par un mécanisme d’attention, pour croiser les points de vue.
  3. Traitement du signal — filtrage de Hampel, analyse de phase, méthodes spectrales pour isoler des bandes de fréquence utiles : 0,1–0,5 Hz pour la respiration, 0,8–2,0 Hz pour le rythme cardiaque.
  4. Inférence — des modèles entraînés convertissent ces signaux traités en présence, points clés de pose ou constantes vitales.

Le calcul peut tourner en local (edge, sur l’ESP32 ou un Raspberry Pi) : aucune image, aucun son, pas de dépendance cloud pour le traitement de base.

Installation

Ces commandes sont extraites du README et des releases du dépôt (à re-vérifier avant usage, le projet évolue vite — commits quasi quotidiens) :

# Mode simulation, sans matériel (Docker)
docker pull ruvnet/wifi-densepose:latest
docker run -p 3000:3000 ruvnet/wifi-densepose:latest

# Paquet Python
pip install ruview
pip install "ruview[client]"   # client WebSocket asyncio en plus

Pour un déploiement réel, il faut au moins un nœud ESP32 compatible CSI (ESP32-S3 ou ESP32-C6 — l’ESP32 classique et l’ESP32-C3 n’ont pas la puissance de calcul nécessaire au traitement du signal, d’après les auteurs). Flash du firmware précompilé puis provisioning WiFi :

# Flash (exemple carte 8 Mo)
python -m esptool --chip esp32s3 --port COM7 --baud 460800 write_flash \
  --flash_mode dio --flash_size 8MB \
  0x0 bootloader.bin 0x8000 partition-table.bin 0x20000 esp32-csi-node.bin

# Provisioning WiFi + cible réseau
python provision.py --port COM7 --ssid "VOTRE_SSID" --password "VOTRE_MDP" \
  --target-ip 192.168.1.100 --target-port 5005

Intégration Home Assistant

RuView expose ses données via auto-découverte MQTT (protocole HA-DISCO du projet) : chaque nœud publie 21 entités, réparties en 11 signaux bruts et 10 états sémantiques déjà interprétés (présence de mouvement, personne endormie, salle de bain occupée, sortie de lit, absence de mouvement prolongée, etc.). Trois blueprints Home Assistant prêts à l’emploi sont fournis pour démarrer sans écrire d’automatisation à la main. Un mode “vie privée” limite ce qui sort du réseau local aux données structurées, le CSI brut restant sur le nœud.

+ Les points forts

  • Pas de caméra, pas de micro — la détection se fait sur des ondes radio, rien à filmer ni à enregistrer
  • Détecte l’immobilité — contrairement au PIR classique, capable en théorie de repérer une présence assise sans mouvement (via la respiration)
  • Intégration Home Assistant soignée — auto-découverte MQTT, 21 entités par nœud, blueprints fournis
  • Base académique réelle — le WiFi sensing par CSI est un champ de recherche documenté depuis des années, ce n’est pas un concept inventé pour l’occasion
  • Open source, licence MIT — code auditable, plus de 91 900 étoiles et 12 200 forks sur GitHub (vérifié via l’API GitHub)

- Les points faibles

  • Écart net entre la promesse et les résultats mesurés sur certaines fonctions — les auteurs indiquent eux-mêmes que la pose à 17 points sur un seul ESP32 atteint un score de 3 % (objectif visé : 35 %+), avec des “articulations distales et faciales quasi aléatoires”. Une précédente annonce de “100 % de précision” en détection de présence a été retirée après avoir été identifiée comme un artefact de mesure sur une seule classe.
  • Reproductibilité contestée par une partie de la communauté — plusieurs issues sur le dépôt documentent des installations sans résultat exploitable (par exemple l’issue #14 “Non functional”, l’issue #230 pointant l’absence de vidéo de démonstration probante à l’époque, ou l’issue #299 sur des soucis de détection avec un montage ESP32). La couverture presse (Hacker News, médias spécialisés sécurité) reste partagée entre “technique plausible mais surestimée dans sa présentation” et scepticisme plus franc sur les capacités “à travers les murs”.
  • La détection de présence/mouvement de base est ce qui fonctionne le mieux — la respiration marche avec un bon placement des nœuds, le rythme cardiaque est décrit comme sensible au placement et peu fiable par le projet lui-même.
  • Développement très rapide — commits quasi quotidiens, formats de firmware et scripts de provisioning qui ont déjà changé plusieurs fois (offset de flash, gestion des identifiants WiFi) : les commandes ci-dessus sont à revalider à chaque mise à jour.
  • Pas un dispositif médical ou de sécurité — les auteurs le précisent explicitement : usage recherche/prototype, pas pour la détection de chute en contexte médical réel ni pour un système de sécurité critique.

RuView vs autres méthodes de détection

RuView (WiFi CSI)PIR classiqueCaméra + IA
Détecte l’immobilitéRevendiqué (respiration)NonOui, si visible
Image/son capturéNonNonOui
MaturitéRécente, en développement rapideÉprouvée depuis des décenniesÉprouvée
Fiabilité constatéeInégale selon la fonctionÉlevée sur son cas d’usage (mouvement)Élevée
Intégration Home AssistantMQTT natifNative (binary_sensor)Via add-ons (Frigate, etc.)

En résumé

RuView est un projet sérieux dans son ambition et sa base technique (CSI, traitement du signal, intégration Home Assistant bien pensée), mais la détection de présence/mouvement de base est aujourd’hui la partie la plus solide — le reste (pose, rythme cardiaque, détection à travers les murs) est documenté par le projet lui-même comme expérimental, voire en dessous des objectifs annoncés. À réserver aux homelabbers curieux de bidouiller du WiFi sensing, pas à qui cherche une détection de présence fiable “out of the box” : pour ça, un PIR ou un capteur mmWave du commerce reste plus prévisible.


Voir aussi :