SLS шлюз это пожалуй на сегодня самый оптимальны zigbee шлюз если нет желания разбираться с системами на raspberrypi и т.п. На сегодня поддерживает около 250 zigbee устройств разных производителей и новые устройства постоянно добавляются. На мой взгляд не так много статей по его настройке, да wiki имеется и достаточно не плохой, но на мой взгляд мало совсем для чайника. Я попытаюсь внести в это небольшой вклад. Я собрал свой SLS шлюз на базе корпуса от ночника фирмы EGLO с артиклем 92964, стандартная кнопка и 4 светодиода ws2812, вот всё что удалось поместить внутрь, именно про кнопку и светодиоды и пойдет речь.
Настройки стандартные исторически сложились, я не стал что то менять, единственное надо задать количество светодиодов, в меню Settings — Hardware настройки кнопки и светодиодов
справа вверху нажимаем меню Actions — Files и редактируем файл init.lua (если нет то создаем файл с именем init.lua) и добавляем туда следующий код
-- инициализация кнопки obj.setScript("io.input0.value", "btn_sw1.lua", true) gpio.addInput(33, gpio.INPUT_PULLUP, 2, "input0") obj.setType("led1y","INT") obj.setType("led1e","INT") obj.setType("led1r","INT") obj.setType("led1g","INT") obj.setType("led1b","INT") obj.setType("led1c","INT") obj.set("led1y", 255) obj.set("led1e", 0) obj.set("led1r", 255) obj.set("led1g", 255) obj.set("led1b", 255) obj.set("led1c", 0) -- цвет светодиода -- статус светодиода автоматически os.led("AUTO")
обратите внимание на строку
obj.setScript("io.input0.value", "btn_sw1.lua", true)
без значения true будут выполняться только другие события кнопки, если нажать подряд 2 раза например двойное нажатие то второй раз команда не будет выполнена.
Далее создаем файл btn_sw1.lua который будет запускаться при нажатиях на кнопку и вставим туда следующий код
-- нажатие кнопки if Event.Obj.Value == "single" then -- однократное нажатие кнопки if obj.get("led1") == "ON" then obj.set("led1", "AUTO") os.led("AUTO") else obj.set("led1", "ON") effect = obj.get("led1e") os.led("ON",obj.get("led1y"),obj.get("led1r"),obj.get("led1g"),obj.get("led1b"),effect) end elseif Event.Obj.Value == "double" then -- двухкратное нажатие кнопки if obj.get("led1") == "ON" then bri = obj.get("led1y") bri = bri + 20 if bri > 250 then bri = 20 end obj.set("led1y", bri) os.led("ON",obj.get("led1y"),obj.get("led1r"),obj.get("led1g"),obj.get("led1b"),0) end elseif Event.Obj.Value == "triple" then -- трехкратное нажатие кнопки os.led("AUTO") zigbee.join(250, "0x0000") elseif Event.Obj.Value == "hold" then -- долгое нажатие кнопки effect = obj.get("led1e") + 1 if effect == 63 then effect = 0 end obj.set("led1e", effect) os.led("ON",obj.get("led1y"),-1,-1,-1,effect) elseif Event.Obj.Value == "quadruple" then -- 4 нажатие кнопки obj.set("led1e", 0) os.led("ON",obj.get("led1y"),-1,-1,-1,0) elseif Event.Obj.Value == "many_5" then -- 5 нажатий кнопки obj.set("led1e", 0) color=obj.get("led1c") + 1 if color > 10 then color = 0 end obj.set("led1c", color ) if color == 0 then led = { r = 255, g = 255, b = 255} elseif color == 1 then led = { r = 255, g = 0, b = 0} elseif color == 2 then led = { r = 0, g = 255, b = 0} elseif color == 3 then led = { r = 0, g = 0, b = 255} elseif color == 4 then led = { r = 255, g = 0, b = 255} elseif color == 5 then led = { r = 0, g = 255, b = 255} elseif color == 6 then led = { r = 255, g = 255, b = 0} elseif color == 7 then led = { r = 128, g = 128, b = 255} elseif color == 8 then led = { r = 255, g = 128, b = 128} elseif color == 9 then led = { r = 128, g = 255, b = 128} else led = { r = 128, g = 0, b = 255} end obj.set("led1r", led.r) obj.set("led1g", led.g) obj.set("led1b", led.b) os.led("ON",obj.get("led1y"),led.r,led.g,led.b,0) else return end
Двойное: изменяет яркость с шагом 20
Тройное: включает сопряжение (решил сделать как у шлюзов xiaomi)
Пять нажатий: переключить цвет
Долгое нажатие: переключить эффектыПри желании можно сделать код под себя, например добавить пятикратное, шестикратное и т.д. нажатие, посмотреть код нажатия можно в меню Log, вот строка из log, кнопка нажата была 34 раза подряд, я на 34 нажатия запрограммировал отключение экрана монитора у компьютера
[19:09:53.310] [D] ObjSet io.input0.value = many_34