Видео версия статьи:
Предпосылкой к созданию шаблона уведомлений послужило то, что я постоянно забываю расписание занятий детей, а также то, что в календаре телефона итак уже куча разных записей.
Я не считаю, что у меня получилось элегантное решение, но между тем, оно прекрасно справляется с возложенной на него функцией.
Для начала на хосте нужно установить необходимые для работы библиотеки:
sudo apt-get install libxml2-dev libxslt1-dev zlib1g-dev
Затем в configuration.yaml включить календарь с доступом по CalDav:
calendar: - platform: caldav username: !secret nextcloud_username password: !secret nextcloud_password url: !secret nextcloud_url calendars: - english_d - dances_d - guitar_d days: 2
Где:
platform: - платформа, в данном случае CalDav, также возможно подключение GoogleCalendar;
username: - имя пользователя календаря;
password: - пароль пользователя календаря;
url: - адрес календаря, в Nextcloud имеет вид https://example.com/remote.php/dav/;
calendars: - подключаемые календари;
days: - количество дней поиска предстоящих событий.
Также есть способ подключения с использованием фильтрации по названию события, но мне он не приглянулся.Далее необходимо создать шаблон сенсора, который будет отслеживать предстоящие события:
- platform: template sensors: calendar_notify: value_template: > {% set check = false %} {%- if as_timestamp(state_attr('calendar.dances_d', 'start_time')) is not none %} {% set check = true %} {%- if as_timestamp(now()) > as_timestamp(state_attr('calendar.dances_d', 'start_time'))-86400 %} {% set start_time = strptime(state_attr('calendar.dances_d', 'start_time'),'%Y-%m-%d %H:%M:%S')%} {% set end_time = strptime(state_attr('calendar.dances_d', 'end_time'),'%Y-%m-%d %H:%M:%S')%} c {} до {} {} {{"\U0001F483"}} {%- endif -%} {%- endif -%} {%- if as_timestamp(state_attr('calendar.english_d', 'start_time')) is not none %} {% set check = true %} {%- if as_timestamp(now()) > as_timestamp(state_attr('calendar.english_d', 'start_time'))-86400 %} {% set start_time = strptime(state_attr('calendar.english_d', 'start_time'),'%Y-%m-%d %H:%M:%S')%} {% set end_time = strptime(state_attr('calendar.english_d', 'end_time'),'%Y-%m-%d %H:%M:%S')%} {{ '\n' -}} c {} до {} {} {{"\U0001F1E7"}} {%- endif -%} {%- endif -%} {%- if as_timestamp(state_attr('calendar.guitar_d', 'start_time')) is not none %} {% set check = true %} {%- if as_timestamp(now()) > as_timestamp(state_attr('calendar.guitar_d', 'start_time'))-86400 %} {% set start_time = strptime(state_attr('calendar.guitar_d', 'start_time'),'%Y-%m-%d %H:%M:%S')%} {% set end_time = strptime(state_attr('calendar.guitar_d', 'end_time'),'%Y-%m-%d %H:%M:%S')%} {{ '\n' -}} c {} до {} {} {{"\U0001F3B8"}} {%- endif -%} {%- endif -%} {%- if check is not true %} false {%- endif -%}
Где:
{% set check = false %} - переменная, необходимая в автоматизации. Если значение сенсора будет false, автоматизация не сработает.
{%- if as_timestamp(state_attr('calendar.guitar_d', 'start_time')) is not none %} - если атрибут start_time возвращает значение отличное от none, то продолжается выполнение кода.
{%- if as_timestamp(now()) > as_timestamp(state_attr('calendar.guitar_d', 'start_time'))-86400 %} - если текущее время больше, чем время предстоящего события (время события - 1 сутки), то продолжается выполнение кода. NB: Если событие в календаре запланировано, например, на 19:00, а уведомление о предстоящих событиях будет приходить в 18:00, то нужно будет исправить алгоритм.
{% set start_time = strptime(state_attr('calendar.guitar_d', 'start_time'),'%Y-%m-%d %H:%M:%S')%} - преобразует строку в значение времени.
{{ '\n' -}} - перевод строки, чтобы сообщение не создавалось в одну строчку.
c {} до {} {} {{"\U0001F483"}} - само тело сообщения и emoji.
{%- if check is not true %} - если переменная check не равна true, то значение сенсора будет false.
Дальше осталось создать автоматизацию, которая будет отправлять уведомления о предстоящих событиях в Телеграм, если значение сенсора не равно false:
- id: '1602182565495' alias: Уведомление о расписании на завтра description: '' trigger: - platform: time at: '18:00:00' condition: - condition: not conditions: - condition: state entity_id: sensor.calendar_notify state: 'false' action: - service: notify.telega data: message: 'Расписание на завтра:{{'' ''}} {}' mode: single