Uso de la base de datos MariaDB desde NodeRED (2023)
Contingut
- 1 Acceso
- 2 Nodos MariaDB en NodeRed
- 2.1 Instalación
- 2.2 Configuración de la base de datos en el nodo MySQL
- 2.3 Creación de una tabla en la base de datos MySQL
- 2.4 Borrado de una tabla en la base de datos MySQL
- 2.5 Inserción de datos en una tabla de la base de datos MySQL
- 2.6 Lectura de datos en una tabla de la base de datos MySQL
- 2.7 Creación de una tabla vista en la base de datos MySQL
- 2.8 Tratamiento de datos leídos de la tabla
- 2.9 Aleatorización controlada por el panel de control
- 3 Escritura síncrona de múltiples datos asíncronos al mismo tiempo. Uso del formato de datos json
Acceso
Hay una base de datos creada en el MariaDB con el nombre aula206
El usuario iot con contraseña iot tiene permisos de escritura y lectura sobre la base datos aula206
El usuario convidat con contraseña benvingut tiene permisos de lectura sobre la base datos aula206
El MariaDB en el VPS del Máster es un recurso compartido. Vamos a compartir la misma base de datos (aula206), los datos que vamos a introducir los diferenciaremos por el nombre de la tabla. Vamos a poner un prefijo identificativo al nombre de la tabla. Cambiad el número 28XX por el número de puerto que se os ha assignado.
Explicación detallada en uso de MariaDB en el VPS del Máster de Industria 4.0
Nodos MariaDB en NodeRed
Instalación
Hace falta instalar el conjunto de nodos node-red-node-mysql
Configuración de la base de datos en el nodo MySQL
- Poner un nodo MySQL en el tapiz Node-RED
- Hacer doble clic sobre el nodo MySQL
- Ir al lápiz a la derecha del desplegable Add new MySQL database... presente en la fila Database
- En Host escribir la IP local del servidor (127.0.0.1). Por seguridad, no le permitimos a la base de datos que tenga visibilidad externa.
- En Port escribir el puerto TCP (3306) por defecto de las bases de datos MySQL
- En User escribir un usuario con permisos de escritura (iot), debido a que queremos escribir. Si no hace falta escribir en la base de datos escribiríamos un usuario con permisos de solo lectura (como convidat).
- En Password escribir la contraseña del usuario (para el usuario iot es iot. Para el usuario convidat es benvingut).
- En Database escribir la base de datos que queremos acceder (aula206)
- En Charset escribir la codificación de carácteres (UTF8)
Creación de una tabla en la base de datos MySQL
Hay cuatro nodos enlazados: inject, function, mysql y debug.
- Los nodos inject y debug no se modifican. Dejar la configuración por defecto.
- El nodo mysql ha estado configurado en el paso anterior.
- El nodo function se ha configurado de este modo:
- Cambiar el nombre de la tabla substituyendo 28XX por el número de puerto que se os ha asignado.
Función CREATE TABLE m28XX_T_RH:
msg.topic = ` CREATE TABLE m28XX_T_RH ( time TIMESTAMP DEFAULT CURRENT_TIMESTAMP, valueT FLOAT, valueRH FLOAT, PRIMARY KEY (time)); `; return msg;
Borrado de una tabla en la base de datos MySQL
Función DROP TABLE m28XX_T_RH:
msg.topic = `DROP TABLE m28XX_T_RH;`; return msg;
Inserción de datos en una tabla de la base de datos MySQL
Configuración de nodos inject para generar datos de tipo JSON
Doble clic sobre el nodo inject (seleccionar la opción {}):
Clic sobre ... (los tres puntos):
En formato texto:
{ "valueT": 17.89, "valueRH": 44.32 }
Inserción de datos de tipo JSON en columnas de la tabla
Función INSERT DATA:
msg.topic = `insert into m28XX_T_RH(valueT,valueRH) values(${msg.payload.valueT},${msg.payload.valueRH})`; return msg;
Lectura de datos en una tabla de la base de datos MySQL
Campo msg.topic del nodo inject para hacer un SELECT:
Campo msg.topic del nodo inject con nombre SELECT en formato texto:
select UNIX_TIMESTAMP(time) as time, valueT, valueRH from m28XX_T_RH
Creación de una tabla vista en la base de datos MySQL
Función CREATE VIEW m28XX_T_RH_v:
msg.topic = `CREATE VIEW m28XX_T_RH_v AS select UNIX_TIMESTAMP(time) as time, valueT, valueRH from m28XX_T_RH;`; return msg;
Tratamiento de datos leídos de la tabla
Añadir salidas a la función (en Outputs se ha cambiado de 1 a 3 salidas):
Código de la función Tratamiento datos / Últimas entradas:
Función Tratamiento datos / Últimas entradas en modo texto:
var a = msg.payload; var val = ""; var lastEntryValueT, lastEntryValueRH; a.forEach(function (entry) { val += "timestamp: " + entry.time + ", valueT: " + entry.valueT + ", valueRH: " + entry.valueRH + "\r"; lastEntryValueT = entry.valueT; lastEntryValueRH = entry.valueRH; }); msg.payload = val; var msg_valT = { payload: lastEntryValueT }; return [msg, msg_valT, { payload: lastEntryValueRH}];
Aleatorización controlada por el panel de control
Aprovechando el ejercicio hecho en la introducción al Uso del NodeRED, añadiremos otro valor de aleatorización y haremos una escritura a la base de datos MariaDB.
Al seleccionar el conmutador (switch) Randomize comienza la generación de datos aleatorios. Al deseleccionarlo se para la generación de datos.
Código para el NodeRED que genera dos datos aleatorios
Función Randomizing (On/Off):
flow.set("Randomizing",msg.payload); return msg;
Función random JSON value in range {"T": <20.0,30.0>,"RH": <45.0,55.0>}:
var randomT = parseFloat((200 + Math.floor(Math.random() * 101)) / 10); // value between 20.0 and 30.0 var randomRH = parseFloat((450 + Math.floor(Math.random() * 101)) / 10); // value between 45.0 and 55.0 var jsonR = {}; jsonR["T"] = randomT; jsonR["RH"] = randomRH; var msg_jsonR = { payload: jsonR }; var msg_valT = { payload: randomT }; var msg_valRH = { payload: randomRH }; return [msg_jsonR, msg_valT, msg_valRH];
Escritura síncrona de múltiples datos asíncronos al mismo tiempo. Uso del formato de datos json
Código en NodeRED para el uso de Json en InfluxDB
Función T:24.7,RH:74.6,P:1007.2,LDR:47.3 (esta función se ejecuta al desplegar el flujo, debido a la configuración del nodo inject):
flow.set("IoT-02_RH",74.6); flow.set("IoT-02_T",24.7); flow.set("IoT-02_P",1007.2); flow.set("IoT-02_LDR",47.3); return msg;
Función T:21.3,RH:48.2,P:1003.5,LDR:89.4:
flow.set("IoT-02_RH",48.2); flow.set("IoT-02_T",21.3); flow.set("IoT-02_P",1003.5); flow.set("IoT-02_LDR",89.4); return msg;
Función --> json:
var json00 = {}; json00.RH = flow.get("IoT-02_RH"); json00.T = flow.get("IoT-02_T"); json00.P = flow.get("IoT-02_P"); json00.LDR = flow.get("IoT-02_LDR"); msg.payload = json00; return msg;
$ influx -username convidat -password benvingut Connected to http://localhost:8086 version 1.7.6 InfluxDB shell version: 1.8.0 > use aulaVirtual2020 Using database aulaVirtual2020 > select * from m05_json_00 name: m05_json_00 time LDR P RH T ---- --- - -- - 1589965283616685236 47.3 1007.2 74.6 24.7 1589965290073574911 89.4 1003.5 48.2 21.3 > quit $