Automação IoT

Redes de Sensores de Ocupação de Escritório com MQTT: PIR, mmWave e CO2

Como escolher entre detecção por PIR, mmWave e CO2, projetar topics MQTT para salas e mesas e transformar dados de ocupação em relatórios de utilização e economia no HVAC.

Teto de uma sala de reunião com um pequeno sensor de ocupação de escritório enviando dados de presença a um dashboard na nuvem
Rode isso no seu próprio broker MQTTTenha um broker MQTT privado e gerenciado no plano Free e comece com exemplos de código prontos.
Teste grátis Exemplos de código Sem cartão de crédito

Uma rede de sensores de ocupação de escritório mostra quais salas e mesas são realmente usadas, e quando. Neste caso de uso você vai comparar a detecção por PIR, mmWave e CO2, publicar a ocupação via MQTT com um design de topics limpo e usar os dados para relatórios de utilização de espaços e para o controle de HVAC baseado em demanda em um broker ConnectMQ.

Por Que Medir a Ocupação

O trabalho híbrido tornou o uso do escritório imprevisível. Salas de reunião reservadas na agenda ficam vazias, enquanto as pequenas salas de foco estão sempre cheias. Andares são aquecidos e resfriados na agenda completa mesmo em dias em que só uma fração da equipe aparece. Os dados de ocupação respondem a perguntas práticas: quais salas estão superdimensionadas, se um andar pode ser fechado às sextas-feiras e se a ventilação pode ser reduzida em zonas vazias.

Sistemas de reserva e dados de crachá dão parte do quadro, mas registram intenção e entrada, não a presença real em uma sala. Os sensores preenchem essa lacuna, e o MQTT é uma forma natural de coletar seus dados em muitos edifícios.

Escolhendo a Tecnologia de Detecção Certa

Cada tecnologia tem um modo de falha característico, e as melhores implantações combinam duas.

Tecnologia Como funciona Pontos fortes Pontos fracos Ideal para
PIR Detecta fontes de calor em movimento Barato, baixo consumo, maduro Não detecta pessoas paradas, então as salas parecem vazias durante trabalho concentrado Corredores, banheiros, controle de iluminação
Radar mmWave Detecta movimentos mínimos, inclusive a respiração Detecta pessoas paradas, funciona através de coberturas finas Pode enxergar através de paredes e captar vizinhos se não for ajustado; precisa de alimentação da rede ou bateria grande Salas de reunião, salas de foco, mesas
CO2 O aumento da concentração de CO2 indica pessoas respirando Dá uma contagem aproximada e a qualidade do ar ao mesmo tempo Lento (minutos), depende da taxa de ventilação Controle de ventilação, salas grandes
Sensores de mesa PIR ou térmico sob a mesa Utilização no nível da mesa Muitos dispositivos para manter Análise de hot desking
Matriz térmica / contadores de pessoas Imagem térmica de baixa resolução ou contagem na porta Conta pessoas sem imagens Custo mais alto, posicionamento cuidadoso Grandes espaços abertos, entradas

Uma combinação comum e robusta para salas de reunião é mmWave para presença mais CO2 para confirmação e ventilação. O PIR sozinho tende a reportar a sala como vazia durante longas videochamadas, porque as pessoas mal se mexem.

Privacidade em primeiro lugar

Dados de ocupação dizem respeito a pessoas. Use sensores que não capturam imagens, publique presença ou contagens em vez de identidades e nunca coloque nomes ou IDs de crachá nos topics. Agregue os dados de mesas antes de compartilhá-los amplamente, e verifique a legislação local e os acordos com representantes dos trabalhadores antes da implantação.

Design de Topics e Payloads MQTT

Modele os topics segundo a hierarquia física, para que os wildcards respondam a perguntas reais:

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)

Uma mensagem de presença deve trazer o estado, a fonte e quando ele mudou pela última vez:

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

Publique a ocupação como retida para que um dashboard que se conecte no meio do dia mostre o estado atual imediatamente. Publique na mudança mais um heartbeat a cada poucos minutos, o que mantém o tráfego mínimo e ainda permite detectar um sensor morto. Com a hierarquia no estilo de pastas, acme/ist01/hq/f03/+/occupancy retorna todas as salas e mesas do terceiro andar, e a visão de dispositivos do ConnectMQ pode agrupar os mesmos topics por site e área.

Um Nó Simples de Sensor mmWave

Módulos mmWave populares e de baixo custo, como os da família LD2410, expõem um pino de saída digital que vai a nível alto quando a presença é detectada. Um ESP32 pode fazer o debounce desse pino e publicar as mudanças. O sketch usa PubSubClient e o servidor MQTT público para testes.

#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;           // pino OUT do LD2410
const unsigned long HOLD_MS = 60000;     // permanece "ocupado" 60 s após a última detecção
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);        // retido
  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);
}

O tempo de retenção é o parâmetro de ajuste mais importante. Curto demais, e a sala oscila entre ocupada e vazia; longo demais, e a sala parece movimentada depois que as pessoas saem. De sessenta segundos a alguns minutos funciona bem para salas de reunião. Ajuste o alcance de detecção do radar com a ferramenta do fabricante para que ele não enxergue o corredor.

Da Presença Bruta à Utilização

As mensagens brutas de ligado/desligado se tornam úteis quando agregadas. Um pequeno subscriber pode calcular, por sala e por dia, a fração do horário de trabalho em que a sala esteve ocupada. Uma versão mínima em Python:

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()

Em produção, armazene as transições em um banco de dados para poder reportar os picos semanais e comparar as salas por tamanho.

Usando a Ocupação para o Controle de HVAC

Os dados de ocupação se pagam mais rápido quando comandam a ventilação e o recuo de temperatura:

  1. Quando uma zona fica vazia por um período definido, um gateway pode ampliar sua banda morta de temperatura ou reduzir o fluxo de ar.
  2. Quando o CO2 sobe acima da sua meta, aumente a ventilação independentemente do estado de presença.
  3. Antes da ocupação programada, pré-condicione o espaço normalmente; a ocupação apenas ajusta a agenda, nunca a substitui.
  4. Mantenha sempre o controle local seguro: o controlador de HVAC deve voltar à sua agenda se os dados de ocupação pararem de chegar.

O caminho de escrita de volta para o BMS é o mesmo descrito em BACnet para MQTT, e o lado do HVAC é tratado em monitoramento de HVAC com sensores IoT. A medição de CO2 também serve como sinal de qualidade do ar; veja nosso projeto de monitor de qualidade do ar interno.

Validando a Precisão dos Sensores

Antes que alguém monte um relatório com base nos dados de ocupação, verifique se os sensores dizem a verdade. Uma semana simples de validação funciona bem. Escolha algumas salas e peça a um colega que anote o uso real em horários fixos, ou compare os dados dos sensores com as reservas da agenda e procure divergências. Os achados típicos são sensores mmWave que reportam uma sala ocupada porque veem movimento no corredor, sensores PIR que reportam salas vazias durante chamadas longas e sensores de CO2 que atrasam dez minutos ou mais depois que as pessoas chegam.

Corrija cada achado na origem: reduza o alcance de detecção do radar, mova um PIR para que ele fique voltado para a área de assentos em vez da porta, ou use o CO2 apenas como sinal de confirmação. Registre as configurações finais por tipo de sala para que novas instalações partam de uma configuração comprovada. A validação também gera confiança entre as pessoas cujas salas estão sendo medidas, o que importa tanto quanto a precisão técnica.

Checklist de Implantação

  1. Faça um levantamento das salas e defina a tecnologia por tipo de sala.
  2. Instale os sensores mmWave voltados para o interior da sala, longe de portas e janelas.
  3. Dê a cada sensor um client ID e credenciais únicos em um broker privado.
  4. Comissione cada sala entrando e saindo enquanto observa o explorador de topics.
  5. Deixe rodar por duas semanas antes de tirar conclusões sobre a utilização.

Testar no servidor MQTT público com um prefixo de demonstração não é problema, mas dados reais de ocupação revelam quando as pessoas estão no edifício (e, quando vinculados a pessoas identificáveis, podem ser dados pessoais sob a LGPD), então eles pertencem a um broker privado com TLS. Um broker MQTT gerenciado do ConnectMQ dá a cada sensor suas próprias credenciais, e algumas dezenas de sensores cabem tranquilamente em um piloto. Os mesmos topics retidos de ocupação também podem alimentar um gêmeo digital do edifício. Para mais projetos prediais, veja o guia de automação IoT.

Rode Seus Sensores de Ocupação no ConnectMQ

Cadastre-se em app.connectmq.com e crie um broker Serverless gratuito, sem cartão de crédito. Conecte seus primeiros sensores, acompanhe a presença mudar ao vivo no explorador de topics e adicione regras de alerta por limite para o CO2 em salas movimentadas. O ConnectMQ cuida do broker para que você possa se concentrar no espaço.

Perguntas frequentes

Qual sensor de ocupação de escritório é mais preciso para salas de reunião?

O radar mmWave costuma ser a melhor escolha isolada porque detecta pessoas paradas. Combiná-lo com CO2 adiciona confirmação e permite o controle da ventilação.

Os sensores de ocupação capturam dados pessoais?

Sensores PIR, mmWave e de CO2 não capturam imagens nem identidades, mas os padrões de ocupação continuam sendo sensíveis. Publique apenas presença ou contagens e mantenha os dados em um broker privado.

Qual deve ser o tempo de retenção?

Comece com 60 segundos para salas pequenas e até alguns minutos para as grandes, e ajuste depois de observar dados reais por uma semana.

Os dados de ocupação podem reduzir o consumo de energia do HVAC?

Sim, recuando a temperatura e a ventilação em zonas vazias. Mantenha a agenda do controlador como fallback para que o conforto nunca dependa da rede de sensores.

Artigos relacionados

Guia de Configuração do Zigbee2MQTT: do Coordenador ao Painel

Instale o Zigbee2MQTT com Docker, configure o coordenador e a conexão MQTT, pareie e renomeie dispositivos, controle-os via MQTT e veja seus estados em um painel, testando primeiro no servidor MQTT público (gratuito).

8 min de leitura

Todos os artigos →

Seu broker MQTT privado está a poucos cliques de distância

Crie uma conta, receba as credenciais do seu broker e conecte seu primeiro dispositivo — sem servidores para instalar, atualizar ou escalar.