Сенсорные выключатели с 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. Можно использовать и четырёхжильный, но я обычно всё делаю по принципу «на всякий случай». Можно рассмотреть и другие четырёхжильные кабели, но важный момент — кабель должен быть экранированным, ибо даже несмотря на достаточно низкие частоты сигнала, потери и наводки не исключены.
В итоге все выключатели у меня соединены между собой как показано на картинке:
Как видно из рисунка, все выключатели соединены между собой с помощью пассивного UTP-коммутатора. По жилам 1 и 2 (оранжевая и бело-оранжевая) передается данные (линии A и B), к жилам 7 и 8 (коричневая и бело-коричневый) подключено питание 12 В. В качестве источника питания использую Mean Well NDR-75–12.
Я не знал, как поведет себя пассивный китайский UTP-коммутатор, поэтому при проектировании щитка предусмотрел место для активного RS-423 коммутатора. Отмечу, что схема работает как через пассивный, так и через активный коммутаторы. И даже при их совместном подключении.
Управление светом с помощью реле
По моему проекту в квартире запланированы 27 независимых устройств (свет, вентиляторы), питаемые от 220 В. Для управления ими были выбраны три релейных модуля WBIO-DO-R10A-8 и одно WBIO-DO-R10R-4. Выбор обусловлен тем, что практически всё освещение в квартире — светодиодное, которое отличается от ламп накаливания высоким пусковым током. Выбранные реле способны обеспечить коммутацию тока до 10 А на канал, что в моём случае излишне — но, как было указано ранее, «на всякий случай с запасом».
Переключение реле происходит через веб-интерфейс контроллера. Процедура интуитивно понятная, инструкция или подсказки не требуются.
Программная часть
Файл порта
Из описания аппаратной части Wiren Board 5 узнаём, что у него двум портам RS-485 соответствуют файлы устройств /dev/ttyAPP1 и /dev/ttyAPP4. В моём случае выключатель подключен к порту /dev/ttyAPP1.
Адрес устройства (выключателя)
При обмене данными по протоколу Modbus RTU каждое устройство идентифицируется собственным уникальным номером — Modbus-адресом. Как правило, производитель указывает этот адрес в виде трёх цифр на самом устройстве, но если такого номера на устройстве нет, можно перебрать адреса из командной строки (используется то, что адрес хранится в Modbus-регистре 0×80):
root@wirenboard:~# service wb-mqtt-serial stop
root@wirenboard:~# for i in {1..247}; 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-адреса и возвращает значение адреса, если устройство найдено. В цикле задействована утилита modbus_client, которая необходима для отладки подключаемых устройств. В этом пункте с помощью неё убедимся, что всё подключено верно, и выключатель взаимодействует с контроллером должным образом. Для этого попробуем прочитать данные в регистре 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»:»0×00» — адрес регистра выключателя, из которого контроллер будет читать данные.
- «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;
}
});
На все вопросы буду рад ответить в комментариях.
Примечания маркетолога
- Прокладывать линию RS-485 лучше кабелем КСПЭВГ 2×2х0,35 (стоит всего 30 рублей за метр), причём не звездой, а шиной.
- Со светодиодными лампами мы советуем быть осторожнее — их пусковой ток может превышать номинальный в 150 (!) раз (про это будет отдельная статья) — присмотритесь к мощным релейным модулям WB-MR6: ток 16 А на канал, в том числе пусковой ток до 800 (!) ампер в модификации S.