Notification variable en fonction de l'état des capteurs

Mon problème

Bonjour,
Lorsque je mets mon alarme en marche, je cherche à avoir une notification qui me donne:
« Toutes les portes et fenêtres sont fermées »
Lorsque tout est fermée

et

"Les fenêtres suivantes sont restées ouvertes : "

  • Fenêtre n°1
  • Fenêtre n°4
  • Fenêtre n°5"
    Lorsque les fenêtres 1,4 et 5 sont restées ouverte.

Sur Jeedom j’avais créé le message en testant chaque capteur l’un après l’autre :
Si au moins un fenêtre est restée ouverte alors message = "Les fenêtres suivantes sont restées ouvertes : "
Si fenêtre n°1 est ouverte alors message = message + « Fenêtre n°1 »

Si fenêtre n°x est ouverte alors message = message + « Fenêtre n°x »

Comment faire pour obtenir ce résultat sous HA ?

Ma configuration


System Health

version core-2021.4.6
installation_type Home Assistant OS
dev false
hassio true
docker true
virtualenv false
python_version 3.8.7
os_name Linux
os_version 5.4.109
arch x86_64
timezone Europe/Paris
Home Assistant Community Store
GitHub API ok
Github API Calls Remaining 5000
Installed Version 1.12.1
Stage running
Available Repositories 785
Installed Repositories 5
Home Assistant Cloud
logged_in false
can_reach_cert_server ok
can_reach_cloud_auth ok
can_reach_cloud ok
Home Assistant Supervisor
host_os Home Assistant OS 5.13
update_channel stable
supervisor_version supervisor-2021.04.0
docker_version 19.03.15
disk_total 30.8 GB
disk_used 4.3 GB
healthy true
supported true
board ova
supervisor_api ok
version_api ok
installed_addons File editor (5.3.0), Samba share (9.3.1), Let’s Encrypt (4.11.0)
Lovelace
dashboards 1
resources 2
views 9
mode storage

Bonsoir,
A-t-on le droit de parler de Node Red pour répondre à la question ?

Pourquoi pas.
Je ne me suis pas encore essayé à Node Red

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

1 « J'aime »

Bonjour, si on a le droit, alors voici ma contribution.

[{"id":"f88bc3f3.09b23","type":"ha-get-entities","z":"b4ce4fc4.2ae35","server":"df03acce.f940b","name":"","rules":[{"property":"attributes.device_class","logic":"is","value":"door","valueType":"str"},{"property":"state","logic":"is","value":"on","valueType":"str"},{"property":"entity_id","logic":"is_not","value":"binary_sensor.porte_couloir_contact","valueType":"str"},{"property":"entity_id","logic":"is_not","value":"binary_sensor.porte_cuisine_contact","valueType":"str"}],"output_type":"split","output_empty_results":false,"output_location_type":"msg","output_location":"payload","output_results_count":1,"x":330,"y":120,"wires":[["a5d78b50.a44a98"]]},{"id":"f5795f72.84715","type":"join","z":"b4ce4fc4.2ae35","name":"","mode":"custom","build":"string","property":"payload","propertyType":"msg","key":"topic","joiner":",","joinerType":"str","accumulate":false,"timeout":"","count":"","reduceRight":false,"reduceExp":"","reduceInit":"","reduceInitType":"","reduceFixup":"","x":330,"y":220,"wires":[["690e7e73.d7f5d"]]},{"id":"a5d78b50.a44a98","type":"template","z":"b4ce4fc4.2ae35","name":"Format chaine","field":"payload","fieldType":"msg","format":"handlebars","syntax":"mustache","template":"{{payload.attributes.friendly_name}}","output":"str","x":340,"y":180,"wires":[["f5795f72.84715"]]},{"id":"690e7e73.d7f5d","type":"change","z":"b4ce4fc4.2ae35","name":"","rules":[{"t":"set","p":"topic","pt":"msg","to":"ALARME","tot":"str"}],"action":"","property":"","from":"","to":"","reg":false,"x":350,"y":260,"wires":[["e36d7806.cef2f8"]]},{"id":"a7d37fd3.af2cb","type":"inject","z":"b4ce4fc4.2ae35","name":"","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"","payloadType":"date","x":130,"y":120,"wires":[["f88bc3f3.09b23"]]},{"id":"e36d7806.cef2f8","type":"debug","z":"b4ce4fc4.2ae35","name":"","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"true","targetType":"full","statusVal":"","statusType":"auto","x":510,"y":260,"wires":[]},{"id":"df03acce.f940b","type":"server","name":"Home Assistant","legacy":false,"addon":true,"rejectUnauthorizedCerts":true,"ha_boolean":"y|yes|true|on|home|open","connectionDelay":true,"cacheJson":true}]


Bonne journée.

1 « J'aime »

Personnellement, si tous les sujets pouvaient contenir la solution YAML et Node-RED, ce serait merveilleux… :innocent:

N’hésitez pas (tous !) à apporter votre contribution lorsque vous adapter un flow ou une automatisation (ou souhaitez simplement partager :heart_eyes:)

:+1:

:hacf:

1 « J'aime »

Un message a été fusionné à un sujet existant : Utilisation de Browser_mod

Oui je prends en compte. Deux ouvertures qui sont à l’intérieur et ne doivent pas être considérées par l’alarme.

Heu NodeRed…
Trol à part, pas de réponse directe mais des pistes regarde du coté de l’intégration Alarmo qui va te permettre de savoir quel capteur est ouvert et empêche l’activation, mais aussi des groupes pour gérer tes capteurs d’ouverts et remonter ceux qui sont ouverts ou celui qui a déclenché l’alarme dans un groupe :

- alias: Alarm Visonic Home
  description: ''
  trigger:
  - entity_id: group.all_sensors_visonic
    platform: state
    to: 'on'
  condition:
  - condition: state
    entity_id: alarm_control_panel.visonic_alarm
    state: armed_home
  action:
  - entity_id: alarm_control_panel.visonic_alarm
    service: alarm_control_panel.alarm_trigger
  - data_template:
      entity_id: input_text.trigger_source
      value: '{{ trigger.to_state.attributes.friendly_name }}'
    service: input_text.set_value
  - data_template:
      message: "{{now().strftime('%d/%m/%Y, %H:%M')}} > A L A R M  W A R N I N G  Visonic | Sensor : {% for state in states|selectattr('entity_id','in',state_attr('group.all_sensors','entity_id'))|selectattr('state','eq','on')|list -%}{{state.name+' '}}{%- endfor %}"
    service: notify.Free_Mobile

Alarmo :

:clap: :clap: :clap:
Je pensais rester tranquille ce soir… C’est raté.
Tu m’as mis l’eau à la bouche. Je suis obligé de le tester.

Heu NodeRed…

Pourquoi autant de haine ?
NR: C’est la vie !!! :smiley:

Pas de haine (quel moche mot), on aime ou on aime pas, j’ai testé, c’est intéressant pour ceux qui ont peur du yaml, mais ça alourdit et tout ce que tu peut faite en NR peut se faire en YAML…

Un grand merci pour toutes vos réponses
J’ai utilisé la solution de Clemalex que j’ai adapté a mes capteurs

sensor:
  - platform: template
    sensors:
      tous_les_capteurs_ouvrants:
        friendly_name_template  : >
          {% 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 not ( is_state_attr(entity,'type','browser_mod') or is_state(entity,'unavailable')) %}
              {% 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 %}
                {%- if loop.last %}
                  {{ state_attr(entity,'friendly_name') }}
                {% else %}
                  {{ state_attr(entity,'friendly_name') }},
                {%- endif %}
              {%- endif %}
            {%- endif %}
          {%- endfor -%}
          {{binary_sensor.is_on}}/{{binary_sensor.is_binary_sensor}}
        value_template: >
          {% set domain = 'binary_sensor' %}
          {% 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 -%}

Le souci c’est que ça me fait la synthèse de tous les « binary_sensor » y compris ceux qui n’ont rien a voir avec les capteurs de porte ou de fenêtre.
Peux être en utilisant les groups…

Oui je t’ai répondu avec un exemple concernant les lampes…

Du coup, il faut adapter ma réponse… désolé :pensive:

Voila (filtre fait sur les classes opening et door et window:

sensor:
  - platform: template
    sensors:
      tous_les_capteurs_ouvrants:
        friendly_name_template  : >
          {% 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','opening') or is_state_attr(entity,'device_class','door') or is_state_attr(entity,'device_class','window')) %}
              {% 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}}
        value_template: >
          {% set domain = 'binary_sensor' %}
          {% set state = 'on' %}
          {%- set entities = (states[domain] | selectattr('state','eq', state) | map(attribute='entity_id') | list ) -%}
          {%- for entity in entities -%}
              {% if ( is_state_attr(entity,'device_class','opening') or is_state_attr(entity,'device_class','door') or is_state_attr(entity,'device_class','window')) %}
              {%- if loop.first or loop.last %}
                  {{ state_attr(entity,'friendly_name') }}
              {% else %}
                  {{ state_attr(entity,'friendly_name') }},
              {%- endif %}
              {%- endif %}
          {%- endfor -%}

Je débute sous HA (Je viens de Jeedom) et je n’avais pas encore été fouiller du côté des device_class.
Effectivement, maintenant que j’en connais l’existence un simple filtre résout le problème
Merci encore pour toutes ces réponses super rapides et super efficaces.

1 « J'aime »

Bonjour,

Je tente, dsl c’est nouveau pour moi, d’intégrer le code qui a été partager ci-dessus :

sensor:
  - platform: template
    sensors:
      tous_les_capteurs_ouvrants:
        friendly_name_template  : >
          {% 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','opening') or is_state_attr(entity,'device_class','door') or is_state_attr(entity,'device_class','window')) %}
              {% 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}}
        value_template: >
          {% set domain = 'binary_sensor' %}
          {% set state = 'on' %}
          {%- set entities = (states[domain] | selectattr('state','eq', state) | map(attribute='entity_id') | list ) -%}
          {%- for entity in entities -%}
              {% if ( is_state_attr(entity,'device_class','opening') or is_state_attr(entity,'device_class','door') or is_state_attr(entity,'device_class','window')) %}
              {%- if loop.first or loop.last %}
                  {{ state_attr(entity,'friendly_name') }}
              {% else %}
                  {{ state_attr(entity,'friendly_name') }},
              {%- endif %}
              {%- endif %}
          {%- endfor -%}

Résultat:

Cela me donne bien les capteurs qui sont sur « on »

Maintenant je ne comprends pas comment l’intégrer pour que je puisse avoir une alerte en TTS me donnant les capteurs :

J’ai écris cela :

alias: 'Alerte capteur sur on '
description: ''
trigger:
  - platform: time
    at: '07:00'
condition:
  - condition: template
    value_template: |2-
          {% 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','opening') or is_state_attr(entity,'device_class','door') or is_state_attr(entity,'device_class','window')) %}
                    {% 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}}
              value_template: >
                {% set domain = 'binary_sensor' %}
                {% set state = 'on' %}
                {%- set entities = (states[domain] | selectattr('state','eq', state) | map(attribute='entity_id') | list ) -%}
                {%- for entity in entities -%}
                    {% if ( is_state_attr(entity,'device_class','opening') or is_state_attr(entity,'device_class','door') or is_state_attr(entity,'device_class','window')) %}
                    {%- if loop.first or loop.last %}
                        {{ state_attr(entity,'friendly_name') }}
                    {% else %}
                        {{ state_attr(entity,'friendly_name') }},
                    {%- endif %}
                    {%- endif %}
                {%- endfor -%}
action:
  - service: tts.reversotts_say
    data:
      entity_id: media_player.audio
      message: Attention capteur actif : "'{{trigger.entity_id}}'"
mode: single

Mais ca ne marche pas. Cela me dit juste « attention capteur actif »

Un peu d’aide SVP…avec le temps je vais arriver a comprendre.
merci
sébastien

La première balise sensor: indique où placer le code.

Donc c’est un code à mettre dans le fichier configuration.yaml à la suite de la clé sensor: (celle-ci ne doit pas être présente plusieurs fois, mais on l’a mets pour savoir sous qu’elle intégration mettre le code) et non directement dans l’automatisation.

Après un redémarrage, tu auras une nouvelle entité nommée sensor.tous_les_capteurs_ouvrants, et c’est celle-ci que tu utiliseras dans ton automatisation.

Dans ton cas, le déclencheur (trigger) est fait depuis la plateforme Date/Heure (time) qui ne renvoi pas d’entité (entity_id) donc la variable est vide.

Ce qui est étonnant, c’est que tu reçois la notification, cela veut dire que tu déclenches toi-même l’automatisation ? Car la condition me semble difficile à remplir.

Je reviens dès que j’ai plus de temps pour te montrer comment intégrer tout ça :+1:

Hello Clemalex,

merci :slight_smile:
Bon ca y est j’ai intégré a configuration.yaml et ca marche…merci déjà.

première étape de faite…merci
seb

Bonjour,

bon j’avance :-), j’ai trouvé cela :

service: tts.reversotts_say
data:
  entity_id: media_player.audio
  message: >-
    Le capteur suivant est actif
    {{states('sensor.tous_les_capteurs_ouvrants')}}.

Et miracle ça marche :slight_smile:
Merci de votre aide…au passage il n’y aurait pas une liste ou un site expliquant différents code utilisable?

merci et bonne semaine a vous
seb

1 « J'aime »