[jinja2] Incrément dans un for

Bonjour,

Je suis confronté à un problème en jinja2 et notemment les incrémentations dans une boucle.
J’ai plusieurs capteurs (ceux-ci) et j’aimerai qu’une valeur (x) soit incrémentée à chaque fois qu’un capteur passe du statut false à true.
Voici ce que les capteurs exposent :

{
    "battery": 100,
    "battery_low": false,
    "contact": true,
    "last_seen": "2024-09-20T08:58:04+02:00",
    "linkquality": 72,
    "tamper": false,
    "voltage": 3000
}

c’est l’attribut « contact » qui m’intéresse et {{ states(‹ binary_sensor.capteur_a_contact ›) }} affiche « on » donc j’ajoute « | bool » pour obtenir un booléen.

De ce que j’ai pu lire, le code suivant ne fonctionne pas car on ne peut pas extraire directement une valeur depuis une boucle.

{# x == nombre de capteurs #}
{% set x = 0 %}
{% set a = states('binary_sensor.capteur_a_contact') | bool %}
{% set b = states('binary_sensor.capteur_b_contact') | bool %}
{% set c = states('binary_sensor.capteur_c_contact') | bool %}
{% set capteurs = [a, b, c] %}
{% for cap in capteurs %}
  {% if cap %}
  {% set count = x + 1 %}
  {% endif %}
{% endfor %}
{{ x }}

Ici, x est toujours égal à 0.

Comment est-ce que je peux améliorer ce code pour que x ait la bonne valeur svp ?

Salut

T’as essayé ça :

{# x == nombre de capteurs #}
{% set x = 0 %}
{% set a = states('binary_sensor.capteur_a') | bool %}
{% set b = states('binary_sensor.capteur_b') | bool %}
{% set c = states('binary_sensor.capteur_c') | bool %}
{% set capteurs = [a, b, c] %}
{% for cap in capteurs %}
  {% if cap %}
  {% set x = x + 1 %}
  {% endif %}
{% endfor %}
{{ x }}

Salut

L’idée c’est de compter le nombre de binary_sensor à l’état on ?
Si oui, en très court

{{ expand('binary_sensor.capteur_a','binary_sensor.capteur_b','binary_sensor.capteur_c')
  | selectattr('state','eq','true') |list| count }} 

Hello,

Ce que tu m’as donné ne fonctionne pas.
Je pense que je n’avais pas fourni assez d’informations.

J’ai modifié le post initial pour ajouter ce qu’il manque :slight_smile:

L’accès aux attributs ne marche pas comme ça il faut utiliser
states('binary_sensor.capteur_a','contact')

Par ailleurs, que donne ton capteur dans les outils dev ? Il doit y avoir un état, et pas uniquement l’attribut

si tu parles de l’onglet console dev dans Z2M, ça donne ça

const {battery, iasZoneAlarm, commandsOnOff, commandsLevelCtrl} = require('zigbee-herdsman-converters/lib/modernExtend');

const definition = {
    zigbeeModel: ['TS0203'],
    model: 'TS0203',
    vendor: '_TZ3000_6zvw8ham',
    description: 'Automatically generated definition',
    extend: [battery(), iasZoneAlarm({"zoneType":"generic","zoneAttributes":["alarm_1","alarm_2","tamper","battery_low"]}), commandsOnOff(), commandsLevelCtrl()],
    meta: {},
};

module.exports = definition;

Par du tout (il s’agit des entité donc purement HA), regarde là en bas à gauche, en fonction de l’affichage :
image ou là
image

ce qui donne


Et partage les 3 colonnes (entité/état/attributs)

ok, autant pour moi
voici ce que ça donne pour un capteur

j’ai essayé ceci, mais ça m’affiche toujours 0 alors que les capteur cuisine et A sont ouverts, le capteur ouverture est fermé

{{ expand('binary_sensor.capteur_cuisine','binary_sensor.capteur_A', 'binary_sensor.capteur_ouverture')
  | selectattr('door','eq','true') |list| count }}

Ok, donc il faut prendre le nom affiché dans la 1ere colonne, donc

  • binary_sensor.capteur_cuisine_contact
  • comme la liste est figée, pas besoin de filtrer sur le type door
  • par contre il faut bien son etat quand même

Donc ça c’est plus cohérent

{{ expand('binary_sensor.capteur_cuisine_contact')
  | selectattr('state','eq','on') |list| count }}

Et tu ajoutes ensuite les autres noms

Ça marche nickel, merci beaucoup :slight_smile: