Skip to content

Instantly share code, notes, and snippets.

Show Gist options
  • Save kurohouou/880fdbffc697ef872cf8a793dc3fb72b to your computer and use it in GitHub Desktop.
Save kurohouou/880fdbffc697ef872cf8a793dc3fb72b to your computer and use it in GitHub Desktop.
Home Assistant Blueprint: Low battery level detection & notification for all battery sensors
blueprint:
name: Low Battery and Device Unavailable Check
description: Regularly test all sensors with 'battery' device-class for crossing
a certain battery level threshold as well as if it is unavailable.
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: Removed Battery only selection to select any entity like switches. Only entities are supported, devices must be expanded!
default: {entity_id: []}
selector:
target:
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') %}
{% if 0 <= state.state | int(-1) < threshold | int and not state.entity_id in exclude.entity_id %}
{% set result.sensors = result.sensors + [ state.name ~ ' (' ~ state.state ~ ' %)'] %}
{% endif %}
{% endfor %}
{% for state in states.sensor | selectattr('attributes.device_class', 'defined') | selectattr('attributes.device_class', '==', 'battery') %}
{% if "unavailable" in state | string and not state.entity_id in exclude.entity_id %}
{% set result.sensors = result.sensors + [ state.name ~ ' (' ~ state.state ~ ')'] %}
{% endif %}
{% endfor %}
{% for state in states.binary_sensor | selectattr('attributes.device_class', '==', 'battery') | selectattr('state', '==', 'on') %}
{% if not state.entity_id in exclude.entity_id %}
{% set result.sensors = result.sensors + [ state.name] %}
{% endif %}
{% endfor %}
{% for state in states.binary_sensor | selectattr('attributes.device_class', 'defined') | selectattr('attributes.device_class', '==', 'battery') %}
{% if "unavailable" in state | string and not state.entity_id in exclude.entity_id %}
{% set result.sensors = result.sensors + [ state.name ~ ' (' ~ state.state ~ ')'] %}
{% endif %}
{% endfor %}
{% for state in states.switch | selectattr('state','eq','unavailable') %}
{% if state.entity_id not in exclude.entity_id %}
{% set result.sensors = result.sensors + [ state.name ~ ' (' ~ state.state ~ ')'] %}
{% 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
@chrissi5120
Copy link

added an option to list unavailable or not. here my gist https://gist.github.com/andyblac/35b4164355dbef4f998f358353278236 based on your code, hope you don't mind

Screenshot 2023-07-15 at 14 48 43

Logger: homeassistant.helpers.template
Source: helpers/template.py:2209
First occurred: 18:20:15 (4 occurrences)
Last logged: 18:22:47

Template variable warning: 'sensors' is undefined when rendering '{{sensors}}'

you got any idea how I screw this up?

image

@andyblac
Copy link

hi, sure thats np, here is my latest version, it now adds send message as default you only have to add the device(s)
Screenshot 2023-10-19 at 09 49 13

@andyblac
Copy link

andyblac commented Dec 1, 2023

Hi,

just fixed this issue in my gist here, it stops the error in logs.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment