Задача: включать\выключать уличное освещение (и\или выполнять иное действие) с наступлением сумерек.
Необходимые условия:
- установленный модуль "Погода от OpenWeather" (из его данных будем брать координаты местности и прогноз облачности в %),
- установленный модуль "Cron" (для запуска нашего сценария в определенное время).
Некоторые замечания:
- вычисление восхода\заката\сумерек производится в Формате Unix Time то есть в секундах,
- модуль "Погода от OpenWeather" следует настроить на метод API "5 day / 3 hour Forecast" с периодом обновления каждый час, это нужно для того чтоб иметь чуть более точный прогноз на время, близкое к наступлению сумерек и времени включения\выключения DarknessMode,
- в примере используется широта\долгота Москвы, свои координаты можно посмотреть:
здесьПоказать
Итак, за основу возьмем сценарий упомянутый в самом начале. Сценарий вычисляет несколько параметров, как то: время восхода, время заката, время начала утренних сумерек и время конца вечерних сумерек. Расчет времени включения\выключения "тёмного режима" (DarknessMode) можно проводить по рассвету\закату либо по сумеркам, в предлагаемом примере расчет будет по сумеркам.
Можно заметить, что при облачности период времени когда темнеет\рассветает несколько сокращается, поэтому скорректируем это время с учётом прогноза облачности.
Предположим, наличие плотной облачности (100%) укорачивает длительность сумерек вдвое, значит сделаем так, что бы при облачности 100% время наступления\конца сумерек увеличивалось\уменьшалось на половину их протяженности, а в отсутствии облачности (0%) не изменялось. Вводим понятие "смещение", которое в случае утренних сумерек будет периодом от их начала до их середины (то есть первая их половина), а в случае вечерних сумерек будет периодом от их середины до их конца (то есть вторая их половина). Длительность этого "смещения" мы и будем корректировать в зависимости от облачности.
Для этого сделаем некоторые вычисления:
длительность утренних сумерек = время восхода - время начала утренних сумерек
длительность вечерних сумерек = время конца вечерних сумерек - время заката
период смещения утренних сумерек = длительность утренних сумерек / 2
период смещения вечерних сумерек = длительность вечерних сумерек / 2
Теперь выведем формулу вычисления смещения с учётом % облачности.
Если период смещения (половина длительности сумерек) 10 минут, то есть 600 секунд, а облачность в % (здесь берётся из OpenWeather: gg('ow_fact.clouds') ), то:
при 100% облачности смещение = 600/100%*100% = 600 сек = 10 мин,
при 70% облачности смещение = 600/100%*70% = 420 сек - 7 минут,
при 50% облачности смещение = 600/100%*50% = 300 сек - 5 мин, и так далее.
Видно, что период смещения (600 сек) всегда делится на 100% (при условии облачности в процентах), отсюда получается что для периода смещения 10 минут достаточно процент облачности умножать на 6 (600/100=6), то есть %облачность*6.
Назовем период смещения делённый на 100% - коэффициентом облачности.
То есть коэффициент облачности = период смещения / 100.
Таким образом получается следующая формула: смещение = %облачности * коэффициент облачности.
Утренние сумерки при наличии облачности начнутся позже расчетного времени на величину смещения.
Вечерние сумерки при наличии облачности закончатся раньше расчетного времени на величину смещения.
Далее вычисляем время включения\выключения режима DarknessMode с учётом смещения, зависимого от облачности:
время включения DarknessMode = врем конца вечерних сумерек - смещение
время выключения DarknessMode = время начала утренних сумерек + смещение
Для включения\выключения DarknessMode будем создавать запланированную задачу (AddScheduledJob) с вычисленным временем срабатывания.
В панели управления \ объекты \ сценарии создадим несколько сценариев:
1. сценарий вычисления восхода\заката\сумерек\смещения, назовем его voshod-zakat:
Код: Выделить всё
//$lat=gg('ThisComputer.latitude'); // широта
//$long=gg('ThisComputer.longitude'); // долгота
$lat= 55.7522; // широта Москвы
$long= 37.6156; // долгота Москвы
$sun_info = date_sun_info(time(), $lat, $long);
foreach ($sun_info as $key => $val) {
// Восход
if ($key == 'sunrise') {
$sunrise = $val;
setGlobal('ThisComputer.SunRiseTime',date("H:i", $val));
}
// Закат
if ($key == 'sunset') {
$sunset = $val;
setGlobal('ThisComputer.SunSetTime',date("H:i", $val));
AddScheduledJob("job_sunset_say","say('Солнце заходит',1);", $val); // создаём задачу голосового оповещения
}
// Долгота дня
//$day_length = $sunset - $sunrise;
//setGlobal('ThisComputer.LongTag',gmdate("H:i", $day_length));
//}
// Зенит
//if ($key == 'transit') {
//setGlobal('ThisComputer.SunTransitTime',date("H:i", $val));
//}
// Начало утренних сумерек
if ($key == 'civil_twilight_begin') {
$sumerki_u = $val;
setGlobal('ThisComputer.civil_twilight_begin',date("H:i", $val));
//$polsum_u = ($sunrise-$sumerki_u)/2; // определяем длительность периода утреннего смещения (половина утренних сумерек)
//$k_u = $polsum_u/100; // Коэффициент облачности
$k_u = ($sunrise-$sumerki_u)/2/100; // Коэффициент облачности одной строкой
$dark_off_time = $val+gg('ow_fact.clouds')*$k_u; // определяем утреннее смещение, gg('ow_fact.clouds') - облачность из OpenWeather
AddScheduledJob("job_DarkMode_OFF","cm('DarknessMode.deactivate');", $dark_off_time); // создаём задачу выключения DarknessMode
}
// Конец вечерних сумерек
if ($key == 'civil_twilight_end') {
$sumerki_v = $val;
setGlobal('ThisComputer.civil_twilight_end',date("H:i", $val));
//$polsum_v = ($sumerki_v-$sunset)/2; // определяем длительность периода вечернего смещения (половина вечерних сумерек)
//$k_v = $polsum_v/100; // Коэффициент облачности
$k_v = ($sumerki_v-$sunset)/2/100; // Коэффициент облачности одной строкой
$dark_on_time = $val-gg('ow_fact.clouds')*$k_v; // определяем вечернее смещение, gg('ow_fact.clouds') - облачность из OpenWeather
AddScheduledJob("job_DarkMode_ON","cm('DarknessMode.activate');", $dark_on_time); // создаём задачу включения DarknessMode
}
}
Код: Выделить всё
say('Включён свет во дворе',1);
callMethod('Switch3.turnOn');
3. Сценарий для момента выключения DarknessMode, назовем его OFF_for_darkness.mode
Код: Выделить всё
say('Свет во дворе выключен',1);
callMethod('Switch3.turnOff');
В панели управления \ объекты \ OperationalModes \ DarknessMode \ методы:
1. в методе activate для DarknessMode добавляем строку:
Код: Выделить всё
runScript('ON_for_darkness.mode');
2. в методе deactivate для 'DarknessMode добавляем строку:
Код: Выделить всё
runScript('OFF_for_darkness.mode');
Теперь в модуле Cron создадим 2 расписания:
- выполнение скрипта voshod-zakat в 16:00 (в это время имеем самый свежий прогноз облачности на 18:00 часов вечера)
- выполнение скрипта voshod-zakat в 4:00 (в это время имеем самый свежий прогноз облачности на 6:00 часов утра)