Selectattr

Bonjour,
J’ai créé un groupe de volets et je voulais pouvoir compter les volets qui sont restés ouverts (position <> 0).
J’ai introduit cette formule inspirée de formules vues sur le site de HA mais elle ne semble pas correcte car elle me compte tous les volets même ceux à 0. J’ai remplacé ‹ eq › par ‹ >= ›.

{%set group = state_attr(‹ group.volets ›,‹ entity_id ›)%}
{{ states | selectattr(‹ entity_id ›,‹ in ›, group )|selectattr(‹ state ›,‹ >= ›,‹ 1 ›) | list |count }}

De manière générale, où peut-on trouver de l’aide sur la façon de concevoir ce type de formules (opérateurs existants) ?

Je vous en remercie d’avance.
Pascal

Bonjour,

J’ai toujours pas trouvé la solution.

J’ai commencé par créé un senseur à partir de l’attribut position de mes volets comme ci-dessous, pour chaque volet :

  • platform: template
    sensors:
    position_volet_porte_salon:
    friendly_name: Position du volet porte salon
    entity_id: cover.volet_porte_salon
    unit_of_measurement: ‹ % ›
    value_template: « {{ state_attr(‹ cover.volet_porte_salon ›, ‹ current_position ›) }} »

Ensuite, j’ai créé un groupe reprenant toutes mes positions de volets :

volets:
name: Volets
entities:
- position_volet_porte_salon
- position_volet_fond_salon
- position_volet_avant_salon

Et enfin, j’ai créé, toujours dans mes platform: templates le compteur ci-dessous :

  volets:
    friendly_name: "Volets ouverts"
    value_template: >-
      {%set group = state_attr('group.volets','entity_id')%}
      {{ states | selectattr('entity_id','in', group )|selectattr('state','>=',1) | list |count }}

Cela ne fonctionne pas.
Au moment où je vérifie ma configuration, j’ai le message d’erreur suivant :

Invalid config for [group]: Entity ID position_volet_porte_salon is an invalid entity ID for dictionary value @ data[‹ group ›][‹ volets ›][‹ entities ›]. Got [‹ position_volet_porte_salon ›, ‹ position_volet_fond_salon ›, ‹ position_volet_avant_salon ›, ‹ position_volet_cuisine ›, ‹ position_volet_bureau ›, ‹ position_volet_chambre_gauche ›, ‹ position_volet_chambre_droite ›, ‹ position_volet_gauche_chambre_avant ›, ‹ position_volet_droit_chambre_avant ›]. (See /config/configuration.yaml, line 11).

La ligne 11 de mon fichier configuration.yaml est celle qui ouvre le fichier group :

group: !include groups.yaml

Merci d’avance.
Pascal

Salut…

ça dit que position_volet_porte_salon n’existe pas.

Et si la mise à en forme de n’est pas perdu quand tu poste le message, alors c’est normal

ça c’est pas du yaml correct, il manque les espaces en début de ligne comme dans ces exemples

Merci Pulpy.
Il y avait effectivement un problème dans l’indentation du fichier yaml au niveau des entités.
J’ai remplacé la tabulation par 4 espaces et cela fonctionnait.

Dans mon groupe, j’ai remis les entités « cover ».
Et j’ai modifié la formule comme ci-dessous :

  volets:
    friendly_name: "Volets ouverts"
    value_template: >-
      {%set group = state_attr('group.volets','entity_id')%}
      {{ states | selectattr('entity_id','in', group )|selectattr('state','eq','open') | list |count }}

Et cela marche enfin.
Merci et bonne nuit !

Hello,
Dans le même registre j’essaie de comptabiliser des lumières qui sont ‹ on › ou ‹ off ›; j’ai donc tenté cette formule qui ne marche pas :frowning: = savez-vous comment compter des entités qui sont ‹ on › ou ‹ off › ?

  - platform: template
    sensors:
      compteur_lights:
        friendly_name: Compteur lumières connectées
        value_template: >-
          {% set lum = [
           states.light.extended_color_light_3,
           states.light.extended_color_light_4,
           states.light.extended_color_light_5,
           states.light.extended_color_light_6,
           states.light.color_temperature_light_7,
           states.light.extended_color_light_8,
           states.light.extended_color_light_9,
           states.light.extended_color_light_10,
           states.light.extended_color_light_11,
           states.light.extended_color_light_12,
           states.light.extended_color_light_13,
           states.light.extended_color_light_14,
           states.light.extended_color_light_15,
           states.light.extended_color_light_16,
           states.light.extended_color_light_17,
           states.light.extended_color_light_18,
           ] %}
          {{ lum | selectattr('state','eq',['on','off']) | list | count }}

Salut,

La définition de ton tableau lum n’est pas bonne. ça donne pas une liste de clé => valeur mais juste une liste de valeur.
Donc selectattr ne selectionne rien …state n’existe pas.
Et tu comptes à la fois ON ET OFF … c’est juste le total de toutes tes lumières peut importe l’état
Pour finir, en principe, il faut passer par states("light.extended_color_light_3") (l’ancienne syntaxe marche comme toi encore cependant)

ça c’est mieux

{% set lum = [
dict(state=states("light.extended_color_light_3")),
dict(state=states("light.extended_color_light_4")),
dict(state=states("light.extended_color_light_5")),
dict(state=states("light.extended_color_light_6")),
dict(state=states("light.color_temperature_light_7")),
dict(state=states("light.extended_color_light_8")),
dict(state=states("light.extended_color_light_9")),
dict(state=states("light.extended_color_light_10")),
dict(state=states("light.extended_color_light_11")),
dict(state=states("light.extended_color_light_12")),
dict(state=states("light.extended_color_light_12")),
dict(state=states("light.extended_color_light_13")),
dict(state=states("light.extended_color_light_14")),
dict(state=states("light.extended_color_light_15")),
dict(state=states("light.extended_color_light_16")),
dict(state=states("light.extended_color_light_17")),
dict(state=states("light.extended_color_light_18"))
] %}

{{ lum | selectattr('state','eq','on') | list | count }}

Dernier remarque pour la forme, comment tu fais pour t’y retrouver avec des noms si longs et pourtant si peu représenatifs ?

light.plafond_salon
light.chevet_beatrice

c’est pas plus simple ?

oups pardon @Pulpy , je voudrais comptabiliser dans 1 compteur les ON et OFF , pardon :frowning:
Oui je vais modifier en mettant les friendly_name :slight_smile:

Je vois pas bien l’intérêt dans ce cas ?
Si tu as 10 lumières, peu importe l’état au total ça fait 10 (3+7 ou 5+5 etc)

Il y a ça aussi pour les synthèse sur le forum :

https://forum.hacf.fr/t/synthese-lumieres/4517

2 « J'aime »

@Pulpy-Luke parce pour l’instant il y a des interrupteurs qui rendent certains ampoules ‹ unavailable › :sweat_smile: (mode waf oblige :slight_smile: ) = donc j’ai plutôt 2 ‹ on › + 2 ‹ off › + 6 ‹ unavailable › = 10

As tu vu le lien que j’ai mis ? Il ne correspond pas à ton attente ?

@Clemalex je viens de lire :wink:
A priori, les codes que je viens de lire arrivent à compter 1 condition ‹ on › ou 1 condition ‹ off ›, mais j’ai pas trouvé le compteur arrivant à comptabiliser les conditions ‹ on › et ‹ off ›
J’ai contourné le pb en créant 3 compteurs :slight_smile: 1 qui comptabilise les ‹ on ›, 1 qui comptabilise les ‹ off ›, et 1 dernier qui fait la somme des 2 :slight_smile: je sais c’est du bricolage :sweat_smile:

1 « J'aime »

Du coup tu as 3 états. Tu en comptes 2 et tu fait la somme ?
Compter uniquement les unvailable et soustraire du total chez bien aussi :grin:Tu gagnes 2 compteurs…
Et puis ça vaudrait le coup de se pencher sur le pourquoi du unvailable…

1 « J'aime »

Oui en effet sur la soustraction des unavailables :+1:
Le pourquoi des unavailables est simple : j’ai mis des ampoules zigbee rgb, mais derrière il y a forcément des interrupteurs physiques (soit muraux ou sur le fil). Comme je dois prendre le facteur waf en compte😉, quand l’interrupteur physique est éteins, il apparaît déconnecté sous HA.
Pour avoir une solution compatible HA et interrupteur physiques (waf) c’est-à-dire allumer tout autant par l’interrupteur que par HA , j’ai l’impression qu’il faudrait que j’installe aussi des micromodules aqara SSM-U02… pour les interrupteurs physiques sur fil, ça paraît impossible logique :thinking: