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