Skip to content

Использование GPIO на примерах решаемых задач

GPIO входы 6-ти канального модуля расширения SLS DIN MINI легко могут быть использованы для решения типовых задач. Рассмотрим типовые методы использования на примерах.

Концевик (геркон) ворот / калитки / датчика затопления емкости септика

В данном примере SLS DIN MINI считывает состояние GPIO, направляет уведомление об изменении состояния в telegram, отправляет измененное состояние объекта в mqtt, средствами Home-Assistant отправляет в telegram снапшот с камеры.

  1. Убедимся, что DIP-перемычки нужных портов находятся в положении IN (нижнее положение). Порты модуля расширения в режиме IN срабатывают при замыкании входа на GND. Необходимые порты соединяем с GND (выходом "-") блока питания, второй полюс концевиков соединяем с соответствующими портами модуля ввода-вывода. В нашем примере подключены герконы калитки (вход 2) и откатных ворот (вход 4).
  2. В Web-интерфейсе SLS на вкладке Actions, если еще не создан, необходимо создать файл init.lua, этот скрипт выполняется при старте контроллера. Далее необходимо указать порты, которые будут в режиме чтения. Для интеграции с Home-Assistant, можно создать объект, который при изменении gpio будет менять свое состояние. Пример скрипта init.lua
lua
gpio.addInput(25, gpio.INPUT, 2, "input2")      -- задаем режим работы входа 2 для GPIO32 контроллера (калитка)
gpio.addInput(27, gpio.INPUT, 2, "input4")      -- задаем режим работы входа 4 для GPIO32 контроллера (ворота)
obj.setOpt('vorota','STR',true)                 -- создаем объект с состоянием отслеживаемого объекта
obj.setOpt('kalitka','STR',true)                -- создаем объект с состоянием отслеживаемого объекта
obj.onChange('io.input2.value', 'vorota.lua')   -- задаем имя скрипта, которое будет запускаться при изменении значения входа
obj.onChange('io.input4.value', 'vorota.lua')   -- задаем имя скрипта, которое будет запускаться при изменении значения входа
gpio.addInput(25, gpio.INPUT, 2, "input2")      -- задаем режим работы входа 2 для GPIO32 контроллера (калитка)
gpio.addInput(27, gpio.INPUT, 2, "input4")      -- задаем режим работы входа 4 для GPIO32 контроллера (ворота)
obj.setOpt('vorota','STR',true)                 -- создаем объект с состоянием отслеживаемого объекта
obj.setOpt('kalitka','STR',true)                -- создаем объект с состоянием отслеживаемого объекта
obj.onChange('io.input2.value', 'vorota.lua')   -- задаем имя скрипта, которое будет запускаться при изменении значения входа
obj.onChange('io.input4.value', 'vorota.lua')   -- задаем имя скрипта, которое будет запускаться при изменении значения входа
  1. Пример скрипта vorota.lua
lua
if Event.Type == 2 then                             -- тип события, вызываемого при изменении объекта
  local Name = Event.Obj.Name                       -- имя объекта, который  вызвал скрипт
  local Value = Event.Obj.Value                     -- текущее значение объекта
  local OldValue = Event.Obj.OldValue               -- предыдущее значение объекта
  local vorota = gpio.read(27)                      -- получим состояние GPIO в моменте
  local kalitka = gpio.read(25)                     -- получим состояние GPIO в моменте
  local sunset_hour, sunset_min = os.sunset()       -- задаем время заката
  local sunrise_hour, sunrise_min = os.sunrise()    -- задаем время рассвета

  if vorota == 1 and Name== "io.input4.value" then
    telegram.send("Открываются уличные ворота")
    obj.set("vorota", "open")
  end
  if vorota == 0  and Name== "io.input4.value"then
    obj.set("vorota", "close")
    telegram.send("Уличные ворота закрыты") 
  end
  if kalitka == 1 and Name== "io.input2.value" then
    telegram.send("Калитка открыта")
    obj.set("kalitka", "open")
  end
  if kalitka == 0  and Name== "io.input2.value"then
    obj.set("kalitka", "close")
    telegram.send("Калитка закрыта") 
  end
  --свет включаем для любого из вариантов
  if (Event.Time.hour >= sunset_hour and Event.Time.min >= sunset_min) or (Event.Time.hour<= sunrise_hour and   Event.Time.min<=sunrise_min) then
    zigbee.set("0x00124B001EC83D62", "state_l5", "ON")
    zigbee.set("0x00124B001EC83D62", "state_l3", "ON")
  end
end
if Event.Type == 2 then                             -- тип события, вызываемого при изменении объекта
  local Name = Event.Obj.Name                       -- имя объекта, который  вызвал скрипт
  local Value = Event.Obj.Value                     -- текущее значение объекта
  local OldValue = Event.Obj.OldValue               -- предыдущее значение объекта
  local vorota = gpio.read(27)                      -- получим состояние GPIO в моменте
  local kalitka = gpio.read(25)                     -- получим состояние GPIO в моменте
  local sunset_hour, sunset_min = os.sunset()       -- задаем время заката
  local sunrise_hour, sunrise_min = os.sunrise()    -- задаем время рассвета

  if vorota == 1 and Name== "io.input4.value" then
    telegram.send("Открываются уличные ворота")
    obj.set("vorota", "open")
  end
  if vorota == 0  and Name== "io.input4.value"then
    obj.set("vorota", "close")
    telegram.send("Уличные ворота закрыты") 
  end
  if kalitka == 1 and Name== "io.input2.value" then
    telegram.send("Калитка открыта")
    obj.set("kalitka", "open")
  end
  if kalitka == 0  and Name== "io.input2.value"then
    obj.set("kalitka", "close")
    telegram.send("Калитка закрыта") 
  end
  --свет включаем для любого из вариантов
  if (Event.Time.hour >= sunset_hour and Event.Time.min >= sunset_min) or (Event.Time.hour<= sunrise_hour and   Event.Time.min<=sunrise_min) then
    zigbee.set("0x00124B001EC83D62", "state_l5", "ON")
    zigbee.set("0x00124B001EC83D62", "state_l3", "ON")
  end
end