Code Monkey home page Code Monkey logo

yandexstation's Introduction

Yandex.Station for Home Assistant

hacs_badge Donate

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Демо

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

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

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

Установка

Ставится через HACS:

  1. HACS (ждем некоторое время)
  2. Интеграции
  3. 3 точки (правый верхний угол)
  4. Пользовательские репозитории
  5. URL: AlexxIT/YandexStation
  6. Категория: Интеграция
  7. Добавить
  8. Установить этот репозиторий в HACS

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

Настройка

DISCLAIMER: Я долго страдал, но у меня получилось В оригинальном репозитории, к сожалению, процесс настройки описан крайне скудно. Я не являюсь опытным пользователем hass/hacs, так что не смог на раз-два все настроить. Надеюсь, оригинальный автор проекта сможет написать более подробный гайд и исправить ошибки GUI настройки (либо объяснить, почему их нет)

Через YAML

  1. Основная конфигурация hass лежит в файле configuration.yaml, который очень легко ищется в директориях hass (например, config для docker)
  2. В этом файле и добавляется настройка логина, например вот:
yandex_station:
  username: myuser
  password: mypass

Какие проблемы могут быть? Я столкнулся с абсолютно неработающим GUI и попытался авторизоваться через конфиг, но там меня ждала неприятность - этот репозиторий не поддерживает 2FA Так как отключать 2FA - это не решение, можно сделать это один раз и авторизоваться через get_token.py Итого, инструкция:

  1. Скачиваем репозиторий
  2. Отключаем на аккаунте яндекса 2FA
  3. pip3 install aiohttp
  4. python3 -m get_token LOGIN PASSWORD с вашими логином и паролем от яндекса
  5. Затем, если все прошло хорошо, вы получите токен, который можно будет сохранить в файле configuration.yaml
yandex_station:
  username: LOGIN
  x_token: YOUR-TOKEN
  include:
  - Кондиционер

Можно включать 2FA обратно!

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

Если у вас в конфиге есть другие 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:
  alice_custom_volume1:
    sequence:
    - service: tts.yandex_station_say
      entity_id: media_player.yandex_station  # замените на вашу колонку
      data_template:
        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

Спецэффекты в 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:
    # менять нужно entity_id до двоеточия, после двоеточия ничего менять не надо!
    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

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

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

Поддерживается двухсторонняя синхронизация списка покупок Алисы и стандартного компонента 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. Список завершенных элементов ХА очищается

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

Внешний вид

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

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

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

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

yandexstation's People

Contributors

alexxit avatar ckesc avatar hepoh3 avatar kasitoru avatar sunsx0 avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.