Задача была организовать голосовые напоминания через колонки Яндекса о различных регулярных мероприятиях с удобным интерфейсом для просмотра и редактирования событий. Конечно же, речь только о тех событиях, о которых имеет смысл напоминать дома.
Алисе можно задавать напоминания и голосовыми командами, в том числе и регулярно повторяющиеся. Но посмотреть их списком нигде нельзя, редактировать голосом сложно, долго и неудобно.
У Яндекса есть свой сервис календаря, но напоминать в колонки он не умеет (Яндекс вообще славится разрозненностью своих сервисов, назвать его экосистемой язык не поворачивается).
Также свой календарь есть и в Home Assistant, но интерфейс его редактора и визуализации не очень удобны в сравнении с календарём Google, который по умолчанию есть в каждом телефоне с ОС Android, ну и, разумеется, в браузере. И именно его хотелось использовать, как инструмент настройки, редактирования и визуализации напоминаний.
Для того, чтобы научить Алису воспроизводить голосом уведомления о мероприятиях, заданных в календаре Google, необходимо выполнить следующие шаги.
1. Интеграция Google Calendar
Для начала нужно установить в Home Assistant интеграцию календаря Google, чтобы Home Assistant смог получить к нему доступ. Вот моя статья с подробной инструкцией о том, как это можно сделать:
2. Аддон HACS
Далее нужно установить дополнение (аддон) HACS - магазин пользовательских интеграций (Home Assistant Community Store), если он у вас ещё не установлен. Как это делается я рассказывал вот в этой статье:
3. Интеграция Yandex.Station
Чтобы Home Assistant, получив уведомление из календаря Google, смог передать его на колонку с Алисой, нужно установить интеграцию Yandex.Station. Можно заодно установить и интеграцию Yandex Smart Home, которая сильно расширит функциональность Алисы, но для реализации голосовых напоминаний понадобится только интеграция Yandex.Station. Мою инструкцию по установке этих интеграций вы найдёте здесь:
4. Аддон File Editor
На следующем шаге нам потребуется внести изменения в текстовый файл конфигурации Home Assistant на "не языке разметки" YAML. Для удобства редактирования таких файлов в Home Assistant есть дополнение (аддон) File Editor. Его установить несложно, и для этого у меня тоже есть инструкция:
5. Настройка интеграции Notify
Notify - встроенная в Home Assistant интеграция, позволяющая отправлять уведомления в различные платформы. Например - push на мобильный телефон, сообщение в Telegram, уведомление на Яндекс Станцию и т.п. Для того, чтобы отправлять уведомления из автоматизаций Home Assistant, нужно описать соответствующий нотифер (запись интеграции Notify). Делается это только в текстовом режиме на языке YAML.
Открываем установленный ранее File Editor и в нём открываем файл configuration.yaml, в конец которого добавляем код нотифера:
notify:
- name: alice_alert
platform: yandex_station
data:
entity_id:
- media_player.yandex_station_x45tмb050atkwb
- media_player.yandex_station_m70cbn436f9pzg
- media_player.yandex_station_u045cvf05ssgbk
Имя нотифера (здесь это alice_alert) может быть произвольным. Важно соблюдать количество отступов в начале каждой строки, это часть синтаксиса YAML.
В данном примере участвуют три колонки с Алисой, различающиеся своим идентификатором. Добавляем столько колонок, сколько нужно. Если нужна только одна - значит будет одна строка.
Узнать идентификатор можно разными способами, один из них такой: откройте меню Настройки -> Устройства и службы (Интеграции,..) -> Yandex.Station и нажмите там на "X устройств" чтобы открылся список с колонками. Далее выбираем нужную колонку, заходим в неё и нажимаем на любой объект колонки:
В открывшейся карточке нажимаем шестерёнку:
Выделяем и копируем часть идентификатора объекта:
Можно создать несколько нотиферов, в каждом из которых будет участвовать свой набор колонок. А в автоматизациях выбирать - на каких именно колонках воспроизводить уведомление. Например, одна из колонок у нас установлена в спальне, и уведомления на неё ограничены по времени только лишь дневным промежутком. В автоматизации я задал условие по времени, и если оно выполняется - вызываем один нотифер, и говорят все колонки, а если не выполняется - вызываем другой, и одна из колонок будет молчать. В этом случае запись конфигурации будет выглядеть примерно так:
Тут стоит отметить, что фразы на разных колонках воспроизводятся не синхронно, звук всегда будет сдвинут по времени на произвольное значение, иногда сдвиг достигает нескольких секунд.
Окончив редактировать файл configuration.yaml, убеждаемся, что нет ошибок в синтаксисе (зелёная галочка) и сохраняем изменения (дискетка):
После этого открываем меню "Панель разработчика" и проверяем конфигурацию:
Если всё в порядке:
Перезагружаем Home Assistant кнопкой ПЕРЕЗАПУСТИТЬ или из меню:
6. Автоматизация
Теперь, наконец, всё подготовлено к созданию автоматизации.
Открываем меню Настройки -> Автоматизации и сцены -> кнопка СОЗДАТЬ АВТОМАТИЗАЦИЮ. В качестве триггера задаём Календарь:
Выбираем объект календаря (то есть нужный календарь в календаре Google):
В качестве действия выбираем наш нотифер (в строке поиска начинаем вводить его имя alice_alert):
Должно получиться так:
Теперь самое важное - как получить текст события из календаря. Текст содержится в атрибутах сработавшего триггера, и получить его можно с помощью шаблона {{ trigger.calendar_event.summary }}. Время, в которое сработало уведомление, содержится в атрибуте {{ trigger.calendar_event.start }}.
В поле message в настройках нотификации вставляем следующий текст:
{{ (trigger.calendar_event.start | as_datetime).strftime('%H:%M') }}.
{{ trigger.calendar_event.summary }}
При этом визуальный конструктор поменяет свой внешний вид, перейдя в режим текстового редактирования:
Этот код - шаблон для фразы, которую должна будет произнести Алиса.
Запись {{ (trigger.calendar_event.start | as_datetime).strftime('%H:%M') }}
означает форматирование времени срабатывания уведомления в читабельный вид типа "23:59". Такую запись Алиса произносит именно как время - "Двадцать три часа пятьдесят девять минут". Точка между двумя двойными фигурными скобками - это точка после первого предложения, в котором Алиса произносит время, чтобы правильно отработала интонация. Вторым предложением будет текст самого уведомления календаря. После обработки шаблона сообщение примет такой вид: "Двадцать три часа пятьдесят девять минут. Пора ложиться спать".
Здесь нужно учитывать, что за один раз в Алису можно отправить фразу длиной не более 100 символов, всё что длиннее - будет обрезано и не произнесётся. При этом время 23:59 считается как пять символов. Знаки препинания и пробелы тоже считаются как символы. Если вам не нужно, чтобы Алиса произносила время перед текстом уведомления, тогда в поле message оставьте только шаблон для него - {{ trigger.calendar_event.summary }}.
В триггерах автоматизации можно указать несколько календарей - просто добавить ещё таких же триггеров, выбрав в них другие объекты календаря:
В этом случае озвучиваться будут все выбранные календари.
Если вы хотите, например, чтобы один календарь озвучивала одна колонка, а другой - другая, то в теле автоматизации можно различать, от какого именно календаря пришло уведомление. Для этого нужно задать идентификаторы для триггеров - произвольные текстовые имена:
А в теле автоматизации нужно добавить блок условия "Если-Тогда", в котором в качестве условия выбрать "Идентификатор триггера":
Ну и дальше уже выполнять нужные действия, вызывая нотификаторы с разным набором колонок.
Можно даже дифференцировать действия в теле автоматизации по содержимому уведомления. Например, я делал для ребёнка такое условие - если в тексте уведомления что-то говориться о начале занятий (какое-то онлайн мероприятие), то на два часа отменить автовыключение света в комнате, так как во время неподвижного сидения за компом датчик присутствия иногда теряет присутствие и выключает свет в комнате прямо во время занятия.
Делается это с помощью условия-шаблона:
И в качестве шаблона задаётся условие на содержание в тексте уведомления части слова {{ 'занят' in trigger.calendar_event.summary }}
"Занят" - потому что в тексте уведомления слово может быть употреблено в разной форме - "занятие", "занятию" и т.п. На любой вариант такое условие сработает.
При тестировании автоматизации нужно создавать напоминания (события в календаре) не менее чем за 15 минут до времени их срабатывания, иначе может не сработать (где-то в официальной документации к Home Assistant упоминалось об этом требовании).
Мы пользуемся такой автоматизацией для ребёнка - всё расписание онлайн-занятий, проходящих дома, а также моментов времени начала сборов и выходов из дома на различные регулярные мероприятия забиты в отдельный гугл-календарь для этих целей.