Поддержание постоянного уровня освещенности с мультидатчиком движения и диммером Fibaro
Z-wave Мультидатчик движения Fibaro имеет три сенсора в одном устройстве (четыре, если используете сейсмодатчик). Он отслеживает движение, температуру, а также уровень освещенности в комнате. Мы можем использовать показания освещенности в сочетании с микромодулем Fibaro диммер для поддержания определенного уровня освещенности в комнате.
Что необходимо?
Чтобы повторить действия, описанные в статье необходимо установить z-wave мультидатчик движения и диммер в Fibaro Home Center 2. Эти устройства должны быть размещены в одной комнате вашего дома.
Что мы будем делать?
Мы создадим две сцены на Lua. Наши сцены будут использовать глобальную переменную для передачи информации между ними. Одна из сцен будет контролировать кнопку выключателя света и переключение значения глобальной переменной каждый раз при его выключении.
Другая сцена будет работать непрерывно и контролировать значение датчика освещенности и диммер. Если глобальная переменная включена (1), то она будет увеличивать или уменьшать значение яркости диммера, чтобы попытаться поддержать постоянный уровень освещенности в комнате.
И так, приступим
При установке мультидатчика движения Fibaro, три устройства будут созданы в интерфейсе Fibaro Home Center 2:
Датчик движения
Температурный датчик
Датчик освещенности
Мы заинтересованы в 3-м устройстве.
По умолчанию, уровень освещенности в комнате должен измениться на 200lux для того, чтобы датчик сообщил об этом контроллеру. Нам необходимо уменьшить это значение, чтобы изменения освещенности были обнаружены более точно. Однако, имейте в виду, что чем ниже это значение, тем чаще устройство будет отправлять данные, и тем меньше будет срок службы батареи. Мы изменим его до значения 20lux, но это значение может не удовлетворить ваши цели, так что настроите его по своему усмотрению.
Изменение параметра "порог уровня освещенности"
Чтобы изменить "порог изменения уровня освещенности", выполните следующие действия:
Нажмите Devices в Главном меню.
Прокрутите вниз и найдите устройство датчика движения, которое необходимо изменить. Примечание: Так как нам необходимо изменить значение параметра, необходимо найти главное устройство, а не устройство с уровнем освещенности!
Нажмите значок гаечного ключа, расположенного в правом верхнем углу устройства, для перехода на страницу конфигурации устройства.
Перейдите на вкладку Advanced (Дополнительно).
Прокрутите три четверти страницы, пока не увидите Параметр 40.
Нажмите на белое число (200 по умолчанию) и измените его на 20.
Нажмите на кнопку Сохранить.
Датчик движения это спящее устройство, поэтому его необходимо разбудить для получения изменений конфигурации. Разбудить ваш датчик движения можно по тройному нажатию кнопки расположенной внутри корпуса.
Теперь ваш датчик движения будет сообщать об изменениях уровня освещенности комнаты, гораздо чаще, при изменение на 20lux.
Включение функции запуска сценариев (sceneActivation)
Мы также должны изменить параметр нашего диммера для включения sceneActivation. По умолчанию sceneActivation выключен, но эта функция позволяет определить, когда выключатель был нажат на устройстве. Мы будем использовать это для того, чтобы отследить, когда свет был выключен вручную (чтобы он автоматически не загорался ночью!).
Создание глобальной переменной
Глобальная переменная будет следить за состоянием светильника в комнате - включен он или выключен?
Если вы собираетесь управлять более чем одной комнатой, то вам нужно будет создать глобальные переменные для каждой комнаты. Имя глобальной переменной должно совпадать с именем комнате. В этой статье мы будем контролировать уровень света в офисе, поэтому назовем глобальную переменную OfficeLights.
Нажмите на кнопку Panels в главном меню.
Нажмите на кнопку Variables Panel в левом меню
В разделе объявления переменных , нажмите кнопку Add (Добавить).
В поле Variable Name, напишите OfficeLights
Нажмите на кнопку Сохранить.
Ваш глобальная переменная теперь создана и имеет значение по умолчанию 0.
Создание сцен - часть 1
Теперь мы создадим сцену на Lua для контроля за состоянием кнопки переключателя диммера и переключение глобальной переменной, которую мы создали, чтобы отразить соответствующее состояние света. Это важно, поскольку в противном случае, после создания сцены изменения значения яркости диммера на основе уровня освещенности, сцена переопределит наше желание выключить свет - и ночью свет всегда будет включен по полной!
Нажмите на кнопку Scenes в главном меню.
Нажмите Add Scene (Новая сцена) в левом меню.
Задайте имя новой сцене (switch monitor, например) и ассоциируете с комнатой.
Нажмите на вкладку Advanced (Дополнительно).
Нажмите кнопку Save (Сохранить) расположенную под Add scene in Lua.
Скопируйте следующий код в вашу сцену, заменив блок комментарии, который создается автоматически:
1
--[[
2
%% properties
3
328 sceneActivation
4
%% globals
5
--]]
6
7
--[[
8
9
Light switch state monitor
10
11
This scene has been created by and is copyright (c) 2014, Fibaro UK Ltd
12
13
http://www.FibaroUK.co.uk/
14
15
You may use this scene for personal or commercial purposes however
16
please respect our intellectual property and leave this comment block intact
17
and unmodified.
18
19
]]
20
21
-- VERSION 1.0
22
-- change log at bottom of scene
23
24
--[[
25
26
This scene uses a global variable to monitor the status of a switch. You must
27
create the global variable in panels->variables in order to use this scene.
28
By default the global variable should be called 'OfficeLights' but this
29
can be changed if this scene is used in a different location and MUST be
30
changed if the scene is duplicated for use in different rooms.
31
32
]]
33
34
-- Change this value to meet your requirements
35
local lampID = 328 -- the device ID of the dimmer to be monitored
36
-- don't forget to change the number in the triggers
37
-- section at the top too!
38
39
-- get the value of the global variable and the dimmer switch's sceneActivation
40
local ol = fibaro:getGlobalValue('OfficeLights')
41
local sa = fibaro:getValue(lampID, 'sceneActivation')
42
43
if (sa == '16') then -- if the switch is clicked once...
44
if (ol == '1') then -- if the global variable is 1
45
fibaro:setGlobal('OfficeLights', '0') -- make it 0
46
else -- otherwise
47
fibaro:setGlobal('OfficeLights', '1') -- make it 1
48
end
49
end
50
51
--[[
52
53
Change log
54
55
1.0
56
- Initial release
57
58
]]
Изменить значение переменной LampID (строка 35), на ID вашего диммера.
Измените trigger ID (on line 3), на ID вашего диммера.
Нажмите кнопку Сохранить в правой части страницы.
Эта сцена начнет работать немедленно. Ее единственная работа, изменять значение глобальной переменной, когда переключатель нажат. Если он равен 1, то станет 0. Если он равен 0, то станет 1.
Создание сцен - часть 2
Теперь мы создадим сцену на Lua, для контроля за уровнем освещенности и увеличения или уменьшения значения яркости диммера по мере необходимости.
Нажмите на кнопку Scenes в главном меню.
Нажмите Add Scene (Новая сцена) в левом меню.
Задайте имя новой сцене (switch monitor, например) и ассоциируете с комнатой.
Нажмите на вкладку Advanced (Дополнительно).
Нажмите кнопку Save (Сохранить) расположенную под Add scene in Lua.
Скопируйте следующий код в вашу сцену, заменив блок комментарии, который создается автоматически:
1
1. --[[
2
%% properties
3
%% autostart
4
%% globals
5
--]]
6
7
--[[
8
9
Light level monitor
10
11
This scene has been created by and is copyright (c) 2014, Fibaro UK Ltd
12
13
http://www.FibaroUK.co.uk/
14
15
You may use this scene for personal or commercial purposes however
16
please respect our intellectual property and leave this comment block intact
17
and unmodified.
18
19
]]
20
21
-- VERSION 1.0
22
-- change log at bottom of scene
23
24
--[[
25
26
This scene uses a global variable to monitor the status of a switch. You must
27
create the global variable in panels->variables in order to use this scene.
28
By default the global variable should be called 'OfficeLights' but this
29
can be changed if this scene is used in a different location and MUST be
30
changed if the scene is duplicated for use in different rooms.
31
32
]]
33
34
-- Change these values to meet your requirements
35
local setLevel = 300 -- the lux level that should be maintained
36
local hysteresis = 40 -- the amount of leeway allowed either side of setLevel
37
-- this stops the light pulsing
38
local luxID = 327 -- the device ID of the light sensor
39
local lampID = 328 -- the device ID of the dimmer to be controlled
40
local changeDelay = 100 -- the speed at which the dimmer will change value
41
-- larger = slower
42
43
-- Only allow one instance of the current scene to run at a time
44
if (fibaro:countScenes() > 1) then
45
fibaro:abort()
46
end
47
48
-- Keep doing this forever!
49
while true do
50
-- Get the value of the global variable. 1 = on, 0 = off
51
local lightsOn = tonumber(fibaro:getGlobalValue('OfficeLights'))
52
-- Read the values of the dimmer and light sensor
53
local lampValue = tonumber(fibaro:getValue(lampID, 'value')) -- dimmer
54
local level = tonumber(fibaro:getValue(luxID, "value")) -- light level
55
56
-- If the light level is lower than what we want then...
-- Otherwise the light level must be correct (give of take the leeway)...
83
else
84
fibaro:debug('Lux: ' .. level .. ' (ok)')
85
fibaro:sleep(1000)
86
end
87
end
88
89
--[[
90
91
Change log
92
93
1.0
94
- Initial release
95
96
]]
Измените локальные переменные (начиная со строки 35), таким образом чтобы сцена работала в соответствии с настройками вашей системы. Обратите особое внимание на luxID и lampID. Они должны соответствовать ID устройств вашего датчика освещенности и диммера соответственно.
Нажмите кнопку Сохранить в правой части страницы.
Как это работает?
В верхней части сцены вы видите строку: %% autostart
Это приводит к тому что сцена начнет работать как только Home Center 2 загрузится (или сразу же после сохранения сцены).
Следующие строки позволят сцене запуститься только один раз, (на всякий случай, чтобы случайно не запустить еще раз вручную):
if (fibaro:countScenes() > 1) then
fibaro:abort()
end
Как только сцена заработает, начнется (со строки 50) бесконечный цикл, который постоянно вызывает оставшуюся часть сцены.
Шаги в этом бесконечном цикле следующие:
Строки 52-55:
Получение значений глобальной переменной, диммера и датчика освещенности
Строки 58, 71 и 84 :
Проверяем куда попадает текущий уровень освещенности, ниже заданного диапазона, выше заданного диапазона или внутрь диапазона. Каждое из этих условий имеет связанный с ним блок кода.
Если он ниже, то увеличиваем яркость лампы на 1 (при условии, что света еще не полностью включен)
Если он выше, то уменьшаем яркость лампы на 1 (при условии, что свет еще не полностью выключен)
Если внутрь, то делаем паузу на секунду.
В строках 64 и 77 устанавливаются новые значения яркости диммера. Новое значение умножается на значение глобальной переменной. Это будет либо 1 или 0. Таким образом, если свет должен быть выключен, значение диммера будет установлено в 0.
Заключение
Есть несколько факторов, которые влияют на выбор значений параметров в сцене:
Изменение в уровне освещенности при котором датчик будет отсылать сообщение (параметр 40 датчика движения). Чем меньше значение, тем точнее будут данные датчика соответствовать действительности, но быстрее сядет батарея.
Значение setLevel (строка 35 в основной сцене). Комфортное значение будет отличаться в разных местах. Необходимо тестировать сцену для подбора наиболее благоприятного значения..
Значение hysteresis (Строка 36 в основной сцене). Позволит определить диапазон значений вокруг setLevel который сцена будет рассматривать «достаточно близким» к целевому. Чем больше это значение, тем меньше свет будет пульсировать, для поддержания заданного уровня освещенности. Однако, если уровень слишком большой, освещенность в комнате будет прыгать с одного уровня на другой.