Страница 1 из 4

[Приложение] MajorDoMo Connect Plug-in для Logitech Media Server

Добавлено: Вт июн 30, 2015 3:50 pm
skysilver
Введение
В ходе тестовой эксплуатации в качестве мультирума связки сервера 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. Проверьте, чтобы плагин оказался в списке «Активные подключаемые модули». Далее можно переходить к настройке плагина.
Скриншоты установки плагинаПоказать
001.jpg
001.jpg (167.67 КБ) 18247 просмотров
002.jpg
002.jpg (120.28 КБ) 18247 просмотров
003.jpg
003.jpg (214.56 КБ) 18247 просмотров
004.jpg
004.jpg (159.46 КБ) 18247 просмотров
005.jpg
005.jpg (271.15 КБ) 18247 просмотров
Настройка
Настройка заключается в активации плагина для конкретного плеера и указании команд запуска сценариев или методом при изменении статуса плеера. Изменение настроек плагина требует перезапуска службы LMS. Суть настроек, думаю, будет понятна из скриншотов. Более того, если навести указатель мыши на значок «i», то появится всплывающее окно с подсказкой.
Скриншоты настройки плагинаПоказать
006.jpg
006.jpg (134.62 КБ) 18247 просмотров
007.jpg
007.jpg (163.19 КБ) 18247 просмотров
Со стороны MajorDoMo, в свою очередь, необходимо предусмотреть обработку команд, поступающих от LMS. У себя я это сделал с помощью соответствующего сценария, код которого представлен ниже.
Код сценарияПоказать

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

/*
*    Сценарий обработки событий от плагина 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']);
    }

} 
Чтобы отследить работу плагина можно включить расширенный режим логирования. Для этого в настройках LMS перейти на вкладку «Дополнительно», выбрать пункт «Ведение журнала», в списке найти «plugin.MajorDoMo» и в раскрывающемся списке выбрать пункт «Отладка».
Скриншот включения событий отладки плагинаПоказать
008.jpg
008.jpg (214.26 КБ) 18247 просмотров
Заключение
Исходные коды в открытом доступе 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.

Re: MajorDoMo Connect Plug-in для Logitech Media Server (LMS

Добавлено: Ср июл 01, 2015 11:01 am
vtec
Я так понял, что данный плугин нужен для отображения состояния плееров в мажордомо?
Лучше скажите как мне удаленный mp3 файл отправить на плеер?

Re: MajorDoMo Connect Plug-in для Logitech Media Server (LMS

Добавлено: Ср июл 01, 2015 1:04 pm
skysilver
vtec писал(а):Я так понял, что данный плугин нужен для отображения состояния плееров в мажордомо?
Не столько для отображения, сколько для передачи состояния плееров. Далее средствами MajorDoMo уже организуется реакция на эти события - можно просто индикатор в меню подвесить, можно голосом проговорить, можно выполнить набор нужных команд и т.п.
vtec писал(а):Лучше скажите как мне удаленный mp3 файл отправить на плеер?
Можно поподробнее расписать задачу?
Вообще, LMS по своей идеологии заточен на работу с централизованной медиа библиотекой, и работать с распределенными хранилищами музыки он не умеет. Но можно попробовать решить эту задачу с помощью плагинов. Например, у меня установлены плагины "Интерфейс UPnP/DLNA Media (v1.0)" и "UPnP/DLNA Bridge (v0.2.3.0)". Первый, как раз, позволяет проиграть удаленный файл на плеерах LMS. А второй дает возможность использовать DLNA-устройства в качестве плееров LMS (но с некоторыми ограничениями).

Re: MajorDoMo Connect Plug-in для Logitech Media Server (LMS

Добавлено: Ср июл 01, 2015 6:32 pm
vtec
Я ищу альтернативу Sonos (т.к. все таки дороговато). Что бы в разных комнатах, одновременно, я смог проиграть свой файл (а точнее оповещение голосом) или запустил с NAS'а проиграть музыку в комнате. Но больше все таки, меня интересует мультирум (оповещение).

Re: MajorDoMo Connect Plug-in для Logitech Media Server (LMS

Добавлено: Ср июл 01, 2015 10:20 pm
Ivan
Смотрю я на цены в который раз и думаю. Что проще всё таки RaspberyPi запихнуть в корпус и купить к нему колонки.
А там можно и мультирум и другие прелести

Re: MajorDoMo Connect Plug-in для Logitech Media Server (LMS

Добавлено: Чт июл 02, 2015 11:40 am
skysilver
vtec писал(а):Я ищу альтернативу Sonos (т.к. все таки дороговато). Что бы в разных комнатах, одновременно, я смог проиграть свой файл (а точнее оповещение голосом) или запустил с NAS'а проиграть музыку в комнате. Но больше все таки, меня интересует мультирум (оповещение).
В части музыкального сопровождения считаю LMS вполне законченным решением. Синхронное воспроизведение в разных зонах есть; раздельное воспроизведение разных композиций по зонам есть; управление медиатекой; работа с онлайн сервисами; возможность написания своих плагинов, а также солидное количество уже имеющихся, которые расширяют функционал; мультиплатформенные серверная и клиентские части.

А вот по части использования LMS для голосовых оповещений из MajorDoMo все печально. Заставить проиграть mp3 с голосом из папки cached, конечно, можно. Тут на форуме даже предлагали рабочие варианты. Но на практике это выглядит довольно монструозно. :) Алгоритм при этом получается примерно такой:
1. Если не включен, то включить плеер.
2. Если идет воспроизведение, то запомнить текущую песню и остановить.
3. Сохранить текущий плейлист.
4. В чистый плейлист добавить mp3-файл с голосовым оповещением.
5. Проиграть mp3.
6. Восстановить ранее сохраненный плейлист.
7. Если до оповещения что-то игралось, то запустить проигрывание последней проигрываемой песни.
Если нужно синхронное воспроизведение оповещений в нескольких зонах, то в алгоритм добавляются шаги по объединению плееров в группы синхронизации с последующим удалением этих групп по окончанию оповещения.

Если же использовать LMS только для голосовых оповещений, то алгоритм работы заметно упрощается.

Re: MajorDoMo Connect Plug-in для Logitech Media Server (LMS

Добавлено: Чт июл 02, 2015 11:43 am
skysilver
Ivan писал(а):Смотрю я на цены в который раз и думаю. Что проще всё таки RaspberyPi запихнуть в корпус и купить к нему колонки. А там можно и мультирум и другие прелести
Имхо, Raspberry Pi жирновато использовать только лишь в качестве сетевого плеера. А вот роутеры на OpenWRT с usb-звуковухой самое то. ))

Re: MajorDoMo Connect Plug-in для Logitech Media Server (LMS

Добавлено: Чт июл 02, 2015 2:09 pm
sergejey
Я думаю, что в будущем мы всё же придём к адресному оповещению, когда уведомления будут приходить на нужный терминал (или на несколько сразу). Мухи отдельно, коттлеты отдельно -- медиа само себе, оповещения сами себе. При использовании альтернативных аудио-клиентов это проблема легко решается -- сам себе работает клиент logitech и сам себе работает функция воспроизведения уведомлений как отдельный сервис. Уже сейчас андроид-приложение имеет функцию проигрывания отдельной mp3 по запросу, точно такую же функцию имеет и windows-приложение ArduinoGW, так что задачей системы станет отправка соответствующих запросов на нужные терминалы. Единственная проблема это как приглушить музыку, если она играет, но это тоже можно как-то решить, я думаю.

Re: MajorDoMo Connect Plug-in для Logitech Media Server (LMS

Добавлено: Чт июл 02, 2015 2:32 pm
skysilver
sergejey писал(а):Единственная проблема это как приглушить музыку, если она играет, но это тоже можно как-то решить, я думаю.
Касательно LMS это и не проблема вовсе. Имеется как минимум два варианта API - CLI (на порту 9090) и JsonRPC (http://ip_lms:9000/jsonrpc.js). С их помощью управлять LMS можно как угодно.

Кстати на php есть класс для взаимодействия с LMS через CLI. В принципе можно добавить поддержку в MajorDoMo наряду с VLC, MPD, XBMC. Сайт http://org.0r9.org/labs/SqueezePHPAPI/ Архив http://org.0r9.org/labs/SqueezePHPAPI/S ... 0.1.tar.gz

Re: MajorDoMo Connect Plug-in для Logitech Media Server (LMS

Добавлено: Пн июл 06, 2015 5:09 pm
dipraise
Уважаемый Skysilver, я давно об этом думаю, идея в том, что бы под Logitech Media Server написать плагин для прослушивания музыки с Вконтакте.
Я часто добавляю в свою медиа библиотеку новые песни. Каждый раз их скачивать на сервер не удобно.
А если в плагине будет возможность, искать треки и слушать их со страниц других пользователей это будет ещё круче.
Могли бы вы написать такой плагин?
Заранее спасибо большое.