Pavel Popov
Chief troubleshooting officer, software ninjaneer and digital migrant 🥷

Home Assistant + Yandex Go

В этой статье рассмотрим процесс интеграции сервиса Yandex Go с популярной платформой умного дома Home Assistant. Описанный процесс позволяет получать оповещения о приближении машины такси через Алису. Это удобно когда вам нужно собраться за 15 минут до приезда машины и телефон не всегда под рукой.

Принцип работы прост:

Home Assistant получает идентификатор поездки и потом опрашивает статус поездки через публичное api Yandex Go. Как только время прибытия будет меньше указанного, Home Assistant будет слать сообщение на Алису.

Создаем input_text

Для это в configuration.yaml прописываем:

input_text:
  yandex_go_route_id:
    name: Yandex Go route id

Данный шаг можно сделать и в интерфейсе Home Assistant, но главное правильно указать имя.

Создаем sensor

Сам sensor создаем на базе command_line. Он будет слать GET-запрос на api Yandex Go с идентификатором поездки и получать полную информацию о ней:

# Yandex Go sensor based on command_line sensor platform
#
# https://www.home-assistant.io/integrations/sensor.command_line/
#
platform: command_line
name: Yandex Go Sensor
command: >
  curl 'https://go.yandex/3.0/sharedroute' --data-raw
  '{"key":"{{states('input_text.yandex_go_route_id') }}"}' --compressed
value_template: >
  {% if value_json.status is defined %}
     {{ value_json.status }}
   {% else %}
     waiting
   {% endif %}
json_attributes:
  - routeinfo
  - driver
  - request
  - requested_route_image_url

В случае, если данных он не получит (например 404), он будет указывать себе статус waiting.

Передаем идентификатор поездки в Home Assistant

В данном случае мы будем использовать функцию “Share”, а на телефоне должно быть установлено и настроенно приложение Home Assistant.

После выбираем нашу поездку в Yandex Go и делимся ей с приложением Home Assistant на телефоне.

Но для того, чтоб Home Assistant умел доставать идентификатор поездки из ссылки, нам нужно написать следующий automation:

alias: Processing Yandex Go URL
trigger:
  - platform: event
    event_type: mobile_app.share
condition:
  # Проверяем, что это ссылка от Yandex Go
  - >
    {{ trigger.event.data.entered is
    match('^((?:https?:)?\\/\\/)?((?:www)\\.)?((?:go\\.yandex\\/route\\/\\w+))(?:\\/:?)?(?:\\?lang=..:?)?$')
    }}
action:
  # Достаем идентификатор поездки из ссылки и записываем его
  # в input_text.yandex_go_route_id
  - service: input_text.set_value
    target:
      entity_id: input_text.yandex_go_route_id
    data_template:
      value: >
        {{ trigger.event.data.entered | regex_findall(find='route\\/\\w+') |
        regex_findall_index(find='\\w+', index=1) }}

Оповещение о приближении такси

В рамках примера, оповещение мы будем слать на Алису. Для этого потребуется компонент YandexStation, а также компонент MorphNumbers для работы с числительными на русском языке.

Создадим следующий automation:

alias: Notify when Yandex Taxi is about to arrive at the destination
trigger:
  - platform: state
    entity_id: sensor.yandex_go_sensor
    attribute: routeinfo
condition:
  # Срабатываем, только если до прибытия осталось 15 минут (900 секунд)
  - >
    {{ (state_attr('sensor.yandex_go_sensor', 'routeinfo') != None) and
    state_attr('sensor.yandex_go_sensor', 'routeinfo').time_left <= 900 }}
action:
  # Отправляем текст в Алису. Компонент MorphNumbers используется для
  # корректных окончаний числительных.
  # Пример текста:
  # До прибытия такси осталось 10 минут и 2 километра. Номер машины о007оо.
  - service: tts.yandex_station_say
    entity_id: media_player.yandex_station
    data:
      message: >
        До прибытия такси осталось {{ (state_attr('sensor.yandex_go_sensor',
        'routeinfo').time_left / 60) | round | format(morph='минута') }} и {{
        (state_attr('sensor.yandex_go_sensor', 'routeinfo').distance_left /
        1000) | round | format(morph='километр') }}. Номер машины {{
        state_attr('sensor.yandex_go_sensor', 'driver').plates }}.

Итог

Теперь мы можем заказать такси в Yandex Go и поделиться маршрутом с Home Assistant. За 15 минут до прибытия машины, Home Assistant начнет каждую минуту оповещать нас через Алису о скором прибытии машины.

Backlinks to this note