Alerter sur Batterie Faible

Hello

Je cherche à faire une automatisation pour être notifié (via pushbullet par exemple) pour savoir quand un de mes capteurs voit sa batterie passer sous le seuil des 3.7v.

J’ai créé cette automatisation avec l’aide de @Clemalex :

- id: '1605213081562'
  alias: AlerteBatterie
  description: 'Alerte Batterie Faible'
  mode: parallel 
  max: 5
      trigger:
    - platform: numeric_state
      entity_id: sensor.cellier_batterie
      below: '3.7'
    - platform: numeric_state
      entity_id: sensor.chambre_1_batterie
      below: '3.7'
    - platform: numeric_state
      entity_id: sensor.chambre_2_batterie
      below: '3.7'
    - platform: numeric_state
      entity_id: sensor.garage_batterie
      below: '3.7'
    - platform: numeric_state
      entity_id: sensor.garage_extension_batterie
      below: '3.7'
    condition: []
    action:
    - data_template:
        message: Le niveau est à {{ states.sensor.garage_batterie.state }} volt
        title: Batterie Faible Garage
    service: notify.mypushbullet

Je n’arrive pas à trouver le code (dans la partie data_template) pour faire en sorte de n’alerter qu’avec un message contenant le ou les capteurs qui sont passés sous le seuil de 3.7v.

Si jamais vous avez une idée?

Merci d’avance

Benj

1 « J'aime »

Je penses avoir trouvé la solution (on doit pouvoir faire encore plus simple avec une boucle for):

- id: '1605213081562'
  alias: AlerteBatterie
  description: 'Alerte Batterie Faible'
  mode: parallel 
  max: 5
  trigger:
  - platform: numeric_state
    entity_id: sensor.cellier_batterie
    below: '3.7'
  - platform: numeric_state
    entity_id: sensor.chambre_1_batterie
    below: '3.7'
  - platform: numeric_state
    entity_id: sensor.chambre_2_batterie
    below: '3.7'
  - platform: numeric_state
    entity_id: sensor.garage_batterie
    below: '3.7'
  - platform: numeric_state
    entity_id: sensor.garage_extension_batterie
    below: '3.7'
  condition: []
  action:
  - data_template:
      message: "Batterie faible {% if states('sensor.cellier_batterie') | float < 3.7  %}Cellier {{ states.sensor.cellier_batterie.state }}V,{% endif %}
                {% if states('sensor.cellier_batterie') | float < 3.7  %}Chambre 1{{ states.sensor.chambre_1_batterie.state }}V,{% endif %}
                {% if states('sensor.cellier_batterie') | float < 3.7  %}Chambre 2{{ states.sensor.chambre_2_batterie.state }}V,{% endif %}
                {% if states('sensor.cellier_batterie') | float < 3.7  %}Garage {{ states.sensor.garage_batterie.state }}V,{% endif %}
                {% if states('sensor.cellier_batterie') | float < 3.7  %}Garage extension {{ states.sensor.garage_extension_batterie.state }}V{% endif %}"
      title: Batterie Faible
    service: notify.mypushbullet

Cependant je suis notifié 3 fois, je ne sais pas pourquoi encore et il faut que je rajoute un délai pour n’avoir l’alerte qu’une fois par jour.

Voici comment je ferais :

automation:
  - id: 'alerte_batterie_faible'
    alias: alerte_batterie_faible
    description: 'Alerte Batterie Faible'
    mode: parallel 
    max: 3
    trigger:
    - platform: numeric_state
      entity_id: input_number.batterie_01
      below: '1.5'
    - platform: numeric_state
      entity_id: input_number.batterie_02
      below: '2.5'
    - platform: numeric_state
      entity_id: input_number.batterie_03
      below: '3.5'
    condition: []
    action:
      - service: persistent_notification.create
        data:
          message: "![image](/local/images/hacf/low_battery_3.png) \n\n Le niveau de batterie de **{{trigger.to_state.name}}** est de **{{ trigger.to_state.state }}V**"
          title: "Batterie Faible"
          notification_id: "{{ (range(1, 9999)|random) }}"

Construit à partir de la documentation ici et ici

Ce qui donne dans la zone de notification de Lovelace :

A adapter avec ton automatisation :

  - id: '1605213081562'
    alias: AlerteBatterie
    description: 'Alerte Batterie Faible'
    mode: parallel 
    max: 5
    trigger:
    - platform: numeric_state
      entity_id: sensor.cellier_batterie
      below: '3.7'
    - platform: numeric_state
      entity_id: sensor.chambre_1_batterie
      below: '3.7'
    - platform: numeric_state
      entity_id: sensor.chambre_2_batterie
      below: '3.7'
    - platform: numeric_state
      entity_id: sensor.garage_batterie
      below: '3.7'
    - platform: numeric_state
      entity_id: sensor.garage_extension_batterie
      below: '3.7'
    condition: []
    action:
    - data:
        message: "Le niveau de batterie de **{{trigger.to_state.name}}** est de **{{ trigger.to_state.state }}V**"
        title: Batterie Faible
      service: notify.mypushbullet

Parce que tu devrais utiliser des elif (faire une recherche sur le forum pour l’utilisation).

Tu devrais être notifié que sur un déclencheur et donc un dépassement de seuil de l’un de test capteurs. Si tu es notifié plusieurs fois pour le même capteur, c’est que le celui ci oscille et donc oui, il faut rajouter des conditions.

Merci pour l’exemple je ne connaissais pas la zone de notif de Lovelace xD

Je n’ai pas compris pourquoi les elif seraient mieux ?

Ok pour le bagotage, je vais regarder les conditions de delai

de la lecture

mais je te conseille vivement de prendre mon exemple…en exemple :sweat_smile:

Oui je l’ai rarement vu sur le forum, donc j’ai mis l’exemple exprès pour le référencement.

Une autre notification dans la zone de notification :

1 « J'aime »

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 :