Diferència entre revisions de la pàgina «Uso del NodeRED (2023)»

De binefa.com
Salta a la navegació Salta a la cerca
 
(Hi ha 3 revisions intermèdies del mateix usuari que no es mostren)
Línia 21: Línia 21:
 
Poned 5 conmutadores (Control de los 4 leds y el estado del relé biestable del placa IoT-02).
 
Poned 5 conmutadores (Control de los 4 leds y el estado del relé biestable del placa IoT-02).
  
== Nodo '''botón''' y '''variables de flujo'''. Cambio de color de un punto (representación de un led) ==
+
== Nodos de '''texto''', '''botón''' y '''variables de flujo'''. Cambio de color de un punto (representación de un led) ==
 
El nodo botón envía un ''payload'' personalizado cuando se aprieta.
 
El nodo botón envía un ''payload'' personalizado cuando se aprieta.
  
Línia 28: Línia 28:
  
 
[[Image:Nodered20220402c00.png|center|Visualización cambio de color de un punto]]
 
[[Image:Nodered20220402c00.png|center|Visualización cambio de color de un punto]]
 +
 +
En el ''Value format'' del nodo de texto:
 +
<nowiki><font color={{msg.color}} ><i class="fa fa-circle" style="font-size:24px;"></i></font></nowiki>
 +
 +
Función '''FF3399''':
 +
msg.color = "#FF3399"
 +
return msg;
 +
 +
Función '''{R,G,B} -> {0,0,0}''':
 +
flow.set("R","00");
 +
flow.set("G","00");
 +
flow.set("B","00");
 +
flow.set("RGB","#"+flow.get("R")+flow.get("G")+flow.get("B"));
 +
msg.color = flow.get("RGB");
 +
return msg;
 +
 +
Función '''R -> FF''':
 +
flow.set("R","FF");
 +
flow.set("RGB","#"+flow.get("R")+flow.get("G")+flow.get("B"));
 +
msg.color = flow.get("RGB");
 +
return msg;
 +
 +
Función '''R -> 00''':
 +
flow.set("R","00");
 +
flow.set("RGB","#"+flow.get("R")+flow.get("G")+flow.get("B"));
 +
msg.color = flow.get("RGB");
 +
return msg;
  
 
[https://www.binefa.cat/training/upcSchool/2022/20220402/ledMulticolor.nodered.json Flujo ledMulticolor.nodered.json]
 
[https://www.binefa.cat/training/upcSchool/2022/20220402/ledMulticolor.nodered.json Flujo ledMulticolor.nodered.json]
Línia 45: Línia 72:
 
* Cuando el botón I35 no esté apretado quita el color azul al punto multicolor representado en el panel de control del NodeRED
 
* Cuando el botón I35 no esté apretado quita el color azul al punto multicolor representado en el panel de control del NodeRED
  
== '''Funciones''' y '''variables de flujo'''. Aleatorización controlada por el panel de control ==
+
== '''Simulación de generación de un dato'''. Aleatorización controlada por el panel de control ==
 
[[Image:12nodeRedRandomUi.png|center|Generación de datos aleatorios]]
 
[[Image:12nodeRedRandomUi.png|center|Generación de datos aleatorios]]
  

Revisió de 20:39, 10 abr 2023

Comunicación MQTT entre el NodeRED y la placa IoT-02

Asignación de puertos para el curso 2022-2023

Nuevo firmware de la placa IoT-02 para el día de hoy (se han añadido temas MQTT para trabajar con JSON): firmware para gestionar el uso de JSON en la placa IoT-02. Firmware IoT-02_mqtt_json_upcSchool_broker2 en GitHub

Subscripción y publicación

Comunicación MQTT entre el NodeRED y la placa IoT-02

Ejercicio NodeRED-01

Implementad vuestro flujo para recibir el estado de los tres botones (de manera asíncrona, cuando hay un cambio) de la placa IoT-02.

Panel de Control (Dashboard)

Hace falta instalar el conjunto de nodos node-red-dashboard

Nodo conmutador (switch)

El nodo commutador envía un payload personalizado para el estado ON y el estado OFF.

Flujo conmutador leds


Visualización conmutador leds

Ejercicio NodeRED-02

Poned 5 conmutadores (Control de los 4 leds y el estado del relé biestable del placa IoT-02).

Nodos de texto, botón y variables de flujo. Cambio de color de un punto (representación de un led)

El nodo botón envía un payload personalizado cuando se aprieta.

Flujo cambio de color de un punto


Visualización cambio de color de un punto

En el Value format del nodo de texto:

<font color={{msg.color}} ><i class="fa fa-circle" style="font-size:24px;"></i></font>

Función FF3399:

msg.color = "#FF3399"
return msg;

Función {R,G,B} -> {0,0,0}:

flow.set("R","00");
flow.set("G","00");
flow.set("B","00");
flow.set("RGB","#"+flow.get("R")+flow.get("G")+flow.get("B"));
msg.color = flow.get("RGB");
return msg;

Función R -> FF:

flow.set("R","FF");
flow.set("RGB","#"+flow.get("R")+flow.get("G")+flow.get("B"));
msg.color = flow.get("RGB");
return msg;

Función R -> 00:

flow.set("R","00");
flow.set("RGB","#"+flow.get("R")+flow.get("G")+flow.get("B"));
msg.color = flow.get("RGB");
return msg;

Flujo ledMulticolor.nodered.json

Ejercicio NodeRED-03

Haced una visualización de un punto que representa un led multicolor. En la placa IoT-02:

  • Cuando el botón IO0 esté apretado incorpora el color rojo al punto multicolor representado en el panel de control del NodeRED
  • Cuando el botón IO0 no esté apretado quita el color rojo al punto multicolor representado en el panel de control del NodeRED
  • Cuando el botón I34 esté apretado incorpora el color verde al punto multicolor representado en el panel de control del NodeRED
  • Cuando el botón I34 no esté apretado quita el color verde al punto multicolor representado en el panel de control del NodeRED
  • Cuando el botón I35 esté apretado incorpora el color azul al punto multicolor representado en el panel de control del NodeRED
  • Cuando el botón I35 no esté apretado quita el color azul al punto multicolor representado en el panel de control del NodeRED

Simulación de generación de un dato. Aleatorización controlada por el panel de control

Generación de datos aleatorios

Al seleccionar el conmutador (switch) Randomize comienza la generación de datos aleatorios. Al deseleccionarlo se para la generación de datos. El nodo commutador envía un payload personalizado para el estado ON y el estado OFF.

Generación de datos aleatorios

Código para el NodeRED que genera datos aleatorios

Función Randomizing (On/Off):

flow.set("Randomizing",msg.payload);
return msg;

Función random value in range (20.0,30.0):

msg.payload = parseFloat( (200 + Math.floor(Math.random() * 101))/10); // value between 20.0 and 30.0
return msg;

Ejercicio NodeRED-04

Importad el flujo 14nodeRedRandomUi y verificad el funcionamiento.

Conversión de JSON a texto y texto a JSON

Flujo JSON -> TXT y TXT -> JSON

Flujo jsonTxt.nodered.json

  • Función genero json:
var json00 = {}
json00.nombre = "Joan"
json00.apellido = "Pérez"
json00.edad = 26
msg.payload = json00
return msg;
  • Función genero txt:
var txt = "{\"apellido\":\"Martínez\",\"nombre\":\"Meritxell\",\"edad\":28}"
msg.payload = txt
return msg;

Pasarela HTTP a MQTT

Flujo HTTP a MQTT

Flujo httpMqtt.nodered.json

Apagando led blanco:

Apagando led blanco. HTTP a MQTT

Encendiendo led blanco:

Encendiendo led blanco. HTTP a MQTT
  • Función bridge:
msg.topic = msg.req.query['topic'];
msg.payload = msg.req.query['payload'];
return msg;
  • Función response:
msg.payload = "Tema: "+msg.req.query['topic']+", missatge: "+msg.req.query['payload'];
return msg;

Ejercicio NodeRED-05

Implementad vuestro flujo para cambiar el estado de los leds y el relé biestable de la placa IoT-02.

Nodo exec

El nodo exec ejecuta órdenes del sistema operativo.

Flujo con nodo exec

Flujo exec.nodered.json

Envío de JSON a la placa IoT-02

Flujo de JSON en nodo Inject en NodeRED
Edición de JSON en nodo Inject en NodeRED

Flujo jsonLeds.json

  • En el código Arduino se diferencia el tipo bool del tipo int:
 if (szTopic == String("/" + String(sMac) + TOPIC_JSON_LEDS  ).c_str()) {
   JSONVar myObject = JSON.parse(szPayload);
   if (JSON.typeof(myObject) == "undefined") {
     Serial.println("Parsing input failed!");
     return;
   }
   if (myObject.hasOwnProperty("ledW")) {
     digitalWrite(LED_W, (bool)myObject["ledW"]);
   }    
   if (myObject.hasOwnProperty("ledR")) {
     digitalWrite(LED_R, (int)myObject["ledR"]);
   }
   if (myObject.hasOwnProperty("ledY")) {
     digitalWrite(LED_Y, (int)myObject["ledY"]);
   }
   if (myObject.hasOwnProperty("ledG")) {
     digitalWrite(LED_G, (int)myObject["ledG"]);
   }
 }

Recepción de JSON desde la placa IoT-02

Se recibe un texto. El nodo JSON convierte el texto a un objeto JSON. Es un nodo bidireccional (si entra un objeto JSON sale un texto).

Flujo recepción de JSON

Flujo jsonIn.nodered.json

Ejercicio NodeRED-06

Implementad un sistema SCADA (supervisión y control) que muestre en widgets diferentes de tipo reloj la temperatura, humedad relativa y nivel de luz (desde la placa IoT-02). También una gráfica de la temperatura en función del tiempo. En la parte de control de la placa IoT-02 hay un conmutador, cuando está activado el relé se pone en estado SET, se enciende el led rojo (y apaga el verde) y aparece SET en la pantalla OLED. Cuando se desactiva el conmutador el relé se pone en estado RESET, se enciende el led verde (y apaga el rojo) y aparece RESET en la pantalla OLED.