Yandex.Station for Home Assistant

hacs_badge Donate

Компонент для управления Яндекс.Станцией и другими колонками с Алисой из Home Assistant.

Новые фичи в версии 2.0:

  • Поддержка всех колонок через облачное управление (не все протестированы!)
  • Одновременное управление колонками по локальной сети и через облако
  • Проигрывание медиа по ссылкам (подробнее)
  • Яндекс Алиса в Telegram (подробнее)

Список устройств

Локальное управление не поддерживаются на стороне Яндекса. Если на колонку "прилетит" новая прошивка с поддержкой управления - она с высокой вероятностью "подхватится" без доработки компонента.

Внимание: у облачного управления нет обратной связи от колонки. Неизвестно играет ли колонка что-то или стоит на паузе и какая у неё актуальная громкость. Так что состояние колонки в Home Assistant может отличаться от актуального состояния колонки, если вы давали ей команды не из компонента.

Возможности локального и облачного управления:

  • управление воспроизведением и громкостью станции
  • отправка TTS на станцию из окна медиаплеера и через сервисы (голосом Алисы!)
  • отправка любых текстовых команд на станцию из окна медиаплеера и через сервисы (например, включи мою музыку)
  • спецэффекты в TTS (библиотека звуков и наложение эффектов на голос Алисы)

Дополнительные возможности локального управления:

  • просмотр что играет на станции, включая обложку (только для музыки)
  • перемотка треков

Карточка Яндекс Станции

Обложки работают только при локальном управлении

Карточка Яндекс Мини

Демо

Управление Яндекс.Станцией Мини из Home Assistant

Установка

Ставится через кастомный репозиторий HACS - AlexxIT/YandexStation

Или через копирование папки yandex_station из последнего релиза в папку custom_components (создать при необходимости) директории с конфигами.

Настройка

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

Двухфакторная авторизация работает по одноразовому паролю из приложения Яндекс.Ключ. Главное успеть за 30 секунд :)

yandex_station:
  username: myuser
  password: mypass

Примеры использования

Если у вас в конфиге есть другие TTS, например от Google - читайте это.

Для шаблонов не забывайте указывать data_template, для остальных команд хватит просто data.

Поддерживаются команды на несколько станций одновременно (как TTS, так и media_player).

Внимание: Для каждой вашей колонки в мобильном приложении Яндекса будет создан служебный сценарий. Не трогайте его. Если случайно удалили - перезапустите Home Assistant.

Обычный способ вызвать TTS

Работает на всех колонках

Зависит от настройки "Режим звука" (из окна медиа-плеера). Будет или произносить текст или выполнять команду. Он же вызывается из окна медиа-плеера.

script:
  # TTS зависит от настройки "Режим звука"! (произнести или выполнить команду)
  yandex_tts1:
    alias: TTS зависит от настройки "Режим звука"!
    sequence:
    - service: tts.yandex_station_say
      entity_id: media_player.yandex_station
      data_template:
        message: Температура в комнате {{ states("sensor.temperature_hall")|round }} градуса.

Второй способ вызвать TTS

Работает на всех колонках

Не зависит от настройки "Режим звука".

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

Внимание: у Яндекса стоит ограничение на 100 символов для TTS через облачное управление! Включая спец.символы из раздела "Спецэффекты в TTS".

script:
  # TTS не зависит от настройки "Режим звука"! и всегда будет произносить фразу
  yandex_tts2:
    alias: TTS не зависит от настройки "Режим звука"
    sequence:
    - service: media_player.play_media
      entity_id: media_player.yandex_station
      data:
        media_content_id: Повторяю вашу фразу
        media_content_type: text

Третий способ вызвать TTS

Только для локального режима!

Не зависит от настройки "Режим звука", но продолжает слушать после произнесения текста! Зато нет ограничения на количество символов. Поддерживает спецэффекты.

script:
  yandex_tts3:
    alias: TTS только для локального режима
    sequence:
    - service: media_player.play_media
      entity_id: media_player.yandex_station
      data:
        media_content_id: <speaker effect="megaphone">Объявление погоды на сегодня...
        media_content_type: dialog

Спецэффекты в TTS

Работает на всех колонках

Все колонки поддерживают эффекты, библиотеку звуков и настройка речи:

script:
  yandex_tts4:  # работает и в локальном и в облачном режиме
    alias: TTS c эффектами
    sequence:
    - service: media_player.play_media
      entity_id: media_player.yandex_station
      data:
        media_content_id: <speaker audio="alice-sounds-game-win-1.opus"> sil <[500]> Объявление погоды на сегодня...
        media_content_type: text

Другие голоса

Можно использовать не только голос Алисы. Разные голоса можно посмотреть тут.

Внимание: Работают не все голоса. Если указать неправильный голос - колонка заглючит. Тогда на неё нужно отправить команду стоп или перезагрузить.

Помните про ограничение в 100 символов при облачном управлении. Для колонок с локальным управленим можно использовать media_content_type: dialog. В нём нет этого ограничения.

script:
  yandex_tts5:  # работает и в локальном и в облачном режиме
    alias: другой голос TTS
    sequence:
    - service: media_player.play_media
      entity_id: media_player.yandex_station
      data:
        media_content_id: <speaker voice="zahar">Всем привет. Меня зовут Захар...
        media_content_type: text

Проигрывание медиа по ссылкам

Поддерживается только на колонках (или модуле) с локальным управлением!

Поддерживаются только ссылки, которые умеют устройства Яндекса!

  • Песня на Яндекс.Музыке - пример
  • Альбом на Яндекс.Музыке - пример
  • Исполнитель на Яндекс.Музыке - пример
  • Плейлист на Яндекс.Музыке - пример

Только на устройствах с экраном (большая Станция или Модуль)

Это работает в том числе из GUI, если вставить ссылку в поле "воспроизвести текст".

script:
  yandex_play_url:
    alias: Проигрывание медиа по ссылке
    sequence:
    - service: media_player.play_media
      entity_id: media_player.yandex_station
      data:
        media_content_id: https://music.yandex.ru/album/2150009/track/19174962
        media_content_type: xxx  # тип не важен, но должен быть!

Яндекс Алиса в Telegram

Вы можете общаться со своей Алисой через Telegram. И она вам будет отвечать в Telegram! Можете спросить погоду, вызвать такси, включить песню, поиграть в города или управлять вашим умным домом (если настроили интеграцию с умным домом Яндекса). Никаких слеш-команд Telegram, общайтесь с Алисой обычным текстом.

При этом Home Assistant не обязательно "прокидывать" в Интернет. Telegram в режиме polling может работать без внешнего доступа.

При этом проигрывание медиа по ссылкам тоже будет работать. Просто поделитесь со своим Telegram ботом ссылкой на фильм Кинопоиска, ролик YouTube или песню/альбом/плейлист на Яндекс Музыке - и они запустятся на вашей колонке!

Поддерживается только на колонках (или модуле) с локальным управлением!

telegram_bot:
- platform: polling
  api_key: TELEGRAM_BOT_API_KEY  # создайте своего Телеграм бота
  allowed_chat_ids:
  - TELEGRAM_USER1_ID  # укажите ID своего аккаунта
  - TELEGRAM_USER2_ID  # при желании, поддерживается несколько аккаунтов

automation:
- trigger:
    platform: event
    event_type: telegram_text
  action:
    service: media_player.play_media
    entity_id: media_player.yandex_station_mini  # замените на вашу станцию
    data_template:
      media_content_id: "{{ trigger.event.data.text }}"
      media_content_type: "question:{{ trigger.event.data.chat_id }}"
- trigger:
    platform: event
    event_type: yandex_station_response
  action:
    service: telegram_bot.send_message
    data_template:
      target: "{{ trigger.event.data.request_id }}"
      message: "{{ trigger.event.data.text }}"

Для отправки Telegram сообщений разным станциям @ProstoMaksks предложил такое решение.

Яндекс Алиса в Lovelace

Вы можете общаться со своей Алисой через GUI Home Assistant (lovelace). Это работает в любом браузере на любой платформе, включая смартфоны и официальные мобильные приложения.

При включении компонента Conversation в правом верхнем углу интерфейса Home Assistant появляется микрофон. Сам компонент позволяет общаться в режиме диалога.

Работает аналогично добавлению Алисы в Телеграм. Вы фактически общаетесь в текстовом режиме с одной из ваших колонок. Отправка ссылок на медиа тоже работает!

Поддерживается только на колонках (или модуле) с локальным управлением!

conversation:
  intents:
    media_player.yandex_station_mini: [.+]  # замените на вашу станцию

Компонет поддерживает не только тестовый, но и голосовой ввод при следующих условиях:

  • Home Assistant открыт в браузере Google Chrome на Windows, macOS, Linux, Android или в мобильном приложении Android - потому что для распознования голоса используются API Google
  • Home Assistant открыт по HTTPS-ссылке или localhost-ссылке - потому что микрофон в браузере Google Chrome доступен только в этом случае

По умолчанию в Home Assistant включен голосовой ввод только на английском языке. Чтоб это исправить - добавьте в конфиг такую настройку. Если у вас голосовой ввод не работает или он вам не нужен - настройку добавлять не надо! Общаться текстом с Алисой вы можете и без неё. После изменения вероятно потребуется сбросить кэш браузера (включая cookies and other site data).

yandex_station:
  recognition_lang: ru-RU

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

Морфология числительных

Ознакомьтесь с другим моим компонентом - MorphNumbers.

Выполнение команд станцией

Работает на всех колонках

script:
  yandex_command:  # работает и в локальном и в облачном режиме
    alias: Выполнить команду
    sequence:
    - service: media_player.play_media
      entity_id: media_player.yandex_station
      data:
        media_content_id: Включи мою любимую музыку вперемешку
        media_content_type: command

Примеры управления станцией

Работает на всех колонках

script:
  yandex_volume_set:  # в локальном или облачном режиме
    alias: Меняем громкость нескольких станций
    sequence:
    - service: media_player.volume_set
      data:
        entity_id:
        - media_player.yandex_station_12345678901234567890
        - media_player.yandex_station_98765432109876543210
        volume_level: 0.5

Только для локального режима!

script:
  yandex_play_album:  # только в локальном режиме!!!
    alias: Включить Би-2 на Станции
    sequence:
    - service: media_player.play_media
      entity_id: media_player.yandex_station
      data:
        media_content_id: 60062    # ID альбома в Яндекс.Музыка
        media_content_type: album  # album, track or playlist

Внешний вид

Красивые иконки Яндекс устройств можно установить через HACS.

Иконки Яндекс устройств для Home Assistant

Красивый медиа плеер можно установить через HACS.

Внимание: правильно указывайте название вашего TTS сервиса. По умолчанию он yandex_station. Если вы его не изменили на alice по инструкции про несколько TTS. Тут _say на конце не нужно указывать.

Пример как настроить карточку Яндекс Мини:

entity: media_player.yandex_station_mini
shortcuts:
  attribute: sound_mode
  buttons:
    - icon: 'mdi:voice'
      id: Произнеси текст
      type: sound_mode
    - icon: 'mdi:google-assistant'
      id: Выполни команду
      type: sound_mode
    - icon: 'mdi:playlist-star'
      id: включи мою любимую музыку вперемешку
      type: command
    - icon: 'mdi:playlist-music'
      id: включи плейлист дня
      type: command
    - icon: 'mdi:heart'
      id: лайк
      type: command
    - icon: 'mdi:heart-off'
      id: снять лайк
      type: command
  columns: 6
tts:
  platform: yandex_station
type: 'custom:mini-media-player'

Пример как настроить карточку Яндекс Станции:

entity: media_player.yandex_station
artwork: full-cover
sound_mode: icon
hide:
  sound_mode: false
  runtime: false
tts:
  platform: yandex_station
type: 'custom:mini-media-player'

Продвинутое использование команд

Только для локального режима!

Компонент создаёт сервис yandex_station.send_command, которому необходимо передать команду.

Полезные команды станции можно узнать тут.

Самая универсальная - это sendText. Станция выполнит посланную фразу, как буд-то услышала команду голосом.

Выбрать станцию можно указав entity_id или device (для обратной совместимости). В качесте device может быть название станции или идентификатор. Можно посмотреть в приложении Яндекс или в веб интерфейсе.

Если станция одна - можно ничего не указывать.

script:
  yandex_tts:
    alias: TTS на Яндекс.Станции
    sequence:
    - service: yandex_station.send_command
      data:
        entity_id: media_player.yandex_station_12345678901234567890
        command: sendText
        text: Повтори за мной 'Привет, человек!'

Звук Яндекс.Станции по HDMI

Функция переключения выхода звука находится у Яндекса в бете. На телевизор выводится только звук видео (например YouTube). Звук музыки и голос Алисы остаются на Станции.

Раньше функция включалась в конфиге. Теперь включена по умолчанию для всех владельцев больших Станций.

script:
  yandex_hdmi_sound:
    alias: Звук Станции на HDMI
    sequence:
    - service: media_player.select_source
      entity_id: media_player.yandex_station  # поменяйте на вашу станцию
      data:
        source: HDMI

Несколько TTS в конфиге

TTS Яндекса работает только с их колонками и не работает с другими, например Google Mini. Так и другие TTS не работают с колонками Яндекса.

В этом случае вы можете настроить несколько TTS сервисов. Из окна медиа плеера всех колонок всегда будет стартовать первый повавшийся сервис (в алфавитном порядке). Поэтому название TTS сервиса Яндекса можно переименовать, например, в alice_say (слово say на конце обязательно!).

yandex_station:
  username: myuser
  password: mypass
  tts_service_name: alice_say

tts:
- platform: google_translate
  language: ru

Статический IP для локального режима

Локальные устройства ищутся автоматически по протоколу mDNS (zeroconf). Если у вас есть с этим какие-то проблемы - можно указать для них статический IP адрес на роутере.

В конфиге нужно указывать device_id вашей колонки. Он есть на конце entity_id после media_player.yandex_station_. Ещё его можно посмотреть в debug логах компонента и в мобильном приложении Яндекса.

yandex_station:
  devices:
    12345678901234567890:  # device_id вашей колонки
      host: 192.168.1.123
      name: Яндекс Станция  # имя можно задать и тут

Получение команд от станции

Только для продвинутых пользователей

Для работы функционала должна быть настроена интеграция Home Assistant с умным домом Яндекса!

  1. Настройте список фраз, на которые ваши станции должны реагировать и ответы на них. Если не хотите ответ - оставьте его пустым (двоеточие обязательно). При первом запуске копонент создаёт служебный медиа-плеер media_player.yandex_intents.
  2. Синхронизируйте ваши устройства в мобильном приложении Яндекса, чтоб этот плеер появился и там. Не нужно его переименовывать и перемещать в комнаты.
  3. Перезапустите Home Assistant. В мобильном приложении Яндекса должны появиться ваши сценарии.

В ответ на эти фразы в Home Assistan будет генерироваться событие типа yandex_intent с произнесённым текстом. Теперь можете писать свои автоматизации на YAML или Node-RED.

yandex_station:
  username: myuser
  password: mypass
  intents:
    Покажи сообщение: ага
    Какая температура в комнате:
    Какая влажность в комнате:

automation:
- trigger:
    platform: event
    event_type: yandex_intent
    event_data:
      text: Покажи сообщение
  action:
    service: persistent_notification.create
    data:
      title: Сообщение со станции
      message: Шеф, станция чего-то хочет

Управление умным домом Яндекса

На данный момент поддерживаются:

  • Кондиционеры - добавленные как через ИК-пульт, так и напрямую (например LG с Wi-Fi)
  • Обученные вручную ИК-команды - обученные вручную команды ИК-пульта (Пульт => Добавить устройство => Настроить вручную)

В качестве ИК-пультов можно использовать Яндекс Пульт или более дешевую версию от Tuya (добавляется напрямую как родной пульт Яндекса).

В конфиге нужно перечислить имена ваших устройств:

yandex_station:
  username: myuser
  password: mypass
  include:
  - Кондиционер  # имя вашего кондиционера
  - Приставка  # имя не ИК-пульта, а устройства, настроенного вручную

Кондиционер будет добавлен как термостат:

Настроенное вручную ИК-устройство будет добавлено как Remote. Команды отправляются через сервис remote.send_command. Можно отправить несколько команд за раз, настроить задержку и количество повторов.

script:
  volume_up:
    alias: Сделай громче
    sequence:
    - service: remote.send_command
      entity_id: remote.yandex_station_remote  # поменяйте на ваше устройство
      data:
        command: Сделай громче  # имя кнопки в интерфейсе
        num_repeats: 5  # (опционально) количество повторов
        delay_secs: 0.4  # (опционально) пауза между повторами в секундах
  turn_on:
    alias: Включи телевизор
    sequence:
    - service: remote.send_command
      entity_id: remote.yandex_station_remote  # поменяйте на ваше устройство
      data:
        command: [Включи, Смени вход, Ниже, Ниже, ОК]  # можно несколько кнопок
        delay_secs: 0.4  # (опционально) пауза между повторами в секундах

Локальное управление по токену

Если есть Oauth-токен с правами на Яндекс.Музыку, можно так. Не спрашивайте как его достать.

Но в этом случае будет работать только локальное управление на тех колонках, кто его поддерживает.

yandex_station:
  token: abcdefghijklmnopqrstuvwxyz

Полезные ссылки