mirror of
https://github.com/CCOSTAN/Home-AssistantConfig.git
synced 2026-06-09 03:44:44 +00:00
Add snoozeable maintenance reminders
This commit is contained in:
@@ -7,6 +7,7 @@
|
||||
# Thermostat helpers for upstairs/downstairs comfort.
|
||||
# -------------------------------------------------------------------
|
||||
# Related Issue: 1571
|
||||
# Notes: Filter due alerts include 3-day snooze and Filter Changed push actions.
|
||||
######################################################################
|
||||
# Contact: @CCOSTAN | Entity reference details below
|
||||
# Entity reference and attribute summaries:
|
||||
@@ -69,10 +70,18 @@ input_datetime:
|
||||
name: Downstairs Last Filter Change
|
||||
has_date: true
|
||||
has_time: true
|
||||
downstairs_filter_snooze_until:
|
||||
name: Downstairs Filter Snooze Until
|
||||
has_date: true
|
||||
has_time: true
|
||||
upstairs_last_filter_change:
|
||||
name: Upstairs Last Filter Change
|
||||
has_date: true
|
||||
has_time: true
|
||||
upstairs_filter_snooze_until:
|
||||
name: Upstairs Filter Snooze Until
|
||||
has_date: true
|
||||
has_time: true
|
||||
|
||||
# ---------------------------------------------------------------------------
|
||||
# Integration sensors tally runtime based on compressor state
|
||||
@@ -109,6 +118,10 @@ script:
|
||||
data:
|
||||
entity_id: input_datetime.downstairs_last_filter_change
|
||||
datetime: "{{ now().strftime('%Y-%m-%d %H:%M:%S') }}"
|
||||
- service: input_datetime.set_datetime
|
||||
data:
|
||||
entity_id: input_datetime.downstairs_filter_snooze_until
|
||||
datetime: "{{ (now() - timedelta(minutes=1)).strftime('%Y-%m-%d %H:%M:%S') }}"
|
||||
- service: utility_meter.reset
|
||||
target:
|
||||
entity_id: sensor.downstairs_ac_runtime_since_last_filter_change
|
||||
@@ -121,6 +134,10 @@ script:
|
||||
data:
|
||||
entity_id: input_datetime.upstairs_last_filter_change
|
||||
datetime: "{{ now().strftime('%Y-%m-%d %H:%M:%S') }}"
|
||||
- service: input_datetime.set_datetime
|
||||
data:
|
||||
entity_id: input_datetime.upstairs_filter_snooze_until
|
||||
datetime: "{{ (now() - timedelta(minutes=1)).strftime('%Y-%m-%d %H:%M:%S') }}"
|
||||
- service: utility_meter.reset
|
||||
target:
|
||||
entity_id: sensor.upstairs_ac_runtime_since_last_filter_change
|
||||
@@ -264,19 +281,35 @@ automation:
|
||||
- platform: numeric_state
|
||||
entity_id: sensor.downstairs_ac_runtime_since_last_filter_change
|
||||
above: 800 # hours
|
||||
- platform: time
|
||||
at: "09:00:00"
|
||||
condition:
|
||||
- condition: numeric_state
|
||||
entity_id: sensor.downstairs_ac_runtime_since_last_filter_change
|
||||
above: 800
|
||||
- condition: template
|
||||
value_template: >-
|
||||
{% set snooze_until = as_timestamp(states('input_datetime.downstairs_filter_snooze_until'), 0) %}
|
||||
{{ snooze_until <= as_timestamp(now()) }}
|
||||
action:
|
||||
- service: script.send_to_logbook
|
||||
data:
|
||||
topic: "MAINTENANCE"
|
||||
message: >-
|
||||
Downstairs AC filter due (runtime >800h). Last changed {{ ((now() - states.input_datetime.downstairs_last_filter_change.last_changed).total_seconds() / 86400) | round(0) }} days ago.
|
||||
- service: script.notify_engine # <-- keep your existing notify helper
|
||||
- service: script.notify_engine_two_button
|
||||
data:
|
||||
title: "Home Maintenance Reminder"
|
||||
value1: "It's time to change your Downstairs AC filter."
|
||||
value2: >
|
||||
Runtime has exceeded 800 h. Last changed {{ ((now() - states.input_datetime.downstairs_last_filter_change.last_changed).total_seconds() / 86400) | round(0) }} days ago.
|
||||
who: "Carlo"
|
||||
Runtime has exceeded 800h. Last changed {{ ((now() - states.input_datetime.downstairs_last_filter_change.last_changed).total_seconds() / 86400) | round(0) }} days ago.
|
||||
title1: "Snooze 3d"
|
||||
action1: "SNOOZE_DOWNSTAIRS_FILTER_3D"
|
||||
icon1: "sfsymbols:clock"
|
||||
title2: "Filter Changed"
|
||||
action2: "RESET_DOWNSTAIRS_FILTER"
|
||||
icon2: "sfsymbols:checkmark.circle"
|
||||
who: "carlo"
|
||||
group: "maintenance"
|
||||
level: "active"
|
||||
|
||||
@@ -286,21 +319,104 @@ automation:
|
||||
- platform: numeric_state
|
||||
entity_id: sensor.upstairs_ac_runtime_since_last_filter_change
|
||||
above: 450 # hours
|
||||
- platform: time
|
||||
at: "09:10:00"
|
||||
condition:
|
||||
- condition: numeric_state
|
||||
entity_id: sensor.upstairs_ac_runtime_since_last_filter_change
|
||||
above: 450
|
||||
- condition: template
|
||||
value_template: >-
|
||||
{% set snooze_until = as_timestamp(states('input_datetime.upstairs_filter_snooze_until'), 0) %}
|
||||
{{ snooze_until <= as_timestamp(now()) }}
|
||||
action:
|
||||
- service: script.send_to_logbook
|
||||
data:
|
||||
topic: "MAINTENANCE"
|
||||
message: >-
|
||||
Upstairs AC filter due (runtime >450h). Last changed {{ ((now() - states.input_datetime.upstairs_last_filter_change.last_changed).total_seconds() / 86400) | round(0) }} days ago.
|
||||
- service: script.notify_engine
|
||||
- service: script.notify_engine_two_button
|
||||
data:
|
||||
title: "Home Maintenance Reminder"
|
||||
value1: "It's time to change your Upstairs AC filter."
|
||||
value2: >
|
||||
Runtime has exceeded 450 h. Last changed {{ ((now() - states.input_datetime.upstairs_last_filter_change.last_changed).total_seconds() / 86400) | round(0) }} days ago.
|
||||
who: "Carlo"
|
||||
Runtime has exceeded 450h. Last changed {{ ((now() - states.input_datetime.upstairs_last_filter_change.last_changed).total_seconds() / 86400) | round(0) }} days ago.
|
||||
title1: "Snooze 3d"
|
||||
action1: "SNOOZE_UPSTAIRS_FILTER_3D"
|
||||
icon1: "sfsymbols:clock"
|
||||
title2: "Filter Changed"
|
||||
action2: "RESET_UPSTAIRS_FILTER"
|
||||
icon2: "sfsymbols:checkmark.circle"
|
||||
who: "carlo"
|
||||
group: "maintenance"
|
||||
|
||||
- alias: Climate Filter Reminder Actions
|
||||
id: 6d7056d0-90ce-4c4f-b8b1-fd32a7e58311
|
||||
mode: queued
|
||||
trigger:
|
||||
- platform: event
|
||||
event_type: mobile_app_notification_action
|
||||
event_data:
|
||||
action: SNOOZE_DOWNSTAIRS_FILTER_3D
|
||||
id: downstairs_snooze
|
||||
- platform: event
|
||||
event_type: mobile_app_notification_action
|
||||
event_data:
|
||||
action: SNOOZE_UPSTAIRS_FILTER_3D
|
||||
id: upstairs_snooze
|
||||
- platform: event
|
||||
event_type: mobile_app_notification_action
|
||||
event_data:
|
||||
action: RESET_DOWNSTAIRS_FILTER
|
||||
id: downstairs_reset
|
||||
- platform: event
|
||||
event_type: mobile_app_notification_action
|
||||
event_data:
|
||||
action: RESET_UPSTAIRS_FILTER
|
||||
id: upstairs_reset
|
||||
action:
|
||||
- choose:
|
||||
- conditions: "{{ trigger.id == 'downstairs_snooze' }}"
|
||||
sequence:
|
||||
- variables:
|
||||
snooze_until: "{{ (now() + timedelta(days=3)).strftime('%Y-%m-%d %H:%M:%S') }}"
|
||||
- service: input_datetime.set_datetime
|
||||
target:
|
||||
entity_id: input_datetime.downstairs_filter_snooze_until
|
||||
data:
|
||||
datetime: "{{ snooze_until }}"
|
||||
- service: script.send_to_logbook
|
||||
data:
|
||||
topic: "MAINTENANCE"
|
||||
message: "Downstairs AC filter reminder snoozed until {{ snooze_until }}."
|
||||
- conditions: "{{ trigger.id == 'upstairs_snooze' }}"
|
||||
sequence:
|
||||
- variables:
|
||||
snooze_until: "{{ (now() + timedelta(days=3)).strftime('%Y-%m-%d %H:%M:%S') }}"
|
||||
- service: input_datetime.set_datetime
|
||||
target:
|
||||
entity_id: input_datetime.upstairs_filter_snooze_until
|
||||
data:
|
||||
datetime: "{{ snooze_until }}"
|
||||
- service: script.send_to_logbook
|
||||
data:
|
||||
topic: "MAINTENANCE"
|
||||
message: "Upstairs AC filter reminder snoozed until {{ snooze_until }}."
|
||||
- conditions: "{{ trigger.id == 'downstairs_reset' }}"
|
||||
sequence:
|
||||
- service: script.reset_downstairs_filter
|
||||
- service: script.send_to_logbook
|
||||
data:
|
||||
topic: "MAINTENANCE"
|
||||
message: "Downstairs AC filter reset from notification action."
|
||||
- conditions: "{{ trigger.id == 'upstairs_reset' }}"
|
||||
sequence:
|
||||
- service: script.reset_upstairs_filter
|
||||
- service: script.send_to_logbook
|
||||
data:
|
||||
topic: "MAINTENANCE"
|
||||
message: "Upstairs AC filter reset from notification action."
|
||||
|
||||
- alias: 'AC Status Announcement'
|
||||
id: 7812fdaf-a3f8-498b-8f07-28e977e528fe
|
||||
trigger:
|
||||
|
||||
@@ -8,7 +8,14 @@
|
||||
# -------------------------------------------------------------------
|
||||
# Notes: Inspired by https://community.home-assistant.io/t/epson-wf-3540-ink-level-monitoring/21813
|
||||
# Notes: Automations - Detect when things are not right. Like any Good Watchdog
|
||||
# Notes: Ink alerts include 1-day and 1-week snooze actions.
|
||||
######################################################################
|
||||
input_datetime:
|
||||
printer_ink_snooze_until:
|
||||
name: Printer Ink Snooze Until
|
||||
has_date: true
|
||||
has_time: true
|
||||
|
||||
automation:
|
||||
- alias: 'Printer Ink Alert'
|
||||
id: 6ef2a695-0b76-4eb5-b67c-2ff6f74f40b8
|
||||
@@ -19,16 +26,75 @@ automation:
|
||||
- sensor.canon_ts300_series_black
|
||||
- sensor.canon_ts300_series_color
|
||||
below: 15
|
||||
- platform: time
|
||||
at: "10:00:00"
|
||||
variables:
|
||||
low_cartridges: >-
|
||||
{% set ns = namespace(items=[]) %}
|
||||
{% for entity_id in ['sensor.canon_ts300_series_black', 'sensor.canon_ts300_series_color'] %}
|
||||
{% set ink_level = states(entity_id) %}
|
||||
{% set cartridge_name = state_attr(entity_id, 'friendly_name') | default(entity_id, true) %}
|
||||
{% if ink_level not in ['unknown', 'unavailable', 'none', ''] and (ink_level | float(100)) < 15 %}
|
||||
{% set ns.items = ns.items + [cartridge_name ~ ' is at ' ~ ink_level ~ '%'] %}
|
||||
{% endif %}
|
||||
{% endfor %}
|
||||
{{ ns.items | join('; ') }}
|
||||
condition:
|
||||
condition: time
|
||||
weekday:
|
||||
- wed
|
||||
- condition: time
|
||||
weekday:
|
||||
- wed
|
||||
- condition: template
|
||||
value_template: "{{ low_cartridges | trim != '' }}"
|
||||
- condition: template
|
||||
value_template: >-
|
||||
{% set snooze_until = as_timestamp(states('input_datetime.printer_ink_snooze_until'), 0) %}
|
||||
{{ snooze_until <= as_timestamp(now()) }}
|
||||
action:
|
||||
- service: script.notify_engine
|
||||
- service: script.notify_engine_two_button
|
||||
data:
|
||||
value1: "{{ trigger.to_state.attributes.friendly_name }} is at {{ trigger.to_state.state }} "
|
||||
title: "Printer Ink Alert"
|
||||
value1: "{{ low_cartridges }}"
|
||||
who: 'carlo'
|
||||
apns_id: 'information'
|
||||
group: 'Printer'
|
||||
title1: "Snooze 1d"
|
||||
action1: "SNOOZE_PRINTER_INK_1D"
|
||||
icon1: "sfsymbols:clock"
|
||||
title2: "Snooze 1w"
|
||||
action2: "SNOOZE_PRINTER_INK_1W"
|
||||
icon2: "sfsymbols:calendar"
|
||||
|
||||
- alias: 'Printer Ink Snooze'
|
||||
id: 77a5cb04-64e6-465e-a3d4-1f75882bbbd4
|
||||
mode: queued
|
||||
trigger:
|
||||
- platform: event
|
||||
event_type: mobile_app_notification_action
|
||||
event_data:
|
||||
action: SNOOZE_PRINTER_INK_1D
|
||||
id: one_day
|
||||
- platform: event
|
||||
event_type: mobile_app_notification_action
|
||||
event_data:
|
||||
action: SNOOZE_PRINTER_INK_1W
|
||||
id: one_week
|
||||
variables:
|
||||
snooze_until: >-
|
||||
{% if trigger.id == 'one_day' %}
|
||||
{{ (now() + timedelta(days=1)).strftime('%Y-%m-%d %H:%M:%S') }}
|
||||
{% else %}
|
||||
{{ (now() + timedelta(days=7)).strftime('%Y-%m-%d %H:%M:%S') }}
|
||||
{% endif %}
|
||||
snooze_label: "{{ '1 day' if trigger.id == 'one_day' else '1 week' }}"
|
||||
action:
|
||||
- service: input_datetime.set_datetime
|
||||
target:
|
||||
entity_id: input_datetime.printer_ink_snooze_until
|
||||
data:
|
||||
datetime: "{{ snooze_until }}"
|
||||
- service: script.send_to_logbook
|
||||
data:
|
||||
topic: "PRINTER"
|
||||
message: "Printer ink alert snoozed for {{ snooze_label }} (until {{ snooze_until }})."
|
||||
|
||||
- alias: 'Printer Status Notifications'
|
||||
id: 6ef2a695-0b76-4eb5-b67c-2ff6f74f40b9
|
||||
|
||||
@@ -11,6 +11,7 @@
|
||||
# Notes: General vacation speech uses Chromecast only; the garage Alexa welcome is the one local-device exception.
|
||||
# Notes: Visit analytics use recorder-backed visit counts plus arrival/departure helpers for accurate durations.
|
||||
# Notes: Dorm zones are reported as away locations, not Bear Stone home.
|
||||
# Notes: Missed sitter alerts include 2-day and 3-day snooze actions that clear after a visit.
|
||||
# Video: https://youtu.be/15kRcFaVV2Y
|
||||
# Blog: https://www.vcloudinfo.com/2026/05/home-assistant-vacation-mode-house-sitter-automation.html
|
||||
######################################################################
|
||||
@@ -34,6 +35,10 @@ input_datetime:
|
||||
name: Vacation House Sitter Last Departure
|
||||
has_date: true
|
||||
has_time: true
|
||||
vacation_house_sitter_missed_visit_snooze_until:
|
||||
name: Vacation House Sitter Missed Visit Snooze Until
|
||||
has_date: true
|
||||
has_time: true
|
||||
|
||||
input_number:
|
||||
vacation_house_sitter_last_visit_minutes:
|
||||
@@ -200,6 +205,27 @@ automation:
|
||||
Vacation Mode has been disabled and normal automations will continue.
|
||||
call_no_announcement: 1
|
||||
|
||||
- alias: 'Vacation Mode Clear Missed Visit Snooze'
|
||||
id: 88b7ce4b-b7f9-4770-8b1c-2c42b7a98e32
|
||||
mode: queued
|
||||
|
||||
trigger:
|
||||
- platform: state
|
||||
entity_id: input_boolean.vacation_mode
|
||||
to:
|
||||
- 'on'
|
||||
- 'off'
|
||||
- platform: state
|
||||
entity_id: input_boolean.house_sitter_present
|
||||
to: 'on'
|
||||
|
||||
action:
|
||||
- service: input_datetime.set_datetime
|
||||
target:
|
||||
entity_id: input_datetime.vacation_house_sitter_missed_visit_snooze_until
|
||||
data:
|
||||
datetime: "{{ (now() - timedelta(minutes=1)).strftime('%Y-%m-%d %H:%M:%S') }}"
|
||||
|
||||
- alias: 'Vacation Mode Garage Welcome'
|
||||
id: 63ac9268-c895-4a1b-b0df-92b5bb8e9d01
|
||||
mode: single
|
||||
@@ -645,6 +671,10 @@ automation:
|
||||
value_template: >-
|
||||
{% set last_alert = as_timestamp(state_attr('automation.vacation_mode_missed_visit_alert', 'last_triggered'), 0) %}
|
||||
{{ last_alert == 0 or (as_timestamp(now()) - last_alert) >= 86400 }}
|
||||
- condition: template
|
||||
value_template: >-
|
||||
{% set snooze_until = as_timestamp(states('input_datetime.vacation_house_sitter_missed_visit_snooze_until'), 0) %}
|
||||
{{ snooze_until <= as_timestamp(now()) }}
|
||||
|
||||
action:
|
||||
- variables:
|
||||
@@ -664,13 +694,19 @@ automation:
|
||||
No sitter visit has been detected for {{ hours_since }} hours since {{ baseline_label }}.
|
||||
Visit count this vacation is {{ visit_count }}.
|
||||
|
||||
- service: script.notify_engine
|
||||
- service: script.notify_engine_two_button
|
||||
data:
|
||||
title: Vacation missed visit alert
|
||||
value1: "{{ alert_message }}"
|
||||
who: carlo
|
||||
group: information
|
||||
level: active
|
||||
title1: "Snooze 2d"
|
||||
action1: "SNOOZE_SITTER_MISSED_VISIT_2D"
|
||||
icon1: "sfsymbols:clock"
|
||||
title2: "Snooze 3d"
|
||||
action2: "SNOOZE_SITTER_MISSED_VISIT_3D"
|
||||
icon2: "sfsymbols:calendar"
|
||||
|
||||
- service: script.joanna_send_telegram
|
||||
data:
|
||||
@@ -681,6 +717,39 @@ automation:
|
||||
topic: VACATION MODE
|
||||
message: "{{ alert_message }}"
|
||||
|
||||
- alias: 'Vacation Mode Missed Visit Snooze'
|
||||
id: b5a2e44a-1a42-4a2f-992c-18d8dd8d71d9
|
||||
mode: queued
|
||||
trigger:
|
||||
- platform: event
|
||||
event_type: mobile_app_notification_action
|
||||
event_data:
|
||||
action: SNOOZE_SITTER_MISSED_VISIT_2D
|
||||
id: two_days
|
||||
- platform: event
|
||||
event_type: mobile_app_notification_action
|
||||
event_data:
|
||||
action: SNOOZE_SITTER_MISSED_VISIT_3D
|
||||
id: three_days
|
||||
variables:
|
||||
snooze_until: >-
|
||||
{% if trigger.id == 'two_days' %}
|
||||
{{ (now() + timedelta(days=2)).strftime('%Y-%m-%d %H:%M:%S') }}
|
||||
{% else %}
|
||||
{{ (now() + timedelta(days=3)).strftime('%Y-%m-%d %H:%M:%S') }}
|
||||
{% endif %}
|
||||
snooze_label: "{{ '2 days' if trigger.id == 'two_days' else '3 days' }}"
|
||||
action:
|
||||
- service: input_datetime.set_datetime
|
||||
target:
|
||||
entity_id: input_datetime.vacation_house_sitter_missed_visit_snooze_until
|
||||
data:
|
||||
datetime: "{{ snooze_until }}"
|
||||
- service: script.send_to_logbook
|
||||
data:
|
||||
topic: VACATION MODE
|
||||
message: "Vacation missed sitter visit alert snoozed for {{ snooze_label }} (until {{ snooze_until }})."
|
||||
|
||||
- alias: 'Vacation Mode Room Hints'
|
||||
id: e0d4e35c-2bf4-435d-adff-52d836812999
|
||||
mode: single
|
||||
|
||||
Reference in New Issue
Block a user