Photovoltaique- Gestion de mon Systeme Solaire Victron avec Node-RED : Partie 1 – Collecte des Données

Intro

Sur mon blog domo.rem81.com, je partage mes projets domotiques pour rendre ma maison plus intelligente et économe. Aujourd’hui, je vous présente un flow Node-RED que j’ai conçu pour collecter et traiter les données de mon système solaire Victron Energy, composé d’un MultiPlus-II (MP2), d’un contrôleur MPPT, et d’un Cerbox GX dans lequel j’ai activé « Node Red ». Ce flow est la première partie d’un système plus large qui me permet de surveiller et d’automatiser ma production et ma consommation d’énergie.

Objectif du flow

Ce flow, nommé « Communs », est la base de mon système de monitoring. Il récupère des données clés de mon installation Victron, comme la puissance PV, la consommation, l’état de charge, et l’état du réseau, puis les publie via MQTT pour une intégration avec Home Assistant. Ces données me permettent de suivre en temps réel la performance de mon système solaire et de préparer des automatisations (que je détaillerai dans un prochain article).

Le flow Node-RED

Code json

Vous pouvez copier/coller le fichier .json en Annexe

Visualisation du flowAccueil

Voici une capture d’écran de mon flow « Communs » dans Node-RED, où vous pouvez voir la disposition des nœuds et le flux des données entre eux :

Cette capture montre les différents sous-flux, comme la collecte de la puissance PV (nœuds victron-input-solarcharger), l’état du VE.Bus (nœuds victron-input-vebus), et les publications MQTT (nœuds mqtt out). Les nœuds debug sont également visibles pour le suivi des données en temps réel.

Analyse du flow

  1. Puissance du réseau (Grid L1) :
  • Un nœud victron-input-gridmeter récupère la puissance sur la phase L1 (/Ac/L1/Power) depuis le service com.victronenergy.grid/31.
  • La valeur est publiée sur le topic mp2/multiplus2/grid_l1_ac via deux brokers MQTT (un pour Home Assistant à 192.168.0.37:1883, un autre pour un serveur Proxmox à 192.168.0.204:1883).
  • Un nœud debug affiche la valeur pour le suivi.
  1. Puissance PV totale :
  • Deux nœuds collectent la puissance PV :
    • PV MPPT1 : Puissance du contrôleur MPPT (/Yield/Power sur com.victronenergy.solarcharger/279).
    • PV MO : Puissance PV couplée AC (/Ac/PvOnGrid/L1/Power sur com.victronenergy.system/0).
  • Les valeurs sont stockées dans des variables de flux (mppt1 et pvmo), additionnées via un nœud function, et publiées sur le topic mp2/multiplus2/prod_totale.
  1. État du VE.Bus et de charge :
  • Un nœud récupère l’état du VE.Bus (/State) du MultiPlus-II, le convertit en texte lisible (ex. « Inverting ») via un nœud function, et le publie sur mp2/multiplus2/etatbusve.
  • Un autre nœud récupère l’état de charge (/VebusChargeState) et le publie sur mp2/multiplus2/etatcharge.
  1. Autres métriques :
  • SOC minimum (/Settings/CGwacs/BatteryLife/MinimumSocLimit) publié sur mp2/multiplus2/soc_mini.
  • État du réseau (/Alarms/GridLost) publié sur mp2/multiplus2/grid_lost.
  • Mode de fonctionnement (/Mode) publié sur mp2/multiplus2/mode.

Détails techniques

  • Nœud function pour l’état VE.Bus : Le script JavaScript suivant convertit les codes d’état en texte :
var code=msg.payload;

// Tableau à deux colonnes
var tableau = [

    [0, 'Off'],
    [1, 'Low Power'],
    [2, 'Fault'],
    [3, 'Bulk'],
    [4, 'Absorption'],
    [5, 'Float'],
    [6, 'Storage'],
    [7, 'Equalize'],
    [8, 'Passthru'],
    [9, 'Inverting'],
    [10, 'Power assist'],
    [11, 'Power supply'],
    [255, 'External controle'],
];

// Fonction pour extraire la deuxième colonne en fonction de la première colonne
function extraireDeuxiemeColonne(valeur) {
    for (var i = 0; i < tableau.length; i++) {
        if (tableau[i][0] === valeur) {
            return tableau[i][1];
        }
    }
    return "Etat Inconnu"; // Retourne null si aucune correspondance trouvée
}

// Exemple d'utilisation
var valeurRecherchee = code;
var resultat = extraireDeuxiemeColonne(valeurRecherchee);
msg.payload = resultat;

return [msg]
  • Brokers MQTT : Deux brokers sont utilisés pour assurer une redondance et une intégration avec différents systèmes (Home Assistant et Proxmox).

Intégration avec Home Assistant

Ce flow envoie toutes les données via MQTT à Home Assistant (broker à 192.168.0.37:1883). Par exemple, le topic mp2/multiplus2/prod_totale me permet de suivre la production totale de mes panneaux solaires dans un tableau de bord. Ces données sont également envoyées à un serveur Proxmox pour un monitoring secondaire.

Pourquoi Node-RED ?

  • Simplicité : Je peux collecter et traiter des données complexes sans écrire de code complexe.
  • Flexibilité : Les nœuds Victron s’intègrent parfaitement avec MQTT et Home Assistant.
  • Visuel : L’interface de Node-RED me permet de voir clairement le flux des données.

Palettes Utilisées

Pour reproduire ce flow, vous aurez besoin d’installer les palettes suivantes dans Node-RED :

  • node-red-contrib-victron : Fournit les nœuds pour interagir avec les systèmes Victron Energy (comme victron-input-solarcharger, victron-input-vebus, etc.). Installez-la via le gestionnaire de palettes de Node-RED ou avec la commande :
  npm install node-red-contrib-victron
  • node-red-node-mqtt : Fournit les nœuds MQTT (mqtt out, mqtt-broker). Cette palette est généralement incluse par défaut dans Node-RED, mais si elle est absente, vous pouvez l’installer avec :
  npm install node-red-node-mqtt
  • Nœuds de base (Core) : Les nœuds comme debug, function, change, et comment sont inclus par défaut dans Node-RED.

Note : Assurez-vous que votre instance Node-RED a accès à votre système Victron (via DBus ou MQTT, selon votre configuration) pour que les nœuds Victron fonctionnent correctement.

Conclusion

Ce flow « Communs » est la première brique de mon système de gestion d’énergie solaire avec Victron Energy. Il me fournit des données fiables pour surveiller ma production et ma consommation, tout en préparant le terrain pour des automatisations plus avancées (que je partagerai dans un prochain article). Si vous avez un système Victron ou utilisez Node-RED, ce projet pourrait vous inspirer. Des questions ou des idées ? Laissez un commentaire sur domo.rem81.com !

Annexe: Fichier JSON

[
    {
        "id": "dbd727f16cbe7b5f",
        "type": "tab",
        "label": "Communs",
        "disabled": false,
        "info": "",
        "env": []
    },
    {
        "id": "6c2cfd4a51894682",
        "type": "victron-input-solarcharger",
        "z": "dbd727f16cbe7b5f",
        "service": "com.victronenergy.solarcharger/279",
        "path": "/Yield/Power",
        "serviceObj": {
            "service": "com.victronenergy.solarcharger/279",
            "name": "MPPT1"
        },
        "pathObj": {
            "path": "/Yield/Power",
            "type": "float",
            "name": "PV Power (W)"
        },
        "initial": "",
        "name": "PV MPPT1",
        "onlyChanges": false,
        "roundValues": "2",
        "x": 100,
        "y": 440,
        "wires": [
            [
                "d468080ff4d712b4",
                "9c611a60b8cb5463"
            ]
        ]
    },
    {
        "id": "aba221edbad2b550",
        "type": "debug",
        "z": "dbd727f16cbe7b5f",
        "name": "Pu MPPT1",
        "active": true,
        "tosidebar": true,
        "console": false,
        "tostatus": true,
        "complete": "payload",
        "targetType": "msg",
        "statusVal": "payload",
        "statusType": "auto",
        "x": 730,
        "y": 440,
        "wires": []
    },
    {
        "id": "d468080ff4d712b4",
        "type": "mqtt out",
        "z": "dbd727f16cbe7b5f",
        "name": "MPPT1 Power",
        "topic": "mp2/mppt1/puissance",
        "qos": "",
        "retain": "",
        "respTopic": "",
        "contentType": "",
        "userProps": "",
        "correl": "",
        "expiry": "",
        "broker": "a89b02435258ed38",
        "x": 520,
        "y": 440,
        "wires": []
    },
    {
        "id": "c59ca10116637c3d",
        "type": "comment",
        "z": "dbd727f16cbe7b5f",
        "name": "****************** Fin de ne pas Supprimer *********************",
        "info": "",
        "x": 260,
        "y": 1000,
        "wires": []
    },
    {
        "id": "7d34b18b2bf8a629",
        "type": "victron-input-ess",
        "z": "dbd727f16cbe7b5f",
        "service": "",
        "path": "",
        "name": "",
        "onlyChanges": false,
        "x": 990,
        "y": 560,
        "wires": [
            []
        ]
    },
    {
        "id": "4bc84980d851ce5a",
        "type": "victron-input-pvinverter",
        "z": "dbd727f16cbe7b5f",
        "service": "",
        "path": "",
        "name": "",
        "onlyChanges": false,
        "x": 1000,
        "y": 500,
        "wires": [
            []
        ]
    },
    {
        "id": "3342a4d620193c57",
        "type": "victron-input-relay",
        "z": "dbd727f16cbe7b5f",
        "service": "",
        "path": "",
        "name": "",
        "onlyChanges": false,
        "x": 990,
        "y": 420,
        "wires": [
            []
        ]
    },
    {
        "id": "c9ebdcddc30b84f0",
        "type": "victron-input-settings",
        "z": "dbd727f16cbe7b5f",
        "service": "",
        "path": "",
        "name": "",
        "onlyChanges": false,
        "x": 1000,
        "y": 380,
        "wires": [
            []
        ]
    },
    {
        "id": "a230200f24267797",
        "type": "victron-input-solarcharger",
        "z": "dbd727f16cbe7b5f",
        "service": "",
        "path": "",
        "name": "",
        "onlyChanges": false,
        "x": 1010,
        "y": 460,
        "wires": [
            []
        ]
    },
    {
        "id": "0ba033780ec27f03",
        "type": "victron-input-system",
        "z": "dbd727f16cbe7b5f",
        "service": "com.victronenergy.system/0",
        "path": "/Ac/PvOnGrid/L1/Power",
        "serviceObj": {
            "service": "com.victronenergy.system/0",
            "name": "Venus system"
        },
        "pathObj": {
            "path": "/Ac/PvOnGrid/L1/Power",
            "type": "float",
            "name": "PV - AC-coupled on input L1 (W)"
        },
        "name": "PV MO",
        "onlyChanges": false,
        "roundValues": "2",
        "x": 90,
        "y": 620,
        "wires": [
            [
                "fb84cacd5817c316"
            ]
        ]
    },
    {
        "id": "3c4855145c88623a",
        "type": "debug",
        "z": "dbd727f16cbe7b5f",
        "name": "",
        "active": true,
        "tosidebar": true,
        "console": false,
        "tostatus": true,
        "complete": "payload",
        "targetType": "msg",
        "statusVal": "payload",
        "statusType": "auto",
        "x": 550,
        "y": 620,
        "wires": []
    },
    {
        "id": "7f02fac893bdc7d6",
        "type": "victron-output-ess",
        "z": "dbd727f16cbe7b5f",
        "service": "",
        "path": "",
        "name": "",
        "onlyChanges": false,
        "x": 90,
        "y": 1580,
        "wires": []
    },
    {
        "id": "24769fbf07e2e1ba",
        "type": "victron-output-relay",
        "z": "dbd727f16cbe7b5f",
        "service": "",
        "path": "",
        "name": "",
        "onlyChanges": false,
        "x": 940,
        "y": 1580,
        "wires": []
    },
    {
        "id": "6784b80b5078c864",
        "type": "victron-output-settings",
        "z": "dbd727f16cbe7b5f",
        "service": "",
        "path": "",
        "name": "",
        "onlyChanges": false,
        "x": 760,
        "y": 1580,
        "wires": []
    },
    {
        "id": "1f1222b8161172e0",
        "type": "victron-output-solarcharger",
        "z": "dbd727f16cbe7b5f",
        "service": "",
        "path": "",
        "name": "",
        "onlyChanges": false,
        "x": 300,
        "y": 1580,
        "wires": []
    },
    {
        "id": "b7fe893ac3bb2acd",
        "type": "victron-output-vebus",
        "z": "dbd727f16cbe7b5f",
        "service": "",
        "path": "",
        "name": "",
        "onlyChanges": false,
        "x": 550,
        "y": 1580,
        "wires": []
    },
    {
        "id": "2ff7bd19f8255f7b",
        "type": "debug",
        "z": "dbd727f16cbe7b5f",
        "name": "",
        "active": true,
        "tosidebar": true,
        "console": false,
        "tostatus": true,
        "complete": "payload",
        "targetType": "msg",
        "statusVal": "payload",
        "statusType": "auto",
        "x": 610,
        "y": 1120,
        "wires": []
    },
    {
        "id": "21a4d81b370297ec",
        "type": "victron-input-solarcharger",
        "z": "dbd727f16cbe7b5f",
        "service": "com.victronenergy.solarcharger/279",
        "path": "/State",
        "serviceObj": {
            "service": "com.victronenergy.solarcharger/279",
            "name": "MPPT1"
        },
        "pathObj": {
            "path": "/State",
            "type": "enum",
            "name": "Charge state",
            "enum": {
                "0": "Off",
                "2": "Fault",
                "3": "Bulk",
                "4": "Absorption",
                "5": "Float",
                "6": "Storage",
                "7": "Equalize",
                "245": "Off",
                "247": "Equalize",
                "252": "External Control"
            }
        },
        "initial": "",
        "name": "",
        "onlyChanges": false,
        "roundValues": "2",
        "x": 160,
        "y": 1180,
        "wires": [
            [
                "809643acf5badf40"
            ]
        ]
    },
    {
        "id": "809643acf5badf40",
        "type": "debug",
        "z": "dbd727f16cbe7b5f",
        "name": "",
        "active": true,
        "tosidebar": true,
        "console": false,
        "tostatus": true,
        "complete": "payload",
        "targetType": "msg",
        "statusVal": "payload",
        "statusType": "auto",
        "x": 610,
        "y": 1180,
        "wires": []
    },
    {
        "id": "926bc7030a8a22fc",
        "type": "victron-input-solarcharger",
        "z": "dbd727f16cbe7b5f",
        "service": "com.victronenergy.solarcharger/279",
        "path": "/Yield/Power",
        "serviceObj": {
            "service": "com.victronenergy.solarcharger/279",
            "name": "MPPT1"
        },
        "pathObj": {
            "path": "/Yield/Power",
            "type": "float",
            "name": "PV Power (W)"
        },
        "initial": "",
        "name": "",
        "onlyChanges": false,
        "roundValues": "2",
        "x": 160,
        "y": 1040,
        "wires": [
            [
                "537ede6b8c6c2d23"
            ]
        ]
    },
    {
        "id": "537ede6b8c6c2d23",
        "type": "debug",
        "z": "dbd727f16cbe7b5f",
        "name": "",
        "active": true,
        "tosidebar": true,
        "console": false,
        "tostatus": true,
        "complete": "payload",
        "targetType": "msg",
        "statusVal": "payload",
        "statusType": "auto",
        "x": 570,
        "y": 1040,
        "wires": []
    },
    {
        "id": "83c41733667fa596",
        "type": "victron-input-ess",
        "z": "dbd727f16cbe7b5f",
        "service": "com.victronenergy.settings",
        "path": "/Settings/CGwacs/BatteryLife/State",
        "serviceObj": {
            "service": "com.victronenergy.settings",
            "name": "Venus settings"
        },
        "pathObj": {
            "path": "/Settings/CGwacs/BatteryLife/State",
            "type": "enum",
            "name": "ESS state",
            "enum": {
                "1": "BatteryLife enabled (GUI controlled)",
                "2": "Optimized Mode /w BatteryLife: self consumption",
                "3": "Optimized Mode /w BatteryLife: self consumption, SoC exceeds 85%",
                "4": "Optimized Mode /w BatteryLife: self consumption, SoC at 100%",
                "5": "Optimized Mode /w BatteryLife: SoC below dynamic SoC limit",
                "6": "Optimized Mode /w BatteryLife: SoC has been below SoC limit for more than 24 hours. Charging the battery (5A)",
                "7": "Optimized Mode /w BatteryLife: Inverter/Charger is in sustain mode",
                "8": "Optimized Mode /w BatteryLife: recharging, SoC dropped by 5% or more below the minimum SoC",
                "9": "'Keep batteries charged' mode is enabled",
                "10": "Optimized mode w/o BatteryLife: self consumption, SoC at or above minimum SoC",
                "11": "Optimized mode w/o BatteryLife: self consumption, SoC is below minimum SoC",
                "12": "Optimized mode w/o BatteryLife: recharging, SoC dropped by 5% or more below minimum SoC"
            }
        },
        "initial": "",
        "name": "",
        "onlyChanges": false,
        "x": 170,
        "y": 1300,
        "wires": [
            [
                "e330792067439a8f"
            ]
        ]
    },
    {
        "id": "e330792067439a8f",
        "type": "debug",
        "z": "dbd727f16cbe7b5f",
        "name": "",
        "active": true,
        "tosidebar": true,
        "console": false,
        "tostatus": true,
        "complete": "payload",
        "targetType": "msg",
        "statusVal": "payload",
        "statusType": "auto",
        "x": 610,
        "y": 1300,
        "wires": []
    },
    {
        "id": "6c7bcea6f992d4c4",
        "type": "victron-input-ess",
        "z": "dbd727f16cbe7b5f",
        "service": "com.victronenergy.settings",
        "path": "/Settings/CGwacs/Hub4Mode",
        "serviceObj": {
            "service": "com.victronenergy.settings",
            "name": "Venus settings"
        },
        "pathObj": {
            "path": "/Settings/CGwacs/Hub4Mode",
            "type": "enum",
            "name": "ESS mode",
            "enum": {
                "1": "Optimized mode or 'keep batteries charged' and phase compensation enabled",
                "2": "Optimized mode or 'keep batteries charged' and phase compensation disabled",
                "3": "External control"
            }
        },
        "initial": "",
        "name": "",
        "onlyChanges": false,
        "x": 170,
        "y": 1360,
        "wires": [
            [
                "9b2b6bb25628994d"
            ]
        ]
    },
    {
        "id": "9b2b6bb25628994d",
        "type": "debug",
        "z": "dbd727f16cbe7b5f",
        "name": "",
        "active": true,
        "tosidebar": true,
        "console": false,
        "tostatus": true,
        "complete": "payload",
        "targetType": "msg",
        "statusVal": "payload",
        "statusType": "auto",
        "x": 610,
        "y": 1360,
        "wires": []
    },
    {
        "id": "4b25d8d1b93fcdba",
        "type": "victron-input-ess",
        "z": "dbd727f16cbe7b5f",
        "service": "com.victronenergy.settings",
        "path": "/Settings/CGwacs/BatteryLife/MinimumSocLimit",
        "serviceObj": {
            "service": "com.victronenergy.settings",
            "name": "Venus settings"
        },
        "pathObj": {
            "path": "/Settings/CGwacs/BatteryLife/MinimumSocLimit",
            "type": "integer",
            "name": "Minimum Discharge SOC (%)"
        },
        "initial": "",
        "name": "",
        "onlyChanges": false,
        "x": 210,
        "y": 900,
        "wires": [
            [
                "7d73444b1e326880",
                "fc436d57b051ac4d"
            ]
        ]
    },
    {
        "id": "7d73444b1e326880",
        "type": "debug",
        "z": "dbd727f16cbe7b5f",
        "name": "",
        "active": true,
        "tosidebar": true,
        "console": false,
        "tostatus": true,
        "complete": "payload",
        "targetType": "msg",
        "statusVal": "payload",
        "statusType": "auto",
        "x": 750,
        "y": 900,
        "wires": []
    },
    {
        "id": "7b463173764e0a38",
        "type": "victron-input-solarcharger",
        "z": "dbd727f16cbe7b5f",
        "service": "com.victronenergy.solarcharger/279",
        "path": "/MppOperationMode",
        "serviceObj": {
            "service": "com.victronenergy.solarcharger/279",
            "name": "MPPT1"
        },
        "pathObj": {
            "path": "/MppOperationMode",
            "type": "enum",
            "name": "MPP operation mode",
            "enum": {
                "0": "Off",
                "1": "Voltage or current limited",
                "2": "MPPT Tracker active",
                "255": "Not available"
            }
        },
        "initial": "",
        "name": "",
        "onlyChanges": false,
        "roundValues": "2",
        "x": 180,
        "y": 1120,
        "wires": [
            [
                "305ce0de1ecf3618"
            ]
        ]
    },
    {
        "id": "305ce0de1ecf3618",
        "type": "function",
        "z": "dbd727f16cbe7b5f",
        "name": "function 1",
        "func": "var code=msg.payload;\n\n// Tableau à deux colonnes\nvar tableau = [\n    [0, 'Off'],\n    [1, 'Voltage or current limited'],\n    [2, 'MPPT Tracker active'],\n    [255, 'Not available'],\n];\n\n// Fonction pour extraire la deuxième colonne en fonction de la première colonne\nfunction extraireDeuxiemeColonne(valeur) {\n    for (var i = 0; i < tableau.length; i++) {\n        if (tableau[i][0] === valeur) {\n            return tableau[i][1];\n        }\n    }\n    return \"Etat Inconnu\"; // Retourne null si aucune correspondance trouvée\n}\n\n// Exemple d'utilisation\nvar valeurRecherchee = code;\nvar resultat = extraireDeuxiemeColonne(valeurRecherchee);\nmsg.payload = resultat;\n\nreturn [msg]",
        "outputs": 1,
        "noerr": 0,
        "initialize": "",
        "finalize": "",
        "libs": [],
        "x": 420,
        "y": 1120,
        "wires": [
            [
                "2ff7bd19f8255f7b"
            ]
        ]
    },
    {
        "id": "8691d04ad00646d5",
        "type": "debug",
        "z": "dbd727f16cbe7b5f",
        "name": "Etat Bus Ve",
        "active": true,
        "tosidebar": true,
        "console": false,
        "tostatus": true,
        "complete": "payload",
        "targetType": "msg",
        "statusVal": "payload",
        "statusType": "auto",
        "x": 590,
        "y": 280,
        "wires": []
    },
    {
        "id": "d88e533063763cf7",
        "type": "victron-input-vebus",
        "z": "dbd727f16cbe7b5f",
        "service": "com.victronenergy.vebus/276",
        "path": "/State",
        "serviceObj": {
            "service": "com.victronenergy.vebus/276",
            "name": "MP2"
        },
        "pathObj": {
            "path": "/State",
            "type": "enum",
            "name": "VE.Bus state",
            "enum": {
                "0": "Off",
                "1": "Low Power",
                "2": "Fault",
                "3": "Bulk",
                "4": "Absorption",
                "5": "Float",
                "6": "Storage",
                "7": "Equalize",
                "8": "Passthru",
                "9": "Inverting",
                "10": "Power assist",
                "11": "Power supply",
                "252": "External control"
            }
        },
        "initial": "",
        "name": "Etat Bus VE",
        "onlyChanges": false,
        "x": 170,
        "y": 280,
        "wires": [
            [
                "8691d04ad00646d5",
                "b844cf4323dde5eb",
                "d9b7ea9803a6357e",
                "4bf2454c3f28dfc5"
            ]
        ]
    },
    {
        "id": "b844cf4323dde5eb",
        "type": "mqtt out",
        "z": "dbd727f16cbe7b5f",
        "name": "Etat Bus VE",
        "topic": "mp2/multiplus2/etatbusve",
        "qos": "",
        "retain": "",
        "respTopic": "",
        "contentType": "",
        "userProps": "",
        "correl": "",
        "expiry": "",
        "broker": "a89b02435258ed38",
        "x": 410,
        "y": 280,
        "wires": []
    },
    {
        "id": "d9b7ea9803a6357e",
        "type": "function",
        "z": "dbd727f16cbe7b5f",
        "name": "function 2",
        "func": "var code=msg.payload;\n\n// Tableau à deux colonnes\nvar tableau = [\n\n    [0, 'Off'],\n    [1, 'Low Power'],\n    [2, 'Fault'],\n    [3, 'Bulk'],\n    [4, 'Absorption'],\n    [5, 'Float'],\n    [6, 'Storage'],\n    [7, 'Equalize'],\n    [8, 'Passthru'],\n    [9, 'Inverting'],\n    [10, 'Power assist'],\n    [11, 'Power supply'],\n    [255, 'External controle'],\n];\n\n// Fonction pour extraire la deuxième colonne en fonction de la première colonne\nfunction extraireDeuxiemeColonne(valeur) {\n    for (var i = 0; i < tableau.length; i++) {\n        if (tableau[i][0] === valeur) {\n            return tableau[i][1];\n        }\n    }\n    return \"Etat Inconnu\"; // Retourne null si aucune correspondance trouvée\n}\n\n// Exemple d'utilisation\nvar valeurRecherchee = code;\nvar resultat = extraireDeuxiemeColonne(valeurRecherchee);\nmsg.payload = resultat;\n\nreturn [msg]",
        "outputs": 1,
        "noerr": 0,
        "initialize": "",
        "finalize": "",
        "libs": [],
        "x": 400,
        "y": 340,
        "wires": [
            [
                "832320e77dc1dea6"
            ]
        ]
    },
    {
        "id": "832320e77dc1dea6",
        "type": "debug",
        "z": "dbd727f16cbe7b5f",
        "name": "Etat Bus Ve",
        "active": true,
        "tosidebar": true,
        "console": false,
        "tostatus": true,
        "complete": "payload",
        "targetType": "msg",
        "statusVal": "payload",
        "statusType": "auto",
        "x": 590,
        "y": 340,
        "wires": []
    },
    {
        "id": "48e118e8b752d94d",
        "type": "victron-input-vebus",
        "z": "dbd727f16cbe7b5f",
        "service": "com.victronenergy.vebus/276",
        "path": "/VebusChargeState",
        "serviceObj": {
            "service": "com.victronenergy.vebus/276",
            "name": "MultiPlus-II 48/5000/70-50"
        },
        "pathObj": {
            "path": "/VebusChargeState",
            "type": "enum",
            "name": "Charge state",
            "enum": {
                "0": "Initialising",
                "1": "Bulk",
                "2": "Absorption",
                "3": "Float",
                "4": "Storage",
                "5": "Absorb repeat",
                "6": "Forced absorb",
                "7": "Equalise",
                "8": "Bulk stopped",
                "9": "Unknown"
            }
        },
        "initial": "",
        "name": "",
        "onlyChanges": false,
        "x": 200,
        "y": 780,
        "wires": [
            [
                "94a9b117fae8ddf8",
                "e03d907484d414ed"
            ]
        ]
    },
    {
        "id": "94a9b117fae8ddf8",
        "type": "mqtt out",
        "z": "dbd727f16cbe7b5f",
        "name": "Etat charge",
        "topic": "mp2/multiplus2/etatcharge",
        "qos": "",
        "retain": "",
        "respTopic": "",
        "contentType": "",
        "userProps": "",
        "correl": "",
        "expiry": "",
        "broker": "a89b02435258ed38",
        "x": 530,
        "y": 780,
        "wires": []
    },
    {
        "id": "e03d907484d414ed",
        "type": "debug",
        "z": "dbd727f16cbe7b5f",
        "name": "Etat Charge",
        "active": true,
        "tosidebar": true,
        "console": false,
        "tostatus": true,
        "complete": "payload",
        "targetType": "msg",
        "statusVal": "payload",
        "statusType": "auto",
        "x": 730,
        "y": 780,
        "wires": []
    },
    {
        "id": "1dccaa10188c860c",
        "type": "victron-input-gridmeter",
        "z": "dbd727f16cbe7b5f",
        "service": "com.victronenergy.grid/31",
        "path": "/Ac/L1/Power",
        "serviceObj": {
            "service": "com.victronenergy.grid/31",
            "name": "PU RESEAU"
        },
        "pathObj": {
            "path": "/Ac/L1/Power",
            "type": "float",
            "name": "L1 Power (W)"
        },
        "name": "Pu Grid",
        "onlyChanges": false,
        "roundValues": "2",
        "x": 150,
        "y": 40,
        "wires": [
            [
                "99d6a8c380836d7c",
                "6745a32af4b730f6",
                "48ab784708f6d7f8"
            ]
        ]
    },
    {
        "id": "99d6a8c380836d7c",
        "type": "mqtt out",
        "z": "dbd727f16cbe7b5f",
        "name": "Pu Grid L1 NR",
        "topic": "mp2/multiplus2/grid_l1_ac",
        "qos": "",
        "retain": "",
        "respTopic": "",
        "contentType": "",
        "userProps": "",
        "correl": "",
        "expiry": "",
        "broker": "a89b02435258ed38",
        "x": 440,
        "y": 40,
        "wires": []
    },
    {
        "id": "6745a32af4b730f6",
        "type": "debug",
        "z": "dbd727f16cbe7b5f",
        "name": "Pu Grid L1 NR",
        "active": true,
        "tosidebar": true,
        "console": false,
        "tostatus": true,
        "complete": "payload",
        "targetType": "msg",
        "statusVal": "payload",
        "statusType": "auto",
        "x": 660,
        "y": 40,
        "wires": []
    },
    {
        "id": "dc8080d0a5b2b274",
        "type": "victron-input-gridmeter",
        "z": "dbd727f16cbe7b5f",
        "service": "",
        "path": "",
        "name": "",
        "onlyChanges": false,
        "x": 1000,
        "y": 620,
        "wires": [
            []
        ]
    },
    {
        "id": "bb0dd028654de35a",
        "type": "victron-input-system",
        "z": "dbd727f16cbe7b5f",
        "service": "",
        "path": "",
        "name": "",
        "onlyChanges": false,
        "x": 1010,
        "y": 320,
        "wires": [
            []
        ]
    },
    {
        "id": "ed4143760115e101",
        "type": "victron-input-system",
        "z": "dbd727f16cbe7b5f",
        "service": "com.victronenergy.system/0",
        "path": "/Dc/InverterCharger/Power",
        "serviceObj": {
            "service": "com.victronenergy.system/0",
            "name": "Venus system"
        },
        "pathObj": {
            "path": "/Dc/InverterCharger/Power",
            "type": "float",
            "name": "Inverter/Charger power"
        },
        "initial": "",
        "name": "AC Conso L1",
        "onlyChanges": false,
        "roundValues": "2",
        "x": 70,
        "y": 240,
        "wires": [
            []
        ]
    },
    {
        "id": "76fd0623aa8568b7",
        "type": "debug",
        "z": "dbd727f16cbe7b5f",
        "name": "Pu Out1",
        "active": true,
        "tosidebar": true,
        "console": false,
        "tostatus": true,
        "complete": "payload",
        "targetType": "msg",
        "statusVal": "payload",
        "statusType": "auto",
        "x": 640,
        "y": 220,
        "wires": []
    },
    {
        "id": "1af8757c8a4823d7",
        "type": "mqtt out",
        "z": "dbd727f16cbe7b5f",
        "name": "Pu Conso Out1",
        "topic": "mp2/multiplus2/conso_out1",
        "qos": "",
        "retain": "",
        "respTopic": "",
        "contentType": "",
        "userProps": "",
        "correl": "",
        "expiry": "",
        "broker": "a89b02435258ed38",
        "x": 400,
        "y": 220,
        "wires": []
    },
    {
        "id": "d13544fb6753df5c",
        "type": "debug",
        "z": "dbd727f16cbe7b5f",
        "name": "",
        "active": true,
        "tosidebar": true,
        "console": false,
        "tostatus": true,
        "complete": "payload",
        "targetType": "msg",
        "statusVal": "payload",
        "statusType": "auto",
        "x": 810,
        "y": 560,
        "wires": []
    },
    {
        "id": "4d89cf2f069496a3",
        "type": "mqtt out",
        "z": "dbd727f16cbe7b5f",
        "name": "Prod Total",
        "topic": "mp2/multiplus2/prod_totale",
        "qos": "",
        "retain": "",
        "respTopic": "",
        "contentType": "",
        "userProps": "",
        "correl": "",
        "expiry": "",
        "broker": "a89b02435258ed38",
        "x": 800,
        "y": 500,
        "wires": []
    },
    {
        "id": "2a7087fd5882db1f",
        "type": "victron-input-vebus",
        "z": "dbd727f16cbe7b5f",
        "service": "com.victronenergy.vebus/276",
        "path": "/Alarms/GridLost",
        "serviceObj": {
            "service": "com.victronenergy.vebus/276",
            "name": "MP2"
        },
        "pathObj": {
            "path": "/Alarms/GridLost",
            "type": "enum",
            "name": "Grid lost alarm",
            "enum": {
                "0": "Ok",
                "2": "Alarm"
            }
        },
        "initial": "",
        "name": "",
        "onlyChanges": false,
        "x": 140,
        "y": 840,
        "wires": [
            [
                "bac07d54839d1719",
                "3df6cec207936905"
            ]
        ]
    },
    {
        "id": "bac07d54839d1719",
        "type": "debug",
        "z": "dbd727f16cbe7b5f",
        "name": "debug 35",
        "active": true,
        "tosidebar": true,
        "console": false,
        "tostatus": true,
        "complete": "payload",
        "targetType": "msg",
        "statusVal": "payload",
        "statusType": "auto",
        "x": 740,
        "y": 840,
        "wires": []
    },
    {
        "id": "3df6cec207936905",
        "type": "mqtt out",
        "z": "dbd727f16cbe7b5f",
        "name": "Etat Reseau",
        "topic": "mp2/multiplus2/grid_lost",
        "qos": "",
        "retain": "",
        "respTopic": "",
        "contentType": "",
        "userProps": "",
        "correl": "",
        "expiry": "",
        "broker": "a89b02435258ed38",
        "x": 530,
        "y": 840,
        "wires": []
    },
    {
        "id": "fc436d57b051ac4d",
        "type": "mqtt out",
        "z": "dbd727f16cbe7b5f",
        "name": "SOC Mini",
        "topic": "mp2/multiplus2/soc_mini",
        "qos": "",
        "retain": "",
        "respTopic": "",
        "contentType": "",
        "userProps": "",
        "correl": "",
        "expiry": "",
        "broker": "a89b02435258ed38",
        "x": 520,
        "y": 900,
        "wires": []
    },
    {
        "id": "baa97094ecb17c98",
        "type": "debug",
        "z": "dbd727f16cbe7b5f",
        "name": "debug 40",
        "active": true,
        "tosidebar": true,
        "console": false,
        "tostatus": true,
        "complete": "payload",
        "targetType": "msg",
        "statusVal": "payload",
        "statusType": "auto",
        "x": 920,
        "y": 120,
        "wires": []
    },
    {
        "id": "5df97bdfb4703e3e",
        "type": "victron-input-custom",
        "z": "dbd727f16cbe7b5f",
        "service": "com.victronenergy.vebus/276",
        "path": "/Ac/Out/L1/P",
        "serviceObj": {
            "service": "com.victronenergy.vebus/276",
            "name": "MP2 (276)"
        },
        "pathObj": {
            "path": "/Ac/Out/L1/P",
            "name": "/Ac/Out/L1/P",
            "type": "number"
        },
        "name": "",
        "onlyChanges": false,
        "x": 150,
        "y": 120,
        "wires": [
            [
                "fb099ddfe29df3b2",
                "efb55a0beb67eb69"
            ]
        ]
    },
    {
        "id": "15dff92011bce9ce",
        "type": "debug",
        "z": "dbd727f16cbe7b5f",
        "name": "debug 41",
        "active": true,
        "tosidebar": true,
        "console": false,
        "tostatus": true,
        "complete": "payload",
        "targetType": "msg",
        "statusVal": "payload",
        "statusType": "auto",
        "x": 920,
        "y": 200,
        "wires": []
    },
    {
        "id": "48ab784708f6d7f8",
        "type": "mqtt out",
        "z": "dbd727f16cbe7b5f",
        "name": "Pu Grid L1 NR",
        "topic": "mp2/multiplus2/grid_l1_ac",
        "qos": "",
        "retain": "",
        "respTopic": "",
        "contentType": "",
        "userProps": "",
        "correl": "",
        "expiry": "",
        "broker": "6f9049bab74834df",
        "x": 1000,
        "y": 40,
        "wires": []
    },
    {
        "id": "c38c639cd57bd526",
        "type": "mqtt out",
        "z": "dbd727f16cbe7b5f",
        "name": "Prod Total",
        "topic": "mp2/multiplus2/prod_totale",
        "qos": "",
        "retain": "",
        "respTopic": "",
        "contentType": "",
        "userProps": "",
        "correl": "",
        "expiry": "",
        "broker": "6f9049bab74834df",
        "x": 800,
        "y": 620,
        "wires": []
    },
    {
        "id": "fb0ffdb6bc324dfa",
        "type": "victron-input-custom",
        "z": "dbd727f16cbe7b5f",
        "service": "com.victronenergy.vebus/276",
        "path": "/Mode",
        "serviceObj": {
            "service": "com.victronenergy.vebus/276",
            "name": "MP2 (276)"
        },
        "pathObj": {
            "path": "/Mode",
            "name": "/Mode",
            "type": "number"
        },
        "name": "",
        "onlyChanges": false,
        "x": 130,
        "y": 700,
        "wires": [
            [
                "b9dff75ed3660193",
                "4fb68042625bcd0a"
            ]
        ]
    },
    {
        "id": "b9dff75ed3660193",
        "type": "debug",
        "z": "dbd727f16cbe7b5f",
        "name": "debug 42",
        "active": true,
        "tosidebar": true,
        "console": false,
        "tostatus": true,
        "complete": "payload",
        "targetType": "msg",
        "statusVal": "payload",
        "statusType": "auto",
        "x": 380,
        "y": 700,
        "wires": []
    },
    {
        "id": "4fb68042625bcd0a",
        "type": "mqtt out",
        "z": "dbd727f16cbe7b5f",
        "name": "Mode de Fonctionnement",
        "topic": "mp2/multiplus2/mode",
        "qos": "",
        "retain": "",
        "respTopic": "",
        "contentType": "",
        "userProps": "",
        "correl": "",
        "expiry": "",
        "broker": "a89b02435258ed38",
        "x": 630,
        "y": 700,
        "wires": []
    },
    {
        "id": "4bf2454c3f28dfc5",
        "type": "mqtt out",
        "z": "dbd727f16cbe7b5f",
        "name": "Etat Bus VE",
        "topic": "mp2/multiplus2/etatbusve",
        "qos": "",
        "retain": "",
        "respTopic": "",
        "contentType": "",
        "userProps": "",
        "correl": "",
        "expiry": "",
        "broker": "6f9049bab74834df",
        "x": 830,
        "y": 280,
        "wires": []
    },
    {
        "id": "fb099ddfe29df3b2",
        "type": "change",
        "z": "dbd727f16cbe7b5f",
        "name": "Save P",
        "rules": [
            {
                "t": "set",
                "p": "pu",
                "pt": "flow",
                "to": "payload",
                "tot": "msg"
            }
        ],
        "action": "",
        "property": "",
        "from": "",
        "to": "",
        "reg": false,
        "x": 360,
        "y": 120,
        "wires": [
            [
                "baa97094ecb17c98",
                "d87e16cdca5d7af8"
            ]
        ]
    },
    {
        "id": "efb55a0beb67eb69",
        "type": "change",
        "z": "dbd727f16cbe7b5f",
        "name": "Save Consol1",
        "rules": [
            {
                "t": "set",
                "p": "consol1",
                "pt": "flow",
                "to": "payload",
                "tot": "msg"
            }
        ],
        "action": "",
        "property": "",
        "from": "",
        "to": "",
        "reg": false,
        "x": 260,
        "y": 180,
        "wires": [
            [
                "76fd0623aa8568b7",
                "d87e16cdca5d7af8",
                "1af8757c8a4823d7"
            ]
        ]
    },
    {
        "id": "d87e16cdca5d7af8",
        "type": "function",
        "z": "dbd727f16cbe7b5f",
        "name": "Additionne",
        "func": "let p = flow.get('pu')\nlet c = flow.get('consol1')\nvar sum=0;\nsum = ((p+c)).toFixed(0);\n\nmsg.payload = (sum);\nreturn [msg]\n\n\n",
        "outputs": 1,
        "timeout": "",
        "noerr": 0,
        "initialize": "",
        "finalize": "",
        "libs": [],
        "x": 590,
        "y": 160,
        "wires": [
            [
                "15dff92011bce9ce"
            ]
        ]
    },
    {
        "id": "9c611a60b8cb5463",
        "type": "change",
        "z": "dbd727f16cbe7b5f",
        "name": "Save MPPT1",
        "rules": [
            {
                "t": "set",
                "p": "mppt1",
                "pt": "flow",
                "to": "payload",
                "tot": "msg"
            }
        ],
        "action": "",
        "property": "",
        "from": "",
        "to": "",
        "reg": false,
        "x": 250,
        "y": 440,
        "wires": [
            [
                "aba221edbad2b550",
                "25f3138e14095a95"
            ]
        ]
    },
    {
        "id": "fb84cacd5817c316",
        "type": "change",
        "z": "dbd727f16cbe7b5f",
        "name": "Save PVMO",
        "rules": [
            {
                "t": "set",
                "p": "pvmo",
                "pt": "flow",
                "to": "payload",
                "tot": "msg"
            }
        ],
        "action": "",
        "property": "",
        "from": "",
        "to": "",
        "reg": false,
        "x": 230,
        "y": 620,
        "wires": [
            [
                "3c4855145c88623a",
                "25f3138e14095a95"
            ]
        ]
    },
    {
        "id": "25f3138e14095a95",
        "type": "function",
        "z": "dbd727f16cbe7b5f",
        "name": "Additionne",
        "func": "let p = flow.get('mppt1')\nlet c = flow.get('pvmo')\nvar sum=0;\nsum = (p+c).toFixed(0);\n\nmsg.payload = (sum);\nreturn [msg]\n\n\n\n\n",
        "outputs": 1,
        "timeout": "",
        "noerr": 0,
        "initialize": "",
        "finalize": "",
        "libs": [],
        "x": 430,
        "y": 520,
        "wires": [
            [
                "6906a12da16f3418",
                "4d89cf2f069496a3",
                "d13544fb6753df5c",
                "c38c639cd57bd526"
            ]
        ]
    },
    {
        "id": "6906a12da16f3418",
        "type": "debug",
        "z": "dbd727f16cbe7b5f",
        "name": "debug 46",
        "active": true,
        "tosidebar": true,
        "console": false,
        "tostatus": true,
        "complete": "payload",
        "targetType": "msg",
        "statusVal": "payload",
        "statusType": "auto",
        "x": 580,
        "y": 560,
        "wires": []
    },
    {
        "id": "4adb91f975a08cb4",
        "type": "victron-input-custom",
        "z": "dbd727f16cbe7b5f",
        "service": "com.victronenergy.vebus/276",
        "path": "/Ac/Out/L1/NominalInverterPower",
        "serviceObj": {
            "service": "com.victronenergy.vebus/276",
            "name": "MP2 (276)"
        },
        "pathObj": {
            "path": "/Ac/Out/L1/NominalInverterPower",
            "name": "/Ac/Out/L1/NominalInverterPower",
            "type": "number",
            "value": 4500
        },
        "name": "",
        "onlyChanges": false,
        "x": 190,
        "y": 520,
        "wires": [
            []
        ]
    },
    {
        "id": "a89b02435258ed38",
        "type": "mqtt-broker",
        "name": "MQTTHA",
        "broker": "192.168.0.37",
        "port": "1883",
        "clientid": "",
        "autoConnect": true,
        "usetls": false,
        "protocolVersion": "4",
        "keepalive": "60",
        "cleansession": true,
        "birthTopic": "",
        "birthQos": "0",
        "birthPayload": "",
        "birthMsg": {},
        "closeTopic": "",
        "closeQos": "0",
        "closePayload": "",
        "closeMsg": {},
        "willTopic": "",
        "willQos": "0",
        "willPayload": "",
        "willMsg": {},
        "userProps": "",
        "sessionExpiry": ""
    },
    {
        "id": "6f9049bab74834df",
        "type": "mqtt-broker",
        "name": "Proxmox",
        "broker": "192.168.0.204",
        "port": "1883",
        "clientid": "",
        "autoConnect": true,
        "usetls": false,
        "protocolVersion": "4",
        "keepalive": "60",
        "cleansession": true,
        "autoUnsubscribe": true,
        "birthTopic": "",
        "birthQos": "0",
        "birthPayload": "",
        "birthMsg": {},
        "closeTopic": "",
        "closeQos": "0",
        "closePayload": "",
        "closeMsg": {},
        "willTopic": "",
        "willQos": "0",
        "willPayload": "",
        "willMsg": {},
        "userProps": "",
        "sessionExpiry": ""
    }
]

Pour que la capture d’écran soit la plus utile possible pour vos lecteurs, voici quelques conseils :

  1. Zoom et lisibilité : Assurez-vous que les noms des nœuds (comme « PV MPPT1 », « Pu Grid », etc.) sont lisibles. Vous pouvez zoomer légèrement dans Node-RED avant de prendre la capture.
  2. Organisation : Si le flow est très étendu, essayez de le réorganiser pour qu’il tienne dans une seule vue (vous pouvez déplacer les nœuds temporairement pour la capture).
  3. Annotations : Si possible, ajoutez des annotations (par exemple, avec un outil comme Paint ou GIMP) pour indiquer les sections importantes, comme « Puissance PV », « État VE.Bus », etc.
  4. Format : Enregistrez l’image en PNG ou JPEG pour une bonne qualité, et hébergez-la sur votre blog ou un service d’hébergement d’images (comme Imgur) pour l’intégrer dans l’article.

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *