Alerter sur Batterie Faible

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.*(…|…)

j’ai modifié le trigger afin de recevoir rapidement le retour

trigger:
  - platform: time
    at: "15:31"

et changé la notification :

action:
  - service: notify.telegram_zed

Pour le reste j’ai laissé le code en l’état mais je n’ai pas recu de retour.

J’ai executé manuellement l’automation et je recois le message suivant


je ne comprends pas ou ca bloque

As tu des sensor avec des états qui commence par sensor.xxxx_battery ou sensor.xxx_battery_level car la réponse c’est qu’il ne trouve rien et que par conséquent il cherchent a afficher une valeur par défaut mais comme il n’en a pas dans mon code alors il affiche erreur veuillez indiquer une valeur par défaut.

oui plein de sensor.**battery

et 2 battery_level

Change regex_match("sensor.*_(battery|battery

Pour :
regex_match("sensor.*(battery|battery

j’ai fait la modif mais le resultat reste le meme

J’ai ajouter sinon false, essai de ton côté @zed

{% 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
              {% else %}
                false
              {%- endif -%}
          {%- endif -%}
        {%- endfor %}

Et pour la notification pareil:

service: notify.notify
data:
  message: |-
    {% set default_message = "Aucune batterie faible détectée." %}
    {% 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 %}
    {% else %}
      {{ default_message }}
    {% endfor %}

Mais pour moi c’est parce-que tes sensor s’écrivent :
Sensor. *_ * _* _ *

Merci Felix pour ton aide.

Le resultat est le meme, je ne comprend pas

Je pense avoir trouver pour tes capteurs et pour tout nommage de capteur.

{% 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 pour l’action notification:

service: notify.notify
data:
  message: >-
    {% set default_message = "Aucune batterie faible détectée." %}
    {% set battery_alerts = namespace(sensor_list=[]) %}
    {% 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 %}
        {% set battery_alerts.sensor_list = battery_alerts.sensor_list + [state.name ~ ': ' ~ state.state ~ '%'] %}
    {% endfor %}
    {% if battery_alerts.sensor_list %}
      ⚠️ <b>Alerte ! Batteries faibles ⚡ :</b>
      {{ "\n".join(battery_alerts.sensor_list) }}
    {% else %}
      {{ default_message }}
    {% endif %}

J’ai apporté des amélioration pour afficher les batterie sous forme de liste dans la notification

Merci pour ton aide Felix,

L’execution amene toujours un message d’erreur

ca rend fou, je ne comprend pas pourquoi. Le message d’erreur est pas suffisement clair pour moi :-/

@zed
J’ai ajuster la valeur default, essai de la copier coller dans outils de développement → modèle

PS : cela est régler pour afficher toutes les batteries inférieur a 100% a régler par toi même ensuite. :wink:

{% set default_message = "Aucune batterie faible détectée." %}
{% set battery_alerts = namespace(sensor_list=[]) %}

{% 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 < 100 %}
    {% set battery_alerts.sensor_list = battery_alerts.sensor_list + [state.name ~ ': ' ~ state.state ~ '%'] %}
{% endfor %}

{% if battery_alerts.sensor_list %}
  ⚠️ <b>Alerte ! Batteries faibles ⚡ :</b>
  {{ "\n".join(battery_alerts.sensor_list) }}
{% else %}
  {{ default_message }}
{% endif %}

Merci Felix,

Le résultat est le meme :-/

Après echange par message avec @zed

Voici le code corrigé :

{% set default_message = "Aucune batterie faible détectée." %}
{% set battery_alerts = namespace(sensor_list=[]) %}

{% 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) %}
    {% set battery_level = state.state | int(0) %}
    {% if battery_level < 100 %}
      {% set battery_alerts.sensor_list = battery_alerts.sensor_list + [state.name ~ ': ' ~ battery_level ~ '%'] %}
    {% endif %}
{% endfor %}

{% if battery_alerts.sensor_list %}
  ⚠️ <b>Alerte ! Batteries faibles ⚡ :</b>
  {{ "\n".join(battery_alerts.sensor_list) }}
{% else %}
  {{ default_message }}
{% endif %}

Un grand merci pour ton aide Felix!

je partage le code complet si ca peut en aider d’autre sur le forum

alias: "[NOTIFY] Niveau de Batterie"
description: ""
trigger:
  - platform: time_pattern
    hours: /1
condition:
  - condition: template
    value_template: >
      {% 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)  -%}
         {% set battery_level = state.state | int(0) %}
         {%- if battery_level | int < 21 %}
             true
         {%- endif -%}
      {%- endfor %}
action:
  - service: notify.telegram_zed
    data:
      message: >
        {% set default_message = "Aucune batterie faible détectée." %} {% set
        battery_alerts = namespace(sensor_list=[]) %}

        {% 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) %}
            {% set battery_level = state.state | int(0) %}
            {% if battery_level < 21 %}
              {% set battery_alerts.sensor_list = battery_alerts.sensor_list + [state.name ~ ': ' ~ battery_level ~ '%'] %}
            {% endif %}
        {% endfor %}

        {% if battery_alerts.sensor_list %}
           ⚠️ *Alerte ! Batteries faibles:*⚡ 
           {{ "\n".join(battery_alerts.sensor_list | sort) }}
        {% else %}
           {{ default_message }}
        {% endif %}
mode: single
2 « J'aime »