Automatische Batterie-Überwachung in Home Assistant: Benachrichtigungen bei niedrigen Batterieständen, Erinnerungen nach 2 Tagen und eine Dashboard-Integration

:battery: Home Assistant Batterie-Überwachung

Home Assistant bietet viele Möglichkeiten zur Überwachung von Geräten – doch was ist mit den Batterieständen?

Ich weiß, dass es dafür bereits Blueprints gibt, aber sie bieten nur begrenzte Anpassungsmöglichkeiten.

Mit diesem Projekt kannst du ganz einfach den Batteriestatus aller Geräte überwachen. Es erkennt:

:white_check_mark: Batterien, die unter 20% fallen und sendet eine Benachrichtigung.
:white_check_mark: Falls eine Batterie nach 2 Tagen nicht gewechselt wurde, erfolgt eine erneute Erinnerung.
:white_check_mark: Geräte, die keine Werte mehr senden (unknown oder unavailable).
:white_check_mark: Warnung, wenn ein Gerät nach dem Batteriewechsel keine neuen Werte sendet.

:hammer_and_wrench: Voraussetzungen

  • Home Assistant installiert
  • HACS (Home Assistant Community Store) muss installiert sein
  • Integration battery notes über HACS installieren
  • YAML-Modus für Automationen nutzen

:pushpin: :one: Sensoren & battery notes einrichten

  1. Gehe zu Einstellungen → Geräte & Dienste → Integrationen.
  2. Suche battery notes und installiere es über HACS.
  3. Sobald die Integration aktiv ist, werden battery_plus-Sensoren automatisch erstellt.
  4. Drücke den Button button.*_battery_replaced, um den Wechsel zu speichern.
  5. Der letzte Batteriewechsel wird in sensor.*_battery_last_replaced gespeichert.

:pushpin: :two: Sensor zur Erkennung niedriger Batterien einrichten

Füge den folgenden Code in deine configuration.yaml ein, um einen Template-Sensor zu erstellen, der die Anzahl der Batterien unter 20% zählt. Dieser Sensor zählt automatisch alle battery_plus-Sensoren, die unter 20% fallen, und kann für Automationen sowie im Dashboard genutzt werden.

template:
  - sensor:
      - name: "battery_low_count"
        state: >
          {% set batteries = states.sensor 
          | selectattr('entity_id', 'search', '_battery_plus$') 
          | selectattr('state', 'match', '^\d+(\.\d+)?$') 
          | map(attribute='state') 
          | map('float') 
          | select('lt', 20) 
          | list %}
          {{ batteries | length }}

:pushpin: :three: Automationen zur Batterie-Überwachung erstellen

Diese drei Automationen sorgen für eine vollständige Batterie-Überwachung:

In diesem Projekt gibt es drei Automationen, die zusammen für eine vollständige Batterie-Überwachung sorgen:

  1. Warnung bei Batterien unter 20% mit erneuter Erinnerung nach 2 Tagen
  2. Erkennung von Sensoren, die keine Werte mehr liefern (unknown oder unavailable)
  3. Warnung, wenn ein Gerät nach einem Batteriewechsel keine Werte sendet

:bulb: Hinweis: Ersetze notify.mobile_app_galaxy_s23 in den Automationen mit deinem eigenen Home Assistant Benachrichtigungsdienst. Dies findest du unter Einstellungen → Geräte & Dienste → Dienste.

:pushpin: So fügst du die Automationen in Home Assistant hinzu

  1. Wechsle in den YAML-Modus für Automationen:
  • Gehe zu Einstellungen → Automatisierungen.
  • Klicke auf Automationen und dann auf das + Symbol, um eine neue Automation zu erstellen.
  • Wähle Bearbeiten in YAML, um den YAML-Modus zu aktivieren.
  1. Füge den passenden YAML-Code in die neue Automation ein:
  • Öffne das YAML-Feld und kopiere den Inhalt der jeweiligen Datei (automation_battery_low.yaml, etc.).

  • Klicke auf Speichern.

  • Wiederhole dies für alle Automationen.

  • Automation 1: Batterie unter 20% → Benachrichtigung senden & erneute Erinnerung nach 2 Tagen

alias: "Batterie unter 20% Warnung mit Erinnerung"
mode: restart
trigger:
  # 1️⃣ Batterie fällt unter 20% (Erste Benachrichtigung)
  - platform: template
    value_template: >-
      {% set low_batteries = states.sensor 
      | selectattr('entity_id', 'search', '_battery_plus$') 
      | selectattr('state', 'match', '^\\d+$') 
      | selectattr('state', 'lt', '20') 
      | list %}
      {{ low_batteries | length > 0 }}

  # 2️⃣ Eine Batterie steigt wieder über 50% (zum Löschen der Notification)
  - platform: template
    value_template: >-
      {% set recovered_batteries = states.sensor 
      | selectattr('entity_id', 'search', '_battery_plus$') 
      | selectattr('state', 'match', '^\\d+$') 
      | selectattr('state', 'gt', '50') 
      | list %}
      {{ recovered_batteries | length > 0 }}

condition: []
action:
  - choose:
      # 📌 Fall 1: Eine oder mehrere Batterien sind unter 20% (Erzeuge Benachrichtigung)
      - conditions:
          - condition: template
            value_template: >-
              {% set batteries = states.sensor 
              | selectattr('entity_id', 'search', '_battery_plus$') 
              | selectattr('state', 'match', '^\\d+$') 
              | selectattr('state', 'lt', '20') 
              | list %}
              {{ batteries | length > 0 }}
        sequence:
          - variables:
              low_batteries: >-
                {% set batteries = states.sensor 
                | selectattr('entity_id', 'search', '_battery_plus$') 
                | selectattr('state', 'match', '^\\d+$') 
                | selectattr('state', 'lt', '20') 
                | map(attribute='name') 
                | list %}
                {{ batteries }}
          - service: persistent_notification.create
            data:
              title: "Batteriewarnung"
              message: >-
                {% if low_batteries | length == 1 %}
                  Die Batterie von {{ low_batteries[0] }} ist unter 20% gefallen!
                {% elif low_batteries | length > 1 %}
                  Die Batterien von {{ low_batteries | join(', ') }} sind unter 20% gefallen!
                {% endif %}
              notification_id: "battery_low"
          - service: notify.mobile_app_galaxy_s23
            data:
              title: "Batterie-Warnung"
              message: >-
                {% if low_batteries | length == 1 %}
                  Die Batterie von {{ low_batteries[0] }} ist unter 20% gefallen!
                {% elif low_batteries | length > 1 %}
                  Die Batterien von {{ low_batteries | join(', ') }} sind unter 20% gefallen!
                {% endif %}
              data:
                tag: "battery_low"
                sticky: true
          # 🕒 Warte 48 Stunden, dann prüfe erneut
          - delay: "48:00:00"
          - condition: template
            value_template: >-
              {% set still_low_batteries = states.sensor 
              | selectattr('entity_id', 'search', '_battery_plus$') 
              | selectattr('state', 'match', '^\\d+$') 
              | selectattr('state', 'lt', '20') 
              | list %}
              {{ still_low_batteries | length > 0 }}
          # 🔔 Erneute Erinnerung senden
          - service: notify.mobile_app_galaxy_s23
            data:
              title: "Erinnerung: Batterie weiterhin unter 20%"
              message: >-
                {% if still_low_batteries | length == 1 %}
                  Die Batterie von {{ still_low_batteries[0] }} ist weiterhin unter 20%! Bitte wechseln.
                {% elif still_low_batteries | length > 1 %}
                  Die Batterien von {{ still_low_batteries | join(', ') }} sind weiterhin unter 20%! Bitte wechseln.
                {% endif %}
              data:
                tag: "battery_low_reminder"
                sticky: true

      # 📌 Fall 2: Eine Batterie steigt wieder über 50% (Lösche die Benachrichtigung)
      - conditions:
          - condition: template
            value_template: >-
              {% set recovered_batteries = states.sensor 
              | selectattr('entity_id', 'search', '_battery_plus$') 
              | selectattr('state', 'match', '^\\d+$') 
              | selectattr('state', 'gt', '50') 
              | list %}
              {{ recovered_batteries | length > 0 }}
        sequence:
          - service: persistent_notification.dismiss
            data:
              notification_id: "battery_low"

Automation 2: Warnung, wenn ein Sensor unavailable oder unknown wird

alias: Batterie-Sensor nicht erreichbar
triggers:
  - value_template: >-
      {% set offline_batteries = states.sensor  | selectattr('entity_id',
      'search', '_battery_plus$')  | selectattr('state', 'in', ['unknown',
      'unavailable'])  | list %} {{ offline_batteries | length > 0 }}
    trigger: template
  - value_template: >-
      {% set recovered_batteries = states.sensor  | selectattr('entity_id',
      'search', '_battery_plus$')  | selectattr('state', 'match', '^\d+$')  |
      list %} {{ recovered_batteries | length > 0 }}
    trigger: template
conditions: []
actions:
  - choose:
      - conditions:
          - condition: template
            value_template: >-
              {% set batteries = states.sensor  | selectattr('entity_id',
              'search', '_battery_plus$')  | selectattr('state', 'in',
              ['unknown', 'unavailable'])  | list %} {{ batteries | length > 0
              }}
        sequence:
          - variables:
              offline_batteries: >-
                {% set batteries = states.sensor  | selectattr('entity_id',
                'search', '_battery_plus$')  | selectattr('state', 'in',
                ['unknown', 'unavailable'])  | map(attribute='name')  | list %}
                {{ batteries }}
          - data:
              title: Batterie-Sensor nicht erreichbar
              message: |
                {% if offline_batteries | length == 1 %}
                  Der Batterie-Sensor von {{ offline_batteries[0] }} ist nicht erreichbar!
                {% elif offline_batteries | length > 1 %}
                  Die Batterie-Sensoren von {{ offline_batteries | join(', ') }} sind nicht erreichbar!
                {% else %}
                  Fehler: Keine Batterie-Sensoren als "unavailable" erkannt.
                {% endif %}
              notification_id: battery_offline
            action: persistent_notification.create
          - data:
              title: Batterie-Sensor nicht erreichbar
              message: |
                {% if offline_batteries | length == 1 %}
                  Der Batterie-Sensor von {{ offline_batteries[0] }} ist nicht erreichbar!
                {% elif offline_batteries | length > 1 %}
                  Die Batterie-Sensoren von {{ offline_batteries | join(', ') }} sind nicht erreichbar!
                {% else %}
                  Fehler: Keine Batterie-Sensoren als "unavailable" erkannt.
                {% endif %}
              data:
                tag: battery_offline
                sticky: true
            action: notify.mobile_app_galaxy_s23
      - conditions:
          - condition: template
            value_template: >-
              {% set recovered_batteries = states.sensor  |
              selectattr('entity_id', 'search', '_battery_plus$')  |
              selectattr('state', 'match', '^\d+$')  | list %} {{
              recovered_batteries | length > 0 }}
        sequence:
          - data:
              notification_id: battery_offline
            action: persistent_notification.dismiss
mode: parallel

Automation 3: Erkennung, wenn ein Gerät nach einem Batteriewechsel keine Werte sendet

alias: "Warnung: Batterie-Sensor sendet nach Wechsel keine Daten"
description: ""
triggers:
  - entity_id: []
    from: []
    to: []
    for:
      minutes: 10
    trigger: state
conditions: []
actions:
  - variables:
      replaced_sensors: >-
        {% set replaced = states.sensor  | selectattr('entity_id', 'search',
        '_battery_last_replaced$')  | selectattr('state', 'ne', 'unknown')  |
        selectattr('state', 'ne', 'unavailable')  | list %} {{ replaced }}
  - choose:
      - conditions:
          - condition: template
            value_template: "{{ replaced_sensors | length > 0 }}"
        sequence:
          - variables:
              problem_sensors: >-
                {% set sensors = replaced_sensors  | map(attribute='entity_id') 
                | map('regex_replace', '_battery_last_replaced$',
                '_battery_plus')  | map('states')  | select('in', ['unknown',
                'unavailable'])  | list %} {{ problem_sensors }}
          - condition: template
            value_template: "{{ problem_sensors | length > 0 }}"
          - data:
              title: Batteriewechsel-Fehler
              message: |
                {% if problem_sensors | length == 1 %}
                  Der Sensor {{ problem_sensors[0] }} hat eine neue Batterie bekommen, sendet aber keine Werte!
                {% elif problem_sensors | length > 1 %}
                  Die Sensoren {{ problem_sensors | join(', ') }} haben neue Batterien, senden aber keine Werte!
                {% else %}
                  Fehler: Keine fehlerhaften Sensoren erkannt.
                {% endif %}
              notification_id: battery_not_reporting
            action: persistent_notification.create
          - data:
              title: Batteriewechsel-Fehler
              message: |
                {% if problem_sensors | length == 1 %}
                  Der Sensor {{ problem_sensors[0] }} hat eine neue Batterie bekommen, sendet aber keine Werte!
                {% elif problem_sensors | length > 1 %}
                  Die Sensoren {{ problem_sensors | join(', ') }} haben neue Batterien, senden aber keine Werte!
                {% else %}
                  Fehler: Keine fehlerhaften Sensoren erkannt.
                {% endif %}
              data:
                tag: battery_not_reporting
                sticky: true
            action: notify.mobile_app_galaxy_s23
mode: parallel

:pushpin: :four: Komplette Batterie-Übersicht im Dashboard erstellen

Möchtest du die Vorlagen 1:1 übernehmen, sind dafür aus dem HACS weitere Installationen notwendig!

  • Mushroom
  • card-mod

Damit du die Batterie-Überwachung optimal visualisieren kannst, gibt es drei verschiedene Anzeigeoptionen:

:white_check_mark: Die Gesamtanzahl der Batterien unter 20%
:white_check_mark: Eine Liste aller Batterien unter 20%
:white_check_mark: Eine grafische Darstellung des Batteriestatus wie auf dem Smartphone als Badge :white_check_mark: Die Gesamtanzahl der Batterien unter 20% :white_check_mark: Eine Liste aller Batterien unter 20% :white_check_mark: Eine grafische Darstellung des Batteriestatus wie auf dem Smartphone als Batch

:pushpin: Schritte zur Einrichtung

Damit du die Batterie-Überwachung optimal visualisieren kannst, zeige ich dir drei verschiedenen Anzeigeoptionen. Diese zeigen dir: :white_check_mark: Die Gesamtanzahl der Batterien unter 20% :white_check_mark: Eine Liste aller Batterien unter 20% :white_check_mark: Eine grafische Darstellung des Batteriestatus wie auf dem Smartphone als Batch

:bar_chart: :one: Tile Card: Zeigt die Anzahl der Batterien unter 20%

type: vertical-stack
cards:
  - type: tile
    entity: sensor.battery_low_count
    name: Batterien unter 20%
    icon: mdi:battery-low
    grid_options:
      columns: 6  

:clipboard: :two: Auto-Entities Karte: Zeigt eine Liste aller Batterien unter 20%

type: custom:mushroom-template-card
entity: sensor.battery_low_count
icon: mdi:battery-low
layout: vertical
alignment: right
fill_container: false
badge_icon: |-
  {% set count = states(entity) | int(0) %}
  {{ 'mdi:numeric-' ~ count if count < 9 else 'mdi:numeric-9-plus' }}
icon_color: blue
badge_color: |-
  {% if states(entity) | int > 0 %}
    red
  {% else %}
    green
  {% endif %}
card_mod:
  style: |
    ha-card { background: transparent;
      --border-style: none;
      --border: 0px;
      --ha-card-header-font-size: 20px;
      --bar-card-border-radius: 51px;
      --ha-card-border-width: 0px;
    }
    mushroom-badge-icon {
      --badge-icon-size: 27px;
      --badge-size: 20px;
    }

:bar_chart: :three: Mushroom Template Card: Kompakte Anzeige mit Icon

type: custom:mushroom-template-card
entity: sensor.battery_low_count
icon: mdi:battery-low
layout: vertical
fill_container: false
badge_icon: |-
  {% set count = states(entity) | int(0) %}
  {{ 'mdi:numeric-' ~ count if count < 9 else 'mdi:numeric-9-plus' }}
icon_color: blue
badge_color: |-
  {% if states(entity) | int > 0 %}
    red
  {% else %}
    green
  {% endif %}
tap_action:
  action: more-info
card_mod:
  style: |
    ha-card { background: transparent;
      --border-style: none;
      --border: 0px;
      --ha-card-header-font-size: 20px;
      --bar-card-border-radius: 51px;
      --ha-card-border-width: 0px;
    }
    mushroom-badge-icon {
      --badge-icon-size: 27px;
      --badge-size: 20px;
    }

Diese drei Methoden bieten verschiedene Möglichkeiten, die Batterie-Überwachung direkt in dein Home Assistant Dashboard zu integrieren.

:dart: Fazit: Nie wieder leere Batterien verpassen!

Mit diesem Projekt hast du eine automatische, wartungsfreie Batterie-Überwachung in Home Assistant.
:small_blue_diamond: Sofortige Benachrichtigung, wenn eine Batterie schwach wird.
:small_blue_diamond: Erneute Erinnerung nach 2 Tagen, falls du den Wechsel vergisst.
:small_blue_diamond: Erkennung von Geräten, die keine Werte mehr senden oder nach einem Wechsel nicht reagieren.

:loudspeaker: Falls du Fragen hast oder Verbesserungsvorschläge, lass es uns wissen! Erstelle gerne einen Kommentar, wie du die Lösung findest :rocket:

7 „Gefällt mir“

Ich habe deine Vorlagen bei mir zum testen eingefügt.
Leider stimmt irgend etwas nicht. Folgende Fehlermeldung wird ausgegeben:

Invalid config for 'template' at configuration.yaml, line 213: invalid template (TemplateSyntaxError: expected token ',', got 'state') for dictionary value 'sensor->19->state', got "{% set batteries = states.sensor | selectattr('entity_id', 'search', '_battery_plus) | selectattr('state', 'match', '^\\\\d+) | map(attribute='state') | map('int') | select('lt', 20) | list %} {{ batteries | length }}"

In der configuration.yaml habe ich bei meinen templates eingefügt:

    - name: "battery_low_count"
      state: >-
         {% set batteries = states.sensor 
         | selectattr('entity_id', 'search', '_battery_plus) 
         | selectattr('state', 'match', '^\\d+) 
         | map(attribute='state') 
         | map('int') 
         | select('lt', 20) 
         | list %}
         {{ batteries | length }}

In Zeile 213 steht “state: >-”. Ich weiß jetzt nicht, wie ich mit der Fehlersuche beginnen soll. Kannst du helfen?

da war tatsächlich ein Fehler von mir drin. ich habe diesen korrigiert. teste mal bitte

      - name: "battery_low_count"
        state: >
          {% set batteries = states.sensor 
          | selectattr('entity_id', 'search', '_battery_plus$') 
          | selectattr('state', 'match', '^\d+(\.\d+)?$') 
          | map(attribute='state') 
          | map('float') 
          | select('lt', 20) 
          | list %}
          {{ batteries | length }}

Jetzt kommt zumindest keine Fehlermeldung.
Danke für die schnelle Rückmeldung.

Vielleicht solltest du bei den Vorausetzungen hinzufügen, das Mushroom und card-mod benötigt wird.

Beim anlegen der Karte gibt es diese Meldung:

At path: alignment -- Expected a value of type `never`, but received: `"right"`

Bekommt man weg, wenn man die Zeile mit

alignment: right

entfernt.

Bei Klick auf die Karte kommt folgende Meldung:

Aktion sensor.turn_off nicht gefunden

Ich habe deswegen das hier noch eingefügt:

tap_action:
  action: more-info

:crayon:by HarryP: Zusammenführung Doppelpost (bitte “bearbeiten” Funktion nutzen)

Danke für den Hinweis! Die beiden Punkte hatte ich gar nicht erwähnt – hab’s jetzt ergänzt. Manchmal sind Dinge so selbstverständlich, dass man gar nicht mehr daran denkt. :blush:

@Dajwitt
Hi.
Sehr schöne und einfache Anleitung.
Aber wie ist es mit den ganzen HomematicIP Geräten? Die kennen ja keine % als Batteriestand, sondern nur on / off. Das würde mir persönlich noch fehlen. :slightly_smiling_face:

Es gibt eine Möglichkeit, die Batteriespannung umzurechnen. Ich habe keine HomaticIP Geräte und habe mich daher nicht damit beschäftigt. Aber hier findest du glaube ich was du suchst. HomematicIP zwingen die Batteriewerte in Prozent anzuzeigen?

Ja davon habe ich schon gelesen. Aber wenn ich das richtig verstehe, muss ich für jedes Gerät ein Helfer template erstellen. Ich weiß nicht, ob ich darauf Lust habe. :joy:

Daher habe ich eine einfache Automation erstellt, die Meldung macht, wenn der Batteriezustand niedrig / on ist. Ich denke mal, ich werde das einfach zusätzlich in deine Automation mit einbauen.

Hi, colle Sache und tolle Beschreibung!
Kriege es aber nicht fehlerfrei zum Laufen.
Die Entität “sensor.battery_low_count” (wird im Dashboard verwendet) gibt es bei mir nicht.
Und in der Mushroom Card erhalte ich einen Fehler, siehe Anhang
Was mache ich falsch?


Hey, hast du den Sensor in der configuration.yaml angelegt? Den musst du dort anlegen unter template sensoren

template:
  - sensor:
  
      - name: "battery_low_count"
        state: >
          {% set batteries = states.sensor 
          | selectattr('entity_id', 'search', '_battery_plus$') 
          | selectattr('state', 'match', '^\d+(\.\d+)?$') 
          | map(attribute='state') 
          | map('float') 
          | select('lt', 20) 
          | list %}
          {{ batteries | length }}

Bitte keine Bilder!

Wenn Du Code- oder Logzeilen hier posten möchtest, dann auf
image
klicken, dann erscheint
image
dort kopierst Du dann mit copy/paste die Zeilen rein.
Hintergrund:
Damit können die User hier auch die Formatierung/Einrückung (bei yaml ganz wichtig) überprüfen

Ja, klar, hatte ich missverstanden. Jetzt geht es…
Danke!!!

Ich habe auch viele HmIP Geräte, da hat sich mit einem der letzten Updates etwas geändert.
Es gibt jetzt die % Werte aus der HomaticIP local Integration. Diese sind nur deaktiviert. mann muss bei allen HmIP Geräten den Batteriespannungspegel aktivieren dann werden sie auch von batttery notes automatisch erkannt.

Hey vielen Dank für die Automation! Die ist mal schön flexibel, dass man sich auch selbst die Geräte einstellen kann.
Was mir auch am besten gefällt, ist die Sache, dass man die Batterien sehen kann. Gerade im Bezug zu den guten alten CR…So muss man nicht immer schauen, welche es sind, sondern sieht auch direkt, ah die braucht man, habe ich die 2477er noch? Nein, aber die 2450er… WARUM nutzt ihr nicht dasselben?! :rofl:

Mir ist jetzt eine Sache bei meinem einem Sensor im Waschkeller aufgefallen. Der verliert über Nacht immer mal den Kontakt und wird brav von deiner Benachrichtigung gemeldet, dass nicht verfügbar (bzw. wurde seit der Shelly da als Bluetooth Empfänger Assistiert).
Die Dauerhaften Benachrichtigungen werden in meinem Fall nicht gelöscht. Auch wenn das Gerät längst wieder verfügbar ist, steht die Dauerhafte in Home Assistant noch. Wenn ich den Code richtig verstanden habe, sollte das doch gelöscht werden? :thinking: