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:
- 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.
- Quando o CO2 sobe acima da sua meta, aumente a ventilação independentemente do estado de presença.
- Antes da ocupação programada, pré-condicione o espaço normalmente; a ocupação apenas ajusta a agenda, nunca a substitui.
- 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
- Faça um levantamento das salas e defina a tecnologia por tipo de sala.
- Instale os sensores mmWave voltados para o interior da sala, longe de portas e janelas.
- Dê a cada sensor um client ID e credenciais únicos em um broker privado.
- Comissione cada sala entrando e saindo enquanto observa o explorador de topics.
- 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.



