Телевизор в Homekit через Нome Assistant. Способ изящный - используем платформу Universal и Scripts.

26 июня 2019, 21:29

В прошлый раз, мы добавили телевизор в Homekit через Home Assistant используя Broadlink и платформу SmartIR. Подробнее об этом здесь. Этот способ хоть и легкий, но не подходит к случаю, где требуется совместить несколько устройств, чтобы получить конечный продукт отвечающий вашим требованиям. Как раз для таких случаев можно использовать платформу Universal. В моем случае компонент Samsung покрывает почти все органы управления телевизора: громкость, переключение каналов, mute, выключение. Но к сожалению не умеет включать телевизор, а также менять входы, для этого я использую Apple TV и Broadlink соответственно. Чтобы все это объединить нам и понадобиться вышеназванная платформа. 

Сразу же жирный дисклеймер, это не пошаговая инструкция, а лишь пример реализации, который подошел именно мне. Можете взять за основу этот пример, а можете собрать все сами. Конечная цель - получить телевизор в Homekit лишь с нужными нам функциями.

 
 

Подготовительный этап

Начинаем с создания списка входов, которые мы хотим видеть в нашем будущем плеере. Для этого создаем input_select в файле configuration.yaml. Я добавил лишь физические входы, но ни что не мешает вам добавить сюда ваши любимые ТВ каналы или даже комбинацию действий.

 
 
#input options
input_select:
  tv_sources:
    name: TV Source
    options:
      - 'TV'
      - 'HDMI 1'
      - 'HDMI 2'
      - 'HDMI 3'
      - 'HDMI 4'
#    initial: 'TV'
    icon: mdi:television

Из-за отсутствия обратной связи по выбранному входу (здесь мы будем использовать Broadlink c IR) пришлось закомментировать initial, так как не было возможности выбрать другие входы при TV выбранном по умолчанию.

Теперь нам нужно за каждой опцией входа прописать, что должно происходить чтоб этот конкретный вход был выбран. Это легко сделать с помощью scripts. В файле scripts.yaml прописываем следующий код:

 
 
# Different TV sources
source_tv:
    alias: Source TV
    sequence:
      - service: broadlink.send
        data:
          host: 192.168.0.22
          packet: "JgBGAJSTEjgSOBI4EhMSExITEhMSExI4EjgSNxMTEhQRFBEUERQRORE4EhQSExITEhMSOBITEhMSExI4EjgSOBI4EhMSOBIADQUAAA=="
source_hdmi1:
    alias: Source HDMI 1
    sequence:
      - service: broadlink.send
        data:
          host: 192.168.0.22
          packet: "JgBGAJGWETkRORI4ERQRFBAVERQRFBE5ETkROREUEBURFBEUERQQOxA6EBUPOw8WDxYQFRA6DxYQFRA6EBUPOxA6ETkRFBEADQUAAA=="
source_hdmi2:
    alias: Source HDMI 2
    sequence:
      - service: broadlink.send
        data:
          host: 192.168.0.22
          packet: "JgBGAJOUETkRORA6ERQQFRAVERQRFBA6ETkROhAVDxYQFQ8WEBUQFQ87EDoRORA6DzsQFRA6DzsPFhAVDxYQFRAVEDoQFRAADQUAAA=="
source_hdmi3:
    alias: Source HDMI 3
    sequence:
      - service: broadlink.send
        data:
          host: 192.168.0.22
          packet: "JgBGAJOUEDoRORE5ERQRFRAUERQRFBE5EDsQOhAVEBUPFg8WDxYPFhA6EBUPFg8WEBUROQ87EDoQFQ87EDoQOhA6EBUPFhAADQUAAA=="
source_hdmi4:
    alias: Source HDMI 4
    sequence:
      - service: broadlink.send
        data:
          host: 192.168.0.22
          packet: "JgBGAJOVETgRORE6DxYQFQ8WDxYPFhA6EDoQOhAVDxYQFQ8WDxYPOw8WEDoQFRAVDxYPOxA6EBUQOhAVEDoQOhA6EBUPFhAADQUAAA=="

Как я и говорил выше здесь ваша фантазия может легко разыграться. Вы можете запускать целые автоматизации при выборе одного из входов. Например при выборе ATV автоматом еще и приглушать свет. 

Еще один фрагмент кода, который пригодиться нам в дальнейшем это выключатель телевизора. Можно прописать эти действия и напрямую в universal, но у меня уже был готовый поэтому я просто использовал его. Сам выключатель это простой template switch, который включает ТВ путем активации Apple TV и тот в свою очередь подтягивает телевизор по CEC. А вот выключение идет уже обоих компонентов, для того чтобы потом телевизор можно было снова включить, ведь если ATV будет активен, то команда на включение не пройдет.

 
 
switch:
  - platform: template
    switches:
      livingroom_tv_switch:
        friendly_name: "TV"
        value_template: "{{ is_state('media_player.samsung_tv', 'on') }}"
        turn_on:
          service: media_player.turn_on
          data:
            entity_id: media_player.apple_tv
        turn_off:
          service: media_player.turn_off
          data:
            entity_id: media_player.samsung_tv, media_player.apple_tv
        icon_template: >-
          {% if is_state('media_player.samsung_tv', 'on') %}
            mdi:television
          {% else %}
            mdi:television-off
          {% endif %}

Собираем мозаику

Теперь осталось лишь прописать все нужные действия в наш universal media player. Пример моего кода из configuration.yaml прилагается. Из children плеер будет брать статус, там прописываем наш Samsung TV. Далее команды на включение, выключение, громкость и mute, все задается стандартными сервисами, ничего сложного. В select_source прописываем все наши вводы и запуск с помощью сервиса script.turn_on

 
 
media_player:
#Universal player
  - platform: universal
    name: Universal TV
    children:
      - media_player.samsung_tv
    commands:
      turn_on:
        service: media_player.turn_on
        data:
          entity_id: media_player.apple_tv
      turn_off:
        service: switch.turn_off
        data:
          entity_id: switch.livingroom_tv_switch
      volume_up:
        service: media_player.volume_up
        data:
          entity_id: media_player.samsung_tv
      volume_down:
        service: media_player.volume_down
        data:
          entity_id: media_player.samsung_tv
      volume_mute:
        service: media_player.volume_mute
        data:
          entity_id: media_player.samsung_tv
      select_source:
        service: script.turn_on
        data_template:
          entity_id: >
            {% if source ==  'TV' %}
              script.source_tv
            {% elif source ==  'HDMI 1' %}
              script.source_hdmi1
            {% elif source ==  'HDMI 2' %}
              script.source_hdmi2
            {% elif source ==  'HDMI 3' %}
              script.source_hdmi3
            {% elif source ==  'HDMI 4' %}
              script.source_hdmi4
            {% endif %}
    attributes:
      is_volume_muted: media_player.samsung_tv|is_volume_muted
      volume_level: media_player.samsung_tv|volume_level
#      source: input_select.tv_sources
      source_list: input_select.tv_sources|options

Теперь можно перезапускать НА и добавлять новую карточку в lovelace для проверки функционала нашего нового универсального медиа-плеера. Вот так он будет выглядеть в интерфейсе. Работают все кнопки и выбор входов, за исключением previous, next и play/pause.

 
 

Перед тем как добавлять наш плеер в Homekit нужно внести некоторые изменения в файл customize.yaml, а именно прописать device class и все входы в source_list. Вот мой пример:

 
 
media_player.universal_tv:
  device_class: tv
  friendly_name: Living Room TV
  source_list: [TV,HDMI 1,HDMI 2,HDMI 3,HDMI 4]
После этого смело добавляем наш плеер в homekit и перезапускаем Home Assistant.
 
homekit:
  filter:
    include_entities:
      - media_player.universal_tv
Результат не заставит себя долго ждать:
 

Как видите включение, а также выбор каналов работает отлично. При вызове remote можно управлять громкостью с помощью боковых клавиш телефона и к сожалению, больше ничем. Пока реализация Homekit в Home Assistant для телевизора не позволяет использовать весь потенциал, но уже есть открытые запросы на расширение функционала и будем надеяться что разработчики добавят эти возможности уже в скором времени. 

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

 
 

Все новости мира умных домов - t.me/SprutAI_News

Остались вопросы? 
Мы в Telegram - @Soprut
Мы в Instagram - @Sprut666666

Хочешь умный дом но нет времени разбираться?
Посмотри примеры работ и выбери себе интегратора.
  1. (wire707)
    (wire707) 4 месяца назад

    Вот супер. Но самое обидное, что есть ИК «шайба» от Xiaomi.

    С ней такое можно «провернуть»?

    • Григорий Абрамов (grishmanCH)

      Скорее всего можно. Во первых SmartIr поддерживает эту шайбу. Вот тут я описал как сделать ТВ на его основе. Ну а во вторых вы можете создать команды на переключение входов и сделать как описано выше с платформой Universal, просто посмотрите как отсылать команды с помощью Xiaomi пульта.

  2. (radinsky)
    (radinsky) 4 месяца назад

    как вызывается remote? что бы громкостью управлять?

    • Григорий Абрамов (grishmanCH)
      Григорий Абрамов (grishmanCH) отредактировано 4 месяца назад

      Нижний свайп и потом на пультик жмёшь 

      1000x_image.jpeg?1563523239
      • (radinsky)
        (radinsky) 4 месяца назад

        спасибо!

        вообще что б этот пультик там появился, сначала надо его добавить через настройки Control Center, он называется Apple TV Remote.

        причем что самое страное что если открываешь просто аппу Remote, управление TV там нет :\

  3. (radinsky)
    (radinsky) отредактировано 21 день назад

    после выхода ios 13 universal перестал работать на девайсах с ios 12 (на девайсах с ios 13 работает нормально)

К списку блогов

Скидки для сообщества

Интернет-магазин yourhomekit.ru

+7 914 550-51-11
Промокод:
SPRUT-BLG
Размер скидки:
8%
Cамый большой ассортимент в России аксессуаров Apple HomeKit

Похожие записи

20 января 2019, 17:39
Создание очень бюджетной автоматизации рулонных штор
25 марта 2019, 05:02
Нативный Homekit на ESP8266 Relay_8CH
13 февраля 2019, 22:00
Подключение радио на Xiaomi Gateway к Home Assistant c дальнейшим использованием в автоматизациях
19 апреля 2019, 20:53
Требуется ваше мнение!
06 февраля 2019, 12:02
Автоматизированное открытие/закрытие окна
04 апреля 2019, 12:45
Самое важное из апдейта Home Assistant 0.91-0.91.4 от 03.04.19.
21 марта 2019, 11:59
Самое важное из апдейта Home Assistant 0.9 от 20.03.19.
21 февраля 2019, 21:12
Самое важное из апдейта Home Assistant 0.88 от 20.02.19.
07 февраля 2019, 21:12
Самое важное из апдейта Home Assistant 0.87 от 06.02.19.