blueprint: name: Low battery level detection & notification for all battery sensors description: Regularly test all sensors with 'battery' device-class for crossing a certain battery level threshold and if so execute an action. domain: automation input: threshold: name: Battery warning level threshold description: Battery sensors below threshold are assumed to be low-battery (as well as binary battery sensors with value 'on'). default: 20 selector: number: min: 5.0 max: 100.0 unit_of_measurement: '%' mode: slider step: 5.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: Battery sensors (e.g. smartphone) to exclude from detection. Only entities are supported, devices must be expanded! default: entity_id: [] selector: target: entity: device_class: battery actions: name: Actions description: Notifications or similar to be run. {{sensors}} is replaced with the names of sensors being low on battery. selector: action: {} source_url: https://gist.github.com/sbyx/1f6f434f0903b872b84c4302637d0890 variables: day: !input day threshold: !input threshold exclude: !input exclude sensors: "{% set result = namespace(sensors=[]) %} {% for state in states.sensor | selectattr('attributes.device_class', '==', 'battery') %}\n {% if 0 <= state.state | int(-1) < threshold | int and not state.entity_id in exclude.entity_id %}\n \ {% set result.sensors = result.sensors + [state.name ~ ' (' ~ state.state ~ ' %)'] %}\n {% endif %}\n{% endfor %} {% for state in states.binary_sensor | selectattr('attributes.device_class', '==', 'battery') | selectattr('state', '==', 'on') %}\n {% if not state.entity_id in exclude.entity_id %}\n {% set result.sensors = result.sensors + [state.name] %}\n {% endif %}\n{% 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