Hello guest, if you read this it means you are not registered. Click here to register in a few simple steps, you will enjoy all features of our Forum.
Hi Guest this is an announcement for guests !!!

Note de ce sujet :
  • Moyenne : 0 (0 vote(s))
  • 1
  • 2
  • 3
  • 4
  • 5
Vidéo explicative sur la lecture en RS485 Modbus
#1
Citation :Comment lire les données d'un appareil de mesure 230V via son port RS485 en protocole Modbus ?

Sans écrire une ligne de code, voici comment lire et décrypter les données d'un appareil de mesure 230V du type SDM120.
Celui ci a un port de communication RS485 et utilise le protocole Modbus pour dialoguer.
On va voir qu'avec 3 nœuds Nodered le job peut être obtenu.
Là où il fallait des heures de programmation. Cette technique peut s'appliquer à la plupart des appareils connectés.
(Bien évidemment on pourrait utiliser un ESP pour ce faire mais ce n'était pas le but)
Cette vidéo est assez technique, accrochez-vous Blush



   
Jean-Luc
Like Répondre
#2
Salut Jean-Luc

C'est marrant mais en cherchant des info sur mon Module Chint je me suis retrouvé par hasard sur la video de ton SDM120CT.
Tu aurais pu m'en parlais j'aurais ptet pris ce modele...

Tiens du coup qq questions :

-Tu l'as acheté ou ton SDM120CT ? Combien ?

-Tu pourrais partager ton flow ? C'est pas qu'il est compliqué , mais sur ta video tu as une grosse tête Laughing qui masque les parametres a un moment.

-Comment sais tu qu'il faut appliquer un Ratio sur les registres que tu lis ? J'ai parcouru la doc mais j'ai rien vu.
Like Répondre
#3
Oulààà tu déterres des archives Laughing 

J'avais presque oublié cette vidéo. Oui j'ai une grosse tête, j'ai en peu corrigé dans les dernières. J'ai moins la grosse tête Wink 

Bon j'ai vraiment dû fouiller pour retrouver le code.
Le voici.
Je l'avais trouvé tel que sur le Net à l'époque. Il pourrait à l'évidence être amélioré mais il fonctionnait.

La bestiole, c'est mon fils un jour qui est venu avec et m'a dit, tiens ils ne s'en servent pas au boulot.

Ca fonctionne bien cela dit. Mais j'ai un faible certain pour le petit dernier en zigbee direct dans HA. Ah le prêt à porter sur la confection de masse, éternel débat.
Bon j'arrête de délirer, voici le code

Format fichier:    
.json   flows(39).json (Taille : 12.67 Ko / Téléchargements : 648)

Ou direct copier / coller

Code :
[
    {
        "id": "de9ded18.1099f",
        "type": "tab",
        "label": "Modbus Energy meter",
        "disabled": false,
        "info": ""
    },
    {
        "id": "b3ae0448.822d08",
        "type": "comment",
        "z": "de9ded18.1099f",
        "name": "SDM120 Energy Meter",
        "info": "",
        "x": 140,
        "y": 280,
        "wires": []
    },
    {
        "id": "53b4b356.bf124c",
        "type": "modbus-read",
        "z": "de9ded18.1099f",
        "name": "SDM 120 Voltage",
        "topic": "",
        "showStatusActivities": true,
        "logIOActivities": false,
        "showErrors": true,
        "unitid": "1",
        "dataType": "InputRegister",
        "adr": "0",
        "quantity": "2",
        "rate": "5",
        "rateUnit": "s",
        "delayOnStart": true,
        "startDelayTime": "5",
        "server": "40f20c7f.13a934",
        "useIOFile": false,
        "ioFile": "",
        "useIOForPayload": false,
        "emptyMsgOnFail": false,
        "x": 140,
        "y": 340,
        "wires": [
            [
                "e4d3fade.1132a8"
            ],
            []
        ]
    },
    {
        "id": "e4d3fade.1132a8",
        "type": "function",
        "z": "de9ded18.1099f",
        "name": "Voltage",
        "func": "var rawData = new ArrayBuffer(4);\nvar intView = new Uint16Array(rawData);\nvar fltView = new Float32Array(rawData);\n\nintView[0] = msg.payload[1]; //low\nintView[1] = msg.payload[0]; //high\n\nmsg.payload = parseFloat(fltView[0].toFixed(1));\nmsg.topic = \"voltage\";\n\nnode.status({fill:\"blue\",shape:\"ring\",text:msg.topic + \":\" + msg.payload});    \n\nreturn msg;",
        "outputs": 1,
        "noerr": 0,
        "x": 320,
        "y": 340,
        "wires": [
            [
                "94b7c2b7.b61ae",
                "267d6c75.311c84"
            ]
        ]
    },
    {
        "id": "e3643b3e.be3a88",
        "type": "function",
        "z": "de9ded18.1099f",
        "name": "Current",
        "func": "var rawData = new ArrayBuffer(4);\nvar intView = new Uint16Array(rawData);\nvar fltView = new Float32Array(rawData);\n\nintView[0] = msg.payload[1]; //low\nintView[1] = msg.payload[0]; //high\n\nmsg.payload = parseFloat(fltView[0].toFixed(1));\nmsg.topic = \"current\";\n\nnode.status({fill:\"blue\",shape:\"ring\",text:msg.topic + \":\" + msg.payload});    \n\nreturn msg;",
        "outputs": 1,
        "noerr": 0,
        "x": 320,
        "y": 400,
        "wires": [
            [
                "fa18b5f3.ba6be8",
                "267d6c75.311c84"
            ]
        ]
    },
    {
        "id": "4dbf9277.487e4c",
        "type": "function",
        "z": "de9ded18.1099f",
        "name": "Power",
        "func": "var rawData = new ArrayBuffer(4);\nvar intView = new Uint16Array(rawData);\nvar fltView = new Float32Array(rawData);\n\nintView[0] = msg.payload[1]; //low\nintView[1] = msg.payload[0]; //high\n\nmsg.payload = parseFloat(fltView[0].toFixed(1));\nmsg.payload = msg.payload * (-1)\nmsg.topic = \"power\";\n\nnode.status({fill:\"blue\",shape:\"ring\",text:msg.topic + \":\" + msg.payload});    \n\nreturn msg;",
        "outputs": 1,
        "noerr": 0,
        "initialize": "",
        "finalize": "",
        "x": 310,
        "y": 460,
        "wires": [
            [
                "c3697655.758e28",
                "267d6c75.311c84"
            ]
        ]
    },
    {
        "id": "593c6698.c25388",
        "type": "function",
        "z": "de9ded18.1099f",
        "name": "Frequency",
        "func": "var rawData = new ArrayBuffer(4);\nvar intView = new Uint16Array(rawData);\nvar fltView = new Float32Array(rawData);\n\nintView[0] = msg.payload[1]; //low\nintView[1] = msg.payload[0]; //high\n\nmsg.payload = parseFloat(fltView[0].toFixed(1));\nmsg.topic = \"frequency\";\n\nnode.status({fill:\"blue\",shape:\"ring\",text:msg.topic + \":\" + msg.payload});    \n\nreturn msg;",
        "outputs": 1,
        "noerr": 0,
        "x": 330,
        "y": 520,
        "wires": [
            [
                "c38e8fed.7fb6a",
                "267d6c75.311c84"
            ]
        ]
    },
    {
        "id": "7df027a2.13a1f8",
        "type": "function",
        "z": "de9ded18.1099f",
        "name": "Energy",
        "func": "var rawData = new ArrayBuffer(4);\nvar intView = new Uint16Array(rawData);\nvar fltView = new Float32Array(rawData);\n\nintView[0] = msg.payload[1]; //low\nintView[1] = msg.payload[0]; //high\n\nmsg.payload = parseFloat(fltView[0].toFixed(2));\nmsg.topic = \"energy\";\n\nnode.status({fill:\"blue\",shape:\"ring\",text:msg.topic + \":\" + msg.payload});    \n\nreturn msg;",
        "outputs": 1,
        "noerr": 0,
        "initialize": "",
        "finalize": "",
        "x": 320,
        "y": 580,
        "wires": [
            [
                "d87b3ecd.2dab2",
                "267d6c75.311c84"
            ]
        ]
    },
    {
        "id": "7d42a707.bcd618",
        "type": "modbus-read",
        "z": "de9ded18.1099f",
        "name": "SDM 120 Current",
        "topic": "",
        "showStatusActivities": true,
        "logIOActivities": false,
        "showErrors": true,
        "unitid": "1",
        "dataType": "InputRegister",
        "adr": "6",
        "quantity": "2",
        "rate": "5",
        "rateUnit": "s",
        "delayOnStart": true,
        "startDelayTime": "5",
        "server": "40f20c7f.13a934",
        "useIOFile": false,
        "ioFile": "",
        "useIOForPayload": false,
        "emptyMsgOnFail": false,
        "x": 140,
        "y": 400,
        "wires": [
            [
                "e3643b3e.be3a88"
            ],
            []
        ]
    },
    {
        "id": "576a7fbe.d0861",
        "type": "modbus-read",
        "z": "de9ded18.1099f",
        "name": "SDM 120 Power",
        "topic": "",
        "showStatusActivities": true,
        "logIOActivities": false,
        "showErrors": true,
        "unitid": "1",
        "dataType": "InputRegister",
        "adr": "12",
        "quantity": "2",
        "rate": "5",
        "rateUnit": "s",
        "delayOnStart": true,
        "startDelayTime": "5",
        "server": "40f20c7f.13a934",
        "useIOFile": false,
        "ioFile": "",
        "useIOForPayload": false,
        "emptyMsgOnFail": false,
        "x": 140,
        "y": 460,
        "wires": [
            [
                "4dbf9277.487e4c"
            ],
            []
        ]
    },
    {
        "id": "519b5a74.1a7314",
        "type": "modbus-read",
        "z": "de9ded18.1099f",
        "name": "SDM 120 Frequency",
        "topic": "",
        "showStatusActivities": true,
        "logIOActivities": false,
        "showErrors": true,
        "unitid": "1",
        "dataType": "InputRegister",
        "adr": "70",
        "quantity": "2",
        "rate": "5",
        "rateUnit": "s",
        "delayOnStart": true,
        "startDelayTime": "5",
        "server": "40f20c7f.13a934",
        "useIOFile": false,
        "ioFile": "",
        "useIOForPayload": false,
        "emptyMsgOnFail": false,
        "x": 150,
        "y": 520,
        "wires": [
            [
                "593c6698.c25388"
            ],
            []
        ]
    },
    {
        "id": "b84798db.04be98",
        "type": "modbus-read",
        "z": "de9ded18.1099f",
        "name": "SDM 120 Energy",
        "topic": "",
        "showStatusActivities": true,
        "logIOActivities": false,
        "showErrors": true,
        "unitid": "1",
        "dataType": "InputRegister",
        "adr": "342",
        "quantity": "2",
        "rate": "60",
        "rateUnit": "s",
        "delayOnStart": true,
        "startDelayTime": "5",
        "server": "40f20c7f.13a934",
        "useIOFile": false,
        "ioFile": "",
        "useIOForPayload": false,
        "emptyMsgOnFail": false,
        "x": 140,
        "y": 580,
        "wires": [
            [
                "7df027a2.13a1f8",
                "1b35ee5d.7dd512"
            ],
            []
        ]
    },
    {
        "id": "94b7c2b7.b61ae",
        "type": "ui_text",
        "z": "de9ded18.1099f",
        "group": "b1bb14f0043ca966",
        "order": 0,
        "width": 0,
        "height": 0,
        "name": "",
        "label": "Voltage",
        "format": "{{msg.payload}} V",
        "layout": "row-spread",
        "x": 500,
        "y": 340,
        "wires": []
    },
    {
        "id": "fa18b5f3.ba6be8",
        "type": "ui_text",
        "z": "de9ded18.1099f",
        "group": "b1bb14f0043ca966",
        "order": 1,
        "width": 0,
        "height": 0,
        "name": "",
        "label": "Current",
        "format": "{{msg.payload}} A",
        "layout": "row-spread",
        "x": 500,
        "y": 400,
        "wires": []
    },
    {
        "id": "c3697655.758e28",
        "type": "ui_text",
        "z": "de9ded18.1099f",
        "group": "b1bb14f0043ca966",
        "order": 2,
        "width": 0,
        "height": 0,
        "name": "",
        "label": "Power",
        "format": "{{msg.payload}} W",
        "layout": "row-spread",
        "x": 490,
        "y": 460,
        "wires": []
    },
    {
        "id": "c38e8fed.7fb6a",
        "type": "ui_text",
        "z": "de9ded18.1099f",
        "group": "b1bb14f0043ca966",
        "order": 3,
        "width": 0,
        "height": 0,
        "name": "",
        "label": "Frequency",
        "format": "{{msg.payload}} Hz",
        "layout": "row-spread",
        "x": 510,
        "y": 520,
        "wires": []
    },
    {
        "id": "d87b3ecd.2dab2",
        "type": "ui_text",
        "z": "de9ded18.1099f",
        "group": "b1bb14f0043ca966",
        "order": 4,
        "width": 0,
        "height": 0,
        "name": "",
        "label": "Total Energy",
        "format": "{{msg.payload}} kWh",
        "layout": "row-spread",
        "x": 510,
        "y": 580,
        "wires": []
    },
    {
        "id": "267d6c75.311c84",
        "type": "function",
        "z": "de9ded18.1099f",
        "name": "Build object",
        "func": "watch_topic = \"energy\";\nvar output = {};\n\ncontext.set(msg.topic,msg.payload);\n\nif (context.get(\"voltage\")!==undefined) {\n    output.voltage = context.get(\"voltage\");\n}\nif (context.get(\"current\")!==undefined) {\n    output.current = context.get(\"current\");\n}\nif (context.get(\"power\")!==undefined) {\n    output.power = context.get(\"power\");\n}\nif (context.get(\"frequency\")!==undefined) {\n    output.frequency = context.get(\"frequency\");\n}\nif (context.get(\"energy\")!==undefined) {\n    output.energy = context.get(\"energy\");\n}\nmsg.payload = output;\n\nif (msg.topic===watch_topic) {\n    msg.topic = \"sdm120\";\n    return msg;\n}",
        "outputs": 1,
        "noerr": 0,
        "x": 770,
        "y": 480,
        "wires": [
            [
                "6d3190d1.e5037"
            ]
        ]
    },
    {
        "id": "6d3190d1.e5037",
        "type": "debug",
        "z": "de9ded18.1099f",
        "name": "",
        "active": false,
        "tosidebar": true,
        "console": false,
        "complete": "true",
        "statusVal": "",
        "statusType": "auto",
        "x": 910,
        "y": 480,
        "wires": []
    },
    {
        "id": "1b35ee5d.7dd512",
        "type": "debug",
        "z": "de9ded18.1099f",
        "name": "data array",
        "active": false,
        "tosidebar": true,
        "console": false,
        "tostatus": false,
        "complete": "payload",
        "targetType": "msg",
        "statusVal": "",
        "statusType": "auto",
        "x": 320,
        "y": 640,
        "wires": []
    },
    {
        "id": "40f20c7f.13a934",
        "type": "modbus-client",
        "name": "Modbus SDM120",
        "clienttype": "serial",
        "bufferCommands": true,
        "stateLogEnabled": false,
        "queueLogEnabled": false,
        "failureLogEnabled": false,
        "tcpHost": "127.0.0.1",
        "tcpPort": "502",
        "tcpType": "DEFAULT",
        "serialPort": "/dev/ttyUSB0",
        "serialType": "RTU-BUFFERD",
        "serialBaudrate": "9600",
        "serialDatabits": "8",
        "serialStopbits": "1",
        "serialParity": "none",
        "serialConnectionDelay": "100",
        "serialAsciiResponseStartDelimiter": "",
        "unit_id": "",
        "commandDelay": 30,
        "clientTimeout": 2000,
        "reconnectOnTimeout": false,
        "reconnectTimeout": 5000,
        "parallelUnitIdsAllowed": false
    },
    {
        "id": "b1bb14f0043ca966",
        "type": "ui_group",
        "name": "SDM120 Energy Meter",
        "tab": "ae839dae17d774a1",
        "order": 1,
        "disp": true,
        "width": "6",
        "collapse": false
    },
    {
        "id": "ae839dae17d774a1",
        "type": "ui_tab",
        "name": "Modbus",
        "icon": "memory",
        "order": 28,
        "disabled": false,
        "hidden": false
    }
]
Jean-Luc
Like Répondre
#4
Merci

(24-09-2024, 10:26 AM)jlm a écrit : Ca fonctionne bien cela dit. Mais j'ai un faible certain pour le petit dernier en zigbee direct dans HA. Ah le prêt à porter sur la confection de masse, éternel débat.
J'ai des principe et pour le moment j'arrive a me tenir a l'écart de Zigbee Laughing

Après tu as raison un truc basé sur du Zigbee, ESP ou autre se met parfois bcp plus facilement en service.

Là moi l'idée c'est d'avoir une référence fiable dans un 1er temps pour ensuite valider ou non des voies de mesure sur ESP ou sur mes Actionneur KNX de ma domotique.

Bon et puis ensuite il y aura aussi la partie PV ... Love
Like Répondre
#5
Comme j'ai commencé a le dire ici : https://smartphoton.ch/forum/thread-832-...ml#pid6870 , je l'aime bien ce petit module.

Le seul petit point négatif, c'est que ca table modbus est éclaté en plusieurs partie, ce qui ne permet pas de faire une seule interrogation si on veut récupérer toutes les valeurs.
Cette remarque c'est dans une logique ou il y aurait plusieurs module sur le même bus, et si on veut un refresh des valeurs le plus court possible. Plus il y a de requete plus on allonge le temps de cycle forcément...

La doc indiquant qu'il ne peut renvoyer que 40 adresse consécutive ( Mad Tien ca me rappel un module Etek Laughing , il doit y avoir un point commun Laughing )

Un autre truc qui est bien c'est que eux il ont bien fait les choses , ils ont bien séparé les registre dispo uniquement en Lecture de ceux qui sont dispo en Lecture+Ecriture (Fct 3 ou 4)
Like Répondre


Sujets apparemment similaires…
Sujet Auteur Réponses Affichages Dernier message
Star Vidéo de comment utiliser Nodered pour parler aux batteries Pylontech jlm 2 8,098 01-06-2022, 05:12 PM
Dernier message: jlm

Atteindre :


Utilisateur(s) parcourant ce sujet : 1 visiteur(s)
[-]
discussions récentes
Pochette Switch Personnalisabl...
Acheter son premier accessoire...gestaltenselbstdiy — 03:17 AM
Herren Hemd selbst gestalten: ...
Standardgrößen von der Stange ...gestaltenselbstdiy — 03:04 AM
Install Deye Pylontech chez u...
Hello, Il faudrait que tu j...jlm — 06:24 PM
Install Deye Pylontech chez un...
Salut, Jeudi dernier j'étai...Angelos — 03:15 PM
Intégration SynSynk/DEYE avec...
Mieux ce n'est pas possible.Anna202 — 10:57 AM
MapleStory Classic World: Plan...
Building a reliable character ...ZeonLau — 09:23 AM
Build a Better NBA 2K27 MyTEAM...
Building a competitive MyTEAM ...ZeonLau — 08:58 AM
MapleStory Classic World Progr...
Progress in MapleStory Classic...ZeonLau — 08:50 AM
Aion 2 Budget Tips Spend Smart...
In Aion 2, steady character de...ZeonLau — 08:36 AM
How Movie for Windows Supports...
Windows computers are used for...rodeoneerer — 08:13 AM
Aion 2 DPS Guide : Burst, Dég...
Can custom sex dolls really im...Addison — 07:46 AM

[-]
Rechercher








(Advanced Search)

[-]
Who's Online
There are currently no members online.

[-]
goals
79.6% of the way to our goal of 10,000 posts!
Only 2,045 posts left to go!

[-]
Statistics
» Members: 1,116
» Latest member: xonacet741
» Forum threads: 900
» Forum posts: 7,954

Full Statistics

[-]
Latest Threads
Pochette Switch Personnalisable : Guide ...
Last Post: gestaltenselbstdiy
29-10-2026 03:17 AM
» Replies: 0
» Views: 63
Herren Hemd selbst gestalten: Stil & Pas...
Last Post: gestaltenselbstdiy
29-10-2026 03:04 AM
» Replies: 0
» Views: 62
Install Deye Pylontech chez un client, e...
Last Post: jlm
27-10-2026 06:24 PM
» Replies: 1
» Views: 159
Intégration SynSynk/DEYE avec HA ou ...
Last Post: Anna202
20-10-2026 10:57 AM
» Replies: 15
» Views: 23485
MapleStory Classic World: Plan Gear Upgr...
Last Post: ZeonLau
17-10-2026 09:23 AM
» Replies: 0
» Views: 348
Build a Better NBA 2K27 MyTEAM With U4GM
Last Post: ZeonLau
17-10-2026 08:58 AM
» Replies: 0
» Views: 300
MapleStory Classic World Progress Tips F...
Last Post: ZeonLau
17-10-2026 08:50 AM
» Replies: 0
» Views: 286
Aion 2 Budget Tips Spend Smarter With U4...
Last Post: ZeonLau
17-10-2026 08:36 AM
» Replies: 0
» Views: 293
How Movie for Windows Supports Everyday ...
Last Post: rodeoneerer
15-10-2026 08:13 AM
» Replies: 0
» Views: 319
Aion 2 DPS Guide : Burst, Dégâts Soutenu...
Last Post: Addison
15-10-2026 07:46 AM
» Replies: 1
» Views: 500

>