ELX-Software

Блог

Modbus: где он работает и как отдать его данные в MQTT и Home Assistant

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

Modbus: где он работает и как отдать его данные в MQTT и Home Assistant

Что такое Modbus

Modbus — протокол обмена данными, который компания Modicon опубликовала в 1979 году для своих программируемых контроллеров. Он открыт, прост и не требует лицензий, поэтому за сорок с лишним лет стал общим языком промышленной электроники: его понимают устройства тысяч производителей.

Устроен он по принципу «запрос — ответ». На линии есть один ведущий (мастер, в новой терминологии — клиент) и до 247 ведомых устройств, у каждого свой адрес. Ведущий спрашивает, устройство отвечает; само по себе ведомое устройство ничего не передаёт.

Тип данныхЧто хранитДоступ
CoilОдин бит: реле, выход, флаг включенияЧтение и запись
Discrete InputОдин бит: состояние входа, концевика, аварииТолько чтение
Input Register16-битное число: измерение датчикаТолько чтение
Holding Register16-битное число: уставка, режим, параметрЧтение и запись

Физически 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 В;
  • с какой скоростью, чётностью и адресом устройство работает на шине.

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

Один мастер на шинуНа линии RS-485 может говорить только один ведущий. Два опрашивающих скрипта на одной шине — частая причина «плавающих» значений и ошибок CRC, которые появляются и исчезают сами по себе.

Почему именно 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-брокер и принимает команды обратно. Настраивается всё в браузере, конфигурационные файлы править не нужно.

  1. Шлюз. Физический путь к шине: Modbus TCP, RTU-over-TCP через преобразователь или последовательный порт вроде /dev/ttyUSB0 со скоростью и чётностью.
  2. Устройство. Шаблон из библиотеки или своя карта регистров, адрес на шине и префикс MQTT.
  3. Брокер. Адрес, логин и пароль — и значения сразу пошли в топики.

Сырой регистр превращается в значение по формуле 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 можно написать ещё до того, как устройство подключено к шине. Датчик температуры и уставка кондиционера из примера выше описываются так:

configuration.yaml
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
Включите retainС флагом retain брокер хранит последнее значение каждого топика и отдаёт его новому подписчику сразу. После перезапуска Home Assistant на панели будут числа, а не «неизвестно» до следующего опроса.

С чего начать

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.