Все живое на нашей планете подвержено влиянию Луны и живет по её циклам. Исходя из этого, думаю информация на сцене умного дома лишней не будет. Ниже приведённый код позволит рассчитать все основные фазы луны и вывести из на сцену в виде красивого виджета.
Для начала любым удобным способом нужно разместить файл MoonPhase.php в корневую папку Majordomo. В моём случае путь до корневой папки находиться по пути /var/www/html/. Так же, в папку /var/www/html/cached/ необходимо загрузить папку moon с изображениями фаз луны. Все файлы прикреплены внизу статьи.
В панели управления majordomo заходим в раздел "Сценарии" и создаём новый
Называем его 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. Добавляем новую запись
Crontab: 0 0-23/2 * * *
Код:
Показать
Скрыть
//* * * * *
//| | | | |
//| | | | +----- Дни недели (диапазон: 1-7)
//| | | +------- Месяцы (диапазон: 1-12)
//| | +--------- Дни месяца (диапазон: 1-31)
//| +----------- Часы (диапазон: 0-23)
//+------------- Минуты (диапазон: 0-59)
runScript("MoonPhase");
После сохранения, в списке задач должна появиться новая запись
Осталось разместить информацию на сцене. Тут есть два варианта, вставить только картинку луны, либо картинку луны со всей рассчитанной информацией.
Создаём на сцене новый элемент
Для первого варианта вставляем этот код
Показать
Скрыть
<img width="100px" src="/cached/moon/%ThisComputer.MoonPNG%"></img>
В результате на сцене появиться картинка луны, отображающая текущую фазу
Для второго варианта код немного сложнее
Показать
Скрыть
<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">
Фаза луны: %ThisComputer.MoonPhaseName%<br>
Возраст луны: %ThisComputer.MoonAge%<br>
Длительность лунного дня: %ThisComputer.MoonNextFullTime%<br>
Дата следующего полнолуния: %ThisComputer.MoonNextFullDate%<br>
Время следующего полнолуния: %ThisComputer.MoonNextNewTime%<br>
Дистанция до луны: %ThisComputer.MoonDistance%
</td>
</tr>
</table>
В результате получим такой виджет