[Article] Vos entités sous surveillance

Pour ne pas avoir de rupture de service ou de pertes de données, il est indispensable d’être averti rapidement si un device ou une entité critique devenait indisponible. Ce tuto vous présente comment, grâce à un BluePrint, mettre en place une automatisation de surveillance, rendant ainsi votre système plus robuste.

N’hésitez pas à poser vos questions et faire vos retours.

4 « J'aime »

Salut @Argonaute

Juste pour information.

Je n’ai pas encore lu l’intégralité de article, mais tu as un paragraphe en doublon.
(Dans importer un blueprint)

Afin de pouvoir ensuite créer une automatisation, il faut tout d'abord importer le blueprint depuis un repository Github.

Aller dans Paramètres, puis Automatisations et scènes, et enfin cliquer sur l'onglet Blueprint.

Cliquer sur le bouton en bas à droite Importer un blueprint.

Top merci, j’ai corrigé :+1:

Alors soit j’ai mal configuré, mais ce qui est dommage, c’est que cela envoi la notif, meme si aucune entité n’est indisponible. Il faudrait que cela envoie la norif que si 1 ou plusieurs entités sont indispo.

Pas mal.
Je fais la même chose sans blueprint.
Et pas de verif toutes les X min, c’est en temps réel.

J’ai créé des groupes de toutes les catégories que je souhaites surveiller :

  • plantes
  • cameras
  • zigbee
  • lumieres
  • interrupteurs
  • aspirateurs
  • lave-vaisselle
    et tellement d’autres !

J’ai créé des compteurs HS, et des sensor HS, exemple pour les aspis :

      compteur_aspi:
        friendly_name: Compteur aspi           
        value_template: >-
            {%- set entities = expand('group.aspis') | selectattr('state', 'eq', 'cleaning') | map(attribute='name') | list -%}
            {{ entities | count }}
      aspi_hs:
        friendly_name: aspi indisponible          
        value_template: >-
          {%- set entities = expand('group.aspis') | selectattr('state', 'in', ['unavailable', 'unknown']) | map(attribute='name') | list -%}
          {{ entities | join(', ') }} 

Puis j’ai fait un petit sensor template :

      systeme_avertissement:
        friendly_name: Surveillance système
        value_template: >-
            {%- set messages = [] -%}
        
            {%- set compteur = states('sensor.compteur_serrures_hs') | int(0) -%}
            {%- set sensor = states('sensor.serrures_hs')  -%}
            {% set current_time = as_timestamp(now()) %}
            {% set last_changed = as_timestamp(states.sensor.compteur_serrures_hs.last_changed) %}
            {%- if compteur > 1 and (current_time - last_changed > 600) -%}
              {%- set messages = messages + [compteur ~ ' Serrures : ' ~ sensor] -%}
            {%- elif compteur == 1 and (current_time - last_changed > 600) -%}
              {%- set messages = messages + ['Serrure : ' ~ sensor] -%}
            {%- endif -%}
        
            {%- if states('sensor.pronote_hs') and is_state('binary_sensor.vacances_scolaires_aujourdhui', 'off')%}
              {%- set messages = messages + ['Pronote : ' ~ states.sensor.pronote_hs.state] -%}
            {%- else -%}
            {%- endif -%}
        
            {%- set compteur = states('sensor.compteur_plante_hs') | int(0) -%}
            {%- set sensor = states('sensor.plante_hs')  -%}
            {%- if compteur > 1 -%}
              {%- set messages = messages + [compteur ~ ' Plantes : ' ~ sensor] -%}
            {%- elif compteur == 1 -%}
              {%- set messages = messages + ['Plante : ' ~ sensor] -%}
            {%- endif -%}
        
            {%- set compteur = states('sensor.compteur_lumieres_hs') | int(0) -%}
            {%- set sensor = states('sensor.lumiere_hs')  -%}
            {%- if compteur > 1 -%}
              {%- set messages = messages + [compteur ~ ' Lumières : ' ~ sensor] -%}
            {%- elif compteur == 1 -%}
              {%- set messages = messages + ['Lumière : ' ~ sensor] -%}
            {%- endif -%}
        
            {%- if is_state('input_boolean.noel', 'off')  %}  
            {%- else -%}
              {%- if not states('sensor.noel_hs') -%}
              {%- else -%}
                {%- set messages = messages + ['Noël : ' ~ states.sensor.noel_hs.state] -%}
              {%- endif -%}
            {%- endif -%}
        
            {%- set compteur = states('sensor.compteur_porte_hs') | int(0) -%}
            {%- set sensor = states('sensor.porte_hs')  -%}
            {%- if compteur > 1 -%}
              {%- set messages = messages + [compteur ~ ' Portes : ' ~ sensor] -%}
            {%- elif compteur == 1 -%}
              {%- set messages = messages + ['Porte : ' ~ sensor] -%}
            {%- endif -%}
        
            {%- set compteur = states('sensor.compteur_mouv_hs') | int(0) -%}
            {%- set sensor = states('sensor.mouv_hs')  -%}
            {%- if compteur > 1 -%}
              {%- set messages = messages + [compteur ~ ' Mouvements : ' ~ sensor] -%}
            {%- elif compteur == 1 -%}
              {%- set messages = messages + ['Mouvement : ' ~ sensor] -%}
            {%- endif -%}
        
            {%- if not states('sensor.tv_hs') %} 
            {%- else -%}
              {%- set messages = messages + ['TV : ' ~ states.sensor.tv_hs.state] -%}
            {%- endif -%} 
        
            {%- if not states('sensor.apple_tv_hs') %} 
            {%- else -%}
              {%- set messages = messages + ['Apple TV : ' ~ states.sensor.apple_tv_hs.state] -%}
            {%- endif -%} 
        
            {%- if not states('sensor.moustique_hs') %} 
            {%- else -%}
              {%- set messages = messages + ['Anti-moustiques : ' ~ states.sensor.moustique_hs.state] -%}
            {%- endif -%}
        
            {%- if not states('sensor.zigbee_hs') %} 
            {%- else -%}
              {%- set messages = messages + ['Zigbee : ' ~ states.sensor.zigbee_hs.state] -%}
            {%- endif -%}
        
            {%- set compteur = states('sensor.compteur_echo_hs') | int(0) -%}
            {%- set sensor = states('sensor.echo_hs')  -%}
            {%- if compteur > 1 -%}
              {%- set messages = messages + [compteur ~ ' Echos : ' ~ sensor] -%}
            {%- elif compteur == 1 -%}
              {%- set messages = messages + ['Echo : ' ~ sensor] -%}
            {%- endif -%}
        
            {%- set compteur = states('sensor.compteur_thermo_hs') | int(0) -%}
            {%- set sensor = states('sensor.thermo_hs')  -%}
            {%- if compteur > 1 -%}
              {%- set messages = messages + [compteur ~ ' Thermos : ' ~ sensor] -%}
            {%- elif compteur == 1 -%}
              {%- set messages = messages + ['Thermo : ' ~ sensor] -%}
            {%- endif -%}
        
            {%- set compteur = states('sensor.compteur_aspi_hs') | int(0) -%}
            {%- set sensor = states('sensor.aspi_hs')  -%}
            {%- if compteur > 1 -%}
              {%- set messages = messages + [compteur ~ ' Aspis : ' ~ sensor] -%}
            {%- elif compteur == 1 -%}
              {%- set messages = messages + ['Aspi : ' ~ sensor] -%}
            {%- endif -%}
        
            {%- set compteur = states('sensor.compteur_inter_hs') | int(0) -%}
            {%- set sensor = states('sensor.inter_hs')  -%}
            {%- if compteur > 1 -%}
              {%- set messages = messages + [compteur ~ ' Interrupteurs : ' ~ sensor] -%}
            {%- elif compteur == 1 -%}
              {%- set messages = messages + ['Interrupteur : ' ~ sensor] -%}
            {%- endif -%}      
        
            {%- if is_state('binary_sensor.presence_sejour_fp2', 'unavailable') -%}
              {%- set messages = messages + ['Présence FP2'] -%}
            {%- endif -%}
        
            {%- if is_state('device_tracker.arlo_sonnette', 'not_home') -%}
              {%- set messages = messages + ['Sonnette'] -%}
            {%- endif -%}
        
            {%- if states('switch.lave_vaisselle_power') == 'unavailable' or 
              states('binary_sensor.lave_vaisselle_door') == 'unavailable' -%}
              {%- set messages = messages + ['Lave-vaisselle'] -%}
            {%- endif -%}
        
            {%- if messages %}
              {{ messages | join('<br>') }}
            {%- else %}
              OK
            {%- endif %}

Et une automatisation qui envoie cette notif si ce sensor n’est pas état « OK » pendant 1min (car parfois des bricoles passent unavailable quelques secondes, ca evite d’etre embêté trop souvent pour rien :

      - service: notify.mobile_app_iphone_aurel
        data:
          title: ‼️ Appareils(s) HS
          message: |-
            {{ states('sensor.systeme_avertissement') | replace('<br>', '
            ') }}
          data:
            tag: hs
            actions:
              - action: RESTART_PONT
                title: Redémarrer le pont
                destructive: true
              - action: RESTART_HA
                title: ⚠️ Redémarrer HA
                destructive: true
              - action: RIEN
                title: Non

J’en n’ai pas sous la main mais la notif a le titre ‼️ Appareils(s) HSdonc je l’ouvre sans trop tarder, puis chaque catégorie apparait avec un retour a la ligne donc la lecture est propre, sous la forme :

:bangbang: Appareils(s) HS
Zigbee HS : Prise xxx
Lumière HS : Lampe du bureau, Véranda
Aspirateur : Wall-E

EDIT:

Peut-etre long a mettre en place la première fois, mais efficacité sans faille.

1 « J'aime »

Salut,
Normalement c’est bien le cas.

Seulement quand on force pour test l’exécution dans l’éditeur d’automatisation, la notification est toujours envoyée, même sans entité non dispo. Effectivement la condition de l’automatisation n’est pas prise en compte en exécution manuelle de test. C’est ce que tu as fais ?

Par contre, si l’automatisation se déclenche toute seule à une heure donnée, alors il n’y a bien pas de notification si aucune entité n’est indisponible.
Si tu arrives à retester en mettant une heure d’exécution proche et en laissant l’automatisation s’exécuter….

Bonjour et merci pour la création du partage du blueprint. Juste pour t’indiquer une petite faute dans le chapitre :
Enfin dans le champ message, entrer le code un texte du type "Attention, devices non disponibles : " puis à la ligne {entities} qui à l’exécution sera remplacé par la liste des noms des entités non disponibles.

C’est bien entendu {{entities}} qu’il faut lire. D’ailleurs la copie d’écran le montre bien.

Merci aussi à @herveaurel qui nous montre une autre approche. C’est top tous ces partages de connaissances et de méthodes.

2 « J'aime »

Bonjour,
J’ai utilisé la même approche que @herveaurel mais initialement c’était uniquement pour détecter si j’avais plus de 5 entités unavailable, le but étant de détecter l’arrêt de l’Addon Deconz ce qui m’arrive au plus 1 fois par an :rofl:
Bob

1 « J'aime »

Salut,
très bon article, je vais m’en inspirer.

1 « J'aime »

Super merci pour le tuto

1 « J'aime »

Bonjour @Argonaute

Comment tu rédiges ton message Telegram ?
Notamment pour {{entities}} Cela est-il réalisable en utilisant UI

Merci

Oui c’est bien {{entities}} qui retourne la liste des devices.

Il semble y avoir un pb qui interdit la rédaction du message complet avec l’UI.
Tu peux commencer à créer l’appel à la notification en mode UI avec un message bidon. Puis passer en YAML (voir ci-dessous) pour finaliser la rédaction du message complet.

1 « J'aime »

Grand merci pour ce super tuto que je viens d’intégrer à mon HA ayant doucement plusieurs dispositifs en Zigbee qui nécessitent une surveillance.

J’ai choisi la méthode 1 avec l’utilisation des étiquettes.
C’était la deuxième fois que je faisais une automatisation et première fois que j’utilisais un Blueprint. Tout a fonctionné du premier coup.

Pour ma part, je n’utilise pas encore Telegram, apprenant progressivement le fonctionnement de HA et la domotique en général. Je n’y vois donc pas encore grand intérêt par rapport à mon utilisation.
J’ai donc utilisé la notification par défaut dans HA et ai ajouté une action supplémentaire à savoir la notification sur mon appli HA iPhone. Après test, tout fonctionne parfaitement.

Merci je suis friand de ce genre de tuto plus qu’utile !

Un grand merci pour ton retour très positif !!!

J’avais développé (et adopté) la méthode 2 avant la sortie des labels avec HA 2024.4, mais je me doute que beaucoup vont préférer la méthode 1.

Telegram est plus convivial pour la famille et permet d’avoir un fil historique. Mais c’est une question de goûts et couleurs…

1 « J'aime »

Bonjour Argonaute,

Merci pour cet article très instructif.

Comme beaucoup, j’ai un problème avec les entités qui deviennent indisponibles momentanément.

Je découvre Home Assistant et forcément ses rouages me sont encore inconnus.

Home Assistant diffuse des informations dans le journal et en ce qui nous concerne il y a des messages comme « … est devenu indisponible ».
Cependant, il ne diffuse pas « … est maintenant disponible » (est-ce un réglage dans les paramètres ?)

Comme il y a un historique, ces informations sont stockées quelque part, mais où et sous quelle forme ?
Il y a bien une icône de couleur grise quand l’entité est indisponible et d’autres couleurs pour on/off, c’est bien qu’il y a déjà disponible quelque part cette information, non ?

Au moment où ont a besoin d’utiliser une entité, ne serait-il pas plus simple d’aller chercher l’état de cette entité ?

Merci de votre attention.
Bonne journée.

NB:

  • Merci à herveaurel pour son code, mais, bien qu’ayant des notions de programmation, ça dépasse mes compétences pour comprendre.
  • Est-ce que Bob pourrait montrer son code ?

Ci-dessous un sujet que j’ai ouvert avant l’apparition de ce tuto…

Salut @lente_reflexion,
Etonnant car j’ai plus d’une centaine de devices et je n’ai pas ce pb d’indisponibilités momentanées. Sur quel type de device as tu ce pb ? Dans quelle circonstance ?

En tout cas, le fait de faire le test sur des heures données et pas en permanence évitera de capter ce type de choses. Je te donc conseille d’utiliser mon BluePrint.
Autrement, il est bien possible de faire une automatisation qui teste si un état passe de unavalaible à available. Il est aussi possible de tester si une entité est unavailable depuis un certain temps uniquement.

Bonjour,

C’est presque ça que j’aimerai savoir faire…
Ca doit aussi pouvoir tester l’inverse « teste si un état passe de avalaible à unavailable … » ?

C’est presque ça que j’aimerai savoir faire…
Savoir quand ou depuis quand une entité est devenue avalaible ou unavailable .

Bonjour @Argonaute et merci pour tes solutions. Je souhaitais tester l’une d’elles mais le lien du tuto posté le 18/04 est HS. L’adresse a t elle changé?