Modbus: где он работает и как отдать его данные в MQTT и Home Assistant
Modbus стоит почти в каждом щитке: в счётчиках, реле, частотниках и датчиках. Разбираемся, как он устроен, почему с ним бывает трудно и как ELX-MODBUS передаёт его данные в MQTT — туда, где их ждут Home Assistant, Node-RED и openHAB.

Что такое Modbus
Modbus — протокол обмена данными, который компания Modicon опубликовала в 1979 году для своих программируемых контроллеров. Он открыт, прост и не требует лицензий, поэтому за сорок с лишним лет стал общим языком промышленной электроники: его понимают устройства тысяч производителей.
Устроен он по принципу «запрос — ответ». На линии есть один ведущий (мастер, в новой терминологии — клиент) и до 247 ведомых устройств, у каждого свой адрес. Ведущий спрашивает, устройство отвечает; само по себе ведомое устройство ничего не передаёт.
| Тип данных | Что хранит | Доступ |
|---|---|---|
| Coil | Один бит: реле, выход, флаг включения | Чтение и запись |
| Discrete Input | Один бит: состояние входа, концевика, аварии | Только чтение |
| Input Register | 16-битное число: измерение датчика | Только чтение |
| Holding Register | 16-битное число: уставка, режим, параметр | Чтение и запись |
Физически Modbus живёт в двух вариантах. Modbus RTU — двоичные кадры по последовательной линии, чаще всего RS-485: витая пара, до 1200 метров и десятки устройств на одном кабеле. Modbus TCP — те же данные поверх Ethernet, порт 502. Между ними есть промежуточный вариант — RTU-over-TCP: кадры RTU без изменений, но по сети, через преобразователь Ethernet ↔ RS-485.
Где встречается Modbus
Проще перечислить, где его нет. На практике Modbus почти всегда найдётся в электрощите, в котельной и в вентиляционной камере:
| Область | Устройства |
|---|---|
| Учёт энергии | Счётчики электроэнергии, тепла и воды, анализаторы сети |
| Климат | Котлы и их контроллеры, приточно-вытяжные установки, адаптеры кондиционеров, тепловые насосы |
| Электрика | Модули реле, диммеры, контроллеры освещения, шлюзы DALI |
| Датчики | Температура, влажность, CO₂, давление, протечка |
| Промышленность | Частотные преобразователи, ПЛК, модули ввода-вывода 0–10 В и 4–20 мА |
| Энергетика | Солнечные инверторы, системы накопления, ИБП |
Для умного дома это значит простую вещь: самое надёжное и недорогое оборудование для щита — промышленное, и оно говорит на Modbus. А системы автоматизации — Home Assistant, Node-RED, openHAB — лучше всего понимают MQTT.
В чём сложность
Сам протокол прост. Сложность в том, что Modbus передаёт только номера регистров и сырые числа, а смысл этих чисел знает лишь техпаспорт устройства. Чтобы получить из счётчика напряжение, нужно выяснить:
- в каком регистре оно лежит и считает ли производитель адреса с нуля или с единицы;
- какой это тип — 16 или 32 бита, целое или с плавающей точкой, со знаком или без;
- в каком порядке идут слова и байты 32-битного значения;
- какой множитель превращает сырое 2305 в 230,5 В;
- с какой скоростью, чётностью и адресом устройство работает на шине.
Обычно всё это превращается в скрипт под конкретное устройство. Для объекта из двадцати устройств — двадцать скриптов, каждый со своими ошибками. Их надо запускать, перезапускать, следить, чтобы два скрипта не лезли на одну шину одновременно, и переписывать, когда меняется модель.
Почему именно MQTT
MQTT — протокол «публикация — подписка». Устройства публикуют значения в именованные топики, например home/boiler/temp, а все, кому эти значения нужны, подписываются на них через брокер. Отправителю не нужно знать получателей, а получателю — как устроено устройство.
Home Assistant, Node-RED, openHAB, ioBroker, Grafana через Telegraf и собственные программы на любом языке умеют работать с MQTT из коробки. Поэтому если данные Modbus один раз попали в MQTT, дальше они доступны всему.
Устройства Modbus
Счётчики, реле, датчики, котлы и приводы на RS-485 или Ethernet
ELX-MODBUS
Опрашивает шину, переводит регистры в значения, принимает команды
MQTT-брокер
Home Assistant, Node-RED, openHAB и ваш собственный код
Как это делает ELX-MODBUS
ELX-MODBUS — служба для Linux, которая заменяет всю эту россыпь скриптов. Она опрашивает устройства Modbus, превращает регистры в понятные значения, публикует их в MQTT-брокер и принимает команды обратно. Настраивается всё в браузере, конфигурационные файлы править не нужно.
- Шлюз. Физический путь к шине: Modbus TCP, RTU-over-TCP через преобразователь или последовательный порт вроде
/dev/ttyUSB0со скоростью и чётностью. - Устройство. Шаблон из библиотеки или своя карта регистров, адрес на шине и префикс MQTT.
- Брокер. Адрес, логин и пароль — и значения сразу пошли в топики.
Сырой регистр превращается в значение по формуле raw × множитель + смещение с учётом типа, порядка слов и байт и битовой маски. Результат публикуется в топик {базовый}/{префикс}/{ключ}:
home/livingroom/ac/temp → 24.5
home/livingroom/ac/mode → cooling
home/livingroom/ac/set_temp → 22.0
home/livingroom/ac/set_temp/set ← 23.0 (команда: записать в регистр)
У записываемых каналов есть командный топик — по умолчанию {топик}/set. Команда встаёт первой в очередь опроса и записывается сразу, а не ждёт следующего цикла, поэтому выключатель в интерфейсе срабатывает без задержки.
Библиотека устройств: регистры уже прописаны
Главное, что экономит время монтажнику и программисту, — библиотека готовых устройств. Для каждого шаблона карта регистров, типы, множители, перечисления и виджеты уже собраны по техпаспорту. Добавить известное устройство — это выбрать его из списка и указать адрес на шине: пара щелчков вместо вечера с документацией.
| Группа | Что есть в библиотеке |
|---|---|
| Климат | Адаптеры кондиционеров, контроллеры котлов с OpenTherm и eBus, приточно-вытяжные установки |
| Реле | 6- и 16-канальные модули реле с командными регистрами |
| Датчики | Температура и влажность, мультидатчики, зонды 1-Wire |
| Свет | Диммеры, LED-контроллеры, шлюзы DALI |
| Аналог | Модули выходов 0–10 В и 4–20 мА |
Если устройства в библиотеке нет, его можно описать самому: у каждого поля есть подсказка, а терминал обмена показывает сырые кадры запросов и ответов. По нему сразу видно, что устройство отвечает на самом деле: не тот адрес, перепутанный порядок слов или исключение 02 — «такого регистра нет».
Всю конфигурацию объекта — шлюзы, устройства и регистры — можно выгрузить в один файл JSON. Настроенный однажды объект переносится на следующий такой же за минуту.
Пример: данные в Home Assistant
Топик складывается из настроек предсказуемо, поэтому подписку в Home Assistant можно написать ещё до того, как устройство подключено к шине. Датчик температуры и уставка кондиционера из примера выше описываются так:
mqtt:
sensor:
- name: "Температура в гостиной"
state_topic: "home/livingroom/ac/temp"
unit_of_measurement: "°C"
device_class: temperature
number:
- name: "Уставка кондиционера"
state_topic: "home/livingroom/ac/set_temp"
command_topic: "home/livingroom/ac/set_temp/set"
min: 16
max: 30
step: 0.5
С чего начать
ELX-MODBUS ставится одним пакетом .deb на Debian, Ubuntu и Raspberry Pi OS — для amd64, arm64 и armhf. Подойдёт и сервер, и одноплатный компьютер в щите.
sudo apt install ./elxmodbusmqtt_*_amd64.deb
systemctl status elxmodbusmqtt
# веб-интерфейс: http://<адрес>:8080
Если брокера MQTT ещё нет, подойдёт любой стандартный — например, ELX-MQTT Broker. Пакеты — на странице загрузки, подробности про шлюзы, регистры и топики — в документации ELX-MODBUS.