Récupérer la liste des périphériques wifi indisponibles

Bonjour à tous

J’ai fait une petite automatisation toute simple me permettant de contrôler à intervalles réguliers la disponibilité de mes modules shelly connectés en wifi

Cela fonctionne bien, mais j’aurai aimé dans mon message de notification, identifier les modules qui ne sont plus connectés.
Je suppose que cela est possible mais je ne vois pas comment procéder.

Merci par avance
Bonne journée

alias: Notification Wifi vérification
description: ""
trigger:
  - platform: time_pattern
    minutes: /20
condition:
  - condition: or
    conditions:
      - condition: state
        entity_id: switch.pompe_piscine_switch_0
        state: unavailable
      - condition: state
        entity_id: switch.lumiere_piscine
        state: unavailable
      - condition: state
        entity_id: switch.chauffe_eau_switch_0
        state: unavailable
      - condition: state
        entity_id: switch.pompe_piscine_switch_0
        state: unknown
      - condition: state
        entity_id: switch.lumiere_piscine
        state: unknown
      - condition: state
        entity_id: switch.chauffe_eau_switch_0
        state: unknown
action:
  - metadata: {}
    data:
      message: Des shelly sont indisponibles
      title: Vérification wifi
    action: notify.mobile_app_sm_a546b
mode: single

Tu fais un « group » avec les entités à cibler.
Puis la liste des entités sur un état recherché comme « unavailable » en sensor template :

          {%- set entities = expand('group.shelly') | selectattr('state', 'in', ['unavailable', 'unknown']) | map(attribute='name') | list -%}
            {{ entities | join(', ') }}

Le meme version compteur :

          {%- set entities = expand('group.shelly') | selectattr('state', 'in', ['unavailable', 'unknown']) | map(attribute='name') | list -%}
            {{ entities |  count }}

Bonjour @herveaurel

Je suppose que ce code est à ajouter dans mon fichier templates.yaml qui est inclus dans mon fichier configuration.yaml ?

Or dans ce fichier templates.yaml j’ai déjà des sensor

- unique_id: "tempo_time_prices"
  sensor:
    - name: "EDF Tempo Prix Actuel"
      unique_id: "current"
      device_class: 'monetary'
      unit_of_measurement: "c€/kWh"
      icon: 'mdi:cash-check'
      availability: >
        {{ not 'unavailable' in
          [
            states('sensor.rte_tempo_couleur_actuelle'),
            states('binary_sensor.rte_tempo_heures_creuses'),
          ] and not 'unknown' in
          [
            states('sensor.rte_tempo_couleur_actuelle'),
            states('binary_sensor.rte_tempo_heures_creuses'),
            states('input_number.tarif_edf_tempo_bleu_hp'),
            states('input_number.tarif_edf_tempo_bleu_hc'),
            states('input_number.tarif_edf_tempo_blanc_hp'),
            states('input_number.tarif_edf_tempo_blanc_hc'),
            states('input_number.tarif_edf_tempo_rouge_hp'),
            states('input_number.tarif_edf_tempo_rouge_hc')
          ]
        }}
      state: >
        {%- if is_state('sensor.rte_tempo_couleur_actuelle', "Bleu") %}
          {%- if is_state('binary_sensor.rte_tempo_heures_creuses', 'off') %}
            {{ states('input_number.tarif_edf_tempo_bleu_hp') | float * 100 }}
          {%- else %}
            {{ states('input_number.tarif_edf_tempo_bleu_hc') | float * 100 }}
          {%- endif %}
        {%- elif is_state('sensor.rte_tempo_couleur_actuelle', "Blanc") %}
          {%- if is_state('binary_sensor.rte_tempo_heures_creuses', 'off') %}
            {{ states('input_number.tarif_edf_tempo_blanc_hp') | float * 100 }}
          {%- else %}
            {{ states('input_number.tarif_edf_tempo_blanc_hc') | float * 100 }}
          {%- endif %}
        {%- elif is_state('sensor.rte_tempo_couleur_actuelle', "Rouge") %}
          {%- if is_state('binary_sensor.rte_tempo_heures_creuses', 'off') %}
            {{ states('input_number.tarif_edf_tempo_rouge_hp') | float * 100 }}
          {%- else %}
            {{ states('input_number.tarif_edf_tempo_rouge_hc') | float * 100 }}
          {%- endif %}
        {%- else %}
          0
        {%- endif %}
    - name: "EDF Tempo Prochain Prix"
      unique_id: "next"
      device_class: 'monetary'
      unit_of_measurement: "c€/kWh"
      icon: 'mdi:cash-clock'
      availability: >
        {{ not 'unavailable' in
          [
            states('sensor.rte_tempo_couleur_actuelle'),
            states('sensor.rte_tempo_prochaine_couleur'),
            states('binary_sensor.rte_tempo_heures_creuses'),
          ] and not 'unknown' in
          [
            states('sensor.rte_tempo_couleur_actuelle'),
            states('sensor.rte_tempo_prochaine_couleur'),
            states('binary_sensor.rte_tempo_heures_creuses'),
            states('input_number.tarif_edf_tempo_bleu_hp'),
            states('input_number.tarif_edf_tempo_bleu_hc'),
            states('input_number.tarif_edf_tempo_blanc_hp'),
            states('input_number.tarif_edf_tempo_blanc_hc'),
            states('input_number.tarif_edf_tempo_rouge_hp'),
            states('input_number.tarif_edf_tempo_rouge_hc')
          ]
        }}
      state: >
        {%- if is_state('binary_sensor.rte_tempo_heures_creuses', 'on') %}
          {%- if is_state('sensor.rte_tempo_prochaine_couleur', "Bleu") %}
            {{ states('input_number.tarif_edf_tempo_bleu_hp') | float * 100 }}
          {%- elif is_state('sensor.rte_tempo_prochaine_couleur', "Blanc") %}
            {{ states('input_number.tarif_edf_tempo_blanc_hp') | float * 100 }}
          {%- elif is_state('sensor.rte_tempo_prochaine_couleur', "Rouge") %}
            {{ states('input_number.tarif_edf_tempo_rouge_hp') | float * 100 }}
          {%- else %}
            0
          {%- endif %}
        {%- else %}
          {%- if is_state('sensor.rte_tempo_couleur_actuelle', "Bleu") %}
            {{ states('input_number.tarif_edf_tempo_bleu_hc') | float * 100 }}
          {%- elif is_state('sensor.rte_tempo_couleur_actuelle', "Blanc") %}
            {{ states('input_number.tarif_edf_tempo_blanc_hc') | float * 100 }}
          {%- elif is_state('sensor.rte_tempo_couleur_actuelle', "Rouge") %}
            {{ states('input_number.tarif_edf_tempo_rouge_hc') | float * 100 }}
          {%- else %}
            0
          {%- endif %}
        {%- endif %}

de ce que j’ai pu lire à droite et à gauche je pensais qu’en ajoutant à la suite le sensor

sensor:    
    - name: "Nombre de shelly indisponibles"
        value_template: >
          {%- set entities = expand('group.shelly_a_surveiller') | selectattr('state', 'in', ['unavailable', 'unknown']) | map(attribute='name') | list -%}
         {{ entities | join(', ') }} 

cela suffirait, mais j’ai le message d’erreur suivant :

je dois avoir une balise en trop, mais débutant avec home assistant et après plusieurs essais je n’ai pas trouvé la solution

J’ai finalement réussi…

Pour les débutants comme moi, je détaille ce que j’ai fait et donne également le lien qui m’a beaucoup aidé à m’en sortir.
J’ai également suivi la méthode de @herveaurel (merci à lui)

1 - J’ai créé un groupe des shellys que je souhaitais surveiller (paramètres/ Entrées) puis créer une Entrée. Sélectionner Groupe, dans mon cas c’est Groupe d’interrupteurs. Il suffit d’ajouter les éléments que vous souhaitez

2 - La création des templates sensor…ces derniers permettent de créer des entités personnalisées en fonction de ses besoins…ici il m’en faut 2, le nombre et la liste des noms des shelly indisponibles et la liste
Pour cela dans mon fichier sensors.yaml j’ai ajouté les lignes suivantes:

- platform: template
  sensors:
    nombre_shellys_indisponibles:
     friendly_name: Nbre Shellys indisponibles
     value_template: >-
       {%- set entities = expand('switch.shelly_a_surveiller') | selectattr('state', 'in', ['unavailable', 'unknown']) | map(attribute='name') | list -%}
       entities|count
       
- platform: template
  sensors:
    liste_shellys_indisponibles:
     friendly_name: ListeShellys indisponibles
     value_template: >-
       {%- set entities = expand('switch.shelly_a_surveiller') | selectattr('state', 'in', ['unavailable', 'unknown']) | map(attribute='name') | list -%}
       {{ entities | join(', ') }}

3- l’automatisation, j’ai opté pour un contrôle periodique

alias: Vérification Group Shelly
description: ""
trigger:
  - platform: time_pattern
    minutes: /15
condition:
  - condition: numeric_state
    entity_id: sensor.nombre_shellys_indisponibles
    above: 0
action:
  - action: notify.mobile_app_sm_a546b
    metadata: {}
    data:
      message: >-
        Les shellys suivants sont indisponibles : <br>
        {{states('sensor.liste_shellys_indisponibles') | replace('<br>','') }}
mode: single

Et enfin la vidéo qui m’a bien aidé (je la conseille à tous ceux qui commencent à mettre les mains dans le cambouis :wink:)

Bonjour,
tu utilises l’ancien format de template, un nouveau existe depuis longtemps et est recommandé.

Comme tu débutes, autant partir sur le nouveau format.

Bonjour @WarC0zes

effectivement n’ayant pas encore trop d’habitudes, autant prendre les bonnes…
Je regarderais cela demain

1 « J'aime »

Un exemple de conversion de l’ancien au nouveau format, à mettre dans ton configuration.yaml :

template:
  - sensor:
      - name: "Nbre Shellys indisponibles"
        unique_id: nombre_shellys_indisponibles
        state: >
         {%- set entities = expand('switch.shelly_a_surveiller') | selectattr('state', 'in', ['unavailable', 'unknown']) | map(attribute='name') | list -%}
         entities|count

Tu peux découper la configuration, en créant un fichier template.yaml dans le dossier /config.
Dans ton configuration.yaml, tu rajoutes la ligne template: !include template.yaml

dans le fichier template.yaml :

  - sensor:
      - name: "Nbre Shellys indisponibles"
        unique_id: nombre_shellys_indisponibles
        state: >
         {%- set entities = expand('switch.shelly_a_surveiller') | selectattr('state', 'in', ['unavailable', 'unknown']) | map(attribute='name') | list -%}
         entities|count

Bonjour @WarC0zes
Merci de m’avoir dégrossi le travail, cela m’a fait gagner du temps

donc voici la partie du fichier templates.yaml

  - sensor:
      - name: "Nbre Shellys indisponibles"
        unique_id: nombre_shellys_indisponibles
        state: >
         {%- set entities = expand('switch.shelly_a_surveiller') | selectattr('state', 'in', ['unavailable', 'unknown']) | map(attribute='name') | list -%}
         {{ entities|count|int }}
  - sensor:
    - name: "Liste Shellys indisponibles"
      unique_id: liste_shellys_indisponibles
      state: >
       {%- set entities = expand('switch.shelly_a_surveiller') | selectattr('state', 'in', ['unavailable', 'unknown']) | map(attribute='name') | list -%}
       {{ entities | join(', ') }}       

Du coup j’ai une question
Dans le tuto video en lien, les sensors sont créés dans un fichier sensor.yaml, ajouté dans le fichier de configuration de cette facon

sensor: !include sensors.yaml

et désormais cela doit être déclaré dans le fichier templates.yaml, déclaré

template: !include templates.yaml

Désormais les sensors doivent être déclarés dans le templates.yaml ?

Ensuite il me reste un petit bug que j’ai identifié, mais je n’ai pas trouvé comment le résoudre
Le sensor « nombre_shellys_indisponibles » a un état sous forme numérique

La condition « numeric_state » de mon automatisation ne doit pas être correcte, car mon entité n’a qu’un état et aucun autre attribut, et j’ai un erreur dans les logs

alias: Vérification Group Shelly
description: ""
trigger:
  - platform: time_pattern
    minutes: /15
condition:
  - condition: numeric_state
    entity_id: sensor.nombre_shellys_indisponibles
    above: 0
action:
  - action: notify.mobile_app_sm_a546b
    metadata: {}
    data:
      message: >-
        Des shellys sont indisponibles : <br>
        {{states('sensor.liste_shellys_indisponibles') | replace('<br>','') }}
mode: single

Comment faire ?
Merci

dans le template.yaml, tu dois déclarer qu’une seule fois le - sensor:

  - sensor:
      - name: "Nbre Shellys indisponibles"
        unique_id: nombre_shellys_indisponibles
        state: >
         {%- set entities = expand('switch.shelly_a_surveiller') | selectattr('state', 'in', ['unavailable', 'unknown']) | map(attribute='name') | list -%}
         {{ entities|count|int }}

      - name: "Liste Shellys indisponibles"
        unique_id: liste_shellys_indisponibles
        state: >
         {%- set entities = expand('switch.shelly_a_surveiller') | selectattr('state', 'in', ['unavailable', 'unknown']) | map(attribute='name') | list -%}
         {{ entities | join(', ') }}       

les template sensor, binary_sensor, trigger doivent être dans le template.yaml pour le nouveau format.
Par sensor.yaml, c’était l’ancien format, tu peux les supprimer quand tu les as convertis au nouveau format.

Dans le sensor.yaml, tu as d’autre intégration qui utilise ce fichier et pas que les anciens template.

ta pas besoin de time_pattern et condittion, utilise directement l’état de l’entité.
Dès que l’entité passe à 1, tu reçois la notification.

alias: Vérification Group Shelly
description: ""
trigger:
  - platform: numeric_state
    entity_id: sensor.nombre_shellys_indisponibles
    above: 0
action:
  - action: notify.mobile_app_sm_a546b
    metadata: {}
    data:
      message: >-
        Des shellys sont indisponibles : <br>
        {{states('sensor.liste_shellys_indisponibles') | replace('<br>','') }}
mode: single

Merci @WarC0zes

Le récap du coup …

1 - J’ai créé un groupe des shellys que je souhaitais surveiller (paramètres/ Entrées) puis créer une Entrée. Sélectionner Groupe, dans mon cas c’est Groupe d’interrupteurs. Il suffit d’ajouter les éléments que vous souhaitez

2 - La création des templates sensor…ces derniers permettent de créer des entités personnalisées en fonction de ses besoins…ici il m’en faut 2, le nombre et la liste des noms des shelly indisponibles et la liste
Pour cela dans mon fichier templates.yaml, déclaré dans configuration.yaml avec la ligne

  - sensor:
    - name: "Nbre Shellys indisponibles"
      unique_id: nombre_shellys_indisponibles
      state: >
       {%- set entities = expand('switch.shelly_a_surveiller') | selectattr('state', 'in', ['unavailable', 'unknown']) | map(attribute='name') | list -%}
       {{ entities | count }}
    - name: "Liste Shellys indisponibles"
      unique_id: liste_shellys_indisponibles
      state: >
       {%- set entities = expand('switch.shelly_a_surveiller') | selectattr('state', 'in', ['unavailable', 'unknown']) | map(attribute='name') | list -%}
       {{ entities | join(', ') }}         
    - name: "EDF Tempo Prix Actuel"
      unique_id: "current"
      device_class: 'monetary'
      unit_of_measurement: "c€/kWh"
      icon: 'mdi:cash-check'
      availability: >
        {{ not 'unavailable' in
          [
            states('sensor.rte_tempo_couleur_actuelle'),
            states('binary_sensor.rte_tempo_heures_creuses'),
          ] and not 'unknown' in
          [
            states('sensor.rte_tempo_couleur_actuelle'),
            states('binary_sensor.rte_tempo_heures_creuses'),
            states('input_number.tarif_edf_tempo_bleu_hp'),
            states('input_number.tarif_edf_tempo_bleu_hc'),
            states('input_number.tarif_edf_tempo_blanc_hp'),
            states('input_number.tarif_edf_tempo_blanc_hc'),
            states('input_number.tarif_edf_tempo_rouge_hp'),
            states('input_number.tarif_edf_tempo_rouge_hc')
          ]
        }}
      state: >
        {%- if is_state('sensor.rte_tempo_couleur_actuelle', "Bleu") %}
          {%- if is_state('binary_sensor.rte_tempo_heures_creuses', 'off') %}
            {{ states('input_number.tarif_edf_tempo_bleu_hp') | float * 100 }}
          {%- else %}
            {{ states('input_number.tarif_edf_tempo_bleu_hc') | float * 100 }}
          {%- endif %}
        {%- elif is_state('sensor.rte_tempo_couleur_actuelle', "Blanc") %}
          {%- if is_state('binary_sensor.rte_tempo_heures_creuses', 'off') %}
            {{ states('input_number.tarif_edf_tempo_blanc_hp') | float * 100 }}
          {%- else %}
            {{ states('input_number.tarif_edf_tempo_blanc_hc') | float * 100 }}
          {%- endif %}
        {%- elif is_state('sensor.rte_tempo_couleur_actuelle', "Rouge") %}
          {%- if is_state('binary_sensor.rte_tempo_heures_creuses', 'off') %}
            {{ states('input_number.tarif_edf_tempo_rouge_hp') | float * 100 }}
          {%- else %}
            {{ states('input_number.tarif_edf_tempo_rouge_hc') | float * 100 }}
          {%- endif %}
        {%- else %}
          0
        {%- endif %}
    - name: "EDF Tempo Prochain Prix"
      unique_id: "next"
      device_class: 'monetary'
      unit_of_measurement: "c€/kWh"
      icon: 'mdi:cash-clock'
      availability: >
        {{ not 'unavailable' in
          [
            states('sensor.rte_tempo_couleur_actuelle'),
            states('sensor.rte_tempo_prochaine_couleur'),
            states('binary_sensor.rte_tempo_heures_creuses'),
          ] and not 'unknown' in
          [
            states('sensor.rte_tempo_couleur_actuelle'),
            states('sensor.rte_tempo_prochaine_couleur'),
            states('binary_sensor.rte_tempo_heures_creuses'),
            states('input_number.tarif_edf_tempo_bleu_hp'),
            states('input_number.tarif_edf_tempo_bleu_hc'),
            states('input_number.tarif_edf_tempo_blanc_hp'),
            states('input_number.tarif_edf_tempo_blanc_hc'),
            states('input_number.tarif_edf_tempo_rouge_hp'),
            states('input_number.tarif_edf_tempo_rouge_hc')
          ]
        }}
      state: >
        {%- if is_state('binary_sensor.rte_tempo_heures_creuses', 'on') %}
          {%- if is_state('sensor.rte_tempo_prochaine_couleur', "Bleu") %}
            {{ states('input_number.tarif_edf_tempo_bleu_hp') | float * 100 }}
          {%- elif is_state('sensor.rte_tempo_prochaine_couleur', "Blanc") %}
            {{ states('input_number.tarif_edf_tempo_blanc_hp') | float * 100 }}
          {%- elif is_state('sensor.rte_tempo_prochaine_couleur', "Rouge") %}
            {{ states('input_number.tarif_edf_tempo_rouge_hp') | float * 100 }}
          {%- else %}
            0
          {%- endif %}
        {%- else %}
          {%- if is_state('sensor.rte_tempo_couleur_actuelle', "Bleu") %}
            {{ states('input_number.tarif_edf_tempo_bleu_hc') | float * 100 }}
          {%- elif is_state('sensor.rte_tempo_couleur_actuelle', "Blanc") %}
            {{ states('input_number.tarif_edf_tempo_blanc_hc') | float * 100 }}
          {%- elif is_state('sensor.rte_tempo_couleur_actuelle', "Rouge") %}
            {{ states('input_number.tarif_edf_tempo_rouge_hc') | float * 100 }}
          {%- else %}
            0
          {%- endif %}
        {%- endif %}  

        
  

3- l’automatisation, j’ai opté pour un contrôle periodique

alias: Vérification Group Shelly
description: ""
trigger:
  - platform: time_pattern
    minutes: /10
condition:
  - condition: numeric_state
    entity_id: sensor.nbre_shellys_indisponibles
    above: 0
action:
  - action: notify.mobile_app_sm_a546b
    metadata: {}
    data:
      message: >-
        Des shellys sont indisponibles : <br>
        {{states('sensor.liste_shellys_indisponibles') | replace('<br>','') }}
mode: single