Skip to content

Latest commit

 

History

History
603 lines (450 loc) · 35.8 KB

README.md

File metadata and controls

603 lines (450 loc) · 35.8 KB

Yandex.Station for Home Assistant

hacs_badge Donate

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

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

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

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

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

Устройство Локальное управление Облачное
Яндекс.Станция (большая) Поддерживается Поддерживается
Яндекс.Станция Макс ? ?
Яндекс.Модуль Поддерживается Поддерживается
Яндекс.Станция Мини Поддерживается Поддерживается
Irbis A Нет Поддерживается
DEXP Smartbox Нет Поддерживается
Elari SmartBeat ? ?
LG XBOOM AI ThinQ WK7Y ? ?
Prestigio Smartmate Mayak Edition ? ?

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

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

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

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

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

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

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

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

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

Демо

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

Вопросы и ответы

В. Какой компонент лучше YandexStation или Yandex Smart Home?
О. Это разные компоненты для разных задач. Первый позволяет управлять вашими колонками с Алисой из Home Assistant, отправлять на них голосовые уведомления и много чего ещё. Второй позволяет добавить ваши умные устройства из 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 символов

Компонент автоматически удалит из текста запрещенные символы и ограничит длинну текста до допустимой.

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: 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: dialog

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

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

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

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

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

Это работает в том числе из 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

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

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

Для правильного произношения числительных в TTS, ознакомьтесь с другим моим компонентом - 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

Внимание. Ниже пример нестандартной карточки медиалеера. Её нет в Home Assistant по умолчанию. Она легко ставится через HACS. Если у вас сложности с установкой - просто используйте стандартную карточку. Она тоже работает.

entity: media_player.yandex_station_mini  # поменяйте на вашу колонку
artwork: cover
sound_mode: icon
shortcuts:
  attribute: sound_mode
  buttons:
    - icon: 'mdi:account-voice'
      id: Произнеси текст
      type: sound_mode
    - icon: 'mdi:robot'
      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
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

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

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

Проще всего проверить работу локального режима - запустить на колонке песню и посмотреть, отображается ли обложка в Home Assistant.

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

mDNS не будет работать, если вы открыли только один порт для Home Assistant. Например установка в Docker без настройки network=host (в Hass.io всё хорошо) или виртуальная машина с NAT.

В конфиге нужно указывать 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  # (опционально) пауза между повторами в секундах

Полезные автоматизации

Отображаем статус Яндекс Станции с помощью умных ламп

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