Automatisation IoT

Réseaux de capteurs d'occupation de bureau avec MQTT : PIR, mmWave et CO2

Comment choisir entre détection PIR, mmWave et CO2, concevoir des topics MQTT pour les salles et les postes de travail, et transformer les données d'occupation en rapports d'utilisation et en économies de CVC.

Plafond d'une salle de réunion équipé d'un petit capteur d'occupation de bureau envoyant des données de présence vers un tableau de bord cloud
Essayez-le sur votre propre broker MQTTObtenez un broker MQTT privé et managé avec l’offre Free et partez d’exemples de code prêts à l’emploi.
Essayer gratuitement Exemples de code Aucune carte bancaire requise

Un réseau de capteurs d'occupation de bureau vous indique quelles salles et quels postes sont réellement utilisés, et à quel moment. Dans ce cas d'usage, vous allez comparer les détections PIR, mmWave et par CO2, publier l'occupation via MQTT avec une conception de topics propre, puis exploiter les données pour des rapports d'utilisation des espaces et un pilotage du CVC à la demande sur un broker ConnectMQ.

Pourquoi mesurer l'occupation

Le travail hybride a rendu l'usage des bureaux imprévisible. Des salles de réunion réservées dans le calendrier restent vides, tandis que les petites salles de concentration sont toujours pleines. Des étages entiers sont chauffés et climatisés selon un horaire complet, même les jours où seule une fraction du personnel est présente. Les données d'occupation répondent à des questions concrètes : quelles salles sont surdimensionnées, un étage peut-il être fermé le vendredi, la ventilation peut-elle être réduite dans les zones vides ?

Les systèmes de réservation et les données de badges donnent une partie de la réponse, mais ils enregistrent une intention et une entrée, pas la présence réelle dans une salle. Les capteurs comblent ce manque, et MQTT est un moyen naturel de collecter leurs données sur de nombreux bâtiments.

Choisir la bonne technologie de détection

Chaque technologie a un mode de défaillance caractéristique, et les meilleurs déploiements en combinent deux.

Technologie Fonctionnement Points forts Points faibles Idéal pour
PIR Détecte les sources de chaleur en mouvement Bon marché, faible consommation, éprouvé Ne voit pas les personnes immobiles : les salles semblent vides pendant le travail concentré Couloirs, sanitaires, commande d'éclairage
Radar mmWave Détecte de très petits mouvements, y compris la respiration Détecte les personnes immobiles, fonctionne à travers des capots fins Peut voir à travers les murs et capter les voisins s'il n'est pas réglé ; nécessite le secteur ou une grosse batterie Salles de réunion, salles de concentration, postes
CO2 La hausse de la concentration de CO2 révèle des personnes qui respirent Donne un comptage approximatif et la qualité de l'air en même temps Lent (plusieurs minutes), dépend du débit de ventilation Pilotage de la ventilation, grandes salles
Capteurs de poste PIR ou thermique sous le bureau Utilisation au niveau du poste Beaucoup d'appareils à maintenir Analyse du flex office
Matrice thermique / compteurs de personnes Image thermique basse résolution ou comptage aux portes Compte les personnes sans images Coût plus élevé, placement délicat Grands open spaces, entrées

Une combinaison courante et robuste pour les salles de réunion associe le mmWave pour la présence et le CO2 pour la confirmation et la ventilation. Utilisé seul, le PIR a tendance à signaler une salle vide pendant les longs appels vidéo, car les participants bougent à peine.

La confidentialité d'abord

Les données d'occupation concernent des personnes. Utilisez des capteurs qui ne capturent pas d'images, publiez une présence ou un comptage plutôt que des identités, et ne mettez jamais de noms ni d'identifiants de badge dans les topics. Agrégez les données des postes avant de les diffuser largement, et vérifiez la réglementation locale ainsi que les accords avec les représentants du personnel avant le déploiement.

Conception des topics et des payloads MQTT

Calquez les topics sur la hiérarchie physique afin que les wildcards répondent à de vraies questions :

acme/ist01/hq/f03/meeting-301/occupancy        presence state (retained)
acme/ist01/hq/f03/meeting-301/co2              CO2 ppm
acme/ist01/hq/f03/desk-3-14/occupancy          desk presence (retained)

Un message de présence doit contenir l'état, la source et l'heure du dernier changement :

{
  "ts": "2026-10-16T09:41:07Z",
  "occupied": true,
  "source": "mmwave",
  "since": "2026-10-16T09:12:30Z",
  "count_estimate": null
}

Publiez l'occupation en retained afin qu'un tableau de bord qui se connecte en milieu de journée affiche immédiatement l'état actuel. Publiez à chaque changement, plus un heartbeat toutes les quelques minutes : le trafic reste minime et vous pouvez quand même détecter un capteur hors service. Avec une hiérarchie de type dossiers, acme/ist01/hq/f03/+/occupancy renvoie toutes les salles et tous les postes du troisième étage, et la vue des appareils de ConnectMQ peut regrouper ces mêmes topics par site et par zone.

Un nœud capteur mmWave simple

Les modules mmWave populaires et bon marché, comme la famille LD2410, exposent une broche de sortie numérique qui passe à l'état haut lorsqu'une présence est détectée. Un ESP32 peut filtrer les rebonds de cette broche et publier les changements. Le sketch utilise PubSubClient et le serveur MQTT public gratuit pour les tests.

#include <WiFi.h>
#include <PubSubClient.h>

const char* WIFI_SSID = "YOUR_WIFI";
const char* WIFI_PASS = "YOUR_WIFI_PASSWORD";
const char* BROKER = "broker.connectmq.com";
const int   PORT = 1883;
const char* TOPIC = "connectmq/demo/occ-5t2w/f03/meeting-301/occupancy";
const int   PRESENCE_PIN = 27;           // broche OUT du LD2410
const unsigned long HOLD_MS = 60000;     // rester "occupé" 60 s après la dernière détection
const unsigned long HEARTBEAT_MS = 300000;

WiFiClient net;
PubSubClient mqtt(net);
bool occupied = false;
unsigned long lastSeen = 0, lastPublish = 0;

void publishState() {
  char msg[96];
  snprintf(msg, sizeof(msg), "{\"occupied\":%s,\"source\":\"mmwave\",\"uptime_s\":%lu}",
           occupied ? "true" : "false", millis() / 1000);
  mqtt.publish(TOPIC, msg, true);        // retained
  lastPublish = millis();
}

void connectMqtt() {
  while (!mqtt.connected()) {
    String id = "occ-" + String((uint32_t)ESP.getEfuseMac(), HEX);
    if (mqtt.connect(id.c_str())) {
      publishState();
    } else {
      delay(2000);
    }
  }
}

void setup() {
  pinMode(PRESENCE_PIN, INPUT);
  WiFi.begin(WIFI_SSID, WIFI_PASS);
  while (WiFi.status() != WL_CONNECTED) delay(250);
  mqtt.setServer(BROKER, PORT);
}

void loop() {
  if (!mqtt.connected()) connectMqtt();
  mqtt.loop();

  if (digitalRead(PRESENCE_PIN) == HIGH) lastSeen = millis();
  bool now = (millis() - lastSeen) < HOLD_MS && lastSeen != 0;

  if (now != occupied) {
    occupied = now;
    publishState();
  } else if (millis() - lastPublish > HEARTBEAT_MS) {
    publishState();
  }
  delay(100);
}

Le temps de maintien est le paramètre de réglage le plus important. Trop court, la salle clignote entre occupée et vide ; trop long, la salle paraît occupée après le départ des gens. Une valeur de soixante secondes à quelques minutes convient bien aux salles de réunion. Réglez la portée de détection du radar avec l'outil du fabricant pour qu'il ne voie pas le couloir.

De la présence brute à l'utilisation

Les messages bruts marche/arrêt deviennent utiles une fois agrégés. Un petit abonné peut calculer, par salle et par jour, la part des heures ouvrées pendant laquelle la salle était occupée. Une version Python minimale :

import json
import time
import uuid
from collections import defaultdict

import paho.mqtt.client as mqtt

PREFIX = "connectmq/demo/occ-5t2w"
occupied_since = {}
occupied_seconds = defaultdict(float)


def on_connect(client, userdata, flags, reason_code, properties):
    client.subscribe(f"{PREFIX}/+/+/occupancy", qos=1)


def on_message(client, userdata, msg):
    room = "/".join(msg.topic.split("/")[-3:-1])
    data = json.loads(msg.payload)
    now = time.time()
    if data["occupied"] and room not in occupied_since:
        occupied_since[room] = now
    elif not data["occupied"] and room in occupied_since:
        occupied_seconds[room] += now - occupied_since.pop(room)
    hours = occupied_seconds[room] / 3600
    client.publish(f"{PREFIX}/{room}/utilization",
                   json.dumps({"occupied_hours_today": round(hours, 2)}), retain=True)


client = mqtt.Client(mqtt.CallbackAPIVersion.VERSION2, client_id=f"occ-agg-{uuid.uuid4().hex[:6]}")
client.on_connect = on_connect
client.on_message = on_message
client.connect("broker.connectmq.com", 1883, 60)
client.loop_forever()

En production, stockez les transitions dans une base de données afin de pouvoir établir les pics hebdomadaires et comparer les salles selon leur taille. Les mêmes topics d'occupation retenus peuvent aussi alimenter un jumeau numérique du bâtiment.

Utiliser l'occupation pour piloter le CVC

Les données d'occupation sont rentabilisées le plus vite lorsqu'elles pilotent la ventilation et les réduits de température :

  1. Lorsqu'une zone est vide depuis une durée définie, une passerelle peut élargir sa zone neutre de température ou réduire le débit d'air.
  2. Lorsque le CO2 dépasse votre objectif, augmentez la ventilation quel que soit l'état de présence.
  3. Avant une occupation planifiée, préconditionnez l'espace comme d'habitude ; l'occupation ne fait qu'ajuster le planning, elle ne le remplace jamais.
  4. Gardez toujours une commande locale sûre : le régulateur CVC doit revenir à son planning si les données d'occupation cessent d'arriver.

Le chemin de réécriture vers la GTB est le même que celui décrit dans BACnet vers MQTT, et le volet CVC est traité dans surveillance CVC avec des capteurs IoT. La mesure du CO2 sert aussi d'indicateur de qualité de l'air ; consultez notre réalisation de capteur de qualité de l'air intérieur.

Valider la précision des capteurs

Avant que quiconque ne bâtisse un rapport sur les données d'occupation, vérifiez que les capteurs disent la vérité. Une simple semaine de validation fonctionne bien. Choisissez quelques salles et demandez à un collègue de noter l'usage réel à heures fixes, ou comparez les données des capteurs avec les réservations du calendrier et repérez les désaccords. Les constats typiques sont des capteurs mmWave qui signalent une salle occupée parce qu'ils voient des mouvements dans le couloir, des capteurs PIR qui signalent des salles vides pendant les longs appels, et des capteurs CO2 qui accusent un retard de dix minutes ou plus après l'arrivée des personnes.

Corrigez chaque constat à la source : réduisez la portée de détection du radar, orientez un PIR vers la zone d'assise plutôt que vers la porte, ou utilisez le CO2 uniquement comme signal de confirmation. Consignez les réglages finaux par type de salle afin que les nouvelles installations partent d'une configuration éprouvée. La validation renforce aussi la confiance des personnes dont les salles sont mesurées, ce qui compte autant que la précision technique.

Liste de contrôle du déploiement

  1. Inventoriez les salles et choisissez la technologie par type de salle.
  2. Montez les capteurs mmWave orientés vers l'intérieur de la salle, loin des portes et des fenêtres.
  3. Attribuez à chaque capteur un client ID et des identifiants uniques sur un broker privé.
  4. Mettez en service chaque salle en entrant et en sortant tout en observant l'explorateur de topics.
  5. Laissez tourner deux semaines avant de tirer des conclusions sur l'utilisation.

Tester sur le serveur MQTT public gratuit convient pour un prototype avec un préfixe de démonstration, mais les vraies données d'occupation révèlent quand les gens sont dans le bâtiment : elles ont leur place sur un broker privé en TLS. Un broker MQTT managé de ConnectMQ donne à chaque capteur ses propres identifiants, et quelques dizaines de capteurs tiennent largement dans un pilote. Pour d'autres projets dans le bâtiment, consultez le guide de l'automatisation IoT.

Faites tourner vos capteurs d'occupation sur ConnectMQ

Inscrivez-vous sur app.connectmq.com et créez un broker Serverless gratuit, sans carte bancaire. Connectez vos premiers capteurs, suivez les changements de présence en direct dans l'explorateur de topics et ajoutez des règles d'alerte à seuil pour le CO2 dans les salles très fréquentées. ConnectMQ gère le broker pour que vous puissiez vous concentrer sur l'espace.

Questions fréquentes

Quel capteur d'occupation de bureau est le plus précis pour les salles de réunion ?

Le radar mmWave est généralement le meilleur choix unique, car il détecte les personnes immobiles. L'associer au CO2 apporte une confirmation et permet de piloter la ventilation.

Les capteurs d'occupation collectent-ils des données personnelles ?

Les capteurs PIR, mmWave et CO2 ne capturent ni images ni identités, mais les schémas d'occupation restent sensibles. Publiez uniquement une présence ou un comptage et conservez les données sur un broker privé.

Quelle doit être la durée du temps de maintien ?

Commencez par 60 secondes pour les petites salles et jusqu'à quelques minutes pour les grandes, puis ajustez après avoir observé les données réelles pendant une semaine.

Les données d'occupation peuvent-elles réduire la consommation énergétique du CVC ?

Oui, en abaissant la température et la ventilation dans les zones vides. Conservez le planning du régulateur comme solution de repli afin que le confort ne dépende jamais du réseau de capteurs.

Articles liés

Guide d'installation de Zigbee2MQTT : du coordinateur au tableau de bord

Installez Zigbee2MQTT avec Docker, configurez le coordinateur et la connexion MQTT, appairez et renommez les appareils, pilotez-les via MQTT et affichez leurs états sur un tableau de bord, en testant d'abord sur le serveur MQTT public gratuit.

8 min de lecture

Tous les articles →

Votre broker MQTT privé, à quelques clics

Créez un compte, récupérez les identifiants de votre broker et connectez votre premier appareil — aucun serveur à installer, mettre à jour ou dimensionner.