В ходе тестовой эксплуатации в качестве мультирума связки сервера Logitech Media Server (LMS) и клиентов Squeezelight возникла очевидная задача – автоматизировать включение/выключение питания усилителей (или активных компьютерных колонок). В ручном режиме такой функционал уже давно был реализован – с помощью кнопок в меню MajorDoMo можно включать и выключать питание усилителей. Но это было, само-собой неудобно, т.к. приходилось сначала зайти в MajorDoMo, включить нужный усилитель, а потом уже запускать проигрывание музыки в плеере. Ну а по завершению прослушивания нужно опять же не забыть выключить питание, чтобы лишнюю электроэнергию не расходовать.
Для решения поставленной задачи было решено написать плагин для LMS, который бы отслеживал состояния плееров и запускал сценарии или методы MajorDoMo с помощью HTTP-запроса.
Информации по написанию таких плагинов не особо много, а на русском языке так вообще ничего не нашел. Поэтому делал на примере других плагинов. В итоге в плане качества кода получилось так себе, но функции свои он выполняет, и мне этого достаточно.

Общие сведения
Плагин предназначен для взаимодействия Squeezebox (Logitech Media Server) и системы домашней автоматизации MajorDoMo. Плагин позволяет реализовать запуск сценариев или методов MajorDoMo при изменении состояния плееров (включение, выключение, старт, пауза, изменение громкости). Плагин имеет раздельные настройки для каждого плеера.
Установка
Для установки плагина откройте веб-интерфейс Logitech Media Server в браузере (обычно это http://ip_servers:9000/), перейдите в настройки и откройте страницу управления плагинами. Скопируйте и вставьте ссылку на репозиторий этого плагина в поле внизу страницы (http://skysilver-lab.github.io/MajorDoM ... y/repo.xml). Сохраните настройки и перезапустите службу Logitech Media Server. Проверьте, чтобы плагин оказался в списке «Активные подключаемые модули». Далее можно переходить к настройке плагина.
Настройка заключается в активации плагина для конкретного плеера и указании команд запуска сценариев или методом при изменении статуса плеера. Изменение настроек плагина требует перезапуска службы LMS. Суть настроек, думаю, будет понятна из скриншотов. Более того, если навести указатель мыши на значок «i», то появится всплывающее окно с подсказкой.
Код: Выделить всё
/*
* Сценарий обработки событий от плагина MajorDoMo-LMS-Connect
*
* Варианты вызова сценария их плагина (в т.ч. пример передаваемых при этом параметров):
* при включении плеера:
* /objects/?script=lms&player=mr3020&status=on
* при выключении плеера:
* /objects/?script=lms&player=mr3020&status=off
* при старте проигрывания:
* /objects/?script=lms&player=mr3020&status=play
* при паузе:
* /objects/?script=lms&player=mr3020&status=pause
* при изменении громкости:
* /objects/?script=lms&player=mr3020&status=volume
* Прим.: в этом случае в сценарий также передается параметр "vollevel" со значением текущего уровня громкости плеера.
*
* Описание функций плагина, порядок установки и настройки см. по
* ссылке http://skysilver-lab.github.io/MajorDoMo-LMS-Connect/
*
* Исходный код плагина https://github.com/skysilver-lab/MajorDoMo-LMS-Connect
*
* Copyright (C) 2015 Agaphonov Dmitri aka skysilver [mailto:skysilver.da@gmail.com]
*/
// Если сценарию передан параметр player, то выполняем необходимое,
// иначе - ничего не делаем.
if (isset($params['player'])) {
$player = $params['player'];
// Если сценарию передан параметр status, то сохраним его значение в переменную для дальнейшего использования.
if (isset($params['status'])) {
$playerStatus = $params['status'];
}
// Если сценарий был запущен от имени плеера на роутере TP-Link MR3020,
// то выполним связанные с ним задачи (например, включение/выключение питания усилителя).
if ($player == 'mr3020') {
// Сохраним текущее значение уровня громкости плеера, если его значение было передано в параметрах вызова сценария.
if ((isset($params['vollevel'])) && ($playerStatus == 'volume')) sg('PlayerKitchen.VolumeLevel', $params['vollevel']);
// Узнаем текущий статус реле питания усилителя.
$relayStatus = gg('Relay1Iboard.status');
// Если реле выключено, а от плагина пришли события on или play, то включим питание усилителя.
if ($relayStatus == '0' && ($playerStatus == 'on' || $playerStatus == 'play')) {
clearTimeOut('mr3020offTimer');
cm('Relay1Iboard.turnOn');
say('Колонки на кухне включены.', 0);
}
// Если реле включено, а от плагина пришло событие off, то выключим питание усилителя.
else if ($relayStatus == '1' && $playerStatus == 'off') {
clearTimeOut('mr3020offTimer');
cm('Relay1Iboard.turnOff');
say('Колонки на кухне выключены.', 0);
}
// Если реле включено, а от плагина пришло событие pause, то запустим таймер на автоматическое отключение питания усилителя
// (т.е. если плеер бездействует, то питание отключаем через заданное время).
else if ($relayStatus == '1' && $playerStatus == 'pause') {
clearTimeOut('mr3020offTimer');
//say('Запущен таймер выключения колонок.', 0);
setTimeOut('mr3020offTimer', 'cm("Relay1Iboard.turnOff");say("Колонки на кухне выключены по таймеру.", 0);', 180);
}
// Если реле включено, а от плагина пришли события on или play, то очищаем таймер автоматического отключения питания.
else if ($relayStatus == '1' && ($playerStatus == 'on' || $playerStatus == 'play')) {
clearTimeOut('mr3020offTimer');
}
}
// Если сценарий был запущен от имени плеера на сервере Cubietruck,
// то выполним связанные с ним задачи.
if ($player == 'cubietruck') {
// Сохраним текущее значение уровня громкости плеера, если его значение было передано в параметрах вызова сценария.
if (isset($params['vollevel'])) sg('PlayerBedroom.VolumeLevel', $params['vollevel']);
}
}
Исходные коды в открытом доступе https://github.com/skysilver-lab/MajorDoMo-LMS-Connect
Кто пожелает доработать и расширить функционал пользуйтесь и отписывайтесь о результатах.
Релизы https://github.com/skysilver-lab/MajorD ... t/releases
Страничка http://skysilver-lab.github.io/MajorDoMo-LMS-Connect/
С уважением, skysilver.