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

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

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

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

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

Сообщение webms » Чт ноя 22, 2018 5:35 pm

skysilver писал(а):
Мне помнится что кто то в начале года тоже не умел создавать модули для МД)) Не понимал как)

Но за то сейчас какая красота :P
Не только красиво оформленные (уделяешь внимание мелочам), но и стабильные программы которые сразу доведены до конца и без касяков.

Еще раз спасибо за труд.
Аватара пользователя
Torch
Сообщения: 13
Зарегистрирован: Чт янв 17, 2019 9:50 am
Благодарил (а): 2 раза
Поблагодарили: 0

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

Сообщение Torch » Пн апр 08, 2019 5:41 pm

Коллеги, прошу прощения, если вопрос банальный. Я еще только учусь :) . Скопировал отсюда скрипт, он для моих координат находит время заката/рассвета.

Но время заката и рассвета само по себе особого значения не имеет, оно важно только для запуска каких-то скриптов, поэтому подскажите правильный метод как запускать сценарий по восходу/закату.

К сожалению поиском по форуму найти не получилось :(
Chainik
Сообщения: 1462
Зарегистрирован: Вс янв 10, 2016 11:05 am
Благодарил (а): 260 раз
Поблагодарили: 454 раза

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

Сообщение Chainik » Пн апр 08, 2019 5:52 pm

Есть информация на форуме (viewtopic.php?f=4&t=3508&start=2)
И это далеко не все.
Не получится / или не найдете как сделать, подскажем.
Все несложно.

п.№1 вы уже надеюсь, реализовали: периодическую запись в соответствующие свойства времени восхода и заката.
Аватара пользователя
Torch
Сообщения: 13
Зарегистрирован: Чт янв 17, 2019 9:50 am
Благодарил (а): 2 раза
Поблагодарили: 0

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

Сообщение Torch » Пн апр 08, 2019 5:55 pm

Chainik писал(а):
Пн апр 08, 2019 5:52 pm
п.№1 вы уже надеюсь, реализовали: периодическую запись в соответствующие свойства времени восхода и заката.
Да, с глобальными переменными вроде понятно :).
Спасибо. сейчас доберусь до дома буду дальше читать.
Chainik
Сообщения: 1462
Зарегистрирован: Вс янв 10, 2016 11:05 am
Благодарил (а): 260 раз
Поблагодарили: 454 раза

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

Сообщение Chainik » Пн апр 08, 2019 8:33 pm

В общем:
1. Получаем время восхода и заката (viewtopic.php?f=4&t=4090&start=4). Координаты, естественно, вписываете свои.
Код этот можно дописать, например, в onNewHour (Панель управления >>> ОБЪЕКТЫ >>> Объекты >>> Timer).
2. В onNewMinute (расположен там же) дописываем код:

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

 if (timeIs(getGlobal('ThisComputer.SunRiseTime'))) {
runScript("Имя_вашего_сценария_с_действиями_которые_надо_совершить_при_наступлении_времени_восхода");
}
Собственно, и вся задача.
За это сообщение автора Chainik поблагодарил:
Torch (Пн апр 08, 2019 9:06 pm)
Рейтинг: 1.16%
Аватара пользователя
Torch
Сообщения: 13
Зарегистрирован: Чт янв 17, 2019 9:50 am
Благодарил (а): 2 раза
Поблагодарили: 0

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

Сообщение Torch » Пн апр 08, 2019 9:06 pm

Chainik писал(а):
Пн апр 08, 2019 8:33 pm
Собственно, и вся задача.
Да, спасибо так и сделал. Прошу прощения за ламерские вопросы просто опыта Majordomo практически нет, логику системы еще не до конца понял, поэтому могу тупить.
Аватара пользователя
xor
Сообщения: 2036
Зарегистрирован: Сб ноя 22, 2014 8:45 pm
Благодарил (а): 283 раза
Поблагодарили: 628 раз

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

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

Chainik писал(а):В общем:
1. Получаем время восхода и заката (viewtopic.php?f=4&t=4090&start=4). Координаты, естественно, вписываете свои.
Код этот можно дописать, например, в onNewHour (Панель управления >>> ОБЪЕКТЫ >>> Объекты >>> Timer).
2. В onNewMinute (расположен там же) дописываем код:

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

 if (timeIs(getGlobal('ThisComputer.SunRiseTime'))) {
runScript("Имя_вашего_сценария_с_действиями_которые_надо_совершить_при_наступлении_времени_восхода");
}
Собственно, и вся задача.
Чем плох этот способ - из-за одного запуска в сутки важный минутный цикл тратит на эту проверку 60*24 чеков, и второе - при остановке и рестарте МДМ можно прошляпить это событие (
Я при вычислении заката/восхода создаю два джоба на время этих событий+добавляю проверку на наступление этих событий в метод startup

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


Ps. https://t.me/MajorDoMoRu/117123

Коллега Руслан собрал несколько решений на эту тему в телеге
За это сообщение автора xor поблагодарил:
Chainik (Вт апр 09, 2019 10:56 am)
Рейтинг: 1.16%
Chainik
Сообщения: 1462
Зарегистрирован: Вс янв 10, 2016 11:05 am
Благодарил (а): 260 раз
Поблагодарили: 454 раза

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

Сообщение Chainik » Вт апр 09, 2019 10:57 am

xor писал(а):
Вт апр 09, 2019 10:10 am
...+добавляю проверку на наступление этих событий в метод startup
А можно фрагмент кода из метода startup, которым проводится эта проверка?
Аватара пользователя
nightwind
Сообщения: 333
Зарегистрирован: Вс июн 26, 2016 4:42 pm
Откуда: Барановичи
Благодарил (а): 28 раз
Поблагодарили: 52 раза
Контактная информация:

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

Сообщение nightwind » Вт апр 09, 2019 11:15 am

Господа, что вы лепите?)))
НАФИГА держать в базе координаты дома? вы знаете сколько ресурсов жрет бессмысленно один getGlobal? а если каждую секунду в скрипте проверять??
Зачем заводить время в свойства компьютера?? вы обалдели что ли?
смотрите
в папке /lib/ мажора создаешь файл astrolib.php

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

if (!function_exists('time2Hm')) {
    function time2Hm($tm)  {
        return date("H:i", $tm);
    }
    
class Astro {
    var   $latitude;
    var   $longitude;
    
    function Astro() {
        $this -> latitude = 53.112268;
        $this -> longitude = 26.014811;
    }
    
    function isDark() {
        if (time() > $this -> sunSetTime())return 1;
        return 0;
     }
    
    function sunRiseTime() {
        $sun_info = date_sun_info(time(), $this -> latitude, $this -> longitude);
        return $sun_info['sunrise'];
      }
    
    function sunRiseTime_Hm() {
        return time2Hm($this -> sunRiseTime());
    }
    
    function sunSetTime() {
        $sun_info = date_sun_info(time(), $this -> latitude, $this -> longitude);
        return $sun_info['sunset'];
    }
    
    function sunSetTime_Hm() {
        
        return time2Hm($this -> sunSetTime());
    }
    
    function dayLength() {
        return  $this -> sunSetTime() - $this -> sunRiseTime();
    }
    
    function dayLength_Hm() {
        return time2Hm($this -> dayLength());
    }
    
    function transit() {
        $sun_info = date_sun_info(time(), $this -> latitude, $this -> longitude);
        return $sun_info['transit'];
    }
    
    function civil_begin() {
        $sun_info = date_sun_info(time(), $this -> latitude, $this -> longitude);
        return $sun_info['civil_twilight_begin'];
    
    }
  }
   
потом в минутном таймере например

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

$a = new Astro;

if (timeIs($a->sunRiseTime_Hm())) {
  say('Всходит солнце');
  callMethod('lamp2.turnoff');
 }
И ни одного лишнего обращения к базе, вычисляетя все мгновенно.
И пожалуйста, не выкладывайте говнокод. и так все тормозит. ps - этот код тоже не образец качества, еще и вставился коряво.
За это сообщение автора nightwind поблагодарили (всего 3):
Chainik (Вт апр 09, 2019 11:40 am) • cabat (Вт апр 09, 2019 12:02 pm) • GIV_59 (Сб дек 07, 2019 3:20 pm)
Рейтинг: 3.49%
Аватара пользователя
xor
Сообщения: 2036
Зарегистрирован: Сб ноя 22, 2014 8:45 pm
Благодарил (а): 283 раза
Поблагодарили: 628 раз

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

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

nightwind писал(а):Господа, что вы лепите?)))
НАФИГА держать в базе координаты дома? вы знаете сколько ресурсов жрет бессмысленно один getGlobal? а если каждую секунду в скрипте проверять??
Зачем заводить время в свойства компьютера?? вы обалдели что ли?
смотрите
в папке /lib/ мажора создаешь файл astrolib.php

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

if (!function_exists('time2Hm')) {
    function time2Hm($tm)  {
        return date("H:i", $tm);
    }
    
class Astro {
    var   $latitude;
    var   $longitude;
    
    function Astro() {
        $this -> latitude = 53.112268;
        $this -> longitude = 26.014811;
    }
    
    function isDark() {
        if (time() > $this -> sunSetTime())return 1;
        return 0;
     }
    
    function sunRiseTime() {
        $sun_info = date_sun_info(time(), $this -> latitude, $this -> longitude);
        return $sun_info['sunrise'];
      }
    
    function sunRiseTime_Hm() {
        return time2Hm($this -> sunRiseTime());
    }
    
    function sunSetTime() {
        $sun_info = date_sun_info(time(), $this -> latitude, $this -> longitude);
        return $sun_info['sunset'];
    }
    
    function sunSetTime_Hm() {
        
        return time2Hm($this -> sunSetTime());
    }
    
    function dayLength() {
        return  $this -> sunSetTime() - $this -> sunRiseTime();
    }
    
    function dayLength_Hm() {
        return time2Hm($this -> dayLength());
    }
    
    function transit() {
        $sun_info = date_sun_info(time(), $this -> latitude, $this -> longitude);
        return $sun_info['transit'];
    }
    
    function civil_begin() {
        $sun_info = date_sun_info(time(), $this -> latitude, $this -> longitude);
        return $sun_info['civil_twilight_begin'];
    
    }
  }
   
потом в минутном таймере например

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

$a = new Astro;

if (timeIs($a->sunRiseTime_Hm())) {
  say('Всходит солнце');
  callMethod('lamp2.turnoff');
 }
И ни одного лишнего обращения к базе, вычисляетя все мгновенно.
И пожалуйста, не выкладывайте говнокод. и так все тормозит. ps - этот код тоже не образец качества, еще и вставился коряво.
Лепят каждый для себя)) у кого-то, кто использует жпс модуль, координаты и так в базе хранятся, кто-то не использует время восхода/заката, а ориентируется на сумерки, кто-то считает, что глупо занимать минутный цикл для проверки разового события, у кого-то железо позволяет не только не экономить на gg/sg, но и распознаванием видео онлайн заниматься.
У вас задача минимизировать обращения к базе, как я понял

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

Ответить