Виджет фазы луны для сцены

Все живое на нашей планете подвержено влиянию Луны и живет по её циклам. Исходя из этого, думаю информация на сцене умного дома лишней не будет. Ниже приведённый код позволит рассчитать все основные фазы луны и вывести из на сцену в виде красивого виджета.

Для начала любым удобным способом нужно разместить файл MoonPhase.php в корневую папку Majordomo. В моём случае путь до корневой папки находиться по пути /var/www/html/. Так же, в папку /var/www/html/cached/ необходимо загрузить папку moon с изображениями фаз луны. Все файлы прикреплены внизу статьи.

777056544.png1777372144.png

 В панели управления majordomo заходим в раздел "Сценарии" и создаём новый

1418764864.png

Называем его MoonPhase, и вставляем в поле "Код" ниже приведённый код

Показать

Скрыть

include("./MoonPhase.php");
// create an instance of the class, and use the current time
$moon = new MoonPhase();
//$age = round( $moon->age(), 1 );
$age = round( $moon->age(), 0 );
$degr = round( $moon->degr(), 0 );
$stage = $moon->phase() < 0.5 ? 'растущая' : 'убывающая';
$distance = round( $moon->distance(), 2 );
$nextnewtime = gmdate( 'G:i:s', $moon->next_new_moon() );
$nextnewdate = gmdate( 'd.m.Y', $moon->next_new_moon() );
$nextfulltime = gmdate( 'G:i:s', $moon->next_full_moon() );
$nextfulldate = gmdate( 'd.m.Y', $moon->next_full_moon() );
$phasename = $moon->phase_name();
sg('MoonAge',$age); //Возраст луны (лунный день)
sg('MoonDegrees',$degr); // Градус луны
sg('MoonPNG',$degr.'.png'); // Текущая картинка луны
sg('MoonStage',$stage); //Стадия луны
sg('MoonDistance',$distance); //Дистанция до луны
sg('MoonNextNewTime',$nextnewtime); //Время следующего полнолуния 
sg('MoonNextNewDate',$nextnewdate); //Новолуние
sg('MoonNextFullTime',$nextfulltime); //Длительность лунного дня
sg('MoonNextFullDate',$nextfulldate); //Дата следующего полнолуния
sg('MoonPhaseName',$phasename); //Фаза луны

Этот сценарий необходимо периодически запускать. Он высчитывает дату, время, возраст луны и т.п., но и текущий угол поворота луны. Каждому углу соответствует своя картинка. Лунный цикл составляет почти 30 дней. 360/30=12 картинок на 24 часа. То есть 1 картинка на 2 часа. С такой периодичностью и необходимо запускать сценарий.

Проще всего это сделать в  Cron. Добавляем новую запись

3687864288.png

Crontab: 0 0-23/2 * * *

Код:

Показать

Скрыть

//* * * * *
//| | | | |
//| | | | +----- Дни недели (диапазон: 1-7)
//| | | +------- Месяцы     (диапазон: 1-12)
//| | +--------- Дни месяца (диапазон: 1-31)
//| +----------- Часы       (диапазон: 0-23)
//+------------- Минуты     (диапазон: 0-59)
runScript("MoonPhase");

После сохранения, в списке задач должна появиться новая запись

2624597296.png

Осталось разместить информацию на сцене. Тут есть два варианта, вставить только картинку луны, либо картинку луны со всей рассчитанной информацией.

Создаём на сцене новый элемент

3870326352.png

Для первого варианта вставляем этот код 

Показать

Скрыть

<img width="100px" src="/cached/moon/%ThisComputer.MoonPNG%"></img>

 В результате на сцене появиться картинка луны, отображающая текущую фазу

2702181504.png

Для второго варианта код немного сложнее

Показать

Скрыть

<table>
<tr>
<td style="padding-left:10px;padding-top:10px">
<img width="100px" src="/cached/moon/%ThisComputer.MoonPNG%"></img>
</td>
<td style="font-size:12px; color:#FFFFFF; padding-left:10px">
Фаза луны:&nbsp%ThisComputer.MoonPhaseName%<br>
Возраст луны:&nbsp%ThisComputer.MoonAge%<br>
Длительность лунного дня:&nbsp%ThisComputer.MoonNextFullTime%<br>
Дата следующего полнолуния:&nbsp%ThisComputer.MoonNextFullDate%<br>
Время следующего полнолуния:&nbsp%ThisComputer.MoonNextNewTime%<br>
Дистанция до луны:&nbsp%ThisComputer.MoonDistance%
</td>
</tr>
</table>

В результате получим такой виджет

img08.png

 Необходимые файлы