Woof,
писал на бегу, поэтому надо проверить, отладить и причесать.
тестировать начинайте с больших значений (не менее Ваших 20 секунд)
Предисловие:
Сразу договоримся, что "XXX" - данные, "YYY" - номер сцены, а "ID" - номер устройства
ПОДГОТОВИТЕЛЬНАЯ РАБОТА:
1). Устанавливаем плагин Virtual Switch, кнопка "ON" будет у нас за "Работу", а "OFF" за "Сон"
Аналогичным образом можно установить MultiSwitch на 8 устройств сразу.
2). ЭТА ФУНКЦИЯ НЕОБЯЗАТЕЛЬНА И ПРИ НАЧАЛЬНОМ ТЕСТИРОВАНИИ ДОЛЖНА БЫТЬ ЗАМЕНЕНА НА ЗАПУСК СЦЕНЫ ОСНОВНОГО СКРИПТА (НИЖЕ) КАЖДЫЕ N Секунд.
Прописывание в Startup Lua следующего:
-- Функция, которая следит за изменением данных, как только данные меняются - "выстреливает" сцена.
-- таблица всех устройств, за которыми надо следить { "ServiceID", "VariableName", DeviceNo, SceneNo }
-- После запятой сможем прописывать нужное количество устройств в строках
watchTable = {
{"urn:micasaverde-com:serviceId:LightSensor1", "CurrentLevel", ID, YYY},
}
-- Устанавливаем слежку за переменными
--
function setWatch()
for n,t in ipairs(watchTable) do
luup.variable_watch("catchWatch",t[1],t[2],t[3])
end
end
--
-- При изменении данных, запускаем нужную сцену (здесь менять ничего не требуется)
--
function catchWatch(lul_device, lul_service, lul_variable, lul_value_old, lul_value_new)
for n,t in ipairs(watchTable) do
if ( (t[3] == lul_device) and (t[1] == lul_service) and (t[2] == lul_variable) ) then
luup.call_action("urn:micasaverde-com:serviceId:HomeAutomationGateway1", "RunScene", {SceneNum = t[4]}, 0)
end
end
end
-- делаем задержку на 30 секунд, пока контроллер не проинициализируется, после рестарта Lua Engine
luup.call_delay("setWatch",30)
ОСНОВНОЙ СКРИПТ (делаем сцену с запуском вручную или же каждые N-секунд в случае, если мы пропустили 2-ой пункт подготовительной работы):
-- прописываем понятия времени (вместо времени можно будет поставить "восход/заход солнца" или данные с плагина Heliotrope, указанные выше форумчанином aov, и т.п. есть над чем подумать):
local t = os.date('*t')
local current_time = t.hour * 3600 + t.min * 60 + t.sec
local Morning_Starts = 9 * 3600 + 00 * 60 -- Утро начинается в 9:00
local Evening_Starts = 20 * 3600 + 00 * 60 -- Вечер начинается в 20:00
-- прописываем Virtual Switch (наш переключатель Сон/Работа)
local VSwitch = luup.variable_get("urn:upnp-org:serviceId:VSwitch1", "Status", ID)
-- прописываем функции задержки на изменение
function rollTime()
local lightLevel = luup.variable_get("urn:micasaverde-com:serviceId:LightSensor1","CurrentLevel", ID)
local curlightlevel = tonumber(lightLevel)
local rollLevel = luup.variable_get("urn:upnp-org:serviceId:Dimming1", "LoadLevelStatus", ID)
local currollLevel = tonumber(rollLevel)
if (curlightlevel < XXX) then
luup.call_action("urn:upnp-org:serviceId:Dimming1", "SetLoadLevelTarget", {newLoadlevelTarget = "(currollLevel + 5)"}, ID)
luup.call_delay("rollTime",XXX)
elseif (curlightlevel > XXX) then
luup.call_action("urn:upnp-org:serviceId:Dimming1", "SetLoadLevelTarget", {newLoadlevelTarget = "(currollLevel - 5)"}, ID)
luup.call_delay("rollTime",XXX)
else return false
end
function dimTime()
local lightLevel = luup.variable_get("urn:micasaverde-com:serviceId:LightSensor1","CurrentLevel", ID)
local curlightlevel = tonumber(lightLevel)
if (curlightlevel < XXX) then
luup.call_action("urn:upnp-org:serviceId:Dimming1", "SetLoadLevelTarget", {newLoadlevelTarget = "(currollLevel + 5)"}, ID)
luup.call_delay("dimTime",XXX)
elseif (curlightlevel > XXX) then
luup.call_action("urn:upnp-org:serviceId:Dimming1", "SetLoadLevelTarget", {newLoadlevelTarget = "(currollLevel - 5)"}, ID)
luup.call_delay("dimTime",XXX)
else return false
end
-- прописываем основные условия работы 1-го этапа
if (VSwitch == "0") and (rollLevel == 0)
then return false
elseif (VSwitch == "0") and (rollLevel > 0)
then luup.call_action("urn:upnp-org:serviceId:WindowCovering1", "Down", {}, ID)
elseif (((current_time >= Morning_Starts) and (current_time <= Evening_Starts)) and ((curlightlevel < XXX) or (curlightlevel > XXX)))
then rollTime()
else return false
end
-- прописываем основные условия работы 2-го этапа
if ((VSwitch == "1") and ((current_time <= Morning_Starts) or (current_time >= Evening_Starts)) and ((curlightlevel < XXX) or (curlightlevel > XXX)))
then dimTime()
else return false
end