Outils pour utilisateurs

Outils du site


node_red_modification_dynamique_flows

Objectifs

Dans le cadre d'un réseau MESH couplé à Node-Red, la mise à jour des flows après scrutation du réseau MESH afin de créer les éléments nécessaires est envisagée.

L'idée de modifier dynamiquement les flows est apparue, mais il est techniquement, à ma connaissance pas possible de l'envisager.

Une alternative est possible, qui n'automatise pas tout, mais assure une grosse partie du travail.

Procédure

  • Un ensemble de flows de base crées dans l'éditeur Node-Red qui servent de cadre à notre projet.
  • un SubFlows spécifique pour chaque type d'élément du MESH. Ces subflows seront exportés puis modifiés pour l'usage dans un script python.
  • un script doit permettre d'assurer les opérations suivantes dans le cadre d'une mise à jour du jeu de flows de base
    1. la copie du flow*.json depuis le répertoire .node-red
    2. la scrutation du MESH via le protocole MQTT pour récupérer la liste des nœuds identifier le type de carte pour chaque noeud.
    3. la création des subflows nécessaires pour les nouveaux noeuds et leur intégration dans les flows de base et production du nouveau fichier Json.
    4. la mise à jour de la liste des nœuds du MESH pris en charge par le jeu de flows de base.

ATTENTION : Node-red ne pouvant pas être modifié en route, il est pour le moment impossible de recharger ces flows automatiquement. Ceci impose les manipulations suivantes pour sa mise à jour.

  1. Dans l'éditeur Node-red, importer le nouveau json.
  2. supprimer les flows antérieurs liés au MESH
  3. déployer l'ensemble.

Quelques précisions sur la structure d'un flow Node-Red

Tous les éléments sont identifiés par un id unique puis des liens entre les éléments sont fait via ces id. Il en va de même pour les subflows, dont les id des éléments doivent être uniques.

L'affectation des objets dans l'interface utilisateur se fait via la des groupes {“type”: “ui_group”,} eux mêmes affectés à une page via l'ID de la page.

L'usage d'un subflow nécessite deux parties :

  • Le subflow et sa définition.
  • Le noeud dans le flow qui pointe sur le subflow.

Prochainement une illustration sur la structure d'un subflow.

Principe général du script

Le script python doit à partir du jeu de flows de base effectuer ceci :

  1. trouver les id des tous les éléments actuels, afin de ne introduire les mêmes par la suite.
  2. pour chaque noeud
    1. récupère les id des élements dans le json d'origine indispensables {id des pages de l'ui, de la page de l'éditeur)
    2. créer , à partir d'un subflow générique le subflow et le nœud du flow nécessaire et la modification du flow général si besoin.
  3. l'adjonction de ces éléments dans le json général.
  4. la sauvegarde de l'ensemble.

Pour la création du subflow et de son nœud, la procédure est la suivante :

  1. dans Node-Red créer le subflow qui convient pour un type de carte puis l'exporter. Cet export sera modifié, pour le rendre générique pour le script en remplaçant tous les id qui doivent être modifiés par un code entre deux # exemple #IDE_UI_TAB_CONFIGURATION#.
{
        "id": "#IDE_NOEUD_CARTE_RELAIS2#",
        "type": "subflow:#ID_SUBFLOW#",
        "z": "#IDE_TAB_CONTROLE#",
        "name": "#IDE_NOEUD_MESH#",
        "env": [],
        "x": "#POS_X#",
        "y": "#POS_Y#",
        "wires": []
    },
{

la portion de subflow générique pour introduire le nœud sur le subflow.

{
        "id": "#ID_SUBFLOW#", 
        "type": "subflow",
        "name": "RELAIS2",
        "info": "",
        "in": [
            {
                "x": 40,
                "y": 80,
                "wires": [
						{
                        "id": "#ID_ENTREE1#"
                    },
                    {
                        "id": "#ID_ENTREE2#"
                    },
                    {
                        "id": "#ID_ENTREE3#"
                    }
                    
                ]
            }
        ],
        "out": []
    },

la définition du subflow, avec les indication de raccordement du noeud d'entrée du subflow sur les éléments internes.

{
        "id": "#ID_ELEMENT4#",
        "type": "ui_button",
        "z": "#ID_SUBFLOW#",
        "name": "ETAT VOYANT 2",
        "group": "#ID_GROUPE_CONTROLE#",
        "order": 2,
        "width": 1,
        "height": 1,
        "passthru": false,
        "label": "{{msg.state2}}",
        "tooltip": "",
        "color": "",
        "bgcolor": "{{msg.background2}}",
        "icon": "",
        "payload": "",
        "payloadType": "str",
        "topic": "",
        "x": 720,
        "y": 540,
        "wires": [
            []
        ]
    },

Un élément du subflow qui doit apparaître dans l'interface utilisateur via un groupe dont l'id est #ID_GROUPE_CONTROLE#

{
	"id": "#ID_GROUPE_CONTROLE#", 
        "type": "ui_group",
        "z": "",
        "name": "#IDE_NOEUD_MESH#",
        "tab": "#IDE_UITAB_CONTROLE#",
        "disp": "true",
        "width": "6",
        "collapse": "true"
		},

le groupe de contrôle qui apparaît dans la page de l'interface utilisateur #IDE_UITAB_CONTROLE#

  1. Après chargement du json générique sous forme d'une chaîne de caractères, une expression régulière permet de trouver les éléments à modifier puis de les remplacer avant réinjection dans le json principal.
 ATTENTION : Cette étape de production du json générique est fondamentale, il est indispensable de bien décortiquer comment il est constitué. En effet dans un subflow, certains élements {id} sont interne au subflow, d'autres sont liés à l'extérieur.

Exemple : l'id du subflow doit être connue pour la création du nœud dans le flow. Alors que les id des éléments du subflow peuvent rester inconnus du reste.

 C'est pourquoi j'ai choisi de NOTER #IDE_XXX" les id extérieurs au flow et ID ceux internes au flow.
node_red_modification_dynamique_flows.txt · Dernière modification: 2020/04/17 11:48 par BILLARD