Gestion des volets sous Node-Red en fonction du soleil, avec offsets paramétrables

TUTO gestion des volets roulants sous Home Assistant via Node-Red

Introduction.

Je possède chez moi des volets roulants commandés pour la plupart par des ESP8266 (Electrodragon en l’ocurrence, d’autres en Zigbee). L’idée initiale était de pouvoir faire en sorte que les volets s’ouvrent et se ferment automatiquement en fonction du lever et du coucher du soleil (sunrise et sunset dans la suite de ce tuto) mais qu’il soit possible de définir un offset (= décalage horaire par rapport au lever/coucher du soleil). En effet il est bien plus intéressant de définir la gestion des volets en fonction du soleil que par rapport à une heure fixe puisque cela permet de profiter de l’évolution des heures de jour et de nuit en fonction des saisons. Cependant, par rapport à mon mode de vie, je souhaitais bénéficier des quelques dizaines de minutes d’éclairage naturel qui persistent après le coucher du soleil, tout comme le lever du soleil est parfois trop tot pour lever mes volets… d’où l’importance de pouvoir définir un offset que je peux régler selon les saisons.

Assez parlé, passons à l’action !

*Mise à jour : 30/11/2020 – Temps de lecture / alisation : ` < 30 min – Difficulté : Faible ++ / Moyen - - .

To do :

  • Intégrer l’optimisation par rapport à l’azimut du soleil (Cf. tuto)

Prérequis, matériels nécessaires & utilisés :

  • Version de HA : V 0.118.4.
  • Avoir installé et comprendre les bases de Node-Red installé et intégré à HA (v1.2.5) (ici par exemple)
  • Avoir des volets roulants (c’est mieux !) et des actionneurs pour les ouvrir/fermer (chez moi ce sont des ESP, mais le tuto est facilement adaptable pour d’autres protocoles).
  • Comprendre les différents Input_xxx sous HA

Installation / configuration.

Le flow global :

1/ Les Inputs

Avant de rentrer dans les détails du flow Node-Red, on va commencer par créer des inputs sous HA. C’est inputs correspondent aux différents paramètres utilisateurs concernant les volets. On peut les créer directement sur l’interface graphique de HA en allant dans Configuration/Entrées puis en cliquant sur ‹ Ajouter une entrée › en bas à droite de l’écran. Pour ma part je les crée directement sous forme de fichier yaml, cela offre à mon sens un meilleur contrôle.

Input_boolean

Le premier sera donc une entrée de type interrupteur (ou Input Boolean). Il suffit donc de rajouter cette entrée dans son fichier configuration.yaml qui se trouve dans le répertoire config de votre serveur HA (ou dans un sous répertoire input_boolean selon la manière dont votre configuration est organisée - cf Splitting up the configuration pour mieux comprendre).

volets_auto_salon_etat:
  name: Volets auto
  icon: mdi:window-shutter
  initial: on

On sauvegarde le fichier (il s’appelle Volet_Auto_Salon.yaml chez moi). Il va permettre d’avoir un interrupteur général : Si il est désactivé l’ouverture des volets se fera manuellement, comme au bon vieux temps ! :slight_smile:


Input_number

Ensuite on crée un deuxième fichier, cette fois de type Nombre (ou input_number). Cela va nous permettre de régler les offsets (c’est à dire les décalages de temps) afin que notre volet ne s’ouvre/ferme que XX minutes avant/après le lever/coucher du soleil. Ici j’ai choisi de l’afficher sous forme d’un slider, mais on peut très bien avoir un nombre à saisir.

volets_auto_salon_offset_ouvre:
  name: Offset matin
  min: -90
  max: 90
  step: 1
  mode: slider
  
volets_auto_salon_offset_ferme:
  name: Offset soir
  min: -90
  max: 90
  step: 1
  mode: slider
  • name : on donne un nom
  • min et max définissent la plage de nombre que l’on peut régler avec le slider
  • step définit de combien d’unité on change l’offset lorsque l’on déplace le curseur sur le slider
  • mode: définit que l’on souhaite une présentation sous forme de slider (barre horizontale)

On sauvegarde le fichier (il s’appelle Volet_Auto_Salon.yaml chez moi)

On redémarre HA pour que nos fichiers soient pris en compte et l’on peut désormais afficher nos Entités ainsi créées dans Lovelace :

Card volets auto

Pour ma part j’ai réuni ces entités sous une seule et même carte (Volets Automatiques) dans laquelle j’ai aussi rajouté l’affichage de l’heure du levé/couché du soleil (sensor.next_sunset /sunrise) :

On peut maintenant passer à Node-Red :

2/ Les flow Node-red

Suivons le flow, nœud par nœud, en partant du haut à gauche :

Les 2 premiers flows, en haut à gauche (monte) et à droite (descend) servent à récupérer la variable d’offset

1. Event:states node (Saisie offset HA) :


Il sert à déclencher le flow. On définit dans le champs Entity_ID l’input_boolean précédemment créé. Lorsque l’on activera l’interrupteur, le flow sera déclenché.

On rajoute un deuxième nœud event:state juste en dessous mais cette fois on met input_number.volets_auto_salon_offset_ouvre dans le champs Entity_ID. Ainsi si l’on touche au slider le flow sera aussi déclenché.

2. Get entities node (Offset HA)

node2

On cherche cette fois à récupérer l’offset définit dans HA. Il suffit pour cela de mettre notre input_number input_number.volets_auto_salon_offset_ouvre dans le champs Entity_ID du nœud pour qu’il soit remonté dans le msg.payload du noeud et passé au noeud suivant

3. Change node (set global.monte_salon)

node3

Ce nœud va nous servir à définir une variable globale appelée ici monte_salon, qui va prendre la valeur du msg.payload envoyée précédemment. On met bien « global. » afin que la valeur soit stockée par node-red et réutilisable dans un autre flow (cf. ci après)

A ce stade on a définit, récupéré, et stocké la valeur de l’offset, soit donc pour ceux qui suivent, le nombre de minute avant (si négatif) ou après (si positif) l’heure de lever du soleil

On fait la même chose pour le la descente des volets le soir (en haut à droite sur la capture d’écran) mais cette fois les champs Entity_ID seront remplis avec les variables ‹ ferme › de notre input_number et la variable globale sera global.descend

On passe ensuite au flow qui va lancer l’action de monter les volets le matin et de les descendre le soir

4. Inject enhanced node (Action)

N.B. : ce nœud et le suivant ne sont pas inclus de base avec node red, il faut les ajouter à la palette. La palette a rajouter s’appelle node-red-contrib-sun-position.

Ce nœud sert juste à réveiller le flow pour programmer l’execution de l’action. Il est exécuté toutes les X minutes (5 chez moi)

N.B. : c’est la partie que j’aime le moins sur cet automatisation. Lancer un processus toutes les 5 minutes pour une action qui ne va etre exécutée que 2 fois par jour m’embete un peu … Si un spécialiste me lit et qu’il a une meilleure idée, qu’il n’hésite surtout à le dire en commentaires !

5. Within-time node (Sunrise - Sunset)


Ce nœud est celui qui définit les heures d’exécution matin et soir. Plus précisément on définit une heure de départ (sunrise ici) et une heure de fin (sunset ici). A l’heure de départ, un msg.payload sera lancé sur la sortie (output) du haut (montée des volets donc), tandis qu’à l’heure de fin le msg.payload sera sur la sortie du bas (descente des volets).

Mais ce qui est encore plus intéressant avec ce nœud, c’est qu’il permet de définir un offset sous forme de payload (dans offset sous Start time et End time). On va donc pouvoir récupérer nos variables précédemment stockée (vous vous souvenez … global.monte_salon et global.descend_salon). Cela affectera donc les heures d’éxexcutions, d’autant de minutes (en positif ou en négatif) que nous avions défini dans l’input_number.

6. Current state (Volets auto ON ?)


C’est à ce stade que l’on récupère l’information de notre input_boolean d’activation générale. Si l’interrupteur a été mis sur OFF, le flow est routé vers l’output du bas et coupe à ce stade le flow et les volets ne bougent donc pas ! Sinon c’est vers l’output du haut et le flow continue avec le node 7

7. Call service node


C’est à ce stade que l’execution de l’action est véritablement lancée. Dans le cas des ESP8266 qui gèrent mes volets il faut appeler avec ce nœud le composant ‹ cover › (que j’ai ajouté dans ESPhome) qui est l’équivalent pour ESPhome de l’intégration ‹ cover › de HA, mais c’est là un autre sujet. Le service Cover a appeler est soit open_cover pour la montée, soit close_cover pour la descente. L’entity id est celle du volet que l’on souhaite actionner.

Vous pouvez aussi remplacer ces nœuds par ceux qui seront plus adaptés à la gestion de vos actionneurs de volets (mqtt, zwave, zigbee ou autre)

8. Comment node

C’est nœuds de commentaire ne servent juste qu’à donner quelques indications sur les différents flows, ils sont par définition optionnels !

Voilou, a ce stade vous avez normalement des volets programmables en fonction du soleil et d’un offset réglable

Bonus

Mon bureau fait également parfois office de chambre d’amis. Afin que mes hôtes puissent rester maitres de leur heure de coucher j’ai donc modifié légèrement le flow des volets du bureau :

Je n’entre pas trop dans le détail puisque le principe est exactement le même que vu ci dessus. J’ai juste ajouté un input_boolean ‹ mode invités ›, et je vérifie dans le flow si celui ci est activé (auquel cas le flow est routé vers une nœud EZtimer (palette à installer) qui ouvre les volets arbitrairement à 11h00). Si le ‹ mode invités › est OFF le flow ne passe pas par ce nœud EZtimer et le flow correspond donc à ce que l’on a vu ici.

N’hésitez pas à me faire part de vos remarques en commentaire, et si vous souhaitez que je détaille plus particulièrement un point ou un autre, je compléterai ce tuto en fonction.

A nouveau, un grand merci à @Clemalex et à @fredarro qui m’ont bien aidé pour en arriver la !

Je vous souhaite une bonne gestion de vos volets :slight_smile: !!

1 « J'aime »

Super tuto !!! Merci !!!
Va falloir que je regarde pour améliorer ma gestion :wink:

Pour ton probleme d’inject toutes les 5 minutes, j’utilise une autre palette time inject · rdmtc/node-red-contrib-sun-position Wiki · GitHub qui me permet d’injecter directement au moment du coucher / lever du soleil et je peux également mettre un offset.
image

MErci pour le tuto :wink: TOP

1 « J'aime »

Merci @Ioull pour ton retour.
J’avais effectivement testé ce node. Mais le souci c’est que l’offset est en dur dedans. Moi ce dont j’avais besoin c’est un nœud qui accepte un offset sous forme de payload, ce qui permet de pouvoir gérer l’offset depuis lovelace (je me vois pas dire à ma femme d’aller changer l’offset dans un node sous nodered si elle trouve que les volets se ferment trop tard !!! :slight_smile: )

Hum … Pas en dur, tu peux prendre une variable du flow :
image
et tu mets à jour la variable du flow au changement de l’input, ca marche pas ca ?

En fait je comprends plus rien @Ioull ! La librairie que tu cites est en fait justement celle que j’utilise ! Et je ne vois pas de node ‹ inject at time › dans la liste de mes nodes… Par contre si je fais une recherche dans ma liste de nodes sous time inject, j’ai un bien un node qui sort mais qui est présenté sous inject enhanced !
image
Et c’est justement celui que j’utilise. Mais sa configuration n’a rien à voir avec ce que tu décris …


Comprends plus rien :flushed:

Pourquoi faire compliqué avec Node-Red alors qu’on peut faire simple avec les automatisations? :stuck_out_tongue_winking_eye:

1 « J'aime »

Je trouve cela assez simple pour ma part.
Je trouve par contre les automatisations très limitées sous HA, sauf à passer en yaml pur, mais dans ce cas nodered est bien plus visuel et comprehensible.

Désolé pour le hors-sujet…
Eternel débat :slight_smile:
Perso, je suis 100% avec Node-Red, pour les automatisations.
Je trouve ça plus simple à écrire et surtout à débugger. Le yaml, je n’ai jamais compris pas quel bout le prendre quand ça marche pas…

Hum tu as la dernière version :
image

Yes !
image
Incompréhensible !

En fait tu as le bon noeud … C’est pas tres intuitif mais en cliquant sur repeat (at a specific time) , tu ajoutes les fonctionnalitées …
image

Bien vu @Ioull, merci ! Je vais regarder ca de plus prêt.
Je test puis mets à jour le tuto.

J’ai peur que si la variable qui contient l’offset change, cette valeur ne soit prise en compte que pour le redemarrage d’apres par contre …

Je confirme :
image

Oui j’ai testé , je confirme aussi…
Après je sais pas ce qui est le mieux … Le process toutes les 5 minutes mais changeable à la volée ou pas de surcharge mais offset non modifiable à la volée et 2 flows (1 sunset et 1 sunrise) versus 1 … :thinking:

Une des raisons qui m’ont fait choisir NodeRed, je voulais avoir un vrai cron (en tant que vieux linuxien, ça me manquait sous HA).
Pour faire ce que tu veux, tu peux utiliser l’outil Cron Plus (https://github.com/Steve-Mcl/node-red-contrib-cron-plus).
C’est probablement moins simple que la solution décrite ici, mais, par contre c’est assez universel. J’ai migré (presque) toutes mes tâches liées au temps vers cet outil super configurable.

1 « J'aime »

HS :

Le smiley joue beaucoup dans l’interprétation de ta phrase…
:smirk:
@Yul Tu veux bien nous partager la même automatisation ? :stuck_out_tongue_winking_eye: :grin: :innocent:


A l’inverse de @golfvert, je fais toutes mes automatisations dans HA.
Mais je pense sincèrement qu’il faille mieux utiliser NodeRed.
Certes il y a un certain temps de découverte et de mise au point (comme sur le langage Jinja d’ailleurs) mais tu auras l’avantage de pouvoir changer de serveur domotique et simplement changer tes entrées de tes flows et tes sorties à l’opposé de passer par les automatisations de HA, qui ne seront pas réutilisables sur un autre serveur et que tu devras réécrire.


Merci @Vinceg77, c’est l’un des tutoriels sur Node-Red les plus intéressant à lire grâce aux explications ET aux captures d’écrans ! :+1: :100:

1 « J'aime »

Très intéressant cette histoire de Cron Plus… Même si de ma faible compréhension de Cron (linux) cela ne gère pas le temps/soleil, mais ça peut re-servir dans bien des cas.
Merci @golfvert

HS:
Désolé si certains l’ont mal compris, mon commentaire était bien entendu ironique pour alimenter un éternel débat :slight_smile:

Le tuto semble très bien détaillé pour les utilisateurs NodeRed :+1:

2 « J'aime »