Broker MQTT

O hub pode publicar as suas medições em tempo real num broker MQTT da sua rede e receber comandos dele. O Home Assistant usa a mesma ligação: o hub anuncia os seus sensores através da descoberta MQTT.

O MQTT está desativado até definir um broker. O hub liga-se a ele apenas quando está na sua rede Wi-Fi doméstica, e não quando funciona apenas como o seu próprio ponto de acesso.

Ligar o hub a um broker

Na aplicação, abra Settings → Home Assistant e preencha o formulário MQTT broker: o endereço do broker, a porta (normalmente 1883), o início de sessão e a palavra-passe. Guarde e reinicie o hub quando a aplicação o pedir; as definições do broker aplicam-se após um reinício.

Através da API: POST /api/system/mqtt-config com {"broker_uri":"mqtt://user:password@host:1883"}. Ao lê-lo, a palavra-passe aparece mascarada.

Use um endereço mqtt:// simples, ou mqtts:// para uma ligação segura:

  • a partir da v1.1.7, com um certificado de uma autoridade pública — uma que esteja na lista de raízes da Mozilla, como a Let's Encrypt ou a DigiCert — que corresponda ao nome de máquina do broker;
  • a partir da v1.1.8, também com a sua própria autoridade de certificação: um broker doméstico com uma CA privada, ou um certificado autoassinado, o que cobre o Mosquitto dentro do Home Assistant com o seu próprio certificado. Veja Your own broker CA abaixo.

Na v1.1.7 um certificado privado ou autoassinado não podia ser usado de todo, e um broker desses precisava de um endereço mqtt:// simples numa rede em que confie.

A sua própria CA do broker

Settings → Home Assistant tem um cartão Broker CA (for mqtts). Enquanto nada estiver carregado, mostra "None uploaded: the hub trusts public certificate authorities only." Upload CA certificate aceita o ficheiro PEM da sua autoridade — o ficheiro que começa por -----BEGIN CERTIFICATE----- — e o hub responde "Certificate saved on the hub. It is used after a restart." O cartão lista então o que contém: assunto, emissor e as datas de validade.

O hub recusa um ficheiro que não esteja correto, e diz qual é o problema:

What you get What to do
"This isn't a PEM certificate. Choose the file that starts with «-----BEGIN CERTIFICATE-----»." exporte a CA em PEM, não em DER ou PKCS#12
"The file holds a private key. Never upload a key: choose the file with the CA certificate only." carregue apenas o certificado — a chave nunca sai do seu broker
"The file is larger than 8 KB. Upload only the CA certificate." o limite é 8 KB; uma cadeia de alguns certificados cabe, um pacote completo não
"not a CA certificate" o ficheiro é um certificado de servidor, e não a autoridade que o assinou

⚠️ Remover a CA corta um broker que depende dela. Remove the broker CA? avisa que "After a restart the hub connects only to brokers with a public certificate. A broker that uses this CA stops connecting." Depois disso: "Certificate removed. After a restart the hub trusts public certificate authorities only."

A CA carregada substitui o pacote público em vez de o acrescentar, e aplica-se no reinício seguinte. Através da API: POST /api/system/mqtt-ca com o PEM, GET para ver o que está guardado, DELETE para voltar ao pacote público.

Porque foi recusada uma ligação segura

A partir da v1.1.8 o hub verifica as datas do certificado, além da sua autoridade e do nome de máquina, e indica o que encontrou. O cartão mostra uma destas mensagens:

What the app says What it means
"Secure connection to the broker: certificate verified." a funcionar
"Connecting to the broker over TLS…" em curso, ou em recuo depois de o broker ter cortado a ligação
"The broker's certificate has expired. Renew it on the broker." fora do prazo de validade
"The broker's certificate isn't valid yet. Check the hub's time, or the certificate's start date." ainda não é válido — e o relógio do próprio hub é o culpado mais comum
"The certificate is for another host name. Use the broker address the certificate was issued for." o endereço que escreveu não é o que está no certificado
"The hub doesn't know this certificate's authority. Upload your broker's CA below." uma CA privada, ainda não carregada
"Waiting for the clock: the hub checks the broker's certificate once it knows the time." o hub ainda não tem hora, ver abaixo
"The secure connection to the broker failed. Check the port (usually 8883) and that the broker speaks TLS." o TLS nem chegou a arrancar

⚠️ Um hub sem relógio não abre uma ligação TLS de todo, e isso é deliberado. Um relógio não definido faz com que todos os certificados pareçam "not valid yet", por isso a partir da v1.1.8 o hub espera até ter a hora — por NTP ou definida manualmente — antes de tentar. O registo de eventos diz "mqtt: TLS broker — waiting for the clock". Um broker mqtt:// simples não é adiado. → Time

Cada recusa escreve também uma linha no registo de eventos. Através da API, o mesmo estado está em GET /api/system/mqtt-config → tls: {state, ca, ca_uploaded}, em que state é ok, expired, not_yet_valid, name_mismatch, unknown_ca, waiting_clock, connecting, tls_error ou off para uma ligação simples, e ca é custom ou bundle.

Se o hub não conseguir verificar o broker, continua a tentar, e nada mais deixa de funcionar: Settings → MQTT mostra o MQTT como não ligado, e o registo de eventos do hub indica a razão. → Events

Mantenha o broker privado. Quem puder ler e escrever no broker pode ler as definições do hub através do canal de comandos, e um token de administrador enviado com um comando fica visível a todos os clientes subscritos. Use um broker com os seus próprios utilizadores e regras de acesso (ACL), na sua própria rede: dê ao hub um utilizador próprio no broker, e limite o acesso a rbgrid/<mac>/# ao hub e aos clientes em que confia. Nunca use um broker público.

Tópicos

<mac> é o endereço MAC Wi-Fi do hub: 12 dígitos hexadecimais em minúsculas, por exemplo a0b1c2d3e4f5. O hub liga-se com o id de cliente rbgrid-<mac>.

Topic Direction QoS Retained What it carries
rbgrid/<mac>/telemetry hub → broker 0 no Uma trama em tempo real a cada 3 segundos (JSON, versão de trama 2).
rbgrid/<mac>/status hub → broker 1 yes online quando o hub se liga. offline é o último aviso (last will) do hub: o broker publica-o quando o hub cai (em cerca de um minuto). Um reinício planeado publica offline primeiro.
rbgrid/<mac>/cmd you → hub 1 — Comandos, em JSON (ver Commands).
rbgrid/<mac>/cmd/resp hub → broker 1 no A resposta a cada comando.
rbgrid/<mac>/node/<NODEMAC>/status hub → broker 1 yes Um por nó remoto: online, sinal (dBm), pacotes perdidos (%) e última receção, atualizado a cada minuto (ver Remote nodes).
rbgrid/<mac>/event hub → broker 0 no Eventos de nós: paired, removed, node_online, node_offline.
homeassistant/sensor/rbgrid_<mac>_<key>/<metric>/config hub → broker 0 yes Descoberta do Home Assistant, reenviada a cada ligação.

A trama de telemetria

Cada trama é um objeto JSON. Os campos principais:

Field Meaning
v Versão da trama (2).
ts, sntp, time_src, sync_age_s Marcas de tempo e a origem da hora do hub.
seq, boot_id Contador de tramas e um id que muda a cada arranque (para detetar reinícios e falhas).
freq Frequência da rede, Hz.
net_pwr, net_dir Potência líquida na entrada, W, e o seu sentido (importação ou exportação).
system Totais do hub: potência ativa e reativa, energia entrada e saída (desde sempre e hoje), a tarifa atual (zone, taxa de compra e de venda, moeda), e os totais de custo e de valor de exportação. tariff.placeholder: true significa que ainda não foi definida nenhuma tarifa.
units Uma entrada por ponto de medição, por id: corrente i, potência ativa p_act, potência reativa p_rea, fator de potência pf, sentido, energia entrada e saída (desde sempre e hoje), e de que módulo e canal provém.
main_unit, vbus_unit Os ids do ponto de entrada e do barramento de tensão.

Os valores de energia (e_in, e_out, e_day_in, e_day_out) estão em Wh; os valores monetários (cost_*, rev_*) estão na moeda da tarifa. Nos módulos que contam a energia a bordo ("energy_mode": "on_device"), os totais de energia avançam uma vez por período de 15 minutos; a potência, a corrente e a tensão atualizam-se a cada 3 segundos. As tramas só são enviadas enquanto o hub estiver ligado. Se o broker estiver em baixo, as tramas em tempo real são descartadas (nada é guardado em memória intermédia nem reenviado). O histórico fica no hub e pode ser lido mais tarde por HTTP ou com o comando history.

Exemplo

Uma trama real de um hub de teste, encurtada a um ponto: uma linha de cozinha que consome cerca de 400 W. Na rede, é uma única linha compacta. O total de energia ainda é pequeno porque este ponto conta a energia no módulo, e o período de 15 minutos com a carga ainda não tinha fechado.

json
{
  "v": 2,
  "sntp": 1793756448,
  "tq": 1,
  "time_src": "sntp",
  "seq": 707,
  "boot_id": 1158837418,
  "freq": 50,
  "system": {
    "tariff": {
      "zone": "NIGHT",
      "buy_rate": 0.2,
      "sell_rate": 0.12,
      "buy_rate_all_in": 0.27104,
      "currency": "EUR",
      "placeholder": true
    },
    "units": 3,
    "present": 2
  },
  "units": {
    "0102": {
      "point": "kitchen",
      "v": 222.85,
      "i": 1.804,
      "p_act": 402.22,
      "p_rea": 0,
      "pf": 1,
      "dir": 1,
      "present": true,
      "module": 1,
      "ch": 0,
      "ch_label": "I0",
      "energy_mode": "on_device",
      "e_in": 0.0223,
      "e_day_in": 0.0223,
      "e_out": 0,
      "e_day_out": 0,
      "load_pct": 6,
      "type": "CURRENT_LOAD",
      "role": "DEVICE_LOAD"
    }
  },
  "main_unit": "0006",
  "vbus_unit": "0007"
}

"placeholder": true aqui significa que o hub de teste ainda tinha a tarifa de exemplo de fábrica.

Descoberta do Home Assistant

A cada ligação, o hub publica mensagens de descoberta retidas, para que o Home Assistant crie os dispositivos e sensores por si. Cada sensor lê o seu valor do tópico de telemetria e a sua disponibilidade do tópico de estado (um sensor fica unavailable cerca de 30 segundos depois de o hub deixar de enviar).

  • Cada ponto de medição: corrente (A), potência (W), potência reativa (var), fator de potência, energia entrada e saída (Wh, desde sempre e hoje).
  • O hub: potência líquida (W) e frequência (Hz).
  • O barramento de tensão: tensão (V).

Os sensores de energia (total_increasing, Wh) vão diretamente para o painel de Energia; veja Integrations.

Quando elimina (ou desassocia) um ponto, o hub limpa as suas mensagens de descoberta, e o Home Assistant remove as suas entidades. Isto só funciona enquanto o hub estiver ligado ao broker. Se eliminar um ponto com o MQTT desativado ou o broker em baixo, as suas entidades ficam no Home Assistant como unavailable: remova o dispositivo manualmente (Settings → Devices & services → MQTT, o dispositivo, Delete).

Comandos

Publique um comando JSON em rbgrid/<mac>/cmd, com um id à sua escolha. A resposta chega em rbgrid/<mac>/cmd/resp com o mesmo id. Vários clientes podem partilhar cmd/resp, por isso associe as respostas pelo id.

Ler dados:

json
{"cmd": "get", "section": "summary", "unit": "0x0100", "period": "day", "id": "q1"}

section pode ser system, telemetry (definições), telemetry_data (a trama em tempo real), sensors, units, tariff, schema, summary (com unit, period = hour|day|week|month|year, e from/to opcionais como tempo Unix) ou economics (com unit).

Ler o histórico:

json
{"cmd": "history", "unit": "0x0100", "period": "hour", "type": "energy", "offset": 0, "limit": 50, "id": "h1"}

type é electrical, energy, economics, quality ou direction; limit vai até 720. A resposta é o mesmo JSON de GET /api/v1/history.

Definir a tarifa:

json
{"cmd": "set", "section": "tariff", "data": { "...": "the same body as the HTTP tariff call" }, "token": "<admin token>", "id": "t1"}

O token é necessário assim que um token de administrador esteja definido no hub. Lembre-se de que fica visível a todos os subscritos de cmd.

Uma resposta bem-sucedida é o mesmo JSON do endpoint HTTP correspondente. Um erro tem este aspeto:

json
{"type": "cmd_ack", "data": {"cmd": "frobnicate", "result": "error", "message": "unknown cmd (use 'get' / 'set' / 'history')"}, "id": "q2"}

Identifique os hubs pelo <mac> no tópico: o device_id dentro das respostas é o mesmo em todos os hubs.

Ler dados sem token no URL

A partir da v1.1.7, as leituras MQTT exigem o token de leitura quando o hub tem tokens de leitura e de administrador definidos, tal como nas leituras HTTP: cmd get e history são recusados sem ele. Para um cliente de navegador que não deva levar um token no endereço, POST /api/v1/ws-ticket devolve um ticket de uso único válido durante 30 segundos. → Settings → Security

Resolução de problemas

Nada chega ao broker

  • Verifique se o endereço, a porta, o início de sessão e a palavra-passe do broker estão corretos, e se reiniciou o hub depois de os guardar.
  • O hub tem de estar na sua rede Wi-Fi doméstica; no modo apenas ponto de acesso o MQTT não arranca.
  • Verifique rbgrid/<mac>/status: online significa que o hub está ligado.

O Home Assistant mostra os sensores como unavailable

  • O hub não está a enviar: verifique o tópico de estado e a ligação ao broker. Os sensores voltam assim que as tramas recomeçarem a chegar.