Привет! Меня зовут oldzoomer, и я хочу рассказать, как я подключил приёмник Триколор к экосистеме Яндекса, чтобы управлять им голосом через Алису. Всё сделано на Java 21, Spring Boot и официальном Stingray TV API - без хаков и модификаций прошивки.
Проект полностью open-source и доступен здесь: https://github.com/oldzoomer-ru/stingraytv-alice
Почему это возможно?
Приёмники Триколор - это не просто "телевизионные коробки". Они представляют собой полноценные сетевые устройства, на базе платформы StingrayTV (на базе Linux), и с официальным REST API под названием Stingray TV API. Документация к нему публично доступна: https://devstingray.gs-labs.tv/restapi
Этот API позволяет:
Включать и выключать приёмник;
Переключать каналы (вперёд/назад или по номеру);
Регулировать громкость;
Получать информацию о текущем канале и состоянии устройства.
Всё это работает локально, без облачных зависимостей, и без аутентификации для базовых команд - что делает интеграцию простой и надёжной.
С другой стороны, Дом с Алисой предоставляет стандартизированный способ подключать сторонние устройства через Provider Adapter API. Это REST-интерфейс, через который Яндекс:
Запрашивает список устройств;
Опрашивает их текущее состояние;
Отправляет команды управления (вкл/выкл, смена канала и т.д.).
Остаётся лишь написать "мост" между этими двумя системами - и именно этим и занимается данный проект.
Как устроено решение
Приложение реализует Yandex Smart Home Provider API в соответствии с официальной спецификацией. Оно состоит из нескольких ключевых компонентов:
1. OAuth 2.0 и аутентификация
Для привязки аккаунта Яндекса используется Authorization Code Flow:
Пользователь нажимает "Привязать к Яндексу" в приложении "Дом с Алисой";
Его перенаправляет на
/oauth/authorize;После подтверждения Яндекс получает код и обменивает его на JWT-токен через
/oauth/token;Все последующие вызовы Smart Home API защищены этим токеном.
Сессии stateless: нет хранения состояния на сервере, что упрощает масштабирование и развёртывание.
2. Smart Home API
Реализованы все обязательные эндпоинты:
GET /v1.0/user/devices- возвращает список устройств (в нашем случае - один приёмник Триколор);POST /v1.0/user/devices/query- запрашивает текущее состояние (вкл/выкл, громкость, канал);POST /v1.0/user/devices/action- выполняет непосредственно сами команды;POST /v1.0/user/unlink- обрабатывает отвязку аккаунта.
Устройство описывается как media_device.receiver, что позволяет Алисе корректно интерпретировать медиа-команды:
"Алиса, включи Триколор", "Переключи на 5 канал", "Сделай потише".
3. Клиент Stingray TV API
Внутренний HTTP-клиент отправляет команды напрямую на приёмник по локальному IP.
Ответы от приёмника не содержат сложных структур - обычно это просто HTTP 200 OK, что упрощает обработку.
4. Обнаружение устройства через mDNS
Чтобы не требовать от пользователя ввода IP-адреса вручную, приложение использует mDNS (multicast DNS). При запуске сервера оно отправляет запрос на имя:
_stingray-remote._tcp.local.
Если в сети есть приёмник Триколор, он отвечает с указанием своего IP и порта (обычно 50000).
При одном приёмнике - он выбирается автоматически.
При нескольких - можно задать IP вручную через механизм конфигурации Spring.
В будущем планируется полноценная поддержка нескольких приёмников с возможностью именовать их ("Триколор в гостиной", "Триколор на кухне" и т.п.).
Требования и развёртывание
Сетевые требования
Stingray TV API доступен только в локальной сети. Это означает, что ваш сервер должен:
Находиться в той же подсети, что и приёмник Триколор;
Иметь доступ к его IP-адресу по HTTP.
Однако Яндекс вызывает ваш сервер из интернета, поэтому необходимо обеспечить внешний доступ - например, через reverse proxy.
Запуск
Проект собирается как обычное Spring Boot-приложение и запускается в Docker:
git clone https://github.com/oldzoomer-ru/stingraytv-alice.git
cd stingraytv-alice
docker-compose up -d
Приложение будет слушать порт 8080.
Настройка в Яндексе
Перейдите в Консоль разработчика Яндекс Диалогов.
Создайте навык типа "Умный дом".
-
Укажите:
Authorization URL:
https://ваш-домен/oauth/authorizeToken URL:
https://ваш-домен/oauth/tokenSmart Home API URL:
https://ваш-домен
Сохраните и привяжите навык в приложении "Яндекс".
После этого Алиса начнёт видеть ваш приёмник как устройство умного дома.
Технологический стек
Java 21 - современная LTS-версия;
Spring Boot 3.x - для быстрой разработки REST-сервисов;
Spring Security - для реализации OAuth2 и JWT;
JmDNS - для обнаружения устройств через mDNS;
Gradle - сборка проекта;
Docker - контейнеризация.
Лицензия: GPLv3.
Безопасность
Stingray TV API не требует аутентификации, но доступен только в локальной сети, что ограничивает поверхность атаки.
Тем не менее, не рекомендуется пробрасывать порт приёмника напрямую в интернет - только через изолированный прокси-сервер с валидацией запросов.
Заключение
Этот проект показывает, как современные приёмники Триколор, благодаря (случайно) открытому и документированному API, могут легко интегрироваться в популярные экосистемы умного дома. Никаких "костылей" - только стандартные протоколы: HTTP, mDNS, OAuth2, JWT.
Если у вас есть приёмник Триколор и желание управлять им голосом - попробуйте. Код открыт, документация есть, всё работает.
Pull request’ы, issue и просто отзывы приветствуются. Всего доброго.