Pull to refresh

Голосовое управление для телевизора Sharp Aquos

В этом посте описывается простой способ организовать голосовое переключение каналов не очень нового телевизора с минимальным количеством программирования на базе Google Home.

Задача


После получения в подарок модную нынче умную колонку Google Home появилось естественное желание устроить голосовое управление всем, чем в принципе можно управлять. Конечно, один из первых кандидатов — телевизор.

На сегодняшний день в новых телевизорах существует много разных интеллектуальных функций, но не все телевизоры новые. В моем случае в наличие имелся только довольно телевизор Sharp Aquos, достаточно большой, чтобы заменить его на новый было достаточно накладно. Качество картинки при этом вполне удовлетворительное. Телевизор, формально, «smart», но его интеллектуальные функции безнадежно устарели.

Для оживления телевизора был использован Google Chromecast Ultra, который, конечно, максимально совместим с Google Home и обслуживает трансляцию фильмов, сериалов и прочего контента.

Помимо этого, Chromecast может включать и выключать телевизор через CEC (Consumer Electronics Control), для серии Sharp Aquos называемый AquosLink.

CEC, однако, не может управлять собственно телевизором: переключать каналы и прочее. Количество необходимых каналов у меня весьма ограничено, поэтому задача стояла включать голосом буквально три канала по их краткому имени.

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

Ингредиенты


  1. Телевизор LC-60LE635RU
  2. Колонка Google Home
  3. Минимальный домашний сервер
  4. Учетная запись Google
  5. Учетная запись платформы автоматизации IFTTT
  6. Внешний фиксированный IP-адрес
  7. Wi-Fi маршрутизатор

Перед настройкой можно почитать, что есть IFTTT

Процедура


Телевизор включаем в домашнюю сеть проводом или по Wi-Fi, в настройках включаем удаленное управление, запоминаем адрес и порт. Аутентификация опционально, я не использовал. Инструкция тут.

На домашний «сервер» (у меня древний Raspberry Pi первого поколения) ставим Python 3 и несложную программу на питоне, принимающую GET-запросы про протоколу HTTP и формирующую команды телевизору по TCP (см. ниже). В программе меняем адрес/порт телевизора, а также порт, на котором программа должна слушать HTTP, на актуальные. (Да, я согласен, хардкодить настройки нехорошо). Программу демонизируем (можно с помощью шаблона для сервиса из репозитория) и ставим на автозапуск. Если на пути есть файерволы, порт нужно открыть.

Для обеспечения базовой безопасности программа использует токен. Токен передается как параметр программе, а также должен использоваться для настройки апплета IFTTT.

На роутере с фиксированным внешним адресом настраиваем port forwarding на соответствующий порт на сервере. На этом порту сервер ждет внешний GET-запрос.

Создаем собственный апплет платформы IFTTT (функция «Make your own Applets from scratch»).

В качестве сервиса-триггера используем Google Assistant, тип триггера «Say a phrase with a text ingredient». Задаем ключевую фразу (например, «Television $»). Не рекомендую использовать слово «TV», как в этом случае Google Home может перепутать собственно телевизор и Chromecast. Символ "$" в таком триггере означает произвольное слово, которое Assistant распознает, а IFTTT передает сервису-действию.

Несколько смущает то, что не поддерживается русский язык, но, надеюсь, это дело недалекого будущего.

В качестве сервиса-действия используем WebHook с методом GET и URL: http://myipaddress.ru:myport/my-secret-tocken/{{TextField}}.

Код


Программа использует стандартные библиотеки python http.server и socket для обслуживания webhook'а и протокола телевизора соответственно. Первая версия решает минимальную задачу — включает три заветных канала. Конечно, к ней можно добавлять возможности конфигурирования, управления звуком и т.д.

Исходный код на гитхабе.
Tags:
Hubs:
You can’t comment this publication because its author is not yet a full member of the community. You will be able to contact the author only after he or she has been invited by someone in the community. Until then, author’s username will be hidden by an alias.