Smart Logic System Gateway (SLS), автоматизация с помощью скриптов
Использую для автоматизации Smart Logic System Gateway (SLS), связь между выключателями (пультами) и исполнительными устройствами (реле, димерами) можно делать разными способами. В официальной инструкции хорошо расписано как делать локальные автоматизации через SimpleBind, но на мой взгляд это не очень удобно
Вот такой код для двух клавишного выключателя Xiaomi:
left, Dimmer04, state_l1, TOGGLE; right, Dimmer04, state_l2, TOGGLE; left_double, Curtain03, position, 100; right_double, Curtain03, position, 0; left_double, Curtain04, position, 100; right_double, Curtain04, position, 0; left_double, Curtain05, position, 100; right_double, Curtain05, position, 0;
при редактировании выглядит так:
кроме того в автоматизации через SimpleBind невозможно остановить при движении мотор рольставни на ту же кнопку, то есть для останова при неполном открытии/закрытии нужно использовать ещё одно событие выключателя, так же невозможно одной кнопкой открывать если закрыты и закрывать если открыты рольставни. Все эти возможности мы реализуем через lua скрипты
Кто знает другие языки программирования понять lua не составит труда, ну и не стоит обращать внимания на используемые мной конструкции if — then — много elseif поскольку в lua отсутствует switch, можно было написать функцию switch, но мне было лень писать ещё одну функцию (может потом и напишу для красивого кода)
В каждом выключателе в SB rule свойства action пишем название скрипта, у меня button_click.lua
заходим в файлы и создаем 2 файла, один будет с функциями, второй собственно с самими правилами, я создал myfunction.lua и button_click.lua
файл myfunction.lua имеет 3 функции и имеет следующее содержание:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 |
-- функции function Curtain_up (f_name) zigbee.get(f_name, "moving") local moving = zigbee.value(f_name, "moving") if (moving=="UP" or moving=="DOWN") then zigbee.set(f_name, "state", "STOP") else zigbee.set(f_name, "state", "UP") end end -- Рольставни вниз/останов function Curtain_down (f_name) zigbee.get(f_name, "moving") local moving = zigbee.value(f_name, "moving") if (moving=="UP" or moving=="DOWN") then zigbee.set(f_name, "state", "STOP") else zigbee.set(f_name, "state", "DOWN") end end -- Рольставниреверс/останов function Curtain_revers (f_name) zigbee.get(f_name, "moving") local moving = zigbee.value(f_name, "moving") zigbee.get(f_name, "position") local position = zigbee.value(f_name, "position") if (moving=="UP" or moving=="DOWN") then zigbee.set(f_name, "state", "STOP") else if (position==0) then zigbee.set(f_name, "state", "UP") else zigbee.set(f_name, "state", "DOWN") end end end |
теперь подключив этот файл в другой файл скрипта нам будут доступны 3 функции:
Curtain_down(«имя модуля Curtain») — закрытие, при нажатии когда в движении — останов
Curtain_up(«имя модуля Curtain») — открытие, при нажатии когда в движении — останов
Curtain_revers(«имя модуля Curtain») — если закрыты то открытие, если в движении то останов, если не закрыты, то закрыть.
теперь будем редактировать файл с правилами button_click.lua
1 2 3 4 5 6 7 8 9 10 |
-- buttom_click.lua dofile("/int/myfunction.lua") -- подключаем файл с функциями local name=Event.FriendlyName local btn=zigbee.value(tostring(Event.ieeeAddr), "action") -- событие кнопки if (f_name=="Button01" and btn=="double_right") then Curtain_down("Curtain01") elseif (f_name=="Button01" and btn=="double_left") then Curtain_up("Curtain01") elseif (f_name=="Button01" and btn=="single_left") then zigbee.set("Dimmer01", "state_l1", "TOGGLE") elseif (f_name=="Button01" and btn=="single_right") then zigbee.set("Dimmer01", "state_l2", "TOGGLE") end |
теперь всю автоматизацию добавляем в этот файл для всех выключателей.
UPD:
более изящный вариант:
файл myfunction.lua имеет одну функцию
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 |
-- btn_name - Имя выключателя -- btn_state - статус команды (single, double ...) -- type - тип устройства которое управляется (Switch, Curtain) -- obj_name - имя устройства которым управлять -- obj_status - статус свойства (для Curtain - UP, DOWN, TOGGLE) -- obj_state - имя свойства (для Curtain не используется) function switch (btn_name, btn_state, type, obj_name, obj_status, obj_state) local name=Event.FriendlyName -- имя выключателя который нажат local btn=zigbee.value(tostring(Event.ieeeAddr), "action") -- событие кнопки if (name==btn_name and btn==btn_state) then if type == "Switch" then zigbee.set(obj_name, obj_state, obj_status) end if type == "Curtain" then if obj_status=="UP" then zigbee.get(obj_name, "moving") local moving = zigbee.value(obj_name, "moving") if (moving=="UP" or moving=="DOWN") then zigbee.set(obj_name, "state", "STOP") else zigbee.set(obj_name, "state", "UP") end end if obj_status=="DOWN" then zigbee.get(obj_name, "moving") local moving = zigbee.value(obj_name, "moving") if (moving=="UP" or moving=="DOWN") then zigbee.set(obj_name, "state", "STOP") else zigbee.set(obj_name, "state", "DOWN") end end if obj_status=="TOGGLE" then zigbee.get(obj_name, "moving") local moving = zigbee.value(obj_name, "moving") zigbee.get(obj_name, "position") local position = zigbee.value(obj_name, "position") if (moving=="UP" or moving=="DOWN") then zigbee.set(obj_name, "state", "STOP") else if (position==0) then zigbee.set(obj_name, "state", "UP") else zigbee.set(obj_name, "state", "DOWN") end end end end end end |
файл button_click.lua будет выглядеть следующим образом:
1 2 3 4 5 6 7 |
-- buttom_click.lua dofile("/int/myfunction.lua") -- подключаем файл с функциями switch("Button01", "double_right", "Curtain", "Curtain01", "UP") switch("Button01", "double_left", "Curtain", "Curtain01", "DOWN") switch("Button01", "single_left", "Switch", "Dimmer01", "TOGGLE", "state_l1") switch("Button01", "single_right", "Switch", "Dimmer01", "TOGGLE", "state_l2") |
button_click.lua делает то же самое что и в верхнем примере, но теперь более изящный код и удобнее добавлять новые автоматизации, можно ещё модернизировать код, определять тип по наличию пятого параметра, тем самым убрать третий параметр «тип»