Умные напоминалки

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

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

При этом хочется, чтобы напоминалка падала в удобный канал связи, и при игноре тебя мелко долбила, и не получилось так, чтобы при случайном смахивании ты её забыл навсегда (как с гугл календарём, например).

Долго думал, искал готовые решения, в конце концов написал своё на Home Assistant.

Как его сделать:

  1. Делаем датчики даты последнего выполнения действия (например, кормления животного).
1
2
3
4
5
input_datetime:
gecko_last_fed:
name: Last time gecko was fed
has_date: true
has_time: true
  1. Делаем датчики, которые высчитывают количество часов, прошедшего со времени кормления:
1
2
3
4
5
6
sensor:
- platform: template
sensors:
gecko_after_fed:
value_template: '{{ (((as_timestamp(now()) - states.input_datetime.gecko_last_fed.attributes.timestamp)) | int /60/60/24) | round(1) }}'
unit_of_measurement: 'Days'
  1. Делаем скрипт, который устанавливает на сейчас время последнего кормления:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    script:
    set_gecko_feed_time:
    sequence:
    - alias: Set gecko fed time
    service: input_datetime.set_datetime
    target:
    entity_id: input_datetime.gecko_last_fed
    data:
    timestamp: '{{ now().timestamp() }}'
    alias: Set gecko feed time
    mode: single
  2. Добавляем карточку, которая отображает
  • время последнего кормления
  • количество пройденных часов
  • кнопку, которая указывает, что действие выполнено, например, животное покормлено:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    type: vertical-stack
    cards:
    - type: entities
    entities:
    - entity: input_datetime.gecko_last_fed
    - entity: sensor.gecko_after_fed
    - show_name: true
    show_icon: true
    type: entity-button
    name: I fed gecko
    entity: input_datetime.gecko_last_fed
    icon: mdi:food-croissant
    tap_action:
    action: call-service
    service: script.set_gecko_feed_time
    target: {}
    icon_height: 30px
  1. И последнее - добавляем автоматизацию, которая пишет с какой-то регулярностью в телеграмм, если мы продолбали дату:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
automation:
alias: "Крис: напомнить покормить"
description: ""
trigger:
- platform: time_pattern
hours: /1
condition:
- condition: numeric_state
entity_id: sensor.gecko_after_fed
above: 3
action:
- service: notify.telegram_jehy
data:
title: Time to feed gecko!
message: >-
Gecko was not fed for {{ (states('sensor.gecko_after_fed')) | round(1) }} days!
mode: single

После этого остаётся только радоваться жизни.

Вот так выглядит карточка с тремя такими напоминалками:

так выглядит карточка

А так - сама напоминалка в телеграмм:

напоминалка

Сильнее можно автоматизировать только тем, что добавить зигби-кнопки или голосовые сценарии Алисы, чтобы не тыкать UI Home Assistant, а обновлять данные прям на месте.

UPD: Но красивее это упаковать в один package, чтобы не разбегалось по куче мест:

configuration.yaml:

1
2
homeassistant:
packages: !include_dir_merge_named packages

packages/reminders/chris.yaml:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
reminders_chris:

input_datetime:
gecko_last_fed:
name: Last time gecko was fed
has_date: true
has_time: true

sensor:
- platform: template
sensors:
gecko_after_fed:
value_template: '{{ (((as_timestamp(now()) - states.input_datetime.gecko_last_fed.attributes.timestamp)) | int /60/60/24) | round(1) }}'
unit_of_measurement: 'Days'

script:
set_gecko_feed_time:
sequence:
- alias: Set gecko fed time
service: input_datetime.set_datetime
target:
entity_id: input_datetime.gecko_last_fed
data:
timestamp: '{{ now().timestamp() }}'
alias: Set gecko feed time
mode: single

automation:
alias: "Крис: напомнить покормить"
description: ""
trigger:
- platform: time_pattern
hours: /1
condition:
- condition: numeric_state
entity_id: sensor.gecko_after_fed
above: 3
action:
- service: notify.telegram_jehy
data:
title: Time to feed gecko!
message: >-
Gecko was not fed for {{ (states('sensor.gecko_after_fed')) | round(1) }} days!
mode: single