Skip to content

Commit

Permalink
Add offline detection for Zigbee devices
Browse files Browse the repository at this point in the history
  • Loading branch information
marcocunha committed Apr 15, 2024
1 parent 8a8250b commit 5531040
Show file tree
Hide file tree
Showing 3 changed files with 107 additions and 0 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
id: offline_detection_for_Z2M_devices_with_last_seen
alias: Offline detection for Z2M devices with last_seen
description: 'Offline detection for Z2M devices with last_seen'
use_blueprint:
path: Mr-Groch/offline-notification-for-sensors-with-last_seen.yaml
input:
time: '20:00:00'
hours: 12
actions:
- service: notify.marco
metadata: {}
data:
message: 'These Zigbee devices might be offline: {{sensors}}'
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
id: offline_detection_for_z2m_devices_with_sensor
alias: Offline detection for Z2M devices with sensor z2m_offline_devices
description: "Offline detection for Z2M devices with sensor z2m_offline_devices"
mode: single
trigger:
- platform: state
entity_id:
- sensor.z2m_offline_devices
from: null
to: null
condition: []
action:
- service: notify.marco
metadata: {}
data:
message: >-
The following Zigbee Devices are offline
{{states('sensor.z2m_offline_devices')}}
Original file line number Diff line number Diff line change
@@ -0,0 +1,76 @@
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.
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 on
description: Test is run at configured time
default: '10:00:00'
selector:
time: {}
day:
name: Weekday to test on
description: 'Test is run at configured time 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!'
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=[]) %} {% for state in states.sensor
| rejectattr(''attributes.device_class'', ''undefined'') | selectattr(''attributes.device_class'',
''=='', ''timestamp'') %} {% if ''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
condition:
- '{{ sensors != '''' and (day | int == 0 or day | int == now().isoweekday()) }}'
action:
- choose: []
default: !input actions
mode: single

0 comments on commit 5531040

Please sign in to comment.