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

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

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

Аватара пользователя
webms
Сообщения: 466
Зарегистрирован: Чт дек 15, 2016 3:13 am
Благодарил (а): 201 раз
Поблагодарили: 85 раз

Re: Вычисляем восход и заход солнца

Сообщение webms » Пт янв 26, 2018 4:33 pm

LutsenkoDenis писал(а):
adzam писал(а):Я использую такой попроще:....
Да, date_sun_info - это как раз та самая встроенная в php функция которая рассчитывает восход, закат и т.д.

И на счёт проще... проще уже точно некуда :)

p.s. В приложении OpenWeather я эту функцию тоже использую для получения данных на сегодня и несколько дней вперед.
а откуда берется инфа для date_sun_info? откуда скачивает?)
Аватара пользователя
Vovix
Сообщения: 1152
Зарегистрирован: Пн янв 27, 2014 1:43 am
Откуда: г.Ижевск
Благодарил (а): 58 раз
Поблагодарили: 512 раз
Контактная информация:

Re: Вычисляем восход и заход солнца

Сообщение Vovix » Пт янв 26, 2018 7:25 pm

webms писал(а):
LutsenkoDenis писал(а):
adzam писал(а):Я использую такой попроще:....
Да, date_sun_info - это как раз та самая встроенная в php функция которая рассчитывает восход, закат и т.д.

И на счёт проще... проще уже точно некуда :)

p.s. В приложении OpenWeather я эту функцию тоже использую для получения данных на сегодня и несколько дней вперед.
а откуда берется инфа для date_sun_info? откуда скачивает?)
вычисляется!
земля ведь круглая (почти)
вращается вокруг солнца! :D
в общем математика + астрономия (или астрофизика)
Мой -CONNECT-
Windows 7(PHP 7.2) + Raspberry Pi(освещение на 1-Wire) + MP751(управление) + ESP8266(сенсоры) + LAN(сенсоры)
-=: Если вам помогло моё сообщение, нажмите кнопку "Поблагодарить за сообщение автора: Vovix" (кнопка Спасибо) справа! :=-
Аватара пользователя
webms
Сообщения: 466
Зарегистрирован: Чт дек 15, 2016 3:13 am
Благодарил (а): 201 раз
Поблагодарили: 85 раз

Re: Вычисляем восход и заход солнца

Сообщение webms » Пн янв 29, 2018 12:28 pm

Я просто через веб переменную забираю эту инфу сейчас (для эко режима), но если есть такая функция в пхп, то лучше наверное изменить код
Jager
Сообщения: 708
Зарегистрирован: Сб авг 18, 2012 10:21 am
Благодарил (а): 26 раз
Поблагодарили: 180 раз

Re: Вычисляем восход и заход солнца

Сообщение Jager » Пн янв 29, 2018 2:52 pm

webms писал(а):Я просто через веб переменную забираю эту инфу сейчас (для эко режима), но если есть такая функция в пхп, то лучше наверное изменить код
Вместо парсинга можно вот такой скрипт запускать раз в сутки

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

$sun_info = date_sun_info(time(), 55.ХХХХХХХ, 55.ХХХХХХХ); //Ваши географические координаты.

foreach ($sun_info as $key => $val) {

if ($key == 'sunrise') {

$sunrise = $val;
//echo 'Восход: '.date("H:i:s", $sunrise).'<br>';
setGlobal('ThisComputer.SunRiseTime',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('ThisComputer.SunSetTime',date("H:i", $sunset));
setGlobal('ThisComputer.LongTagTime',gmdate("H:i", $day_length));
}

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

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

if ($key == 'civil_twilight_end') {
//echo 'Конец вечерних сумерек: '.date("H:i:s", $val).'<br>';
setGlobal('ThisComputer.civil_endTime',date("H:i", $val));
}

}  
За это сообщение автора Jager поблагодарили (всего 6):
dengi.76 (Чт мар 15, 2018 12:47 am) • Plug (Пн май 28, 2018 9:04 am) • VooDooN (Вс июл 01, 2018 5:01 pm) • GIV_59 (Чт ноя 08, 2018 3:35 am) • Yashalta (Вт ноя 27, 2018 11:36 pm) • Bolik.Stav (Сб ноя 09, 2019 2:02 pm)
Рейтинг: 7.06%
vladmezh
Сообщения: 4
Зарегистрирован: Пн дек 25, 2017 10:08 pm
Благодарил (а): 3 раза
Поблагодарили: 4 раза

Re: Вычисляем восход и заход солнца

Сообщение vladmezh » Вс фев 04, 2018 12:54 pm

СпойлерПоказать
$lat = 46.3825; // +N, -S gg.mmss
$lon = 32.3653; // +E, -W
$d=date('d',time());
$m=date('m',time());
$y=date('Y',time());
$n1=floor(275/9*$m);
$n2=floor(($m+9)/12);
$n3=1+floor(($y-4*floor($y/4)+2)/3);
$n=$n1-($n2*$n3)+$d-30;
if ($lon>=0){
$c16=floor($lon);
$c17=floor(($lon-floor($lon))*100);
$c18=($lon-$c16-$c17/100)*1000;
$vlong=$c16+($c17+$c18/10)/60;
} else{
$c16=ceil($lon);
$c17=ceil(($lon-floor($lon))*100);
}
$c18=($lon-$c16-$c17/100)*1000;
$vlong=$c16+($c17+$c18/10)/60;
if($lat>=0){
$c20=floor($lat);
$c21=floor(($lat-floor($lat))*100);
}else{
$c20=ceil($lat);
$c21=ceil(($lat-ceil($lat))*100);
}
$c22=($lat-$c20-$c21/100)*1000;
$vlat=$c20+($c21+$c22/100)/60;
$lnghrs=$vlong/15;
$tx= date('r',time()) ;
$tmp0 = mb_substr( $tx , 26, 3, "UTF-8");
$tmp0=$tmp0-floor($lnghrs);
$trise=$n+((6-$lnghrs)/24);
$tset=$n+((18-$lnghrs)/24);
$mrise=(0.9856*$trise)-3.289;
$mset=(0.9856*$tset)-3.289; # $lrise_ не совпадает !!!
$lrise_=$mrise+(1.916*sin($mrise/180*M_PI))+(0.02*sin($mrise/180*M_PI))+282.634;
$lrise= $lrise_-360* floor($lrise_/360);
$lset_=$mset+(1.916*sin($mset/180*M_PI))+(0.02*sin($mset/180*M_PI))+282.634;
$lset= $lset_-360* floor($lset_/360);
$rarise=atan(0.91764*tan($lrise/180*M_PI))*180/M_PI;
$lqr=90*floor($lrise/90);
$rqr=90*floor($rarise/90);
$rar=($rarise+($lqr-$rqr))/15;
$raset=atan(0.91764*tan($lset/180*M_PI))*180/M_PI;
$lqs=90*floor($lset/90);
$rqs=90*floor($raset/90);
$ras=($raset+($lqs-$rqs))/15;
$sindecriser=0.39782*sin($lrise/180*M_PI);
$cosdecriser=cos(asin($sindecriser));
$sindecrises=0.39782*sin($lset/180*M_PI);
$cosdecrises=cos(asin($sindecrises));
$coshrise=(cos(90.8333/180*M_PI)-$sindecriser*sin($vlat/180*M_PI))/($cosdecriser*cos($vlat/180*M_PI));
$coshset=(cos(90.8333/180*M_PI)-$sindecrises*sin($vlat/180*M_PI))/($cosdecrises*cos($vlat/180*M_PI));
$hrise = (360-acos($coshrise)*180/M_PI)/15;
$hset= (acos($coshrise)*180/M_PI)/15;
$trise = $hrise+$rar-(0.06571*$trise)-6.622;
$tset= $hset+$ras-(0.06571*$tset)-6.622;
if(($trise-$lnghrs)<0) {
$utrise=$trise-$lnghrs+24;
}else{
if(($trise-$lnghrs)>=24){
$utrise=$trise-$lnghrs-24;
}
else{
$utrise=$trise-$lnghrs;
}
}
if(($tset-$lnghrs)<0){
$utset=$tset-$lnghrs+24*ceil(abs(($tset-$lnghrs)/24));
} else{
if(($tset-$lnghrs)>=24){
$utset= $tset-$lnghrs-24;
} else{
$utset=$tset-$lnghrs;
}
}
$utcrise=floor($utrise)*60+floor(($utrise-floor($utrise))*60);
$utcHrise= floor($utcrise/60);
$utcMrise= floor($utcrise-$utcHrise*60);
$loctimerise= floor($utrise)*60+floor(($utrise-floor($utrise))*60)+floor($lnghrs)*60;
$locHrise= floor($loctimerise/60);
$locMrise= floor($loctimerise-$locHrise*60);

$st2=$locMrise;
if ($st2<10){
$st2=("0".$st2);
}
$st1=$locHrise+$tmp0;
if ($st1<10){
$st1=("0".$st1);
}
$st=($st1.":".$st2);
SetGlobal('SunRiseTime',$st);
$utcset=floor($utset)*60+floor(($utset-floor($utset))*60);
$utcHset= floor($utcset/60);
$utcMset= floor($utcset-$utcset*60);
$loctimeset= floor($utset)*60+floor(($utset-floor($utset))*60)+floor($lnghrs)*60;
$locHset= floor($loctimeset/60);
$locMset= floor($loctimeset-$locHset*60);
$st=($locHset.":".$locMset);
$st2=$locMset;
if ($st2<10){
$st2=("0".$st2);
}
$st1=$locHset+$tmp0;
if ($st1<10){
$st1=("0".$st1);
}
$st=($st1.":".$st2);
SetGlobal('SunSetTime',$st);
За это сообщение автора vladmezh поблагодарили (всего 3):
piton_78 (Пт апр 20, 2018 2:13 pm) • lyova22 (Чт ноя 01, 2018 6:42 pm) • EvgenyG (Пт апр 03, 2020 11:12 pm)
Рейтинг: 3.53%
stellhawk
Сообщения: 260
Зарегистрирован: Чт ноя 08, 2018 5:51 am
Благодарил (а): 10 раз
Поблагодарили: 81 раз

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

Сообщение stellhawk » Сб ноя 17, 2018 8:19 am

Для чайников типа меня:
1. создаем сценарий CalcSunSetRise
далее в поле код вставляем один и вверху предложенных кодов я взял от vladmezh
СпойлерПоказать
$lat = 55.098478; // +N, -S gg.mmss
$lon = 83.044850; // +E, -W
$d=date('d',time());
$m=date('m',time());
$y=date('Y',time());
$n1=floor(275/9*$m);
$n2=floor(($m+9)/12);
$n3=1+floor(($y-4*floor($y/4)+2)/3);
$n=$n1-($n2*$n3)+$d-30;
if ($lon>=0){
$c16=floor($lon);
$c17=floor(($lon-floor($lon))*100);
$c18=($lon-$c16-$c17/100)*1000;
$vlong=$c16+($c17+$c18/10)/60;
} else{
$c16=ceil($lon);
$c17=ceil(($lon-floor($lon))*100);
}
$c18=($lon-$c16-$c17/100)*1000;
$vlong=$c16+($c17+$c18/10)/60;
if($lat>=0){
$c20=floor($lat);
$c21=floor(($lat-floor($lat))*100);
}else{
$c20=ceil($lat);
$c21=ceil(($lat-ceil($lat))*100);
}
$c22=($lat-$c20-$c21/100)*1000;
$vlat=$c20+($c21+$c22/100)/60;
$lnghrs=$vlong/15;
$tx= date('r',time()) ;
$tmp0 = mb_substr( $tx , 26, 3, "UTF-8");
$tmp0=$tmp0-floor($lnghrs);
$trise=$n+((6-$lnghrs)/24);
$tset=$n+((18-$lnghrs)/24);
$mrise=(0.9856*$trise)-3.289;
$mset=(0.9856*$tset)-3.289; # $lrise_ не совпадает !!!
$lrise_=$mrise+(1.916*sin($mrise/180*M_PI))+(0.02*sin($mrise/180*M_PI))+282.634;
$lrise= $lrise_-360* floor($lrise_/360);
$lset_=$mset+(1.916*sin($mset/180*M_PI))+(0.02*sin($mset/180*M_PI))+282.634;
$lset= $lset_-360* floor($lset_/360);
$rarise=atan(0.91764*tan($lrise/180*M_PI))*180/M_PI;
$lqr=90*floor($lrise/90);
$rqr=90*floor($rarise/90);
$rar=($rarise+($lqr-$rqr))/15;
$raset=atan(0.91764*tan($lset/180*M_PI))*180/M_PI;
$lqs=90*floor($lset/90);
$rqs=90*floor($raset/90);
$ras=($raset+($lqs-$rqs))/15;
$sindecriser=0.39782*sin($lrise/180*M_PI);
$cosdecriser=cos(asin($sindecriser));
$sindecrises=0.39782*sin($lset/180*M_PI);
$cosdecrises=cos(asin($sindecrises));
$coshrise=(cos(90.8333/180*M_PI)-$sindecriser*sin($vlat/180*M_PI))/($cosdecriser*cos($vlat/180*M_PI));
$coshset=(cos(90.8333/180*M_PI)-$sindecrises*sin($vlat/180*M_PI))/($cosdecrises*cos($vlat/180*M_PI));
$hrise = (360-acos($coshrise)*180/M_PI)/15;
$hset= (acos($coshrise)*180/M_PI)/15;
$trise = $hrise+$rar-(0.06571*$trise)-6.622;
$tset= $hset+$ras-(0.06571*$tset)-6.622;
if(($trise-$lnghrs)<0) {
$utrise=$trise-$lnghrs+24;
}else{
if(($trise-$lnghrs)>=24){
$utrise=$trise-$lnghrs-24;
}
else{
$utrise=$trise-$lnghrs;
}
}
if(($tset-$lnghrs)<0){
$utset=$tset-$lnghrs+24*ceil(abs(($tset-$lnghrs)/24));
} else{
if(($tset-$lnghrs)>=24){
$utset= $tset-$lnghrs-24;
} else{
$utset=$tset-$lnghrs;
}
}
$utcrise=floor($utrise)*60+floor(($utrise-floor($utrise))*60);
$utcHrise= floor($utcrise/60);
$utcMrise= floor($utcrise-$utcHrise*60);
$loctimerise= floor($utrise)*60+floor(($utrise-floor($utrise))*60)+floor($lnghrs)*60;
$locHrise= floor($loctimerise/60);
$locMrise= floor($loctimerise-$locHrise*60);

$st2=$locMrise;
if ($st2<10){
$st2=("0".$st2);
}
$st1=($locHrise+$tmp0)%24;
if ($st1<10){
$st1=("0".$st1);
}
$st=($st1.":".$st2);
SetGlobal('ThisComputer.SunRiseTime',$st);
$str=$st;
$utcset=floor($utset)*60+floor(($utset-floor($utset))*60);
$utcHset= floor($utcset/60);
$utcMset= floor($utcset-$utcset*60);
$loctimeset= floor($utset)*60+floor(($utset-floor($utset))*60)+floor($lnghrs)*60;
$locHset= floor($loctimeset/60);
$locMset= floor($loctimeset-$locHset*60);
$st=($locHset.":".$locMset);
$st2=$locMset;
if ($st2<10){
$st2=("0".$st2);
}
$st1=($locHset+$tmp0)%24;
if ($st1<10){
$st1=("0".$st1);
}
$st=($st1.":".$st2);
SetGlobal('ThisComputer.SunSetTime',$st);
echo gg('ThisComputer.SunRiseTime').";".gg('ThisComputer.SunSetTime');
Debmes(gg('ThisComputer.SunRiseTime').";".gg('ThisComputer.SunSetTime'));

ставим галочку выполнять по расписанию: каждый день ночью.
ставим галочку выполнить сейчас.
в консоле должна появится строка вида:
12:08:12 0.38198100 09:03;17:22

проверяем что числа по любому сайты погода например http://weather.yandex.ru
если совпадает, то всё норм ,если нет -скорее всего ошибка в координатах.
Ваши данные о рассвете и закате тут: %ThisComputer.SunRiseTime% и %ThisComputer.SunSetTime%
Последний раз редактировалось stellhawk Пт апр 05, 2019 10:24 am, всего редактировалось 1 раз.
За это сообщение автора stellhawk поблагодарил:
Enerdo (Вт июн 18, 2019 10:02 pm)
Рейтинг: 1.18%
Аватара пользователя
Amarok
Сообщения: 1415
Зарегистрирован: Пт дек 14, 2012 12:24 pm
Откуда: Россия, Нижняя Тура
Благодарил (а): 455 раз
Поблагодарили: 125 раз
Контактная информация:

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

Сообщение Amarok » Сб ноя 17, 2018 8:49 am

Мой сценарий:

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

$lat=gg('ThisComputer.latitude');   // широта
$long=gg('ThisComputer.longitude'); // долгота
$sun_info = date_sun_info(time(), $lat, $long);

foreach ($sun_info as $key => $val) {

if ($key == 'sunrise') {
$sunrise = $val;
sg('ThisComputer.SunRise',date("H:i", $sunrise));
}

if ($key == 'sunset') {
$sunset = $val;
$day_length = $sunset - $sunrise;

sg('ThisComputer.SunSet',date("H:i", $sunset));
}
}
За это сообщение автора Amarok поблагодарили (всего 2):
Strangeman (Чт янв 24, 2019 1:32 pm) • EvgenyG (Пт апр 03, 2020 11:25 pm)
Рейтинг: 2.35%
Алиска живёт на Ubuntu Server 14.04.3 LTS
connect, группа в Telegram, Яндекс.Деньги для благодарностей за помощь: 41001355945165
Аватара пользователя
xor
Сообщения: 1739
Зарегистрирован: Сб ноя 22, 2014 8:45 pm
Благодарил (а): 211 раз
Поблагодарили: 521 раз

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

Сообщение xor » Вс ноя 18, 2018 12:14 am

К двум предыдущим постам:
Ждём, когда по третьему кругу будем одно и то же перепостить))
stellhawk
Сообщения: 260
Зарегистрирован: Чт ноя 08, 2018 5:51 am
Благодарил (а): 10 раз
Поблагодарили: 81 раз

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

Сообщение stellhawk » Пн ноя 19, 2018 3:39 pm

Вот Вы смеётесь, хорошо рассуждать когда ты тут с 2014 года и система росла вместе с тобой.
а новичкам очень трудно. я программист с большим стажем. и скажу честно, чтобы что-то в системе вообще понять надо очень много времени.
не хватает простых и понятных кейсов, чтобы вникнуть в суть системы. чтобы снизить сложность входа в систему
За это сообщение автора stellhawk поблагодарили (всего 3):
EvgenyG (Пт апр 03, 2020 11:15 pm) • ~220v (Ср май 13, 2020 11:27 am) • ansid (Чт сен 17, 2020 9:54 pm)
Рейтинг: 3.53%
skysilver
Сообщения: 3000
Зарегистрирован: Чт авг 21, 2014 8:28 am
Откуда: Киров, Россия
Благодарил (а): 397 раз
Поблагодарили: 1724 раза
Контактная информация:

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

Сообщение skysilver » Пн ноя 19, 2018 3:42 pm

stellhawk писал(а):
Пн ноя 19, 2018 3:39 pm
чтобы что-то в системе вообще понять надо очень много времени.
не хватает простых и понятных кейсов, чтобы вникнуть в суть системы. чтобы снизить сложность входа в систему
Этого мало? https://kb.smartliving.ru/perechen-resu ... majordomo/
Или читать/смотреть неохота?
За это сообщение автора skysilver поблагодарил:
Amarok (Пн ноя 19, 2018 4:53 pm)
Рейтинг: 1.18%
MajorDoMo (GitHub) на Cubietruck. ОС Debian 7 (wheezy) (kernel 3.4.105) с переносом на HDD.
Мой CONNECT | Блоги | Telegram
Ответить