[сценарий+] Вкл\откл DarkessMode по закату\восходу\сумеркам с учётом облачности. Конкретный пример реализации.

Не требует установки программ или изменения файлов

Модераторы: immortal, newz20

Ответить
Аватара пользователя
prmres
Сообщения: 345
Зарегистрирован: Пт ноя 24, 2017 2:24 am
Откуда: оттуда
Благодарил (а): 97 раз
Поблагодарили: 97 раз

[сценарий+] Вкл\откл DarkessMode по закату\восходу\сумеркам с учётом облачности. Конкретный пример реализации.

Сообщение prmres » Чт окт 14, 2021 1:30 pm

По мотивам тем: "ночной и дневной режим" и "[Сценарий] Вычисляем восход и заход солнца" и консультаций с ув.тов. Xor

Задача: включать\выключать уличное освещение (и\или выполнять иное действие) с наступлением сумерек.
Необходимые условия:
- установленный модуль " Погода от OpenWeather" (из его данных будем брать координаты местности и прогноз облачности в %),
- установленный модуль "Cron" (для запуска нашего сценария в определенное время).
Некоторые замечания:
- вычисление восхода\заката\сумерек производится в Формате Unix Time то есть в секундах,
- модуль "Погода от OpenWeather" следует настроить на метод API "5 day / 3 hour Forecast" с периодом обновления каждый час, это нужно для того чтоб иметь чуть более точный прогноз на время, близкое к наступлению сумерек и времени включения\выключения DarknessMode,
- в примере используется широта\долгота Москвы, свои координаты можно посмотреть:
здесьПоказать
ow1.png
ow1.png (26.04 КБ) 49 просмотров
Сначала немного рассуждений.
Итак, за основу возьмем сценарий упомянутый в самом начале. Сценарий вычисляет несколько параметров, как то: время восхода, время заката, время начала утренних сумерек и время конца вечерних сумерек. Расчет времени включения\выключения "тёмного режима" (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
}
}
2. Сценарий для момента включения DarknessMode, назовем его ON_for_darkness.mode:

Код: Выделить всё

say('Включён   свет   во   дворе',1);
callMethod('Switch3.turnOn');
он будет сообщать голосом о включении и включать свет (вызов метода turnOn нужного "выключателя") при включении DarknessMode.

3. Сценарий для момента выключения DarknessMode, назовем его OFF_for_darkness.mode

Код: Выделить всё

say('Свет   во   дворе   выключен',1);
callMethod('Switch3.turnOff');
он будет сообщать голосом о выключении и выключать свет (вызов метода turnOff нужного "выключателя") при выключении DarknessMode.

В панели управления \ объекты \ OperationalModes \ DarknessMode \ методы:
1. в методе activate для DarknessMode добавляем строку:

Код: Выделить всё

runScript('ON_for_darkness.mode');
тем самым при включении DarknessMode будет выполняться сценарий ON_for_darkness.mode,

2. в методе deactivate для 'DarknessMode добавляем строку:

Код: Выделить всё

runScript('OFF_for_darkness.mode');
тем самым при выключении DarknessMode будет выполняться сценарий OFF_for_darkness.mode.

Теперь в модуле Cron создадим 2 расписания:
- выполнение скрипта voshod-zakat в 16:00 (в это время уже имеем прогноз облачности на 18:00 часов вечера)
- выполнение скрипта voshod-zakat в 4:00 (в это время уже имеем прогноз облачности на 6:00 часов утра)
Последний раз редактировалось prmres Чт окт 14, 2021 11:27 pm, всего редактировалось 9 раз.
Не только лишь все!
Logrus
Сообщения: 1811
Зарегистрирован: Пт апр 07, 2017 12:20 pm
Благодарил (а): 296 раз
Поблагодарили: 375 раз

Re: [сценарий] Расчет времени вкл\откл DarkessMode по закату\восходу с учётом облачности

Сообщение Logrus » Чт окт 14, 2021 1:54 pm

https://connect.smartliving.ru/profile/ ... og163.html
в пп2 есть ссылка на форум с примером восхода заката с учетом облачности
Telegram | Блог
Raspberry Pi3, с образа от Сергея 3.31, PHP 7
Почти всё время уходит на исправление ошибок, оставшееся - на их повторение. (с) ))) Спасибо
Аватара пользователя
prmres
Сообщения: 345
Зарегистрирован: Пт ноя 24, 2017 2:24 am
Откуда: оттуда
Благодарил (а): 97 раз
Поблагодарили: 97 раз

Re: [сценарий] Расчет времени вкл\откл DarkessMode по закату\восходу с учётом облачности

Сообщение prmres » Чт окт 14, 2021 2:08 pm

Logrus писал(а):
Чт окт 14, 2021 1:54 pm
https://connect.smartliving.ru/profile/ ... og163.html
в пп2 есть ссылка на форум с примером восхода заката с учетом облачности
да, это видел
однако:
- в коннект новички попадают скажем так "не сразу"
- ссылку на этот пример, сам скрипт вычисления, как учесть облачность - ещё надо найти, понять и скомпоновать вместе, а в этой теме я как раз собрал разрозненный "материал" воедино в готовом "решении" (сделать так так так и так и получить это), не забыв про копирайты в самом начале указав "по мотивам".
- там только код, сходу понятный только опытным, а здесь вместе с кодом я постарался подробно описать методику вычисления и сделал пометки в коде, что на мой взгляд будет полезно малоопытным (я ведь и сам таковой), понятно что считается и почему считается именно так.
- мне самому памятка как сделано у меня
- в конце концов я ведь имею право поделиться своим конкретным сценарием выполняющим конкретную задачу
Не только лишь все!
Ответить