Diferència entre revisions de la pàgina «Uso del NodeRED (2022)»
m |
|||
(Hi ha 21 revisions intermèdies del mateix usuari que no es mostren) | |||
Línia 7: | Línia 7: | ||
= Panel de Control (''Dashboard'') = | = Panel de Control (''Dashboard'') = | ||
− | == Aleatorización controlada por el panel de control == | + | == '''Funciones''' y '''variables de flujo'''. 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]] | ||
− | Al seleccionar el conmutador (''switch'') '''Randomize''' comienza la generación de datos aleatorios. Al deseleccionarlo se para la generación de datos. | + | 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''. |
[[Image:14nodeRedRandomUi.png|center|Generación de datos aleatorios]] | [[Image:14nodeRedRandomUi.png|center|Generación de datos aleatorios]] | ||
Línia 27: | Línia 27: | ||
Importad el [https://www.binefa.cat/training/upcSchool/2022/20220402/14nodeRedRandomUi.nodered.json flujo 14nodeRedRandomUi] y verificad el funcionamiento. | Importad el [https://www.binefa.cat/training/upcSchool/2022/20220402/14nodeRedRandomUi.nodered.json flujo 14nodeRedRandomUi] y verificad el funcionamiento. | ||
− | == Nodo conmutador (''switch'') == | + | == Nodo '''conmutador''' (''switch'') == |
El nodo commutador envía un ''payload'' personalizado para el estado ''ON'' y el estado ''OFF''. | El nodo commutador envía un ''payload'' personalizado para el estado ''ON'' y el estado ''OFF''. | ||
Línia 37: | Línia 37: | ||
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. Cambio de color de un punto (representación de un led) == | + | == Nodo '''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 60: | Línia 60: | ||
* 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 | ||
+ | |||
+ | == Conversión de '''JSON''' a texto y texto a JSON == | ||
+ | [[Image:Nodered20220402d00.png|center|Flujo JSON -> TXT y TXT -> JSON]] | ||
+ | |||
+ | [https://www.binefa.cat/training/upcSchool/2022/20220402/jsonTxt.nodered.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''' == | ||
+ | [[Image:Nodered20220402e00.png|center|Flujo HTTP a MQTT]] | ||
+ | |||
+ | [https://www.binefa.cat/training/upcSchool/2022/20220402/httpMqtt.nodered.json Flujo httpMqtt.nodered.json] | ||
+ | |||
+ | [http://vps656540.ovh.net:2222/mqtt?topic=/7C9EBDEA5BA0/ledW&&payload=0 Apagando] led blanco: | ||
+ | [[Image:Nodered20220402e01.png|center|Apagando led blanco. HTTP a MQTT]] | ||
+ | |||
+ | [http://vps656540.ovh.net:2222/mqtt?topic=/7C9EBDEA5BA0/ledW&&payload=1 Encendiendo] led blanco: | ||
+ | [[Image:Nodered20220402e02.png|center|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. | ||
+ | |||
+ | [[Image:Nodered20220402h00.png|center|Flujo con nodo exec]] | ||
+ | |||
+ | [https://www.binefa.cat/training/upcSchool/2022/20220402/exec.nodered.json Flujo exec.nodered.json] | ||
+ | |||
+ | == Envío de JSON a la placa IoT-02 == | ||
+ | |||
+ | [[Image:Nodered20220402f00.png|center|Flujo de JSON en nodo Inject en NodeRED]] | ||
+ | |||
+ | [[Image:Nodered20220402f01.png|center|Edición de JSON en nodo Inject en NodeRED]] | ||
+ | |||
+ | [https://www.binefa.cat/training/upcSchool/2022/20220402/jsonLeds.json 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). | ||
+ | |||
+ | [[Image:Nodered20220402g00.png|center|Flujo recepción de JSON]] | ||
+ | |||
+ | [https://www.binefa.cat/training/upcSchool/2022/20220402/jsonIn.nodered.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. |
Revisió de 21:11, 27 març 2022
Contingut
- 1 Comunicación MQTT entre el NodeRED y la placa IoT-02
- 2 Panel de Control (Dashboard)
- 2.1 Funciones y variables de flujo. Aleatorización controlada por el panel de control
- 2.2 Nodo conmutador (switch)
- 2.3 Nodo botón y variables de flujo. Cambio de color de un punto (representación de un led)
- 2.4 Conversión de JSON a texto y texto a JSON
- 2.5 Pasarela HTTP a MQTT
- 2.6 Nodo exec
- 2.7 Envío de JSON a la placa IoT-02
- 2.8 Recepción de JSON desde la placa IoT-02
Comunicación MQTT entre el NodeRED y la placa IoT-02
Subscripción y publicación
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)
Funciones y variables de flujo. Aleatorización controlada por el panel de control
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.
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-02
Importad el flujo 14nodeRedRandomUi y verificad el funcionamiento.
Nodo conmutador (switch)
El nodo commutador envía un payload personalizado para el estado ON y el estado OFF.
Ejercicio NodeRED-03
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)
El nodo botón envía un payload personalizado cuando se aprieta.
Flujo ledMulticolor.nodered.json
Ejercicio NodeRED-04
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
Conversión de JSON a texto y texto a 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
Apagando led blanco:
Encendiendo led blanco:
- 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.
Envío de JSON a la placa IoT-02
- 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).
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.