Прикручиваем интернет радио к OpenHAB

В качестве радио будет выступать компутер (позднее перетащу на ODROID-C1+ под ORDOBIAN) с запущенным KODI (он же XBMC), который умеет понимать внешний мир через JSON RPC API. Для понимания в настройках надо поставить соответствующий флажок.

Попробовал настроить встроенный биндинг на xbmc, но ничто не вышло.

sudo apt-get install openhab-addon-action-xbmc
sudo apt-get install openhab-addon-binding-xbmc

Насторожило отсутствие дефолтовых настроек в openhab.cfg - добавил. Но отчего-то опенхаб не мог соединиться с kodi (под убунтой и на ТВ от ТпВижон’а).

Через HTTP биндинг сразу не завелось, сделал через правило + sendHttpGetRequest. Как оказалось опенхабу не нравится наличие в строке куска JSON’а по причине наличия знаков []{}, и все что после "{" не отправляет. А замена их на

{ -> %7B  } -> %7D " -> %22  : -> %3A [ -> %5B ] -> %5D

не привела в желаемому результату - опенхаб пытается форматировать строку запроса, подставляя в нее разное полезное все это вываливается с ошибкой

2016-08-07 16:03:29.853 [ERROR] [.service.AbstractActiveService] - Error while executing background thread HTTP Refresh Service
java.util.UnknownFormatConversionException: Conversion = 'D'
	at java.util.Formatter$FormatSpecifier.conversion(Formatter.java:2691) ~[na:1.8.0_91]
	at java.util.Formatter$FormatSpecifier.(Formatter.java:2720) ~[na:1.8.0_91]
	at java.util.Formatter.parse(Formatter.java:2560) ~[na:1.8.0_91]
	at java.util.Formatter.format(Formatter.java:2501) ~[na:1.8.0_91]
	at java.util.Formatter.format(Formatter.java:2455) ~[na:1.8.0_91]
	at java.lang.String.format(String.java:2940) ~[na:1.8.0_91]
	at org.openhab.binding.http.internal.HttpBinding.execute(HttpBinding.java:139) ~[na:na]
	at org.openhab.core.binding.AbstractActiveBinding$BindingActiveService.execute(AbstractActiveBinding.java:156) ~[na:na]
	at org.openhab.core.service.AbstractActiveService$RefreshThread.run(AbstractActiveService.java:173) ~[na:na]

на это даже есть какие-то костыли в виде параметра «не форматировать» в будущих релизах. А будущие релизы о как не скоро появятся, учитывая что параллельно пилится ОпенХаб2.

Для «сокращения» url’ов запихаем их в php скриптик, который будет пережёвывать lighttpd + php

1. Устанавливаем веб-сервер + пхп
Для этого нам понадобится

sudo apt-get install lighttpd
sudo apt-get install php5-cgi

включаем

lighttpd-enable-mod fastcgi
lighttpd-enable-mod fastcgi-php

перезапускаем веб сервер

 
service lighttpd restart

Проверяем

nano /var/www/info.php

содержимое

<?php
phpinfo();
?>

Идем по адресу http://hostname/info.php и если видим что-то похожее на вывод phpinfo(), стало быть пол дела есть.

2. Пишем скрипт
Далее нам надо написать скрипт, который будет обходится несколько меньшим числом параметров, чем строка JSON’а улетающая в KODI
Придумалось вот такое

kodi.php?ip=<last_octet>&q=<action>&v=<value>
last_octet – сюда передаем последний байт ИП адреса, т.к плееров может быть несколько.
action – событие
value – параметр. Уровень громкости или «название» радиостанции
в результате получился вот такой вот набор буков

---------------------------
<?php

$rqHost = "http://192.168.10.".$_GET['ip'].":8080/jsonrpc?request=";

switch ( $_GET['q'] ) {
case "title":
	$rqQuery = "{\"jsonrpc\":\"2.0\",\"method\":\"Player.GetItem\",\"params\":{\"properties\":[\"title\"],\"playerid\":0},\"id\":\"AudioGetItem\"}";
	break;
case "stop":
	$rqQuery = "{\"jsonrpc\":\"2.0\",\"id\":\"1\",\"method\":\"Player.Stop\",\"params\":{\"playerid\":0}}";
    break;
case "volume":	
	$rqQuery = "{\"jsonrpc\":\"2.0\",\"method\":\"Application.SetVolume\",\"params\":{\"volume\":".$_GET['v']."},\"id\":1}";
    break;
case "play":	
	$rqQuery = "{\"jsonrpc\":\"2.0\",\"id\":\"1\",\"method\":\"Player.Open\",\"params\":{\"item\":{\"file\":\"http://air2.radiorecord.ru:805/".$_GET['v']."\"}}}";
	break;
default:
	echo "unknown: ".$_GET['q'];
	return;
}

$rq = file_get_contents($rqHost.$rqQuery);
echo $rq;

?>
--------------------------------

Для проверки запускаем нечто вида

http://openhab.kool.ru/kodi.php?ip=223&q=play&v=rr_320

ответом должно быть {"id":"1","jsonrpc":"2.0","result":"OK"} и воспроизведение плеером потока.

3. Настраиваем элементы опенхаба
На шаре \\openhab.kool.ru\conf
Добавляем в каталог \items файлик kodi.items следующего содержания

---------------------------------
Group kodi(all)

String z51_title "Title [%s]" (kodi) { http="<[http://openhab.kool.ru/kodi.php?ip=223&q=title:6000:JSONPATH($.result.item.title)]" }
Switch z51_rr "Record" (kodi) { http=">[ON:GET:http://openhab.kool.ru/kodi.php?ip=223&q=play&v=rr_320] >[OFF:GET:http://openhab.kool.ru/kodi.php?ip=223&q=stop]"}
---------------------------------

z51_title будет обрабатывать наименование воспроизводимого трека
z51_rr включатель радио

После чего на странице опенхаба увидим нечто похожее на

Осталось добавить регулятор громкости, запихать коди в одроид-ц1, запилить кухонные колонки и добавить магии включения звука самостоятельно …