Посмотреть систему в работе: живая операторская консоль 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 → сайт → умный дом → Алиса
Raspberry Pi здесь — аппаратная платформа первого EnviroHub Edge Gateway, а не «коробочка для сайта». На ней изолированно работают Mosquitto, коллектор, SQLite-хранилище и постоянные очереди синхронизации. MQTT остаётся внутри LAN. Никаких входящих портов домой, статического внешнего IP и проброса роутера: шлюз сам отправляет наружу только санитизированную публичную проекцию.
Семь физических каналов — без нарисованных цифр
Измерительный узел собран на ESP32-S3. Он получает CO₂ с SCD41, температуру и влажность внутри и снаружи с двух SHT45, давление с BMP390 и резервного BMP58x, а также кислород с отдельного аналогового тракта на Alphasense O2-A2, OPA333 и ADS1220. В публичном интерфейсе это семь понятных каналов. Служебная диагностика живёт отдельно и не подменяет физические измерения.
Текущая сборка действительно сделана быстро и на проводках. Это сознательный этап: сначала проверить весь путь данных, реакции на отказ и интерфейс, затем заниматься собственной платой, механикой и защищённым размещением наружного датчика.
Один пакет данных и пять уровней спокойствия
-
ESP сначала пишет пакет на microSD. Точный NDJSON нужен для автоматического повтора,
читаемый CSV — для ручного разбора. Сначала
append + fsync, потом отправка: это write-before-send. - Пакет уходит по MQTT 5 поверх TLS. Устройство имеет отдельные учётные данные, права ограничены ACL, а Last Will сообщает о внезапном разрыве сессии.
- Edge Gateway валидирует и сохраняет данные. Формат, время, качество и последовательность проверяются до одной атомарной транзакции в SQLite/WAL.
- Только после фиксации отправляется application ACK. MQTT PUBACK подтверждает доставку брокеру, но не доказывает, что прикладная запись уже переживёт перезапуск коллектора.
- После 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 загружается первым, тяжёлая история догоняет в фоне.
Настройки тоже не улетают в устройство с верой в лучшее. Сайт создаёт желаемую ревизию, Edge Gateway доставляет её через MQTT, ESP сохраняет конфигурацию и возвращает фактически применённое состояние. Пока нет ответа устройства, интерфейс честно различает «хотим» и «уже работает».
Просмотр консоли открыт посетителям, а изменения защищены серверным PIN с ограничением попыток и отдельными машинными токенами. Тревоги доставляются владельцу через постоянную Telegram-очередь только при смене состояния — без пулемётной очереди уведомлений на каждый короткий чих сети.
И да, мы довели данные до Алисы
Ту же публичную модель данных мы подключили к Яндекс Умному дому. Алиса через Яндекс Станцию может назвать текущую температуру, влажность и атмосферное давление. Для этого не понадобились второй MQTT-брокер, отдельный сборщик телеметрии или входящий доступ к Edge Gateway.
Read-only адаптер на сайте читает уже санитизированную проекцию. Авторизация связывает устройство только с разрешённым владельцем, команды управления не поддерживаются, а локальные идентификаторы и полная история до умного дома не доходят. CO₂ и O₂ в Алису сейчас не публикуются: голосовой интерфейс получает ровно те три канала, которые прошли отдельную проверку.
А теперь честно: баги были
Самый показательный прилетел после расширения диагностики кислородного канала. Светодиод на 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.
Если вам нужна система, которая не просто рисует красивые карточки, а измеряет, сохраняет, объясняет своё состояние и восстанавливается после неприятностей, — кажется, мы нашли общий язык.