<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ca">
	<id>https://www.binefa.com/index.php?action=history&amp;feed=atom&amp;title=Uso_del_NodeRED_%282025-2026%29</id>
	<title>Uso del NodeRED (2025-2026) - Historial de revisió</title>
	<link rel="self" type="application/atom+xml" href="https://www.binefa.com/index.php?action=history&amp;feed=atom&amp;title=Uso_del_NodeRED_%282025-2026%29"/>
	<link rel="alternate" type="text/html" href="https://www.binefa.com/index.php?title=Uso_del_NodeRED_(2025-2026)&amp;action=history"/>
	<updated>2026-05-18T00:18:52Z</updated>
	<subtitle>Historial de revisió per a aquesta pàgina del wiki</subtitle>
	<generator>MediaWiki 1.33.0</generator>
	<entry>
		<id>https://www.binefa.com/index.php?title=Uso_del_NodeRED_(2025-2026)&amp;diff=12325&amp;oldid=prev</id>
		<title>Jordi Binefa: Es crea la pàgina amb «= Comunicación MQTT entre el NodeRED y la placa IoT-02 = &lt;!-- Asignación de puertos para el curso 2023-2024  '''El firmware de la placa IoT-02 para el día de ho...».</title>
		<link rel="alternate" type="text/html" href="https://www.binefa.com/index.php?title=Uso_del_NodeRED_(2025-2026)&amp;diff=12325&amp;oldid=prev"/>
		<updated>2026-05-17T21:29:42Z</updated>

		<summary type="html">&lt;p&gt;Es crea la pàgina amb «= Comunicación MQTT entre el NodeRED y la placa IoT-02 = &amp;lt;!-- &lt;a href=&quot;/index.php/Asignaci%C3%B3n_de_puertos_para_el_curso_2023-2024&quot; title=&quot;Asignación de puertos para el curso 2023-2024&quot;&gt;Asignación de puertos para el curso 2023-2024&lt;/a&gt;  &amp;#039;&amp;#039;&amp;#039;El firmware de la placa IoT-02 para el día de ho...».&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Pàgina nova&lt;/b&gt;&lt;/p&gt;&lt;div&gt;= Comunicación MQTT entre el NodeRED y la placa IoT-02 =&lt;br /&gt;
&amp;lt;!-- [[Asignación de puertos para el curso 2023-2024]]&lt;br /&gt;
&lt;br /&gt;
'''El firmware de la placa IoT-02 para el día de hoy es el mismo que usamos el último día''': [https://www.binefa.cat/training/iot02/IoT-02_mqtt_json_upcSchool_broker1.zip firmware para gestionar, también, el uso de JSON en la placa IoT-02]. [https://github.com/jordibinefa/IoT-02/tree/master/codes/IoT-02_mqtt_sync_upcSchool_broker1 Firmware IoT-02_mqtt_json_upcSchool_broker1 en GitHub]&lt;br /&gt;
&lt;br /&gt;
'''En el minuto 2:20 del primer vídeo de la clase invertida se hace referencia a un broker diferente al que tenemos programado en la placa.'''&lt;br /&gt;
&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
'''Las credenciales a utilizar son estas:'''&lt;br /&gt;
&lt;br /&gt;
 const char* mqtt_server = &amp;quot;'''master.iotvertebrae.com'''&amp;quot;; // Your MQTT broker&lt;br /&gt;
 const int mqtt_port = '''1883'''; &lt;br /&gt;
 const char* mqtt_user = &amp;quot;'''user'''&amp;quot;;&lt;br /&gt;
 const char* mqtt_password = &amp;quot;'''pass'''&amp;quot;;&lt;br /&gt;
&amp;lt;!--[[Asignación de puertos para el curso 2022-2023]]&lt;br /&gt;
&lt;br /&gt;
'''Nuevo firmware de la placa IoT-02 para el día de hoy''' (se han añadido temas MQTT para trabajar con JSON): [https://www.binefa.cat/training/iot02/IoT-02_mqtt_json_upcSchool_broker2.zip firmware para gestionar el uso de JSON en la placa IoT-02]. [https://github.com/jordibinefa/IoT-02/tree/master/codes/IoT-02_mqtt_json_upcSchool_broker2 Firmware IoT-02_mqtt_json_upcSchool_broker2 en GitHub]--&amp;gt;&lt;br /&gt;
== Subscripción y publicación ==&lt;br /&gt;
[[Image:Nodered20220402a00.png|center|Comunicación MQTT entre el NodeRED y la placa IoT-02]]&lt;br /&gt;
&lt;br /&gt;
=== Ejercicio '''NodeRED-01''' ===&lt;br /&gt;
Implementad vuestro flujo para recibir el estado de los tres botones (de manera asíncrona, cuando hay un cambio) de la placa IoT-02.&lt;br /&gt;
&lt;br /&gt;
= Panel de Control (''Dashboard'') =&lt;br /&gt;
[https://flows.nodered.org/node/node-red-dashboard Hace falta instalar el conjunto de nodos ''node-red-dashboard'']&lt;br /&gt;
== Nodo '''conmutador''' (''switch'') ==&lt;br /&gt;
El nodo commutador envía un ''payload'' personalizado para el estado ''ON'' y el estado ''OFF''.&lt;br /&gt;
&lt;br /&gt;
[[Image:Nodered20220402b01.png|center|Flujo conmutador leds]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Image:Nodered20220402b00.png|center|Visualización conmutador leds]]&lt;br /&gt;
=== Ejercicio '''NodeRED-02''' ===&lt;br /&gt;
Poned 5 conmutadores (Control de los 4 leds y el estado del relé biestable del placa IoT-02).&lt;br /&gt;
&lt;br /&gt;
== Nodos de '''texto''', '''botón''' y '''variables de flujo'''. Cambio de color de un punto (representación de un led) ==&lt;br /&gt;
El nodo botón envía un ''payload'' personalizado cuando se aprieta.&lt;br /&gt;
&lt;br /&gt;
[[Image:Nodered20220402c01.png|center|Flujo cambio de color de un punto]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Image:Nodered20220402c00.png|center|Visualización cambio de color de un punto]]&lt;br /&gt;
&lt;br /&gt;
En el ''Value format'' del nodo de texto:&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&amp;lt;font color={{msg.color}} &amp;gt;&amp;lt;i class=&amp;quot;fa fa-circle&amp;quot; style=&amp;quot;font-size:24px;&amp;quot;&amp;gt;&amp;lt;/i&amp;gt;&amp;lt;/font&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Función '''FF3399''':&lt;br /&gt;
 msg.color = &amp;quot;#FF3399&amp;quot;&lt;br /&gt;
 return msg;&lt;br /&gt;
&lt;br /&gt;
Función '''{R,G,B} -&amp;gt; {0,0,0}''':&lt;br /&gt;
 flow.set(&amp;quot;R&amp;quot;,&amp;quot;00&amp;quot;);&lt;br /&gt;
 flow.set(&amp;quot;G&amp;quot;,&amp;quot;00&amp;quot;);&lt;br /&gt;
 flow.set(&amp;quot;B&amp;quot;,&amp;quot;00&amp;quot;);&lt;br /&gt;
 flow.set(&amp;quot;RGB&amp;quot;,&amp;quot;#&amp;quot;+flow.get(&amp;quot;R&amp;quot;)+flow.get(&amp;quot;G&amp;quot;)+flow.get(&amp;quot;B&amp;quot;));&lt;br /&gt;
 msg.color = flow.get(&amp;quot;RGB&amp;quot;);&lt;br /&gt;
 return msg;&lt;br /&gt;
&lt;br /&gt;
Función '''R -&amp;gt; FF''':&lt;br /&gt;
 flow.set(&amp;quot;R&amp;quot;,&amp;quot;FF&amp;quot;);&lt;br /&gt;
 flow.set(&amp;quot;RGB&amp;quot;,&amp;quot;#&amp;quot;+flow.get(&amp;quot;R&amp;quot;)+flow.get(&amp;quot;G&amp;quot;)+flow.get(&amp;quot;B&amp;quot;));&lt;br /&gt;
 msg.color = flow.get(&amp;quot;RGB&amp;quot;);&lt;br /&gt;
 return msg;&lt;br /&gt;
&lt;br /&gt;
Función '''R -&amp;gt; 00''':&lt;br /&gt;
 flow.set(&amp;quot;R&amp;quot;,&amp;quot;00&amp;quot;);&lt;br /&gt;
 flow.set(&amp;quot;RGB&amp;quot;,&amp;quot;#&amp;quot;+flow.get(&amp;quot;R&amp;quot;)+flow.get(&amp;quot;G&amp;quot;)+flow.get(&amp;quot;B&amp;quot;));&lt;br /&gt;
 msg.color = flow.get(&amp;quot;RGB&amp;quot;);&lt;br /&gt;
 return msg;&lt;br /&gt;
&lt;br /&gt;
[https://www.binefa.cat/training/upcSchool/2022/20220402/ledMulticolor.nodered.json Flujo ledMulticolor.nodered.json]&lt;br /&gt;
=== Ejercicio '''NodeRED-03''' ===&lt;br /&gt;
Haced una visualización de un punto que representa un led multicolor. En la placa IoT-02:&lt;br /&gt;
&lt;br /&gt;
* Cuando el botón '''IO0''' esté apretado incorpora el color '''rojo''' al punto multicolor representado en el panel de control del NodeRED&lt;br /&gt;
&lt;br /&gt;
* Cuando el botón IO0 no esté apretado quita el color rojo al punto multicolor representado en el panel de control del NodeRED&lt;br /&gt;
&lt;br /&gt;
* Cuando el botón '''I34''' esté apretado incorpora el color '''verde''' al punto multicolor representado en el panel de control del NodeRED&lt;br /&gt;
&lt;br /&gt;
* Cuando el botón I34 no esté apretado quita el color verde al punto multicolor representado en el panel de control del NodeRED&lt;br /&gt;
&lt;br /&gt;
* Cuando el botón '''I35''' esté apretado incorpora el color '''azul''' al punto multicolor representado en el panel de control del NodeRED&lt;br /&gt;
&lt;br /&gt;
* Cuando el botón I35 no esté apretado quita el color azul al punto multicolor representado en el panel de control del NodeRED&lt;br /&gt;
&lt;br /&gt;
== '''Simulación de generación de un dato'''. Aleatorización controlada por el panel de control ==&lt;br /&gt;
[[Image:12nodeRedRandomUi.png|center|Generación de datos aleatorios]]&lt;br /&gt;
&lt;br /&gt;
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''.&lt;br /&gt;
&lt;br /&gt;
[[Image:14nodeRedRandomUi.png|center|Generación de datos aleatorios]]&lt;br /&gt;
&lt;br /&gt;
[https://www.binefa.cat/training/upcSchool/2022/20220402/14nodeRedRandomUi.nodered.json Código para el NodeRED que genera datos aleatorios]&lt;br /&gt;
&lt;br /&gt;
Función '''Randomizing (On/Off)''':&lt;br /&gt;
 flow.set(&amp;quot;Randomizing&amp;quot;,msg.payload);&lt;br /&gt;
 return msg;&lt;br /&gt;
&lt;br /&gt;
Función '''random value in range (20.0,30.0)''':&lt;br /&gt;
 msg.payload = parseFloat( (200 + Math.floor(Math.random() * 101))/10); // value between 20.0 and 30.0&lt;br /&gt;
 return msg;&lt;br /&gt;
&lt;br /&gt;
=== Ejercicio '''NodeRED-04''' ===&lt;br /&gt;
Importad el [https://www.binefa.cat/training/upcSchool/2022/20220402/14nodeRedRandomUi.nodered.json flujo 14nodeRedRandomUi] y verificad el funcionamiento.&lt;br /&gt;
&lt;br /&gt;
== Conversión de '''JSON''' a texto y texto a JSON ==&lt;br /&gt;
[[Image:Nodered20220402d00.png|center|Flujo JSON -&amp;gt; TXT y TXT -&amp;gt; JSON]]&lt;br /&gt;
&lt;br /&gt;
[https://www.binefa.cat/training/upcSchool/2022/20220402/jsonTxt.nodered.json Flujo jsonTxt.nodered.json]&lt;br /&gt;
&lt;br /&gt;
* Función '''genero json''':&lt;br /&gt;
 var json00 = {}&lt;br /&gt;
 json00.nombre = &amp;quot;Joan&amp;quot;&lt;br /&gt;
 json00.apellido = &amp;quot;Pérez&amp;quot;&lt;br /&gt;
 json00.edad = 26&lt;br /&gt;
 msg.payload = json00&lt;br /&gt;
 return msg;&lt;br /&gt;
&lt;br /&gt;
* Función '''genero txt''':&lt;br /&gt;
 var txt = &amp;quot;{\&amp;quot;apellido\&amp;quot;:\&amp;quot;Martínez\&amp;quot;,\&amp;quot;nombre\&amp;quot;:\&amp;quot;Meritxell\&amp;quot;,\&amp;quot;edad\&amp;quot;:28}&amp;quot;&lt;br /&gt;
 msg.payload = txt&lt;br /&gt;
 return msg;&lt;br /&gt;
&lt;br /&gt;
== Pasarela '''HTTP a MQTT''' ==&lt;br /&gt;
[[Image:Nodered20220402e00.png|center|Flujo HTTP a MQTT]]&lt;br /&gt;
&lt;br /&gt;
[https://www.binefa.cat/training/upcSchool/2022/20220402/httpMqtt.nodered.json Flujo httpMqtt.nodered.json]&lt;br /&gt;
&lt;br /&gt;
[http://vps656540.ovh.net:2222/mqtt?topic=/7C9EBDEA5BA0/ledW&amp;amp;&amp;amp;payload=0 Apagando] led blanco:&lt;br /&gt;
[[Image:Nodered20220402e01.png|center|Apagando led blanco. HTTP a MQTT]]&lt;br /&gt;
&lt;br /&gt;
[http://vps656540.ovh.net:2222/mqtt?topic=/7C9EBDEA5BA0/ledW&amp;amp;&amp;amp;payload=1 Encendiendo] led blanco:&lt;br /&gt;
[[Image:Nodered20220402e02.png|center|Encendiendo led blanco. HTTP a MQTT]]&lt;br /&gt;
&lt;br /&gt;
* Función '''bridge''':&lt;br /&gt;
 msg.topic = msg.req.query['topic'];&lt;br /&gt;
 msg.payload = msg.req.query['payload'];&lt;br /&gt;
 return msg;&lt;br /&gt;
&lt;br /&gt;
* Función '''response''':&lt;br /&gt;
 msg.payload = &amp;quot;Tema: &amp;quot;+msg.req.query['topic']+&amp;quot;, missatge: &amp;quot;+msg.req.query['payload'];&lt;br /&gt;
 return msg;&lt;br /&gt;
&lt;br /&gt;
=== Ejercicio '''NodeRED-05''' ===&lt;br /&gt;
Implementad vuestro flujo para cambiar el estado de los leds y el relé biestable de la placa IoT-02.&lt;br /&gt;
&lt;br /&gt;
== Nodo '''exec''' ==&lt;br /&gt;
El nodo '''exec''' ejecuta órdenes del sistema operativo.&lt;br /&gt;
&lt;br /&gt;
[[Image:Nodered20220402h00.png|center|Flujo con nodo exec]]&lt;br /&gt;
&lt;br /&gt;
[https://www.binefa.cat/training/upcSchool/2022/20220402/exec.nodered.json Flujo exec.nodered.json]&lt;br /&gt;
&lt;br /&gt;
== Envío de JSON a la placa IoT-02 ==&lt;br /&gt;
&lt;br /&gt;
[[Image:Nodered20220402f00.png|center|Flujo de JSON en nodo Inject en NodeRED]]&lt;br /&gt;
&lt;br /&gt;
[[Image:Nodered20220402f01.png|center|Edición de JSON en nodo Inject en NodeRED]]&lt;br /&gt;
&lt;br /&gt;
[https://www.binefa.cat/training/upcSchool/2022/20220402/jsonLeds.json Flujo jsonLeds.json]&lt;br /&gt;
&lt;br /&gt;
* En el código Arduino se diferencia el tipo '''bool''' del tipo '''int''':&lt;br /&gt;
  if (szTopic == String(&amp;quot;/&amp;quot; + String(sMac) + TOPIC_JSON_LEDS  ).c_str()) {&lt;br /&gt;
    JSONVar myObject = JSON.parse(szPayload);&lt;br /&gt;
    if (JSON.typeof(myObject) == &amp;quot;undefined&amp;quot;) {&lt;br /&gt;
      Serial.println(&amp;quot;Parsing input failed!&amp;quot;);&lt;br /&gt;
      return;&lt;br /&gt;
    }&lt;br /&gt;
    if (myObject.hasOwnProperty(&amp;quot;ledW&amp;quot;)) {&lt;br /&gt;
      digitalWrite(LED_W, ('''bool''')myObject[&amp;quot;ledW&amp;quot;]);&lt;br /&gt;
    }    &lt;br /&gt;
    if (myObject.hasOwnProperty(&amp;quot;ledR&amp;quot;)) {&lt;br /&gt;
      digitalWrite(LED_R, ('''int''')myObject[&amp;quot;ledR&amp;quot;]);&lt;br /&gt;
    }&lt;br /&gt;
    if (myObject.hasOwnProperty(&amp;quot;ledY&amp;quot;)) {&lt;br /&gt;
      digitalWrite(LED_Y, ('''int''')myObject[&amp;quot;ledY&amp;quot;]);&lt;br /&gt;
    }&lt;br /&gt;
    if (myObject.hasOwnProperty(&amp;quot;ledG&amp;quot;)) {&lt;br /&gt;
      digitalWrite(LED_G, ('''int''')myObject[&amp;quot;ledG&amp;quot;]);&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
== Recepción de JSON desde la placa IoT-02 ==&lt;br /&gt;
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).&lt;br /&gt;
&lt;br /&gt;
[[Image:Nodered20220402g00.png|center|Flujo recepción de JSON]]&lt;br /&gt;
&lt;br /&gt;
[https://www.binefa.cat/training/upcSchool/2022/20220402/jsonIn.nodered.json Flujo jsonIn.nodered.json]&lt;br /&gt;
&lt;br /&gt;
=== Ejercicio '''NodeRED-06''' ===&lt;br /&gt;
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.&lt;/div&gt;</summary>
		<author><name>Jordi Binefa</name></author>
		
	</entry>
</feed>