Skip to content

Instantly share code, notes, and snippets.

Show Gist options
  • Save Kovah/6d883d763fc07ef52fc1a6371bd7d3a0 to your computer and use it in GitHub Desktop.
Save Kovah/6d883d763fc07ef52fc1a6371bd7d3a0 to your computer and use it in GitHub Desktop.
Home Assistant Blueprint: Offline detection for Z2M devices with last_seen
blueprint:
name: Offline detection for Z2M devices with last_seen
description: Regularly test all sensors with 'last_seen' in name and 'timestamp' device_class
('last seen' Z2M sensors) to detect offline and if so execute an action. Runs up to
three times per day and only includes sensors labeled 'LastSeenCheck'.
domain: automation
input:
hours:
name: Hours not seen
description: Sensors not seen this amount of time are assumed to be offline.
default: 24
selector:
number:
min: 1.0
max: 168.0
unit_of_measurement: h
mode: slider
step: 1.0
time:
name: Time to test (1)
description: First time the test should run each day
default: '10:00:00'
selector:
time: {}
time2:
name: Time to test (2)
description: Second time the test should run each day
default: '14:00:00'
selector:
time: {}
time3:
name: Time to test (3)
description: Third time the test should run each day
default: '20:00:00'
selector:
time: {}
day:
name: Weekday to test on
description: 'Test is run at configured time(s) either everyday (0) or on a given
weekday (1: Monday ... 7: Sunday)'
default: 0
selector:
number:
min: 0.0
max: 7.0
mode: slider
step: 1.0
exclude:
name: Excluded Sensors
description: "'last seen' sensors (from devices that you want to exclude) to
exclude from detection. Only entities with 'last seen' in name and 'timestamp'
in device_class are supported, devices must be expanded! Only entities with
the 'LastSeenCheck' label are considered."
default:
entity_id: []
selector:
target:
entity:
domain: sensor
actions:
name: Actions
description: Notifications or similar to be run. {{sensors}} is replaced with
the names of sensors being offline.
selector:
action: {}
source_url: https://gist.github.com/Mr-Groch/bf073b142b507e3b6f8154223f81803b
variables:
day: !input 'day'
hours: !input 'hours'
exclude: !input 'exclude'
sensors: "{% set result = namespace(sensors=[]) %}\
\ {% set label_select = label_entities('LastSeenCheck') | list %}\
\ {% for state in states.sensor | rejectattr('attributes.device_class', 'undefined') | selectattr('attributes.device_class', '==', 'timestamp') %}\
\ {% if state.entity_id in label_select and 'last_seen' in state.entity_id and not state.entity_id in exclude.entity_id and (states(state.entity_id) == 'unavailable' or ((as_timestamp(now()) - as_timestamp(states(state.entity_id))) > ((hours | int) * 60 * 60))) %}\
\ {% set result.sensors = result.sensors + [state.name | regex_replace(find=' last seen', replace='') ~ ' (' ~ relative_time(strptime(states(state.entity_id), '%Y-%m-%dT%H:%M:%S%z', 'unavailable')) ~ ')'] %}\
\ {% endif %}\
\ {% endfor %}\
\ {{ result.sensors | join(', ') }}"
trigger:
- platform: time
at: !input 'time'
- platform: time
at: !input 'time2'
- platform: time
at: !input 'time3'
condition:
- '{{ sensors != '''' and (day | int == 0 or day | int == now().isoweekday()) }}'
action:
- choose: []
default: !input 'actions'
mode: single
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment