Продолжаю цикл статей про настройку SLS шлюза. Сегодня научимся управлять различными устройствами, не достаточно просто привязать к шлюзу zigbee устройства, надо ещё и настроить чтобы выключатели включали и выключали свет, поднимали о отпускали рольставни и т.п. Для управления логикой шлюза есть несколько способов, сценарии и правила SimpleBind. С сценариями я не разбирался, а SimpleBind немного заморочный в плане программирования из-за того что надо для каждого объекта прописывать туда правила, а хотелось бы всё в одном месте как в сценариях, да ещё и с функциями. Поэтому автоматизации я пишу на lua.
Для того чтобы автоматизация работала с помощью lua скрипта необходимо создать сам файл скрипта а так же прописать правило в SimpleBind для каждого устройства данные с которого надо обрабатывать, в основном это выключатели и различные датчики, можно все обработки делать в одном файле. Создадим файл btn.lua и пропишем в каждом устройстве у свойства которое будем мониторить выполнение этого скрипта. На снимке экрана пример запуска lua скрипта у выключателя
при получении значения actipn будет вызываться скрипт btn.lua
теперь все автоматизации мы будем делать в одном месте и это место: файл btn.lua
для получение значений устройства которое вызвало скрипт достаточно две строки:
local name=Event.FriendlyName -- имя выключателя который нажат local btn=zigbee.value(tostring(Event.ieeeAddr), "action") -- событие кнопки
для того чтобы послать команду например реле надо написать команду
zigbee.set("Relay01", "state_l1", "TOGGLE")
этот код переключит у реле с френдли именем «Relay01» канал «state_l1»
теперь нам надо разными кнопками включать выключать разные устройства, делаем обработку с помощью if
local name=Event.FriendlyName local btn=zigbee.value(tostring(Event.ieeeAddr), "action") if (name=="Button01" and btn=="single_left") then zigbee.set("Relay01", "state_l1", "TOGGLE") end if (name=="Button01" and btn=="single_right") then zigbee.set("Relay01", "state_l2", "TOGGLE") end
и для всех выключателей и всех вариантов нажатий кнопок просто копипастим и вставляем меняя названия. Но когда я написал обработку 10 клавиш для меня это не показалось слишком простым, особенно когда мне надо было поменять клавиши и я вспомнил про функции. Создаем отдельный файл с нашими функциями с именем myfunction.lua скопировав туда данные из файла.
подключается данный файл в любой файл скрипта строкой
dofile("/int/myfunction.lua")
теперь мы можем использовать наши функции и вышеприведенный код будет выглядеть так:
dofile("/int/myfunction.lua") relay("Button01", "single_left", "Switch", "Relay01", "TOGGLE", "state_l1") relay("Button01", "single_right", "Switch", "Relay01", "TOGGLE", "state_l2")
куда приятнее на взор запись, а делает тоже самое что и запись выше.
В приложенном файле функций есть комментарии по синтаксису, используются 2 функции: relay() и dimmer(). в файле myfunction.lua имеются ещё функции Curtain_up(), Curtain_down() и Curtain_revers() но они используются в функции relay()
Параметры функции relay()
relay (btn_name, btn_state, type, obj_name, obj_status, obj_state)
btn_name — Имя выключателя, датчика события с которого обрабатывается
btn_state — статус команды выключателя или датчика (single, double, true …)
type — тип устройства которое управляется (Switch — переключатель, Curtain — рольставни)
obj_name — имя устройства которым управлять
obj_status — статус свойства устройства которым управлять(для Curtain — UP, DOWN, TOGGLE, для реле, диммеров и т.п. ON, OFF, TOGGLE и т.п.)
obj_state — имя свойства устройства которым управлять(для Curtain не используется)
Параметры функции dimmer()
для управления димером (включение на заданную яркость/выключение)
btn_name — Имя выключателя, датчика события с которого обрабатывается
btn_state — статус команды выключателя или датчика (single, double, true …)
obj_name — имя димера которым управлять
obj_status — номер канала (для state_l1 должно быть «_l1», для state должно быть «»)
obj_state — значение димера
при этом привязываем к одной кнопке, если статус димера включен то он выключится, если выключен то включиться на заданную яркость. Пример кода
dimmer("Button01", "double_left", "Dimmer01", "_l1", 100)
Таким образом у нас получился красивый и удобный код, вот код на существующем объекте
dofile("/int/myfunction.lua") -- подключаем файл с функциями relay("Button01", "left", "Switch", "Dimmer11", "TOGGLE", "state_l2") relay("Button01", "right", "Switch", "Dimmer11", "TOGGLE", "state_l1") relay("Button01", "left_double", "Curtain", "Curtain06", "UP") relay("Button01", "right_double", "Curtain", "Curtain06", "DOWN") relay("Button01", "left_long", "Curtain", "Curtain05", "UP") relay("Button01", "right_long", "Curtain", "Curtain05", "DOWN") relay("Button02", "left", "Switch", "Dimmer01", "TOGGLE", "state_l2") relay("Button02", "right", "Switch", "Dimmer01", "TOGGLE", "state_l1") relay("Button02", "left_double", "Curtain", "Curtain03", "UP") relay("Button02", "right_double", "Curtain", "Curtain03", "DOWN") relay("Button02", "left_long", "Curtain", "Curtain04", "UP") relay("Button02", "right_long", "Curtain", "Curtain04", "DOWN") relay("Button03", "left", "Switch", "Dimmer04", "TOGGLE", "state_l1") relay("Button03", "right", "Switch", "Dimmer04", "TOGGLE", "state_l2") relay("Button03", "left_double", "Curtain", "Curtain01", "UP") relay("Button03", "right_double", "Curtain", "Curtain01", "DOWN") relay("Button03", "left_long", "Switch", "Dimmer05", "TOGGLE", "state_l1") relay("Button03", "right_long", "Switch", "Dimmer05", "TOGGLE", "state_l2") relay("Button04", "left", "Switch", "Dimmer02", "TOGGLE", "state_l2") relay("Button04", "right", "Switch", "Dimmer02", "TOGGLE", "state_l1") relay("Button05", "left", "Switch", "Rele02", "TOGGLE", "state_l1") relay("Button05", "right", "Switch", "Dimmer10", "TOGGLE", "state_l1") relay("Button06", "left", "Switch", "Dimmer03", "TOGGLE", "state_l2") relay("Button06", "right", "Switch", "Dimmer03", "TOGGLE", "state_l1") relay("Button06", "left_double", "Curtain", "Curtain02", "UP") relay("Button06", "right_double", "Curtain", "Curtain02", "DOWN") relay("Button07", "left", "Switch", "Dimmer09", "TOGGLE", "state_l1") relay("Button07", "right", "Switch", "Dimmer06", "TOGGLE", "state_l1") relay("Button08", "left", "Switch", "Rele03", "TOGGLE", "state_l1") relay("Button08", "right", "Switch", "Dimmer06", "TOGGLE", "state_l2") relay("Button09", "left", "Switch", "Dimmer05", "TOGGLE", "state_l1") relay("Button09", "right", "Switch", "Dimmer05", "TOGGLE", "state_l2") relay("Button09", "left_double", "Curtain", "Curtain01", "UP") relay("Button09", "right_double", "Curtain", "Curtain01", "DOWN") relay("Button09", "left_long", "Switch", "Dimmer04", "TOGGLE", "state_l1") relay("Button09", "right_long", "Switch", "Dimmer04", "TOGGLE", "state_l2") relay("Button10", "left", "Switch", "Dimmer08", "TOGGLE", "state_l1") relay("Button10", "right", "Switch", "Dimmer08", "TOGGLE", "state_l2") relay("Button12", "single", "Switch", "Dimmer08", "TOGGLE", "state_l1") relay("Button13", "single", "Switch", "Dimmer08", "TOGGLE", "state_l2")