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

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

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

fandaymon
Сообщения: 1561
Зарегистрирован: Сб янв 13, 2018 5:00 pm
Благодарил (а): 39 раз
Поблагодарили: 577 раз

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

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

xor писал(а):
Вт апр 09, 2019 10:10 am
Чем плох этот способ - из-за одного запуска в сутки важный минутный цикл тратит на эту проверку 60*24 чеков, и второе - при остановке и рестарте МДМ можно прошляпить это событие (
Я при вычислении заката/восхода создаю два джоба на время этих событий+добавляю проверку на наступление этих событий в метод startup
Можно подумать проверка времени наступления джоба чем-то отличается от проверки в минутном цикле 8-)
Аватара пользователя
xor
Сообщения: 2045
Зарегистрирован: Сб ноя 22, 2014 8:45 pm
Благодарил (а): 289 раз
Поблагодарили: 632 раза

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

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

Chainik писал(а):
xor писал(а):
Вт апр 09, 2019 10:10 am
...+добавляю проверку на наступление этих событий в метод startup
А можно фрагмент кода из метода startup, которым проводится эта проверка?
https://t.me/MajorDoMoRu/67668

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

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

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

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

fandaymon писал(а):
xor писал(а):
Вт апр 09, 2019 10:10 am
Чем плох этот способ - из-за одного запуска в сутки важный минутный цикл тратит на эту проверку 60*24 чеков, и второе - при остановке и рестарте МДМ можно прошляпить это событие (
Я при вычислении заката/восхода создаю два джоба на время этих событий+добавляю проверку на наступление этих событий в метод startup
Можно подумать проверка времени наступления джоба чем-то отличается от проверки в минутном цикле 8-)
Она прекращается после сработки

Я поглядываю на часы, когда жду наступления какого-нибудь события, после наступления его - перестаю. Некоторые делают по-другому. Это их путь)

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


Chainik
Сообщения: 1463
Зарегистрирован: Вс янв 10, 2016 11:05 am
Благодарил (а): 261 раз
Поблагодарили: 454 раза

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

Сообщение Chainik » Вт апр 09, 2019 2:30 pm

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

Я поглядываю на часы, когда жду наступления какого-нибудь события, после наступления его - перестаю. Некоторые делают по-другому. Это их путь)
Прошу прощения за занудство, можно все же выложить фрагмент кода (кодом).
Скажу сейчас немыслимую для многих вещь: у меня нет телеграмма и даже смартфона.
Аватара пользователя
xor
Сообщения: 2045
Зарегистрирован: Сб ноя 22, 2014 8:45 pm
Благодарил (а): 289 раз
Поблагодарили: 632 раза

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 раз
Поблагодарили: 632 раза

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
Сообщения: 1561
Зарегистрирован: Сб янв 13, 2018 5:00 pm
Благодарил (а): 39 раз
Поблагодарили: 577 раз

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

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

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

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

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
Сообщения: 2101
Зарегистрирован: Пт апр 07, 2017 12:20 pm
Благодарил (а): 314 раз
Поблагодарили: 464 раза

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
Почти всё время уходит на исправление ошибок, оставшееся - на их повторение. (с) ))) Спасибо
Ответить