Créer un fichier .csv sous Node-red

Forum dédié aux bricolages d'objets connectés IOT et leurs communications avec DomoticZ :
- Remplacement de firmware des prises, modules relais ...
- Fabrication à base d'ESP8266, de NodeMCU, de Weemos et consorts ...
ybeco
Messages : 6
Inscription : 11 avr. 2023, 19:44

Créer un fichier .csv sous Node-red

Message par ybeco »

Bonjour

Je suis débutant avec Node-red. J'essaye d'apprendre à monitorer des valeurs reçues depuis des capteurs connectés à un Wemos D1 mini.
J'arrive à recevoir les données d'un capteur DHT22 grâce à 2 nœuds "mqtt" qui reçoivent respectivement la température et l'hygrométrie.
J'arrive à utiliser les nœuds "graphique" et "jauge" pour afficher ces valeurs. Cependant, je n'arrive pas à créer un fichier .csv pour accumuler ces données. Le nœud "CSV" semble être fait pour séparer des données d'une même source. Or, je souhaite justement rassembler ces 2 données avec celles fournies par un Time Stamp. J'ai également essayé de créer une fonction pour faire cela (4 lignes max si c'était en python !!!) Cependant le nœud "Fonction" semble ne pouvoir avoir qu'une seule entrée de données...

Bref, ça fait pas mal de temps que je rame... Alors que j'aurais pensé que c'était ultra-basique comme utilisation.

Quelqu'un pourrait m'expliquer comment faire ou bien me donner un exemple ou une piste ?

Merci !
ybeco
Messages : 6
Inscription : 11 avr. 2023, 19:44

Re: Créer un fichier .csv sous Node-red

Message par ybeco »

En cherchant, j'ai fini par trouver ce tutoriel :
https://www.youtube.com/watch?v=qWheXVuh73k

Tous les autres que j'ai essayés n'ont rien donné.

Il y a quand-même un truc bizarre : ce gars dit qu'il fait un fichier .csv alors qu'il fait un Json avec une extension .csv... :?

Je vais étudier comment, soit modifier le script java de la fonction pour qu'elle retourne une structure CSV soit convertir la sortie Json de la fonction en .csv

Le code de la fonction :

Code : Tout sélectionner

var t = new Date().toLocaleString();
msg.data = msg.payload;
msg.payload = { "Time": t, "Data": msg.data };
return msg;
Et voici mon arborescence Node-Red actuelle :

Code : Tout sélectionner

[
    {
        "id": "9d11118f3e19aa6a",
        "type": "mqtt in",
        "z": "3cde287fad7b8d2b",
        "name": "Température",
        "topic": "D1mini/latemperature",
        "qos": "0",
        "datatype": "auto-detect",
        "broker": "57169c2e5fa91f35",
        "nl": false,
        "rap": true,
        "rh": 0,
        "inputs": 0,
        "x": 370,
        "y": 420,
        "wires": [
            [
                "62a0aa8859429028"
            ]
        ]
    },
    {
        "id": "62a0aa8859429028",
        "type": "function",
        "z": "3cde287fad7b8d2b",
        "name": "function 1",
        "func": "var t = new Date().toLocaleString();\nmsg.data = msg.payload;\nmsg.payload = { \"Time\": t, \"Data\": msg.data };\nreturn msg;",
        "outputs": 1,
        "noerr": 0,
        "initialize": "",
        "finalize": "",
        "libs": [],
        "x": 600,
        "y": 420,
        "wires": [
            [
                "90f1ac785f88a8d7",
                "70b553032e6f8b67"
            ]
        ]
    },
    {
        "id": "90f1ac785f88a8d7",
        "type": "file",
        "z": "3cde287fad7b8d2b",
        "name": "",
        "filename": "/home/yonnel/Desktop/Essai.csv",
        "filenameType": "str",
        "appendNewline": true,
        "createDir": false,
        "overwriteFile": "false",
        "encoding": "none",
        "x": 930,
        "y": 420,
        "wires": [
            []
        ]
    },
    {
        "id": "70b553032e6f8b67",
        "type": "debug",
        "z": "3cde287fad7b8d2b",
        "name": "debug 5",
        "active": true,
        "tosidebar": true,
        "console": false,
        "tostatus": false,
        "complete": "false",
        "statusVal": "",
        "statusType": "auto",
        "x": 880,
        "y": 540,
        "wires": []
    },
    {
        "id": "57169c2e5fa91f35",
        "type": "mqtt-broker",
        "name": "DHT22 Sur Wemos",
        "broker": "192.168.0.23",
        "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": ""
    }
]

Est-ce que quelqu'un pourrait me conseiller un livre ou bien peut-être un cours en français, basique et pas à pas pour apprendre Node-Red / Mosquitto ?

J'ai des bases en C Arduino et en Python, mais je sens bien que je patauge avec les notions de "payload" et de "topic"...

Merci !
ybeco
Messages : 6
Inscription : 11 avr. 2023, 19:44

Re: Créer un fichier .csv sous Node-red

Message par ybeco »

Après de nombreux essais / erreurs, j'ai réussi à modifier le script de la fonction.

À tâton, j'ai bricolé pour obtenir une sortie sous la forme "string" , "string"
Et c'est bien ce que j'obtiens :

Code : Tout sélectionner

"19:11:52","32.57"
"19:11:58","32.57"
"19:12:04","32.59"
"19:12:10","34.29"
"19:12:16","34"
"19:12:22","41.11"
"19:12:28","37.68"
J'arrive à importer le fichier .csv généré dans LibreOffice, mais je dois remplacer les points par des virgules pour pouvoir faire un graphique.

Voici mon flow actuel :

Code : Tout sélectionner

[
    {
        "id": "6f92b69901d1e45c",
        "type": "mqtt in",
        "z": "3cde287fad7b8d2b",
        "name": "Température",
        "topic": "D1mini/latemperature",
        "qos": "0",
        "datatype": "auto-detect",
        "broker": "57169c2e5fa91f35",
        "nl": false,
        "rap": true,
        "rh": 0,
        "inputs": 0,
        "x": 230,
        "y": 860,
        "wires": [
            [
                "f672ed951fb80864"
            ]
        ]
    },
    {
        "id": "f672ed951fb80864",
        "type": "function",
        "z": "3cde287fad7b8d2b",
        "name": "function 2",
        "func": "var t = new Date().toLocaleTimeString();\nmsg.data = msg.payload;\nmsg.payload = '\"' + t + '\"' + ',' + '\"' + String(msg.data) + '\"'\nreturn msg;\n\n// var t = new Date().toLocaleString();\n// msg.data = msg.payload;\n// msg.payload = { \"Time\": t, \"Data\": msg.data };\n// return msg;\n",
        "outputs": 1,
        "noerr": 0,
        "initialize": "",
        "finalize": "",
        "libs": [],
        "x": 460,
        "y": 860,
        "wires": [
            [
                "a1265a70c138db30",
                "b847041ceea9ddeb"
            ]
        ]
    },
    {
        "id": "a1265a70c138db30",
        "type": "debug",
        "z": "3cde287fad7b8d2b",
        "name": "debug 6",
        "active": true,
        "tosidebar": true,
        "console": false,
        "tostatus": false,
        "complete": "false",
        "statusVal": "",
        "statusType": "auto",
        "x": 660,
        "y": 860,
        "wires": []
    },
    {
        "id": "b847041ceea9ddeb",
        "type": "file",
        "z": "3cde287fad7b8d2b",
        "name": "",
        "filename": "/home/yonnel/Desktop/Essai.csv",
        "filenameType": "str",
        "appendNewline": true,
        "createDir": false,
        "overwriteFile": "false",
        "encoding": "none",
        "x": 730,
        "y": 1020,
        "wires": [
            []
        ]
    },
    {
        "id": "57169c2e5fa91f35",
        "type": "mqtt-broker",
        "name": "DHT22 Sur Wemos",
        "broker": "192.168.0.23",
        "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": ""
    }
]
J'imagine qu'il y a moyen de reformater "32.67" en "32,67" avec java script...
Jeff
Messages : 1007
Inscription : 17 nov. 2016, 20:54
Localisation : Rennes (35)

Re: Créer un fichier .csv sous Node-red

Message par Jeff »

Un chercher / remplacer dans libre office si l'import est manuel.
Sinon une fonction JavaScript semble faire le job
https://www.analyste-programmeur.com/ja ... pt-replace
Version: 2023.1 sur VM Synology, docker Zwave Js UI (Z-stick GEN5, Fibaro...), Zigbeefordomoticz. Nextion RGB Led Screen
ybeco
Messages : 6
Inscription : 11 avr. 2023, 19:44

[RESOLU] Créer un fichier .csv avec Node-red

Message par ybeco »

Et voilà !

Oui, merci pour le conseil et le lien.

Grâce à la fonction .replace(), j'arrive enfin à faire un .CSV digne de ce nom !

Code : Tout sélectionner

"12:19:36","34,83"
"12:19:42","34,9"
"12:19:48","34,85"
"12:20:18","34,78"
"12:20:24","34,98"
"12:20:30","35,05"
"12:20:36","34,98"
"12:20:42","34,95"
Le nouveau code de la fonction est celui-ci :

Code : Tout sélectionner

var t = new Date().toLocaleTimeString();
msg.data = msg.payload;

msg.data = String(msg.data);
msg.data = msg.data.replace(".",",");

msg.payload = '"' + t + '"' + ',' + '"' + msg.data + '"';
return msg;
Le code de mon flux est ici :

Code : Tout sélectionner

[
    {
        "id": "a5c1fd7028437f84",
        "type": "mqtt in",
        "z": "3cde287fad7b8d2b",
        "name": "Température",
        "topic": "D1mini/latemperature",
        "qos": "0",
        "datatype": "auto-detect",
        "broker": "57169c2e5fa91f35",
        "nl": false,
        "rap": true,
        "rh": 0,
        "inputs": 0,
        "x": 230,
        "y": 1120,
        "wires": [
            [
                "ae9a96385d6e1117"
            ]
        ]
    },
    {
        "id": "ae9a96385d6e1117",
        "type": "function",
        "z": "3cde287fad7b8d2b",
        "name": "function 3",
        "func": "var t = new Date().toLocaleTimeString();\nmsg.data = msg.payload;\n\nmsg.data = String(msg.data)\nmsg.data = msg.data.replace(\".\",\",\")\n\nmsg.payload = '\"' + t + '\"' + ',' + '\"' + msg.data + '\"'\nreturn msg;\n\n// Fonction pour remplacer un motif de string par un autre :\n// myString.replace(motif_a_remplacer, motif_de_remplacement);\n\n// https://www.analyste-programmeur.com/javascript/les-expressions-regulieres/javascript-replace\n\n// var t = new Date().toLocaleTimeString();\n// msg.data = msg.payload;\n// msg.payload = '\"' + t + '\"' + ',' + '\"' + String(msg.data) + '\"'\n// return msg;\n\n\n// var t = new Date().toLocaleString();\n// msg.data = msg.payload;\n// msg.payload = { \"Time\": t, \"Data\": msg.data };\n// return msg;\n",
        "outputs": 1,
        "noerr": 0,
        "initialize": "",
        "finalize": "",
        "libs": [],
        "x": 460,
        "y": 1120,
        "wires": [
            [
                "8770c7a35d5d25e0",
                "5e93ee95ee3354b8"
            ]
        ]
    },
    {
        "id": "8770c7a35d5d25e0",
        "type": "debug",
        "z": "3cde287fad7b8d2b",
        "name": "debug 7",
        "active": true,
        "tosidebar": true,
        "console": false,
        "tostatus": false,
        "complete": "false",
        "statusVal": "",
        "statusType": "auto",
        "x": 660,
        "y": 1120,
        "wires": []
    },
    {
        "id": "5e93ee95ee3354b8",
        "type": "file",
        "z": "3cde287fad7b8d2b",
        "name": "",
        "filename": "/home/yonnel/Desktop/Essai.csv",
        "filenameType": "str",
        "appendNewline": true,
        "createDir": false,
        "overwriteFile": "false",
        "encoding": "none",
        "x": 710,
        "y": 1200,
        "wires": [
            []
        ]
    },
    {
        "id": "57169c2e5fa91f35",
        "type": "mqtt-broker",
        "name": "DHT22 Sur Wemos",
        "broker": "192.168.0.23",
        "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": ""
    }
]
Répondre