AlexxIT / YandexStation

Управление Яндекс.Станцией и другими устройствами умного дома с Алисой из Home Assistant
https://t.me/AlexxIT_SmartHome
MIT License
1.37k stars 125 forks source link
hacs home-assistant homeassistant tts yandex-station

Яндекс.Станция для Home Assistant

hacs_badge

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

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

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

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

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

Оглавление

Возможности всех колонок

Возможности локальных колонок

Прочие функции

Полезные компоненты

Не все из этих компонентов за моим авторством!

Установка

Способ 1. HACS > Интеграции > Добавить > Yandex.Station > Установить

Способ 2. Вручную скопируйте папку yandex_station из latest release в директорию /config/custom_components.

Настройка

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

Способ 1. GUI (рекомендуется)

Настройки > Интеграции > Добавить интеграцию > Yandex Station

Если интеграции нет в списке - очистите кэш браузера.

Поддерживается несколько способов авторизации:

В итоге компонент получит токен Яндекса и сохранит именно его, ваш пароль нигде не сохраняется.

Способ 2. YAML (устаревший)

yandex_station:
  username: myuser
  password: mypass

Возможности всех колонок

В тексте часто приводятся разные примеры скриптов и автоматизаций. Их можно использовать:

Полное состояние и доступные атрибуты ваших колонок можно посмотреть тут.

В некоторых примерах используются события (event_type). За их срабатыванием можно следить тут.

В случае возникновения ошибок, их список и описание можно посмотреть тут.

Данная документация не призвана научить вас основам работы с Home Assistant.

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

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

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

В облачном режиме есть два ограничения:

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

script:
  yandex_tts1:
    sequence:
    - service: media_player.play_media
      entity_id: media_player.yandex_station  # замените на вашу колонку
      data:
        media_content_id: 'Температура в комнате {{ states("sensor.temperature_hall")|round }} градуса'
        media_content_type: text

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

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

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

script:
  yandex_tts:
    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  # работает только на локальной колонке

Медиа браузер

Фразы на колоки с Алисой можно отправлять, как из автоматизации, так и из интерфеса Home Assistant. Начиная с версии v2022.3 меню TTS перенесено в раздел Медиа, до этого оно находилось в окне Медиа плеера.

При желании вы можете настроить этот раздел через YAML:

Если в команде присутствует media_content_id или в template нет слова message - окно ввода сообщения будет пропущено.

Вот несколько примеров:

yandex_station:
  media_source:
    - title: Произнеси текст  # обязательное поле
      media_content_type: text  # обязательное поле
      thumbnail: https://brands.home-assistant.io/_/tts/icon.png
    - title: Выполни команду
      media_content_type: command
      thumbnail: https://brands.home-assistant.io/_/automation/icon.png
    - title: Включи любимое
      media_content_id: Включи моё любимое вперемешку
      media_content_type: command
    - title: Произнеси шепотом 
      template: '<speaker is_whisper="true">{{ message }}'
      media_content_type: dialog
      extra:
        volume_level: 0.2
    - title: Статус эквалайзера
      template: 'Эквалайзер установлен на {{ states("select.yandex_station_equalizer") }}'
      media_content_type: text

Внешний вид

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

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

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

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

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

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

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

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

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

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

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

  1. Создайте новый Сценарий в интерфейсе Яндекса.
  2. Выберите "Фраза" в разделе Если
  3. Выберите "Любое умное устройство" в разделе Тогда

Далее можете выбрать "Ответить на вопрос или выполнить команду", "Прочитать текст вслух", "Проиграть звук" и прочее.

Если хотите, чтоб команда бесшумно ушла в ХА - укажите выполнить команду ничего не делай.

Когда колонка выполнит такой сценарий, в ХА появятся два события с дополнительными параметрами:

По любому из событий вы можете создавать автоматизации:

automation:
- alias: Расскажи шутку
  trigger:
  - platform: event
    event_type: yandex_speaker
    event_data:
      value: ничего не делай  # фраза из Сценария Яндекса (раздел То) 
  action:
  - service: media_player.play_media
    target:
      entity_id: '{{ trigger.event.data.entity_id }}'  # ответить той же колонкой
    data:
      media_content_type: text
      media_content_id: '{{ ["На связи", "Смольный слушает", "Тут я"]|random }}'
  mode: single

К сожалению, нельзя узнать фразу, которую сказали колонке. Можно узнать только фразу, которую колонка выполнила.

Для создания нескольких сценариев с "бешумным выполнением", используйте знаки пунктуации -,!.:=? и их комбинации ничего не делай???!!!. Эффект не изменится, а в ХА вы сможете различать, на какую фразу произошла реакция.

В разделе trigger: > event_data: вы можете фильтровать колонки, чтоб выполнять разные автоматизации для разных комнат на одну и ту же фразу.

Внимание! Вызов TTS из ХА так же активирует эти события.

Для отладки событий перейдите в панель разработчика вашего ХА по адресу http://192.168.1.123:8123/developer-tools/event, в разделе "подписаться на событие" укажите yandex_speaker и нажмите "подписаться".

PS. Так же есть cтарый способ получения команд только для продвинутых пользователей!

Интеграция с Яндекс.Диалогами

Компонент поддерживает интеграцию с другим моим компонентом - YandexDialogs. При его наличии вам доступны функции:

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

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

Поддерживает спецэффекты TTS. Нет ограничения на 100 символов. Послее TTS колонка НЕ слушает пользователя.

В media_content_type вы должны указать имя своего Яндекс.Диалога через двоеточие без пробелов. Регистр неважен.

script:
  yandex_tts3:
    sequence:
      - service: media_player.play_media
        entity_id: media_player.yandex_station_irbis
        data:
          media_content_id: <speaker is_whisper="true">Хозяин, пора бы спать
          media_content_type: text:умный дом

Диалог с колонкой

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

Вы можете начать диалог с пользователем, получить на него ответ и выполнить нужные вам действия, в зависимости от ответа пользователя.

В media_content_type вы должны указать имя своего Яндекс.Диалога через двоеточие без пробелов. Регистр неважен. И через второе двоеточие некий "тег" диалога, чтоб потом в автоматизации понять, на какой вопрос вам пришёл ответ.

script:
  yandex_dialog:
    sequence:
      - service: media_player.play_media
        entity_id: media_player.yandex_station_mini
        data:
          media_content_id: <speaker is_whisper="true">Хозяин, уже утро, пора вставать!
          media_content_type: dialog:умный дом:утро

Пример реакции на ответ пользователя можно посмотреть тут. Этим подходом легко пользоваться как в автоматизациях Home Assistant, так и в Node-RED.

Уведомления и предупреждения

Компонент поддерживает уведомления и предупреждения.

Уведомления это альтернативный способ вызвать TTS. Уведомления настраиваются в configuration.yaml. Минимально, вы должны указать имя нового уведомления и перечень колонок, где оно должно звучать. Для каждого уведомления будет создан отдельный сервис. Далее необходимо вызывать этот сервис с параметром message.

Опционально уведомления поддерживают параметр title. Для его поддержки вы можете использовать шаблон из примера ниже.

При настройке уведомлений параметры media_content_id и media_content_type необязательные.

Уведомления можно использовать в предупреждениях. Например, если вы забыли закрыть выходную дверь - предупреждение будет отправлять вам уведомление с заданным интервалом, до тех пор, пока проблема не будет решена.

notify:
  - name: alice_alert  # любое название
    platform: yandex_station
    data:
      entity_id: media_player.yandex_station_mini  # замените на вашу колонку
      media_content_id: >-
        {% if title is defined %}<speaker effect="megaphone">{{ title }}<speaker effect="-"> sil <[200]>{% endif %}{{ message }}
      media_content_type: dialog

input_boolean: # просто для примера
  garage_door:
    name: Дверь гаража

alert:
  garage_door:
    name: Гараж открыт
    done_message: Гараж закрыт
    entity_id: input_boolean.garage_door
    state: "on"  # опционально, потому что "on" это значение по умолчанию
    repeat: 5  # как часто повторять, в минутах
    can_acknowledge: true  # разрешить выключить уведомления вручную
    skip_first: true  # пропустить первое (мгновенное) уведомление
    notifiers:
      - alice_alert  # название, которые указали выше

Возможности локальных колонок

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

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

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

script:
  yandex_tts4:
    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:
  alice_custom_volume1:
    sequence:
    - service: tts.yandex_station_say
      entity_id: media_player.yandex_station  # замените на вашу колонку
      data:
        message: Внимание! Важное сообщение...
        options:
          volume_level: 0.8

Или так

script:
  alice_custom_volume2:
    sequence:
    - service: media_player.play_media
      entity_id: media_player.yandex_station  # замените на вашу колонку
      data:
        media_content_id: Внимание! Важное сообщение...
        media_content_type: text  # поддерживается text и dialog
        extra:
          volume_level: 0.8

Стриминг музыки

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

Поддерживается стриминг (трансляция) музыки с колонки Яндекса на умные колонки других производителей. Условия такие:

Протестирована поддержка интеграций:

Внимание. Для корректной работы некоторых интеграций, ваш сервер ХА должен быть доступен в локальной сети по протоколу HTTP и IP-адресу:

Настройки > Общие > URL-адрес для домашней сети > http://192.168.1.123:8123/

Стоит понимать, что при правильной настройке внешнего доступа через различные аддоны, вы можете пользоваться ХА по адресу вида https://myhome.duckdns.org/. И при правильной настройке такая ссылка будет работать как во внешней, так и в локальной сети. А ссылка вида HTTP/IP будет использоваться только локальными медиа-плеерами.

Компонент автоматически найдёт все теоретически подходящие media_player и добавит их в список source_list у колонки. При желании вы можете вручную указать список колонок в configuration.yaml:

yandex_station:
  media_players:
    - entity_id: media_player.yas_306
      name: Yamaha
    - entity_id: media_player.mpd
      name: MPD
      speaker_id: [media_player.yandex_station]  # опциональная привязка к конкретным колонкам Яндекса
    - entity_id: media_player.yas_306
      name: Yamaha (no sync)
      sync_volume: False  # опциональное отключение синхронизации громкости звука
    - entity_id: media_player.samsung
      name: SamsungTV
      media_content_type: url  # важно для интеграции SamsungTV из HACS

Вы можете переключать трансляцию через:

Караоке

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

YandexStation - караоке

Для каждой колонки создаётся camera (выключена по умолчанию), которая может отображать текст текущей песни в режиме караоке.

Поток с текстом можно отправить на телевизор, например Chromecast:

alias: Включить караоке на ТВ
sequence:
  - service: media_player.play_media
    target:
      entity_id: media_player.mibox
    data:
      media_content_id: >-
        http://192.168.1.123:8123/api/camera_proxy_stream/camera.hall_speaker_lyrics?token={{ state_attr('camera.hall_speaker_lyrics', 'access_token') }}
      media_content_type: image/jpeg

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

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

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

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

Это работает в том числе из 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  # тип не важен, но должен быть!

Получение ответов от колонки

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

Внимание: Примерно до лета 2024 колонка возвращала текстовый ответ на любой запрос. После очередного обновления в Яндексе колонка стала возвращать текстовый ответ только на ограниченный перечень фраз (погода, время, умный дом и тп.).

Вариант 1. Через службу yandex_station.send_command.

script:
  example1:
    sequence:
      - action: yandex_station.send_command
        data:
          entity_id: media_player.yandex_station  # замените на вашу колонку
          text: какая погода?
        response_variable: response
      - action: notify.persistent_notification
        data:
          message: "{{ response }}"

Вариант 2. Через Conversation Entity.

script:
  example2:
    sequence:
      - action: conversation.process
        data:
          agent_id: conversation.yandex_station_mini  # замените на вашего агента
          text: какая погода?
        response_variable: response
      - action: notify.persistent_notification
        data:
          message: "{{ response }}"

Яндекс Алиса в 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: conversation.process
    data:
      agent_id: conversation.yandex_station_mini  # замените на вашу станцию
      text: "{{ trigger.event.data.text }}"
      conversation_id: "{{ trigger.event.data.chat_id }}"
    response_variable: response
  - service: telegram_bot.send_message
    data:
      target: "{{ trigger.event.data.chat_id }}"
      message: "{{ response.response.speech.plain.speech }}"

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

Список покупок

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

Поддерживается двухсторонняя синхронизация списка покупок Алисы и стандартного компонента Shopping List. Можно добавлять и удалять элементы списка как из ХА, так и голосом с колонки.

Предварительно необходимо добавить стандартный компонент, через GUI или YAML.

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

script:
  update_shopping_list:
    alias: Обновить список покупок
    sequence:
      - service: media_player.play_media
        entity_id: media_player.yandex_station_mini  # замените на вашу колонку
        data:
          media_content_id: update
          media_content_type: shopping_list

После синхронизации вы можете удалять элементы голосом на колонке. Такие элементы будут удалены из ХА при следующей синхронизации, даже если на них не стоит галка.

Или вы можете отмечать элементы как завершенные в интерфейсе ХА. Такие элементы будут удалены из Яндекса при следующей синхронизации. Только не очищайте вручную список завершенных элементов в ХА до синхронизации! Иначе синхронизация нарушится.

Синхронизация происходит по следующим правилам:

  1. Завершенные (отмеченные) элементы списка ХА - удаляются из Яндекса (если они там были)
  2. Новые элементы, созданные именно из ХА - добавляются в Яндекс (если их там не было)
  3. Список ХА полностью заменяется тем, что получилось в Яндексе после 1 и 2
  4. Список завершенных элементов ХА очищается

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

Статический IP для колонки

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

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

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

Если у вас есть с этим какие-то проблемы - можно указать для колонок статический IP-адрес на роутере и в конфиге Home Assistant. device_id вашей колонки можно посмотреть в мобильном приложении Яндекса.

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

Прочие функции

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

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

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

yandex_station:
  include:
    - Кондиционер                                                 # добавить ВСЕ устройства с этим именем
    - name: Очиститель Xiaomi
      properties: [ "temperature", "humidity", "pm2.5_density" ]  # опционально создать сенсоры
    - name: Чайник Polaris
      capabilities: [ "mute", "keep_warm" ]                       # опционально создать контролы
    - name: Увлажнитель Polaris
      capabilities: [ "mute", "controls_locked", "ionization", "backlight" ]  # опционально создать контролы
      properties: [ "temperature","humidity" ]                                # опционально создать сенсоры
    - name: Кондиционер
      room_name: Зал                                              # опционально указать комнату
      capabilities: [ "temperature", "fan_speed", "thermostat" ]  # опционально создать контролы
      current_temperature: "{{ states('sensor.temperature') }}"   # опционально указать сенсор температуры
    - name: Увлажнитель
      current_humidity: "{{ states('sensor.humidity') }}"         # опционально указать сенсор влажности
    - room_name: Ванная                                           # добавить ВСЕ устройства из этой комнаты
    - type: devices.types.sensor                                  # добавить ВСЕ устройства такого типа
    - id: 96581cf1-dad4-4329-bbe9-0c843128f60a                    # добавить устройство по ID

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

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

Изменение настроек Алисы

script:
  change_settings:
    alias: Изменение настроек Алисы
    sequence:
      - service: media_player.play_media
        data:
          entity_id: media_player.yandex_station  # замените на любую вашу колонку
          media_content_id: 'без лишних слов: да'  # пробел после двоеточия
          media_content_type: settings

Поддерживаемые значения:

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

Если в Home Assistant подключены несколько TTS-сервисов - из карточки медиа-плеера будет вызываться самый первый из них (сортировка по имени). Например, tts.google_translate_say будет приоритетнее tts.yandex_station_say. А tts.yandex_station_say будет приоритетнее tts.yandextts_say.

Компонент Яндекс.Станции умеет поддерживать другие TTS, а вот другие колонки могут не поддерживать TTS yandex_station_say. При необходимости вы можете:

yandex_station:
  tts_service_name: alice_say

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

Только для станций с HDMI

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

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

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

Управление яркостью экрана станции Макс

Только для Яндекс.Станции Макс

script:
  yandex_brightness:
    sequence:
    - service: media_player.play_media
      entity_id: media_player.yandex_station_max
      data:
        media_content_id: 0.5  # допустимые значения от 0 до 1, или -1 для включения авто режима
        media_content_type: brightness

Если Яндекс заблокирован в стране

#257 #263 #518 #552

Использование другого домена Яндекса

yandex_station:
  domain: yandex.com

Подключение HTTP-прокси

yandex_station:
  proxy: http://username:password@123.123.123.123:3128

Отключение проверки HTTPS сертификатов

yandex_station:
  ssl: False

Troubleshooting

Поиск и устранение проблем

  1. Посмотрите лог Home Assistant на наличие ошибок интеграции Yandex.Station.
  2. Если в логе есть ошибка, постарайтесь прочитать её. Среди непонятных букв может быть прямой ответ на проблему на русском или английском языке.
  3. Поищите похожую ошибку на GitHub проекта (включая закрые issue) или в чатах Telegram: 1, 2, 3.
  4. Если ошибки нет, можно включить отладочные логи интеграции и посмотреть, что проиходит там.
    logger:
     default: info
     logs: { custom_components.yandex_station: debug }
  5. Если самостоятельно не справились - переходите по ссылкам в пункте 3 и подробно опишите проблему. Обязательно приложите ошибку из лога, если она есть. При наличии чего-то полезного в пункте 4, приложите и этот лог.

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

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

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