Synthèse Lumières

Je partirais plus sur la définition d’un groupe et l’utilisation du filtre expand.

Je crois qu’il existe des exemples sur le forum. Sinon j’en fournirai un :+1:

La première chose à faire est de lire la documentation pour comprendre de quoi je parle :

Retrouvé ! :heart:

https://forum.hacf.fr/t/lister-les-pieces-dont-une-fenetre-est-ouverte/1357/10?u=clemalex

Bonjour,
Y a t il moyen de remplacer la virgule de séparation par un saut de ligne ?

1 « J'aime »

Oui :

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}}
2 « J'aime »

Merci ta réponse toujours très efficace.
Mais il y a quelque chose que je ne comprends pas.

Quand j’utilise :

type: entities
entities:
  - entity: sensor.tous_les_capteurs_ouvrants
    secondary_info: last-changed
title: Ouvrants

Je n’ai pas les sauts de ligne (juste un espace)

Et lorsque j’utilise

type: markdown
content: '{{state_attr(''sensor.tous_les_capteurs_ouvrants'',''friendly_name'')}}'

J’ai bien les sauts de lignes
J’ai le même comportement avec Firefox, Edge et l’appli Android.

C’est le fonctionnement de la carte il me semble…

Elle vire les sauts de lignes pour les remplacer…

Les sauts sont également supprimés dans les notifications

Bonsoir a tous,

Je me suis inspiré du sujet ci-dessous pour capteur listant mes contacteurs actifs.
Mais quand je teste la config j’ai cette erreur :

Invalid config for [sensor]: required key not provided @ data[‹ platform ›]. Got None. (See /config/configuration.yaml, line 165).

Je n’en trouve pas la cause, tout me semble ok ! Mon config.yaml c’est :

Un petit coup de mains SVP
merci

Salut.

Avec un peu de retard…

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:

sensor:
  - platform: template
    sensors:
      solar_angle:
        friendly_name :

Sans espace entre « friendly_name » et les « : »

1 « J'aime »

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")+"." }}

Le groupe de fenêtre ou de porte
binary_sensor:
    - platform: group
      name: Ouverture
      unique_id: bb1f100c-cea4-43f5-acd7-5ffca377b51c
      device_class: window
      entities:
      - binary_sensor.door_window_sensor_158d0001dad27e # Entrée
      - binary_sensor.door_window_sensor_158d000490fea1 # Cellier
      - binary_sensor.door_window_sensor_158d0001dbd248 # Garage
      - binary_sensor.door_window_sensor_158d0007bf2e30 # Chambre parentale
      - binary_sensor.door_window_sensor_158d0001dbccf9 # Baie vitrée gauche
      - binary_sensor.door_window_sensor_158d00051e24d3 # Baie vitrée droite
      - binary_sensor.door_window_sensor_158d0007bf2c79 # Fenetre cuisine gauche
      - binary_sensor.door_window_sensor_158d0007d22697 # Fenetre cuisine droite
Le template sensor au complet
template
  - sensor:
      - name: >-
          {% set count = namespace(value=0) %}
          {% set total = namespace(value=0) %}
          {% for entity in state_attr('binary_sensor.ouverture', 'entity_id') %}
          {%- if is_state(entity, 'on') %}
          {%- set count.value = count.value + 1 %}
          {%- endif %}
          {%- set total.value = loop.length %}
          {%- endfor %}
          Ouvertures: {{count.value}}/{{total.value}}
        unique_id: 9e5082d0-3046-428e-af8d-b1f26be5def3
        state: >-
          {% set data = namespace(ouvertures=[]) %}
          {% for entity in state_attr('binary_sensor.ouverture', 'entity_id') %}
          {%- if is_state(entity, 'on') %}
          {%- set data.ouvertures = data.ouvertures + [state_attr(entity,'friendly_name')] -%}
          {%- endif %}
          {%- endfor -%}
          {{ iif(data.ouvertures|length > 0, data.ouvertures | join(", "),"Aucunes")+"." }}

Bonjour,

Petite pierre à l’édifice :

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
  }}

Bonne soirée :wink:

4 « J'aime »

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 ?

Salut
Comme ça

{{ states.light 
  | rejectattr('attributes.entity_id', 'defined') 
  | rejectattr('entity_id', 'search', 'groupe') 
  | selectattr('state', 'eq', 'on')
  | rejectattr('attributes.is_hue_group', 'defined')
  | rejectattr('attributes.browserID', 'defined')
  | rejectattr('attributes.friendly_name', 'eq', 'Sonnette Indicator Light')
  | list
  }}

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 :sweat_smile: :rofl:
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


donc la on est sur le groupe de lumiere « chambre »
et les code pour l’icon de couleur vous devait change "lignt chambre"par votre groupe

{% if is_state('light.chambre', 'off') %}
grey
{% else %}
orange
{% endif %}

et pour le nombre d’ouvert et si vous remplacce par off le nombre de fermé

{{ expand('light.chambre')|selectattr('state','eq','on')|list|count }}

Bonjour à tous,

Tout d’abord, veuillez m’excuser pour la question de… débutant…
J’aimerais revoir intégralement mon interface HA, en ajoutant, pour commencer, la synthèse des lumieres allumées.
J’ai créé un fichier template : synthese_lumieres.yaml dans « /config/template/ », avec le code de @Clemalex
Et là, c’est le drame… Je ne sais pas ce que je dois faire après

Encore désolé, pour cette demande…

Merci beaucoup pour votre aide précieuse !

Bonsoir

Merci pour le travail, qui me donne un peu de fil à retordre ce soir :wink:

Je cherche à faire la liste des lumières allumées en excluant tous les groupes de lumières mais aussi tout ce qui est abusivement typé lumière !

En fait mes entités qui sont des lumières sont toutes nommées light.ecl_xxxxx

Code en cours de travail :

    toutes_les_lampes:
      friendly_name_template: >
        {% set domain = 'light' %}
        {% set state = 'on' %}
        {# Définition du `namespace` pour le friendly_name_template #}
        {% set friendly_light = namespace(is_light=0, is_on=0) %}
        {%- set entities = (states[domain] | map(attribute='entity_id') | list ) -%}
        {%- for entity in entities -%}
          {% if not (entity.startswith('light.grp_') or is_state_attr(entity, 'type', 'browser_mod') or is_state(entity, 'unavailable')) %}
            {% set friendly_light.is_light = friendly_light.is_light + 1 %}
            {% if is_state(entity, 'on') %}
              {% set friendly_light.is_on = friendly_light.is_on + 1 %}
            {%- endif %}
          {%- endif %}
        {%- endfor -%}
        Lampes allumées : {{ friendly_light.is_on }}/{{ friendly_light.is_light }}

      value_template: >
        {% set domain = 'light' %}
        {% set state = 'on' %}
        {# Définition du `namespace` pour le value_template #}
        {% set value_light = namespace(lights=[]) %}
        {%- set value_entities = (states[domain] | selectattr('state', 'eq', state) | map(attribute='entity_id') | list ) -%}
        {%- for entity in value_entities -%}
          {% if not (entity.startswith('light.grp_') or is_state_attr(entity, 'type', 'browser_mod')) %}
            {% set value_light.lights = value_light.lights + [state_attr(entity, 'friendly_name')] %}
          {%- endif %}
        {%- endfor -%}
        {%- if value_light.lights | length == 0 %}
          Aucune Lampe Allumée !
        {%- else %}
          {{ value_light.lights | join(', ') }}
        {%- endif %}

cela fonctionne mais c’est le nombre total de lumière qui ne va pas il y en a trop
D’où le souhait de filtrer sur ce que je connais donc la syntaxe des « vrai lumière »

Merci de votre aide

Regarde plutôt du côté de ce post :

Bonjour @Clemalex

Merci pour le lien mais c’est pareil avec cette solution en fait !

J’ai un nombre de light de 58 avec le lien et 56 avec mon code adapté déjà un peu !
Or je n’ai pas tout ça en lumière (38 en Zigbee et 4 en Zwave) donc il m’en trouve en plus
J’ai 16 Groupe de Lumières dans les entrées

Ce qui me donne bien 58 !

Mais je n’arrive pas à supprimer mes grp light.ecl_xxxxxx qui est l’appellation dans les entrées

J’ai testé comme ceci

{{ states.light 
  | rejectattr('attributes.entity_id', 'defined') 
  | rejectattr('attributes.friendly_name', 'match', 'GRP ECL')
  | selectattr('state', 'eq', 'off')
  | list | count
  }}

et mes lumières ont cette nomenclature en gros

Bonjour. Je relance le sujet. Car il m’intéresse mais mon statut de « super débutant » m’empêche pour l’instant de comprendre ou il faut ajouter ces lignes de code. Désolé de ma naïveté. Merci