[Сценарий] Вычисляем восход и заход солнца

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

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

Аватара пользователя
xor
Сообщения: 2045
Зарегистрирован: Сб ноя 22, 2014 8:45 pm
Благодарил (а): 289 раз
Поблагодарили: 633 раза

Re: [Сценарий] Вычисляем восход и заход солнца

Сообщение xor » Вт апр 09, 2019 3:22 pm

Chainik писал(а):
xor писал(а):
Вт апр 09, 2019 1:33 pm
Она прекращается после сработки

Я поглядываю на часы, когда жду наступления какого-нибудь события, после наступления его - перестаю. Некоторые делают по-другому. Это их путь)
Прошу прощения за занудство, можно все же выложить фрагмент кода (кодом).
Скажу сейчас немыслимую для многих вещь: у меня нет телеграмма и даже смартфона.
Вот мой, вызываю при рестарте и в полночь (onNewDay) - свои координаты и несколько свойств подправить:

$lat=55.4734; // широта
$long= 37.7848; // долгота
$sun_info = date_sun_info(time(), $lat, $long);
ClearScheduledJob("job_SunSet");
ClearScheduledJob("job_civil_twilight_begin");
ClearScheduledJob("job_civil_twilight_end");
foreach ($sun_info as $key => $val) {

if ($key == 'sunrise') {

$sunrise = $val;
//echo 'Восход: '.date("H:i", $sunrise).'<br>';
setGlobal('weather_my.SunRise',date("H:i", $sunrise));
}

if ($key == 'sunset') {

$sunset = $val;
$day_length = $sunset - $sunrise;

//echo 'Заход: '.date("H:i", $sunset).'<br>';
//echo 'Долгота дня: '.gmdate("H:i", $day_length).'<br>';
setGlobal('weather_my.SunSet',date("H:i", $sunset));
setGlobal('weather_my.LongTag',gmdate("H:i", $day_length));
AddScheduledJob("job_SunSet","cm('DarknessMode.activate');say('Закат',2);", $sunset);
}

if ($key == 'transit') {
//echo 'В зените: '.date("H:i", $val).'<br>';
setGlobal('weather_my.Transit',date("H:i", $val));
}

if ($key == 'civil_twilight_begin') {
//echo 'Начало утренних сумерек: '.date("H:i", $val).'<br>';
setGlobal('weather_my.civil_begin',date("H:i", $val));
AddScheduledJob("job_civil_twilight_begin","cm('DarknessMode.deactivate');", $val);
}

if ($key == 'civil_twilight_end') {
//echo 'Конец вечерних сумерек: '.date("H:i", $val).'<br>';
setGlobal('weather_my.civil_end',date("H:i", $val));
AddScheduledJob("job_civil_twilight_end","say('Сумерки!',2);", $val);
}

}

if (timeBetween(getGlobal('weather_my.civil_begin'),getGlobal('weather_my.SunSet')) && getGlobal('DarknessMode.active')==1) {
callMethod('DarknessMode.deactivate');

} elseif (!timeBetween(getGlobal('weather_my.civil_begin'),getGlobal('weather_my.SunSet')) && getGlobal('DarknessMode.active')!=1) {

callMethod('DarknessMode.activate');

}

Отправлено с моего Redmi 4X через Tapatalk

За это сообщение автора xor поблагодарили (всего 2):
Chainik (Вт апр 09, 2019 3:54 pm) • Samir77 (Вт апр 14, 2020 10:36 pm)
Рейтинг: 2.33%
Аватара пользователя
xor
Сообщения: 2045
Зарегистрирован: Сб ноя 22, 2014 8:45 pm
Благодарил (а): 289 раз
Поблагодарили: 633 раза

Re: [Сценарий] Вычисляем восход и заход солнца

Сообщение xor » Вт апр 09, 2019 7:20 pm


fandaymon писал(а): ... Но зато усложняем исправление условий срабатывания. Исправить что-то, не забыть перезапустить джобы, убедиться что там сработает именно то что надо - путь настоящего джедая 8-)
Неприменимо -- исправлять наступление/окончание режима Темно нет причины уже неск. лет. Солнце восходит и заходит как по часам)))

Отправлено с моего Redmi 4X через Tapatalk

Аватара пользователя
nightwind
Сообщения: 333
Зарегистрирован: Вс июн 26, 2016 4:42 pm
Откуда: Барановичи
Благодарил (а): 28 раз
Поблагодарили: 52 раза
Контактная информация:

Re: [Сценарий] Вычисляем восход и заход солнца

Сообщение nightwind » Вт апр 09, 2019 7:58 pm

пора завязывать, всю тему засрали 8-) модер поудалит лишнее, надеюсь
fandaymon
Сообщения: 1570
Зарегистрирован: Сб янв 13, 2018 5:00 pm
Благодарил (а): 40 раз
Поблагодарили: 578 раз

Re: [Сценарий] Вычисляем восход и заход солнца

Сообщение fandaymon » Вт апр 09, 2019 8:16 pm

xor писал(а):
Вт апр 09, 2019 7:20 pm
fandaymon писал(а): ... Но зато усложняем исправление условий срабатывания. Исправить что-то, не забыть перезапустить джобы, убедиться что там сработает именно то что надо - путь настоящего джедая 8-)
Неприменимо -- исправлять наступление/окончание режима Темно нет причины уже неск. лет. Солнце восходит и заходит как по часам)))

Отправлено с моего Redmi 4X через Tapatalk
Ну там - закат + час, закат + 15 минут - народу иногда нужно и такое... Имеется в виду не сам режим темно, а какие-нибудь действия, которые надо делать
fandaymon
Сообщения: 1570
Зарегистрирован: Сб янв 13, 2018 5:00 pm
Благодарил (а): 40 раз
Поблагодарили: 578 раз

Re: [Сценарий] Вычисляем восход и заход солнца

Сообщение fandaymon » Вт апр 09, 2019 8:27 pm

nightwind писал(а):
Вт апр 09, 2019 7:44 pm
fandaymon писал(а):
Вт апр 09, 2019 5:54 pm
Ну да, ну да - именно поэтому запросы к базе заменяются на ежеминутный просчёт времени восхода/заката... 8-)
попробуй заморочиться с профайлером, сразу все поймешь. ;) да и ежеминутный просчет уж как минимум не убъет лишними перезаписями карточку на ваших горяче любимых малинах и апельсинах.
Зачем мне профайлер? Я по коду посмотрел, что и как там делается. gg не делает записей в базе + база на малинке в памяти, так что select достаточно быстро отрабатывает.
nightwind писал(а):
Вт апр 09, 2019 7:44 pm
fandaymon писал(а):
Вт апр 09, 2019 5:54 pm
Что питон, что php - интерпретаторы, каких-то ресурсов требует больше один, каких-то - другой, но вот прям говорить что переход с одного на другой это оптимизация, ну очень спорное утверждение. Причём тут 32 ядерные процессоры для меня не ясно.
Я этого не утверждал. да и питон и пхп давно уже почти и не интерпретаторы) Я только обратил внимание на моду оправдывать свой говнокод доступной процессорной мощностью. типа и так сойдет. ну или напишем потом в требованиях 32 ядерный проц.
//Имею опыт переписывания говнокода в одном эмбеддед проекте, ускорившим выполнение почти в 10 000 раз.
Ну скажем так - я тоже оптимизирую код, там где это нужно. А там где не нужно предпочитаю делать так, как быстрее
Logrus
Сообщения: 2113
Зарегистрирован: Пт апр 07, 2017 12:20 pm
Благодарил (а): 317 раз
Поблагодарили: 466 раз

Re: [Сценарий] Вычисляем восход и заход солнца

Сообщение Logrus » Вт апр 09, 2019 9:13 pm

xor писал(а):
Вт апр 09, 2019 7:20 pm
fandaymon писал(а): ... Но зато усложняем исправление условий срабатывания. Исправить что-то, не забыть перезапустить джобы, убедиться что там сработает именно то что надо - путь настоящего джедая 8-)
Неприменимо -- исправлять наступление/окончание режима Темно нет причины уже неск. лет. Солнце восходит и заходит как по часам)))
а облака?
раз в 10-й уже спорим )))
отказался от джобов, т.к. пофиг что чуть сложнее, но ограничено - сложно динамическое смещение ввести, проверяется по сравнению с минутным намного чаще - нет в этом никакой оптимизации, да и что по сути там оптимизировать гг и сравнение условий - мизер
зато при стандартном использовании:
1. раз в сутки рассчитали и записали время восхода заката (в формате линукс тайм)
2. раз в минуту вызываем проверку

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

$last_register = $this->getProperty('updated');
if (time() - $last_register >= 19800) { //облачность и поменяться может, ну добавили еще одну проверку, убрав селекты и расчеты ниже
 $darkness = $this->getProperty('active');
 $cloudiness = getGlobal('ow_fact.clouds');
 $sunrise = getGlobal('Time.SunRiseTimestamp');
 $sunrise = date('H:i', $sunrise + 600 + (30*$cloudiness));
 $sunset = getGlobal('Time.SunSetTimestamp');
 $sunset = date('H:i', $sunset - 1200 - (30*$cloudiness));
 if ($darkness == 1 && timeBetween($sunrise, $sunset)) {
  callMethodSafe('DarknessMode.deactivate'); 
 }
 elseif ($darkness == 0 && timeBetween($sunset, $sunrise)) {
  callMethodSafe('DarknessMode.activate'); 
 }
}
та хоть с десяток таких сделайте, еще и не факт что будет хуже (это даже не копейки, а атомы от них "экономить") джобов )))
зато намного удобней и гибче
За это сообщение автора Logrus поблагодарили (всего 2):
Chainik (Вт апр 09, 2019 10:36 pm) • Samir77 (Вт апр 14, 2020 10:36 pm)
Рейтинг: 2.33%
Telegram | Блог
Raspberry Pi3, с образа от Сергея 3.31, PHP 7, флешка 16 Гб работает с 10.09.2017
Почти всё время уходит на исправление ошибок, оставшееся - на их повторение. (с) ))) Спасибо
Аватара пользователя
xor
Сообщения: 2045
Зарегистрирован: Сб ноя 22, 2014 8:45 pm
Благодарил (а): 289 раз
Поблагодарили: 633 раза

Re: [Сценарий] Вычисляем восход и заход солнца

Сообщение xor » Вт апр 09, 2019 10:03 pm

Logrus писал(а):
Вт апр 09, 2019 9:13 pm
[
а облака?
раз в 10-й уже спорим )))
отказался от джобов, т.к. пофиг что чуть сложнее, но ограничено - сложно динамическое смещение ввести, проверяется по сравнению с минутным намного чаще - нет в этом никакой оптимизации, да и что по сути там оптимизировать гг и сравнение условий - мизер
зато при стандартном использовании:
1. раз в сутки рассчитали и записали время восхода заката (в формате линукс тайм)
2. раз в минуту вызываем проверку

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

$last_register = $this->getProperty('updated');
if (time() - $last_register >= 19800) { //облачность и поменяться может, ну добавили еще одну проверку, убрав селекты и расчеты ниже
 $darkness = $this->getProperty('active');
 $cloudiness = getGlobal('ow_fact.clouds');
 $sunrise = getGlobal('Time.SunRiseTimestamp');
 $sunrise = date('H:i', $sunrise + 600 + (30*$cloudiness));
 $sunset = getGlobal('Time.SunSetTimestamp');
 $sunset = date('H:i', $sunset - 1200 - (30*$cloudiness));
 if ($darkness == 1 && timeBetween($sunrise, $sunset)) {
  callMethodSafe('DarknessMode.deactivate'); 
 }
 elseif ($darkness == 0 && timeBetween($sunset, $sunrise)) {
  callMethodSafe('DarknessMode.activate'); 
 }
}
та хоть с десяток таких сделайте, еще и не факт что будет хуже (это даже не копейки, а атомы от них "экономить") джобов )))
зато намного удобней и гибче
облака у меня учитываются в даркнесс.активате, у меня там уличный свет включается. Сумерки настали, даркнесс активировался, при активации запускаем вкл. уличного света с учетом облачности
при утренних сумерках даркнесс деактивируется, всё, что на улице -- гасится, если горит


ну режьте меня, не буду я заставлять свой умный дом делать дурацкую работу -- чекать рассвет после его наступления! так я устроен, извинити))
Chainik
Сообщения: 1465
Зарегистрирован: Вс янв 10, 2016 11:05 am
Благодарил (а): 262 раза
Поблагодарили: 455 раз

Re: [Сценарий] Вычисляем восход и заход солнца

Сообщение Chainik » Ср июл 31, 2019 9:00 pm

Для любителей "однострочных" решений:

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

 if (timeIs(date("H:i",date_sun_info(time(), 50.335084, 30.724813)['sunrise']))) {
//Действия
}
Соответственно, для заката:

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

 if (timeIs(date("H:i",date_sun_info(time(), 50.335084, 30.724813)['sunset']))) {
//Действия
}
Аватара пользователя
xor
Сообщения: 2045
Зарегистрирован: Сб ноя 22, 2014 8:45 pm
Благодарил (а): 289 раз
Поблагодарили: 633 раза

Re: [Сценарий] Вычисляем восход и заход солнца

Сообщение xor » Чт авг 01, 2019 1:24 am

Chainik писал(а):
Ср июл 31, 2019 9:00 pm
Для любителей "однострочных" решений:

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

 if (timeIs(date("H:i",date_sun_info(time(), 50.335084, 30.724813)['sunrise']))) {
//Действия
}
Соответственно, для заката:

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

 if (timeIs(date("H:i",date_sun_info(time(), 50.335084, 30.724813)['sunset']))) {
//Действия
}
если это время пропущено по каким-то причинам (перезагрузка, включился на минуту позже, цикл упал и рестартует), то не сработает(
lihodeev
Сообщения: 148
Зарегистрирован: Ср июл 25, 2018 10:37 pm
Благодарил (а): 43 раза
Поблагодарили: 8 раз

Re: [Сценарий] Вычисляем восход и заход солнца

Сообщение lihodeev » Сб ноя 16, 2019 2:57 pm

Денечка добрейшего! Два дня пытаюсь найти кто меняет свойства ThisComputer.SunSetTime (17.09) и ThisComputer.SunRiseTime (8.37) .. есть скрипт который запускается в 2 часа ночи определяет время восход и время заката, тут все ок, НО проходит какое то время в пределах суток, и время становится не правильным. поиск по SunSetTime и SunRiseTime в системе не дал криминальных результатов. Какие народ имеет мысли? Да, время на сегодня правильное - 07:02 и 16:17
За это сообщение автора lihodeev поблагодарил:
TrDA (Сб ноя 16, 2019 3:14 pm)
Рейтинг: 1.16%
Raspberry 3, AMS 16, arduinka 2560, Orange pi Zero, Broadlink RM3, Xiaomi Mi Robot Vacuum SKV4000GL
Ответить