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

11 октября 2020, 07:59
Видео версия статьи:

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

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

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

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 {{start_time.strftime('%H:%M')}} до {{end_time.strftime('%H:%M')}} {{state_attr('calendar.dances_d', 'message')}} {{"\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 {{start_time.strftime('%H:%M')}} до {{end_time.strftime('%H:%M')}} {{state_attr('calendar.english_d', 'message')}} {{"\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 {{start_time.strftime('%H:%M')}} до {{end_time.strftime('%H:%M')}} {{state_attr('calendar.guitar_d', 'message')}} {{"\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 {{start_time.strftime('%H:%M')}} до {{end_time.strftime('%H:%M')}} {{state_attr('calendar.guitar_d', 'message')}} {{"\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: 'Расписание на завтра:{{''

        ''}} {{states(''sensor.calendar_notify'')}}'

  mode: single

Все новости мира умных домов - t.me/SprutAI_News или Instagram
Остались вопросы? Мы в Telegram - @SprutAI

Хочешь умный дом но нет времени разбираться?
Посмотри примеры работ и выбери себе интегратора.
К списку статей

Тематические чаты

Похожие статьи

17 декабря 2019, 17:49
Универсальный привод для автоматического удаленного открытия окон с простой интеграцией в умные дома.
15 ноября 2018, 09:42
Способы автоматизации механических ворот
25 сентября 2020, 11:49
Сенсорный монитор для управления умным домом. Настройка и использование.
20 октября 2018, 22:57
Теоретические основы протокола MQTT и описание того, как он работает и для чего используется
24 августа 2018, 12:18
Пошаговая установка HomeAssistant
27 августа 2018, 10:14
Интегрируем ХА в HomeKit
03 октября 2018, 22:03
Как собрать и настроить Hyperion Ambilight - адаптивную подсветку ТВ.
18 февраля 2020, 17:06
В данной статье описывается сборка слаботочного эл. щита на базе Wiren Board 6, а так же силового щита для небольшой квартиры.
29 октября 2019, 07:59
Умный домофон на базе nodeMCU с прошивкой ESPHome.
01 ноября 2018, 09:27
Настройка Deconz USB стика ConBee от Dresden Elektronik в Hass.io и некоторые особенности эксплуатации