MQTT-брокер

Хаб может публиковать свои живые измерения в MQTT-брокер в вашей сети и принимать от него команды. Home Assistant использует то же соединение: хаб объявляет свои датчики через MQTT discovery.

MQTT выключен, пока вы не задали брокер. Хаб подключается к нему, только когда он в вашей домашней Wi-Fi-сети, а не когда работает лишь в собственной точке доступа.

Подключение хаба к брокеру

В приложении откройте Настройки → Home Assistant и заполните форму MQTT-брокер: адрес брокера, порт (обычно 1883), логин и пароль. Сохраните и перезагрузите хаб, когда приложение это попросит; настройки брокера применяются после перезагрузки.

Через API то же самое: POST /api/system/mqtt-config с {"broker_uri":"mqtt://user:password@host:1883"}. При чтении обратно пароль скрыт.

Используйте обычный адрес mqtt:// или mqtts:// для защищённого соединения:

  • начиная с v1.1.7, с сертификатом от публичного центра сертификации — из списка корневых сертификатов Mozilla, например Let's Encrypt или DigiCert — который совпадает с именем узла брокера;
  • начиная с v1.1.8, также с вашим собственным центром сертификации: домашний брокер с частным УЦ или самоподписанный сертификат, что покрывает Mosquitto внутри Home Assistant с собственным сертификатом. См. Собственный УЦ брокера ниже.

На v1.1.7 частный или самоподписанный сертификат вообще нельзя было использовать, и такой брокер требовал обычного адреса mqtt:// в сети, которой вы доверяете.

Собственный УЦ брокера

В Настройки → Home Assistant есть карточка Сертификат УЦ брокера (для mqtts). Пока ничего не загружено, она показывает «Не загружен: хаб доверяет только публичным удостоверяющим центрам.» Загрузить сертификат УЦ принимает PEM-файл вашего центра — тот, который начинается с -----BEGIN CERTIFICATE-----, — и хаб отвечает «Сертификат сохранён на хабе. Он начнёт действовать после перезагрузки.» Затем карточка показывает, что хранится: субъект, издатель и даты действия.

Хаб не принимает неподходящий файл и говорит, почему:

Что вы видите Что делать
«Это не сертификат PEM. Выберите файл, который начинается с «-----BEGIN CERTIFICATE-----».» экспортируйте УЦ в PEM, а не в DER или PKCS#12
«В файле есть закрытый ключ. Ключ загружать нельзя: выберите файл только с сертификатом УЦ.» загрузите только сертификат — ключ никогда не покидает ваш брокер
«Файл больше 8 КБ. Загрузите только сертификат УЦ.» лимит — 8 КБ; цепочка из нескольких сертификатов помещается, целый набор — нет
«не сертификат УЦ» файл — это серверный сертификат, а не центр, который его выпустил

⚠️ Удаление УЦ отрезает брокер, который от него зависит. Удалить сертификат УЦ брокера? предупреждает: «После перезагрузки хаб будет подключаться только к брокерам с публичным сертификатом. Брокер с этим УЦ перестанет подключаться.» После удаления: «Сертификат удалён. После перезагрузки хаб будет доверять только публичным удостоверяющим центрам.»

Загруженный УЦ заменяет публичный набор, а не дополняет его, и действует при следующей перезагрузке. Через API: POST /api/system/mqtt-ca с PEM, GET, чтобы увидеть, что хранится, DELETE, чтобы вернуться к публичному набору.

Почему защищённое соединение отклонено

Начиная с v1.1.8 хаб проверяет даты сертификата, а также его центр и имя узла, и сообщает, что нашёл. Карточка показывает одно из этих состояний:

Что говорит приложение Что это значит
«Защищённое соединение с брокером: сертификат проверен.» работает
«Подключение к брокеру по TLS…» в процессе или ожидание после того, как брокер разорвал соединение
«Срок сертификата брокера истёк. Обновите его на брокере.» срок действия прошёл
«Сертификат брокера ещё не действует. Проверьте время хаба или дату начала сертификата.» ещё не действует — и обычная причина здесь собственные часы хаба
«Сертификат выдан на другое имя хоста. Укажите адрес брокера, на который выдан сертификат.» адрес, который вы ввели, не тот, что в сертификате
«Хаб не знает удостоверяющий центр этого сертификата. Загрузите сертификат УЦ вашего брокера ниже.» частный УЦ, ещё не загружен
«Ждём часы: хаб проверит сертификат брокера, когда узнает время.» у хаба ещё нет времени, см. ниже
«Не удалось установить защищённое соединение с брокером. Проверьте порт (обычно 8883) и что брокер работает по TLS.» TLS вообще не запустился

⚠️ Хаб без часов не откроет TLS-соединение вовсе, и это намеренно. Не установленные часы делают каждый сертификат «ещё не действующим», поэтому начиная с v1.1.8 хаб ждёт, пока узнает время — по NTP или установленное вручную — прежде чем пробовать. Журнал событий пишет «mqtt: TLS broker — waiting for the clock». Обычный брокер mqtt:// не задерживается. → Время

Каждый отказ также пишет строку в журнал событий. Через API то же состояние находится в GET /api/system/mqtt-config → tls: {state, ca, ca_uploaded}, где state — это ok, expired, not_yet_valid, name_mismatch, unknown_ca, waiting_clock, connecting, tls_error или off для обычного соединения, а ca — это custom или bundle.

Если хаб не может проверить брокер, он продолжает повторять попытки, и ничто другое не останавливается: Настройки → MQTT показывает MQTT как не подключённый, а журнал событий хаба называет причину. → События

Держите брокер закрытым. Любой, кто может читать и писать в брокер, может читать настройки хаба через командный канал, а админ-токен, отправленный с командой, виден каждому клиенту, подписанному на неё. Используйте брокер со своими пользователями и правилами доступа (ACL) в собственной сети: дайте хабу собственного пользователя брокера и ограничьте доступ к rbgrid/<mac>/# хабом и доверенными клиентами. Никогда не используйте публичный брокер.

Темы

<mac> — это MAC-адрес Wi-Fi хаба: 12 шестнадцатеричных цифр в нижнем регистре, например a0b1c2d3e4f5. Хаб подключается с идентификатором клиента rbgrid-<mac>.

Тема Направление QoS Retained Что передаёт
rbgrid/<mac>/telemetry хаб → брокер 0 нет Живой кадр каждые 3 секунды (JSON, версия кадра 2).
rbgrid/<mac>/status хаб → брокер 1 да online, когда хаб подключается. offline — это последнее завещание хаба: брокер публикует его, когда хаб отключается (в течение примерно минуты). Плановая перезагрузка сначала публикует offline.
rbgrid/<mac>/cmd вы → хаб 1 — Команды в виде JSON (см. Команды).
rbgrid/<mac>/cmd/resp хаб → брокер 1 нет Ответ на каждую команду.
rbgrid/<mac>/node/<NODEMAC>/status хаб → брокер 1 да По одной на каждый удалённый узел: online, сигнал (дБм), потерянные пакеты (%) и последний сигнал, обновляется каждую минуту (см. Удалённые узлы).
rbgrid/<mac>/event хаб → брокер 0 нет События узлов: paired, removed, node_online, node_offline.
homeassistant/sensor/rbgrid_<mac>_<key>/<metric>/config хаб → брокер 0 да Home Assistant discovery, отправляется заново при каждом подключении.

Кадр телеметрии

Каждый кадр — это один JSON-объект. Основные поля:

Поле Значение
v Версия кадра (2).
ts, sntp, time_src, sync_age_s Метки времени и откуда взято время хаба.
seq, boot_id Счётчик кадров и идентификатор, который меняется при каждой загрузке (чтобы видеть перезапуски и пробелы).
freq Частота сети, Гц.
net_pwr, net_dir Чистая мощность на вводе, Вт, и её направление (импорт или экспорт).
system Итоги хаба: активная и реактивная мощность, энергия на входе и на выходе (за всё время и за сегодня), текущий тариф (zone, ставки покупки и продажи, валюта), итоги стоимости и стоимости экспорта. tariff.placeholder: true означает, что тариф ещё не задан.
units Одна запись на каждую точку измерения, по идентификатору: текущий i, активная мощность p_act, реактивная мощность p_rea, коэффициент мощности pf, направление, энергия на входе и на выходе (за всё время и за сегодня), а также от какого модуля и канала она пришла.
main_unit, vbus_unit Идентификаторы точки ввода и шины напряжения.

Значения энергии (e_in, e_out, e_day_in, e_day_out) — в Вт·ч; денежные значения (cost_*, rev_*) — в валюте тарифа. У модулей, которые считают энергию на борту ("energy_mode": "on_device"), итоги энергии растут раз в 15-минутный период; мощность, ток и напряжение обновляются каждые 3 секунды. Кадры отправляются, только пока хаб подключён. Если брокер недоступен, живые кадры отбрасываются (ничего не буферизуется и не воспроизводится повторно). История остаётся на хабе и может быть прочитана позже по HTTP или командой history.

Пример

Реальный кадр с тестового хаба, сокращённый до одной точки: кухонная линия, потребляющая около 400 Вт. По сети это одна компактная строка. Итог энергии всё ещё мал, потому что эта точка считает энергию на модуле, а 15-минутный период с нагрузкой ещё не закрылся.

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 здесь означает, что на тестовом хабе ещё стоял заводской примерный тариф.

Home Assistant discovery

При каждом подключении хаб публикует retained-сообщения discovery, поэтому Home Assistant создаёт устройства и датчики сам. Каждый датчик берёт значение из темы телеметрии, а доступность — из темы статуса (датчик становится недоступным примерно через 30 секунд после того, как хаб перестаёт отправлять данные).

  • Каждая точка измерения: ток (А), мощность (Вт), реактивная мощность (вар), коэффициент мощности, энергия на входе и на выходе (Вт·ч, за всё время и за сегодня).
  • Хаб: чистая мощность (Вт) и частота (Гц).
  • Шина напряжения: напряжение (В).

Датчики энергии (total_increasing, Вт·ч) попадают прямо на панель энергии; см. Интеграции.

Когда вы удаляете (или отвязываете) точку, хаб очищает её сообщения discovery, а Home Assistant удаляет её сущности. Это работает, только пока хаб подключён к брокеру. Если вы удаляете точку, когда MQTT выключен или брокер недоступен, её сущности остаются в Home Assistant как недоступные: удалите устройство вручную (Настройки → Устройства и службы → MQTT, устройство, Удалить).

Команды

Опубликуйте JSON-команду в rbgrid/<mac>/cmd с id по вашему выбору. Ответ приходит в rbgrid/<mac>/cmd/resp с тем же id. Несколько клиентов могут использовать общий cmd/resp, поэтому сопоставляйте ответы по id.

Чтение данных:

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

section может быть system, telemetry (настройки), telemetry_data (живой кадр), sensors, units, tariff, schema, summary (с unit, period = hour|day|week|month|year, необязательными from/to в формате Unix time) или economics (с unit).

Чтение истории:

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

type — это electrical, energy, economics, quality или direction; limit — до 720. Ответ — тот же JSON, что и у GET /api/v1/history.

Задать тариф:

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

token нужен, когда на хабе задан админ-токен. Помните, что он виден всем, кто подписан на cmd.

Успешный ответ — тот же JSON, что и у соответствующей HTTP-конечной точки. Ошибка выглядит так:

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

Определяйте хабы по <mac> в теме: device_id внутри ответов одинаков на каждом хабе.

Чтение данных без токена в адресе

Начиная с v1.1.7, чтение по MQTT требует токен чтения, когда на хабе заданы токены чтения и администратора, так же как чтение по HTTP: cmd get и history без него отклоняются. Для браузерного клиента, который не должен носить токен в адресе, POST /api/v1/ws-ticket возвращает билет одноразового использования, действующий 30 секунд. → Настройки → Безопасность

Решение проблем

В брокер ничего не приходит

  • Проверьте, что адрес брокера, порт, логин и пароль верны и что вы перезагрузили хаб после их сохранения.
  • Хаб должен быть в вашей домашней Wi-Fi-сети; в режиме только точки доступа MQTT не запускается.
  • Проверьте rbgrid/<mac>/status: online означает, что хаб подключён.

Home Assistant показывает датчики как недоступные

  • Хаб ничего не отправляет: проверьте тему статуса и соединение с брокером. Датчики вернутся, как только снова начнут приходить кадры.