Synthèse Lumières

Petit code pour avoir le nombre de lumières allumées sur le total ainsi que leur nom :

animate

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

source initiale

5 « J'aime »

La même chose (synthèse) avec les ouvertures :

https://forum.hacf.fr/t/notification-variable-en-fonction-de-letat-des-capteurs/4386/15?u=clemalex

Je trouve ca génial, c’est le genre de petit code qui peuvent vraiment aider à apprendre HA.

Par contre tu aurais des exemples d’utilisation (car a par apprendre, je ne vois pas a quoi ca peut servir) ?

Sur une vue/ un message de synthèse comme l’indique le titre su sujet… :wink:

Mais personnellement, cela me sert plus quand je mets l’alarme, cela m’indique les ouvertures en défauts, ça évite de chercher.

Ensuite, cela permet de demander si tu souhaites tout de même mettre l’alarme et donc savoir qu’elles ouvertures shunter.

@Clemalex bonjour très utile pour certaine automatisation, peut on également filtrer afin de ne prendre en compte les lumières d’une certaine pièce ?

Vous remerciant d’avance

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