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

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

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

Аватара пользователя
xor
Сообщения: 2044
Зарегистрирован: Сб ноя 22, 2014 8:45 pm

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

Сообщение xor »

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
Сообщения: 2044
Зарегистрирован: Сб ноя 22, 2014 8:45 pm

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

Сообщение xor »


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

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

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

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

Сообщение nightwind »

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

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

Сообщение fandaymon »

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

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

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

Сообщение fandaymon »

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

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

Сообщение Logrus »

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'); 
 }
}
та хоть с десяток таких сделайте, еще и не факт что будет хуже (это даже не копейки, а атомы от них "экономить") джобов )))
зато намного удобней и гибче
Telegram | Блог
Raspberry Pi3, с образа от Сергея 3.31, PHP 7, флешка 16 Гб работает с 10.09.2017
Почти всё время уходит на исправление ошибок, оставшееся - на их повторение. (с) ))) Спасибо
Аватара пользователя
xor
Сообщения: 2044
Зарегистрирован: Сб ноя 22, 2014 8:45 pm

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

Сообщение xor »

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

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

Сообщение Chainik »

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

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

 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
Сообщения: 2044
Зарегистрирован: Сб ноя 22, 2014 8:45 pm

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

Сообщение xor »

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

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

Сообщение lihodeev »

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