Удалённые узлы (ESP-NOW)

Обзор

Удалённый узел — это небольшая плата ESP32 со своими модулями rbAmp. Он измеряет там, куда не дотягивается кабель I2C от хаба: гараж, насос бассейна, водонагреватель в подвале, подраспределительный щит в хозяйственной постройке. Свои показания он передаёт хабу по радио, по ESP-NOW. Узел не подключён к вашей Wi-Fi-сети и не имеет собственного адреса: он работает только со своим хабом. Его каналы становятся обычными точками на хабе, с текущими значениями, историей и стоимостью, как у любой другой точки.

Эта страница — полная документация по узлам: плата и модули, подключение, прошивка, сопряжение, как узел ведёт время и энергию, что показывает приложение, API хаба и темы MQTT, а также что делать, если что-то не так. Удалённым узлам нужна прошивка хаба v1.1.7 или новее и веб-приложение 1.1.7 или новее. На хабе со старой прошивкой раздела «Узлы» в приложении нет вовсе; сообщение «Удалённые узлы недоступны в этой прошивке хаба.» появляется только у хаба, образ прошивки которого не умеет работать с узлами.

Узел — это передатчик. У него нет дисплея, веб-страницы и истории, которую можно прочитать, и нет обновления по воздуху: прошивка заливается по USB. Начиная с прошивки 1.5 он хранит законченные 15-минутные периоды в собственной флеш-памяти, пока хаб их не получит; это очередь, а не запись, которую можно открыть. Остальное делает хаб.

Для любых работ внутри электрощита вызывайте квалифицированного электрика.

Что понадобится

Требование
Плата узла Оригинальный модуль ESP32 с флеш-памятью 4 МБ. PSRAM не нужна. На v1.1.7 прошивка узла собирается и тестируется только для оригинального ESP32: платы ESP32-S2, S3 и C3 не собираются и не тестируются.
Модули rbAmp на узле До трёх модулей на шине I2C узла, с адресами 0x50, 0x51 и 0x52 (настройка самого модуля); SDA — GPIO 25, SCL — GPIO 26. Хаб использует до четырёх каналов тока на узел.
Вход напряжения на узле На v1.1.7 узел записывает энергию, только если один из его модулей измеряет напряжение. Модуль только с током даёт текущий ток, но без 15-минутных периодов, а значит, без истории и стоимости. Установите однофазный комплект rbAmp с входом напряжения.
Фазы На v1.1.7 узел измеряет только однофазные точки. Группировки фаз на узле нет, и нет режима «использовать как вход трёхфазной сети»: это для модуля на хабе. STD-U3I3 на узле не тестировался.
Хаб Прошивка v1.1.7 или новее, подключённый к вашему Wi-Fi. Радио хаба для узлов работает на том же канале, что и ваш роутер; хаб без Wi-Fi узлы запускать не может. Один хаб принимает до шести узлов.
Слоты истории Точки узлов делят с точками самого хаба его существующие 12 слотов истории; к ним они не добавляются. Раздел «Узлы» показывает «История: занято из 12 точек» ещё до сопряжения.
Компьютер с USB Для прошивки узла и для каждого последующего обновления прошивки узла.
Токовые клещи Как для модуля на хабе; модель клещей задаётся для каждого канала на хабе (см. Настройки узла).

Подключение узла

Узел подключается как маленький хаб: его модули rbAmp стоят на шине I2C узла, а токовые клещи надеваются на модули.

  • I2C: четыре провода между платой ESP32 и модулями: SDA на GPIO 25, SCL на GPIO 26, GND и 3.3 В. Адреса модулей 0x50, 0x51, 0x52 задаются на самих модулях; узел при старте читает те, что присутствуют, до трёх. Шину подтягивают встроенные резисторы модулей; при до трёх модулях на коротких кабелях оставьте их как есть. Длина кабеля и подтяжки для других случаев описаны в руководстве по подключению rbAmp, так же как для модулей на хабе.
  • Вход напряжения: на v1.1.7 один модуль узла должен быть подключён входом напряжения к сети, которую он измеряет; без этого узел показывает текущий ток, но энергию не записывает (см. Что понадобится). Вход напряжения также даёт узлу направление каждого тока: потребление или отдачу.
  • Клещи: по одним на каждый токовый канал, на проводник, который вы хотите измерять; стрелка ориентирована так, как написано в документации модулей rbAmp. Модель клещей задаётся для каждого канала на хабе (см. Настройки узла); неверная модель неверно масштабирует показания.
  • Питание: обычное питание платы ESP32, например через USB-порт или 5 В на входе платы. У узла нет батареи и нет буфера питания: при отключении питания он останавливается, и энергия открытого периода теряется.
  • Место: там, где он будет работать. Для сопряжения узел не обязательно ставить рядом с хабом; связь проверяется на месте установки (см. Проверка связи). Где возможно, избегайте металлических корпусов между узлом и хабом.

Для любых работ внутри электрощита вызывайте квалифицированного электрика.

Прошивка узла

Прошивка узла публикуется вместе с каждым выпуском хаба на странице RBgrid Releases на GitHub: rbgrid-node_vX.Y.Z.bin (только приложение) и rbgrid-node_vX.Y.Z_full.zip (загрузчик, таблица разделов и приложение). Используйте версию, которая соответствует вашему хабу, или более новую.

Переведите плату в режим загрузки, установите esptool (pip install esptool) и запишите полный набор:

python -m esptool --chip esp32 -p <PORT> -b 460800 write_flash 0x1000 bootloader.bin 0x8000 partition-table.bin 0x10000 rbgrid-node_vX.Y.Z.bin

⚠️ Обновляя узел до прошивки 1.5, записывайте все три файла, а не только приложение. Версия 1.5 добавляет раздел флеш-памяти, в котором хранятся сохранённые периоды. Узел, которому дали только новое приложение, работает на 1.5, но ему некуда сохранять периоды, и он переходит на восемь периодов в памяти; карточка об этом не сообщает. Запись всех трёх файлов нужна и для любого последующего обновления: это ничего не стоит, а узел, сопряжённый на 1.4, не требует повторного сопряжения.

Сборка прошивки самостоятельно, а также выводы, которые нужно поменять, если ваша плата подключает I2C иначе, описаны в node/README.md репозитория RBgrid.

Узлу не нужен ключевой файл и не нужна настройка канала. Ключ он получает от хаба при сопряжении и сам находит канал хаба.

Сборка прошивки узла самостоятельно

Исходный код находится в папке node/ репозитория RBgrid и распространяется под той же лицензией, что и прошивка хаба. Сборка выполняется в ESP-IDF 5.5.1 (5.4.1 тоже собирается):

cd node
idf.py set-target esp32
idf.py build
idf.py -p <PORT> flash

Библиотека rbAmp загружается при сборке (dependencies.lock фиксирует её версию). Если ваша плата подключает I2C к другим выводам, соберите с -DRBN_I2C_SDA=<n> -DRBN_I2C_SCL=<n>. Ключевой файл не нужен. Варианты для разработки, присутствующие в исходниках (RBN_ROLE_MASTER, RBN_FREERUN, RBN_OUTPUT_NODE), не входят в выпуск и не поддерживаются.

Сопряжение узла

Узлами управляют на Управление → Точки, в разделе Удалённые узлы (ESP-NOW). В заголовке показано «n из 6 узлов» и состояние радио для узлов: «радио включено» или «радио выключено». На хабе, который умеет работать с узлами, раздел находится вверху страницы, над Модули rbAmp, а мастер настройки получает необязательный шаг Узлы ESP-NOW («Шаг 5 из 8», после Датчиков и перед Тарифом).

  1. Установите узел там, где он будет работать, с модулями и клещами, но не включайте питание.
  2. В приложении выберите Время сопряжения (в минутах) и нажмите Сопрячь узел. Раздел пишет: «Включите питание узла сейчас. Через несколько секунд он появится ниже.» и ведёт обратный отсчёт: «Ждём узел… осталось время». Прервать сопряжение закрывает окно раньше срока.
  3. Включите узел (или перезагрузите его). Он ищет хаб по каналам Wi-Fi, обменивается с ним ключами и появляется в списке с отметкой новый. Его точки добавляются сразу: «Сопряжено за это окно: n. Их точки уже добавлены, перезагрузка не нужна.»

Раздел «Удалённые узлы» с открытым окном сопряжения: «Ждём узел… осталось 1:56» и «Прервать сопряжение» над двумя карточками узлов

⚠️ Пока окно сопряжения открыто, любой узел RBgrid в зоне действия, который об этом попросит, будет сопряжён. PIN-кода нет. Сюда входит и узел, принадлежащий кому-то другому, чей собственный хаб перестал отвечать: сопряжённый узел, который не получает ответа около 150 секунд, сам начинает просить о сопряжении. Открывайте окно, только когда собираетесь включить узел, держите его открытым недолго и закройте кнопкой Прервать сопряжение, как только ваш узел появится в списке; затем проверьте, что в списке только ожидаемые узлы.

Ключи хранятся и на узле, и на хабе. После перезагрузки или после выключения радио узел переподключается сам; сопрягаете вы его один раз.

Перед сопряжением проверьте две строки ёмкости в разделе: «n из 6 узлов» (когда хаб заполнен, кнопка заменяется текстом «Хаб принимает до 6 узлов. Чтобы сопрячь новый, удалите один из них.») и «История: занято n из 12 точек. Точки сверх 12 показывают только текущие значения.» (или «История: заняты все 12 точек. Точки нового узла будут показывать только текущие значения.»). Если радио выключено, раздел пишет «Чтобы сопрячь узел, включите радио для узлов.»

Каждый узел добавляет до четырёх точек. Они называются по имени узла и его каналам; переименуйте их и задайте им роли на собственных страницах, как любой другой точке (см. Точки). Точки узла нельзя привязать или отвязать вручную: канал, выключенный в настройках узла, перестаёт измерять, а удаление узла удаляет его точки.

Карточка узла

Раздел «Удалённые узлы»: радио на канале 6, кнопка сопряжения и две карточки узлов — один на связи с сигналом, синхронизацией часов и двумя принимаемыми каналами, второй без связи 90 минут

Каждый сопряжённый узел имеет карточку в разделе.

На карточке Что это значит
на связи / нет связи Хаб слышал узел за последние 15 секунд или нет. Узел, который выключен (см. ниже), показывает выключен.
новый Сопряжён в текущем окне сопряжения.
Последний сигнал «сейчас», «n с назад», «n мин назад», «n ч назад» или «нет сигнала с запуска хаба».
Сигнал Уровень последнего кадра узла в дБм, как его увидело радио хаба.
Потерянные пакеты за минуту Доля маячков времени хаба, которые узел пропустил за последнюю минуту, в процентах. Показывает «считается (1 мин)», пока не пройдёт полная минута.
Синхронизация часов Насколько точно часы узла следуют за часами хаба: «±n мкс · n ppm».
Прошивка Версия прошивки узла, когда узел её сообщит.
Период «15 мин». Период фиксирован; это написано и в окне настроек: «Записи энергии: каждые 15 мин, фиксировано.»
Ждут отправки Здесь хаб показывает количество законченных 15-минутных периодов, которые узел держит, потому что хаб был недоступен (см. Как узел ведёт время и энергию). Прошивка хаба v1.1.7 это не сообщает, поэтому строки там нет.
Канал n Каждый токовый канал узла: точка, которую он питает (её имя, ссылка на страницу точки; «Точка key», пока у точки нет имени), и её состояние: «данные идут», «нет данных» или «выключен (Настройки)».
настройки ещё не применены / настройки не применены Настройки отправлены узлу, и он их ещё не подтвердил, или отказался их принять.
Сигнал, потерянные пакеты и синхронизация часов отсутствуют У узла, о котором не слышали с момента запуска хаба, их нет: карточка не показывает эти три строки, а «Последний сигнал» читается «нет сигнала с запуска хаба». Они появятся вместе с первым кадром узла.

На карточке три кнопки: Настройки, Выключить / Включить и Удалить.

Карточка одного узла целиком: MAC и значок «на связи», Последний сигнал, Потерянные пакеты за последнюю минуту, Синхронизация часов, Сигнал, Прошивка 1.5 и 15-минутный период, с двумя каналами узла, привязанными к именованным точкам

Настройки узла

Настройки открывает окно «Узел mac: настройки». Для каждого канала показаны Канал n измеряет (вкл. или выкл.) и Токовые клещи — модель клещей, установленных на этом канале. «Выберите клещи, которые реально стоят на канале: с неверными показания будут в неверном масштабе. Выключенный канал перестаёт измерять.» Хотя бы один канал должен остаться включённым.

Отправить узлу передаёт настройки через хаб: «Отправлено. Узел применит настройки при следующей связи; пока он не подтвердит, на карточке показано «настройки ещё не применены».» Если узел не на связи, хаб сохраняет настройки и передаёт их, когда узел вернётся («Узел не на связи. Он примет настройки, когда вернётся.»).

Энергетический период узла фиксирован: 15 минут («Записи энергии: каждые 15 мин, фиксировано.»); изменить его нельзя.

Выключение и включение узла

Выключить оставляет узел сопряжённым, но заставляет хаб отбрасывать его данные. Приложение спрашивает подтверждение: «Пока узел выключен, хаб отбрасывает его данные: этой энергии не будет в «Истории» и итогах, а после включения она не вернётся. Чтобы приостановить узел и сохранить его энергию, оставьте его включённым.» Пока узел выключен, на карточке стоит выключен, а его точки не показывают текущих значений. Включить возобновляет работу.

Используйте это, когда узел измеряет то, что вы временно не хотите учитывать. Чтобы остановить узел насовсем, удалите его.

Радио для узлов

Строка Радио для узлов в заголовке раздела показывает одно из трёх состояний:

  • «Включено, канал n: тот же, что у вашего Wi-Fi роутера.» Радио хаба для узлов работает. Оно использует канал Wi-Fi хаба, который выбирает ваш роутер; если роутер переходит на другой канал, хаб и его узлы следуют за ним.
  • «Включится само, когда будет сопряжён узел (заводская настройка).» Ничего ещё не работает; радио запускается с первым сопряжением или когда узел уже сопряжён.
  • «Выключено. Узлы не могут передавать данные.» Вы его выключили.

Выключение спрашивает подтверждение: «Узлы перестанут передавать текущие показания. Записи энергии за 15-минутные периоды они сохранят и отправят, когда радио снова включится (до 2 часов на прошивке узла 1.4, около 5 дней на 1.5). Хаб помнит это и после перезагрузки.» Все узлы сразу переходят в состояние «нет связи». Текущие показания за это время не сохраняются; записи сохраняются, пока прошивка узла может их удерживать.

Удаление узла

Удалить спрашивает «Удалить узел mac?»: «Узел и его точки (каналов: n) удалятся вместе с сохранённой историей, насовсем. Если нужна история, сначала скачайте её в «Истории» (CSV). Чтобы снова использовать узел, сопрягите его заново.»

⚠️ Удаление узла удаляет его точки и всю их сохранённую историю. Если записи могут понадобиться, сначала скачайте их в Истории.

Хаб сразу перестаёт принимать данные узла и подтверждает: «Узел удалён, точек вместе с ним: n.» Чтобы снова использовать узел, сопрягите его заново: откройте окно сопряжения и перезагрузите узел (или подождите около 2½ минут: узел, который не получает ответа от своего хаба 150 секунд, сам начинает просить о сопряжении).

Перенос узла на другой хаб

Сопряжённый узел продолжает просить свой хаб; если он не получает ответа 150 секунд, он помечает себя несопряжённым и снова просит о сопряжении, а после сброса просит сразу. Поэтому перенос узла на другой хаб или ввод в работу бывшего в употреблении узла — это сопряжение:

  1. Удалите его на старом хабе (если он у вас есть).
  2. Откройте окно сопряжения на новом хабе и перезагрузите узел (или подождите около 2½ минут). Узел получит ключ нового хаба.

Очистка флеш-памяти узла (python -m esptool --chip esp32 -p <PORT> erase_flash, затем повторная прошивка) необязательна: это чистый старт, а не требование.

Как узел ведёт время и энергию

  • Часы. Часы задаёт хаб. Узел запрашивает время каждые 5 секунд, пока его не получит, затем каждую минуту, а между запросами ведёт собственный отсчёт. На карточке Синхронизация часов показано, насколько точно он следует за хабом.
  • Текущие показания отправляются около раз в секунду и показываются на точках узла. Они не сохраняются.
  • Энергия записывается 15-минутными периодами, которые узел закрывает по своим часам на границах 15-минутных интервалов хаба, используя энергию из собственных счётчиков модулей. Когда меняется ваша тарифная зона, хаб просит каждый узел закрыть период именно в этот момент, поэтому стоимость по зонам точная.
  • Период доходит до хаба или сохраняется. Узел отправляет законченный период, пока хаб не подтвердит, что записал его, поэтому записи лучше переживают слабую связь, чем текущие показания. Хаб узнаёт период, который у него уже есть, и никогда не считает его дважды.
  • Вне зоны действия. Узел продолжает закрывать периоды вовремя и держит законченные, пока хаб их не подтвердит. Когда связь восстанавливается, они приходят все вместе и раскладываются и оцениваются по времени измерения, а не по времени прихода. Сколько он может держать, определяет прошивка узла, а не хаб:
    • Прошивка узла 1.5 записывает их во флеш-память узла: около пяти дней периодов, и они переживают отключение питания узла.
  • Прошивка узла 1.4 держит восемь периодов (около двух часов) в оперативной памяти; девятый вытесняет самый старый, а отключение питания узла теряет удержанные периоды и открытый.

В любом случае, когда удержание заполнено, самый старый период пропадает, и узел сообщает об этом в своём журнале.

  • Узел, который включился без хаба, не закрывает периодов, пока хотя бы раз не услышит хаб. Энергия при этом не теряется: на v1.1.7 первая запись после запуска покрывает всё от загрузки узла до конца его первого полного 15-минутного периода, поэтому этот период может выглядеть выше реальной нагрузки.

В прошивке нет проходного порога для сигнала или потерянных пакетов, и эта страница его не даёт: узел либо надёжно работает на своём месте, либо нет. Честная проверка — поведенческая:

  1. Сопрягите узел там, где он будет работать, с реально работающей нагрузкой.
  2. Наблюдайте за карточкой около десяти минут: узел должен оставаться на связи, Потерянные пакеты за минуту должны оставаться на 0, а Последний сигнал — на «сейчас» или нескольких секундах.
  3. Если потерянные пакеты поднимаются выше нуля или узел переключается между «на связи» и «нет связи», связь на грани. Немного передвиньте узел или хаб и снова наблюдайте.

В прошивке есть два порога, и больше ничего нет: узел считается не на связи после 15 секунд без кадра (хаб публикует node_offline и node_online в MQTT), а узел, который не слышит маячок 8 секунд, снова начинает искать канал хаба (так он следует за роутером, сменившим канал; перезапуск не нужен).

Слабая связь проявляется как потерянные пакеты выше 0 и пробелы в текущих показаниях, при этом записи продолжают поступать; более сильная заставляет узел «мигать». Узел вне зоны действия и узел без питания выглядят для приложения и API одинаково. Отличить их может только история карточки до обрыва: слабая связь сначала сползает (растут потери, падает сигнал, узел мигает), а отключение питания — резкое.

Как узнать позже, что узел замолчал

Пятидневное удержание помогает только тогда, когда вы заметили проблему в течение пяти дней.

Начиная с прошивки v1.2.0 хаб это записывает. Отключение узла и его возвращение появляются строками в журнале хаба — espnow: node <MAC> offline и … online — поэтому узел, который замолчал, пока вас не было, оставляет след, который можно найти позже, с временем. → События

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

На обеих прошивках приложение не поднимает тревогу: журнал — это запись для просмотра, а не уведомление, которое до вас дойдёт. Для этого используйте Home Assistant.

С Home Assistant у вас есть полноценная тревога, и она стоит одной автоматизации. Хаб публикует через MQTT discovery сущность подключения На связи для каждого узла, как подустройство хаба, и она следует за сохранённым статусом узла. Настройте автоматизацию на выключение этой сущности, и вы узнаете об этом в течение минуты. Тот же переход публикуется как событие node_offline в теме событий хаба, если вы предпочитаете следить за событиями.

Без MQTT есть только карточка. Время от времени открывайте раздел «Узлы» или поглядывайте на точки узла в «Истории», где молчащий узел оставляет растущий пробел.

Что именно представляет собой переход, чтобы вы могли выбрать терпение автоматизации:

  • переход срабатывает после 15 секунд без кадра — тот же порог, что и на карточке; узел отправляет около одного кадра в секунду;
  • антидребезга нет: каждый промежуток длиннее 15 с даёт одну пару «не на связи / на связи», а промежутки короче не дают ничего. Пограничная связь даёт несколько пар, а не сотни;
  • тема статуса обновляется раз в минуту с сигналом и потерями как состояние, а не как событие, поэтому дашборд, который её читает, отстаёт не больше чем на минуту.

Итоги и «неучтённый» остаток

Итог по дому не может быть посчитан дважды: системные итоги берутся на границе сети, только по точке ввода. Точки нагрузок, на хабе или на узле, в них не добавляются.

Неучтённый остаток на Обзоре может считаться дважды. Это ввод минус сумма всех линейных точек, а точки узлов — линейные точки. Если вы измеряете подраспределительный щит на узле и нагрузку внутри этого щита на другом канале, эта нагрузка вычитается дважды, и остаток может стать отрицательным.

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

Настройка находится в Управление → Точки → точка → Настройка точки → Параметры точки → Внутри точки, где по умолчанию стоит Нет: отдельная линия. В списке нет ввода, шины напряжения, самой точки и того, что уже внутри неё; если хаб отказывается от выбора, появляется сообщение «Хаб отказал в этом выборе: точка удалена, является вводом или уже находится внутри этой. Выберите другую.» → Точки

⚠️ Это работает на один уровень. B внутри A учитывается один раз. Если цепочка глубже — C внутри B внутри A — и средняя точка не показана, некоторые виды могут по-прежнему учитывать самую внутреннюю точку дважды.

На v1.1.7 такой настройки не было, и рекомендация была измерять либо подраспределительный щит, либо нагрузки внутри него, но не то и другое. Итог по дому от этого не меняется: системные итоги берутся на вводе.

Где узлы появляются в других местах

  • Точки: каналы узла — обычные точки, со своими страницами, ролями и именами (см. Точки).
  • История и Экономика: по точкам, как для любой точки; точки узлов делят 12 слотов истории (см. История).
  • События: в журнале хаба записываются сопряжение узла, подтверждённые им настройки и строки FAIL для кадров или записей, которые хаб не смог учесть. Отключение узла или его возвращение не попадает в журнал — они публикуются через MQTT и показываются на карточке узла (см. События).
  • MQTT: хаб публикует сохранённый статус для каждого узла в rbgrid/<mac>/node/<NODEMAC>/status (online, сигнал, потерянные пакеты, последний сигнал), обновляя его каждую минуту, а события узла — в rbgrid/<mac>/event; те же действия с узлом доступны через командный канал (см. Брокер MQTT).
  • Home Assistant: одно устройство на каждый узел, с датчиком На связи и датчиком Сигнал (дБм), через discovery. Точки узла появляются так же, как локальные.
  • API хаба: GET /api/v1/espnow показывает состояние радио и каждый узел с его состоянием; POST /api/v1/espnow выполняет те же действия, что и приложение (см. ниже).

API хаба

Всё, что приложение делает с узлами, идёт через одну конечную точку хаба, которой можно пользоваться и самому.

GET /api/v1/espnow (токен чтения, как для других чтений) возвращает радио и реестр:

Поле Значение
running, enabled радио работает; enabled — это auto (запускается само, когда сопряжён узел), on или off
keys, key_source true в каждом образе хаба от v1.1.7, и откуда взят ключ хаба (generated: создан этим хабом при первом запуске радио). Хаб без keys не может работать с узлами
max_nodes, max_channels_per_node 6 и 4
channel канал радио, канал Wi-Fi роутера
pairing_open, pairing_left_s, paired_count окно сопряжения, секунды, оставшиеся в нём, число сопряжённых узлов
beacons_sent, rt_recv, stats_recv, periods_recv, periods_injected, periods_dropped, periods_dup счётчики с момента запуска хаба: отправлено маячков времени, принято кадров текущих показаний и кадров периодов, записано периодов, отброшено и распознано как повторы
nodes[] для каждого узла: mac, online, disabled, last_seen_s, rssi_dbm, sync{ resid_sd_us, skew_ppm, fits, loss_pct }, channels[{ ch, ct_code, unit_id, present }], config_state (none, pending, applied, failed), config[], period_s, fw. У узла, о котором не слышали с момента запуска хаба, нет last_seen_s и sync{}

POST /api/v1/espnow (токен администратора) с { "action": … }:

action Поля Что делает
hub_on / hub_off — включить или выключить радио для узлов (сохраняется после перезагрузок); при выключении все узлы сразу переходят в «нет связи»
pair seconds 10–600 открыть окно сопряжения; 409 ESPNOW_DISABLED, пока радио выключено
pair_cancel — закрыть его раньше срока
configure mac, config: { channels: [ { ch, enabled, ct_code } ] } настройки узла; хаб переотправляет их, пока узел не подтвердит. 400 PERIOD_UNSUPPORTED для любого period_s, кроме 900; 400 BAD_REQUEST для неизвестного канала, ct_code вне 1–7 или если все каналы выключены
disable / enable mac выключить или включить узел
remove mac удалить узел и его точки вместе с историей
latch — попросить каждый узел закрыть текущий период сейчас
add mac, channels: [ { ch, ct_code } ] зарегистрировать узел вручную, без сопряжения

Ошибки возвращаются как { "ok": false, "error": "BAD_REQUEST" | "ESPNOW_DISABLED" | "ESPNOW_OFF" | "ESPNOW_START_FAILED" | "REGISTRY", "message": "…" }. Точки узлов — обычные точки во всех остальных конечных точках (src: "espnow" в кадре текущих показаний), а GET /api/system/provisioning сообщает nodes_paired.

По MQTT то же работает в командном канале: {"cmd":"get","section":"espnow"} возвращает описанный выше GET, а {"cmd":"set","section":"espnow","token":"<admin>","data":{"action":"pair","seconds":60}} выполняет действие и отвечает ответом хаба. Хаб публикует сохранённый статус для каждого узла в rbgrid/<mac>/node/<NODEMAC>/status ({ "online", "rssi_dbm", "loss_pct", "last_seen_s" }, обновляется каждую минуту) и события узла в rbgrid/<mac>/event (paired, removed, node_online, node_offline). В Home Assistant каждый узел — это устройство с датчиками На связи и Сигнал (дБм); о узле, о котором не слышали с момента запуска хаба, сообщается «нет данных».

Сообщения

Сообщение Что это значит
Удалённые узлы недоступны в этой прошивке хаба. Образ прошивки этого хаба не умеет работать с узлами. (Хаб старше v1.1.7 не показывает раздел «Узлы» вовсе.)
Чтобы сопрячь узел, включите радио для узлов. Радио выключено; сначала включите его.
Хаб принимает до 6 узлов. Чтобы сопрячь новый, удалите один из них. Заняты все шесть слотов узлов.
Радио для узлов выключено. Сначала включите его. Действию нужно радио, а оно выключено.
Хаб не смог включить радио для узлов. Попробуйте ещё раз; если не выходит, перезагрузите хаб. Радио не запустилось.
Хаб не смог изменить список узлов (он полон или узел ему неизвестен). Реестр узлов отклонил изменение.
Хаб не принял запрос. Хаб ответил, что запрос сформирован неверно. Обновите страницу и попробуйте снова.
Хаб отказал: message Собственная причина хаба.
Хаб не ответил. Проверьте связь и попробуйте ещё раз. Ответа от хаба нет.
Хаб больше не знает этот узел. Обновите страницу. Узел был удалён, возможно, из другого браузера.
Хаб принимает только 15-минутный период. Для узла принимается только 15-минутный период.

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

Я нажал «Сопрячь узел», но ничего не появляется

  • Включите узел или перезагрузите его, пока окно открыто.
  • Проверьте, что радио для узлов не выключено и что хаб подключён к вашему Wi-Fi.
  • Узел, сопряжённый с другим хабом, снова просит о сопряжении, когда тот не отвечает ему 150 секунд, или сразу после сброса (см. Перенос узла на другой хаб).
  • Проверьте питание узла и то, что его прошивка записалась без ошибок.

Узел не на связи или постоянно переходит между «на связи» и «нет связи»

  • От него ничего не слышно 15 секунд. Сначала проверьте питание, затем место установки. См. Проверка связи.
  • Радио хаба для узлов может быть выключено: тогда все узлы не на связи.

Сигнал, потерянные пакеты и синхронизация часов отсутствуют на карточке

  • О узле не слышали с момента запуска хаба («Последний сигнал: нет сигнала с запуска хаба»). Строки появятся вместе с его первым кадром.

У точек узла есть текущие значения, но нет истории

  • 12 слотов истории хаба уже были заняты, когда узел сопрягали: «Точки сверх 12 показывают только текущие значения.» Удалите ненужную точку и сопрягите узел заново или смиритесь с точками только для текущих значений.
  • Узел записывает энергию только с модулем, который измеряет напряжение. Модуль только с током даёт текущий ток и оценочную текущую мощность (ваше номинальное напряжение × ток, 230 В, если оно не задано), но без периодов, истории и стоимости. Начиная с v1.1.8 хаб вообще не учитывает энергию для такого входа, вместо того чтобы выводить её из номинального напряжения.

Все узлы показывают «нет связи», хотя они включены и сопряжены

  • GET /api/v1/espnow → inject_age_ms со значением -1 означает, что задача хаба, которая учитывает данные узлов, не работает. До v1.1.7 хаб мог тихо не запустить её, если при загрузке не хватало внутренней памяти, и ничего об этом не сообщалось; v1.1.8 резервирует эту память при сборке. Обновите хаб.

Начиная с v1.2.0 искать не нужно: раздел «Удалённые узлы» показывает предупреждение, когда задача остановилась, и рядом кнопку Перезагрузить сейчас.

Раздел «Удалённые узлы» с предупреждением, что хаб не учитывает данные узлов, и кнопкой «Перезагрузить сейчас»

Перезагрузка снимает состояние на хабе, в котором есть память; если оно возвращается после перезагрузки, хаб работает на прошивке старше v1.1.8, и решение — обновить его, а не перезагружать снова.

Синхронизация часов постоянно теряется

  • Другой хаб RBgrid работает на том же канале Wi-Fi, и узел на прошивке 1.4 принял маячки времени от обоих хабов. Обновите узел до 1.5: тогда он следует только за хабом, с которым сопряжён, и повторного сопряжения не требуется.

Энергия отсутствует какое-то время

  • Узел был вне зоны действия дольше, чем может держать периоды, или потерял питание. На прошивке узла 1.5 это около пяти дней, и отключение питания не теряет удержанного; на 1.4 это восемь периодов, около двух часов, и отключение питания теряет их вместе с открытым периодом.
  • Узел был выключен (Выключить) в это время: хаб отбрасывает данные выключенного узла.
  • Узел загрузился, когда хаб был недоступен: на v1.1.7 энергия с его загрузки попадает в первый полный 15-минутный период, поэтому более ранний период выглядит пустым, а этот — завышенным. Ничего не потеряно.

Мой роутер сменил канал Wi-Fi

  • Ничего делать не нужно. Радио хаба для узлов следует за роутером, а узел, который ничего не слышит 8 секунд, снова ищет хаб.