Привет! Меня зовут 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.

Настройка в Яндексе

  1. Перейдите в Консоль разработчика Яндекс Диалогов.

  2. Создайте навык типа "Умный дом".

  3. Укажите:

    • Authorization URL: https://ваш-домен/oauth/authorize

    • Token URL: https://ваш-домен/oauth/token

    • Smart Home API URL: https://ваш-домен

  4. Сохраните и привяжите навык в приложении "Яндекс".

После этого Алиса начнёт видеть ваш приёмник как устройство умного дома.

Технологический стек

  • 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 и просто отзывы приветствуются. Всего доброго.

Комментарии (0)