dext0r / ha-yandex-station-intents

Продвинутое получение команд от Яндекс.Станции и передача их в Home Assistant в виде событий
127 stars 8 forks source link
home-assistant home-assistant-component yandex-station

Получение команд от Яндекс.Станции в Home Assistant

Компонент генерирует события в Home Assistant на конкретные голосовые команды, адресованные Яндекс.Станции (или колонкам с Алисой). Как это работает: вы говорите "Алиса, сделай действие" и в Home Assistant появляется событие с текстом "сделай действие", именем колонки и комнаты. Такие события очень удобно использовать в автоматизациях.

Компонент адресован продвинутым пользователям, которые не боятся поредактировать YAML, и является продолжателем функции "Получение команд от станции" из компонента Yandex.Station от AlexxIT.

Основные преимущества и отличия:

Компонент "Yandex.Station Intents" никак не связан с компонентом "Yandex.Station" и его авторами!

Похожие компоненты

Установка

Способ 1: HACS

HACS > Интеграции > 3 точки (правый верхний угол) > Пользовательские репозитории > URL: dext0r/ha-yandex-station-intents, Категория: Интеграция > Нажать Добавить > Подождать > Выбрать Yandex.Station Intents в списке новых репозиториев > Нажать Скачать

Способ 2:

Вручную скопируйте папку custom_components/yandex_station_intents из latest release в директорию /config/custom_components

После установки перезапустите Home Assistant.

Настройка

Список фраз (интенты)

Интеграция работает с заранее сформированным списком фраз, на основе которых будут автоматически созданы сценарии в УДЯ. Активационные фразы могут содержать только кириллицу, цифры и пробелы.

Настройка выполняется через основной файл конфигурации configuration.yaml. Пример конфигурации:

yandex_station_intents:
  intents:
    Как дела:                         # (1), символ : обязателен
    Кто нибудь дома: Сейчас проверю   # (2)
    Время ужинать:                    # (3)
      extra_phrases:                  # альтернативные фразы, максимум три
        - Давай кушать
        - Давай ужинать
        - Время ужина
    Не выключай свет в прихожей:      # (4)
      extra_phrases:
        - Не выключай свет в коридоре
      say_phrase: "{{ ['Договорились', 'Хорошо', 'Я тебя услышала', 'Оки-доки']|random }}"
    Давай попьем чаю:                 # (5)
      say_phrase: Отличная идея, сейчас включу свет на кухне
      execute_command: Включи свет на кухне
    Очень холодно:                    # (6)
      execute_command: Прибавь температуру кондиционера на 1 градус в {{ event.room }}
    Точная температура в комнате:     # (7)
      say_phrase: "Точная температура {{ states('sensor.room_temperature') }} в {{ event.room }}"
    Давай поиграем:
      accounts: [vasya]               # (8)

В данном случае интеграция автоматически создаст в УДЯ восемь сценариев, каждый из которых начинается с символов ---. Не удаляйте эти символы и не модифицируйте никак название! По ним компонент понимает, что это его сценарий и в случае необходимости синхронизирует/удалит его.

Дополнительные параметры say_phrase, extra_phrases, execute_command, account являются необязательными и могут использоваться в любых вариациях.

Как работает:

  1. Срабатывает от Алиса, как дела, генерирует событие с text: Как дела, колонка ничего не скажет в ответ
  2. Срабатывает от Алиса, кто нибудь дома, генерирует событие с text: Кто нибудь дома, колонка, которая нас услышала ответит Сейчас проверю
  3. Срабатывает от Алиса, время кушать (или Алиса, время ужина, или Алиса, давай ужинать и т.п.), генерирует событие с text: Время ужинать, колонка ничего не скажет в ответ
  4. Срабатывает от Алиса, не выключай свет в прихожей (или Алиса, не выключай свет в коридоре), генерирует событие с text: Не выключай свет в прихожей, колонка, которая нас услышала ответит случайной фразой из списка
  5. Срабатывает от Алиса, давай попьем чаю, генерирует событие с text: Давай попьем чаю, колонка, которая нас услышала ответит Отличная идея, сейчас включу свет на кухне, после этого колонка выполнит команду Включи свет на кухне
  6. Срабатывает от Алиса, очень холодно, генерирует событие с text: Очень холодно, колонка выполнит команду Прибавь температуру кондиционера на 1 градус в КОМНАТА (вместо КОМНАТА будет подставлена комната, в которой находится колонка)
  7. Срабатывает от Алиса, точная температура в комнате, генерирует событие с text: Точная температура в комнате, колонка, которая нас услышала ответит вычисленным шаблоном из say_phrase
  8. Срабатывает от Алиса, давай поиграем. Сценарий будет создан и работать только на аккаунте vasya (можно указать несколько аккаунтов через запятую). Аккаунт указывается в том же виде, как отображается в списке интеграций Yandex.Station Intents. Если аккаунты не указаны - сценарии будут созданы для всех активных интеграций.

Обработка событий

После того как колонка услышит ключевую фразу в Home Assistant сгенерируется событие yandex_intent с параметрами:

Пример обработки:

automation:
  - alias: Кто нибудь дома
    trigger:
      - platform: event
        event_type: yandex_intent
        event_data:
          text: Кто нибудь дома  # пример (2)
    action:
      - service: media_player.play_media
        target:
          entity_id: '{{ trigger.event.data.entity_id }}'  # ответит колонка, которая услышала "Алиса, кто нибудь дома"
        data:
          media_content_type: text
          media_content_id: Я не знаю, ха-ха

  - alias: Как дела
    trigger:
      - platform: event
        event_type: yandex_intent
        event_data:
          text: Как дела  # пример (1)
          room: Кухня     # сработает, если спросили колонку в комнате "Кухня"
    action:
      - service: media_player.play_media
        target:
          entity_id: '{{ trigger.event.data.entity_id }}'
        data:
          media_content_type: text
          media_content_id: Здесь в комнате {{ trigger.event.data.room }} всё отлично!

Режим синхронизации

По умолчанию сценарии синхронизируются с УДЯ автоматически при запуске Home Assistant. Это поведение можно отключить добавлением в конфигурацию опции autosync: false. После этого сценарии будут синхронизированы только при перезагрузке YAML конфигурации компонента со страницы Панель разработчика > YAML или через сервис yandex_station_intents.reload.

Пример:

yandex_station_intents:
  autosync: false
  intents:
    Тест:

Режимы работы (для продвинутых)

Интеграция поддерживает два режима работы: websocket (по-умолчанию) и device. Режим задаётся через параметр mode в конфигурации (менять можно в любой момент).

Режим websocket (по-умолчанию):

Режим device (условно-устаревший):

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

Зачем это всё, если можно отдать скрипты через Yandex Smart Home?

  1. При активации скриптов Алиса много болтает ("хорошо", "сделала" и т.п.). Болтовню можно отключить только для всего умного дома целиком, что не всегда удобно
  2. Невозможно достоверно определить колонку, которая активировала скрипт (только с некоторой вероятностью через мониторинг alice_state: BUSY)
  3. События очень удобно использовать в качестве триггера в автоматизациях

Как управлять светом и другими штуками?

Используйте интеграцию Yandex Smart Home

Миграция с YAML интентов Yandex.Station

  1. Установите и настройте интеграцию Yandex.Station Intents (YAML пока не меняйте)
  2. Удалите сценарии, которые были созданы компонентом Yandex.Station. Если в УДЯ нет вручную созданных сценариев - воспользуйтесь сервисом yandex_station_intents.clear_scenarios, в противном случае - удалите сценарии вручную.
  3. Убедитесь, что в УДЯ не осталось сценариев, созданных компонентом Yandex.Station
  4. В YAML конфигурации измените yandex_station на yandex_station_intents (при условии, что у вас в yandex_station есть только блок intents)
  5. Перезагрузите YAML конфигурацию Yandex.Station Intents сценарии будут созданы автоматически
  6. Дождитесь появления всех сценариев в УДЯ (30-60 секунд), посмотрите Журнал Сервера на наличие ошибок
  7. Перезагрузите Home Assistant, убедитесь, что ошибок по-прежнему нет
  8. Проверьте работу интентов, изменения в автоматизациях не потребуются

Удаление всех сценариев

Компонент позволяет удалить абсолютно все сценарии из УДЯ через сервис yandex_station_intents.clear_scenarios. Будут удалены в том числе и сценарии, созданные вручную.

Для удаления вызовите сервис через Панель разработчика > Сервисы:

service: yandex_station_intents.clear_scenarios
data:
  confirm: Я действительно хочу удалить ВСЕ сценарии из УДЯ

Благодарности