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 начнет каждую минуту оповещать нас через Алису о скором прибытии машины.