Remontée 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 »