IT-инфраструктура • инструкции • практикаПоиск по сайту

Серверы и системное администрирование

Найти материал →

Мониторинг электричества в доме через openwrt и modbus Tcp

Мониторинг электричества в доме с помощью OpenWrt и Modbus TCP

Строительство дома - подходящий момент для того, чтобы заранее заложить инфраструктуру умного дома. Пока стены не отделаны, проще проложить дополнительные линии связи, проверить оборудование и без серьёзных последствий исправить неудачные решения. Именно поэтому вместе с оптическим кабелем от провайдера в доме были предусмотрены Ethernet- и RS-485-линии.

Подключение к Интернету позволило превратить строящийся объект в испытательный стенд. Здесь можно тестировать датчики, сетевое оборудование и автоматизацию: временный сбой или потеря связи не создадут проблем жильцам, зато помогут заранее обнаружить слабые места. Одним из первых экспериментов стал мониторинг электроэнергии в доме на базе роутера с OpenWrt, интерфейса RS-485 и протокола Modbus TCP. Более подробно архитектура такого решения разобрана в материале о [контроле энергопотребления через OpenWrt и Modbus TCP](https://habr.com/ru/articles/1071544/?utm_campaign=1071544&utm_source=habrahabr&utm_medium=rss).

Оборудование для эксперимента

Для тестовой системы потребовался недорогой набор компонентов:

- роутер Cudy WR3000 v1.0 с поддержкой OpenWrt;
- Ethernet-RS-485-шлюз CDEBYTE NA111-M;
- трёхфазный измеритель параметров сети Peacefair PZEM-6L24;
- температурные датчики SHT30 и SHT20 с интерфейсом RS-485.

Ревизия Cudy WR3000 имеет значение: нужную версию можно найти на коробке рядом со штрихкодом. На момент покупки это был один из наиболее доступных роутеров с совместимостью с OpenWrt. Установка прошивки не отличается особым удобством, но выполнять её требуется только один раз.

Шлюз CDEBYTE преобразует данные Modbus RTU, передаваемые по RS-485, в Modbus TCP. Благодаря этому роутер получает доступ к промышленным датчикам по обычной Ethernet-сети. Общая стоимость комплекта не превысила 5000 рублей, поэтому такая система подходит не только для постоянного дома, но и для экспериментов.

Архитектура системы

На Cudy запускаются MQTT-брокер Mosquitto и скрипты, которые опрашивают измерительные приборы. Полученные значения публикуются в MQTT-топики. Затем локальный брокер пересылает сообщения в режиме моста на брокер, размещённый на внешнем сервере.

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

Такой подход удобен при нестабильном подключении или ограниченных ресурсах роутера. OpenWrt не приходится нагружать базой данных и панелью мониторинга, а вся тяжёлая обработка выполняется на NAS или удалённой машине. При необходимости Grafana впоследствии можно перенести на внешний хост и открыть доступ к показаниям из любой точки.

Настройка MQTT

Сначала на внешнем сервере устанавливается Mosquitto. Для защищённого соединения используется сертификат Let's Encrypt, а брокер настраивается на приём MQTT-подключений через порт 8883. Если на сервере активен firewall, этот порт необходимо разрешить отдельно.

Для авторизации создаётся файл пользователей и паролей Mosquitto. После запуска работоспособность конфигурации проверяется утилитами `mosquitto_pub` и `mosquitto_sub`: одна публикует тестовое сообщение, другая подписывается на соответствующий топик.

На роутере с OpenWrt устанавливаются пакеты `mosquitto-ssl` и `mbpoll`, а также обновляется пакет `ca-certificates`. Установку можно выполнить через командную строку - с использованием `opkg` или `apk`, в зависимости от версии OpenWrt, - либо через веб-интерфейс LuCI. После этого локальный Mosquitto переводится в режим моста и настраивается на передачу сообщений удалённому брокеру.

Опрос счётчика через Modbus TCP

Сбор показаний выполняют небольшие скрипты, которые запускают `mbpoll`, разбирают его вывод и публикуют результат через `mosquitto_pub`. Такой вариант не требует установки полноценных библиотек для работы с Modbus и MQTT, что особенно важно для маломощного роутера.

Изначально скрипты были написаны на Python. Однако в OpenWrt Python отсутствует в базовой системе, а его установка быстро заполняет небольшую флеш-память Cudy WR3000. Поэтому код пришлось перенести на Lua, сохранив ту же логику.

Для получения данных от PZEM-6L24 скрипт запрашивает первые девять регистров Modbus. В них содержатся значения напряжения, тока и частоты по трём фазам. После чтения программа:

1. анализирует ответ `mbpoll`;
2. обрабатывает возможные ошибки;
3. меняет порядок байтов в словах;
4. преобразует сырые значения в физические величины;
5. публикует результат в MQTT.

Таким образом реализуется учет электроэнергии через Modbus TCP без отдельного промышленного контроллера. При необходимости аналогичным способом можно подключить счётчик электроэнергии с Modbus, температурные датчики, реле и другие устройства, поддерживающие RS-485.

Запуск сбора данных как службы

Основной Lua-скрипт работает в бесконечном цикле: через заданный интервал он опрашивает датчики и отправляет новые значения в MQTT. Чтобы процесс автоматически запускался после перезагрузки роутера и перезапускался при сбое, его оформляют как службу OpenWrt.

Для этого создаётся файл `/etc/init.d/modbus2mqtt`, в котором описываются команда запуска, пользователь, параметры остановки и правила перезапуска. OpenWrt использует менеджер `procd`, поэтому служба получает стандартное управление через init-систему. После добавления скрипта достаточно разрешить автозапуск в веб-интерфейсе или командой `service modbus2mqtt enable`.

Что можно добавить дальше

Базовая схема уже позволяет реализовать умный дом и контроль электричества: отслеживать перекос фаз, фиксировать скачки напряжения, видеть текущую нагрузку и анализировать потребление по времени. При подключении Grafana данные превращаются в понятные графики, а MQTT-топики можно использовать в Home Assistant или Wiren Board.

Полезным расширением станет сохранение аварийных событий. Например, отдельный скрипт может отправлять уведомление при выходе напряжения за допустимые пределы, исчезновении одной из фаз или длительном превышении мощности. Это позволит обнаруживать проблемы ещё до приезда в дом.

Также стоит предусмотреть локальное кэширование показаний. Если связь с внешним брокером временно пропадёт, роутер сможет сохранять последние измерения и передавать их после восстановления соединения. Такой механизм особенно актуален для строящегося дома, где Интернет или питание могут работать нестабильно.

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

Прокрутить вверх