SLS шлюз. Делаем управление кнопкой LED

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
Код обрабатывает на следующие нажатия кнопки: одиночное, двойное, тройное, четырехкратное и долгое
Одиночное: включает с ранее заданной яркостью и эффектом / выключает светодиоды  (переходит в режим AUTO)
Двойное: изменяет яркость с шагом 20
Тройное: включает сопряжение (решил сделать как у шлюзов xiaomi)
Четырех кратное: отключить эффекты
Пять нажатий: переключить цвет
Долгое нажатие: переключить эффектыПри желании можно сделать код под себя, например добавить пятикратное, шестикратное и т.д. нажатие, посмотреть код нажатия можно в меню Log, вот строка из log, кнопка нажата была 34 раза подряд, я на 34 нажатия запрограммировал отключение экрана монитора у компьютера
 [19:09:53.310] [D] ObjSet io.input0.value = many_34
SLS шлюз. Делаем управление кнопкой LED

Навигация по записям