...

среда, 1 августа 2018 г.

Сенсорные выключатели с 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-регистре 0x80):

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»: «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.

Let's block ads! (Why?)

Комментариев нет:

Отправить комментарий