Alerter sur Batterie Faible

en utilisant trigger.to_state.name ? Par contre cela veut dire que je vais avoir une notification par sensor ? Bon ca me gene pas c’est juste pour savoir :slight_smile:

oui, j’ai répondu à ta question.

Oui.

Mais si tu veux garder ton code tu peux, mais c’est plus un message de synthèse à mon sens.

Et je ferais plus une autre automatisation qui vérifierai un booléen (mis à vrai par l’automation que je t’ai fournie) tous les soirs à 21H par exemple avec comme message, tous les capteurs dont la batterie est vide.

Il faut essayer de ne pas tout mélanger et de faire une automatisation par fonction.

Ce n’est que mon avis.

Je comprends, merci du conseil :slight_smile:

1 « J'aime »

Merci pour le conseil ! :slight_smile:

1 « J'aime »

J’ai édité le titre car trop d’entête tué l’entête.

Pour ceux qui souhaiteraient passer par un template plus générique (sans nommer chaque batterie à surveiller)

ce qui donne pour moi

automation:
# # https://community.home-assistant.io/t/battery-alert-automation-stuck-with-syntax/141216
  - alias: 'Battery alert'
    trigger:
    - platform: time
      at: '07:03:00'
    condition:
    - condition: template
      value_template: >-
        {%- set threshold = 40 -%}
        {%- for item in states 
            if (item.attributes.battery_level is defined and 
                item.attributes.battery_level | int < threshold) or
                ("battery" in item.name | lower and 
                 ((item.state | int < threshold and item.state|int != 0) or 
                   item.state | lower == "low" or 
                   item.state | lower == "unknown"))-%}
            {%- if loop.first -%} {{ true }} {%- endif -%}
        {%- endfor -%}
    action:
    - service: notify.HA
      data_template:
        title: '{{ as_timestamp(now()) | timestamp_custom("%d-%m-%Y, %H:%M:%S",True) }}'
        message: >-
          {%- set threshold = 40 -%}
          Les appareils suivants ont un niveau de batterie faible :
          {%- for item in states -%}
            {% if item.attributes.battery_level is defined and 
                  item.attributes.battery_level | int < threshold %}
               {{ item.name }} ({{ item.attributes.battery_level }}),
            {% elif "battery" in item.name | lower and 
                     ((item.state | int < threshold and item.state|int != 0) or 
                       item.state | lower == "low" or 
                       item.state | lower == "unknown") %}
               {{ item.name }} ({{ item.state }}),
            {%- endif -%}
          {%- endfor -%}
2 « J'aime »

Merci du partage :+1:

Tu pourrais en plus utiliser un input_datetime pour contrôler le déclencheur et un input_number pour contrôler le seuil d’alerte :wink:

:information_source: Il faut tout de même préciser que l’alerte concernant ton automatisation se déclenche à heure fixe et non pas dès que le seuil est dépassé par un capteur, à la différence du premier post. Certaines personnes préfèreront être prévenu tout de suite, d’autre à heure fixe

on est d’accord, c’est mon utilisation, pour connaitre les périphériques qui risquent me lâcher dans la journée,
mais c’était surtout pour l’exemple de template, car cela peut très vite devenir difficile à maintenir une liste exhaustive de périphériques sur batterie

1 « J'aime »

@papoo
c’est clair que le template vaut le détour :heart_eyes:

Après, pour les autres, il faut bien construire l’exemple donné avec ses propres appareils.
Car pour prendre un exemple, j’ai des appareils qui ont pour attributs battery et non battery_level et donc, ceux si ne ressortiront pas sans ajouter la vérification de cet attribut dans le code.

Si tel est votre cas, n’hésitez pas à poster ici :+1:

Pour donner un peu de contexte, si mes sondes de T°/H% ont leur batterie qui descendent sous le seuil des 3,7V je ne peux plus faire confiance aux mesures réalisées ce qui est « dangereux/peut être couteux » si ces mesures servent à asservir des fonctionnements (gestion de chauffage/clim…etc). C’est pour cela que je préfère être notifié immédiatement.
Pour ce qui est de la soluce de @Clemalex, elle me va bien, mieux vaut faire qlqchose de générique et simple plutôt (donc facile à maintenir) que de partir sur un code complexe, à devoir changer des qu’il faut ajouter/supprimer une sonde.

1 « J'aime »

On peux très bien adapter le code de @papoo pour être notifié instantanément.

Il suffit de passer par un template sensor, qui utilise le code de la condition en remplaçant {{true}} par {{loop.length}}.

Ensuite, utiliser cette nouvelle entité comme déclencheur avec la plateforme state avec comme condition que cette même entité ne soit pas à 0. Pour la partie action, aucun changement…
c’est juste pour ceux qui voudrait les deux

le template est générique justement, lister les sondes une à une revient à oublier d’en lister lorsque l’on en ajoute

J’avais trouver une automation similaire à celle de papoo qui comme cette dernière oblige pas à lister tous les devices à surveiller :

automation:
- alias: battery_alert
  trigger:
    - platform: state
      entity_id: input_boolean.testlvlbaterie 
      to: 'on'
    - platform: time
      at: '18:00:00'
  condition:
    - condition: template
      value_template: >
          {% macro battery_level() %}
          {%- set threshold = 30 -%}
          {% set domains = ['light', 'switch', 'sensor', 'zwave', 'lock'] %}
          {% for domain in domains -%}
          {% for item in states[domain] if ((item.attributes.battery_level is defined and item.attributes['battery_level'] | int < threshold) or ("battery" in item.name | lower and ((item.state | int < threshold and item.state|int != 0) or item.state | lower == "low" or item.state | lower == "unknown"))) -%}
          {% if (item.attributes.battery_level is defined and item.attributes['battery_level'] | int < threshold) -%}
          {{ item.name }} ({{ item.attributes['battery_level'] }}){%- if not loop.last %}, {% endif -%}{% endif -%}
          {% if "battery" in item.name | lower and ((item.state | int < threshold and item.state|int != 0) or item.state | lower == "low" or item.state | lower == "unknown") -%}
          {{ item.name }} ({{ item.state }}){% if not loop.last %}, {%- endif %} {% endif -%}
          {% endfor %}
          {%- endfor %}
          {% endmacro %}
          {{ battery_level() |trim != "" }}
  action:
#   - service: persistent_notification.create
#     data_template:
#       title: "Low Battery levels"
#       notification_id: low-battery-alert
#       message: >
#         {% macro battery_level() %}
#         {%- set threshold = 40 -%}
#         {% set domains = ['light', 'switch', 'sensor', 'zwave', 'lock'] %}
#         {% for domain in domains -%}
#         {% for item in states[domain] if ((item.attributes.battery_level is defined and item.attributes['battery_level'] | int < threshold) or ("battery" in item.name | lower and ((item.state | int < threshold and item.state|int != 0) or item.state | lower == "low" or item.state | lower == "unknown"))) -%}
#         {% if (item.attributes.battery_level is defined and item.attributes['battery_level'] | int < threshold) -%}
#         {{ item.name }} ({{ item.attributes['battery_level'] }}){%- if not loop.last %}, {% endif -%}{% endif -%}
#         {% if "battery" in item.name | lower and ((item.state | int < threshold and item.state|int != 0) or item.state | lower == "low" or item.state | lower == "unknown") -%}
#         {{ item.name }} ({{ item.state }}){% if not loop.last %}, {%- endif %} {% endif -%}
#         {% endfor %}
#         {%- endfor %}
#         {% endmacro %}
#         {{ battery_level() }}
    - service: notify.iosdevice
      data_template:
        title: "Batterie faible !"
        message: >
          {% macro battery_level() %}
          {%- set threshold = 30 -%}
          {% set domains = ['light', 'switch', 'sensor', 'zwave', 'lock'] %}
          {% for domain in domains -%}
          {% for item in states[domain] if ((item.attributes.battery_level is defined and item.attributes['battery_level'] | int < threshold) or ("battery" in item.name | lower and ((item.state | int < threshold and item.state|int != 0) or item.state | lower == "low" or item.state | lower == "unknown"))) -%}
          {% if (item.attributes.battery_level is defined and item.attributes['battery_level'] | int < threshold) -%}
          {{ item.name }} ({{ item.attributes['battery_level'] }}){%- if not loop.last %}, {% endif -%}{% endif -%}
          {% if "battery" in item.name | lower and ((item.state | int < threshold and item.state|int != 0) or item.state | lower == "low" or item.state | lower == "unknown") -%}
          {{ item.name }} ({{ item.state }}){% if not loop.last %}, {%- endif %} {% endif -%}
          {% endfor %}
          {%- endfor %}
          {% endmacro %}
          {{ battery_level() }}
        data:
          push:
            thread-id: "alerte_temp-group"

Merci pour le partage :+1:

La source est ici :

Et la dernière version du code est ici :

Bonjour à tous,

Le sujet est intéressant et je commence a avoir pas mal de devices sur pile et encore d’autre a venir. le fait de créer une automatisation qui qui remonte tous les devices qui comporte des batterie sans avoir a les lister individuelement me parait essentiel. l’idee est de recevoir l’information via telegram car je ne suis pas toujours devant mon dashborad. Vu que niveau code je suis pas au top, j’ai tenté de reprendre de YAML disponible dans le sujet pour les modifier mais sans succes. Je me suis alors dit que chat GPT pourrait peut etre m’apporter de l’aide. j’ai généré du code et je l’ai insérer mais je n’arrive pas a l’enregistrer. voici le code :

  alias: Battery Level Monitor
  description: ""
  trigger:
    - platform: state
      entity_id: sensor.*
      attribute: battery_level
  condition:
    - condition: template
      value_template: >-
        {{ states.sensor|selectattr("attributes.device_class", "eq",
        "battery")|selectattr("attributes.friendly_name", "contains",
        "worxlandroid-battery")|selectattr("attributes.battery_level", "lt",
        20)|list|count > 0 }}
  action:
    - service: notify.telegram
      data:
        message: >-
          Attention! La batterie de {{
          states.sensor|selectattr("attributes.device_class", "eq",
          "battery")|selectattr("attributes.friendly_name", "contains",
          "worxlandroid-battery")|selectattr("attributes.battery_level", "lt",
          20)|map(attribute="name")|join(", ") }} est faible.
  mode: single

mais quand je rentre dans l’outil de devellopement « model » j’ai le message suivant:
1

et dans l’automatisation je ne peux pas l’enregistrer :

je debut en code et je ne maitrise pas encore les subtilités du Yaml. votre aide me sera préciseuse/

Merci d’avance

je partage mon template generic avec personnalisation des inclusion et exclusion.

Inclusion :
Regex_match #va rechercher tout les sensor qui comporte le mot "battery et battery_leve
regex_match("sensor.*_(battery|battery_level)", ignorecase=False)"
Exclusion :
and not state.entity_id | regex_match("sensor.*(power|runtime|charge|state|temperature|health|browser|cycle|redmi_note)", ignorecase=false) 
                   -%}
alias: "[NOTIFY] Niveau de Batterie"
description: ""
trigger:
  - platform: time_pattern
    hours: /1
condition:
  - condition: template
    value_template: |2-
              {% for state in states.sensor -%}
                {%- if state.entity_id | regex_match("sensor.*_(battery|battery_level)", ignorecase=False)
                  and not state.entity_id | regex_match("sensor.*(power|runtime|charge|state|temperature|health|browser|cycle|redmi_note)", ignorecase=false) 
                   -%}
                    {%- if state.state | int < 20 %}
                      true
                    {%- endif -%}
                {%- endif -%}
              {%- endfor %}
action:
  - service: notify.notify
    data:
      message: |-
        {% for state in states.sensor %}
          {% if state.entity_id | regex_match("sensor.*_(battery|battery_level)", ignorecase=False)
            and not state.entity_id | regex_match("sensor.*(power|runtime|charge|state|temperature|health|browser|cycle|redmi_note)", ignorecase=false) 
            and state.state | int < 20 %}
            ⚠️ <b>Alerte ! Batterie faible {{ state.name }} ({{ state.state }}%)</b> ⚡.
          {% endif %}
        {% endfor %}
mode: single

Merci Felix pour ton retour

comment intégre tu les 2 premiers code Inclusion et Exclusion?

@zed les 2 codes sont déjà intégrer dans l’automatisation tu as juste à remplacer tes inclusions ou exclusion.

power|runtime|charge|state|temperature|health|browser|cycle|redmi_note

Si tu ne souhaite pas exclure les batterie température tu supprimes ou remplace par autres choses.

ok je comprend la partie inclusion et exclusion, ton exemple correspond a mon besoin de ne remonter que la partie batterie des états de capteur

quand je copie tel quel ton code j’ai le message suivant :


il y a un truc qui me manque, dois je créer une entrée? comment est alimenté la valeur state.entity_id

Je vais decouper le code :
Voici la condition que j’tulise :

    {% for state in states.sensor -%}
          {%- if state.entity_id | regex_match("sensor.*_(battery|battery_level)", ignorecase=False)
            and not state.entity_id | regex_match("sensor.*(power|runtime|charge|state|temperature|health|browser|cycle|redmi_note)", ignorecase=false) 
             -%}
              {%- if state.state | int < 20 %}
                true
              {%- endif -%}
          {%- endif -%}
        {%- endfor %}

Et voici l’action notification:

service: notify.notify
data:
  message: |-
    {% for state in states.sensor %}
      {% if state.entity_id | regex_match("sensor.*_(battery|battery_level)", ignorecase=False)
        and not state.entity_id | regex_match("sensor.*(power|runtime|charge|state|temperature|health|browser|cycle|redmi_note)", ignorecase=false) 
        and state.state | int < 20 %}
        ⚠️ <b>Alerte ! Batterie faible {{ state.name }} ({{ state.state }}%)</b> ⚡.
      {% endif %}
    {% endfor %}

Pour ce qui est de l’entity.id c’est le resultat de la recherche regex_match … sensor.*(…|…)