В процессе создания умного дома я столкнулся с необходимостью интеграции различных устройств, таких как промышленные контроллеры, датчики температуры и влажности, а также системы управления освещением. Многие из этих устройств используют протокол Modbus, разработанный ещё в 1980-х годах, что объясняет его широкое распространение и наличие большого количества совместимого оборудования.
Данная статья - мои наблюдения в рамках изучения modbus. Код достался мне в жестокой схватке с разными чатами гпт, если бы примеры были у меня ранее - проще было бы с чатом разговаривать.
Код в дзене нормально не вставить, поэтому будут ссылки на гит. Отметил курсивом.
Home Assistant и ESPHome упрощают интеграцию устройств в умный дом, обеспечивая централизованное управление. С использованием ESP32 можно подключаться к проводным линиям Modbus и превращать платы в контроллеры Modbus RTU. Работоспособность системы проверялась программами Modbus Poll и QModMaster через USB-RS485 адаптеры.
Инструменты ChatGPT, Deepseek и Copilot ускорили разработку, хотя оптимальный код потребовал значительных усилий. Можно брать рабочий код и эти ребята быстро его адаптируют под ваше оборудование.
Что есть Modbus RTU
Modbus RTU — это коммуникационный протокол, широко применяемый в промышленной автоматизации для обмена данными между различными устройствами по последовательным интерфейсам, таким как RS-485. Он функционирует по модели «ведущий-ведомый» (master-slave), где ведущее устройство (мастер) инициирует обмен данными, отправляя запросы ведомым устройствам (слейвам), которые в ответ предоставляют необходимые данные или выполняют команды. Ведомые устройства не могут самостоятельно инициировать передачу данных; они отвечают только на запросы ведущего устройства.
Передача данных в Modbus RTU осуществляется в двоичном формате, что обеспечивает компактность и эффективность обмена. Стандартные скорости передачи данных варьируются от 9600 до 115200 бит/с, выбор которых зависит от требований конкретной системы и характеристик используемого оборудования. Однако следует учитывать ограничения протокола: максимальное количество ведомых устройств в сети ограничено 247, а общая длина линии связи не должна превышать 1000 метров без использования повторителей. Кроме того, из-за отсутствия механизма подтверждения доставки сообщений, протокол уязвим к потерям данных в условиях высокого уровня электромагнитных помех.
Важно отметить, что в стандартной реализации протокола Modbus RTU ведомые устройства не имеют возможности самостоятельно отправлять сообщения ведущему устройству или другим ведомым устройствам. Обмен данными всегда инициируется ведущим устройством, что может быть ограничением в системах, требующих асинхронной передачи данных или уведомлений о событиях.
Оборудование
Для тестов у меня такой набор:
Тестовый сервер на OrnagePi 3 на Home Assistant. Подробнее тут
USB-RS485
Ям: https://ya.cc/m/6AWbWz
Али: https://aliclick.shop/s/36smup?erid=2SDnjesiu5e
XY-017 Преобразователь TTL в RS485 . Не берите HW-97 преобразователь, он не работает нормально.
Ям: https://ya.cc/m/6A2Zb8
Али: https://aliclick.shop/s/lhie57?erid=2SDnje9ih72
Modbus-Rtu модуль реле 12V, RS485/TTL 1 канал. Подробнее тут
ESP wroom 32 с подключенным реле и виртуальным датчиком температуры.
Ям: https://aliclick.shop/s/rl2zrm?erid=2SDnjdjzZ7a
Али: https://aliclick.shop/s/rl2zrm?erid=2SDnjdjzZ7a
KC868-A16S со встроенным rs-485, прошитыми для тестов 2 реле и 2 входами.
Клиент и сервер
Код представленный у меня можно вставлять после captive_portal:, все что до это ваша информация после подключения к esp32.
Пины для esp32 в принципе можно использовать и мои. Если у вас другое подклчение - нужно поменять.
Esp 32 соединяю с конвертором по такой схеме:
ESP32 - RS485
Rx2 (D16, GPIO16) - RXD
Tx2 (D17, GPIO17) - TXD
3,3V - VCC (Блок питания +3,3V)
GND - GND
Серверная часть на esp32 и тест через Modbus Poll и QModMaster
Богатые функции esp32 и всяких дополнений (датчики температуры, влажности, приближения и прочее) позволяют собрать данные/управление и передать по modbus. Цепляем на esp входы и выходы (реле) и управляем.
Код с реле для esp32, его можно вставлять после captive_portal: Использует стороннюю библиотеку github://epiclabs-io/esphome-modbus-server@master . Простое управление реле. Адрес выставлен 01.
Код для копирования тут, ищем поиском: Серверная часть на esp32 и тест через Modbus Poll и QModMaster.
Загружаем на esp и для проверки подключаем наш esp32 в сеть к usb и в программе Modbus Poll и QModMaster отсылаем запрос 0 выключение и 1 включение.
Можно прочитать статус реле
В esp32 можно добавить на другой пин еще реле.
Код для копирования тут, ищем поиском: Можно добавить на другой пин еще реле и добавить к текущему.
Подключаем в качестве теста передачу температуры от рандомного датчика. Сам датчик находится в разделе sensor, а в modbus_server: добавим - start_address: 202 # Register for reading temperature. Смотри в коде. На выходе можем принимать значение.
Код для копирования тут, ищем поиском: Подключаем в качестве теста передачу температуры от рандомного датчика. Сам датчик находится в разделе sensor, а в modbus_server: добавим - start_address: 202 # Register for reading temperature. Смотри в коде. На выходе можем принимать значение.
Немного про получение сигнала и перевод. По температуре мы получаем вот такой код 0000000011001101 его нужно будет в дальнейшем перевести.
Преобразуйте двоичное значение в десятичное:
Ваше значение: 0000000011001101.
Это двоичное число можно перевести в десятичное:
0000000011001101 (binary) = 205 (decimal)
Учтите множитель:
В вашем коде ESPHome значение температуры умножается на 10 для передачи с точностью до 0.1°C
return id(virtual_temp).state * 10;
Поэтому, чтобы получить фактическую температуру, разделите десятичное значение на 10:
205 / 10 = 20.5°C
Итоговое значение температуры:Полученное значение 20.5 — это температура в градусах Цельсия.
Пример: Если вы получили значение 0000000011001101:Переведите его в десятичное: 205.
Разделите на 10: 205 / 10 = 20.5.
Температура: 20.5°C.
Клиент (Мастер) на esp32
Теперь мы можем попробовать настроить esp32 в качестве клиента, обмениваясь данными с другим esp32 который у нас ранее настроен как сервер по шине rs-485. Понимаю что реальный кейс с такой сборкой врядли нужен, но для тестирования кода и изучения как это все работает почему бы и нет.
У нас цель с мастера управлять двумя реле с сервера, а также получить данные по случайной температуре.
Код для копирования тут, ищем поиском: Клиент (Мастер) на esp32.
Клиент Home Assistnat / Сервер kincony kc868 a16s ( Esp32) - прямая связь Modbus
Подключил через usb-rs485 к контроллеру kincony kc868 a16s напрямую. На контроллере уже есть rs485 с отдельными выходами чем упрощается подключение.
Если ранее мы соединяли 2 esp32, то теперь будет соединение самого сервера Home assistant с kincony kc868 a16s через USB-RS485.
Сам контроллер у меня через ESPhome к домашнему серверу, а по rs485 контроллер подключен к тестовому серверу. Задача была научиться управлять по modbus устройствами. В дальнейшем, сам контроллер может быть использован для управления устройствами через реле, подключать датчики температуры 1-wire, различные аналоговые датчики. Вот с кнопками вопрос - так как сервер не отсылает сам сообщение, только по запросу от клиента - то есть, мы можем подключить кнопку, но получение состояния будет при следующем опросе от клиента.
В Home Assistant в конфигурации добавил файл с модбасом и сделал ссылку на файл
modbus: !include modbus.yaml
Код для копирования тут, ищем поиском: Вот код для Home Assistant
Вот “ответный код” от сервера контроллера.
Код для копирования тут, ищем поиском: Вот “ответный код” от сервера контроллера.
Если нужно подключить кнопку/выключатель на вход, вот код для контроллера.
Код для копирования тут, ищем поиском: Если нужно подключить кнопку, вот код для контроллера.
Если подключаем кнопку на контроллеры, то мы должны и на клиенте добавить, то есть на Home Assistant.
Код для копирования тут, ищем поиском: Для Home Assistant.
Цепь Modbus RTU из 4х устройств.
Наиболее возможный сценарий использования modbus это несколько устройств на одной шине. Чаще всего это заводские устройства, в которых уже настроены регистры и адреса. Используя код ниже с чатами гпт можно легко адаптировать документацию под код для Home Assistant.
У меня только в качестве теста используются esp32 устройства, который имитируют modbus устройства, только для изучения протокола - потому что esp32 проще подключить напрямую через esphome в home assistant.
Вот сборка : Мастер Home Assistant, Сервер 1 это ESP32 с реле и виртуальным датчиком, Сервер 2 это заводское реле Modbus-Rtu модуль реле 12V, RS485/TTL 1 канал., Сервер 3 это kincony kc868 a16s со встроенным rs485 на котором настроено 2 реле и виртуальный датчик.
С Home Assistant получается управлять 4 реле, получать температуру от двух разных серверов, а так же хоть и с задержкой но получение статусов входов от kincony kc868 a16s.
Мой код для клиента Мастер Home Assistant
Код для копирования тут, ищем поиском: Мой код для клиента Мастер Home Assistant.
Код для копирования тут, ищем поиском: мой код для Сервер 1 это ESP32 с реле и виртуальным датчиком.
Код для копирования тут, ищем поиском: Мой код Сервер 3 это kincony kc868 a16s со встроенным rs485 на котором настроено 2 реле и виртуальный датчик.
Итого
В целом стало понятно как настроить разные сборки на modbus. Из практичных подходов я вижу использование esp32 в качестве клиента с подключением заводских устройств на modbus. Это позволит завести оборудование сразу в Home Assistant и получить связь по wifi, то есть непосредственно где расположено устройство modbus. Тем более что сама плата и преобразователь недорогие. Wi-fi позволит подобраться к устройству даже если ранее не были заложены провода.
Можно использовать Home Assistant в качестве клиента с usb-rs485 для подключения заводских устройств. Вот только не думаю что это может быть удобно, обычно сервер в одном месте, а счетчик электричества может быть далеко. Попробую потом подключить Home Assistant к modbus устройствам через RS-485 в Ethernet, но стоят они обычно дороже черм esp32. Можно также опробовать esp32 c ethernet.
Строить умный дом на такой шине крайне сложно, все из-за обратной связи - только после опроса от клиента. Выключатели, кнопки и другие датчики не будут срабатывать сразу. Получать данные от датчиков наверное ок, если не нужно частое обращение.
Было интересно и весело все это настроить.
Поддержать канал можно через донаты https://donate.stream/yoomoney410013774736621 или через криптокошелёк (Только USDT) TCHekdJZFndXpDrHZGuTmqFNcqhWBTTzPr
Связаться со мной. (Консультации, проектирование, монтаж, обучение)
Новый подход к электрике и дизайну помещений. Некоторые провода уже не нужно тянуть, какие-то решения можно принять после ремонта. Перенести выключатель, запустить кондиционер с телефона - возможно автоматизировать любую рутину.
Сайт smart4home.ru и альтернативный Умный дом на любом этапе.
Соц сети: телеграм / RuTube канал Удобный дом / You Tube канал Удобный дом Яндекс Дзен: Удобный дом / InGram
Платформы специалистов: Авито / Профи.ру / Яндекс Услуги https://uslugi.yandex.ru/profile/EgorSmirnov-2294380?from=telek
#устройства #обзор
Реклама: ООО "АЛИБАБА.КОМ (РУ)" ИНН: 7703380158 Реклама. ООО «ЯНДЕКС», ИНН 7736207543