Um monitor de energia residencial com MQTT mostra o que a casa inteira consome, segundo a segundo, e disponibiliza esse número para todos os dashboards e automações que você usa. Neste guia você vai escolher entre um leitor de medidor inteligente e sensores de corrente do tipo TC (alicate), publicar o consumo com um script Python e armazenar e plotar os dados com Telegraf e InfluxDB. Você também vai ver quais números importam para o autoconsumo solar e como manter os dados privados.
Duas Formas de Medir a Casa Inteira
Você pode medir no medidor da concessionária ou no quadro de distribuição. As duas funcionam bem; a escolha certa depende do seu medidor e da sua familiaridade com trabalhos elétricos.
| Abordagem | O que você precisa | Mede | Esforço e segurança |
|---|---|---|---|
| Porta do medidor inteligente (P1 / DSMR, outras portas para o consumidor) | Medidor com porta do cliente ativada, cabo USB ou leitor baseado em ESP | Importação, exportação, tarifas, tensão, muitas vezes gás | Plug-in, sem trabalho elétrico |
| Medidor TC pronto (por exemplo, Shelly Pro 3EM, Shelly EM) | Dispositivo montado no quadro com sensores alicate | Potência por fase, energia, tensão | Instalado no quadro por um profissional qualificado |
| Sensores TC DIY (SCT-013 + ESP32) | Sensores, resistor de carga, circuito de polarização | Corrente por circuito, potência estimada | Os sensores não são invasivos, mas ainda exigem acesso ao quadro |
| LED de pulsos do medidor | Sensor de luz fixado sobre o LED | Energia pela taxa de pulsos | Sem trabalho elétrico, resolução menor |
Na Holanda, na Bélgica e em Luxemburgo, a maioria dos medidores inteligentes tem uma porta P1 que transmite um "telegrama" de texto a cada segundo (DSMR 5) ou a cada dez segundos (DSMR 4). É a fonte mais fácil e precisa, porque os números são os mesmos que a concessionária fatura. Em outros lugares, procure uma interface equivalente para o consumidor ou use sensores TC.
Qualquer trabalho dentro de um quadro de distribuição deve ser feito por um eletricista qualificado. Os sensores alicate não cortam fios, mas abrir o quadro expõe partes energizadas.
Design de Topics para um Feed de Monitor de Energia Residencial MQTT
Mantenha um topic de telemetria por medidor, com um payload JSON compacto, além de um status retido:
connectmq/demo/<random-id>/energy/grid/telemetry (JSON, every 1-10 s)
connectmq/demo/<random-id>/energy/grid/status (online/offline, retained)
{
"import_w": 1193,
"export_w": 0,
"net_w": 1193,
"import_kwh_t1": 4182.517,
"import_kwh_t2": 3970.204,
"export_kwh_t1": 1520.110,
"export_kwh_t2": 3184.623,
"voltage_l1": 230.1,
"ts": 1760605123
}
Publique net_w (importação menos exportação) como valor com sinal. As automações de energia solar e baterias se importam com esse único número: negativo significa que você está exportando.
Lendo um Medidor Inteligente P1 com Python
Conecte um cabo P1-USB a um Raspberry Pi ou a qualquer máquina Linux. Medidores DSMR 4 e 5 usam 115200 baud, 8 bits de dados, sem paridade e 1 bit de parada. Cada telegrama começa com /, termina com ! mais um CRC e contém linhas como 1-0:1.7.0(01.193*kW). Os códigos OBIS de que você precisa:
| Código OBIS | Significado | Unidade |
|---|---|---|
1-0:1.8.1 / 1-0:1.8.2 |
Energia importada, tarifa 1 / 2 | kWh |
1-0:2.8.1 / 1-0:2.8.2 |
Energia exportada, tarifa 1 / 2 | kWh |
1-0:1.7.0 |
Potência de importação atual | kW |
1-0:2.7.0 |
Potência de exportação atual | kW |
1-0:32.7.0 |
Tensão L1 | V |
0-1:24.2.1 |
Leitura do medidor de gás (com carimbo de data/hora) | m3 |
Instale as dependências:
pip install "paho-mqtt>=2.0" pyserial
import json
import re
import time
import uuid
import serial
import paho.mqtt.client as mqtt
PORT = "/dev/ttyUSB0"
PREFIX = f"connectmq/demo/{uuid.uuid4().hex[:8]}/energy/grid"
PUBLISH_EVERY = 5 # segundos; o DSMR 5 envia um telegrama por segundo
LINE = re.compile(r"^(\d+-\d+:\d+\.\d+\.\d+)\((.*)\)$")
VALUE = re.compile(r"([\d.]+)\*")
FIELDS = {
"1-0:1.8.1": ("import_kwh_t1", 1),
"1-0:1.8.2": ("import_kwh_t2", 1),
"1-0:2.8.1": ("export_kwh_t1", 1),
"1-0:2.8.2": ("export_kwh_t2", 1),
"1-0:1.7.0": ("import_w", 1000), # kW -> W
"1-0:2.7.0": ("export_w", 1000),
"1-0:32.7.0": ("voltage_l1", 1),
}
def parse(telegram):
out = {}
for line in telegram.splitlines():
m = LINE.match(line.strip())
if not m or m.group(1) not in FIELDS:
continue
name, factor = FIELDS[m.group(1)]
v = VALUE.search(m.group(2))
if v:
out[name] = round(float(v.group(1)) * factor, 3)
if "import_w" in out and "export_w" in out:
out["net_w"] = round(out["import_w"] - out["export_w"], 1)
return out
mq = mqtt.Client(mqtt.CallbackAPIVersion.VERSION2, client_id=f"p1-{uuid.uuid4().hex[:6]}")
mq.will_set(f"{PREFIX}/status", "offline", qos=1, retain=True)
mq.connect("broker.connectmq.com", 1883, keepalive=60)
mq.loop_start()
mq.publish(f"{PREFIX}/status", "online", qos=1, retain=True)
print("Publishing to", PREFIX)
ser = serial.Serial(PORT, 115200, bytesize=8, parity="N", stopbits=1, timeout=12)
buf, last_pub = [], 0.0
while True:
raw = ser.readline().decode("ascii", errors="ignore")
if not raw:
continue
if raw.startswith("/"):
buf = [raw]
elif buf:
buf.append(raw)
if raw.startswith("!"):
data = parse("".join(buf))
buf = []
if data and time.time() - last_pub >= PUBLISH_EVERY:
data["ts"] = int(time.time())
mq.publish(f"{PREFIX}/telemetry", json.dumps(data), qos=0, retain=True)
last_pub = time.time()
print(data)
O script limita o envio a uma mensagem a cada cinco segundos. Isso é mais que suficiente para dashboards e fica muito abaixo do limite do servidor MQTT público, de 10 mensagens por segundo por cliente. Em um build de produção, acrescente a validação CRC16 de cada telegrama; telegramas corrompidos são raros, mas acontecem com cabos longos.
Prefere um leitor P1 baseado em ESP em vez de um Raspberry Pi? Vários projetos de firmware aberto publicam dados DSMR diretamente no MQTT; aponte-os para o mesmo broker e o mesmo layout de topics.
O Caminho dos Sensores TC
Se você não tem uma porta de medidor utilizável, um medidor TC trifásico como o Shelly Pro 3EM é a opção de menor esforço. Depois de configurado, ele publica a potência por fase e os totais via MQTT, e o guia do Shelly MQTT explica seus topics e as configurações de TLS. Montagens DIY com ESP32 e sensores SCT-013 também são populares, mas observe que um sensor de corrente sozinho não distingue importação de exportação; você precisa de uma referência de tensão para calcular a potência real e sua direção. Para aparelhos individuais, tomadas são mais simples; veja monitoramento de energia com tomada inteligente MQTT.
Armazenando e Plotando com Telegraf e InfluxDB
O broker entrega valores ao vivo, mas não guarda histórico. O input mqtt_consumer do Telegraf assina como qualquer outro cliente e grava no InfluxDB, que o Grafana ou a própria interface do InfluxDB podem plotar.
[[inputs.mqtt_consumer]]
servers = ["tcp://broker.connectmq.com:1883"]
topics = ["connectmq/demo/+/energy/+/telemetry"]
client_id = "telegraf-energy-5527"
qos = 0
data_format = "json"
name_override = "energy"
json_time_key = "ts"
json_time_format = "unix"
[[inputs.mqtt_consumer.topic_parsing]]
topic = "connectmq/demo/+/energy/+/telemetry"
tags = "_/_/_/_/meter/_"
[[outputs.influxdb_v2]]
urls = ["http://localhost:8086"]
token = "YOUR_INFLUX_TOKEN"
organization = "home"
bucket = "energy"
O bloco topic_parsing transforma o nome do medidor no topic em uma tag, de modo que os medidores grid, solar e heatpump viram uma única medição com a tag meter. Gráficos úteis para montar primeiro:
- Potência líquida nas últimas 24 horas, com o zero destacado para que a exportação fique evidente.
- Importação e exportação diárias a partir da diferença dos contadores de kWh por dia.
- Carga de base, a menor potência líquida entre 2h e 5h da manhã, que revela os consumidores sempre ligados.
- Importação por tarifa, para conferir se as cargas flexíveis realmente rodam no período mais barato.
Dashboards no Node-RED e o Home Assistant funcionam igualmente bem; cada um simplesmente assina o topic de telemetria.
Agindo a Partir dos Números
Um valor net_w ao vivo no MQTT é mais que um gráfico; é a base de um gêmeo digital simples da instalação elétrica da casa e uma entrada para automação. Alguns padrões valem a pena configurar logo:
- Acionamento por excedente. Quando
net_wficar abaixo de um limite negativo (você está exportando) por alguns minutos, ligue um aquecedor de água, a lava-louças ou um carregador de veículo elétrico, e desligue de novo com histerese quando a importação voltar. - Limitação de pico. Se a importação se aproximar do que o disjuntor geral ou a tarifa de demanda permitem, adie as cargas flexíveis em vez de desarmar um disjuntor ou pagar uma tarifa de pico.
- Alertas de carga de base. Uma carga de base noturna que de repente dobra costuma indicar um aparelho com defeito, uma bomba travada ou um aquecedor esquecido ligado.
Essas regras rodam bem no Node-RED, no Home Assistant ou em um subscriber Python curto, todos conectados ao broker como clientes normais e lendo o mesmo topic de telemetria.
Armadilhas a Evitar
- Calcular energia a partir de amostras de potência. Integrar potência amostrada acumula desvio com o tempo. Use os contadores de kWh do medidor para os totais diários.
- Misturar kW e W. O DSMR informa a potência em kW; converta uma única vez, na origem.
- Reter dados de alta frequência sem necessidade. Reter é útil para o valor mais recente, mas não há por que reter dados por segundo em topics separados.
- Diferença de relógio. Use o campo de timestamp do publicador (
ts) como horário da medição, para que atrasos na entrega não distorçam os gráficos. - Publicar às claras. O consumo segundo a segundo revela quando você está em casa ou fora. O servidor MQTT público é só para testes e protótipos, nunca para dados de produção.
Migrando para um Broker Privado
Para um monitor de energia residencial permanente, publique em um broker privado com TLS. Um broker MQTT gerenciado como o ConnectMQ significa nenhum broker para manter no Raspberry Pi e acesso remoto seguro pelo celular sem abrir portas no roteador. Crie um broker no portal ConnectMQ e depois altere as configurações do cliente e do Telegraf:
mq = mqtt.Client(mqtt.CallbackAPIVersion.VERSION2, client_id="YOUR_CLIENT_ID")
mq.username_pw_set("YOUR_USERNAME", "YOUR_PASSWORD")
mq.tls_set()
mq.connect("broker.connectmq.com", 8883, keepalive=60)
servers = ["ssl://broker.connectmq.com:8883"]
username = "YOUR_USERNAME"
password = "YOUR_PASSWORD"
Cada cliente (o leitor P1 e o Telegraf) precisa de suas próprias credenciais e client ID. Para comparar com a produção, adicione o monitoramento de inversor solar e, para o panorama mais amplo de automação com consciência energética, leia o guia de automação com IoT. Se você está decidindo onde hospedar o broker, o guia de broker MQTT na nuvem compara as opções.
Acompanhe a Energia da sua Casa ao Vivo no ConnectMQ
O ConnectMQ oferece aos seus leitores de medidor, ao Telegraf e aos dashboards um único broker seguro com TLS, acesso via WebSocket para dashboards no navegador e regras de alerta por limite, por exemplo quando a importação líquida ultrapassar a capacidade do disjuntor geral. Crie um broker Serverless gratuito em app.connectmq.com, sem cartão de crédito.
Perguntas frequentes
Meu medidor inteligente tem porta P1?
Os medidores da Holanda, da Bélgica e de Luxemburgo normalmente têm, e em alguns países a porta precisa ser ativada pelo operador da rede. Outras regiões usam interfaces diferentes para o consumidor ou nenhuma; nesse caso, sensores TC ou um leitor do LED de pulsos são as alternativas.
Com que frequência um monitor de energia residencial deve publicar via MQTT?
A cada 1 a 10 segundos é comum. Atualizações rápidas ajudam no controle do excedente solar, enquanto o histórico e os totais diários funcionam bem com taxas menores, porque vêm dos contadores de kWh.
Sensores TC conseguem detectar a exportação solar?
Somente se o dispositivo também medir a tensão para calcular a potência real e seu sinal. Sensores que medem apenas corrente mostram quanta corrente passa, mas não em qual direção.
O InfluxDB é obrigatório?
Não. Qualquer subscriber pode armazenar os dados, incluindo o recorder do Home Assistant, um fluxo do Node-RED gravando em um banco de dados ou um simples script Python gravando arquivos CSV.



