diff --git a/homeassistant/config/automations/it_maintenance/offline_detection_for_Z2M_devices_with_last_seen.yaml b/homeassistant/config/automations/it_maintenance/offline_detection_for_Z2M_devices_with_last_seen.yaml new file mode 100644 index 00000000..4eed0432 --- /dev/null +++ b/homeassistant/config/automations/it_maintenance/offline_detection_for_Z2M_devices_with_last_seen.yaml @@ -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}}' diff --git a/homeassistant/config/automations/it_maintenance/offline_detection_for_z2m_devices_with_sensor.yaml b/homeassistant/config/automations/it_maintenance/offline_detection_for_z2m_devices_with_sensor.yaml new file mode 100644 index 00000000..0b68594b --- /dev/null +++ b/homeassistant/config/automations/it_maintenance/offline_detection_for_z2m_devices_with_sensor.yaml @@ -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')}} diff --git a/homeassistant/config/blueprints/automation/Mr-Groch/offline-notification-for-sensors-with-last_seen.yaml b/homeassistant/config/blueprints/automation/Mr-Groch/offline-notification-for-sensors-with-last_seen.yaml new file mode 100644 index 00000000..2b70d04b --- /dev/null +++ b/homeassistant/config/blueprints/automation/Mr-Groch/offline-notification-for-sensors-with-last_seen.yaml @@ -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