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-минутный период с нагрузкой ещё не закрылся.
{
"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.
Чтение данных:
{"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).
Чтение истории:
{"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.
Задать тариф:
{"cmd": "set", "section": "tariff", "data": { "...": "the same body as the HTTP tariff call" }, "token": "<admin token>", "id": "t1"}
token нужен, когда на хабе задан админ-токен. Помните, что он виден всем, кто подписан на cmd.
Успешный ответ — тот же JSON, что и у соответствующей HTTP-конечной точки. Ошибка выглядит так:
{"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 показывает датчики как недоступные
- Хаб ничего не отправляет: проверьте тему статуса и соединение с брокером. Датчики вернутся, как только снова начнут приходить кадры.