Partie 3 : Node-RED / Modbus / MQTT
EDIT : Il y a quelque capture qui ne sont plus au totalement au gout du jour (La partie Read CSV File a été légèrement modifié, passage du chemin et du nom de fichier en variable par exemple, mais au fond rien de bien méchant)
Mon Introduction :
Je suis issue du monde industriel, je programme habituellement sur automate, j'ai aussi quelque programme a mon actif VB6 ou VB.NET pour le boulot, mais je débute sur HA/NodeRED/MQTT
Pour info je programme actuellement le plus sous Codesys sur des automates WAGO ou aussi sur Raspberry.
Codesys est un outil de programmation développer par une société allemande et qui vend ensuite son outil a des marques industriel.
L'avantage de cet outil, c'est qu'il est adopté par plusieurs constructeurs, et que l'on est pas dépaysé lorsque l'on bascule d'un automate a un autre qui utilise Codesys.
Codesys utilise plusieurs langage : Grafcet/Ladder (Langage Contact)/CFC/FBD (Sorte de Bloc de fonction a la NodeRED ), et aussi du S.T (Langage Structuré : issue du Pascal)
A noter que de nos jours, de plus en plus d'automate tourne sur des bases linux, ce qui permet aux farbiquants de proposer autre choses a leur client : NodeRED/MQTT peuvent parfois remplacer le Codesys traditionnel par exemple.
Mon installation domotique :
Je sais plus si j'en ai parlé mais mon installation domotique contient :
Node-RED:
Je suis en train de regarder comment intégrer ma borne ETEK dans mon install, étant en convalescence je prend un peu de temps pour ca histoire d'apprendre un peu.
Comme j'aime bien faire autrement et que je ne veux pas être lié a HA (on sait jamais) , j'ai envie de procéder comme ca :
Je n'ai pas choisi le truc le plus simple pour débuté (enfin avec le cahier des charges que je me suis imposé),
A la base le programe de Lecture/Ecriture Modbus/MQTT pourrait être très simple.
Mais ... il y a un mais.
Lorsqu'on lit les valeurs sur le Modbus, si ensuite on les publies sur MQTT, derrière vue que l'on est abonné a un Topic qu'on veut aussi pouvoir écrire, on recoit une notif , si je ferme les yeux, du coup ca déclenche une écriture sur le modbus dans mon device.
Et ca il faut clairement éviter. Car on ne sait pas comment le Device va gérer ca.
Si il est intelligent et que la valeur ne change pas il ne fera rien.
Dans le pire des cas ca fait une ecriture, et une écriture dans de la mémoire non volatile, suivant le type de mémoire et bien on peut rapidement cramer une puce.
Certains fabriquants s'en sont déjà mordus les doigts.
Du coup il faut que je j'implémente un système d'ecriture "OnChange", je dois donc mémoriser la dernière valeur, et la comparer avec celle que je viens de recevoir.
Sur le papier c'est pas compliqué quand on connait bien un langage de prog, mais là je débute avec Node-RED et c'est pas forcément le truc le plus simple a faire pour débuter...
Du coup je me pose la question aussi de mon Publish vers MQTT, je peux éventuellement faire aussi pareil, un Publish OnChange ou un mix [OnChange ou OnDelay], a voir.
Mon Flow et composé de plusieurs partie :
Config : Ca me permet de régler quelques variables :
Sélection Manuel de Pool a Utiliser :
Debut du Cycle : Lecture des Fichiers CSV
J'ai crée 2 fichiers CSV qui contiennent la table de registre du module ETEK.
Les 2 Fichiers sont lu, puis stocker des 2 tableaux variables au niveau du flow.
Je mettrais en lien le fichier Google Sheet que j'ai utilisé.
Le fichier contient des lignes de ce type :
Une ligne correspond a un Registre, donc un futur Topic coté MQTT
Une ligne est constitué de :
Les 2 1er Caractère reconnu est interpretté dans le flow sont :
Lecture de Toute la Table du Controleur ETEK : Routine Lancé en continu si AutoRepeat=True
Ce cycle commence a la fin du Cycle de lecture des fichier CSV ou Manuellement
J'ai mis des commentaires dans toutes les fonctions, au final je me retrouve avec pas mal de JS .
Au passage je stocke
-les valeurs lu dans un dossier : "stat"
-les valeurs qui sont ecrites dans MQTT dans un dossier : "cmnd"
Ca facilite la gestion des écritures :
Exemple : HA envoie une commande sur \MonDeviceETEK\cmnd\SW80_CommandeStart
Je la recoi sous NodeRED, je envoie ensuite un Modbus Write sur le registre 80, On obtient alors ensuite si tout va bien une Mise a jour du status
sur le prochain cycle de lecture.
Modbus Write OnChange : A la reception d'un Publish depuis MQTT
Dans ce bloc, une seul fonction qui décode le message MQTT
Je vérifie si le message recu doit etre surveillé (SW)
Si j'ai déjà stocké une valeur, si oui alors je la compare.
J'envoie une écriture sur le Modbus TCP uniquement si la valeur est différente de la précédente.
Le Flux Complet v6: [MAJ 25/08/24]
Changelog
v6 25/08/24 :
TODO List :
Ce flux necessite :
Pour le Faire Fonctionner, ne pas oublier de configurer :
-Noeud Config
-Environment Variable du Flow
-Le Serveur MQTT (Publish et Subscrib)
-Les 2 Fonctions Modbus Flex Getter & Write
Voici les Variables a Configurer :
EDIT : Il y a quelque capture qui ne sont plus au totalement au gout du jour (La partie Read CSV File a été légèrement modifié, passage du chemin et du nom de fichier en variable par exemple, mais au fond rien de bien méchant)
Mon Introduction :
Je suis issue du monde industriel, je programme habituellement sur automate, j'ai aussi quelque programme a mon actif VB6 ou VB.NET pour le boulot, mais je débute sur HA/NodeRED/MQTT
Pour info je programme actuellement le plus sous Codesys sur des automates WAGO ou aussi sur Raspberry.
Codesys est un outil de programmation développer par une société allemande et qui vend ensuite son outil a des marques industriel.
L'avantage de cet outil, c'est qu'il est adopté par plusieurs constructeurs, et que l'on est pas dépaysé lorsque l'on bascule d'un automate a un autre qui utilise Codesys.
Codesys utilise plusieurs langage : Grafcet/Ladder (Langage Contact)/CFC/FBD (Sorte de Bloc de fonction a la NodeRED ), et aussi du S.T (Langage Structuré : issue du Pascal)
A noter que de nos jours, de plus en plus d'automate tourne sur des bases linux, ce qui permet aux farbiquants de proposer autre choses a leur client : NodeRED/MQTT peuvent parfois remplacer le Codesys traditionnel par exemple.
Mon installation domotique :
Je sais plus si j'en ai parlé mais mon installation domotique contient :
- Du KNX (Gestion Eclairage, VR, Meteo, Prise Commandé / PC avec suivi conso
- Un Automate WAGO (Forcément )
- Un superviseur Home Assistant qui tournent sous Proxmox (Pour le moment le Minimum Syndical)
- PV
- Chaudiere en Modbus RTU
- Gestion Cuve EDP
- ...
Node-RED:
Je suis en train de regarder comment intégrer ma borne ETEK dans mon install, étant en convalescence je prend un peu de temps pour ca histoire d'apprendre un peu.
Comme j'aime bien faire autrement et que je ne veux pas être lié a HA (on sait jamais) , j'ai envie de procéder comme ca :
- Communication : Controleur ETEK en Modbus TCP via un module Elfin EE11A ou EW11A
- La liaison modbus sera gérer sous Node-RED (Node-RED est installé dans un container LXC sous Proxmox, il est donc indépendant de HA)
- La table de valeur que je veux remonter sera stocker dans MQTT
- L'ecriture d'un registre pour une Commande ou un Réglage dans le module ETEK se fera uniquement sur Changement d'état
- L'intégration dans HA se fera en créant un Device MQTT
Je n'ai pas choisi le truc le plus simple pour débuté (enfin avec le cahier des charges que je me suis imposé),
A la base le programe de Lecture/Ecriture Modbus/MQTT pourrait être très simple.
Mais ... il y a un mais.
Lorsqu'on lit les valeurs sur le Modbus, si ensuite on les publies sur MQTT, derrière vue que l'on est abonné a un Topic qu'on veut aussi pouvoir écrire, on recoit une notif , si je ferme les yeux, du coup ca déclenche une écriture sur le modbus dans mon device.
Et ca il faut clairement éviter. Car on ne sait pas comment le Device va gérer ca.
Si il est intelligent et que la valeur ne change pas il ne fera rien.
Dans le pire des cas ca fait une ecriture, et une écriture dans de la mémoire non volatile, suivant le type de mémoire et bien on peut rapidement cramer une puce.
Certains fabriquants s'en sont déjà mordus les doigts.
Du coup il faut que je j'implémente un système d'ecriture "OnChange", je dois donc mémoriser la dernière valeur, et la comparer avec celle que je viens de recevoir.
Sur le papier c'est pas compliqué quand on connait bien un langage de prog, mais là je débute avec Node-RED et c'est pas forcément le truc le plus simple a faire pour débuter...
Du coup je me pose la question aussi de mon Publish vers MQTT, je peux éventuellement faire aussi pareil, un Publish OnChange ou un mix [OnChange ou OnDelay], a voir.
Mon Flow et composé de plusieurs partie :
Config : Ca me permet de régler quelques variables :
- iUnitID (Du Controleur ETEK)
- sBaseTopic : Le Nom du Topic de base dans MQTT
- bEnableAutoRepeat : Permet de faire un seul Cycle a la fois (Util pour la mise au point)
- iNumberOfPool : Le nom de Pool (Nb de groupe de question a gérer)
Sélection Manuel de Pool a Utiliser :
Debut du Cycle : Lecture des Fichiers CSV
J'ai crée 2 fichiers CSV qui contiennent la table de registre du module ETEK.
Les 2 Fichiers sont lu, puis stocker des 2 tableaux variables au niveau du flow.
Je mettrais en lien le fichier Google Sheet que j'ai utilisé.
Le fichier contient des lignes de ce type :
Code :
SR141_Current_working_status
SW109_Max_Output_Charger_PWM
XX140_Software_version
94_kWH_meter_power_address
Une ligne correspond a un Registre, donc un futur Topic coté MQTT
Une ligne est constitué de :
- 2 Caractères (SR,SW)
- Le N° du Registre
- Le Nom du Registre
Les 2 1er Caractère reconnu est interpretté dans le flow sont :
- SR : Single Read : Lecture Registre 16Bits
- SW: Single Write : Ecriture Registre 16Bits
- XX: Pour un registre que je ne veux
- Rien : Pour un registre dont je n'ai pas décidé si j'allais le traiter ou pas.
Lecture de Toute la Table du Controleur ETEK : Routine Lancé en continu si AutoRepeat=True
Ce cycle commence a la fin du Cycle de lecture des fichier CSV ou Manuellement
J'ai mis des commentaires dans toutes les fonctions, au final je me retrouve avec pas mal de JS .
- La Fonction 1 : Permet definir les Bonne Adresses a envoyer au module Modbus Flex Getter
- La Fonction 2 : Recupere le Résultat de la Requete Modbus, stocke ou non les valeur recu et les envoie ou non sur MQTT après avoir généré un topic.
Au passage je stocke
-les valeurs lu dans un dossier : "stat"
-les valeurs qui sont ecrites dans MQTT dans un dossier : "cmnd"
Ca facilite la gestion des écritures :
Exemple : HA envoie une commande sur \MonDeviceETEK\cmnd\SW80_CommandeStart
Je la recoi sous NodeRED, je envoie ensuite un Modbus Write sur le registre 80, On obtient alors ensuite si tout va bien une Mise a jour du status
sur le prochain cycle de lecture.
- La Fonction 3 : Active le pool suivant et lance le cycle suivant
Modbus Write OnChange : A la reception d'un Publish depuis MQTT
Dans ce bloc, une seul fonction qui décode le message MQTT
Je vérifie si le message recu doit etre surveillé (SW)
Si j'ai déjà stocké une valeur, si oui alors je la compare.
J'envoie une écriture sur le Modbus TCP uniquement si la valeur est différente de la précédente.
Le Flux Complet v6: [MAJ 25/08/24]
Changelog
v6 25/08/24 :
- Le Nom et le Chemin des 2 Fichiers de Pool sont maintenant en variable dans Config
- Le/Les Topics MQTT sont dans des variables d'environment du Flow
- Je json du Flux a été posté.
- Les 2 Fichiers CSV qui contiennent la Table de registre a intérroger
TODO List :
- Mise en place du Mode Heure Creuse/Charge Instantanée/Arrêt
- Interfaçage avec info Linky
- Reflexion sur la mise en forme des valeurs : Est-ce que je fais ca ici ou dans HA
Ce flux necessite :
- node-red-contrib-config
- node-red-contrib-modbus
- node-red-contrib-string
Pour le Faire Fonctionner, ne pas oublier de configurer :
-Noeud Config
-Environment Variable du Flow
-Le Serveur MQTT (Publish et Subscrib)
-Les 2 Fonctions Modbus Flex Getter & Write
Voici les Variables a Configurer :