Bonjour,
Je cherche à récupérer toutes les secondes certaines valeurs de mon routeur M’Sun PV pour les utiliser dans ma domotique. J’ai eu l’idée peut être un peu bête d’utiliser Node RED pour convertir le XML status en MQTT. Pour qu’ensuite je puisse utiliser les valeurs dans Jeedom sans charger le processeur à gérer les scénario d’analyse du XML.
Ma connaissance de Node Red est très limité car je le découvre aujourd’hui. Après plusieurs heures à chercher en m’aidant un peu de chatGPT je sèche. Et MQTT je l’utilise depuis quelques mois mais j’essaye d’apprendre encore son fonctionnement.
Je vous joint une capture de mon Node pour comprendre.
- un timestamp à la seconde pour l’actualisation en continue => fonctionnel
- http request avec le lien « http://mon-ip/status.xml » => fonctionnel
- un node xml pour convertir le XML en JSON. Cela me donne le JSON suivant :
`{
"xml": {
"rtcc": [
"22:41:58 ME"
],
"paramSys": [
"22:41:58;16/08/2023;On;01:00;0,0;MS_PV2_2;5.0.1;0000220;102e;102c;00:00;00:00"
],
"inAns": [
"493,0;-3,3; 0; 0;228,2;0,0;0,0;0,0; 0; 0; 0; 0; 0; 0; 0; 0;"
],
"survMm": [
"0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;"
],
"cmdPos": [
"a;a;0;0;0;0;0;1;"
],
"outStat": [
"0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;"
],
"cptVals": [
"24c67;fffff15d;fffdeded;fe80e657;0;0;0;0;"
],
"chOutVal": [
"0;0;0;ff;:0,0;0,0;0,0;0,0;"
]
}
}
A cette étape si je l’envoi en MQTT cela envoi bien un payload mais dans JMQTT cela me génère des objets mais par exemple pour InAns je vais avoir toutes les valeurs entre guillemet et non pas une valeur par ;
Je veux donc avant d’envoyer le Payload essayer de le remettre en forme, et c’est là que malgré ChatGPT je n’arrive pas à remettre en forme. Il me propose d’ajouter une fonction avec un bout de code mais cela ne fonctionne pas.
Exemple de code proposé :
[{
"id": "48306d0f.6ed00c",
"type": "function",
"z": "ec8a665f.07e6d8",
"name": "Transform JSON",
"func": "const inputJSON = msg.payload;\nconst inAns = inputJSON.xml.inAns[0].split(';');\nconst result = {\n \"xml\": {}\n};\n\ninAns.forEach((value, index) => {\n result.xml[`inAns${index + 1}`] = [value.trim()];\n});\n\nmsg.payload = result;\nreturn msg;",
"outputs": 1,
"noerr": 0,
"initialize": "",
"finalize": "",
"x": 430,
"y": 240,
"wires": [
["c2513cf4.fbaa18"]
]
}, {
"id": "c2513cf4.fbaa18",
"type": "debug",
"z": "ec8a665f.07e6d8",
"name": "",
"active": true,
"tosidebar": true,
"console": false,
"tostatus": false,
"complete": "false",
"statusVal": "",
"statusType": "auto",
"x": 770,
"y": 240,
"wires": []
}, {
"id": "ab1dcb2c.9cfed8",
"type": "inject",
"z": "ec8a665f.07e6d8",
"name": "Sample JSON",
"props": [{
"p": "payload"
}],
"repeat": "",
"crontab": "",
"once": false,
"onceDelay": 0.1,
"topic": "",
"payload": {
"xml": {
"rtcc": ["22:41:58 ME"],
"paramSys": ["22:41:58;16/08/2023;On;01:00;0,0;MS_PV2_2;5.0.1;0000220;102e;102c;00:00;00:00"],
"inAns": ["493,0;-3,3; 0; 0;228,2;0,0;0,0;0,0; 0; 0; 0; 0; 0; 0; 0; 0;"],
"survMm": ["0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;"],
"cmdPos": ["a;a;0;0;0;0;0;1;"],
"outStat": ["0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;"],
"cptVals": ["24c67;fffff15d;fffdeded;fe80e657;0;0;0;0;"],
"chOutVal": ["0;0;0;ff;:0,0;0,0;0,0;0,0;"]
}
},
"op": "payload",
"x": 240,
"y": 240,
"wires": [
["48306d0f.6ed00c"]
]
}]
Si vous avez d’autres solution je suis preneur …
En l’occurence je n’ai que 5 infos qu’il m’intéresse de récupérer en gras ci-dessous :
« inAns »: [
« 493,0;-3,3; 0; 0;228,2;0,0;0,0;0,0; 0; 0; 0; 0; 0; 0; 0; 0; »
cptVals": [
« 24c67;fffff15d;fffdeded;fe80e657;0;0;0;0; »
Et dernière difficulté pour les données dans cptVals je dois les traduire de l’hexadecimal vers le décimal


