Files
haos_config/blueprints/automation/gmlupatelli/unavailable_entities_notification.yaml
2026-01-30 23:31:00 -06:00

157 lines
4.8 KiB
YAML

blueprint:
name: Unavailable entity detection & notification
description: >
Regularly test all entities' status to check for unavailability.
Supports exclusion by entities, devices, areas, and labels for flexible filtering.
domain: automation
source_url: https://github.com/gmlupatelli/blueprints_repo/blob/master/unavailable_entities_notification/unavailable_entities_notification.yaml
input:
time:
name: Time to test on
description: Test is run at configured time
default: '10:00:00'
selector:
time: {}
monday_enabled:
name: Monday
default: true
selector:
boolean: {}
tuesday_enabled:
name: Tuesday
default: true
selector:
boolean: {}
wednesday_enabled:
name: Wednesday
default: true
selector:
boolean: {}
thursday_enabled:
name: Thursday
default: true
selector:
boolean: {}
friday_enabled:
name: Friday
default: true
selector:
boolean: {}
saturday_enabled:
name: Saturday
default: true
selector:
boolean: {}
sunday_enabled:
name: Sunday
default: true
selector:
boolean: {}
exclude:
name: Excluded Entities
description: Entities (e.g. smartphone) to exclude. Entities, devices, areas, and labels are supported!
default: {}
selector:
target: {}
include:
name: Included Entities
description: Entities (e.g. smartphone) to include. Entities, devices, areas, and labels are supported!
default: {}
selector:
target: {}
actions:
name: Actions
description: Notifications or similar to be run. {{entities}} is replaced with a formatted list.
default: []
selector:
action: {}
variables:
monday_enabled: !input monday_enabled
tuesday_enabled: !input tuesday_enabled
wednesday_enabled: !input wednesday_enabled
thursday_enabled: !input thursday_enabled
friday_enabled: !input friday_enabled
saturday_enabled: !input saturday_enabled
sunday_enabled: !input sunday_enabled
current_day: '{{ now().weekday() | int }}'
exclude: !input exclude
include: !input include
excluded_entities: >
{% set excluded = [] %}
{% if exclude.entity_id is defined %}
{% set excluded = excluded + ( [exclude.entity_id] if exclude.entity_id is string else exclude.entity_id ) %}
{% endif %}
{% if exclude.device_id is defined %}
{% for d in ([exclude.device_id] if exclude.device_id is string else exclude.device_id) %}
{% set excluded = excluded + device_entities(d) %}
{% endfor %}
{% endif %}
{% if exclude.area_id is defined %}
{% for a in ([exclude.area_id] if exclude.area_id is string else exclude.area_id) %}
{% set excluded = excluded + area_entities(a) %}
{% for d in area_devices(a) %}
{% set excluded = excluded + device_entities(d) %}
{% endfor %}
{% endfor %}
{% endif %}
{% if exclude.label_id is defined %}
{% for l in ([exclude.label_id] if exclude.label_id is string else exclude.label_id) %}
{% set excluded = excluded + label_entities(l) %}
{% endfor %}
{% endif %}
{{ excluded }}
# Build included list
included_entities_raw: >
{{ label_entities('monitored') }}
# Collect ALL unavailable entities (no filtering yet)
unavailable_entities: >
{% set unavail = states | selectattr('state','eq','unavailable') | map(attribute='entity_id') | list %}
{{ unavail }}
# Apply include/exclude filtering only here
final_unavailable_entities: >
{% set ns = namespace(final=[]) %}
{% set included_list = included_entities_raw %}
{% set excluded_list = excluded_entities %}
{% for entity in unavailable_entities %}
{% set dev_id = device_id(entity) %}
{% if entity in included_list and not entity in excluded_list and (not device_attr(dev_id,'disabled_by')) %}
{% set ns.final = ns.final + [state_attr(entity,'friendly_name') ~ ' (' ~ entity ~ ')'] %}
{% endif %}
{% endfor %}
{{ ns.final }}
entities: "{{ '- ' }}{{ final_unavailable_entities | join('\n- ') }}"
trigger:
- platform: time
at: !input time
condition:
- condition: template
value_template: >
{{
(current_day == 0 and monday_enabled) or
(current_day == 1 and tuesday_enabled) or
(current_day == 2 and wednesday_enabled) or
(current_day == 3 and thursday_enabled) or
(current_day == 4 and friday_enabled) or
(current_day == 5 and saturday_enabled) or
(current_day == 6 and sunday_enabled)
}}
- condition: template
value_template: '{{ final_unavailable_entities | length > 0 }}'
action: !input actions
mode: single
max_exceeded: silent