В этой статье вы узнаете основы создания сцен для контроллера Home Center 2 с использованием языка программирования Lua.

В контроллере Fibaro для написания кода сцен используется язык программирования Lua. С полным описанием синтаксиса этого языка можно ознакомиться по ссылке http://www.lua.org/manual/5.1.

Создание новой сцены LUA

Для создания сцен, на программном языке LUA необходимо:

Окно создания новой сцены:

Программный код сцены вводится в окне редактирования.

В Lua строки кода пишут также как и в других языках программирования сверху вниз и перенос строки не разделяет код, а используется только для форматирования и для лучшего восприятия. В отличии от многих других языков Lua не требует завершать строки кода точкой с запятой и игнорирует этот символ.

Код каждой сцены должен обязательно начинаться с заголовка:

--[[
%% properties
%% globals
--]]

В заголовке определяются триггеры сцены, после "%% properties” перечисляют свойства устройств, а после “%% globals” - глобальные переменные. Более подробно рассмотрим это далее.

Типы устройств

Для программирования сцены очень важно знать тип устройства с которым планируется работать. В контроллере Fibaro Home Center выделяет следующие типы устройств:

  • binary_light - реле, устройство включения/выключения света и т.д.
  • termostat_setpoint - термостат
  • dimmable_light - устройство управления яркостью света
  • blind -устройство для управления электроприводом
  • rgb_driver - устройство управления цветом RGB/RGBW
  • virtual_device - виртуальное устройство
  • HC_user - пользователь Fibaro Home Center
  • motion_sensor - датчик движения
  • door_sensor - датчик открытия двери
  • window_sensor - датчик открытия окна
  • smoke_sensor - датчик дыма
  • water_sensor - датчик протечки
  • ip_Camera - IP-видеокамера
  • iOS_device - мобильное устройство

Пользователь контроллера Home Center определяется тоже как тип устройства для единообразного подхода к считыванию его свойств, отправки ему сообщений, таким же образом как и с другими устройствами.

В интерфейсе Fibaro Home Center 2 все доступные устройства характеризуются:

  • deviceID - уникальный номер устройства в Home Center базе данных 2
  • type - тип устройства (например, binary_light или smoke_sensor)
  • properties - свойства устройства (например, value, dead)
  • actions - действия, которые можно выполнить с устройством (например, для типа binary_light доступны действия turnOn и turnOff (включить и выключить), для типа dimmer_light доступно действие SetValue (установить уровень яркости)).

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

Примеры сцен

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

Сцена 1

Создадим сцену, которая будет просто включать устройство.

Для выполнения действия с устройством обычно используется функция fibaro:call.

Функция имеет по крайней мере два аргумента:

  • deviceID - идентификатор устройства ID
  • actionName - действие, которые требуется выполнить с устройством (например, turnOn - включить устройство, turnOff - выключить)

Предположим, у вас есть реле с идентификатором устройства равным 2, подключенное к освещению. Для включения света необходимо написать следующий код:

--[[
%% properties
%% globals
--]]

 fibaro:call(2, 'turnOn') --подаем команду на выполнение действия включить

Наша первая простая программа состоит из заголовка и самого текста сцены. В этом коде устройству с идентификатором 2, отправляется команда “Включить”.

Фраза “--подаем команду на выполнение действия включить” игнорируется при выполнении скрипта, так как этот участок кода помечен как комментарий символами “--”. Комментарии очень полезны при дальнейшем анализе кода.

Чтобы запустить выполнение сцены, необходимо предварительно сохранить её (кнопка “Сохранить”), а затем вы можете запустить её, нажав на кнопку "Начать". При этом сцена будет выполнена один раз.

Сцена 2

Далее создадим сцену, которая включает устройство и выключает его через 3 секунды.

Для включения и выключения инструкции мы можем использовать функцию fibaro:call. Для задержки выключения света используем функцию fibaro:sleep. В качестве параметра в эту функцию передается время задержки в миллисекундах.

--[[
%% properties
%% globals
--]]

 fibaro:call(2, 'turnOn') –- включаем устройство
 fibaro:sleep(3000) -- ожидание 3 сек
 fibaro:call(2, 'turnOff') –- выключаем устройство

Как и прежде сверху располагается стандартный заголовок и далее основной текст сцены. Эта сцена включит устройство с идентификатором 2, затем через паузу 3 секунды, выключит это устройство.

Сцена 3

Часто при создании сцен требуется находить ошибки, возникающие при написании кода. Основным механизмом для этого почти во всех языках программирования является отладчик. Отладчик является очень полезным инструментом для поиска, уменьшения количества ошибок и позволяет находить точное место выполнения скрипта.

Для языка Lua в контроллере Fibaro тоже есть отладчик. Функция отладки для сцен в контроллере Fibaro - fibaro:debug. Эта функция позволяет выводить диагностический текст в поле отладчика.

Создадим еще один сценарий, который использует механизм отладки:

--[[
%% properties
%% globals
--]]

 fibaro:call(2, 'turnOn') -- включаем устройство
 fibaro:debug('Устройство с идентификатором 2 включено!')
 fibaro:debug('Ожидаем 3 секунды...')
 fibaro:sleep(3000) -- ожидание 3 сек
 fibaro:debug('Теперь выключим устройство')
 fibaro:call(2, 'turnOff') -- выключаем устройство
 fibaro:debug('Выполнение кода успешно завершено')

Как это работает?

Сценарий выполняется построчно. Сначала проверяется код заголовка, а затем сценарий включает устройство. На следующем этапе отладчик показывает сообщение в отладчике 'Устройство с идентификатором 2 включено!' и 'Ожидаем 3 секунды...'. По истечении 3 секунд сценарий выполняет следующую строку, в которой выводится сообщение отладки 'Теперь выключим устройство' и затем выключается устройство. В конце кода сцены также выводим сообщение об успешном выполнении.

Как это можно использовать?

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

Сцена 4

На этом этапе вы узнаете, как установить значение устройству, имеющему не только два состояния “Включено” и “Выключено”.

Одно из самых популярных устройств - диммер (устройство для изменения яркости света), и частой задачей для него является установка определенного уровня яркости. В этом случае в коде сцены также будем использовать функцию fibaro:call. В аргументах функции, кроме идентификатора устройства и имени выполняемого действия, потребуется указать устанавливаемое значение яркости.

При установке уровня яркости 50% для диммера с идентификатором 5 синтаксис будет выглядеть следующим образом:

 fibaro:call(5, 'SetValue', '50')

Допустим, мы имеем следующие устройства в нашем доме:

  • реле (с deviceID 2)
  • диммер (с deviceID 5)

Пример сцены в этом случае будет выглядеть следующим образом:

--[[
%% properties
%% globals
--]]

 fibaro:debug(Старт выполнения программы')
 fibaro:debug('Включаем устройство с deviceID =2')
 fibaro:call(2, 'turnOn') –- включаем устройство
 fibaro:debug('Ожидаем 5 секунд')
 fibaro:sleep(5000) –- задержка 5 секунд
 fibaro:debug('Время задержки истекло, открываем шторы на 50%') 
 fibaro:call(10, 'setValue', '50') –- открываем шторы
 fibaro:debug('Шторы открыты, установим яркость освещения через 5 секунд на 75%') 
 fibaro:debug('Ожидаем 5 секунд)
 fibaro:sleep(5000) –- задержка 5 секунд
 fibaro:call(5, 'setValue', '75') –- устанавливаем яркость
 fibaro:debug(Уровень яркости установлен')
 fibaro:debug('Выключим все освещение')
 fibaro:call(2, 'turnOff')
 fibaro:call(5, 'turnOff')
 fibaro:debug('Закроем шторы') 
 fibaro:call(10, 'turnOff') –- закрываем шторы
 fibaro:debug('Выполнение кода успешно завершено')

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

Сцена 5

На следующем шаге узнаем как получать текущее значение свойств устройства.

Чтобы получить значение свойства устройства используется функция fibaro:getValue. В качестве аргументов функции передается идентификатор устройства и имя свойства.

Мы можем создать сцену, которая будет включать/выключать свет по сигналу от датчика двери.

Допустим, наш датчик открытия двери имеет deviceID 145. Тип такого устройства door_sensor. Датчик имеет несколько свойств, но на данном этапе, нас интересует только свойство "value".

--[[
%% properties
%% globals
--]]

 local myVar1 = fibaro:getValue(145, 'value') –-признак срабатывания датчика открытия присваиваем переменной myVar1
 fibaro:debug('Состояние датчика открытия двери = ' .. myVar1) –-выводим значение датчика
 local myVar2 = fibaro:getValue(2, 'value') –-получаем состояние реле
 fibaro:debug('value = ' .. myVar2) –-выводим значение состояние реле
 if (myVar1 == '1') then 
 if (myVar2 == '0') then
  fibaro:call(2, 'turnOn') 
 else
  fibaro:call(2, 'turnOff') 
 end 
 end 

Сцена будет работать следующим образом:

  1. в переменную MyVar1 записывается значение датчика
  2. выводим в окно отладки состояние датчика
  3. в переменную MyVar2 записывает состояние реле
  4. выводим в окно отладки состояние реле
  5. далее проверяет состояние проверяем состояние датчика двери, переключаем состояние света

Сцена 6

Во всех предыдущих сценах была одна общая особенность - они выполнялись только при ручном запуске. Чаще всего требуется чтобы сцены запускались автоматически при изменении состояний устройств. Для настройки автоматического запуска сцен мы должны описать триггер. Триггеры события, вызывающие запуск выполнения сцены.

Допустим, мы хотим создать сцену, которая будет включить свет (deviceID 3) в тот момент, когда датчик движения (deviceID 50) обнаружит движение. Код сцены будет выглядеть так:

 local myVariable –объявляем локальную переменную
 myVariable = fibaro:getValue(50, 'value')
 if (myVariable == '1') then
  fibaro:call(3, 'turnOn')
 end

Вопрос в том, как система поймет когда проверить состояние датчика движения?

Ответ: для этого необходимо указать триггер.

Триггер указывается в заголовке сцены и имеет следующий синтаксис: [deviceID] [property].

В нашем случае заголовок будет выглядеть так:

--[[
%% properties
50 value
%% globals
--]]

Таким образом, мы объявляем триггер для устройства deviceID = 50. С этого момента, каждый раз, когда значение свойства value устройства deviceID 50 изменится - будет запущено выполнение сцены.

Дополним код нашей сцены информацией о триггере:

--[[
%% properties
50 value
%% globals
–]]

 local myVariable –объявляем локальную переменную
 myVariable = fibaro:getValue(50, 'value')
 if (myVariable == '1') then
  fibaro:call(3, 'turnOn')
 end

Сцена будет работать следующим образом:

  1. Каждый раз при изменении значения свойства устройства с deviceID 50 (то есть при срабатывании датчика) - будет запущена сцена.
  2. Переменной myVariable мы присваиваем значение датчика движения.
  3. Если датчик будет сработает, то включить свет (DeviceID = 3).
Подсказка

Функции Lua в контроллере Fibaro Home Center 2 можно условно разделить по назначению на четыре группы:


Устройство в контроллере - понятие универсальное. Устройства разделяют по видам, каждый из которых поддерживает определенный перечень возможных действий. Информацию об этом можно прочитать тут.