Remonter les capteurs avec moins de 15% de batterie

Mon problème

Bonjour à tous,

Je tente d’ajouter un sensor pour détecter les appareils inférieur à 15% de batterie.
Pour cela j’utilise la syntaxe jinja2.

J’ai créé un group avec mes sensor :

Thermo_batterie: 
  entities:
    - sensor.capteur_temp_salon_battery
    - sensor.capteur_temp_bureau_francois_battery
    - sensor.capteur_temp_sdb_battery
    - sensor.capteur_temp_chambre_battery
    - sensor.capteur_temp_bureau_elsa_battery
    - sensor.capteur_temp_buanderie_battery```

Exemple d’un sensor :

Mon groupe :

Puis une fonction jinja2 :
Code :

    batterie_alerte:
      friendly_name: "Alerte batterie"
      value_template: >- 
          {% set thermo = 
          states 
          | selectattr('entity_id', 'in', state_attr('group.thermo_batterie','entity_id'))|selectattr('state', 'lt', '15' ) | map(attribute='name')| list %}
          {%- if thermo | length == 0 -%}
            OK
           {%- else -%}
           Pile thermo - de 15% : {{ thermo[:-1] | join(', ') }}{{', ' if thermo | length > 2 else ' '}}et {{ thermo[-1]}}
           {%- endif -%}

Cette fonction me remonte des infos erronées (capteur avec 100% de batterie qui remontent malgré le « < 15 »

Le plus surprenant c’est que quand je change le attribute_name par state , il est bien affiche à 100


Code :

    batterie_alerte:
      friendly_name: "Alerte batterie"
      value_template: >- 
          {% set thermo = 
          states 
          | selectattr('entity_id', 'in', state_attr('group.thermo_batterie','entity_id'))|selectattr('state', 'lt', '15' ) | map(attribute='state')| list %}
          {%- if thermo | length == 0 -%}
            OK
           {%- else -%}
           Pile thermo - de 15% : {{ thermo[:-1] | join(', ') }}{{', ' if thermo | length > 2 else ' '}}et {{ thermo[-1]}}
           {%- endif -%}

Code sans filtrage :

batterie_alerte:
      friendly_name: "Alerte batterie"
      value_template: >- 
          Pile thermo - de 15% : <template TemplateState(<state sensor.capteur_temp_buanderie_battery=90; state_class=measurement, battery=90, humidity=77.98, linkquality=191, power_outage_count=11, pressure=1009.1, temperature=13.71, voltage=2985, unit_of_measurement=%, device_class=battery, friendly_name=capteur_temp_buanderie_battery @ 2023-01-07T00:57:01.851115+01:00>)>, <template TemplateState(<state sensor.capteur_temp_bureau_elsa_battery=97; state_class=measurement, battery=97, humidity=61.75, linkquality=255, power_outage_count=8, pressure=1009.6, temperature=17.37, voltage=2995, unit_of_measurement=%, device_class=battery, friendly_name=capteur_temp_bureau_elsa_battery @ 2023-01-06T14:27:48.198103+01:00>)>, <template TemplateState(<state sensor.capteur_temp_bureau_francois_battery=90; state_class=measurement, battery=90, humidity=62.04, linkquality=255, power_outage_count=5, pressure=1009.3, temperature=18.48, voltage=2985, unit_of_measurement=%, device_class=battery, friendly_name=capteur_temp_bureau_francois_battery @ 2023-01-06T14:27:48.264427+01:00>)>, <template TemplateState(<state sensor.capteur_temp_chambre_battery=100; state_class=measurement, battery=100, humidity=62.94, linkquality=207, power_outage_count=18, pressure=1007.9, temperature=17.53, voltage=3015, unit_of_measurement=%, device_class=battery, friendly_name=Chambre @ 2023-01-06T14:27:48.146425+01:00>)>, <template TemplateState(<state sensor.capteur_temp_salon_battery=100; state_class=measurement, battery=100, humidity=64.05, linkquality=255, power_outage_count=57, pressure=1007.8, temperature=17.75, voltage=3015, unit_of_measurement=%, device_class=battery, friendly_name=Salon @ 2023-01-07T01:14:47.007563+01:00>)>, et <template TemplateState(<state sensor.capteur_temp_sdb_battery=100; state_class=measurement, battery=100, humidity=60.15, linkquality=255, power_outage_count=5, pressure=1009.2, temperature=19.15, voltage=3005, unit_of_measurement=%, device_class=battery, friendly_name=Salle de bain @ 2023-01-06T14:27:48.194355+01:00>)>

Merci de votre aide !

Hello

cela ne serais pas plus simple
???

3 « J'aime »

Salut.
Ou bien si c’est pour faire une carte utiliser la custom:auto-entities

Salut

j’aime bien le concept de cette video

1 « J'aime »

Sympa comme concept, mais j’ai voulu copier le code du template en cliquant sur Code used in this video can be downloaded here et la surprise , money moneyyyyy … :rofl:

1 « J'aime »

En effet tres sympa son code.
Payant, ok mais il montre son code donc ca reste quand meme faisable. On est pas sur jeedom ici :stuck_out_tongue:
Je crois que j’ai trouvé ce que je vais faire cet après midi

1 « J'aime »

Hello preneur de la solution si tu as trouvé

Hummm 2 personnes qui ont exactement le même besoin en 2 jours … C’est quoi le truc ?

1 « J'aime »
batterie_alerte:
      friendly_name: "Alerte batterie"
      value_template: >- 
          {% set thermo = 
          states 
          | selectattr('entity_id', 'in', state_attr('group.thermo_batterie','entity_id'))|selectattr('state', 'lt', '15' ) | map(attribute='name')| list %}
          {%- if thermo | length == 0 -%}
            OK
           {%- else -%}
           Pile thermo - de 15% : {{ thermo[:-1] | join(', ') }}{{', ' if thermo | length > 2 else ' '}}et {{ thermo[-1]}}
           {%- endif -%}

Je répond juste pour ceux qui passerai par la.
Dans ce code il suffit de remplacer le selectattr('state', 'lt', '15' ) par selectattr('state', 'gt', '15' ), la logique est inversée.

le template ( penses à creer le input number)

- sensor:
  # liste les equipements avec surveillance de batteries en auto
  - name: Equipement batterie basse
    icon: "mdi:battery-outline"
    state: >
      {% set consigne = states("input_number.niveau_alerte_battery") | int %}
      {%- set ns = namespace(sensors=[]) -%}
      {%- for state in states.sensor
        | selectattr('attributes.device_class', 'defined')
        | selectattr('attributes.state_class', 'defined')
        | selectattr('attributes.device_class', '==', 'battery')
        | selectattr('attributes.state_class', '==', 'measurement')
        | selectattr('state', 'is_number') -%}
        {%- if state.state | int <= consigne -%}
          {% set ns.sensors = ns.sensors + [dict(name = state.name | replace(' battery', '') | replace(' Battery', ''), state = state.state |int)] %}
        {%- endif -%}
      {%- endfor -%}
      {%- set batt = ns.sensors | sort(attribute = 'state') %}
      {%- set ns = namespace(batt = '') -%}
      {%- for state in batt -%}
        {% set ns.batt = ns.batt + (state.name ~ ' (' ~ state.state ~ '%)' ~" \n") %}
      {%- endfor -%}

      {% if ns.batt | count > 0 %}
        {{ ns.batt | truncate(255, true, '...')}}
      {% else %}
        {{ 'non disponible' }}
      {% endif %}

et tu fais la carte comme il montre dans sa video. C’est facile et ca marche.
Par contre je regarderais plus tard pour changer un peu la mise en forme dans la carte parce que c’est pas beau…

Desole pour le HS du post

1 « J'aime »

il y a maintenant une nouvelle solution plus simple à mettre en œuvre en utilisant HACS et le module ci-dessous:

Bonjour Selecus,
Je cherche à mettre cette carte qui pourrait m’aider à gérer mes batteries, mais je ne vois pas comment insérer une carte ? J’ai essayé de taper le code en yaml dans l’éditeur mais j’ai une erreur ?
Il doit y avoir une manip’ pour insérer une carte « manuellement » mais étant novice, si je peux avoir un guide ou si tu sais vers où je peux me tourner, je suis preneur.
Faut-il installer quelque chose qui fait référence à la carte de maxwroc ?
Je suis complètement perdu…
Merci,

Bonjour David,
As-tu installé HACS ?

Bonjour Selecus,
Oui j’ai HACS, j’ai appris qu’on pouvait rajouter via HACS il y a 3 heures !
Du coup j’ai pu intégrer cette carte je ne savais qu’il fallait passer par HACS…
J’ai tous level_battery qui sont remontées ! :wink:
Maintenant à voir comme je les traite pour avoir une notification à xx% :+1:t2:

si tu veux envoyer une notification pour un pourcentage de batterie restante cette carte ne va pas te convenir et il va falloir que tu apprennes plusieurs notions.

  1. envoyer une notification lorsque tu appuies sur un bouton poussoir
  2. détecter le pourcentage de batterie sur l’ensemble des objets connectés (pour ça inspire toi des scripts cité plus haut)

Oui en effet, c’est ce que j’ai vu également en fin de page de l’explication sur le github, toute fois il renvoi vers un blueprint

Low battery level detection & notification for all battery sensors : Home Assistant Blueprint: Low battery level detection & notification for all battery sensors · GitHub

bien cool pour cela fonction du pourcentage.
Envoyer des notifications je sais faire via telegram :slight_smile:

Voici ce que j’ai fait, tout tapé à la mano :

service: telegram_bot.send_message
data:
  message: |
    Porte Jeanne : {{states('sensor.porte_jeanne_batterie')  | int}}%
    Porte Margaux : {{states('sensor.porte_margaux_batterie')  | int}}%
    Porte cuisine : {{states('sensor.porte_cuisine_batterie')  | int}}%
    Porte Cellier : {{states('sensor.porte_garage_cellier_batterie')  | int}}%
    Garage Perrine : {{states('sensor.contact_porte_garage_perrine_battery_level')  | int}}%
    Garage David : {{states('sensor.contact_porte_garage_david_batterie')  | int}}%

Je me demandais s’il n’y aurait pas une solution pour qu’il envoie uniquement qui est défaillant ?

essaye ça:

{% set id = namespace(bat = []) -%}
{%- for x in states -%}
  {%- if state_attr(x.entity_id, "device_class") == "battery" -%}
    {%- if (x.state | int(100) < 15 and not x.state[:1] =="o") -%}
      {%- set id.bat = id.bat + [x.entity_id+": "+x.state+"%"] -%}
    {%- endif -%}
  {%- endif -%}
{%- endfor %}
Batterie à vérifier:
{% if id.bat | count == 0 -%}
  OK
{%- else -%}
  {{ ' et '.join((id.bat | join(', ')).rsplit(', ', 1)) }}
{%- endif %}

Merci de ton aide, mais ce code, je le met où ?
Parce que là j’avoue ne pas comprendre ces lignes de codes… désolé

Comme cela :

service: telegram_bot.send_message
data:
  message: |
{% set id = namespace(bat = []) -%}
{%- for x in states -%}
  {%- if state_attr(x.entity_id, "device_class") == "battery" -%}
    {%- if (x.state | int(100) < 15 and not x.state[:1] =="o") -%}
      {%- set id.bat = id.bat + [x.entity_id+": "+x.state+"%"] -%}
    {%- endif -%}
  {%- endif -%}
{%- endfor %}
Batterie à vérifier:
{% if id.bat | count == 0 -%}
  OK
{%- else -%}
  {{ ' et '.join((id.bat | join(', ')).rsplit(', ', 1)) }}
{%- endif %}

Pour mieux comprendre le code, il faut que tu apprennes le Jinja2. Ce n’est pas le langage le plus fluide que je connaisse. Sa syntaxe peut être trompeuse quand tu as appris le C++ ou le javascript.
J’ai commenté le code pour facilité ton apprentissage.

{% set id = namespace(bat = []) -%} {## création d'un tableau vide ##}
{%- for x in states -%} {## on va tester tout les appareils qui communique sur leurs états ##}
  {%- if state_attr(x.entity_id, "device_class") == "battery" -%} {## est-ce que l'appareil donne des informations sur sa batterie  ##}
    {%- if (x.state | int(100) < 15 and not x.state[:1] =="o") -%} {## est-ce que l'information sur la batterie est un nombre  inférieur à 15 et n'est pas du texte ##}
      {%- set id.bat = id.bat + [x.entity_id+": "+x.state+"%"] -%} {## On mémorise le nom de l'appareil et son % de batterie ##}
    {%- endif -%}
  {%- endif -%}
{%- endfor %} {## fin du teste individuel sur tous les appareils ##}
Batterie à vérifier:
{% if id.bat | count == 0 -%} {## il n'y a aucune batterie < 15% ##}
  OK
{%- else -%} {## il y a une ou plusieurs batteries < 15% ##}
  {{ ' et '.join((id.bat | join(', ')).rsplit(', ', 1)) }} {## on affiche le nom des batteries en les séparant par une virgule sauf pour le dernier ou l'on remplace la virgule par 'et'  ##}
{%- endif %}

Si tu veux t’entrainer à manipuler le Jinga2 tu peux le faire avec homeassistant dans « Outils de développement » et « Modèle »

Merci des commentaires !
Code tester dans le module « modèle » et impeccable, ça ne ressort que les batteries selon le critère qui est modifiable à souhait (15%, 50%…)

Comment et où insérer ce bout de code et dans le message que j’envoie via telegram uniquement « id.bat » :thinking:

Ou je ne dois pas me servir du blueprint « Low battery level… » et faire une automatisation de toute pièce en intégrant ce code ? Intégrer du Jinja2 dans du yaml ?! ouchhhh là ça va chauffer pour moi je pense…