Корзина пуста

Одновременное управление несколькими устройствами без использования цикла

По старинке

Допустим, у нас есть несколько диммеров, которые надо синхронно выставить на определенное значение. Первое, что приходит в голову, просто циклом перебрать их все и для каждого из них задать это значение.

local id = {10,20,32,65}; 
local lightLevel = 50; 
for i = 1, #id do 
  fibaro:call(id[i], "setValue", lightLevel); 
end

Все более-менее просто и понятно, но подходит для перебора устройств только по ID, то есть нам их надо заранее знать.

А как красивее?

Для гибкого решения подобных задач, в Lua API от Fibaro есть интересная, но, к сожалению, малоописанная функция: fibaro:callGroupAction(action, filters). Она позволяет группировать исполнительные устройства по какому-либо признаку и выполнять команду (action) сразу на них всех.

action — это строковая переменная, обозначающая, собственно, команду, какую надо выполнить. Например, "setValue" для диммера или "turnOff" для реле.

filters — более сложный для понимания параметр. Это массив, в котором, в определенном формате должен быть записан принцип объединения в группу, а так же значение выполяемой action-команды.

Звучит малопонятно, поэтому лучше всего разобрать это на примерах.

Пример 1. Выключить все реле в доме.

local dataFilter =
{
  args = nil,
  filters =
  {
    {
      filter = "type",
      value = { "com.fibaro.binarySwitch" }
    }
  }
}
local devices = fibaro:callGroupAction("turnOff", dataFilter);
fibaro:debug(json.encode(devices));

args — дополнительные аргументы выполняемй команды (например, яркость для диммера). В данном случае их нет, поэтому nil.

filter — принцип группирования. В данном случае "type", то есть по типу устройств. Другие варианты, например: "deviceID" (по ID устройств), roomID (по ID комнаты) и т.п. Более подробную информацию смотрите в API.

value — значение для фильтра. В нашем случае, когда отбираем по типу устройства, это "com.fibaro.binarySwitch" — такой тип имеют все двойные реле в системе.

Результатом выполения этой команды будет выключение всех двойных реле в системе. Это удобно для использования в сценарии "нет дома". Нет необходимости выбирать все ID и, в случае добавления новых реле, не придется исправлять сценарий.

Пример 2. Установить яркость всех диммеров в доме на 50%

local dataFilter =
{
  args = { 50 },
  filters =
  {
    {
      filter = "baseType",
      value = { "com.fibaro.multilevelSwitch" }
    }
  }
}
local devices = fibaro:callGroupAction("setValue", dataFilter);
fibaro:debug(json.encode(devices));

В этом примере, команда "setValue" подразумевает дополнительный параметр — на какой уровень выставить яркость. Этот уровень записывается как массив (состоящий из одного элемента) в args. Фильтр "baseType" в отличие от "type", определяет, как понятно из названия, базовый тип, в данном случае диммер ("com.fibaro.multilevelSwitch"), то есть команда будет применена ко всем диммерам в системе, любой модели и любого производителя.

И напоследок. В окне дебаггера через запятую будут выводиться ID устройств, на коротые распространилась выполненная команда.

Вопросы и замечания пишите в комментарии.

Добавить комментарий

Возникли вопросы?