Перейти к содержимому

Инженерные статьи · EnviroHub

От ESP32 до Алисы: строим промышленную телеметрию без дырок в локальной сети

Ярослав Власов · 25 августа 2026

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

Поскольку большую часть работ за меня в этом проекте делал GPT (а я только паял проводки, куда он скажет, и решал стратегические задачи выбора датчиков, оформления интерфейсов и концепции проекта), то передаю слово ему как автору и основному разработчику системы.

Живая операторская консоль EnviroHub с семью физическими каналами измерений
Живая операторская консоль EnviroHub. На экране — реальные данные семи физических каналов, состояние тракта и суточная история.

Посмотреть систему в работе: живая операторская консоль EnviroHub. Контекст проекта и дополнительные материалы: страница EnviroHub.

Ладно, микрофон у меня. И сразу спойлер: можно было подключить несколько датчиков к ESP32, раз в минуту отправлять цифры на сервер и торжественно назвать это IoT. Работало бы ровно до первого пропавшего Wi-Fi, зависшего процесса и вопроса: «Пацаны, а данные где?»

Поэтому EnviroHub мы строили не как ещё один красивый термометр, а как небольшую телеметрическую платформу. Сейчас она следит за воздухом в квартире, однако сам тракт можно адаптировать для офиса, склада, теплицы, мастерской, инженерного оборудования или сети удалённых объектов. Меняются датчики и прикладная логика — принципы доставки, хранения и диагностики остаются.

Важная оговорка: «промышленная» здесь относится к дисциплине работы с данными и отказами, а не к исполнению корпуса. EnviroHub не заявляется как industrial-grade, сертифицированный прибор или газоанализатор безопасности.

Зачем было так усложнять

У простой схемы «ESP → облачный API» есть неприятный характер: нет интернета — нет истории, сервер недоступен — непонятно, что уже доставлено, а устройство в локальной сети приходится либо выставлять наружу, либо обвешивать костылями.

Мы хотели получить ответы на скучные, но важные вопросы: где лежат данные, кто подтвердил их запись, что произойдёт после перезагрузки и как понять, какой именно участок тракта отвалился. Без театра с Kubernetes на Raspberry Pi: сложность должна решать конкретную задачу, а не украшать схему.

Рабочая цепочка выглядит так:

Датчики → ESP32-S3 → MQTT 5/TLS → EnviroHub Edge Gateway
         → исходящий HTTPS Public Bridge → сайт → умный дом → Алиса
Архитектура EnviroHub от ESP32-S3 и локального MQTT до сайта и Алисы
Локальный MQTT-контур заканчивается на EnviroHub Edge Gateway. Наружу уходят только разрешённые данные, а входящие соединения из интернета в домашнюю сеть не требуются.

Raspberry Pi здесь — аппаратная платформа первого EnviroHub Edge Gateway, а не «коробочка для сайта». На ней изолированно работают Mosquitto, коллектор, SQLite-хранилище и постоянные очереди синхронизации. MQTT остаётся внутри LAN. Никаких входящих портов домой, статического внешнего IP и проброса роутера: шлюз сам отправляет наружу только санитизированную публичную проекцию.

Семь физических каналов — без нарисованных цифр

Измерительный узел собран на ESP32-S3. Он получает CO₂ с SCD41, температуру и влажность внутри и снаружи с двух SHT45, давление с BMP390 и резервного BMP58x, а также кислород с отдельного аналогового тракта на Alphasense O2-A2, OPA333 и ADS1220. В публичном интерфейсе это семь понятных каналов. Служебная диагностика живёт отдельно и не подменяет физические измерения.

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

Физический прототип EnviroHub на ESP32-S3 с датчиками, кислородным трактом и microSD, собранный на проводах
Физический измерительный узел EnviroHub в его текущем виде: ESP32-S3, климатические датчики, кислородный тракт и microSD. Провода и картонная перегородка здесь не маскируются — надёжность этой версии находится в тракте данных, а не в механическом исполнении.

Один пакет данных и пять уровней спокойствия

  1. ESP сначала пишет пакет на microSD. Точный NDJSON нужен для автоматического повтора, читаемый CSV — для ручного разбора. Сначала append + fsync, потом отправка: это write-before-send.
  2. Пакет уходит по MQTT 5 поверх TLS. Устройство имеет отдельные учётные данные, права ограничены ACL, а Last Will сообщает о внезапном разрыве сессии.
  3. Edge Gateway валидирует и сохраняет данные. Формат, время, качество и последовательность проверяются до одной атомарной транзакции в SQLite/WAL.
  4. Только после фиксации отправляется application ACK. MQTT PUBACK подтверждает доставку брокеру, но не доказывает, что прикладная запись уже переживёт перезапуск коллектора.
  5. После ACK устройство двигает постоянный курсор. При штатной потере связи очередь остаётся на карте, а затем проигрывается от старых записей к новым. Повторная доставка не должна создавать дубли благодаря идентификатору записи и идемпотентной обработке.

Та же логика продолжается после Edge Gateway. Пакеты ждут в постоянном outbox, сайт возвращает точное подтверждение фиксации HTTPS-пакета, и только после этого запись удаляется из очереди. Redirect не принимается за успех, таймауты ограничены, повторная отправка использует стабильный ключ идемпотентности.

Уровень Что хранится Зачем
microSD на ESP32-S3 NDJSON-очередь и дневной CSV Store-and-forward при потере MQTT или Edge Gateway
Edge Gateway Подробная рабочая история в SQLite/WAL Локальная обработка, диагностика, настройки и исходящая очередь
Сайт Отдельная разрешённая публичная проекция Долговременные графики без доступа к домашней сети и приватным данным

Это не только схема на картинке. При контролируемом отключении брокера ESP накопила три записи и после восстановления доставила их по порядку. Отдельный reset подтвердил, что неподтверждённая запись переживает перезапуск устройства.

Интерфейс, который не врёт

Главный экран специально похож не на лендинг с одной огромной цифрой, а на компактную операторскую консоль. Он показывает текущие значения, свежесть данных, объём microSD и Edge-базы, последнее событие доступности и первый проблемный участок цепочки: ESP, MQTT или Edge/связь.

«Датчик вернул ошибку», «данные устарели» и «станция ушла из сети» — три разные ситуации. Если показывать их одним грустным прочерком, оператор получает не интерфейс, а квест. Поэтому текущие карточки берутся из свежего live-state, а архивные графики — из отдельного временного ряда.

Для быстрого взгляда есть компактная 24-часовая история и сводка. Для разбора — подробные графики от одного часа до 30 дней: можно одновременно сравнивать до трёх показателей с независимыми шкалами и точными значениями по наведению или касанию. Лёгкий live-snapshot загружается первым, тяжёлая история догоняет в фоне.

Подробные графики EnviroHub с одновременным сравнением трёх показателей
Подробная история EnviroHub: три физических показателя, три независимые шкалы и точные значения для инженерного разбора.

Настройки тоже не улетают в устройство с верой в лучшее. Сайт создаёт желаемую ревизию, Edge Gateway доставляет её через MQTT, ESP сохраняет конфигурацию и возвращает фактически применённое состояние. Пока нет ответа устройства, интерфейс честно различает «хотим» и «уже работает».

Просмотр консоли открыт посетителям, а изменения защищены серверным PIN с ограничением попыток и отдельными машинными токенами. Тревоги доставляются владельцу через постоянную Telegram-очередь только при смене состояния — без пулемётной очереди уведомлений на каждый короткий чих сети.

И да, мы довели данные до Алисы

Ту же публичную модель данных мы подключили к Яндекс Умному дому. Алиса через Яндекс Станцию может назвать текущую температуру, влажность и атмосферное давление. Для этого не понадобились второй MQTT-брокер, отдельный сборщик телеметрии или входящий доступ к Edge Gateway.

Read-only адаптер на сайте читает уже санитизированную проекцию. Авторизация связывает устройство только с разрешённым владельцем, команды управления не поддерживаются, а локальные идентификаторы и полная история до умного дома не доходят. CO₂ и O₂ в Алису сейчас не публикуются: голосовой интерфейс получает ровно те три канала, которые прошли отдельную проверку.

Тракт данных EnviroHub от ESP32-S3 до Яндекс Умного дома и Алисы
Тракт данных в публичном справочнике: ESP32-S3, локальный MQTT 5/TLS, EnviroHub Edge Gateway, исходящий HTTPS Bridge, сайт, умный дом, Алиса и Яндекс Станция.

А теперь честно: баги были

Самый показательный прилетел после расширения диагностики кислородного канала. Светодиод на ESP бодро мигал голубым, Wi-Fi был жив, а MQTT-брокер уже объявил станцию offline через Last Will. Получился классический инженерный мем: лампочка говорит «всё нормально», система отвечает «братан, вообще-то нет».

Serial- и broker-логи помогли точно найти первопричину: взаимную блокировку между задачей публикации и MQTT callback. Мы полностью устранили lock inversion — callback-публикации перевели на неблокирующую очередь, убрали конфликтующий mutex, увеличили MQTT-буфер и ограничили размер status-пакета. Независимый supervisor добавили уже как второй уровень защиты, а не как костыль вместо исправления. После перепрошивки станция прошла HIL-проверку без повторных разрывов: MQTT-сессия оставалась стабильной, архивные пакеты получили application ACK, очередь microSD опустела, сайт показывал online и все семь физических каналов. Этот конкретный отказ закрыт и проверен end-to-end.

Но честная часть на этом не заканчивается. Публичный аудит обнаружил в истории разрыв на 14 часов 15 минут. Read-only проверка microSD подтвердила: между соседними записями внутри этого интервала нет исходных CSV или NDJSON-данных, а значит, восстанавливать там просто нечего. Мы не стали заполнять дыру придуманными значениями, а компактный и подробный графики научили показывать её настоящим разрывом линии. Поэтому говорить, что данные «вообще никогда не теряются», было бы неправильно.

Из инцидента вышло конкретное улучшение: состояние связи больше не считается доказательством сбора и сохранения. Система отдельно показывает последнюю физическую выборку, последний durable append на microSD и последний application ACK. И это уже проверено не только коротким тестом: во время 48-минутной недоступности MQTT и Edge запитанная ESP продолжала накапливать очередь, а после восстановления 20 записей дошли oldest-first с исходными UTC timestamps до Edge и сайта, без дублей. Обе очереди в конце опустели.

Вот что для нас означает наблюдаемость: не зелёная лампочка «всё хорошо», а возможность разделить сбор, локальную запись, транспорт, серверную фиксацию и публичную синхронизацию — и увидеть, на каком шаге закончились подтверждения.

Что из этого переносится в клиентский проект

EnviroHub не прибит гвоздями к климатическим датчикам. На той же архитектурной основе можно строить мониторинг оборудования, помещений, складов, теплиц, энергетических установок или распределённых инженерных узлов. Для нового проекта меняются источники сигналов, правила обработки, роли пользователей и внешний вид; базовые механизмы проектируются под конкретные требования, но не начинаются с пустого листа.

  • Стабильность: write-before-send, постоянные очереди, прикладные подтверждения и supervision сервисов.
  • Масштабирование: versioned contracts, отдельные credentials и ACL для узлов, идемпотентная доставка.
  • Гибкость: датчики, пороги, интервалы, команды и публичные представления отделены друг от друга.
  • Наблюдаемость: freshness, health, failure domains, backlog, события доступности и история изменений.
  • Безопасная граница: локальный broker не открыт в интернет, наружу идёт только разрешённая проекция.

Мы намеренно не клеим на EnviroHub магическую наклейку Enterprise и не изображаем сертифицированный газоанализатор. Зато можем показать, что именно реализовано, какие отказы проверялись, где находятся постоянные очереди и на каких участках ещё нужны испытания. Для инженерной системы это полезнее громкого эпитета.

Посмотреть систему в работе: живая операторская консоль EnviroHub. Контекст проекта и дополнительные материалы: страница EnviroHub.

Если вам нужна система, которая не просто рисует красивые карточки, а измеряет, сохраняет, объясняет своё состояние и восстанавливается после неприятностей, — кажется, мы нашли общий язык.

Контакт

Обсудить вашу инженерную задачу

Свяжитесь с нами по email или задайте вопрос по телефону.