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

Разработка дополнительных модулей, подключение различных приложений.

Модератор: immortal

skysilver
Сообщения: 2390
Зарегистрирован: Чт авг 21, 2014 8:28 am
Откуда: Киров, Россия
Благодарил (а): 318 раз
Поблагодарили: 1325 раз
Контактная информация:

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

Сообщение skysilver » Вт июн 30, 2015 3:50 pm

Введение
В ходе тестовой эксплуатации в качестве мультирума связки сервера 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 КБ) 12334 просмотра
002.jpg
002.jpg (120.28 КБ) 12334 просмотра
003.jpg
003.jpg (214.56 КБ) 12334 просмотра
004.jpg
004.jpg (159.46 КБ) 12334 просмотра
005.jpg
005.jpg (271.15 КБ) 12334 просмотра
Настройка
Настройка заключается в активации плагина для конкретного плеера и указании команд запуска сценариев или методом при изменении статуса плеера. Изменение настроек плагина требует перезапуска службы LMS. Суть настроек, думаю, будет понятна из скриншотов. Более того, если навести указатель мыши на значок «i», то появится всплывающее окно с подсказкой.
Скриншоты настройки плагинаПоказать
006.jpg
006.jpg (134.62 КБ) 12334 просмотра
007.jpg
007.jpg (163.19 КБ) 12334 просмотра
Со стороны 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 КБ) 12334 просмотра
Заключение
Исходные коды в открытом доступе 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.
За это сообщение автора skysilver поблагодарил:
Samir77 (Чт фев 14, 2019 8:41 pm)
Рейтинг: 1.37%
MajorDoMo (GitHub) на Cubietruck. ОС Debian 7 (wheezy) (kernel 3.4.105) с переносом на HDD.
Мой CONNECT | Блоги | Telegram
vtec
Сообщения: 54
Зарегистрирован: Пн янв 20, 2014 7:35 pm
Благодарил (а): 0
Поблагодарили: 0

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

Сообщение vtec » Ср июл 01, 2015 11:01 am

Я так понял, что данный плугин нужен для отображения состояния плееров в мажордомо?
Лучше скажите как мне удаленный mp3 файл отправить на плеер?
skysilver
Сообщения: 2390
Зарегистрирован: Чт авг 21, 2014 8:28 am
Откуда: Киров, Россия
Благодарил (а): 318 раз
Поблагодарили: 1325 раз
Контактная информация:

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

Сообщение skysilver » Ср июл 01, 2015 1:04 pm

vtec писал(а):Я так понял, что данный плугин нужен для отображения состояния плееров в мажордомо?
Не столько для отображения, сколько для передачи состояния плееров. Далее средствами MajorDoMo уже организуется реакция на эти события - можно просто индикатор в меню подвесить, можно голосом проговорить, можно выполнить набор нужных команд и т.п.
vtec писал(а):Лучше скажите как мне удаленный mp3 файл отправить на плеер?
Можно поподробнее расписать задачу?
Вообще, LMS по своей идеологии заточен на работу с централизованной медиа библиотекой, и работать с распределенными хранилищами музыки он не умеет. Но можно попробовать решить эту задачу с помощью плагинов. Например, у меня установлены плагины "Интерфейс UPnP/DLNA Media (v1.0)" и "UPnP/DLNA Bridge (v0.2.3.0)". Первый, как раз, позволяет проиграть удаленный файл на плеерах LMS. А второй дает возможность использовать DLNA-устройства в качестве плееров LMS (но с некоторыми ограничениями).
За это сообщение автора skysilver поблагодарил:
Samir77 (Чт фев 14, 2019 8:42 pm)
Рейтинг: 1.37%
MajorDoMo (GitHub) на Cubietruck. ОС Debian 7 (wheezy) (kernel 3.4.105) с переносом на HDD.
Мой CONNECT | Блоги | Telegram
vtec
Сообщения: 54
Зарегистрирован: Пн янв 20, 2014 7:35 pm
Благодарил (а): 0
Поблагодарили: 0

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

Сообщение vtec » Ср июл 01, 2015 6:32 pm

Я ищу альтернативу Sonos (т.к. все таки дороговато). Что бы в разных комнатах, одновременно, я смог проиграть свой файл (а точнее оповещение голосом) или запустил с NAS'а проиграть музыку в комнате. Но больше все таки, меня интересует мультирум (оповещение).
Ivan
Сообщения: 1459
Зарегистрирован: Сб окт 12, 2013 11:03 pm
Благодарил (а): 49 раз
Поблагодарили: 312 раз

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

Сообщение Ivan » Ср июл 01, 2015 10:20 pm

Смотрю я на цены в который раз и думаю. Что проще всё таки RaspberyPi запихнуть в корпус и купить к нему колонки.
А там можно и мультирум и другие прелести
Linux, Raspberry PI, MySensors
Connect: http://connect.smartliving.ru/profile/53
Мои проекты: http://smartliving.ru/profile/4
skysilver
Сообщения: 2390
Зарегистрирован: Чт авг 21, 2014 8:28 am
Откуда: Киров, Россия
Благодарил (а): 318 раз
Поблагодарили: 1325 раз
Контактная информация:

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

Сообщение skysilver » Чт июл 02, 2015 11:40 am

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

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

Если же использовать LMS только для голосовых оповещений, то алгоритм работы заметно упрощается.
MajorDoMo (GitHub) на Cubietruck. ОС Debian 7 (wheezy) (kernel 3.4.105) с переносом на HDD.
Мой CONNECT | Блоги | Telegram
skysilver
Сообщения: 2390
Зарегистрирован: Чт авг 21, 2014 8:28 am
Откуда: Киров, Россия
Благодарил (а): 318 раз
Поблагодарили: 1325 раз
Контактная информация:

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

Сообщение skysilver » Чт июл 02, 2015 11:43 am

Ivan писал(а):Смотрю я на цены в который раз и думаю. Что проще всё таки RaspberyPi запихнуть в корпус и купить к нему колонки. А там можно и мультирум и другие прелести
Имхо, Raspberry Pi жирновато использовать только лишь в качестве сетевого плеера. А вот роутеры на OpenWRT с usb-звуковухой самое то. ))
MajorDoMo (GitHub) на Cubietruck. ОС Debian 7 (wheezy) (kernel 3.4.105) с переносом на HDD.
Мой CONNECT | Блоги | Telegram
Аватара пользователя
sergejey
Site Admin
Сообщения: 4263
Зарегистрирован: Пн сен 05, 2011 6:48 pm
Откуда: Минск, Беларусь
Благодарил (а): 74 раза
Поблагодарили: 1423 раза
Контактная информация:

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

Сообщение sergejey » Чт июл 02, 2015 2:09 pm

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

Сергей Джейгало, разработчик MajorDoMo
Идеи, ошибки -- за предложениями по исправлению и развитию слежу только здесь!
Профиль Connect -- информация, сотрудничество, услуги
skysilver
Сообщения: 2390
Зарегистрирован: Чт авг 21, 2014 8:28 am
Откуда: Киров, Россия
Благодарил (а): 318 раз
Поблагодарили: 1325 раз
Контактная информация:

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

Сообщение skysilver » Чт июл 02, 2015 2:32 pm

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
За это сообщение автора skysilver поблагодарил:
dipraise (Пн июл 06, 2015 5:22 pm)
Рейтинг: 1.37%
MajorDoMo (GitHub) на Cubietruck. ОС Debian 7 (wheezy) (kernel 3.4.105) с переносом на HDD.
Мой CONNECT | Блоги | Telegram
dipraise
Сообщения: 7
Зарегистрирован: Ср окт 08, 2014 2:05 pm
Откуда: Волгоград
Благодарил (а): 2 раза
Поблагодарили: 0

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

Сообщение dipraise » Пн июл 06, 2015 5:09 pm

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