Migration Node Red vers HA

Mon problème

Pour en apprendre plus sur les automatisation HA et pour que ma configuration sur Github soit plus « clair », je souhaiterais migrer mes quelques flow de Node Red vers HA.
J’ai considéré que ce fil de discussion n’avait pas plusieurs problèmes mais bien un seul « en apprendre plus », c’est pour cela que j’ai mis tous mes flows sur le même fil. J’espère que les modérateurs ne vont pas me tomber dessus :grin:.

Quel automatisation me conseillerez-vous pour remplacer ces flow sous HA ?

La surveillance de batteries

Je pense que cet exemple est le plus simple…, c’est pour cela que je vais commencer par celui-ci.

Lorsque le niveau de batterie de mon Control Center (Jarvis était déjà pris :grin:) est inférieur à 30%, j’envoie une notification sur mon smartphone toutes les 10 minutes tant que le niveau de batterie n’est pas revenu au dessus des 30%.

La surveillance de mon Onduleur

Depuis Node Red, je surveille l’état de mon onduleur pour être notifié par l’application HA companion sur Android.

Le sensor eaton_status_data a potentiellement 4 états :

  • OL CHRG : Branché sur secteur et batterie en charge. Etat normal du secteur EDF.
  • OB DISCHRG: Débranché du secteur, et fonctionnement sur les batteries de l’onduleur.
  • LB DISCHRG: Batterie faible, c’est normalement dans cet état qu’on lance les script d’extinctions.
  • indisponible: Sûrement lorsque le serveur UPS n’est pas joignable.

Lorsque l’état du sensor eaton_status_data est différent de OL CHRG, j’envoie une notification sur mon smartphone pour me dire que l’on passe « hors secteur ». Idem lors du retour de la fin de la panne de courant.

Mon déshumidificateur

Pour expliquer, mon déshumidificateur est branché sur une prise Ikea zigbee qui s’allume lorsque le pourcentage d’humidité est supérieure ou égale à 45% et que la fenêtre est fermée. Si la fenêtre s’ouvre ou que le taux d’humidité passe sous 45%, la prise s’éteint.

La surveillance de la Téléinfo

Bon celle-ci ne fonctionnant déjà pas sur Node Red, je me vois pas vous la détailler

En gros, je souhaiterais surveiller l’absence de retour (wifi, données, …) de mon ESP32 téléinfo, ce qui correspondrait à un plantage soit de la com entre Compteur et ESP32, soit entre ESP32 et HA.

N’hésitez pas à échanger, cette discussion est faite pour apprendre les automatisations sous HA et elle fera sûrement l’objet d’un tutoriel :grin:

Peux tu fournir les noms des entités pour chaque exemple ? Afin de faire correspondre les noms dans les déclencheurs et actions :innocent:

Avec plaisir @Clemalex :wink:

La surveillance de batteries

Le control Center : sensor.controlcenter_niveau_de_batterie
Le mobile notifié : mobile_app_sm_a530f_sg

La surveillance de mon Onduleur

L’onduleur : sensor.eaton_status_data (état normal : ‹ OL CHRG ›, état anormal : autre)
Le mobile notifié : mobile_app_sm_a530f_sg

Mon déshumidificateur

Capteur d’humidité : sensor.aqara_temp_sdb_humidity
Capteur d’ouverture de fenêtre : binary_sensor.aqara_open_sdb_contact
Prise du déshumidificateur : switch.ikea_prise_sdb

Est-ce que ça ira ? ou j’ai oublié un truc.

Je savais que ça me disait quelque chose :

Edit:

Rapidement et sans avoir fait la mise au point, ça donnerais un truc du genre :

mode: restart
alias: Gestion Onduleur
description: Notification en fonction des changements d'état de l'onduleur
trigger:
  - platform: state
    entity_id: sensor.eaton_status_data
condition: []
action:
  - choose:
      - conditions:
          - alias: "Etat de l'onduleur : sur batterie"
            condition: state
            entity_id: "sensor.eaton_status_data"
            state: "OB DISCHRG"
        sequence:
          - service: notify.mobile_app_sm_a530f_sg
            data:
              message: >-
                ⚠️ Détection ⚡ Coupure de Courant :
                {{(now()|string).split('.')[0]}}
          - service: persistent_notification.create
            data:
              message: '⚠️ Détection : {{(now()|string).split(''.'')[0]}}'
              title: "⚡ Coupure de Courant \U0001F50B"
              notification_id: '{{ (range(1, 9999)|random) }}'
      - conditions:
          - alias: "Etat de l'onduleur : Batterie critique"
            condition: state
            entity_id: "sensor.eaton_status_data"
            state: "LB DISCHRG"
        sequence:
          - service: notify.mobile_app_sm_a530f_sg
            data:
              message: >-
                ⚠️ Onduleur ⚡ Batterie Critique :
                {{(now()|string).split('.')[0]}}
          - service: persistent_notification.create
            data:
              message: '⚠️ Onduleur : {{(now()|string).split(''.'')[0]}}'
              title: "⚡ Batterie Critique \U0001F50B"
              notification_id: '{{ (range(1, 9999)|random) }}'
      - conditions:
          - alias: "Etat de l'onduleur : Batterie critique"
            condition: state
            entity_id: "sensor.eaton_status_data"
            state: "unavailable"
        sequence:
          - service: notify.mobile_app_sm_a530f_sg
            data:
              message: "ℹ️ Onduleur ⚡ Perte de l'onduleur \U0001F50C : {{(now()|string).split('.')[0]}}"
          - service: persistent_notification.create
            data:
              message: 'ℹ️ Onduleur : {{(now()|string).split(''.'')[0]}}'
              title: "⚡ Perte de l'onduleur \U0001F50C"
              notification_id: '{{ (range(1, 9999)|random) }}'
alias: _hacf_node_red_vers_yaml
description: ''
trigger:
  - platform: state
    entity_id: sensor.controlcenter_niveau_de_batterie
condition: []
action:
  - choose:
      - conditions:
          - condition: numeric_state
            entity_id: sensor.controlcenter_niveau_de_batterie
            below: '30'
        sequence:
          - repeat:
              while:
                - condition: numeric_state
                  entity_id: sensor.controlcenter_niveau_de_batterie
                  below: '30'
              sequence:
                - service: persistent_notification.create
                  data:
                    message: 'En dessous de 30 {{states("sensor.controlcenter_niveau_de_batterie")|int}}'
                - delay:
                    hours: 0
                    minutes: 0
                    seconds: 5
                    milliseconds: 0
          - condition: not
            conditions:
              - condition: state
                entity_id: "sensor.controlcenter_niveau_de_batterie"
                state: "unknown"
              - condition: state
                entity_id: "sensor.controlcenter_niveau_de_batterie"
                state: "unavailable"
          - service: persistent_notification.create
            data:
              message: 'retour au dessus de 30 ({{states("sensor.controlcenter_niveau_de_batterie")|int}})'
    default: []
mode: single

Je peux expliquer ce que tu veux :+1:
Mais en gros :

  1. On déclenche sur changement d’état de sensor.controlcenter_niveau_de_batterie
    1.1 Si l’état est en dessous de 30
    1.1.1 on boucle (repeat) sur la notification (avec un delai entre chaque notification) tant que (while) l’état est en dessous de 30
    1.1.2 On vient de sortir de la boucle donc on vérifie que l’entité sensor.controlcenter_niveau_de_batterie est toujours valide (condition: not et les state)
    1.1.3 La condition précédente est valide donc l'action de notification est exécutée (si la condition précédente renvoi faux (false) les actions en aval ne sont pas exécutées)

Le fait de notifier sur un retour n’était pas demandé, mais je trouve intéressant de savoir que la batterie est revenue au dessus du seuil…

alias: _node_red_vers_yaml
description: ''
trigger:
  - platform: state
    entity_id: binary_sensor.aqara_open_sdb_contact
  - platform: state
    entity_id: sensor.aqara_temp_sdb_humidity
condition: []
action:
  - choose:
      - conditions:
          - condition: or
            conditions:
              - condition: state
                entity_id: binary_sensor.aqara_open_sdb_contact
                state: 'on'
              - condition: numeric_state
                entity_id: sensor.aqara_temp_sdb_humidity
                below: '45'
        sequence:
          - condition: state
            entity_id: switch.ac
            state: 'on'
          - service: switch.turn_off
            target:
              entity_id: switch.ikea_prise_sdb
      - conditions:
          - condition: numeric_state
            entity_id: sensor.aqara_temp_sdb_humidity
            above: '44'
        sequence:
          - condition: state
            entity_id: switch.ikea_prise_sdb
            state: 'off'
          - service: switch.turn_on
            target:
              entity_id: switch.ikea_prise_sdb
    default: []
mode: single

L’automatisation se déclenche sur un changement d’état ou d’attribut du capteur d’humidité ou du capteur d’ouverture :

  1. Si la porte est ouverte OU si l’humidité est en dessous de 45
    1.1 Si la prise est allumée, on l’éteint (je préfère vérifier si la prise est allumée car cela évite d’envoyer des trames sur le réseau pour rien)
  2. Si l’humidité est supérieur à 44 (donc à partir de 45)
    2.1 Si la prise est éteinte on l’allume (idem, je préfère ne pas surcharger le réseau si la prise est déjà allumée)

La fonction choose vérifie la première condition qu’elle rencontre et si elle retourne Vrai, elle ne vérifie pas les suivantes, et si la première condition retourne Faux, elle passe à la suivante, et ainsi de suite, cela permet de regrouper les automatisations partagent les même déclencheur.

Toujours pareil, ne pas hésiter de poser des questions.

Enfin, un peu de temps pour mettre en place ces automations :grin:

1er petit soucis :
Je n’arrive pas à voir la nouvelle automation « Notification sur batterie faible du Control Center » contenue dans le fichier automation/list/control_center_notify.yaml alors que je vois bien les modifications effectuées dans le fichier automation/list/reboot_notify.yaml (Ce qui veut dire que le précédent fichier est « joignable »).

Les 3 premières automations ont été définie via l’UI et sont donc dans le fichier automations.yaml.

Le détail de ma configuration :

automations.yaml
- id: '1610520463290'
  alias: Motion-activated Light
  description: Gestion lumière Cellier
  use_blueprint:
    path: homeassistant/motion_light.yaml
    input:
      motion_entity: binary_sensor.aqara_motion_cellier_occupancy
      light_target:
        device_id:
        - 6d0baafc7a73c4318b1761f0a30a97c9
        - 6027bf7b364ffc48ed016be77100af3a
      no_motion_wait: '0'
- id: '1611498580781'
  alias: Arrêt Déshumidificateur
  description: ''
  trigger:
  - platform: state
    entity_id: sensor.aqara_temp_sdb_humidity
    from: '0'
    to: '45'
    for: 30s
  condition: []
  action:
  - type: turn_off
    device_id: 7bbbad02252e5109ebf6faa7c80c683d
    entity_id: switch.ikea_prise_sdb
    domain: switch
  mode: single
- id: '1611498729349'
  alias: Démarrer Déshumidificateur
  description: ''
  trigger:
  - platform: state
    entity_id: sensor.aqara_temp_sdb_humidity
    from: '45'
    to: '100'
    for: 30s
    attribute: humidity
  condition: []
  action:
  - type: turn_on
    device_id: 7bbbad02252e5109ebf6faa7c80c683d
    entity_id: switch.ikea_prise_sdb
    domain: switch
  mode: single
configuration.yaml
homeassistant:
  name: Maison
  latitude: !secret homeassistant_latitude
  longitude: !secret homeassistant_longitude
  elevation: !secret homeassistant_elevation
  unit_system: metric
  time_zone: !secret homeassistant_time_zone
  # external_url: !secret homeassistant_url_externe
  internal_url:  !secret homeassistant_url_interne

  packages: !include_dir_named integrations

frontend:
  extra_module_url:
    - /hacsfiles/custom-sidebar/custom-sidebar.js
integrations/automation.yaml
#
# https://www.home-assistant.io/docs/automation/
#
# This include is for the automations editor/UI
automation ui: !include ../automations.yaml
automation split: !include_dir_merge_list ../automations/list
automation/list/control_center_notify.yaml
#
# Notification batterie faible sur Control Center
#
- mode: single
  alias: "Notification sur batterie faible du Control Center"
  description: "Notification sur batterie faible sur Control Center"
  trigger:
    - platform: state
      entity_id: ../triggers/state_control_center.yaml
  condition: []
  action:
    - choose:
        - conditions:
            - !include ../conditions/control_center_battery_below_30.yaml
          sequence:
            - repeat:
                while:
                  - !include ../conditions/control_center_battery_below_30.yaml
                sequence:
                  - service: script.notify_sm_a530f_sg
                    data: !include ../messages/low_battery.yaml
                  - delay:
                      hours: 0
                      minutes: 0
                      seconds: 5
                      milliseconds: 0
            - condition: not
              conditions:
                - !include ../conditions/control_center_unknown.yaml
                - !include ../conditions/control_center_unavailable.yaml
            - service: persistent_notification.create
              data:
                message: 'retour au dessus de 30 ({{states("sensor.controlcenter_niveau_de_batterie")|int}})'
      default: []
automation/list/reboot_notify.yaml
#
# Notification au redemarrage de HA core
#
- mode: restart
  alias: "Notification au redemarrage de Home Assistant - 2"
  description: Envoie une notification sur HA Companion à chaque redemarrage de HA core
  id: 75093260-3086-11eb-8655-7fbd7c468bda
  condition: []
  trigger:
    - !include ../triggers/start_ha.yaml
  action:
    - service: script.notify_sm_a530f_sg
      data: !include ../messages/ha_start.yaml

Je n’arrive pas à trouver le problème, je pense que ça pourrait venir du fichier integrations/automation.yaml, plus précisément de la ligne :

automation split: !include_dir_merge_list ../automations/list

Suis-je bien sur la bonne piste ?

Personnellement, je trouve que tu vas trop loin dans le découpage, ce qui rend la lecture bien plus complexe pour rien… :innocent:

Je dis ‹ pour rien › car partager sa configuration pour ne pas dupliquer du code, pouvoir l’utiliser et le maintenir plus facilement, ça ok… Mais là, dans ces cas précis, j’en vois pas l’intérêt…

Ce n’est que mon avis. :innocent:

Concernant ta prise ikea et ton humidificateur, ça ne fonctionnera jamais je pense… (regarde mon automatisation et la tienne et relis la documentation sur les clés from et to:blush:)
si tu vois pas, n’hésite pas

Le premier test à faire dans ces conditions, c’est de remplacer le contenu de l’automatisation que tu ne vois pas par le contenu d’une automatisation que tu vois… Cela permettra de déterminer s’il y a un problème de lecture de fichiers ou simplement un problème dans l’automatisation, en plus d’aller voir dans les outils de développement si l’automatisation est présente (Onglet ETATS)

@Clemalex, effectivement mon découpage des fichiers de configuration est « un peu » extrême :grin: mais j’ai dans l’optique que j’ai petit morceau peu être réutilisé une autre fois et je ne veux pas avoir à modifié à 2 endroits. Et, je suis d’accord avec toi, c’est un peu dur à lire …

Voici donc la comparaison entre un flow NodeRed et la configuration dans HA.

La surveillance de batteries

Sous Nodered

Le flow complet

Le noeud events: state « Control Center »

Le noeud delay « Limite message »

image

Le noeud call service « Notif. Batterie faible Control Center »

Sous Home Assistant

Le fichier configuration.yaml

L’appel à l’automation ce fait via le fichier configuration.yaml puisque c’est le fichier unique, un fichier pour les gouverner tous :grin:

configuration.yaml
homeassistant:
  ...
  packages: !include_dir_named integrations
...

l’appel à la directive packages permet de regrouper la configuration de différents composants (ex: automation, sensor, bdd, freebox, etc. ). Vous pouvez ainsi séparer vos fichiers de configuration pour que chaque fichier regroupe les informations de configuration d’un thème.
voir la documentation officiel de packages pour plus d’informations.

La directive !include_dir_named permet d’inclure à l’emplacement de son utilisation le contenu des fichiers listés dans un répertoire. Dans mon cas, tous les fichiers du répertoire integrations.
voir la documentation officiel de !include_dir_named pour plus d’informations.

Le fichier integrations/automation.yaml

Ce fichier me permet d’inclure dans les automatisations les automations créées par l’IHM et celle créées par les fichiers de configuration.

integrations/automation.yaml
#
# https://www.home-assistant.io/docs/automation/
#
# This include is for the automations editor/UI
automation: !include ../automations.yaml
automation split: !include_dir_merge_list ../automations/list

automation: !include ../automations.yaml permet d’inclure les automations crées par l’IHM

automation split: !include_dir_merge_list ../automations/list permet d’inclure tous les fichiers du répertoire ../automations/list comme une liste au niveau de automation split:. C’est par cette directive que je vais appeler l’automation qui nous intéresse.

Le fichier automations/list/control_center_notify.yaml

automations/list/control_center_notify.yaml
# Notification batterie faible sur Control Center
# Une notification est envoyée toutes les 10 minutes
# tant que la charge de la batterie est inférieure à 30%
- mode: single
  alias: "Notification sur batterie faible du Control Center"
  description: "Notification sur batterie faible sur Control Center"
  trigger:
    # Evènement : état du Control Center
    - platform: state
      entity_id: sensor.controlcenter_niveau_de_batterie
  condition: []
  action:
    - choose:
        - conditions:
            # Condition : Batterie du Control Center inférieure à 30%
            - alias: "Batterie du Control Center inférieure à 30%"
              condition: numeric_state
              entity_id: sensor.controlcenter_niveau_de_batterie
              below: 30
          sequence:
            - repeat:
                while:
                  # Condition : Batterie du Control Center inférieure à 30%
                  - alias: "Batterie du Control Center inférieure à 30%"
                    condition: numeric_state
                    entity_id: sensor.controlcenter_niveau_de_batterie
                    below: 30
                sequence:
                  - service: script.notify_sm_a530f_sg
                    data: 
                      # Message : Batterie faible sur Control Center
                      title: 'Control Center'
                      message: >-
                        ⚠️ Control Center ⚡ Batterie faible !
                  - delay:
                      hours: 0
                      minutes: 10
                      seconds: 0
                      milliseconds: 0
            - condition: not
              conditions:
                  # Condition : Batterie du Control état inconnu
                - alias: "Batterie du Control état inconnu"
                  condition: state
                  entity_id: sensor.controlcenter_niveau_de_batterie
                  state: "unknown"
                # Condition : Batterie du Control état indisponible
                - alias: "Batterie du Control état indisponible"
                  condition: state
                  entity_id: sensor.controlcenter_niveau_de_batterie
                  state: "unavailable"
      default: []
  • mode: single
    permet de contrôler ce qui se passe lorsque l’automatisation est déclenchée alors que les actions sont toujours en cours d’exécution depuis un déclenchement précédent. Ici single ne relance pas l’automation si elle est déjà lancée (pour plus de précision).

  • alias: "Notification sur batterie faible du Control Center"
    l’alias définit le texte qui sera visible dans le menu Automatisations de HA (Menu latéral, cliquez sur Configuration puis Automatisations).

  • trigger:
        # Evènement : état du Control Center
        - platform: state
          entity_id: sensor.controlcenter_niveau_de_batterie
    

    Ce bloc définit à partir de quel entité surveillée l’automatisation va pouvoir être déclenché. Si seulement entity_id est renseigné, le déclenchement aura lieu pour tous les changements d’état ou attributs. C’est l’état (via state) du capteur « niveau de batterie du Control Center » (via entity_id) qui sera surveillé (pour plus de précision).

  • action:
    L’action d’une règle d’automatisation est ce qui est exécuté lorsqu’une règle se déclenche (pour plus de précision).

  • choose:
    Cette action vous permet de sélectionner une séquence d’autres actions dans une liste de séquences. L’imbrication est entièrement prise en charge (pour plus de précision).

  • - conditions:
        # Condition : Batterie du Control Center inférieure à 30%
        - alias: "Batterie du Control Center inférieure à 30%"
          condition: numeric_state
          entity_id: sensor.controlcenter_niveau_de_batterie
          below: 30
    

    Ce bloc définit à partir de quel condition le bloc action va pouvoir être déclenché. C’est la valeur de l’état (via numéric_state) du capteur « niveau de batterie du Control Center » (via entity_id) qui lorsque qu’elle sera inférieure (vai below) à 30 déclenchera la sequence suivante (pour plus de précision).

  • sequence
    Cette directive devrait permettre d’exécuter les actions qui sont définies sous ce bloc si la condition précédente est vrai (cette définition est à valider car je n’ai pas trouver de documentation officielle sur cette directive).

  • repeat
    Cette directive devrait permettre de répéter les actions qui sont définies sous ce bloc tant que la condition contenue sous le while est vrai (pour plus de précision).

  • while:
      # Condition : Batterie du Control Center inférieure à 30%
      - alias: "Batterie du Control Center inférieure à 30%"
        condition: numeric_state
        entity_id: sensor.controlcenter_niveau_de_batterie
        below: 30
    

    Ce bloc définit à partir de quel condition le bloc repeat devra être répété. C’est la valeur de l’état (via numeric_state) du capteur « niveau de batterie du Control Center » (via entity_id) qui tant qu’elle sera inférieure (vai below) à 30 déclenchera la sequence suivante (pour plus de précision).

  • sequence:
      - service: script.notify_sm_a530f_sg
        data: 
          # Message : Batterie faible sur Control Center
          title: 'Control Center'
          message: >-
             ⚠️ Control Center ⚡ Batterie faible !
      - delay:
          hours: 0
          minutes: 10
          seconds: 0
          milliseconds: 0
    

    Ce bloc définit les actions qui seront exécuter dans que la directive while sera vrai. Ici on appellera (via service) un script (via script.) qui enverra une notification sur le mobile. Nous verrons en détail plus loin le script notify_sm_a530f_sg.
    Cette exécution du script sera limitée par la directive delay qui permet de n’exécuter le service que toutes les 10 minutes ici (via minutes: 10).

  • - condition: not
      conditions:
          # Condition : Batterie du Control état inconnu
        - alias: "Batterie du Control état inconnu"
          condition: state
          entity_id: sensor.controlcenter_niveau_de_batterie
          state: "unknown"
        # Condition : Batterie du Control état indisponible
        - alias: "Batterie du Control état indisponible"
          condition: state
          entity_id: sensor.controlcenter_niveau_de_batterie
          state: "unavailable"
    

    Ce bloc permet de ne pas exécuter (via condition: not) le bloc sequence qui est a son niveau si les états (via state) du capteur « niveau de batterie du Control Center » (via entity_id) sont unknown ou unavailable.

Le fichier scripts/notify_sm_a530f_sg.yaml

scripts/notify_sm_a530f_sg.yaml
#
# Script de notification sur A8 (Sylvain)
#
notify_sm_a530f_sg:
  description: 'Envoi une notification'
  fields:
    title:
      description: 'Le titre de la notification'
      example: 'L''état a changé'
    message:
      description: 'Le contenu du message'
      example: 'La lampe est allumée !'
  sequence:
    - service: notify.mobile_app_sm_a530f_sg
      data:
        title: "{{ title }}"
        message: "{{ message }}"
  • notify_sm_a530f_sg:
    correspond au nom du script. C’est ce nom que l’on retrouvera dans le menu Scripts de HA (Menu latéral, cliquez sur Configuration puis Scripts).

  • fields:
    Cette directive va définir les champs utilisé par le script. Dans mon cas title qui définira le titre de la notification et message qui définira le contenu du message de la notification.

  • sequence:
    Cette directive va définir les actions que le script va effectuer. Dans mon cas l’appel à un service

  • - service: notify.mobile_app_sm_a530f_sg
      data:
        title: "{{ title }}"
        message: "{{ message }}"
    

    Ce bloc va faire appel au service de notification (via notify.) de l’appareil mobile_app_sm_a530f_sg. Cette notification aura pour titre le contenu du champ title défini à chaque appel à ce script et pour message le contenu du champ message.

Voilà pour l’explication très détaillée d’un exemple de migration d’un flow NodeRed vers les automatisations Home Assistant.
J’espère que ces explications sur les automatisations vous permettront des mieux vous en sortir sur HA et ses fichiers de configuration :wink:

Un GRAND MERCI à @Clemalex pour son aide sur les automatisations sous HA :raised_hands:

Mise à jour effectuée suite au message et message de précision de @Clemalex

Ah j’oubliais, vous pouvez avoir accès à ma configuration yaml sur mon Github :

Attention, j’ai poussé à l’extrême le découpage des fichiers :grin:

Non, c’est l’entité qui est surveillée si tu renseignes seulement l’entity_id

If only entity_id is given, the trigger will fire for all state changes, even if only state attributes change.

Traduit par

Si seulement entity_id est renseigné, le déclenchement aura lieu pour tous les changements d’état ou attributs.

Ici : https://www.home-assistant.io/docs/scripts/#repeat-a-group-of-actions

Si j’ai bien compris la documentation du State trigger, il faudrait que je liste dans le bloc trigger tous les changements d’état que je souhaite surveiller ?

Ce qui donnerait pour le bloc trigger: :

  trigger:
    - platform: state
      entity_id: binary_sensor.aqara_open_sdb_contact
    - platform: state
      entity_id: sensor.aqara_temp_sdb_humidity
      from: 45
      to: 44
    - platform: state
      entity_id: sensor.aqara_temp_sdb_humidity
      from: 44
      to: 45

Cette définition des états indique que je souhaite surveiller :

  • le capteur de contact et son passage de on => off et off => on
  • le capteur d’humidité et son passage de 45 => 44 et 44 => 45

Est-ce bien ce qui doit être fait ?

Oui, c’est ce que fait le code, mais quid de l’utilité ?

Non ! Toujours pas !
A relire : Migration Node Red vers HA - #16 par Clemalex
Je viens d’éditer et de mettre en gras…
:wink:

Tu devrais faire un tour plutôt du côté de numeric_state :

Le fonctionnement est différent…est bien plus proche de la réalité avec des seuils et non des valeurs fixes.

@Clemalex, en suivant tes indications et la doc officielle sur l’action choose, j’ai obtenu ceci que j’ai aussi simplifier :

#
# Gestion de la déshumidification de la salle de bains
#
- mode: single
  alias: "Gestion de la déshumidification"
  description: "Gestion de la déshumidification de la salle de bains"
  trigger:
    - platform: state
      entity_id: binary_sensor.aqara_open_sdb_contact
    - platform: numeric_state
      entity_id: sensor.aqara_temp_sdb_humidity
  action:
    - alias: "Turn on deshumifier when contact is on, humidity is above 45 and switch is off"
      choose:
        - alias: "Contact is on, humidity is above 45 and switch is off"
        - conditions: >
            {{
              is_state('binary_sensor.aqara_open_sdb_contact', 'on') and
              sensor.aqara_temp_sdb_humidity > 45 and
              is_state('switch.ikea_prise_sdb', 'off')
            }}
          sequence:
            - alias: "Turn on deshumifier"
              service: switch.turn_off
              target:
                entity_id: switch.ikea_prise_sdb
      default:
        - alias: "Turn off deshumifier"
          service: switch.turn_on
          target:
            entity_id: switch.ikea_prise_sdb

Je me suis rendu compte que l’algo de fonctionnement de la prise du déshumidificateur est plus simple :
Si l’humidité est supérieure à 45% et que la fenêtre est fermée et que la prise est éteinte alors allumer la prise sinon dans tous les autres cas éteindre la prise.

Si tu penses que cette automation correspond à ce que j’attend, je vais essayer de transformer le bloc conditions qui « n’est pas écrit complétement dans le langage HA yaml » :grin:

Tu as l’inverse non ?

Oui, la logique me parait bonne :wink:

Tu peux tout à faut garder le code Template (mais comme toi, je préfère le click&go).
Pour celui qui veut minimiser encore plus ton code, je pense que ceci devrait le faire (à tester car pas mis au point)

#
# Gestion de la déshumidification de la salle de bains
#
- mode: single
  alias: "Gestion de la déshumidification"
  description: "Gestion de la déshumidification de la salle de bains"
  trigger:
    - platform: state
      entity_id: binary_sensor.aqara_open_sdb_contact
    - platform: numeric_state
      entity_id: sensor.aqara_temp_sdb_humidity
  action:
    - service: >
        {% set person = trigger.entity_id.split('.')[1] | capitalize %}
        {% if is_state('binary_sensor.aqara_open_sdb_contact', 'on') and sensor.aqara_temp_sdb_humidity > 45 and is_state('switch.ikea_prise_sdb', 'off') %}
        switch.turn_on
        {% else %}
        switch.turn_off
        {% endif %}
      target:
        entity_id: switch.ikea_prise_sdb

Documentation : Automation trigger variables - Home Assistant

@Clemalex, je sèche…
Voici ce que j’ai testé et le résultat :

#
# Gestion de la déshumidification de la salle de bains
#
- mode: single
  alias: "Gestion de la déshumidification contact"
  description: "Gestion de la déshumidification de la salle de bains"
  trigger:
    - platform: state
      entity_id: binary_sensor.aqara_open_sdb_contact
  action:
    - alias: "Turn on deshumifier when contact is on, humidity is above 45 and switch is off"
      choose:
        - conditions:
              - condition: state
                entity_id: binary_sensor.aqara_open_sdb_contact
                state: 'off'
          sequence:
            - service: switch.turn_on
              target:
                entity_id: switch.ikea_prise_sdb
      default:
        - service: switch.turn_off
          target:
            entity_id: switch.ikea_prise_sdb

Ce que cela doit faire :

  • Lorsque la fenêtre s’ouvre le déshumidificateur doit s’arrêter et doit redémarrer lorsque la fenêtre est fermée.

résultat :

  • ça fonctionne pas complètement comme je le souhaites.
    Lorsque je redémarres HA, la fenêtre est fermée mais le déshumidificateur ne démarre pas.
    J’ouvre la fenêtre, puis je la referme, le déshumidificateur s’allume puis s’arrête lorsque je l’ouvre.
    C’est l’initialisation au démarrage de HA qui n’est pas faite. Comment faire ?

Mes essais en ajoutant le capteur d’humidité :

#
# Gestion de la déshumidification de la salle de bains
#
- mode: single
  alias: "Gestion de la déshumidification"
  description: "Gestion de la déshumidification de la salle de bains"
  trigger:
    - platform: state
      entity_id: binary_sensor.aqara_open_sdb_contact
    - platform: numeric_state
      entity_id: sensor.aqara_temp_sdb_humidity
      above: 45
  action:
    - alias: "Turn on deshumifier when window is closed (contact is off), humidity is above 45 and switch is off"
      choose:
        - conditions:
          - condition: and
            conditions:
              - condition: state
                entity_id: binary_sensor.aqara_open_sdb_contact
                state: 'off'
              - condition: numeric_state
                entity_id: sensor.aqara_temp_sdb_humidity
                above: 45
              - condition: state
                entity_id: switch.ikea_prise_sdb
                state: 'off'
          sequence:
            - service: switch.turn_on
              target:
                entity_id: switch.ikea_prise_sdb
      default:
        - service: switch.turn_off
          target:
            entity_id: switch.ikea_prise_sdb

Ce que cela doit faire :

  • Si la fenêtre est fermée et l’humidité est supérieure à 45 et la prise est éteinte
    • le déshumidificateur doit s’allumer.
  • Si la fenêtre s’ouvre
    • le déshumidificateur doit s’éteindre.
      Si la fenêtre se ferme
    • le déshumidificateur doit se rallumer si l’humidité est supérieure à 45.
  • Si l’humidité descend en dessous de 45
    • le déshumidificateur doit s’éteindre.
  • Si l’humidité remonte au dessus de 45
    • le déshumidificateur doit se rallumer si la fenêtre est fermée.

résultat :

  • données au démarrage :
    • contact : off (fenêtre fermée)
    • humidity : 45.19
    • switch : off (prise éteinte)
  • Je démarre l’automation => rien alors que l’humidité étant au dessus de 45, la fenêtre étant fermée et la prise étant éteinte, cela devra allumer la prise.
  • si je change par les outils de dev la valeur de humidity à :
    • 47 : rien
    • 43 : rien
    • 45.19 (valeur du capteur) : il s’allume :thinking:
    • 43 : rien
    • 45.19 (valeur du capteur) : il s’éteint :thinking: :thinking:

Je m’y perd …

Hihihihihi… :innocent: :blush:

Et oui, il fallait que tu le découvres seul mon jeune padawan

Pour les automatisations que tu souhaites voir fonctionner tout le temps, il faut ajouter un déclenchement sur le temps (un déclenchement state sur sensor.time par exemple declenchera l’automatisation toutes les minutes et c’est les conditions qui conditionnent les actions…)

Sinon dans ton cas précis de ton automatisation, l’augmentation de l’humidité doit suffire car dès la prochaine augmentation ça declenchera l’automatisation (en théorie car apparemment… :innocent:) et donc il te faut juste t’assurer que si HA redémarre il déclenche l’automatisation (et tes conditions feront le reste) et pour ça c’est un évènement (événement au démarrage)

Peut être que le fait de taper 47 envoit un texte (string) et non un nombre…

Essaie la prochaine fois 47.00 car ton déclencheur attends un nombre…

AH AH !! J’ai trouvé !!! :champagne:

Il fallait que je surveilles les deux sens du passage du seuil d’humidité.

Voici le code qui fonctionne :

#
# Gestion de la déshumidification de la salle de bains
#
- mode: single
  alias: "Gestion de la déshumidification"
  description: "Gestion de la déshumidification de la salle de bains"
  trigger:
    - platform: state
      entity_id: binary_sensor.aqara_open_sdb_contact
    - platform: numeric_state
      entity_id: sensor.aqara_temp_sdb_humidity
      above: 45
    - platform: numeric_state
      entity_id: sensor.aqara_temp_sdb_humidity
      below: 45
  action:
    - alias: "Turn on deshumifier when window is closed (contact is off), humidity is above 45 and switch is off"
      choose:
        - conditions:
          - condition: and
            conditions:
              - condition: state
                entity_id: binary_sensor.aqara_open_sdb_contact
                state: 'off'
              - condition: numeric_state
                entity_id: sensor.aqara_temp_sdb_humidity
                above: 45
              - condition: state
                entity_id: switch.ikea_prise_sdb
                state: 'off'
          sequence:
            - service: switch.turn_on
              target:
                entity_id: switch.ikea_prise_sdb
      default:
        - service: switch.turn_off
          target:
            entity_id: switch.ikea_prise_sdb

Explications des blocs :

  • mode: single

    permet de contrôler ce qui se passe lorsque l’automatisation est déclenchée alors que les actions sont toujours en cours d’exécution depuis un déclenchement précédent. Ici single ne relance pas l’automation si elle est déjà lancée (pour plus de précision).

  • alias: "Gestion de la déshumidification"

    l’alias définit le texte qui sera visible dans le menu Automatisations de HA (Menu latéral, cliquez sur Configuration puis Automatisations).

  • trigger:
      - platform: state
        entity_id: binary_sensor.aqara_open_sdb_contact
      - platform: numeric_state
        entity_id: sensor.aqara_temp_sdb_humidity
        above: 45
      - platform: numeric_state
        entity_id: sensor.aqara_temp_sdb_humidity
        below: 45
    

    Ce bloc définit à partir de quel entité surveillée l’automatisation va pouvoir être déclenchée.
    Ici, nous allons surveiller :

    • un capteur d’ouverture que ne peut avoir comme état que on (fenêtre ouverte) ou off (fenêtre fermée). platform sera donc de type state.
    • un seuil d’un capteur d’humidité < à 45% et > à 45%. Nous surveillerons donc les deux événements le passage de 44.xxxxxx à 45.xxxxxx par la condition above: 45 et le passage inverse de 45.xxxxxx à 44.xxxxxx via la condition below: 45. Cette valeur étant numérique, elle sera définit par condition: numeric_state
  • choose:
    permettra de définir, dans mon cas, deux actions possibles :

    • Une définie par le bloc conditions:
    • L’autre par défaut, via la directive default:, si la condition n’est pas respectée.
  •         - condition: and
              conditions:
                - condition: state
                  entity_id: binary_sensor.aqara_open_sdb_contact
                  state: 'off'
                - condition: numeric_state
                  entity_id: sensor.aqara_temp_sdb_humidity
                  above: 45
                - condition: state
                  entity_id: switch.ikea_prise_sdb
                  state: 'off'
    

    Va définir 3 conditions à respecter pour déclencher l’action définie par le mot clé séquence qui suivra. Ces 3 conditions devront être respectées en même temps à cause de condition: and. Les 3 conditions sont :

    • Le capteur de contact binary_sensor.aqara_open_sdb_contact devra avoir son état à ‹ off › (state: 'off'). Ce qui définit la fenêtre fermée, c’est pas très parlant mais à force d’ouvrir/fermer la fenêtre, c’est ce que j’ai trouvé.
    • Le capteur d’humidité qui devra être au dessus de 45 above: 45
    • L’état de la prise qui devra être à ‹ off › (prise éteinte) state: 'off' (si elle est déjà allumée, ça ne sert à rien de la rallumer :grin:)
  •         sequence:
              - service: switch.turn_on
                target:
                  entity_id: switch.ikea_prise_sdb
    

    Cette action va exécuter le service pour allumer service: switch.turn_on la prise Ikea entity_id: switch.ikea_prise_sdb

  •     default:
          - service: switch.turn_off
            target:
              entity_id: switch.ikea_prise_sdb
    

    Ce bloc va définir l’action par défaut à exécuter si les conditions du bloc choose: n’ont pas été respectées. Dans mon cas l’exécution du service pour éteindre service: switch.turn_off la prise Ikea entity_id: switch.ikea_prise_sdb.

Et comme à chaque fois, un GRAND MERCI à @Clemalex pour ton aide :raised_hands:
Ça commence à rentrer, c’est bien !