Номер недели, четность и нечетность в Home Assistant

Номер недели, четность и нечетность в Home Assistant

Решил написать небольшую заметку по номерам недели в Home Assistant. Зачем оно надо? У меня, например, настроен сенсор для индикации четных/нечетных недель, который используется в некоторых автоматизациях: по четным субботам умный дом напоминает почистить увлажнитель, а по нечетным робот-пылесос.

Но возможно вы найдете какое-то другое применение номерам недели. Вообще четность недель последний раз меня волновала только, когда я учился в универе. Наверное, можно было бы как-то настроить Home Assistant, чтобы он адаптировался под расписание занятий, но тогда у меня не было умного дома 🙂

Настройка Home Assistant

Получить номер недели, можно используя следующий шаблон:

Номер текущей недели: {{ now().strftime('%W') }}.

Шаблон Jinja2 в Home Assistant.

И в принципе эту строчку уже можно использовать в автоматизациях:

automation:
  - alias: "Выполнять каждый день в полночь по четным неделям"
    trigger:
      platform: time
      at: "00:00:00"
    condition:
      condition: template
      value_template: "{{ (now().strftime('%W') | int) % 2 == 0 }}"

...

Но чтобы не копипастить этот шаблон из раза в раз, можно создать бинарный сенсор и уже его использовать в автоматизациях.

Сенсор для индикации четных/нечетных недель

Для добавления сенсора достаточно в configuration.yaml прописать:

template:
  - binary_sensor:
    - name: Even week
      state: "{{ (now().strftime('%W') | int) % 2 == 0 }}"
      icon: 'mdi:calendar'

И перезапустить Home Assistant. Получившийся сенсор будет on по четным неделям и off по нечетным.

Применение в автоматизациях

В Home Assistant недавно появилась поддержка списков дел. Собственно их я и использую для напоминания о домашних делах. Например, вот так раз в 2 недели добавляется напоминание про увлажнитель:

automation:
  - id: routine_humidifier_maintenance_reminder
    alias: "Humidifier maintenance reminder"
    trigger:
      platform: time
      at: "00:00:00"
    condition:
      - condition: state
        entity_id: binary_sensor.even_week
        state: "on" # каждую четную неделю
      - condition: time
        weekday: ["sat"] # в субботу
    action:
      service: o365.new_task
      target:
	entity_id: sensor.dom_roland
      data_template:
        subject: "Почистить увлажнитель"
        reminder: "{{ today_at('10:00') }}" # напомнить в 10 утра
        description: "Фитиль необходимо поместить в 2.5% раствор уксуса на час."

И точно так же добавляется задача «Почистить робот-пылесос», но уже по нечетным субботам.

Скриншот Microsoft To Do

В качестве планировщика задач я использую Microsoft To Do, который интегрируется с Home Asssitant через O365-HomeAssistant.

Альтернативы

Похожим образом можно использовать и календарь, причем календарь дает больше гибкости.

Скриншот календаря в Home Assistant

Вместо того чтобы задавать фиксированное расписание в конфигурации триггера, можно создать повторяющееся событие в календаре и настроить запуск автоматизации при наступлении этого события:

automation:
  - alias: Уведомление о календарном событии
    trigger:
      - platform: calendar
        event: start
        entity_id: calendar.local
    action:
      - service: persistent_notification.create
        data:
          message: >-
            Событие: {{ trigger.calendar_event.summary }}
            Начало: {{ trigger.calendar_event.start }}

Заключение

Идея этой статьи появилась благодаря Яндекс.Метрике — на сайт почему-то были переходы из поиска по запросу «номер недели в Home Assistant». Но в моем блоге ничего не было на эту тему! Теперь есть 🙂

P.S.

Если вдруг захотите повторить такую же карточку:

Индикация четных и нечетных недель в Home Assistant

То вам понадобятся Mushroom Cards и вот такой YAML:

type: custom:mushroom-template-card
entity: binary_sensor.even_week
primary: "{{ 'Четная' if is_state(entity, 'on') else 'Нечетная' }}"
secondary: |-
  {% set week_start = now() - timedelta(days=now().weekday()) %}
  {% set week_end = week_start + timedelta(days=6) %}
  {{ week_start.strftime('%d.%m') }} – {{ week_end.strftime('%d.%m') }}
icon: mdi:calendar-week
icon_color: var(--rgb-cyan)
tap_action:
  action: more-info

Была ли статья полезна?

Хотите сказать спасибо? Кофе автору — ваша благодарность.

На кофе
Подписка на новые статьи

Уведомления, как только в блоге появится что-нибудь интересненькое.

Подписываясь, вы даете согласие на обработку персональных данных.