[TUTORIAL] Solaredge Integration | Solar Panels

Bonjour à tout le monde :slight_smile:

Ceci est mon premier tutoriel, j’espère que je vais m’y prendre correctement, n’hésitez pas à me le dire le cas contraire.

Pour les possesseurs d’une installation photovoltïque de la marque Solarredge, voici comment faire un relevé basique des informations récupérées à partir des serveurs de la marque. Ceci vous permettra d’obtenir ce genre de rendu, qui me servira d’exemple dans ce tuto :


PREREQUIS

Ces étapes sont détaillées dans le tutoriel

  • Posséder du matériel Solaredge et avoir crée une clé API
  • Avoir installé Gladys (captain obvious aux commandes !)
  • Avoir installé l’intégration MQTT
  • Avoir installé Node-red

CREATION CLE API SOLAREDGE

Pour créer cette clé il faut vous rendre sur le monitoring web de Solaredge à cette adresse : https://monitoring.solaredge.com/
Une fois vos identifiants rentrés, vous obtiendrez ce menu :

Il faudra aller dans le menu ADMIN puis dans Politique d’accès de site :
image

Vous verrez ensuite cet onglet dans lequel vous allez pouvoir générer une clé API, puis sauvegarder.

Copiez cette clé API ainsi que votre id de site, nous en aurons besoin plus tard.


INSTALLATION DE GLADYS


INSTALLATION MQTT

Cela se fait dans Gladys, dans l’onglet Intégration, en un seul clic.
Cette étape est décrite dans la vidéo sur l’installation de Node-red

INSTALLATION ET UTILISATION DE NODE-RED

Je précise que je ne connaissais absolument pas l’outil avant de m’y lancer… et c’est plutôt simple pour les fonctions que nous allons utiliser. Si vous avez su installer Gladys / un container Docker, vous saurez vous débrouiller avec Node-red !!

Une fois que vous avez regardé cette vidéo vous avez compris comment on peut récupérer des informations dans Node-red et les envoyer vers Gladys via un broker MQTT.

Il ne reste donc plus qu’à :

  1. Ajouter dans Node-red un node qui va s’occuper de récupérer les données de Solaredge.
  2. Créer des appareils MQTT dans Gladys qui vont réceptionner ces informations

AJOUTER UN NODE SOLAREDGE DANS NODE-RED

Comme vu dans le tutoriel vidéo de Node-red, il vous faudra aller dans le menu utilisateur puis Manage palette puis Install.
Dans le champ de recherche tapez solaredge-power et vous verrez le node apparaitre comme ici :


Installez-le en cliquant sur le bouton Install.

Vous trouverez plus d’informations sur ce node et ses possibilités ici : node-red-contrib-solaredge-power (node) - Node-RED

Afin d’obtenir le rendu qui est le mien (qui n’est qu’un exemple parmi tant d’autres) vous pouvez importer directement ce Flow dans dans Node-red en faisant Ctrl + i puis en collant le texte suivant :

[{"id":"8b907e98a30cda10","type":"tab","label":"Solaredge -- Gladys","disabled":false,"info":"","env":[]},{"id":"fa05dcc6c3f56552","type":"solaredge-power","z":"8b907e98a30cda10","site":"2fabbdc11f7b34e7","interval":"60","command":"currentPowerFlow","x":240,"y":240,"wires":[["b8500338f743f0e1","d0db7133d9d66d12","a88f3e6358c15a97","c3c4dc589062d8b9"]]},{"id":"942e56ee501b6810","type":"mqtt out","z":"8b907e98a30cda10","name":"","topic":"gladys/master/device/mqtt:prodpv/feature/mqtt:prodpvwh/state","qos":"2","retain":"","respTopic":"","contentType":"","userProps":"","correl":"","expiry":"","broker":"493ea564b5a53f2c","x":930,"y":60,"wires":[]},{"id":"b8500338f743f0e1","type":"function","z":"8b907e98a30cda10","name":"production power","func":"const input = msg.payload;\n\nmsg.payload = input.siteCurrentPowerFlow.PV.currentPower;\nreturn msg;","outputs":1,"noerr":0,"initialize":"","finalize":"","libs":[],"x":470,"y":180,"wires":[["942e56ee501b6810","56c91d64cc144d13"]]},{"id":"d0db7133d9d66d12","type":"function","z":"8b907e98a30cda10","name":"GRID power","func":"const input = msg.payload;\n\nmsg.payload = input.siteCurrentPowerFlow.GRID.currentPower;\nreturn msg;","outputs":1,"noerr":0,"initialize":"","finalize":"","libs":[],"x":450,"y":240,"wires":[["994e508550b78db1","c1e862f32f20a5c6"]]},{"id":"994e508550b78db1","type":"mqtt out","z":"8b907e98a30cda10","name":"","topic":"gladys/master/device/mqtt:grid/feature/mqtt:grid/state","qos":"2","retain":"","respTopic":"","contentType":"","userProps":"","correl":"","expiry":"","broker":"493ea564b5a53f2c","x":900,"y":240,"wires":[]},{"id":"c820a2f46af7893c","type":"mqtt out","z":"8b907e98a30cda10","name":"","topic":"gladys/master/device/mqtt:load/feature/mqtt:load/state","qos":"2","retain":"","respTopic":"","contentType":"","userProps":"","correl":"","expiry":"","broker":"493ea564b5a53f2c","x":900,"y":400,"wires":[]},{"id":"a88f3e6358c15a97","type":"function","z":"8b907e98a30cda10","name":"LOAD power","func":"const input = msg.payload;\n\nmsg.payload = input.siteCurrentPowerFlow.LOAD.currentPower;\nreturn msg;","outputs":1,"noerr":0,"initialize":"","finalize":"","libs":[],"x":450,"y":300,"wires":[["c820a2f46af7893c","04af47c06005340b"]]},{"id":"04af47c06005340b","type":"debug","z":"8b907e98a30cda10","name":"","active":false,"tosidebar":true,"console":false,"tostatus":false,"complete":"false","statusVal":"","statusType":"auto","x":770,"y":460,"wires":[]},{"id":"56c91d64cc144d13","type":"debug","z":"8b907e98a30cda10","name":"","active":false,"tosidebar":true,"console":false,"tostatus":false,"complete":"false","statusVal":"","statusType":"auto","x":770,"y":120,"wires":[]},{"id":"c1e862f32f20a5c6","type":"debug","z":"8b907e98a30cda10","name":"","active":false,"tosidebar":true,"console":false,"tostatus":false,"complete":"false","statusVal":"","statusType":"auto","x":770,"y":300,"wires":[]},{"id":"c3c4dc589062d8b9","type":"debug","z":"8b907e98a30cda10","name":"String complet","active":false,"tosidebar":true,"console":false,"tostatus":false,"complete":"payload","targetType":"msg","statusVal":"","statusType":"auto","x":240,"y":200,"wires":[]},{"id":"2fabbdc11f7b34e7","type":"solaredge-power-site","siteid":"","apikey":""},{"id":"493ea564b5a53f2c","type":"mqtt-broker","name":"","broker":"mqtt://localhost","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":{},"sessionExpiry":""}]

Vous devriez vous retrouver avec ceci :

Il vous faudra ensuite modifier le node SolarEdge Power (en jaune) avec les valeurs de votre API / id de site Solaredge :

CREER DES APPAREILS MQTT DANS GLADYS

Comme vous l’avez vu dans le tutoriel vidéo de @pierre-gilles vous pouvez créer des appareils MQTT qui vont dialoguer avec Node-red.
Voici un exemple d’appareil pour récupérer les données sur la consommation electrique totale de la maison :


Cet appareil sera lié à ce node-ci :
image

Afin de bienles lier, il vous faut copier dans Gladys la valeur de Topic MQTT et la coller ensuite dans les propriétés du node dans Node-red, ici :

Vous pourrez ensuite faire de même avec 2 autres appareils MQTT liés aux deux autres nodes.

Vous y êtes arrivés ! Enfin normalement… :slight_smile:


Voilà donc la fin de ce tuto, je ne sais pas si tout cela aura été clair, si jamais vous rencontrez un souci je peux essayer de vous aider dans la mesure -plutôt courte- de mes compétences !

Bonne installation !

8 Likes

Génial @guim31, très beau tutoriel, et très complet ! :clap:

Je vais le partager à la communauté

1 Like

Bravo, c’est super complet, ça donne presque envie d’avoir des panneaux solaires :grinning_face_with_smiling_eyes:

2 Likes

Cool, I’ll see if I can do the same with my inverter!!!

Otherwise you can simplify the flow like this

[
    {
        "id": "8b907e98a30cda10",
        "type": "tab",
        "label": "Solaredge -- Gladys",
        "disabled": false,
        "info": "",
        "env": []
    },
    {
        "id": "b8500338f743f0e1",
        "type": "function",
        "z": "8b907e98a30cda10",
        "name": "Production power",
        "func": "const input = msg.payload;\\n\\nmsg.payload = input.siteCurrentPowerFlow.PV.currentPower;\\nmsg.topic = \\\"gladys/master/device/mqtt:prodpv/feature/mqtt:prodpvwh/state\\\"\\n\\nreturn msg;",
        "outputs": 1,
        "noerr": 0,
        "initialize": "",
        "finalize": "",
        "libs": [],
        "x": 490,
        "y": 100,
        "wires": [
            [
                "56c91d64cc144d13",
                "c820a2f46af7893c",
                "c1e862f32f20a5c6"
            ]
        ]
    },
    {
        "id": "d0db7133d9d66d12",
        "type": "function",
        "z": "8b907e98a30cda10",
        "name": "GRID power",
        "func": "const input = msg.payload;\\n\\nmsg.payload = input.siteCurrentPowerFlow.GRID.currentPower;\\nmsg.topic = \\\"gladys/master/device/mqtt:grid/feature/mqtt:grid/state\\\"\\n\\nreturn msg;",
        "outputs": 1,
        "noerr": 0,
        "initialize": "",
        "finalize": "",
        "libs": [],
        "x": 470,
        "y": 340,
        "wires": [
            [
                "c820a2f46af7893c",
                "6bdda102eda08a76",
                "da1791446c730e7b"
            ]
        ]
    },
    {
        "id": "c820a2f46af7893c",
        "type": "mqtt out",
        "z": "8b907e98a30cda10",
        "name": "Gladys",
        "topic": "",
        "qos": "2",
        "retain": "",
        "respTopic": "",
        "contentType": "",
        "userProps": "",
        "correl": "",
        "expiry": "",
        "broker": "493ea564b5a53f2c",
        "x": 1030,
        "y": 340,
        "wires": []
    },
    {
        "id": "a88f3e6358c15a97",
        "type": "function",
        "z": "8b907e98a30cda10",
        "name": "LOAD power",
        "func": "const input = msg.payload;\\n\\nmsg.payload = input.siteCurrentPowerFlow.LOAD.currentPower;\\nmsg.topic = \\\"gladys/master/device/mqtt:load/feature/mqtt:load/state\\\"\\n\\nreturn msg;",
        "outputs": 1,
        "noerr": 0,
        "initialize": "",
        "finalize": "",
        "libs": [],
        "x": 470,
        "y": 480,
        "wires": [
            [
                "c820a2f46af7893c",
                "44d3b110693a417a",
                "c1809061ef479d05"
            ]
        ]
    },
    {
        "id": "56c91d64cc144d13",
        "type": "debug",
        "z": "8b907e98a30cda10",
        "name": "",
        "active": false,
        "tosidebar": true,
        "console": false,
        "tostatus": true,
        "complete": "topic",
        "targetType": "msg",
        "statusVal": "",
        "statusType": "auto",
        "x": 960,
        "y": 120,
        "wires": []
    },
    {
        "id": "c1e862f32f20a5c6",
        "type": "debug",
        "z": "8b907e98a30cda10",
        "name": "",
        "active": false,
        "tosidebar": true,
        "console": false,
        "tostatus": true,
        "complete": "payload",
        "targetType": "msg",
        "statusVal": "",
        "statusType": "auto",
        "x": 970,
        "y": 180,
        "wires": []
    },
    {
        "id": "fa05dcc6c3f56552",
        "type": "solaredge-power",
        "z": "8b907e98a30cda10",
        "site": "2fabbdc11f7b34e7",
        "interval": "60",
        "command": "currentPowerFlow",
        "x": 160,
        "y": 340,
        "wires": [
            [
                "b8500338f743f0e1",
                "d0db7133d9d66d12",
                "a88f3e6358c15a97",
                "6939ab79a4d2044f",
                "4d18e79756d987a6"
            ]
        ]
    },
    {
        "id": "44d3b110693a417a",
        "type": "debug",
        "z": "8b907e98a30cda10",
        "name": "",
        "active": false,
        "tosidebar": true,
        "console": false,
        "tostatus": true,
        "complete": "topic",
        "targetType": "msg",
        "statusVal": "",
        "statusType": "auto",
        "x": 660,
        "y": 540,
        "wires": []
    },
    {
        "id": "c1809061ef479d05",
        "type": "debug",
        "z": "8b907e98a30cda10",
        "name": "",
        "active": false,
        "tosidebar": true,
        "console": false,
        "tostatus": true,
        "complete": "payload",
        "targetType": "msg",
        "statusVal": "",
        "statusType": "auto",
        "x": 670,
        "y": 600,
        "wires": []
    },
    {
        "id": "da1791446c730e7b",
        "type": "debug",
        "z": "8b907e98a30cda10",
        "name": "",
        "active": false,
        "tosidebar": true,
        "console": false,
        "tostatus": true,
        "complete": "topic",
        "targetType": "msg",
        "statusVal": "",
        "statusType": "auto",
        "x": 660,
        "y": 220,
        "wires": []
    },
    {
        "id": "6bdda102eda08a76",
        "type": "debug",
        "z": "8b907e98a30cda10",
        "name": "",
        "active": false,
        "tosidebar": true,
        "console": false,
        "tostatus": true,
        "complete": "payload",
        "targetType": "msg",
        "statusVal": "",
        "statusType": "auto",
        "x": 670,
        "y": 280,
        "wires": []
    },
    {
        "id": "6939ab79a4d2044f",
        "type": "debug",
        "z": "8b907e98a30cda10",
        "name": "",
        "active": false,
        "tosidebar": true,
        "console": false,
        "tostatus": true,
        "complete": "topic",
        "targetType": "msg",
        "statusVal": "",
        "statusType": "auto",
        "x": 360,
        "y": 600,
        "wires": []
    },
    {
        "id": "4d18e79756d987a6",
        "type": "debug",
        "z": "8b907e98a30cda10",
        "name": "",
        "active": false,
        "tosidebar": true,
        "console": false,
        "tostatus": true,
        "complete": "payload",
        "targetType": "msg",
        "statusVal": "",
        "statusType": "auto",
        "x": 370,
        "y": 660,
        "wires": []
    },
    {
        "id": "493ea564b5a53f2c",
        "type": "mqtt-broker",
        "name": "",
        "broker": "mqtt://localhost",
        "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": {},
        "sessionExpiry": ""
    },
    {
        "id": "2fabbdc11f7b34e7",
        "type": "solaredge-power-site",
        "siteid": "",
        "apikey": ""
    }
]
1 Like

Great tutorial.
I just had panels from this brand installed, followed the tutorial to the letter and everything works perfectly. Thanks @guim31
A small clarification for newcomers like me: GRID corresponds to the difference between household consumption and PV production (electricity supplier or surplus), LOAD to the household consumption and production .. well, production from the panels.
Soon I’ll try a connected MQTT module to display consumption levels with red/green LEDs and to know when I can turn on an extra load

3 Likes

Cool !! :grin:
I’m really happy to read that my tutorial was helpful to someone!

Hello @guim31 , are you facing a request limit?
Everything was working

Hi!

I must admit I don’t check Gladys regularly, but since you mentioned it I went into Node-RED in which I see a lot of error messages.

In particular my initial node for the SolarEdge tool returns: « Invalid JSON returned » … but not all the time ^^

Which suggests that from time to time the API call is blocked if it’s too frequent. I’m not sure it’s a per-day limit; otherwise I’d probably be blocked too —