/YandexStation

Yandex.Station control from Home Assistant

Primary LanguagePython

Yandex.Station for Home Assistant

hacs_badge Donate

Компонент для управления Яндекс.Станцией по локальной сети.

На начало марта 2020 поддерживается:

  • Яндекс.Станция (большая)
  • Яндекс.Модуль (у меня нет, но по отзывам работает)

Не поддерживается:

  • Яндекс.Станция Мини
  • Irbis
  • Dexp

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

Возможности:

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

media_player

Настройка

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

Токен сохраняется в директории конфигов и больше не запрашивается.

yandex_station:
  username: myuser
  password: mypass

Если знаете свой Oauth-токен, можно так:

yandex_station:
  token: abcdefghijklmnopqrstuvwxyz

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

Если у вас в конфиге есть другие TTS - читайте раздел "Несколько TTS в конфиге".

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

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

Обычный способ вызвать 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

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

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 c эффектами
    sequence:
    # Отправляем TTS с эффектами (media_content_type: dialog)
    - service: media_player.play_media
      entity_id: media_player.yandex_station
      data:
        media_content_id: <speaker effect="megaphone">Объявление погоды на сегодня...
        media_content_type: dialog

    # Ожидаем окончания фразы (после dialog нужно дожидаться LISTENING)
    - wait_template: "{{ is_state_attr('media_player.yandex_station', 'alice_state', 'LISTENING') }}"

    # Останавливаем режим LISTENING
    - service: yandex_station.send_command
      entity_id: media_player.yandex_station
      data:
        command: cancelVoiceDialog

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

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

  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

  yandex_hdmi_sound:
    alias: Звук Станции на HDMI
    sequence:
    - service: media_player.select_source
      entity_id: media_player.yandex_station_12345678901234567890
      data:
        source: HDMI

Очередь команд

Команды можно выполнять последовательно, дожидаясь ответа от станции.

Внимание! При ожидании окончания "продвинутого" TTS (dialog) необходимо дожидаться статуса LISTENING и желательно после выполнять команду cancelVoiceDialog (пример есть выше). При работе с обычным TTS (text или tts.yandex_station_say) необходимо дожидаться статуса IDLE, как в примере ниже.

script:
  yandex_queue:
    alias: Очередь команд на станции
    sequence:
      # Устанавливаем громкость станции
      - service: media_player.volume_set
        entity_id: media_player.yandex_station
        data:
          volume_level: 0.3

      # Узнаём у Яндекса погоду (это выполнение команды, а не TTS!)
      - service: media_player.play_media
        entity_id: media_player.yandex_station
        data:
          media_content_id: Какая погода сегодня в Москве?
          media_content_type: command

      # Ожидаем окончания фразы (после command нужно дожидаться IDLE)
      - wait_template: "{{ is_state_attr('media_player.yandex_station', 'alice_state', 'IDLE') }}"

      # Узнаём у Яндекса пробки (это выполнение команды, а не TTS!)
      - service: media_player.play_media
        entity_id: media_player.yandex_station
        data:
          media_content_id: Какие пробки сегодня в Москве?
          media_content_type: command

      # Ожидаем окончания фразы (после command нужно дожидаться IDLE)
      - wait_template: "{{ is_state_attr('media_player.yandex_station', 'alice_state', 'IDLE') }}"

      # Запускаем обычный TTS
      - service: media_player.play_media
        entity_id: media_player.yandex_station
        data:
          media_content_id: Хорошего вам дня. А теперь послушайте музыку, которую любите...
          media_content_type: text

      # Ожидаем окончания фразы (после command нужно дожидаться IDLE)
      - wait_template: "{{ is_state_attr('media_player.yandex_station', 'alice_state', 'IDLE') }}"

      # Устанавливаем громкость станции
      - service: media_player.volume_set
        entity_id: media_player.yandex_station
        data:
          volume_level: 0.2

      # Включаем любимую музыку на станции (это выполнение команды, а не TTS!)
      - service: media_player.play_media
        entity_id: media_player.yandex_station
        data:
          media_content_id: Включи мою любимую музыку
          media_content_type: command

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

Компонент создаёт сервис 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

Я решил не включать эту функцию в базовую конфигурацию. Она использует совсем другие API Яндекса и требует дополнительной авторизации в сервисах Яндекса.

Сама функция переключения выхода звука находится у Яндекса в бете. В отличии от обычного управления станцией - функция меняет её настройки. Поэтому пользуйтесь на свой страх и риск.

Включается в файле конфигурации:

yandex_station:
  username: myuser
  password: mypass
  control_hdmi: true

Несколько 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

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