Хабрахабр

Сенсорные выключатели с Modbus: зачем нужны и как применить в умной квартире

В бюджетных системах умного дома обычно используют стандартные выключатели — их тип выхода также называют «сухой контакт». Однако это не единственный вариант: в поисках красивого выключателя я наткнулся на устройства с протоколом Modbus RTU внутри. Кроме красивого внешнего вида, они позволяют настроить режим работы каждой кнопки, детально управлять подсветкой, а для их подключения к центральному контроллеру (я использовал Wiren Board 5) достаточно четырёх проводов — питание, земля и две линии для RS-485.

Также в статье будет подробно описано, как вообще работать с Modbus-устройствами.
Пояснение от маркетолога Wiren Board: эта статья родилась из темы, созданной Kallyanbl4 на нашем форуме. Как подключить такой выключатель и настроить управление светом и вентиляцией с него, смотрите ниже. Весь текст написан автором, кроме примечаний в конце. После нашей просьбы он написал полноценную статью и разрешил опубликовать её в нашем блоге, за что ему большое спасибо.

Описание выключателей

Изучив, что сейчас есть на рынке, купил у китайцев вот такие интересные выключатели:

Их преимущества:

  • неплохой дизайн;
  • выключатели cенсорные, при нажатии мигают, подсвечиваются в темноте приятным белым цветом;
  • относительно небольшая цена – 2000 рублей за штуку. В стоимость входит индивидуальная лазерная гравировка;
  • выключатель программируемый — можно задать кнопке практически любое действие: включение света, управление светодиодами, поднять/опустить штору, ...

Технические характеристики выключателя:

  • напряжение питания – 12 В;
  • скорость передачи данных — 19200 бит/с;
  • количество передаваемых бит – 8;
  • количество стоповых бит – 1;
  • контроль чётности – нет проверки.

При работе по Modbus RTU подключаемые устройства имеют так называемые регистры – ячейки, в которых хранится информация. На скриншоте описание регистров для четырёхклавишного выключателя:

При нажатии на одну из сенсорных кнопок значения в регистрах 0-3 будет меняться с 0 на 1.

Коммутация выключателей

В контроллере Wiren Board 5 в зависимости от комплектации бывает от двух до четырёх портов RS-485. Выключатели (в моём случае их 27) необходимо присоединить к этим портам.

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

Можно использовать и четырёхжильный, но я обычно всё делаю по принципу «на всякий случай». Соединяющий кабель — восьмижильный Cat 5e UTP. Можно рассмотреть и другие четырёхжильные кабели, но важный момент – кабель должен быть экранированным, ибо даже несмотря на достаточно низкие частоты сигнала, потери и наводки не исключены.

В итоге все выключатели у меня соединены между собой как показано на картинке:

По жилам 1 и 2 (оранжевая и бело-оранжевая) передается данные (линии A и B), к жилам 7 и 8 (коричневая и бело-коричневый) подключено питание 12 В. Как видно из рисунка, все выключатели соединены между собой с помощью пассивного UTP-коммутатора. В качестве источника питания использую Mean Well NDR-75-12.

Отмечу, что схема работает как через пассивный, так и через активный коммутаторы. Я не знал, как поведет себя пассивный китайский UTP-коммутатор, поэтому при проектировании щитка предусмотрел место для активного RS-423 коммутатора. И даже при их совместном подключении.

Управление светом с помощью реле

По моему проекту в квартире запланированы 27 независимых устройств (свет, вентиляторы), питаемые от 220 В. Для управления ими были выбраны три релейных модуля WBIO-DO-R10A-8 и одно WBIO-DO-R10R-4. Выбор обусловлен тем, что практически всё освещение в квартире – светодиодное, которое отличается от ламп накаливания высоким пусковым током. Выбранные реле способны обеспечить коммутацию тока до 10 А на канал, что в моём случае излишне — но, как было указано ранее, «на всякий случай с запасом».

Процедура интуитивно понятная, инструкция или подсказки не требуются. Переключение реле происходит через веб-интерфейс контроллера.

Программная часть

Файл порта

В моём случае выключатель подключен к порту /dev/ttyAPP1. Из описания аппаратной части Wiren Board 5 узнаём, что у него двум портам RS-485 соответствуют файлы устройств /dev/ttyAPP1 и /dev/ttyAPP4.

Адрес устройства (выключателя)

Как правило, производитель указывает этот адрес в виде трёх цифр на самом устройстве, но если такого номера на устройстве нет, можно перебрать адреса из командной строки (используется то, что адрес хранится в Modbus-регистре 0x80): При обмене данными по протоколу Modbus RTU каждое устройство идентифицируется собственным уникальным номером – Modbus-адресом.

root@wirenboard:~# service wb-mqtt-serial stop
root@wirenboard:~# for i in ; do modbus_client -mrtu /dev/ttyAPP1 --debug -a$i -t3 -r0x80 -s1 -pnone; done 2>/dev/null | grep Data:

Результат должен быть в виде:

Data: 0x008e

Ответ получен в шестнадцатеричном формате и соответствует цифре 142 в десятичном.
Стоит отметить, что при каждом вызове утилиты modbus_client следует останавливать стандартный для контроллера драйвер опроса wb-mqtt-serial; в противном случае утилита modbus_client работать не будет.

Обмен данными между выключателем и Wiren Board

В цикле задействована утилита modbus_client, которая необходима для отладки подключаемых устройств. Выше написан цикл, который опрашивает все возможные Modbus-адреса и возвращает значение адреса, если устройство найдено. Для этого попробуем прочитать данные в регистре 0х01 выключателя: В этом пункте с помощью неё убедимся, что всё подключено верно, и выключатель взаимодействует с контроллером должным образом.

root@wirenboard:~# service wb-mqtt-serial stop
root@wirenboard:~# modbus_client -mrtu /dev/ttyAPP1 --debug -a142 -s1 -pnone -b19200 -a142 -t0x03

(описание утилиты и её ключей есть в документации контроллера).

Результат будет следующего вида:

Opening /dev/ttyAPP1 at 19200 bauds (N, 8, 1)
[8E][03][00][64][00][01][DA][EA]
Waiting for a confirmation...
<8E><03><02><00><01><2C><5B>
SUCCESS: read 1 of elements:
Data: 0x0001

Такой результат означает, что в регистре записана дискретная величина 1. После нажатия на одну из кнопок выключателя значение регистра изменится на противоположное значение:

SUCCESS: read 1 of elements:
Data: 0x0000

Если наблюдается результат, как в этом пункте, то значит все подключено верно, выключатель и контроллер понимают друг друга.

Собственный драйвер для выключателя

Разработчики предлагают добавлять описание подключенного устройства в файл /etc/wb-mqtt-serial.conf или создать собственный шаблон в виде файла /usr/share/wb-mqtt-serial/templates/config-*.json После того как мы убедились, что контроллер и выключатель понимают друг друга, настало время дать описание клавишам выключателя на программном уровне.

Я пошел по второму пути, мой шаблон выглядит так:

{ "device_type": "4-band-switch", "device": { "name": "4-band-switch", "id": "4bsw", "enabled": true, "channels": [{ "name": "All", "reg_type": "holding", "address": "0x00", "type": "switch" }, { "name": "Window", "reg_type": "holding", "address": "0x01", "type": "switch" }, { "name": "Side", "reg_type": "holding", "address": "0x02", "type": "switch" }, { "name": "Diode", "reg_type": "holding", "address": "0x03", "type": "switch" } ] }
}

Детальное описание написанного выше шаблона есть в описании драйвера wb-mqtt-serial. Кратко разберёмся с полями:

  • «name»: «All» – имя кнопки. Если шаблон написан верно, эта кнопка появится во вкладке Settings с адресом /devices/4bsw_142/controls/All
  • «reg_type»: «holding» – тип и размер регистра. В выключателе используется «holding» – 16-битный регистр, доступный на чтение и запись.
  • «address»: «0x00» – адрес регистра выключателя, из которого контроллер будет читать данные.
  • «type»: «switch» – как выключатель будет отображаться в веб-интерфейсе. В случае «switch» — в виде дискретного переключателя.

Сохраняем шаблон на контроллер. После этого в разделе веб-интерфейса (Configs -> /etc/wb-mqtt-serial.conf) можно будет добавить новое устройство с таким шаблоном (4-band-switch). Добавляем наш первый выключатель и нажимаем Save.

Правило, включающее реле при нажатии кнопки выключателя

Внутри контроллера состояния всех подключенных устройств описываются MQTT-сообщениями. Управляются устройства также через отправку MQTT-сообщений. Клиентами очереди MQTT-сообщений (брокера) являются и веб-интерфейс, и движок правил.

Открываем вкладку Settings веб-интерфейса и наблюдаем, что будет происходить при нажатии кнопки All выключателя: внутри выключателя поменяется значение Modbus-регистра, драйвер wb-mqtt-serial опросит выключатель, и в соответствии с шаблоном устройства 4-band-switch отправит MQTT-сообщение в топик /devices/4bsw_142/controls/All — и на странице Settings значение в топике /devices/4bsw_142/controls/All моментально изменится с 0 на 1. Для наглядности посмотрим, как веб-интерфейс обрабатывает пришедшее сообщение.

Движок так же, как и веб-интерфейс, работает с очередью сообщений, и может среагировать на изменения значения — для этого используется функция whenChanged. Рассмотрим второго клиента – движок правил. В моём случае правило выглядело так:

//Коридор и гостиная
defineRule("switch_all", { whenChanged: "4bsw_142/All", then: function(newValue, devName, cellName) { dev["wb-gpio"]["EXT3_R3A2"] = newValue; dev["wb-gpio"]["EXT3_R3A5"] = newValue; dev["wb-gpio"]["EXT1_R3A1"] = newValue; dev["wb-gpio"]["EXT1_R3A2"] = newValue; dev["wb-gpio"]["EXT1_R3A5"] = newValue; dev["wb-gpio"]["EXT2_R3A8"] = newValue; dev["wb-gpio"]["EXT3_R3A7"] = newValue; }
});
//маленькая комната
defineRule("switch_window", { whenChanged: "4bsw_142/Window", then: function(newValue, devName, cellName) { dev["wb-gpio"]["EXT4_ON4"] = newValue; // dev["wb-gpio"]["EXT3_R3A6"] = newValue; // dev["wb-gpio"]["EXT3_R3A7"] = newValue; }
});
//Санузлы
defineRule("switch_side", { whenChanged: "4bsw_142/Side", then: function(newValue, devName, cellName) { dev["wb-gpio"]["EXT1_R3A3"] = newValue; dev["wb-gpio"]["EXT1_R3A4"] = newValue; dev["wb-gpio"]["EXT2_R3A1"] = newValue; }
});
//Кухня
defineRule("switch_diode", { whenChanged: "4bsw_142/Diode", then: function(newValue, devName, cellName) { dev["wb-gpio"]["EXT2_R3A2"] = newValue; dev["wb-gpio"]["EXT2_R3A3"] = newValue; dev["wb-gpio"]["EXT3_R3A3"] = newValue; }
});

На все вопросы буду рад ответить в комментариях.

Примечания маркетолога

  1. Прокладывать линию RS-485 лучше кабелем КСПЭВГ 2х2х0,35 (стоит всего 30 рублей за метр), причём не звездой, а шиной.
  2. Со светодиодными лампами мы советуем быть осторожнее — их пусковой ток может превышать номинальный в 150 (!) раз (про это будет отдельная статья) — присмотритесь к мощным релейным модулям WB-MR6: ток 16 А на канал, в том числе пусковой ток до 800 (!) ампер в модификации S.
Показать больше

Похожие публикации

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Кнопка «Наверх»