Статья

Подключение CalDav календаря и уведомления о событиях в телеграм

Видео версия статьи:

Предпосылкой к созданию шаблона уведомлений послужило то, что я постоянно забываю расписание занятий детей, а также то, что в календаре телефона итак уже куча разных записей.

Я не считаю, что у меня получилось элегантное решение, но между тем, оно прекрасно справляется с возложенной на него функцией.

Для начала на хосте нужно установить необходимые для работы библиотеки:

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

0

Вернуться назад
Вернуться назад