Petit code pour avoir le nombre de lumières allumées sur le total ainsi que leur nom :
Mise à jour du post avec la prise en compte de browser_mod pour exclure les écrans qui sont considérés comme des lampes (et qui n’ont pas d’attribut friendly_name) :
sensor:
- platform: template
sensors:
toutes_les_lampes:
friendly_name_template : >
{% set domain = 'light' %}
{% set state = 'on' %}
{# Définition du `namespace` afin de pouvoir récupérer la valeur définie dans la boucle #}
{% set light = namespace(is_light=0, is_on=0) %}
{%- set entities = (states[domain]| map(attribute='entity_id') | list ) -%}
{%- for entity in entities -%}
{% if not ( is_state_attr(entity,'type','browser_mod') or is_state(entity,'unavailable')) %}
{% set light.is_light = light.is_light + 1 %}
{% if is_state(entity,'on') %}
{% set light.is_on = light.is_on + 1 %}
{%- if loop.last %}
{{ state_attr(entity,'friendly_name') }}
{% else %}
{{ state_attr(entity,'friendly_name') }},
{%- endif %}
{%- endif %}
{%- endif %}
{%- endfor -%}
{{light.is_on}}/{{light.is_light}}
value_template: >
{% set domain = 'light' %}
{% set state = 'on' %}
{%- set entities = (states[domain] | selectattr('state','eq', state) | map(attribute='entity_id') | list ) -%}
{%- for entity in entities -%}
{% if not is_state_attr(entity,'type','browser_mod') %}
{%- if loop.last %}
{{ state_attr(entity,'friendly_name') }}
{% else %}
{{ state_attr(entity,'friendly_name') }},
{%- endif %}
{%- endif %}
{%- endfor -%}
sensor:
- platform: template
sensors:
toutes:
friendly_name_template : >
{% set domain = 'light' %}
{% set state = 'on' %}
{# Définition du `namespace` afin de pouvoir récupérer la valeur définie dans la boucle #}
{% set lights = namespace(on="") %}
{%- set entities = (states[domain]| map(attribute='entity_id') | list ) -%}
{%- for entity in entities -%}
{% if not ( is_state_attr(entity,'type','browser_mod') or is_state(entity,'unavailable')) %}
{% if is_state(entity,'on') %}
{%- if lights.on == '' %}
{% set lights.on = state_attr(entity,'friendly_name') %}
{% else %}
{% set lights.on = lights.on + "\n" + state_attr(entity,'friendly_name') %}
{%- endif %}
{%- endif %}
{%- endif %}
{%- endfor -%}
{{ lights.on}}
value_template: >
{% set domain = 'light' %}
{% set state = 'on' %}
{# Définition du `namespace` afin de pouvoir récupérer la valeur définie dans la boucle #}
{% set light = namespace(is_light=0, is_on=0) %}
{%- set entities = (states[domain]| map(attribute='entity_id') | list ) -%}
{%- for entity in entities -%}
{% if not ( is_state_attr(entity,'type','browser_mod') or is_state(entity,'unavailable')) %}
{% set light.is_light = light.is_light + 1 %}
{% if is_state(entity,'on') %}
{% set light.is_on = light.is_on + 1 %}
{%- endif %}
{%- endif %}
{%- endfor -%}
{{light.is_on}}/{{light.is_light}}
L’erreur est pourtant explicite (je suppose que tu as deja du corriger, mais pour les autres…)
Si je simplifie:
Invalid config for sensor : key not provided in data < platform > line 165
Donc en Français: Configuration invalide pour le sensor, une clef n’existe pas ligne 165.
Donc il faut se référer à la documentation:
La nouvelle architecture est comme ceci :
template:
- sensor:
- name:
Il ne s’agit plus d’une integration sensor, mais d’une integration template. L’ancienne fonctionne encore, mais se rédige comme ceci:
Pour info, positionner le « loop.last » après la condition « light is on », provoquera un disfonctionnement de ta virgule si la dernière lampe « on » n’est pas la dernière de la boucle for.
Pour que le loop last fonctionne, il faut qu’il soit mis juste après le début de la boucle, et que toutes les autres conditions sont réalisées dans son scope. Ou alors que les conditions soient vérifiées avant, et qu’on fait un return apres…
Je bosse sur ton code, je trouve qu’il est génial pour apprendre comment réaliser de bon template. J’essai de l’adapter pour les groupes.
Du coup, j’ai réalisé un template plus court pour l’état d’un sensor, prenant en compte les entitées d’un groupe d’ouverture. Je pense qu’il devrait fonctionner:
{# Je crée une liste vide. Elle me servira à ajouter les entités en état "on" #}
{% set data = namespace(ouvertures=[]) %}
{# Je fais une boucle sur la liste de l'attribut "entity_id" appartenant à mon groupe #}
{% for entity in state_attr('binary_sensor.ouverture', 'entity_id') %}
{%- if is_state(entity, 'on') %}
{# Pour chaque entités en état "on", j'ajoute le friendly_name à ma liste #}
{%- set data.ouvertures = data.ouvertures + [state_attr(entity,'friendly_name')] -%}
{%- endif %}
{%- endfor -%}
{# Enfin je contrôle l'état de ma liste (si elle contient au moins une entité) et j'affiche le résultat joint de virgule, en ajoutant un "." #}
{{ iif(data.ouvertures|length > 0, data.ouvertures | join(", "),"Aucunes")+"." }}
Nombre de lumière allumée (avec groupe Hue par exemple et BrowserMod) :
{{ states.light | selectattr('state', 'eq', 'on') | list |count}}
Nombre de lumière allumée (sans groupe Hue, sans BrowserMod et sans ma sonnette ) :
{{ states.light
| rejectattr('attributes.entity_id', 'defined')
| selectattr('state', 'eq', 'on')
| rejectattr('attributes.is_hue_group', 'defined')
| rejectattr('attributes.browserID', 'defined')
| rejectattr('attributes.friendly_name', 'eq', 'Sonnette Indicator Light')
| list | count
}}
Bonjour,
Comment peut-on exclure les groupes créés avec l’interface (pas directement en yaml) ? car ils portent le type des entitées regroupées.
Par exemple « light.groupe_sdb_rdc ».
Peut-être en détectant le terme « groupe » dans l’id, mais je ne vois pas comment faire.
Quelqu’un pour m’aider ?
bonjour
j’apporte ma piere a l’edifice, nouveau sur home assistant, ce poste ma bcp aidé mais, quand on est nouveau , les données en vrac des fois ca ne sufit pas, donc voici quelque lement en plus en esperant que ca servira (et que je marque pas de connerie
pour ma par pour faire mes synteses lumiere (et aussi volet) je n’ai pas cree de sensor juste les groupes de chaque element et j’ai procede comme ca dans mon dashboard sur une mushroom-template-card