Bonjour,
Mon problème
J’aimerais faire un template sensor qui me compte et liste toutes les fenêtres ouvertes, et s’il n’y en a pas qu’il me dise « Aucune fenêtre/porte ouverte ».
Dans mon ancienne maison, quand je n’avais que 5 ouvertures à surveiller, j’avais fait ce qui suit, mais c’est fastidieux, et maintenant que j’ai 14 ouvertures avec de nouvelles qui arriverons plus tard, j’aimerais automatiser un peu la recherche des capteurs d’ouvertures selon le nom donné (ils ont tous un nom commençant par Capteur_Fenêtre
ou Capteur_Porte
.
Pour information, voilà ce que j’avais fait :
{% set fenetres_ouvertes ="" %}
{% if is_state('binary_sensor.capteur_fenetre_bureau_contact', 'on') %}
{% set fenetres_ouvertes = fenetres_ouvertes + "Bureau" %}
{% endif %}
{% if is_state('binary_sensor.capteur_fenetre_chambre_parents_contact', 'on') %}
{% if fenetres_ouvertes != none %}
{% set fenetres_ouvertes = fenetres_ouvertes + " + Chambre parents" %}
{% else %}
{% set fenetres_ouvertes = fenetres_ouvertes + "Chambre parents" %}
{% endif %}
{% endif %}
{% if is_state('binary_sensor.capteur_fenetre_chambre_enfant_contact', 'on') %}
{% if fenetres_ouvertes != none %}
{% set fenetres_ouvertes = fenetres_ouvertes + " + Chambre enfant" %}
{% else %}
{% set fenetres_ouvertes = fenetres_ouvertes + "Chambre enfant" %}
{% endif %}{% endif %}
{% if is_state('binary_sensor.capteur_fenetre_salle_de_bains_contact', 'on') %}
{% if fenetres_ouvertes != none %}
{% set fenetres_ouvertes = fenetres_ouvertes + " + SdB" %}
{% else %}
{% set fenetres_ouvertes = fenetres_ouvertes + "SdB" %}
{% endif %}
{% endif %}
{% if is_state('binary_sensor.capteur_fenetre_salon_contact', 'on') %}
{% if fenetres_ouvertes != none %}
{% set fenetres_ouvertes = fenetres_ouvertes + " + Salon" %}
{% else %}
{% set fenetres_ouvertes = fenetres_ouvertes + "Salon" %}
{% endif %}
{% endif %}
{{ fenetres_ouvertes }}
Il me faudrait donc un nombre qui s’incrémente pour chaque ouverture ouverte, et une variable qui stocke le nom de l’ouverture ouverte.
Mais je ne sais pas programmer ceci…
Quelqu’un aurait-il la bonté de m’aider ?
Merci d’avance 
Miles
Ma configuration
Texte à remplacer par votre configuration
Comment récupérer ma configuration :
Dans votre HA, Menu latéral
Paramètres
>
Système
>
Corrections
puis les trois petits points en haut a droite >
Informations Système
puis une fois en bas
Copier
Hello,
Perso j’en ai fait 2
1 liste
{% set domain = 'binary_sensor' %}
{% set state = 'on' %}
{%- set entities = states[domain] | selectattr('state','eq', state) | selectattr('attributes.device_class', 'in', ['door', 'window']) | map(attribute='entity_id') | list -%}
{%- for entity in entities %}
{%- if loop.first %}
{{ state_attr(entity,'friendly_name') }}
{%- else %}
{{ state_attr(entity,'friendly_name') }}
{%- endif %}
{%- endfor %}
1 nombre
{% set domain = 'binary_sensor' %}
{% set state = 'on' %}
{# Définition du `namespace` afin de pouvoir récupérer la valeur définie dans la boucle #}
{% set binary_sensor = namespace(is_binary_sensor=0, is_on=0) %}
{%- set entities = (states[domain]| map(attribute='entity_id') | list ) -%}
{%- for entity in entities -%}
{% if ( is_state_attr(entity,'device_class','door') or is_state_attr(entity,'device_class','window') or is_state_attr(entity,'device_class','garage_door')) %}
{% set binary_sensor.is_binary_sensor = binary_sensor.is_binary_sensor + 1 %}
{% if is_state(entity,'on') %}
{% set binary_sensor.is_on = binary_sensor.is_on + 1 %}
{%- endif %}
{%- endif %}
{%- endfor -%}
{{binary_sensor.is_on}}/{{binary_sensor.is_binary_sensor}}
et je récupère après ça dans une carte
cdt
2 « J'aime »
Autre solution faire un groupe avec toutes les entités que tu veux surveiller ici j’ai switch.synthese_prise qui regroupe toutes les prises.
Après j’ai ce Template qui donne le nombre de prises allumées
{% set entities = state_attr('switch.synthese_prise', 'entity_id') %}
{{ expand(entities) | selectattr('state', 'equalto', 'on') | list | count if entities is iterable else 0 }}
C’est surtout utile si tu ne veux pas lister\vérifier toutes tes porte\fenêtre.
Pour afficher le dernier capteur actif et quand (avec binary_sensor.presence qui est le groupe des capteurs a surveiller) :
- sensor:
- name: "Dernier capteur présence"
state: >
{% set sensors = expand('binary_sensor.presence') %}
{% set active_sensors = sensors | selectattr('state', 'eq', 'on') | list %}
{% set inactive_sensors = sensors | selectattr('state', 'eq', 'off') | list %}
{% if active_sensors | length > 0 %}
{% set latest_active = active_sensors | max(attribute='last_changed') %}
{{ latest_active.name }} - {{ latest_active.last_changed | as_timestamp | timestamp_custom('%d/%m %H:%M', true) }}
{% elif inactive_sensors | length > 0 %}
{% set latest_inactive = inactive_sensors | max(attribute='last_changed') %}
{{ latest_inactive.name }} - {{ latest_inactive.last_changed | as_timestamp | timestamp_custom('%d/%m %H:%M', true) }}
{% else %}
"Aucun capteur actif"
{% endif %}
1 « J'aime »
Merci vous deux 
@Idaho947
Comment je crée un groupe de capteur ?
Les templates que vous donnez, je les créer où dans l’UI ?
Ou bien si je passe en YAML, je les mets dans quel dossier ?
Pour info, j’ai ceci dans mon configuration.yaml :
homeassistant:
customize: !include /config/YAML/customize.yaml
lovelace: !include /config/YAML/lovelace_main.yaml
# only used for GUI automations
automation ui: !include /config/automations.yaml
# All of my yaml automations go here in this directory
automation yaml: !include_dir_merge_list /config/YAML/automations
# command_line: !include_dir_merge_list /config/YAML/command_line
# input_boolean: !include /config/YAML/input_boolean.yaml
input_boolean: !include_dir_merge_named /config/YAML/input_booleans
input_datetime: !include /config/YAML/input_datetime.yaml
input_number: !include_dir_merge_named /config/YAML/input_numbers
plant: !include /config/YAML/plant.yaml
scene: !include /config/YAML/scenes.yaml
script: !include_dir_merge_named /config/YAML/scripts
sensor: !include /config/YAML/sensors.yaml
switch: !include /config/YAML/switch.yaml
# template: !include /config/templates.yaml
template: !include_dir_merge_list /config/YAML/templates
timer: !include_dir_merge_named /config/YAML/timers
utility_meter: !include_dir_merge_named /config/YAML/utility_meters
En tout cas, merci à vous 
Les groupes tu peux les faire dans des helpers (paramètre, appareil et service et en haut l’item entreé) :
Pour les scripts soit tu créés des template via le même endroit :
Soit tu les mets dans ton fichier config directement ou via un appel a un fichier yaml séparé (ce qui est plus lisible et plus facile a maintenir).
1 « J'aime »
Salut,
Je me suis inspiré de ce que tu as fait mais je n’ai pas le changement d’état de mon icône lors de l’ouverture d’un ouvrant.
En revanche, le décompte lui fonctionne bien.
Voici ma carte, peux-tu me dire si tu y vois quelque chose qui cloche ?
type: custom:mushroom-template-card
primary: Ouvertures
secondary: |-
{% set domain = 'binary_sensor' %}
{% set state = 'on' %}
{# Définition du `namespace` afin de pouvoir récupérer la valeur définie dans la boucle #}
{% set binary_sensor = namespace(is_binary_sensor=0, is_on=0) %}
{%- set entities = (states[domain]| map(attribute='entity_id') | list ) -%}
{%- for entity in entities -%}
{% if ( is_state_attr(entity,'device_class','door') or is_state_attr(entity,'device_class','window') or is_state_attr(entity,'device_class','garage_door')) %}
{% set binary_sensor.is_binary_sensor = binary_sensor.is_binary_sensor + 1 %}
{% if is_state(entity,'on') %}
{% set binary_sensor.is_on = binary_sensor.is_on + 1 %}
{%- endif %}
{%- endif %}
{%- endfor -%}
{{binary_sensor.is_on}}/{{binary_sensor.is_binary_sensor}}
icon: |-
{% if is_state("binary_sensor.liste_des_ouvrants", "on") %}
mdi:lock-open
{% else %}
mdi:lock
{% endif %}
tap_action:
action: more-info
hold_action:
action: none
double_tap_action:
action: none
layout: vertical
icon_color: |-
{% if is_state("binary_sensor.liste_des_ouvrants", "on") %}
red
{% else %}
green
{% endif %}
fill_container: true
badge_color: ""
entity: binary_sensor.liste_des_ouvrants
multiline_secondary: true
Je pense que cela vient de mon template binary sensor « Liste des Ouvrants » qui garde son statut « off » malgré une ou plusieurs ouvertures sur « on ».
Si tu peux m’aider…
Dans les paramètres de ton groupe tu as bien la coche « toutes les entités » sur off ?
Je n’ai pas créé de groupe, mais un template binary_sensor regroupant les entités comme @freetronic
Je n’ai donc pas d’option à mettre sur « off » comme tu le suggères.
A moins qu’il faille le faire dans le template…
As tu vérifier tes template dans outils de développement > modèles
Je ne comprends pas ton entité. Je ne vois pas comment elle peut affiché ouvert\fermé
Essaie :
{% set domain = 'binary_sensor' %}
{% set state = 'on' %}
{%- set entities = states[domain] | selectattr('state', 'eq', state) | selectattr('attributes.device_class', 'in', ['door', 'window', 'garage door']) | list -%}
{% if entities | length > 0 %}
Ouvert
{% else %}
Fermé
{% endif %}
Oui, et cela semble bon… ou alors je ne saisit pas une subtilité ou une autre :
Et j’ai bien 13 entités concernées donc le nombre est juste.
J’ai juste effacé les autres entités exposées de ce résultat qui ne sont pas à diffuser « en clair ».
Donc ton Template est pas bon tu demande un résultat booléen (on ou off) pour changer l’icone et tu lui donne une chaine de caractère. Cela ne peut pas fonctionner.
Donc tu me conseilles de modifier mon template sensor « Liste des Ouvrants » (la première des deux captures modèles) par celui ci :
{% set domain = 'binary_sensor' %}
{% set state = 'on' %}
{%- set entities = states[domain] | selectattr('state', 'eq', state) | selectattr('attributes.device_class', 'in', ['door', 'window', 'garage door']) | list -%}
{% if entities | length > 0 %}
Ouvert
{% else %}
Fermé
{% endif %}
Non parce que ça te renvoi un string aussi j’avais pas compris ce que tu voulais exactement.
TU as plein de solution selon ce que tu veux au final.
Passe la partie icon: binary_sensor.ouvrant
a on
icon: |-
{% if is_state("binary_sensor.Les_ouvrant", "on") %}
mdi:lock-open
{% else %}
mdi:lock
{% endif %}
Merci @hackdiy , mais c’est déjà le cas…
icon: |-
{% if is_state("binary_sensor.liste_des_ouvrants", "on") %}
mdi:lock-open
{% else %}
mdi:lock
{% endif %}
1 « J'aime »
Bah… ce que je voudrais c’est que mon code fonctionne… 
J’ai quand même essayé ton code mais cela ne fonctionne pas non plus, mon entité crée par le template reste en état « fermé » en permanence même avec plusieurs ouvrants d’ouverts.
A la différence que dans le modèle de test il passe bien à « Ouvert » contrairement à l’autre code, mais cela n’influe pas sur le sensor créé.
En revanche le décompte des ouvrants lui fonctionne (1/13, 3/13, etc…).
Et évidemment l’icône ne change pas d’état non plus puisque le sensor ne bouge pas…
SI tu utilises juste le code que je t’ai donné, ça change de ouvert à fermé ou pas ? Le code que je t’ai donné est un sensor. Comme je te le disais plus haut ton code est pas bon. Donc la question reste la même qu’est ce que tu veux avoir en résultat final ?
Là tu as un sensor qui passe à on si une fenêtre est ouverte :
- binary_sensor:
- name: "Fenêtres ouvertes"
unique_id: "fenetres_ouvertes"
state: >
{% set is_open = namespace(count=0) %}
{% set total = namespace(count=0) %}
{% for entity in states.binary_sensor %}
{% if entity.attributes.device_class in ['window', 'door', 'garage_door'] %}
{% set total.count = total.count + 1 %}
{% if entity.state == 'on' %}
{% set is_open.count = is_open.count + 1 %}
{% endif %}
{% endif %}
{% endfor %}
{{ is_open.count > 0 }}
icon: >
{% if is_open.count > 0 %}
mdi:window-open
{% else %}
mdi:window-closed
{% endif %}
Là tu as un état de fenêtre ouverte par rapport au total :
- sensor:
- name: "État des fenêtres"
unique_id: "etat_fenetres"
state: >
{% set is_open = namespace(count=0) %}
{% set total = namespace(count=0) %}
{% for entity in states.binary_sensor %}
{% if entity.attributes.device_class in ['window', 'door', 'garage_door'] %}
{% set total.count = total.count + 1 %}
{% if entity.state == 'on' %}
{% set is_open.count = is_open.count + 1 %}
{% endif %}
{% endif %}
{% endfor %}
{{ is_open.count }}/{{ total.count }}
La liste des ouvrants ouvert :
template:
- sensor:
- name: "Ouvrants ouverts"
unique_id: "ouvrants_ouverts"
state: >
{% set open_list = [] %}
{% for entity in states.binary_sensor %}
{% if entity.attributes.device_class in ['window', 'door', 'garage_door'] and entity.state == 'on' %}
{% set open_list = open_list + [state_attr(entity.entity_id, 'friendly_name')] %}
{% endif %}
{% endfor %}
{{ ', '.join(open_list) if open_list else 'Aucun' }}
Tu fais ta carte avec cela ça devrait le faire.
Merci.
Mon problème vient peut-être du fait que j’ai modélisé (avec l’ancien code comme le tien) un template « binary_sensor » pour la « liste des ouvrants » et non pas un template « sensor ».
Je regarde tout ça tranquillement avec ta dernière suggestion ce soir et je te tiens au jus.
Ton template ne donne pas un binary sensor c’est ce que je te disais plus haut, il donne un string.