<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ca">
	<id>https://www.binefa.com/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Jordi+Binefa</id>
	<title>binefa.com - Contribucions de l'usuari [ca]</title>
	<link rel="self" type="application/atom+xml" href="https://www.binefa.com/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Jordi+Binefa"/>
	<link rel="alternate" type="text/html" href="https://www.binefa.com/index.php/Especial:Contribucions/Jordi_Binefa"/>
	<updated>2026-05-18T06:14:44Z</updated>
	<subtitle>Contribucions de l'usuari</subtitle>
	<generator>MediaWiki 1.33.0</generator>
	<entry>
		<id>https://www.binefa.com/index.php?title=23_/_5_/_2026_-_IoT,_Embedded_Systems,_Edge_y_Cloud&amp;diff=12330</id>
		<title>23 / 5 / 2026 - IoT, Embedded Systems, Edge y Cloud</title>
		<link rel="alternate" type="text/html" href="https://www.binefa.com/index.php?title=23_/_5_/_2026_-_IoT,_Embedded_Systems,_Edge_y_Cloud&amp;diff=12330"/>
		<updated>2026-05-17T21:34:34Z</updated>

		<summary type="html">&lt;p&gt;Jordi Binefa: /* Práctica final */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Conceptos previos (22 / 5 / 2026) =&lt;br /&gt;
* Funciones en Node-RED&lt;br /&gt;
* Explicación del flujo MQTT ''request-response'' síncrono en Snap! y Node-RED &lt;br /&gt;
* Uso de GSheets &lt;br /&gt;
&lt;br /&gt;
= Temario (23 / 5 / 2026) =&lt;br /&gt;
[https://meet.google.com/rke-afvm-eou Videoconferencia]&lt;br /&gt;
&amp;lt;!--[https://meet.google.com/uko-nrvp-neu Videoconferencia]&lt;br /&gt;
[https://meet.google.com/kvv-tduj-nni Videoconferencia] --&amp;gt;&lt;br /&gt;
== Conceptos previos ==&lt;br /&gt;
=== Node-RED ===&lt;br /&gt;
* [[Asignación de puertos para el curso 2025-2026]]&lt;br /&gt;
&amp;lt;!--[[Asignación de puertos para el curso 2024-2025]]&lt;br /&gt;
[[Asignación de puertos para el curso 2023-2024]]&lt;br /&gt;
[[Asignación de puertos para el curso 2022-2023]]--&amp;gt;&lt;br /&gt;
==== Uso del Node-RED ====&lt;br /&gt;
* [[Uso del NodeRED (2025-2026) | Uso del Node-RED]]&lt;br /&gt;
&amp;lt;!--[[Uso del NodeRED (2023) | Uso del Node-RED]]--&amp;gt;&lt;br /&gt;
==== Uso de la base de datos MariaDB desde Node-RED====&lt;br /&gt;
* [[Uso de MariaDB en el VPS del Máster de Industria 4.0 el curso 2025-2026 | Uso de MariaDB en el VPS del Máster de Industria 4.0]]&lt;br /&gt;
&amp;lt;!-- [[Uso de MariaDB en el VPS del Máster de Industria 4.0 el curso 2023-2024 | Uso de MariaDB en el VPS del Máster de Industria 4.0]] --&amp;gt; &lt;br /&gt;
* [[Uso de la base de datos MariaDB desde NodeRED (2023) | Uso de la base de datos MariaDB desde Node-RED]]&lt;br /&gt;
&amp;lt;!-- == MQTT síncrono y asíncrono ==&lt;br /&gt;
[http://extensions.snap.berkeley.edu/snap/snap.html#open:https://raw.githubusercontent.com/jordibinefa/IoT-02/master/codes/snap/test_dt_IoT-02.xml Acceso directo a Snap!] (cambiamos el bloque reportador '''timer''' por el bloque reportador '''current''' seleccionando la opción '''time in milliseconds''', que indica el número de milisegundos pasados desde el 1 de Enero de 1970. '''timer''' indica el número de segundos desde que el Snap! funciona) para probar MQTT síncrono y asíncrono con la placa IoT-02 ('''Es el mismo que se ha usado en las dos últimas clases'''. [https://www.binefa.cat/training/iot02/IoT-02_mqtt_json_upcSchool_broker1.zip Firmware que permite el uso de MQTT síncrono 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]) --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Telegram ==&lt;br /&gt;
[[Uso de Telegram desde NodeRED]]&lt;br /&gt;
&lt;br /&gt;
== Grafana ==&lt;br /&gt;
[[Uso de Grafana en el VPS del Máster de Industria 4.0 el curso 2024-2025 | Uso de Grafana en el VPS del Máster de Industria 4.0]]&lt;br /&gt;
&amp;lt;!-- &lt;br /&gt;
[[Uso de Grafana en el VPS del Máster de Industria 4.0 el curso 2022-2023 | Uso de Grafana en el VPS del Máster de Industria 4.0]]&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Repaso y dudas de la clase invertida ==&lt;br /&gt;
* Telegram&lt;br /&gt;
&lt;br /&gt;
* Grafana&lt;br /&gt;
== Ejercicios ==&lt;br /&gt;
=== Ejercicios '''Telegram''' ===&lt;br /&gt;
* Desde el chat del bot: Al enviar la orden '''/ledWon''' se enciende el led blanco de la placa IoT-02. Al enviar la orden '''/ledWoff''' se apaga el led blanco.&lt;br /&gt;
&lt;br /&gt;
* Desde el chat del bot: Al enviar la orden '''/ledReleSet''' el relé se pone en estado SET. Al enviar la orden '''/ledReleReset''' el relé se pone en estado RESET.&lt;br /&gt;
&lt;br /&gt;
* El chat de vuestro bot recibe un mensaje cuando se aprieta vuestro botón I34 y cuando se deja de apretar.&lt;br /&gt;
&lt;br /&gt;
* Desde el chat del grupo donde pertenece vuestro bot: Al enviar la orden '''/entradas''' el bot contesta con los estados de los botones y la temperatura de la placa.&lt;br /&gt;
== Práctica final ==&lt;br /&gt;
[https://binefa.com/upc-school/Enunciado_Practica_IoT_Hands-on_IoT_MVPs_2025-2026.pdf Enunciado Práctica IoT Hands-on IoT MVPs]&lt;br /&gt;
&amp;lt;!-- [https://www.binefa.cat/training/upcSchool/2025/20250607/Enunciado_Practica_IoT_Hands-on_IoT_MVPs.pdf Enunciado Práctica IoT Hands-on IoT MVPs]&lt;br /&gt;
[https://www.binefa.cat/training/upcSchool/2024/20240504/Enunciado_Practica_IoT_Hands-on_IoT_MVPs.pdf Enunciado Práctica IoT Hands-on IoT MVPs]&lt;br /&gt;
[https://www.binefa.cat/training/upcSchool/2023/20230422/Enunciado%20Practica%20IoT%20Hands-on%20IoT%20MVPs.pdf Enunciado Práctica IoT Hands-on IoT MVPs]--&amp;gt;&lt;/div&gt;</summary>
		<author><name>Jordi Binefa</name></author>
		
	</entry>
	<entry>
		<id>https://www.binefa.com/index.php?title=23_/_5_/_2026_-_IoT,_Embedded_Systems,_Edge_y_Cloud&amp;diff=12329</id>
		<title>23 / 5 / 2026 - IoT, Embedded Systems, Edge y Cloud</title>
		<link rel="alternate" type="text/html" href="https://www.binefa.com/index.php?title=23_/_5_/_2026_-_IoT,_Embedded_Systems,_Edge_y_Cloud&amp;diff=12329"/>
		<updated>2026-05-17T21:33:33Z</updated>

		<summary type="html">&lt;p&gt;Jordi Binefa: /* Conceptos previos */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Conceptos previos (22 / 5 / 2026) =&lt;br /&gt;
* Funciones en Node-RED&lt;br /&gt;
* Explicación del flujo MQTT ''request-response'' síncrono en Snap! y Node-RED &lt;br /&gt;
* Uso de GSheets &lt;br /&gt;
&lt;br /&gt;
= Temario (23 / 5 / 2026) =&lt;br /&gt;
[https://meet.google.com/rke-afvm-eou Videoconferencia]&lt;br /&gt;
&amp;lt;!--[https://meet.google.com/uko-nrvp-neu Videoconferencia]&lt;br /&gt;
[https://meet.google.com/kvv-tduj-nni Videoconferencia] --&amp;gt;&lt;br /&gt;
== Conceptos previos ==&lt;br /&gt;
=== Node-RED ===&lt;br /&gt;
* [[Asignación de puertos para el curso 2025-2026]]&lt;br /&gt;
&amp;lt;!--[[Asignación de puertos para el curso 2024-2025]]&lt;br /&gt;
[[Asignación de puertos para el curso 2023-2024]]&lt;br /&gt;
[[Asignación de puertos para el curso 2022-2023]]--&amp;gt;&lt;br /&gt;
==== Uso del Node-RED ====&lt;br /&gt;
* [[Uso del NodeRED (2025-2026) | Uso del Node-RED]]&lt;br /&gt;
&amp;lt;!--[[Uso del NodeRED (2023) | Uso del Node-RED]]--&amp;gt;&lt;br /&gt;
==== Uso de la base de datos MariaDB desde Node-RED====&lt;br /&gt;
* [[Uso de MariaDB en el VPS del Máster de Industria 4.0 el curso 2025-2026 | Uso de MariaDB en el VPS del Máster de Industria 4.0]]&lt;br /&gt;
&amp;lt;!-- [[Uso de MariaDB en el VPS del Máster de Industria 4.0 el curso 2023-2024 | Uso de MariaDB en el VPS del Máster de Industria 4.0]] --&amp;gt; &lt;br /&gt;
* [[Uso de la base de datos MariaDB desde NodeRED (2023) | Uso de la base de datos MariaDB desde Node-RED]]&lt;br /&gt;
&amp;lt;!-- == MQTT síncrono y asíncrono ==&lt;br /&gt;
[http://extensions.snap.berkeley.edu/snap/snap.html#open:https://raw.githubusercontent.com/jordibinefa/IoT-02/master/codes/snap/test_dt_IoT-02.xml Acceso directo a Snap!] (cambiamos el bloque reportador '''timer''' por el bloque reportador '''current''' seleccionando la opción '''time in milliseconds''', que indica el número de milisegundos pasados desde el 1 de Enero de 1970. '''timer''' indica el número de segundos desde que el Snap! funciona) para probar MQTT síncrono y asíncrono con la placa IoT-02 ('''Es el mismo que se ha usado en las dos últimas clases'''. [https://www.binefa.cat/training/iot02/IoT-02_mqtt_json_upcSchool_broker1.zip Firmware que permite el uso de MQTT síncrono 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]) --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Telegram ==&lt;br /&gt;
[[Uso de Telegram desde NodeRED]]&lt;br /&gt;
&lt;br /&gt;
== Grafana ==&lt;br /&gt;
[[Uso de Grafana en el VPS del Máster de Industria 4.0 el curso 2024-2025 | Uso de Grafana en el VPS del Máster de Industria 4.0]]&lt;br /&gt;
&amp;lt;!-- &lt;br /&gt;
[[Uso de Grafana en el VPS del Máster de Industria 4.0 el curso 2022-2023 | Uso de Grafana en el VPS del Máster de Industria 4.0]]&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Repaso y dudas de la clase invertida ==&lt;br /&gt;
* Telegram&lt;br /&gt;
&lt;br /&gt;
* Grafana&lt;br /&gt;
== Ejercicios ==&lt;br /&gt;
=== Ejercicios '''Telegram''' ===&lt;br /&gt;
* Desde el chat del bot: Al enviar la orden '''/ledWon''' se enciende el led blanco de la placa IoT-02. Al enviar la orden '''/ledWoff''' se apaga el led blanco.&lt;br /&gt;
&lt;br /&gt;
* Desde el chat del bot: Al enviar la orden '''/ledReleSet''' el relé se pone en estado SET. Al enviar la orden '''/ledReleReset''' el relé se pone en estado RESET.&lt;br /&gt;
&lt;br /&gt;
* El chat de vuestro bot recibe un mensaje cuando se aprieta vuestro botón I34 y cuando se deja de apretar.&lt;br /&gt;
&lt;br /&gt;
* Desde el chat del grupo donde pertenece vuestro bot: Al enviar la orden '''/entradas''' el bot contesta con los estados de los botones y la temperatura de la placa.&lt;br /&gt;
== Práctica final ==&lt;br /&gt;
[https://www.binefa.cat/training/upcSchool/2025/20250607/Enunciado_Practica_IoT_Hands-on_IoT_MVPs.pdf Enunciado Práctica IoT Hands-on IoT MVPs]&lt;br /&gt;
&amp;lt;!--[https://www.binefa.cat/training/upcSchool/2024/20240504/Enunciado_Practica_IoT_Hands-on_IoT_MVPs.pdf Enunciado Práctica IoT Hands-on IoT MVPs]&lt;br /&gt;
[https://www.binefa.cat/training/upcSchool/2023/20230422/Enunciado%20Practica%20IoT%20Hands-on%20IoT%20MVPs.pdf Enunciado Práctica IoT Hands-on IoT MVPs]--&amp;gt;&lt;/div&gt;</summary>
		<author><name>Jordi Binefa</name></author>
		
	</entry>
	<entry>
		<id>https://www.binefa.com/index.php?title=23_/_5_/_2026_-_IoT,_Embedded_Systems,_Edge_y_Cloud&amp;diff=12328</id>
		<title>23 / 5 / 2026 - IoT, Embedded Systems, Edge y Cloud</title>
		<link rel="alternate" type="text/html" href="https://www.binefa.com/index.php?title=23_/_5_/_2026_-_IoT,_Embedded_Systems,_Edge_y_Cloud&amp;diff=12328"/>
		<updated>2026-05-17T21:33:09Z</updated>

		<summary type="html">&lt;p&gt;Jordi Binefa: /* MQTT síncrono y asíncrono */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Conceptos previos (22 / 5 / 2026) =&lt;br /&gt;
* Funciones en Node-RED&lt;br /&gt;
* Explicación del flujo MQTT ''request-response'' síncrono en Snap! y Node-RED &lt;br /&gt;
* Uso de GSheets &lt;br /&gt;
&lt;br /&gt;
= Temario (23 / 5 / 2026) =&lt;br /&gt;
[https://meet.google.com/rke-afvm-eou Videoconferencia]&lt;br /&gt;
&amp;lt;!--[https://meet.google.com/uko-nrvp-neu Videoconferencia]&lt;br /&gt;
[https://meet.google.com/kvv-tduj-nni Videoconferencia] --&amp;gt;&lt;br /&gt;
== Conceptos previos ==&lt;br /&gt;
=== Node-RED ===&lt;br /&gt;
* [[Asignación de puertos para el curso 2025-2026]]&lt;br /&gt;
&amp;lt;!--[[Asignación de puertos para el curso 2024-2025]]&lt;br /&gt;
[[Asignación de puertos para el curso 2023-2024]]&lt;br /&gt;
[[Asignación de puertos para el curso 2022-2023]]--&amp;gt;&lt;br /&gt;
==== Uso del Node-RED ====&lt;br /&gt;
* [[Uso del NodeRED (2025-2026) | Uso del Node-RED]]&lt;br /&gt;
&amp;lt;!--[[Uso del NodeRED (2023) | Uso del Node-RED]]--&amp;gt;&lt;br /&gt;
==== Uso de la base de datos MariaDB desde Node-RED====&lt;br /&gt;
* [[Uso de MariaDB en el VPS del Máster de Industria 4.0 el curso 2025-2026 | Uso de MariaDB en el VPS del Máster de Industria 4.0]]&lt;br /&gt;
&amp;lt;!-- [[Uso de MariaDB en el VPS del Máster de Industria 4.0 el curso 2023-2024 | Uso de MariaDB en el VPS del Máster de Industria 4.0]] --&amp;gt; &lt;br /&gt;
* [[Uso de la base de datos MariaDB desde NodeRED (2023) | Uso de la base de datos MariaDB desde Node-RED]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- == MQTT síncrono y asíncrono ==&lt;br /&gt;
[http://extensions.snap.berkeley.edu/snap/snap.html#open:https://raw.githubusercontent.com/jordibinefa/IoT-02/master/codes/snap/test_dt_IoT-02.xml Acceso directo a Snap!] (cambiamos el bloque reportador '''timer''' por el bloque reportador '''current''' seleccionando la opción '''time in milliseconds''', que indica el número de milisegundos pasados desde el 1 de Enero de 1970. '''timer''' indica el número de segundos desde que el Snap! funciona) para probar MQTT síncrono y asíncrono con la placa IoT-02 ('''Es el mismo que se ha usado en las dos últimas clases'''. [https://www.binefa.cat/training/iot02/IoT-02_mqtt_json_upcSchool_broker1.zip Firmware que permite el uso de MQTT síncrono 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;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Telegram ==&lt;br /&gt;
[[Uso de Telegram desde NodeRED]]&lt;br /&gt;
&lt;br /&gt;
== Grafana ==&lt;br /&gt;
[[Uso de Grafana en el VPS del Máster de Industria 4.0 el curso 2024-2025 | Uso de Grafana en el VPS del Máster de Industria 4.0]]&lt;br /&gt;
&amp;lt;!-- &lt;br /&gt;
[[Uso de Grafana en el VPS del Máster de Industria 4.0 el curso 2022-2023 | Uso de Grafana en el VPS del Máster de Industria 4.0]]&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Repaso y dudas de la clase invertida ==&lt;br /&gt;
* Telegram&lt;br /&gt;
&lt;br /&gt;
* Grafana&lt;br /&gt;
== Ejercicios ==&lt;br /&gt;
=== Ejercicios '''Telegram''' ===&lt;br /&gt;
* Desde el chat del bot: Al enviar la orden '''/ledWon''' se enciende el led blanco de la placa IoT-02. Al enviar la orden '''/ledWoff''' se apaga el led blanco.&lt;br /&gt;
&lt;br /&gt;
* Desde el chat del bot: Al enviar la orden '''/ledReleSet''' el relé se pone en estado SET. Al enviar la orden '''/ledReleReset''' el relé se pone en estado RESET.&lt;br /&gt;
&lt;br /&gt;
* El chat de vuestro bot recibe un mensaje cuando se aprieta vuestro botón I34 y cuando se deja de apretar.&lt;br /&gt;
&lt;br /&gt;
* Desde el chat del grupo donde pertenece vuestro bot: Al enviar la orden '''/entradas''' el bot contesta con los estados de los botones y la temperatura de la placa.&lt;br /&gt;
== Práctica final ==&lt;br /&gt;
[https://www.binefa.cat/training/upcSchool/2025/20250607/Enunciado_Practica_IoT_Hands-on_IoT_MVPs.pdf Enunciado Práctica IoT Hands-on IoT MVPs]&lt;br /&gt;
&amp;lt;!--[https://www.binefa.cat/training/upcSchool/2024/20240504/Enunciado_Practica_IoT_Hands-on_IoT_MVPs.pdf Enunciado Práctica IoT Hands-on IoT MVPs]&lt;br /&gt;
[https://www.binefa.cat/training/upcSchool/2023/20230422/Enunciado%20Practica%20IoT%20Hands-on%20IoT%20MVPs.pdf Enunciado Práctica IoT Hands-on IoT MVPs]--&amp;gt;&lt;/div&gt;</summary>
		<author><name>Jordi Binefa</name></author>
		
	</entry>
	<entry>
		<id>https://www.binefa.com/index.php?title=23_/_5_/_2026_-_IoT,_Embedded_Systems,_Edge_y_Cloud&amp;diff=12327</id>
		<title>23 / 5 / 2026 - IoT, Embedded Systems, Edge y Cloud</title>
		<link rel="alternate" type="text/html" href="https://www.binefa.com/index.php?title=23_/_5_/_2026_-_IoT,_Embedded_Systems,_Edge_y_Cloud&amp;diff=12327"/>
		<updated>2026-05-17T21:32:05Z</updated>

		<summary type="html">&lt;p&gt;Jordi Binefa: /* Conceptos previos */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Conceptos previos (22 / 5 / 2026) =&lt;br /&gt;
* Funciones en Node-RED&lt;br /&gt;
* Explicación del flujo MQTT ''request-response'' síncrono en Snap! y Node-RED &lt;br /&gt;
* Uso de GSheets &lt;br /&gt;
&lt;br /&gt;
= Temario (23 / 5 / 2026) =&lt;br /&gt;
[https://meet.google.com/rke-afvm-eou Videoconferencia]&lt;br /&gt;
&amp;lt;!--[https://meet.google.com/uko-nrvp-neu Videoconferencia]&lt;br /&gt;
[https://meet.google.com/kvv-tduj-nni Videoconferencia] --&amp;gt;&lt;br /&gt;
== Conceptos previos ==&lt;br /&gt;
=== Node-RED ===&lt;br /&gt;
* [[Asignación de puertos para el curso 2025-2026]]&lt;br /&gt;
&amp;lt;!--[[Asignación de puertos para el curso 2024-2025]]&lt;br /&gt;
[[Asignación de puertos para el curso 2023-2024]]&lt;br /&gt;
[[Asignación de puertos para el curso 2022-2023]]--&amp;gt;&lt;br /&gt;
==== Uso del Node-RED ====&lt;br /&gt;
* [[Uso del NodeRED (2025-2026) | Uso del Node-RED]]&lt;br /&gt;
&amp;lt;!--[[Uso del NodeRED (2023) | Uso del Node-RED]]--&amp;gt;&lt;br /&gt;
==== Uso de la base de datos MariaDB desde Node-RED====&lt;br /&gt;
* [[Uso de MariaDB en el VPS del Máster de Industria 4.0 el curso 2025-2026 | Uso de MariaDB en el VPS del Máster de Industria 4.0]]&lt;br /&gt;
&amp;lt;!-- [[Uso de MariaDB en el VPS del Máster de Industria 4.0 el curso 2023-2024 | Uso de MariaDB en el VPS del Máster de Industria 4.0]] --&amp;gt; &lt;br /&gt;
* [[Uso de la base de datos MariaDB desde NodeRED (2023) | Uso de la base de datos MariaDB desde Node-RED]]&lt;br /&gt;
&lt;br /&gt;
== MQTT síncrono y asíncrono ==&lt;br /&gt;
[http://extensions.snap.berkeley.edu/snap/snap.html#open:https://raw.githubusercontent.com/jordibinefa/IoT-02/master/codes/snap/test_dt_IoT-02.xml Acceso directo a Snap!] (cambiamos el bloque reportador '''timer''' por el bloque reportador '''current''' seleccionando la opción '''time in milliseconds''', que indica el número de milisegundos pasados desde el 1 de Enero de 1970. '''timer''' indica el número de segundos desde que el Snap! funciona) para probar MQTT síncrono y asíncrono con la placa IoT-02 ('''Es el mismo que se ha usado en las dos últimas clases'''. [https://www.binefa.cat/training/iot02/IoT-02_mqtt_json_upcSchool_broker1.zip Firmware que permite el uso de MQTT síncrono 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;
== Telegram ==&lt;br /&gt;
[[Uso de Telegram desde NodeRED]]&lt;br /&gt;
&lt;br /&gt;
== Grafana ==&lt;br /&gt;
[[Uso de Grafana en el VPS del Máster de Industria 4.0 el curso 2024-2025 | Uso de Grafana en el VPS del Máster de Industria 4.0]]&lt;br /&gt;
&amp;lt;!-- &lt;br /&gt;
[[Uso de Grafana en el VPS del Máster de Industria 4.0 el curso 2022-2023 | Uso de Grafana en el VPS del Máster de Industria 4.0]]&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Repaso y dudas de la clase invertida ==&lt;br /&gt;
* Telegram&lt;br /&gt;
&lt;br /&gt;
* Grafana&lt;br /&gt;
== Ejercicios ==&lt;br /&gt;
=== Ejercicios '''Telegram''' ===&lt;br /&gt;
* Desde el chat del bot: Al enviar la orden '''/ledWon''' se enciende el led blanco de la placa IoT-02. Al enviar la orden '''/ledWoff''' se apaga el led blanco.&lt;br /&gt;
&lt;br /&gt;
* Desde el chat del bot: Al enviar la orden '''/ledReleSet''' el relé se pone en estado SET. Al enviar la orden '''/ledReleReset''' el relé se pone en estado RESET.&lt;br /&gt;
&lt;br /&gt;
* El chat de vuestro bot recibe un mensaje cuando se aprieta vuestro botón I34 y cuando se deja de apretar.&lt;br /&gt;
&lt;br /&gt;
* Desde el chat del grupo donde pertenece vuestro bot: Al enviar la orden '''/entradas''' el bot contesta con los estados de los botones y la temperatura de la placa.&lt;br /&gt;
== Práctica final ==&lt;br /&gt;
[https://www.binefa.cat/training/upcSchool/2025/20250607/Enunciado_Practica_IoT_Hands-on_IoT_MVPs.pdf Enunciado Práctica IoT Hands-on IoT MVPs]&lt;br /&gt;
&amp;lt;!--[https://www.binefa.cat/training/upcSchool/2024/20240504/Enunciado_Practica_IoT_Hands-on_IoT_MVPs.pdf Enunciado Práctica IoT Hands-on IoT MVPs]&lt;br /&gt;
[https://www.binefa.cat/training/upcSchool/2023/20230422/Enunciado%20Practica%20IoT%20Hands-on%20IoT%20MVPs.pdf Enunciado Práctica IoT Hands-on IoT MVPs]--&amp;gt;&lt;/div&gt;</summary>
		<author><name>Jordi Binefa</name></author>
		
	</entry>
	<entry>
		<id>https://www.binefa.com/index.php?title=23_/_5_/_2026_-_IoT,_Embedded_Systems,_Edge_y_Cloud&amp;diff=12326</id>
		<title>23 / 5 / 2026 - IoT, Embedded Systems, Edge y Cloud</title>
		<link rel="alternate" type="text/html" href="https://www.binefa.com/index.php?title=23_/_5_/_2026_-_IoT,_Embedded_Systems,_Edge_y_Cloud&amp;diff=12326"/>
		<updated>2026-05-17T21:31:45Z</updated>

		<summary type="html">&lt;p&gt;Jordi Binefa: /* Conceptos previos */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Conceptos previos (22 / 5 / 2026) =&lt;br /&gt;
* Funciones en Node-RED&lt;br /&gt;
* Explicación del flujo MQTT ''request-response'' síncrono en Snap! y Node-RED &lt;br /&gt;
* Uso de GSheets &lt;br /&gt;
&lt;br /&gt;
= Temario (23 / 5 / 2026) =&lt;br /&gt;
[https://meet.google.com/rke-afvm-eou Videoconferencia]&lt;br /&gt;
&amp;lt;!--[https://meet.google.com/uko-nrvp-neu Videoconferencia]&lt;br /&gt;
[https://meet.google.com/kvv-tduj-nni Videoconferencia] --&amp;gt;&lt;br /&gt;
== Conceptos previos ==&lt;br /&gt;
=== Node-RED ===&lt;br /&gt;
[[Asignación de puertos para el curso 2025-2026]]&lt;br /&gt;
&amp;lt;!--[[Asignación de puertos para el curso 2024-2025]]&lt;br /&gt;
[[Asignación de puertos para el curso 2023-2024]]&lt;br /&gt;
[[Asignación de puertos para el curso 2022-2023]]--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Uso del Node-RED ====&lt;br /&gt;
[[Uso del NodeRED (2025-2026) | Uso del Node-RED]]&lt;br /&gt;
&amp;lt;!--[[Uso del NodeRED (2023) | Uso del Node-RED]]--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Uso de la base de datos MariaDB desde Node-RED====&lt;br /&gt;
* [[Uso de MariaDB en el VPS del Máster de Industria 4.0 el curso 2025-2026 | Uso de MariaDB en el VPS del Máster de Industria 4.0]]&lt;br /&gt;
&amp;lt;!-- [[Uso de MariaDB en el VPS del Máster de Industria 4.0 el curso 2023-2024 | Uso de MariaDB en el VPS del Máster de Industria 4.0]] --&amp;gt; &lt;br /&gt;
* [[Uso de la base de datos MariaDB desde NodeRED (2023) | Uso de la base de datos MariaDB desde Node-RED]]&lt;br /&gt;
&lt;br /&gt;
== MQTT síncrono y asíncrono ==&lt;br /&gt;
[http://extensions.snap.berkeley.edu/snap/snap.html#open:https://raw.githubusercontent.com/jordibinefa/IoT-02/master/codes/snap/test_dt_IoT-02.xml Acceso directo a Snap!] (cambiamos el bloque reportador '''timer''' por el bloque reportador '''current''' seleccionando la opción '''time in milliseconds''', que indica el número de milisegundos pasados desde el 1 de Enero de 1970. '''timer''' indica el número de segundos desde que el Snap! funciona) para probar MQTT síncrono y asíncrono con la placa IoT-02 ('''Es el mismo que se ha usado en las dos últimas clases'''. [https://www.binefa.cat/training/iot02/IoT-02_mqtt_json_upcSchool_broker1.zip Firmware que permite el uso de MQTT síncrono 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;
== Telegram ==&lt;br /&gt;
[[Uso de Telegram desde NodeRED]]&lt;br /&gt;
&lt;br /&gt;
== Grafana ==&lt;br /&gt;
[[Uso de Grafana en el VPS del Máster de Industria 4.0 el curso 2024-2025 | Uso de Grafana en el VPS del Máster de Industria 4.0]]&lt;br /&gt;
&amp;lt;!-- &lt;br /&gt;
[[Uso de Grafana en el VPS del Máster de Industria 4.0 el curso 2022-2023 | Uso de Grafana en el VPS del Máster de Industria 4.0]]&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Repaso y dudas de la clase invertida ==&lt;br /&gt;
* Telegram&lt;br /&gt;
&lt;br /&gt;
* Grafana&lt;br /&gt;
== Ejercicios ==&lt;br /&gt;
=== Ejercicios '''Telegram''' ===&lt;br /&gt;
* Desde el chat del bot: Al enviar la orden '''/ledWon''' se enciende el led blanco de la placa IoT-02. Al enviar la orden '''/ledWoff''' se apaga el led blanco.&lt;br /&gt;
&lt;br /&gt;
* Desde el chat del bot: Al enviar la orden '''/ledReleSet''' el relé se pone en estado SET. Al enviar la orden '''/ledReleReset''' el relé se pone en estado RESET.&lt;br /&gt;
&lt;br /&gt;
* El chat de vuestro bot recibe un mensaje cuando se aprieta vuestro botón I34 y cuando se deja de apretar.&lt;br /&gt;
&lt;br /&gt;
* Desde el chat del grupo donde pertenece vuestro bot: Al enviar la orden '''/entradas''' el bot contesta con los estados de los botones y la temperatura de la placa.&lt;br /&gt;
== Práctica final ==&lt;br /&gt;
[https://www.binefa.cat/training/upcSchool/2025/20250607/Enunciado_Practica_IoT_Hands-on_IoT_MVPs.pdf Enunciado Práctica IoT Hands-on IoT MVPs]&lt;br /&gt;
&amp;lt;!--[https://www.binefa.cat/training/upcSchool/2024/20240504/Enunciado_Practica_IoT_Hands-on_IoT_MVPs.pdf Enunciado Práctica IoT Hands-on IoT MVPs]&lt;br /&gt;
[https://www.binefa.cat/training/upcSchool/2023/20230422/Enunciado%20Practica%20IoT%20Hands-on%20IoT%20MVPs.pdf Enunciado Práctica IoT Hands-on IoT MVPs]--&amp;gt;&lt;/div&gt;</summary>
		<author><name>Jordi Binefa</name></author>
		
	</entry>
	<entry>
		<id>https://www.binefa.com/index.php?title=Uso_del_NodeRED_(2025-2026)&amp;diff=12325</id>
		<title>Uso del NodeRED (2025-2026)</title>
		<link rel="alternate" type="text/html" href="https://www.binefa.com/index.php?title=Uso_del_NodeRED_(2025-2026)&amp;diff=12325"/>
		<updated>2026-05-17T21:29:42Z</updated>

		<summary type="html">&lt;p&gt;Jordi Binefa: Es crea la pàgina amb «= Comunicación MQTT entre el NodeRED y la placa IoT-02 = &amp;lt;!-- Asignación de puertos para el curso 2023-2024  '''El firmware de la placa IoT-02 para el día de ho...».&lt;/p&gt;
&lt;hr /&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>
	<entry>
		<id>https://www.binefa.com/index.php?title=23_/_5_/_2026_-_IoT,_Embedded_Systems,_Edge_y_Cloud&amp;diff=12324</id>
		<title>23 / 5 / 2026 - IoT, Embedded Systems, Edge y Cloud</title>
		<link rel="alternate" type="text/html" href="https://www.binefa.com/index.php?title=23_/_5_/_2026_-_IoT,_Embedded_Systems,_Edge_y_Cloud&amp;diff=12324"/>
		<updated>2026-05-17T21:29:01Z</updated>

		<summary type="html">&lt;p&gt;Jordi Binefa: Es crea la pàgina amb «= Conceptos previos (22 / 5 / 2026) = * Funciones en Node-RED * Explicación del flujo MQTT ''request-response'' síncrono en Snap! y Node-RED  * Uso de GSheets   = Te...».&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Conceptos previos (22 / 5 / 2026) =&lt;br /&gt;
* Funciones en Node-RED&lt;br /&gt;
* Explicación del flujo MQTT ''request-response'' síncrono en Snap! y Node-RED &lt;br /&gt;
* Uso de GSheets &lt;br /&gt;
&lt;br /&gt;
= Temario (23 / 5 / 2026) =&lt;br /&gt;
[https://meet.google.com/rke-afvm-eou Videoconferencia]&lt;br /&gt;
&amp;lt;!--[https://meet.google.com/uko-nrvp-neu Videoconferencia]&lt;br /&gt;
[https://meet.google.com/kvv-tduj-nni Videoconferencia] --&amp;gt;&lt;br /&gt;
== Conceptos previos ==&lt;br /&gt;
=== Node-RED ===&lt;br /&gt;
[[Asignación de puertos para el curso 2025-2026]]&lt;br /&gt;
&amp;lt;!--[[Asignación de puertos para el curso 2024-2025]]&lt;br /&gt;
[[Asignación de puertos para el curso 2023-2024]]&lt;br /&gt;
[[Asignación de puertos para el curso 2022-2023]]--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Uso del Node-RED ====&lt;br /&gt;
[[Uso del NodeRED (2025-2026) | Uso del Node-RED]]&lt;br /&gt;
&amp;lt;!--[[Uso del NodeRED (2023) | Uso del Node-RED]]--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Uso de la base de datos MariaDB desde Node-RED====&lt;br /&gt;
[[Uso de MariaDB en el VPS del Máster de Industria 4.0 el curso 2023-2024 | Uso de MariaDB en el VPS del Máster de Industria 4.0]]&lt;br /&gt;
&lt;br /&gt;
[[Uso de la base de datos MariaDB desde NodeRED (2023) | Uso de la base de datos MariaDB desde Node-RED]]&lt;br /&gt;
&lt;br /&gt;
== MQTT síncrono y asíncrono ==&lt;br /&gt;
[http://extensions.snap.berkeley.edu/snap/snap.html#open:https://raw.githubusercontent.com/jordibinefa/IoT-02/master/codes/snap/test_dt_IoT-02.xml Acceso directo a Snap!] (cambiamos el bloque reportador '''timer''' por el bloque reportador '''current''' seleccionando la opción '''time in milliseconds''', que indica el número de milisegundos pasados desde el 1 de Enero de 1970. '''timer''' indica el número de segundos desde que el Snap! funciona) para probar MQTT síncrono y asíncrono con la placa IoT-02 ('''Es el mismo que se ha usado en las dos últimas clases'''. [https://www.binefa.cat/training/iot02/IoT-02_mqtt_json_upcSchool_broker1.zip Firmware que permite el uso de MQTT síncrono 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;
== Telegram ==&lt;br /&gt;
[[Uso de Telegram desde NodeRED]]&lt;br /&gt;
&lt;br /&gt;
== Grafana ==&lt;br /&gt;
[[Uso de Grafana en el VPS del Máster de Industria 4.0 el curso 2024-2025 | Uso de Grafana en el VPS del Máster de Industria 4.0]]&lt;br /&gt;
&amp;lt;!-- &lt;br /&gt;
[[Uso de Grafana en el VPS del Máster de Industria 4.0 el curso 2022-2023 | Uso de Grafana en el VPS del Máster de Industria 4.0]]&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Repaso y dudas de la clase invertida ==&lt;br /&gt;
* Telegram&lt;br /&gt;
&lt;br /&gt;
* Grafana&lt;br /&gt;
== Ejercicios ==&lt;br /&gt;
=== Ejercicios '''Telegram''' ===&lt;br /&gt;
* Desde el chat del bot: Al enviar la orden '''/ledWon''' se enciende el led blanco de la placa IoT-02. Al enviar la orden '''/ledWoff''' se apaga el led blanco.&lt;br /&gt;
&lt;br /&gt;
* Desde el chat del bot: Al enviar la orden '''/ledReleSet''' el relé se pone en estado SET. Al enviar la orden '''/ledReleReset''' el relé se pone en estado RESET.&lt;br /&gt;
&lt;br /&gt;
* El chat de vuestro bot recibe un mensaje cuando se aprieta vuestro botón I34 y cuando se deja de apretar.&lt;br /&gt;
&lt;br /&gt;
* Desde el chat del grupo donde pertenece vuestro bot: Al enviar la orden '''/entradas''' el bot contesta con los estados de los botones y la temperatura de la placa.&lt;br /&gt;
== Práctica final ==&lt;br /&gt;
[https://www.binefa.cat/training/upcSchool/2025/20250607/Enunciado_Practica_IoT_Hands-on_IoT_MVPs.pdf Enunciado Práctica IoT Hands-on IoT MVPs]&lt;br /&gt;
&amp;lt;!--[https://www.binefa.cat/training/upcSchool/2024/20240504/Enunciado_Practica_IoT_Hands-on_IoT_MVPs.pdf Enunciado Práctica IoT Hands-on IoT MVPs]&lt;br /&gt;
[https://www.binefa.cat/training/upcSchool/2023/20230422/Enunciado%20Practica%20IoT%20Hands-on%20IoT%20MVPs.pdf Enunciado Práctica IoT Hands-on IoT MVPs]--&amp;gt;&lt;/div&gt;</summary>
		<author><name>Jordi Binefa</name></author>
		
	</entry>
	<entry>
		<id>https://www.binefa.com/index.php?title=IoT,_Embedded_Systems,_Edge_y_Cloud_(2026)&amp;diff=12323</id>
		<title>IoT, Embedded Systems, Edge y Cloud (2026)</title>
		<link rel="alternate" type="text/html" href="https://www.binefa.com/index.php?title=IoT,_Embedded_Systems,_Edge_y_Cloud_(2026)&amp;diff=12323"/>
		<updated>2026-05-17T21:21:34Z</updated>

		<summary type="html">&lt;p&gt;Jordi Binefa: /* Por días */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;* [[Temario - IoT, Embedded Systems, Edge y Cloud (2026)]]&lt;br /&gt;
* Acceso rápido a esta página: https://t.ly/-LmC9&lt;br /&gt;
= Por días =&lt;br /&gt;
* [[9 / 5 / 2026 - IoT, Embedded Systems, Edge y Cloud]]&lt;br /&gt;
&amp;lt;!-- * 16 / 5 / 2026 - IoT, Embedded Systems, Edge y Cloud --&amp;gt;&lt;br /&gt;
* [[16 / 5 / 2026 - IoT, Embedded Systems, Edge y Cloud]]&lt;br /&gt;
&amp;lt;!-- * 23 / 5 / 2026 - IoT, Embedded Systems, Edge y Cloud --&amp;gt;&lt;br /&gt;
* [[23 / 5 / 2026 - IoT, Embedded Systems, Edge y Cloud]]&lt;br /&gt;
&amp;lt;!-- &lt;br /&gt;
* [[9 / 5 / 2026 - Impresión 3D, Robótica e Iot, Hands on y MVPs]] (versió preliminar)&lt;br /&gt;
* [[24 / 5 / 2025 - Impresión 3D, Robótica e Iot, Hands on y MVPs]]&lt;br /&gt;
* [[31 / 5 / 2025 - Impresión 3D, Robótica e Iot, Hands on y MVPs]]&lt;br /&gt;
* [[7 / 6 / 2025 - Impresión 3D, Robótica e Iot, Hands on y MVPs]] --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Herramientas y recursos =&lt;br /&gt;
* [[Adición del ESP32 en el IDE de Arduino]]&lt;br /&gt;
* [[Simulador de la placa IoT-02 en línea]] &lt;br /&gt;
&amp;lt;!-- [https://meet.google.com/noa-yasq-xeb Videoconferencia] --&amp;gt;&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
username:   docent.industria4.0@talent.upc.edu&lt;br /&gt;
password:   Industria4@online2020&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
* [https://github.com/jordibinefa/IoT-02 Placa IoT-02 en GitHub] ([https://github.com/jordibinefa/iot02-simulator Código del gemelo digital de la placa IoT-02 en GitHub])&lt;br /&gt;
* [https://www.binefa.cat/training/iot02/pdf/iot02_00_es.pdf Introducción a la placa IoT-02 en castellano] en pdf ([https://www.binefa.cat/training/iot02/pdf/iot02_00_ca.pdf ''Introducció a la placa IoT-02'' en catalán])&lt;br /&gt;
* [https://youtu.be/_EIXCGkGQ0U Vídeo de introducción a la placa IoT-02]&lt;br /&gt;
* [https://youtu.be/JothMIY4DWE Vídeo de configuración del IDE de Arduino v1.8.19]&lt;br /&gt;
* [https://youtu.be/UjtULePAbTE Vídeo de configuración del IDE de Arduino v2] ([https://youtu.be/BvdHeNRDgL8 Vídeo de como usar el IDE de Arduino v2 para programar la placa IoT-02])&lt;br /&gt;
* [https://binefa.com/upc-school/libraries_20240420.zip Enlace para bajar las bibliotecas (''libraries'') necesarias para los códigos de ''firmware'' usados en este máster] para el IDE de Arduino ([https://www.arduino.cc/ Página de Arduino])&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- [https://www.binefa.cat/training/iot02/libraries/libraries_20240420.zip Enlace para bajar las bibliotecas (''libraries'') necesarias para los códigos de ''firmware'' usados en este máster] para el IDE de Arduino ([https://www.arduino.cc/ Página de Arduino])&lt;br /&gt;
&lt;br /&gt;
[http://rebost.binefa.cat/iot/videos/01_Intro_placa_IoT-02_es.mkv Vídeo introductorio a la placa IoT-02] &lt;br /&gt;
&lt;br /&gt;
[http://rebost.binefa.cat/iot/videos/02_IDE_Arduino_ESP32_es.mkv Vídeo de instalación del Arduino IDE y algunas bibliotecas extra para probar los códigos en la placa IoT-02] --&amp;gt;&lt;br /&gt;
&amp;lt;!-- [[Instalación de controladores (drivers) para Tecnologías IoT, Hands on y MVP (2022)]] --&amp;gt;&lt;br /&gt;
&amp;lt;!-- [http://formacio.things.cat/mac_IoT-02_mI40/ Herramienta de gestión de la MAC de la placa IoT-02, mediante un cliente web usando JS] --&amp;gt;&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
[[Instalación de programas para Tecnologías IoT, Hands on y MVP (2022)]] --&amp;gt;&lt;br /&gt;
* [[esptool: Herramienta para borrar toda la memoria flash del ESP32 en caso de tener problemas en la subida del firmware]]&lt;br /&gt;
&amp;lt;!-- [http://popotamo.binefa.cat/iot/maqVirt/IoT%20-%20eCat%20-%20Debian%2011.x%2064-bit_v20210304_00.zip Máquina virtual para VMware Workstation Player] basada en Debian GNU/Linux 11. Usuario '''clot''' y contraseña '''fjeclot'''. --&amp;gt;&lt;br /&gt;
* [https://www.onlinegdb.com/ Programación en línea para C, C++, Python y JavaScript, entre otros]&lt;br /&gt;
* [https://app.edublocks.org/#Python Herramienta de conversión de bloques de programación a Python]&lt;br /&gt;
* [https://upcommons.upc.edu/handle/2117/363087 Combining Low-Code Programming and SDL-Based Modeling with Snap! in the Industry 4.0 Context]&lt;br /&gt;
* [[Asignación de puertos para el curso 2025-2026]]&lt;br /&gt;
&amp;lt;!-- * [[Asignación de puertos para el curso 2024-2025]]&lt;br /&gt;
[[Asignación de puertos para el curso 2023-2024]]&lt;br /&gt;
== Proyecto Final ==&lt;br /&gt;
[https://onedrive.live.com/view.aspx?resid=7B61369ED41066A2!819702&amp;amp;ithint=file%2cpptx&amp;amp;authkey=!AN_I9zWRZwOSkKE Asignación de proyectos]&lt;br /&gt;
&lt;br /&gt;
=== Propuestas de Proyecto Final ===&lt;br /&gt;
[[Propuestas de Proyecto Final para el Máster de Industria 4.0 del curso 2020-2021]] --&amp;gt;&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
[[Propuestas de Proyecto Final para el Máster de Industria 4.0 de la empresa Siarq (2020)]]&lt;br /&gt;
&lt;br /&gt;
[[Otras propuestas de Proyecto Final para el Máster de Industria 4.0 (2020)]]&lt;br /&gt;
&lt;br /&gt;
[[Otras propuestas de Proyecto Final para el Máster de Industria 4.0 de la empresa Siarq (2020)]]&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
user: docent.industria4.0@fundacioupc.com&lt;br /&gt;
password: Industria4@online2020&lt;br /&gt;
[[Uso de Grafana en el VPS del Máster de Industria 4.0 el curso 2023-2024]]&lt;br /&gt;
&lt;br /&gt;
Broker MQTT&lt;br /&gt;
Address:  vps656540.ovh.net&lt;br /&gt;
&lt;br /&gt;
MQTT native plain port 1883&lt;br /&gt;
MQTT Websockets plain port 8081&lt;br /&gt;
MQTT Websockets encrypted port 8082&lt;br /&gt;
&lt;br /&gt;
Allow anonymous: No&lt;br /&gt;
Credentials&lt;br /&gt;
username: user&lt;br /&gt;
password: pass&lt;br /&gt;
&lt;br /&gt;
Xavier Pi, [2/5/25 16:17]&lt;br /&gt;
https://vps656540.ovh.net:5678&lt;br /&gt;
&lt;br /&gt;
Xavier Pi, [2/5/25 16:19]&lt;br /&gt;
user:  masterenindustria4.0@gmail.com&lt;br /&gt;
pass:  Society5_0&lt;br /&gt;
&lt;br /&gt;
Xavier Pi, [2/5/25 17:03]&lt;br /&gt;
http://xavierpi.com/n8n_test&lt;br /&gt;
&lt;br /&gt;
Xavier Pi, [2/5/25 17:23]&lt;br /&gt;
pass:  TransformacioDigital4_0&lt;br /&gt;
Xavier Pi, [2/5/25 17:23]&lt;br /&gt;
masterenindustria4.0@gmail.com&lt;br /&gt;
&lt;br /&gt;
Xavier Pi, [2/5/25 17:23]&lt;br /&gt;
pass:  TransformacioDigital4_0&lt;br /&gt;
--&amp;gt;&lt;/div&gt;</summary>
		<author><name>Jordi Binefa</name></author>
		
	</entry>
	<entry>
		<id>https://www.binefa.com/index.php?title=16_/_5_/_2026_-_IoT,_Embedded_Systems,_Edge_y_Cloud&amp;diff=12322</id>
		<title>16 / 5 / 2026 - IoT, Embedded Systems, Edge y Cloud</title>
		<link rel="alternate" type="text/html" href="https://www.binefa.com/index.php?title=16_/_5_/_2026_-_IoT,_Embedded_Systems,_Edge_y_Cloud&amp;diff=12322"/>
		<updated>2026-05-16T12:13:15Z</updated>

		<summary type="html">&lt;p&gt;Jordi Binefa: /* Ejercicio NodeRED-DB-07 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Conceptos previos (15 / 5 / 2026) =&lt;br /&gt;
Acceso a la base de datos del VPS del máster&lt;br /&gt;
&lt;br /&gt;
= Temario (16 / 5 / 2026) =&lt;br /&gt;
[https://meet.google.com/rke-afvm-eou Videoconferencia]&lt;br /&gt;
&lt;br /&gt;
== Información actualizada de los vídeos de la clase invertida ==&lt;br /&gt;
[https://binefa.com/upc-school/cambiosSegundoDia2026.pdf Cambios respecto los vídeos de la clase invertida]&lt;br /&gt;
* En todos los sitios donde aparece '''vps656540.ovh.net''' ahora es '''master.iotvertebrae.com'''&lt;br /&gt;
* Por seguridad, la contraseña para acceder al VPS por terminal está dentro de la descripción del vídeo en el Campus (en vez de **** está la contraseña):&lt;br /&gt;
&lt;br /&gt;
''Vídeo NodeRED con MySQL parte 1/3   (clase invertida) (VPS: convidat / ****)''&lt;br /&gt;
&lt;br /&gt;
- Acceso desde el terminal en Windows (cmd):&lt;br /&gt;
 ssh convidat@master.iotvertebrae.com&lt;br /&gt;
- Acceso desde el terminal en Linux:&lt;br /&gt;
 ssh -o ServerAliveInterval=30 convidat@master.iotvertebrae.com&lt;br /&gt;
&lt;br /&gt;
Una vez dentro del terminal del VPS se puede acceder a la base de datos con los usuarios (no hay cambios):&lt;br /&gt;
&lt;br /&gt;
- '''convidat''' (contraseña: '''''benvingut''''')&lt;br /&gt;
&lt;br /&gt;
- '''iot''' (contraseña: '''''iot''''')&lt;br /&gt;
&lt;br /&gt;
== Repaso del día anterior ==&lt;br /&gt;
* [https://www.binefa.cat/training/iot02/pdf/iot02_00_es.pdf Introducción a la placa IoT-02]&lt;br /&gt;
* [[El protocolo MQTT]]&lt;br /&gt;
* [[Gemelos digitales especializados]] (Placa IoT-02 e IoT-Vertebrae)&lt;br /&gt;
&lt;br /&gt;
== Conexión entre la placa IoT-02 y Snap! mediante MQTT ==&lt;br /&gt;
&amp;lt;!-- '''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;
&lt;br /&gt;
* Broker MQTT púplico:&lt;br /&gt;
** MQTT TCP por el puerto no seguro 1883: '''broker.emqx.io'''&lt;br /&gt;
** MQTT WSS por puerto seguro: '''wss://broker.emqx.io:8084/mqtt'''&lt;br /&gt;
* Broker MQTT en el VPS del máster:&lt;br /&gt;
** MQTT TCP por el puerto no seguro 1883: '''master.iotvertebrae.com'''&lt;br /&gt;
** MQTT WSS por puerto seguro: '''wss://master.iotvertebrae.com:9002'''&lt;br /&gt;
&amp;lt;!-- '''Nuevo firmware de la placa IoT-02 para el día de hoy''': [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]&lt;br /&gt;
[[Conexión entre la placa IoT-02 y Snap! v8 mediante MQTT]]&lt;br /&gt;
[[Conexión entre la placa IoT-02 y Snap! v9 mediante MQTT]] --&amp;gt;&lt;br /&gt;
[https://snap.berkeley.edu/snap/snap.html#present:Username=jordibinefa&amp;amp;ProjectName=IoT-02_board_segur_66C172FB482D_broker_master_iotvertebrae Control de la placa IoT-02. Broker del VPS del máster] El [https://github.com/jordibinefa/IoT-02/tree/master/codes/IoT-02_mqtt_sync_upcSchool_broker1 ''firmware'' IoT-02_mqtt_sync_upcSchool_broker1] enseña el número MAC por la pantalla OLED cuando la placa IoT-02 se conecta a vuestra wifi. (Cambiar el archivo [https://github.com/jordibinefa/IoT-02/blob/master/codes/IoT-02_mqtt_sync_upcSchool_broker1/IoT-02_wifiCredentials.h IoT-02_wifiCredentials.h] en la línea 21 substituyendo ''iotcat'' por el nombre de la SSID de vuestra wifi y ''1234567890a'' por vuestra contraseña).&lt;br /&gt;
&lt;br /&gt;
== Uso de la base de datos MariaDB para almacenar y leer datos IoT ==&lt;br /&gt;
[[Uso de MariaDB en el VPS del Máster de Industria 4.0 el curso 2025-2026 | Uso de MariaDB en el VPS del Máster de Industria 4.0]]&lt;br /&gt;
&amp;lt;!-- [[Uso de MariaDB en el VPS del Máster de Industria 4.0 el curso 2023-2024]]&lt;br /&gt;
[[Uso de MariaDB en el VPS del Máster de Industria 4.0 el curso 2022-2023 | Uso de MariaDB en el VPS del Máster de Industria 4.0 el curso 2023-2024]]--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Node-RED ==&lt;br /&gt;
[[Asignación de puertos para el curso 2025-2026 | Asignación de puertos para este curso]]&lt;br /&gt;
&amp;lt;!--[[Asignación de puertos para el curso 2023-2024]]&lt;br /&gt;
[[Asignación de puertos para el curso 2022-2023]]--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Uso del Node-RED ===&lt;br /&gt;
[[Uso del NodeRED (2024) | Uso del Node-RED]]&lt;br /&gt;
&amp;lt;!--[[Uso del NodeRED (2023) | Uso del Node-RED]]--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Uso de la base de datos MariaDB desde Node-RED===&lt;br /&gt;
[[Uso de la base de datos MariaDB desde NodeRED (2023) | Uso de la base de datos MariaDB desde Node-RED]]&lt;br /&gt;
&amp;lt;!-- == Telegram ==&lt;br /&gt;
[[Uso de Telegram desde NodeRED]]--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Repaso y dudas de la clase invertida ==&lt;br /&gt;
=== Verificación de nodos instalados ===&lt;br /&gt;
Antes de continuar verificamos que ya tenemos instalado el nodo de MySQL ('''node-red-node-mysql''') y los nodos del panel de control ('''node-red-dashboard''' -marcado como ''deprecated''-).&lt;br /&gt;
==== Nodo node-red-node-mysql ====&lt;br /&gt;
[https://flows.nodered.org/node/node-red-node-mysql Documentación oficial del nodo ''node-red-node-mysql'']&lt;br /&gt;
&lt;br /&gt;
[[Image:10MariaDbNodeRed00.png|center|thumb|Instalación de los nodos de MariaDB (''MySQL'') en NodeRED]]&lt;br /&gt;
[[Image:11nodoMariaDbNodeRed.png|center|thumb|Aspecto del nodo MySQL en NodeRED]]&lt;br /&gt;
&lt;br /&gt;
==== Nodos node-red-dashboard ====&lt;br /&gt;
[https://flows.nodered.org/node/node-red-dashboard Documentación oficial de los nodos ''node-red-dashboard''] (Ahora sale como ''deprecated'').&lt;br /&gt;
&lt;br /&gt;
[[Image:NodosDashboard.png|center|thumb|Nodos del panel de control (''Dashboard'') en NodeRED]]&lt;br /&gt;
&lt;br /&gt;
=== Acceso al VPS del máster ===&lt;br /&gt;
* La contraseña está dentro de la descripción del vídeo en el Campus (en vez de **** está la contraseña):&lt;br /&gt;
&lt;br /&gt;
''Vídeo NodeRED con MySQL parte 1/3   (clase invertida) (VPS: convidat / ****)''&lt;br /&gt;
* Acceso desde el terminal en Linux:&lt;br /&gt;
 ssh -o ServerAliveInterval=30 convidat@master.iotvertebrae.com&lt;br /&gt;
* Acceso desde el terminal en Windows (cmd):&lt;br /&gt;
 ssh convidat@master.iotvertebrae.com&lt;br /&gt;
&lt;br /&gt;
=== Acceso a la base de datos del VPS del máster ===&lt;br /&gt;
* Con permisos de lectura y escritura:&lt;br /&gt;
 mysql -u iot -p&lt;br /&gt;
* Con permisos de lectura:&lt;br /&gt;
 mysql -u convidat -p&lt;br /&gt;
&lt;br /&gt;
=== Repaso ===&lt;br /&gt;
* Uso de JSON con Snap!&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;
&lt;br /&gt;
* Aleatorización de múltiples datos controlada por el panel de control&lt;br /&gt;
&lt;br /&gt;
* Escritura síncrona de múltiples datos asíncronos al mismo tiempo. Uso del formato de datos json&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
* Telegram--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Ejercicios ==&lt;br /&gt;
=== Ejercicio de '''Snap! con MQTT''' ===&lt;br /&gt;
* Mediante Snap! hacer que en la pantalla aparezca, de forma infinita y con una cadencia de dos segundos, el porcentaje de luz leída por la LDR y después la temperatura en grados centígrados.&lt;br /&gt;
&lt;br /&gt;
=== Ejercicios de '''NodeRED''' ===&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;
==== 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;
==== Ejercicio '''NodeRED-03''' ====&lt;br /&gt;
* Implementad una pasarela (''gateway'') HTTP/MQTT para cambiar el estado de los leds y el relé biestable de la placa IoT-02.&lt;br /&gt;
&lt;br /&gt;
==== Ejercicio '''NodeRED-04''' ====&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;br /&gt;
&lt;br /&gt;
==== Ejercicio '''NodeRED-05''' ====&lt;br /&gt;
* Implementar un flujo de NodeRED que supervise continuamente el valor de la LDR. Introducir dos ''sliders'' para fijar umbrales. Cuando la luz supere el umbral establecido el led rojo se enciende y el relé biestable cambia a SET. Cuando la luz baje del segundo umbral establecido el led rojo se apaga (se enciende el verde) y el relé biestable cambia a RESET.&lt;br /&gt;
&lt;br /&gt;
==== Ejercicio '''NodeRED-06''' ====&lt;br /&gt;
* Implementar un flujo de NodeRED que permita la entrada de un texto y con un botón lo envie a la pantalla OLED.&lt;br /&gt;
&lt;br /&gt;
==== Ejercicio '''NodeRED-07''' ====&lt;br /&gt;
* Implementar un flujo de NodeRED que permita seleccionar un mode de funcionamiento automático o manual. En manual se puede encender y apagar el led blanco mediante un ''switch''. En modo automático el led blanco se enciende o se apaga en función de un umbral consignado mediante un ''slider''. (Para habilitar o inhabilitar un ''switch'' se puede usar ''msg.enabled'').&lt;br /&gt;
&lt;br /&gt;
==== Ejercicio '''NodeRED-DB-01''' ====&lt;br /&gt;
* Cread una tabla en la base de datos '''aula206''' con el prefijo de vuestro puerto (por ejemplo '''m28XX_LDR''') con las columnas '''time''' (TIMESTAMP) y '''valueLDR''' (FLOAT). Insertad manualmente tres valores distintos mediante nodos ''inject'' y verificad la inserción consultando la tabla desde el terminal del VPS.&lt;br /&gt;
&lt;br /&gt;
==== Ejercicio '''NodeRED-DB-02''' ====&lt;br /&gt;
* A partir del flujo de aleatorización visto en clase, implementad un flujo que genere un valor aleatorio de LDR (entre 0 y 100) cada 5 segundos cuando el conmutador '''Randomize''' del panel de control esté activado, y que escriba cada valor generado en la tabla '''m28XX_LDR''' de la base de datos.&lt;br /&gt;
&lt;br /&gt;
==== Ejercicio '''NodeRED-DB-03''' ====&lt;br /&gt;
* Implementad un flujo que lea todos los registros de la tabla '''m28XX_LDR''' y muestre en un ''widget'' de tipo texto del panel de control el '''último valor''' registrado y en otro ''widget'' de texto la '''media aritmética''' de todos los valores almacenados.&lt;br /&gt;
&lt;br /&gt;
==== Ejercicio '''NodeRED-DB-04''' ====&lt;br /&gt;
* Cread una tabla '''m28XX_T_RH_LDR''' con las columnas '''valueT''', '''valueRH''' y '''valueLDR'''. Implementad un flujo que reciba los datos de temperatura, humedad relativa y nivel de luz de la placa IoT-02 de forma asíncrona y, usando variables de flujo y escritura síncrona (tal como se ha visto en clase), los almacene conjuntamente en la base de datos cada vez que llega cualquiera de los tres valores.&lt;br /&gt;
&lt;br /&gt;
==== Ejercicio '''NodeRED-DB-05''' ====&lt;br /&gt;
* Cread la tabla vista '''m28XX_T_RH_LDR_v''' sobre la tabla '''m28XX_T_RH_LDR''' con el tiempo en formato UNIX. Implementad un flujo que lea los últimos 10 registros de esta tabla vista y represente la temperatura en una gráfica en función del tiempo en el panel de control.&lt;br /&gt;
&lt;br /&gt;
==== Ejercicio '''NodeRED-DB-06''' ====&lt;br /&gt;
* Implementad un flujo con un ''slider'' en el panel de control que permita fijar un umbral de temperatura. Cada vez que llega un dato de temperatura de la placa IoT-02, el flujo lo guarda en la base de datos (tabla '''m28XX_alertas''', con las columnas '''valueT''' y '''alerta''' de tipo TINYINT). En la columna '''alerta''' se guardará '''1''' si la temperatura supera el umbral y '''0''' si no lo supera. En el panel de control se mostrará un ''widget'' de texto que indique el estado actual ('''⚠ Temperatura alta''' o '''✓ Temperatura normal''').&lt;br /&gt;
&lt;br /&gt;
==== Ejercicio '''NodeRED-DB-07''' ====&lt;br /&gt;
* Implementad un cuadro de mando completo que incluya: (a) generación periódica de datos aleatorios de temperatura, humedad relativa y LDR activada por un conmutador; (b) almacenamiento de los datos en la base de datos en la tabla '''m28XX_dashboard'''; (c) visualización de los últimos valores en ''widgets'' de tipo indicador (''gauge''); (d) un botón en el panel de control que al pulsarse borre todos los registros de la tabla ('''DELETE FROM m28XX_dashboard''') y muestre un mensaje de confirmación en un ''widget'' de texto.&lt;br /&gt;
==== Soluciones Node-RED + BD ====&lt;br /&gt;
[https://binefa.com/upc-school/sol/ Soluciones]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--=== Ejercicios '''Telegram''' ===&lt;br /&gt;
* Desde el chat del bot: Al enviar la orden '''/ledWon''' se enciende el led blanco de la placa IoT-02. Al enviar la orden '''/ledWoff''' se apaga el led blanco.&lt;br /&gt;
&lt;br /&gt;
* Desde el chat del bot: Al enviar la orden '''/ledReleSet''' el relé se pone en estado SET. Al enviar la orden '''/ledReleReset''' el relé se pone en estado RESET.&lt;br /&gt;
&lt;br /&gt;
* El chat de vuestro bot recibe un mensaje cuando se aprieta vuestro botón I34 y cuando se deja de apretar.&lt;br /&gt;
&lt;br /&gt;
* Desde el chat del grupo donde pertenece vuestro bot: Al enviar la orden '''/entradas''' el bot contesta con los estados de los botones y la temperatura de la placa.--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Comentario de la práctica para el próximo día ===&lt;br /&gt;
El [https://binefa.com/upc-school/Enunciado_Practica_IoT_Hands-on_IoT_MVPs_2025-2026.pdf enunciado] estará en breve en el campus. Se comenzará después de haber usado Grafana y Telegram.&lt;/div&gt;</summary>
		<author><name>Jordi Binefa</name></author>
		
	</entry>
	<entry>
		<id>https://www.binefa.com/index.php?title=Uso_de_MariaDB_en_el_VPS_del_M%C3%A1ster_de_Industria_4.0_el_curso_2022-2023&amp;diff=12321</id>
		<title>Uso de MariaDB en el VPS del Máster de Industria 4.0 el curso 2022-2023</title>
		<link rel="alternate" type="text/html" href="https://www.binefa.com/index.php?title=Uso_de_MariaDB_en_el_VPS_del_M%C3%A1ster_de_Industria_4.0_el_curso_2022-2023&amp;diff=12321"/>
		<updated>2026-05-16T09:42:58Z</updated>

		<summary type="html">&lt;p&gt;Jordi Binefa: /* Acceso al terminal del VPS */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Acceso al terminal del VPS =&lt;br /&gt;
* Para acceder al terminal remoto del VPS desde Windows, abrir el teminal (''cmd'') o el ''powershell'' y escribir:&lt;br /&gt;
 ssh '''convidat'''@master.iotvertebrae.com&lt;br /&gt;
La contraseña es ''benvingut''&lt;br /&gt;
&lt;br /&gt;
* Para acceder al terminal remoto del VPS desde Linux, abrir el teminal escribir:&lt;br /&gt;
 ssh '''convidat'''@master.iotvertebrae.com&lt;br /&gt;
y en caso de querer enviar cada 30 segundos un ''blank token'' para evitar la desconexión por ''time out'':&lt;br /&gt;
 ssh -o ServerAliveInterval=30 '''convidat'''@master.iotvertebrae.com&lt;br /&gt;
&lt;br /&gt;
= Información sobre la instalación de la base de datos MariaDB =&lt;br /&gt;
'''Este apartado es puramente informativo'''. En el VPS ya está instalada la base de datos.&lt;br /&gt;
&lt;br /&gt;
[https://www.digitalocean.com/community/tutorials/how-to-install-mariadb-on-debian-11 Un tutorial de instalación de MariaDB en Debian 11]&lt;br /&gt;
&lt;br /&gt;
Pasos de la instalación desde el terminal:&lt;br /&gt;
 sudo apt update&lt;br /&gt;
 sudo apt install mariadb-server&lt;br /&gt;
 sudo mysql_secure_installation ''(en este paso el sistema pregunta una contraseña para el usuario '''root''')''&lt;br /&gt;
&lt;br /&gt;
[https://www.digitalocean.com/community/tutorials/how-to-create-a-new-user-and-grant-permissions-in-mysql Un tutorial de creación de usuarios con diferentes permisos (''privilegios'')]&lt;br /&gt;
&lt;br /&gt;
Desde el terminal del sistema operativo se pide entrar al terminal de MariaDB. La primera vez como usuario ''root'':&lt;br /&gt;
 mysql -u root -p&lt;br /&gt;
 ''(el sistema pide la contraseña del usuario root)''&lt;br /&gt;
Una vez dentro del terminal de MariaDB se crean los usuarios ''iot'' y ''convidat'' con sus respectivas contraseñas. Se crea la base de datos ''aula206'', se otorgan todos los permisos al usuario ''iot'' y tan solo la lectura al usuario ''convidat'':&lt;br /&gt;
 CREATE USER 'iot'@'localhost' IDENTIFIED BY 'iot';&lt;br /&gt;
 CREATE USER 'convidat'@'localhost' IDENTIFIED BY 'benvingut';&lt;br /&gt;
 &lt;br /&gt;
 CREATE DATABASE aula206;&lt;br /&gt;
 SHOW DATABASES;&lt;br /&gt;
 USE aula206;&lt;br /&gt;
 &lt;br /&gt;
 GRANT ALL PRIVILEGES ON aula206.* TO 'iot'@'localhost';&lt;br /&gt;
 GRANT SELECT ON aula206.* TO 'convidat'@'localhost';&lt;br /&gt;
 FLUSH PRIVILEGES;&lt;br /&gt;
&lt;br /&gt;
= Acceso a la base de datos desde el terminal del VPS =&lt;br /&gt;
Para acceder a la base de datos hay tres usuarios con permisos diferentes:&lt;br /&gt;
&lt;br /&gt;
- '''root''': Tiene todos los permisos. Puede crear usuarios y bases de datos.&lt;br /&gt;
&lt;br /&gt;
- '''iot''': Tiene permisos de '''lectura y escritura''' sobre la base de datos '''aula206'''.&lt;br /&gt;
&lt;br /&gt;
- '''convidat''': Tiene permisos de '''lectura''' sobre la base de datos '''aula206'''.&lt;br /&gt;
&lt;br /&gt;
Para acceder al terminal de MariaDB como usuario '''iot''':&lt;br /&gt;
 mysql -u '''iot''' -p&lt;br /&gt;
 (el sistema pregunta por la contraseña de este usuario. Es la que sale en el apartado anterior después de ''IDENTIFIED BY'')&lt;br /&gt;
&lt;br /&gt;
Para acceder al terminal de MariaDB como usuario '''convidat''':&lt;br /&gt;
 mysql -u '''convidat''' -p&lt;br /&gt;
 (el sistema pregunta por la contraseña de este usuario. Es la que sale en el apartado anterior después de ''IDENTIFIED BY'')&lt;br /&gt;
&lt;br /&gt;
= Creación de tablas =&lt;br /&gt;
Para crear tablas en la base de datos hace falta que el usuario tenga permisos de escritura a la base de datos ('''iot''' tiene permisos de escritura en la base de datos '''aula206'''. '''convidat''' no tiene permisos de escritura en la base de datos '''aula206''').&lt;br /&gt;
&lt;br /&gt;
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 [[Asignación de puertos para el curso 2022-2023 | número de puerto que se os ha asignado]].&lt;br /&gt;
&lt;br /&gt;
 mysql -u '''iot''' -p&lt;br /&gt;
 (el sistema pregunta por la contraseña de este usuario. Es la que sale en el apartado anterior después de ''IDENTIFIED BY'')&lt;br /&gt;
 USE aula206;&lt;br /&gt;
 '''CREATE''' TABLE m'''28XX'''_Temperatura (&lt;br /&gt;
  time TIMESTAMP DEFAULT CURRENT_TIMESTAMP,&lt;br /&gt;
  value FLOAT,&lt;br /&gt;
  PRIMARY KEY (time));&lt;br /&gt;
'''value''' es el nombre del valor que vamos a introducir en la tabla. Se declara como ''FLOAT'' (número real. Permite decimales).&lt;br /&gt;
&lt;br /&gt;
= Borrado de tablas =&lt;br /&gt;
'''Id con cuidado en el momento de borrar una tabla. El proceso borra todos los datos y la misma tabla. No es posible recuperar los datos de las tablas si no se ha hecho una copia de seguridad'''.&lt;br /&gt;
&lt;br /&gt;
Para borrar tablas en la base de datos hace falta que el usuario tenga permisos de escritura a la base de datos ('''iot''' tiene permisos de escritura en la base de datos '''aula206'''. '''convidat''' no tiene permisos de escritura en la base de datos '''aula206'''). &lt;br /&gt;
 mysql -u '''iot''' -p&lt;br /&gt;
 (el sistema pregunta por la contraseña de este usuario. Es la que sale en el apartado anterior después de ''IDENTIFIED BY'')&lt;br /&gt;
 USE aula206;&lt;br /&gt;
 '''DROP TABLE''' m28XX_Temperatura;&lt;br /&gt;
&lt;br /&gt;
= Inserción de datos =&lt;br /&gt;
La inserción (también conocida por escritura) de datos tiene que hacerla un usuario con permisos suficientes (el usuario '''iot''' puede escribir).&lt;br /&gt;
&lt;br /&gt;
Ejemplo de inserción del valor 23.4 como valor en el campo '''value'''.&lt;br /&gt;
 '''insert''' into m28XX_Temperatura (value) values (23.4);&lt;br /&gt;
&lt;br /&gt;
= Lectura de datos =&lt;br /&gt;
La lectura de datos tiene que hacerla un usuario con permisos suficientes (los usuarios '''iot''' y '''convidat''' pueden leer).&lt;br /&gt;
&lt;br /&gt;
[https://mariadb.com/kb/es/select/ Documentación oficial de la orden SELECT].&lt;br /&gt;
&lt;br /&gt;
Visualización de todos los datos de la tabla m28XX_Temperatura:&lt;br /&gt;
 '''select''' * from m28XX_Temperatura;&lt;br /&gt;
&lt;br /&gt;
Ejemplo de respuesta del terminal de MariaDB:&lt;br /&gt;
 MariaDB [aula206]&amp;gt; '''select * from m28XX_Temperatura;'''&lt;br /&gt;
 +---------------------+-------+&lt;br /&gt;
 | time                | value |&lt;br /&gt;
 +---------------------+-------+&lt;br /&gt;
 | 2023-04-05 17:23:59 |  23.4 |&lt;br /&gt;
 | 2023-04-05 17:28:29 |  23.7 |&lt;br /&gt;
 +---------------------+-------+&lt;br /&gt;
 2 rows in set (0.001 sec)&lt;br /&gt;
&lt;br /&gt;
[https://mariadb.com/kb/en/getting-data-from-mariadb/ Getting Data from MariaDB]&lt;br /&gt;
&lt;br /&gt;
= Creación de tablas vista =&lt;br /&gt;
Para poder usar la base de datos en sistemas externos de graficación nos hará falta que el registro del momento de inserción del dato esté expresado en [https://www.unixtimestamp.com/ formato de la época UNIX]. Ejemplo de visualización de una tabla vista con el valor del tiempo en formato Unix: &lt;br /&gt;
 MariaDB [aula206]&amp;gt; select * from m28XX_Temperatura_v;&lt;br /&gt;
 +------------+-------+&lt;br /&gt;
 | time       | value |&lt;br /&gt;
 +------------+-------+&lt;br /&gt;
 | 1680708239 |  23.4 |&lt;br /&gt;
 | 1680708509 |  23.7 |&lt;br /&gt;
 +------------+-------+&lt;br /&gt;
 2 rows in set (0.000 sec)&lt;br /&gt;
&lt;br /&gt;
Creación de la tabla vista '''m28XX_Temperatura_v''' con la unidad de tiempo cambiada (tomando como origen la tabla '''m28XX_Temperatura'''):&lt;br /&gt;
 '''CREATE VIEW''' m28XX_Temperatura_v AS select UNIX_TIMESTAMP(time) as time, value from m28XX_Temperatura;&lt;br /&gt;
&lt;br /&gt;
= Inserción y lectura de datos múltiples =&lt;br /&gt;
Habitualmente nos hará falta introducir un grupo de datos al mismo tiempo. Por ejemplo, esta tabla contiene tres valores en el mismo momento del registro: &lt;br /&gt;
 MariaDB [aula206]&amp;gt; select * from m28XX_T_RH_P_v;&lt;br /&gt;
 +------------+--------+---------+---------+&lt;br /&gt;
 | time       | valueT | valueRH | valueP  |&lt;br /&gt;
 +------------+--------+---------+---------+&lt;br /&gt;
 | 1680884504 |   23.4 |   45.64 | 1002.34 |&lt;br /&gt;
 | 1680884734 |   23.7 |   45.21 | 1003.04 |&lt;br /&gt;
 | 1680885724 |  17.89 |   44.32 | 1001.23 |&lt;br /&gt;
 | 1680885726 |  19.03 |   40.65 | 1002.11 |&lt;br /&gt;
 | 1680885728 |  15.43 |   56.78 | 1000.87 |&lt;br /&gt;
 | 1680886069 |  19.03 |   40.65 | 1002.11 |&lt;br /&gt;
 +------------+--------+---------+---------+&lt;br /&gt;
 6 rows in set (0.000 sec)&lt;br /&gt;
&lt;br /&gt;
* '''Creación''' de la tabla con datos múltiples ('''valueT''', '''valueRH''' y '''valueP'''):&lt;br /&gt;
 '''CREATE TABLE''' `m28XX_T_RH_P` (&lt;br /&gt;
  `time` TIMESTAMP DEFAULT CURRENT_TIMESTAMP,&lt;br /&gt;
  `'''valueT'''` FLOAT,&lt;br /&gt;
  `'''valueRH'''` FLOAT,&lt;br /&gt;
  `'''valueP'''` FLOAT,&lt;br /&gt;
  PRIMARY KEY (`time`))&lt;br /&gt;
 ENGINE = InnoDB;&lt;br /&gt;
&lt;br /&gt;
* '''Inserción''' de datos múltiples:&lt;br /&gt;
 '''insert into''' m28XX_T_RH_P ('''valueT''','''valueRH''','''valueP''') values (23.4,45.64,1002.34);&lt;br /&gt;
* '''Lectura''' de datos múltiples:&lt;br /&gt;
 '''select''' * '''from''' m28XX_T_RH_P;&lt;br /&gt;
* '''Creación''' de la '''tabla vista''':&lt;br /&gt;
 '''CREATE VIEW''' m28XX_T_RH_P_v '''AS''' select UNIX_TIMESTAMP(time) as time, valueT, valueRH, valueP from m28XX_T_RH_P;&lt;/div&gt;</summary>
		<author><name>Jordi Binefa</name></author>
		
	</entry>
	<entry>
		<id>https://www.binefa.com/index.php?title=Uso_de_MariaDB_en_el_VPS_del_M%C3%A1ster_de_Industria_4.0_el_curso_2022-2023&amp;diff=12320</id>
		<title>Uso de MariaDB en el VPS del Máster de Industria 4.0 el curso 2022-2023</title>
		<link rel="alternate" type="text/html" href="https://www.binefa.com/index.php?title=Uso_de_MariaDB_en_el_VPS_del_M%C3%A1ster_de_Industria_4.0_el_curso_2022-2023&amp;diff=12320"/>
		<updated>2026-05-16T09:42:46Z</updated>

		<summary type="html">&lt;p&gt;Jordi Binefa: /* Acceso al terminal del VPS */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Acceso al terminal del VPS =&lt;br /&gt;
* Para acceder al terminal remoto del VPS desde Windows, abrir el teminal (''cmd'') o el ''powershell'' y escribir:&lt;br /&gt;
 ssh '''convidat'''@master.iotvertebrae.com&lt;br /&gt;
La contraseña es ''benvingut''&lt;br /&gt;
&lt;br /&gt;
* Para acceder al terminal remoto del VPS desde Linux, abrir el teminal escribir:&lt;br /&gt;
 ssh '''convidat'''@master.iotvertebrae.com&lt;br /&gt;
y en caso de querer enviar cada 30 segundos un ''blank token'' para evitar la desconexión por ''time out'':&lt;br /&gt;
 ssh -o ServerAliveInterval=30 '''convidat'''@vps656540.ovh.net&lt;br /&gt;
&lt;br /&gt;
= Información sobre la instalación de la base de datos MariaDB =&lt;br /&gt;
'''Este apartado es puramente informativo'''. En el VPS ya está instalada la base de datos.&lt;br /&gt;
&lt;br /&gt;
[https://www.digitalocean.com/community/tutorials/how-to-install-mariadb-on-debian-11 Un tutorial de instalación de MariaDB en Debian 11]&lt;br /&gt;
&lt;br /&gt;
Pasos de la instalación desde el terminal:&lt;br /&gt;
 sudo apt update&lt;br /&gt;
 sudo apt install mariadb-server&lt;br /&gt;
 sudo mysql_secure_installation ''(en este paso el sistema pregunta una contraseña para el usuario '''root''')''&lt;br /&gt;
&lt;br /&gt;
[https://www.digitalocean.com/community/tutorials/how-to-create-a-new-user-and-grant-permissions-in-mysql Un tutorial de creación de usuarios con diferentes permisos (''privilegios'')]&lt;br /&gt;
&lt;br /&gt;
Desde el terminal del sistema operativo se pide entrar al terminal de MariaDB. La primera vez como usuario ''root'':&lt;br /&gt;
 mysql -u root -p&lt;br /&gt;
 ''(el sistema pide la contraseña del usuario root)''&lt;br /&gt;
Una vez dentro del terminal de MariaDB se crean los usuarios ''iot'' y ''convidat'' con sus respectivas contraseñas. Se crea la base de datos ''aula206'', se otorgan todos los permisos al usuario ''iot'' y tan solo la lectura al usuario ''convidat'':&lt;br /&gt;
 CREATE USER 'iot'@'localhost' IDENTIFIED BY 'iot';&lt;br /&gt;
 CREATE USER 'convidat'@'localhost' IDENTIFIED BY 'benvingut';&lt;br /&gt;
 &lt;br /&gt;
 CREATE DATABASE aula206;&lt;br /&gt;
 SHOW DATABASES;&lt;br /&gt;
 USE aula206;&lt;br /&gt;
 &lt;br /&gt;
 GRANT ALL PRIVILEGES ON aula206.* TO 'iot'@'localhost';&lt;br /&gt;
 GRANT SELECT ON aula206.* TO 'convidat'@'localhost';&lt;br /&gt;
 FLUSH PRIVILEGES;&lt;br /&gt;
&lt;br /&gt;
= Acceso a la base de datos desde el terminal del VPS =&lt;br /&gt;
Para acceder a la base de datos hay tres usuarios con permisos diferentes:&lt;br /&gt;
&lt;br /&gt;
- '''root''': Tiene todos los permisos. Puede crear usuarios y bases de datos.&lt;br /&gt;
&lt;br /&gt;
- '''iot''': Tiene permisos de '''lectura y escritura''' sobre la base de datos '''aula206'''.&lt;br /&gt;
&lt;br /&gt;
- '''convidat''': Tiene permisos de '''lectura''' sobre la base de datos '''aula206'''.&lt;br /&gt;
&lt;br /&gt;
Para acceder al terminal de MariaDB como usuario '''iot''':&lt;br /&gt;
 mysql -u '''iot''' -p&lt;br /&gt;
 (el sistema pregunta por la contraseña de este usuario. Es la que sale en el apartado anterior después de ''IDENTIFIED BY'')&lt;br /&gt;
&lt;br /&gt;
Para acceder al terminal de MariaDB como usuario '''convidat''':&lt;br /&gt;
 mysql -u '''convidat''' -p&lt;br /&gt;
 (el sistema pregunta por la contraseña de este usuario. Es la que sale en el apartado anterior después de ''IDENTIFIED BY'')&lt;br /&gt;
&lt;br /&gt;
= Creación de tablas =&lt;br /&gt;
Para crear tablas en la base de datos hace falta que el usuario tenga permisos de escritura a la base de datos ('''iot''' tiene permisos de escritura en la base de datos '''aula206'''. '''convidat''' no tiene permisos de escritura en la base de datos '''aula206''').&lt;br /&gt;
&lt;br /&gt;
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 [[Asignación de puertos para el curso 2022-2023 | número de puerto que se os ha asignado]].&lt;br /&gt;
&lt;br /&gt;
 mysql -u '''iot''' -p&lt;br /&gt;
 (el sistema pregunta por la contraseña de este usuario. Es la que sale en el apartado anterior después de ''IDENTIFIED BY'')&lt;br /&gt;
 USE aula206;&lt;br /&gt;
 '''CREATE''' TABLE m'''28XX'''_Temperatura (&lt;br /&gt;
  time TIMESTAMP DEFAULT CURRENT_TIMESTAMP,&lt;br /&gt;
  value FLOAT,&lt;br /&gt;
  PRIMARY KEY (time));&lt;br /&gt;
'''value''' es el nombre del valor que vamos a introducir en la tabla. Se declara como ''FLOAT'' (número real. Permite decimales).&lt;br /&gt;
&lt;br /&gt;
= Borrado de tablas =&lt;br /&gt;
'''Id con cuidado en el momento de borrar una tabla. El proceso borra todos los datos y la misma tabla. No es posible recuperar los datos de las tablas si no se ha hecho una copia de seguridad'''.&lt;br /&gt;
&lt;br /&gt;
Para borrar tablas en la base de datos hace falta que el usuario tenga permisos de escritura a la base de datos ('''iot''' tiene permisos de escritura en la base de datos '''aula206'''. '''convidat''' no tiene permisos de escritura en la base de datos '''aula206'''). &lt;br /&gt;
 mysql -u '''iot''' -p&lt;br /&gt;
 (el sistema pregunta por la contraseña de este usuario. Es la que sale en el apartado anterior después de ''IDENTIFIED BY'')&lt;br /&gt;
 USE aula206;&lt;br /&gt;
 '''DROP TABLE''' m28XX_Temperatura;&lt;br /&gt;
&lt;br /&gt;
= Inserción de datos =&lt;br /&gt;
La inserción (también conocida por escritura) de datos tiene que hacerla un usuario con permisos suficientes (el usuario '''iot''' puede escribir).&lt;br /&gt;
&lt;br /&gt;
Ejemplo de inserción del valor 23.4 como valor en el campo '''value'''.&lt;br /&gt;
 '''insert''' into m28XX_Temperatura (value) values (23.4);&lt;br /&gt;
&lt;br /&gt;
= Lectura de datos =&lt;br /&gt;
La lectura de datos tiene que hacerla un usuario con permisos suficientes (los usuarios '''iot''' y '''convidat''' pueden leer).&lt;br /&gt;
&lt;br /&gt;
[https://mariadb.com/kb/es/select/ Documentación oficial de la orden SELECT].&lt;br /&gt;
&lt;br /&gt;
Visualización de todos los datos de la tabla m28XX_Temperatura:&lt;br /&gt;
 '''select''' * from m28XX_Temperatura;&lt;br /&gt;
&lt;br /&gt;
Ejemplo de respuesta del terminal de MariaDB:&lt;br /&gt;
 MariaDB [aula206]&amp;gt; '''select * from m28XX_Temperatura;'''&lt;br /&gt;
 +---------------------+-------+&lt;br /&gt;
 | time                | value |&lt;br /&gt;
 +---------------------+-------+&lt;br /&gt;
 | 2023-04-05 17:23:59 |  23.4 |&lt;br /&gt;
 | 2023-04-05 17:28:29 |  23.7 |&lt;br /&gt;
 +---------------------+-------+&lt;br /&gt;
 2 rows in set (0.001 sec)&lt;br /&gt;
&lt;br /&gt;
[https://mariadb.com/kb/en/getting-data-from-mariadb/ Getting Data from MariaDB]&lt;br /&gt;
&lt;br /&gt;
= Creación de tablas vista =&lt;br /&gt;
Para poder usar la base de datos en sistemas externos de graficación nos hará falta que el registro del momento de inserción del dato esté expresado en [https://www.unixtimestamp.com/ formato de la época UNIX]. Ejemplo de visualización de una tabla vista con el valor del tiempo en formato Unix: &lt;br /&gt;
 MariaDB [aula206]&amp;gt; select * from m28XX_Temperatura_v;&lt;br /&gt;
 +------------+-------+&lt;br /&gt;
 | time       | value |&lt;br /&gt;
 +------------+-------+&lt;br /&gt;
 | 1680708239 |  23.4 |&lt;br /&gt;
 | 1680708509 |  23.7 |&lt;br /&gt;
 +------------+-------+&lt;br /&gt;
 2 rows in set (0.000 sec)&lt;br /&gt;
&lt;br /&gt;
Creación de la tabla vista '''m28XX_Temperatura_v''' con la unidad de tiempo cambiada (tomando como origen la tabla '''m28XX_Temperatura'''):&lt;br /&gt;
 '''CREATE VIEW''' m28XX_Temperatura_v AS select UNIX_TIMESTAMP(time) as time, value from m28XX_Temperatura;&lt;br /&gt;
&lt;br /&gt;
= Inserción y lectura de datos múltiples =&lt;br /&gt;
Habitualmente nos hará falta introducir un grupo de datos al mismo tiempo. Por ejemplo, esta tabla contiene tres valores en el mismo momento del registro: &lt;br /&gt;
 MariaDB [aula206]&amp;gt; select * from m28XX_T_RH_P_v;&lt;br /&gt;
 +------------+--------+---------+---------+&lt;br /&gt;
 | time       | valueT | valueRH | valueP  |&lt;br /&gt;
 +------------+--------+---------+---------+&lt;br /&gt;
 | 1680884504 |   23.4 |   45.64 | 1002.34 |&lt;br /&gt;
 | 1680884734 |   23.7 |   45.21 | 1003.04 |&lt;br /&gt;
 | 1680885724 |  17.89 |   44.32 | 1001.23 |&lt;br /&gt;
 | 1680885726 |  19.03 |   40.65 | 1002.11 |&lt;br /&gt;
 | 1680885728 |  15.43 |   56.78 | 1000.87 |&lt;br /&gt;
 | 1680886069 |  19.03 |   40.65 | 1002.11 |&lt;br /&gt;
 +------------+--------+---------+---------+&lt;br /&gt;
 6 rows in set (0.000 sec)&lt;br /&gt;
&lt;br /&gt;
* '''Creación''' de la tabla con datos múltiples ('''valueT''', '''valueRH''' y '''valueP'''):&lt;br /&gt;
 '''CREATE TABLE''' `m28XX_T_RH_P` (&lt;br /&gt;
  `time` TIMESTAMP DEFAULT CURRENT_TIMESTAMP,&lt;br /&gt;
  `'''valueT'''` FLOAT,&lt;br /&gt;
  `'''valueRH'''` FLOAT,&lt;br /&gt;
  `'''valueP'''` FLOAT,&lt;br /&gt;
  PRIMARY KEY (`time`))&lt;br /&gt;
 ENGINE = InnoDB;&lt;br /&gt;
&lt;br /&gt;
* '''Inserción''' de datos múltiples:&lt;br /&gt;
 '''insert into''' m28XX_T_RH_P ('''valueT''','''valueRH''','''valueP''') values (23.4,45.64,1002.34);&lt;br /&gt;
* '''Lectura''' de datos múltiples:&lt;br /&gt;
 '''select''' * '''from''' m28XX_T_RH_P;&lt;br /&gt;
* '''Creación''' de la '''tabla vista''':&lt;br /&gt;
 '''CREATE VIEW''' m28XX_T_RH_P_v '''AS''' select UNIX_TIMESTAMP(time) as time, valueT, valueRH, valueP from m28XX_T_RH_P;&lt;/div&gt;</summary>
		<author><name>Jordi Binefa</name></author>
		
	</entry>
	<entry>
		<id>https://www.binefa.com/index.php?title=16_/_5_/_2026_-_IoT,_Embedded_Systems,_Edge_y_Cloud&amp;diff=12319</id>
		<title>16 / 5 / 2026 - IoT, Embedded Systems, Edge y Cloud</title>
		<link rel="alternate" type="text/html" href="https://www.binefa.com/index.php?title=16_/_5_/_2026_-_IoT,_Embedded_Systems,_Edge_y_Cloud&amp;diff=12319"/>
		<updated>2026-05-16T08:13:24Z</updated>

		<summary type="html">&lt;p&gt;Jordi Binefa: /* Comentario de la práctica para el próximo día */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Conceptos previos (15 / 5 / 2026) =&lt;br /&gt;
Acceso a la base de datos del VPS del máster&lt;br /&gt;
&lt;br /&gt;
= Temario (16 / 5 / 2026) =&lt;br /&gt;
[https://meet.google.com/rke-afvm-eou Videoconferencia]&lt;br /&gt;
&lt;br /&gt;
== Información actualizada de los vídeos de la clase invertida ==&lt;br /&gt;
[https://binefa.com/upc-school/cambiosSegundoDia2026.pdf Cambios respecto los vídeos de la clase invertida]&lt;br /&gt;
* En todos los sitios donde aparece '''vps656540.ovh.net''' ahora es '''master.iotvertebrae.com'''&lt;br /&gt;
* Por seguridad, la contraseña para acceder al VPS por terminal está dentro de la descripción del vídeo en el Campus (en vez de **** está la contraseña):&lt;br /&gt;
&lt;br /&gt;
''Vídeo NodeRED con MySQL parte 1/3   (clase invertida) (VPS: convidat / ****)''&lt;br /&gt;
&lt;br /&gt;
- Acceso desde el terminal en Windows (cmd):&lt;br /&gt;
 ssh convidat@master.iotvertebrae.com&lt;br /&gt;
- Acceso desde el terminal en Linux:&lt;br /&gt;
 ssh -o ServerAliveInterval=30 convidat@master.iotvertebrae.com&lt;br /&gt;
&lt;br /&gt;
Una vez dentro del terminal del VPS se puede acceder a la base de datos con los usuarios (no hay cambios):&lt;br /&gt;
&lt;br /&gt;
- '''convidat''' (contraseña: '''''benvingut''''')&lt;br /&gt;
&lt;br /&gt;
- '''iot''' (contraseña: '''''iot''''')&lt;br /&gt;
&lt;br /&gt;
== Repaso del día anterior ==&lt;br /&gt;
* [https://www.binefa.cat/training/iot02/pdf/iot02_00_es.pdf Introducción a la placa IoT-02]&lt;br /&gt;
* [[El protocolo MQTT]]&lt;br /&gt;
* [[Gemelos digitales especializados]] (Placa IoT-02 e IoT-Vertebrae)&lt;br /&gt;
&lt;br /&gt;
== Conexión entre la placa IoT-02 y Snap! mediante MQTT ==&lt;br /&gt;
&amp;lt;!-- '''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;
&lt;br /&gt;
* Broker MQTT púplico:&lt;br /&gt;
** MQTT TCP por el puerto no seguro 1883: '''broker.emqx.io'''&lt;br /&gt;
** MQTT WSS por puerto seguro: '''wss://broker.emqx.io:8084/mqtt'''&lt;br /&gt;
* Broker MQTT en el VPS del máster:&lt;br /&gt;
** MQTT TCP por el puerto no seguro 1883: '''master.iotvertebrae.com'''&lt;br /&gt;
** MQTT WSS por puerto seguro: '''wss://master.iotvertebrae.com:9002'''&lt;br /&gt;
&amp;lt;!-- '''Nuevo firmware de la placa IoT-02 para el día de hoy''': [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]&lt;br /&gt;
[[Conexión entre la placa IoT-02 y Snap! v8 mediante MQTT]]&lt;br /&gt;
[[Conexión entre la placa IoT-02 y Snap! v9 mediante MQTT]] --&amp;gt;&lt;br /&gt;
[https://snap.berkeley.edu/snap/snap.html#present:Username=jordibinefa&amp;amp;ProjectName=IoT-02_board_segur_66C172FB482D_broker_master_iotvertebrae Control de la placa IoT-02. Broker del VPS del máster] El [https://github.com/jordibinefa/IoT-02/tree/master/codes/IoT-02_mqtt_sync_upcSchool_broker1 ''firmware'' IoT-02_mqtt_sync_upcSchool_broker1] enseña el número MAC por la pantalla OLED cuando la placa IoT-02 se conecta a vuestra wifi. (Cambiar el archivo [https://github.com/jordibinefa/IoT-02/blob/master/codes/IoT-02_mqtt_sync_upcSchool_broker1/IoT-02_wifiCredentials.h IoT-02_wifiCredentials.h] en la línea 21 substituyendo ''iotcat'' por el nombre de la SSID de vuestra wifi y ''1234567890a'' por vuestra contraseña).&lt;br /&gt;
&lt;br /&gt;
== Uso de la base de datos MariaDB para almacenar y leer datos IoT ==&lt;br /&gt;
[[Uso de MariaDB en el VPS del Máster de Industria 4.0 el curso 2025-2026 | Uso de MariaDB en el VPS del Máster de Industria 4.0]]&lt;br /&gt;
&amp;lt;!-- [[Uso de MariaDB en el VPS del Máster de Industria 4.0 el curso 2023-2024]]&lt;br /&gt;
[[Uso de MariaDB en el VPS del Máster de Industria 4.0 el curso 2022-2023 | Uso de MariaDB en el VPS del Máster de Industria 4.0 el curso 2023-2024]]--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Node-RED ==&lt;br /&gt;
[[Asignación de puertos para el curso 2025-2026 | Asignación de puertos para este curso]]&lt;br /&gt;
&amp;lt;!--[[Asignación de puertos para el curso 2023-2024]]&lt;br /&gt;
[[Asignación de puertos para el curso 2022-2023]]--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Uso del Node-RED ===&lt;br /&gt;
[[Uso del NodeRED (2024) | Uso del Node-RED]]&lt;br /&gt;
&amp;lt;!--[[Uso del NodeRED (2023) | Uso del Node-RED]]--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Uso de la base de datos MariaDB desde Node-RED===&lt;br /&gt;
[[Uso de la base de datos MariaDB desde NodeRED (2023) | Uso de la base de datos MariaDB desde Node-RED]]&lt;br /&gt;
&amp;lt;!-- == Telegram ==&lt;br /&gt;
[[Uso de Telegram desde NodeRED]]--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Repaso y dudas de la clase invertida ==&lt;br /&gt;
=== Verificación de nodos instalados ===&lt;br /&gt;
Antes de continuar verificamos que ya tenemos instalado el nodo de MySQL ('''node-red-node-mysql''') y los nodos del panel de control ('''node-red-dashboard''' -marcado como ''deprecated''-).&lt;br /&gt;
==== Nodo node-red-node-mysql ====&lt;br /&gt;
[https://flows.nodered.org/node/node-red-node-mysql Documentación oficial del nodo ''node-red-node-mysql'']&lt;br /&gt;
&lt;br /&gt;
[[Image:10MariaDbNodeRed00.png|center|thumb|Instalación de los nodos de MariaDB (''MySQL'') en NodeRED]]&lt;br /&gt;
[[Image:11nodoMariaDbNodeRed.png|center|thumb|Aspecto del nodo MySQL en NodeRED]]&lt;br /&gt;
&lt;br /&gt;
==== Nodos node-red-dashboard ====&lt;br /&gt;
[https://flows.nodered.org/node/node-red-dashboard Documentación oficial de los nodos ''node-red-dashboard''] (Ahora sale como ''deprecated'').&lt;br /&gt;
&lt;br /&gt;
[[Image:NodosDashboard.png|center|thumb|Nodos del panel de control (''Dashboard'') en NodeRED]]&lt;br /&gt;
&lt;br /&gt;
=== Acceso al VPS del máster ===&lt;br /&gt;
* La contraseña está dentro de la descripción del vídeo en el Campus (en vez de **** está la contraseña):&lt;br /&gt;
&lt;br /&gt;
''Vídeo NodeRED con MySQL parte 1/3   (clase invertida) (VPS: convidat / ****)''&lt;br /&gt;
* Acceso desde el terminal en Linux:&lt;br /&gt;
 ssh -o ServerAliveInterval=30 convidat@master.iotvertebrae.com&lt;br /&gt;
* Acceso desde el terminal en Windows (cmd):&lt;br /&gt;
 ssh convidat@master.iotvertebrae.com&lt;br /&gt;
&lt;br /&gt;
=== Acceso a la base de datos del VPS del máster ===&lt;br /&gt;
* Con permisos de lectura y escritura:&lt;br /&gt;
 mysql -u iot -p&lt;br /&gt;
* Con permisos de lectura:&lt;br /&gt;
 mysql -u convidat -p&lt;br /&gt;
&lt;br /&gt;
=== Repaso ===&lt;br /&gt;
* Uso de JSON con Snap!&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;
&lt;br /&gt;
* Aleatorización de múltiples datos controlada por el panel de control&lt;br /&gt;
&lt;br /&gt;
* Escritura síncrona de múltiples datos asíncronos al mismo tiempo. Uso del formato de datos json&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
* Telegram--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Ejercicios ==&lt;br /&gt;
=== Ejercicio de '''Snap! con MQTT''' ===&lt;br /&gt;
* Mediante Snap! hacer que en la pantalla aparezca, de forma infinita y con una cadencia de dos segundos, el porcentaje de luz leída por la LDR y después la temperatura en grados centígrados.&lt;br /&gt;
&lt;br /&gt;
=== Ejercicios de '''NodeRED''' ===&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;
==== 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;
==== Ejercicio '''NodeRED-03''' ====&lt;br /&gt;
* Implementad una pasarela (''gateway'') HTTP/MQTT para cambiar el estado de los leds y el relé biestable de la placa IoT-02.&lt;br /&gt;
&lt;br /&gt;
==== Ejercicio '''NodeRED-04''' ====&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;br /&gt;
&lt;br /&gt;
==== Ejercicio '''NodeRED-05''' ====&lt;br /&gt;
* Implementar un flujo de NodeRED que supervise continuamente el valor de la LDR. Introducir dos ''sliders'' para fijar umbrales. Cuando la luz supere el umbral establecido el led rojo se enciende y el relé biestable cambia a SET. Cuando la luz baje del segundo umbral establecido el led rojo se apaga (se enciende el verde) y el relé biestable cambia a RESET.&lt;br /&gt;
&lt;br /&gt;
==== Ejercicio '''NodeRED-06''' ====&lt;br /&gt;
* Implementar un flujo de NodeRED que permita la entrada de un texto y con un botón lo envie a la pantalla OLED.&lt;br /&gt;
&lt;br /&gt;
==== Ejercicio '''NodeRED-07''' ====&lt;br /&gt;
* Implementar un flujo de NodeRED que permita seleccionar un mode de funcionamiento automático o manual. En manual se puede encender y apagar el led blanco mediante un ''switch''. En modo automático el led blanco se enciende o se apaga en función de un umbral consignado mediante un ''slider''. (Para habilitar o inhabilitar un ''switch'' se puede usar ''msg.enabled'').&lt;br /&gt;
&lt;br /&gt;
==== Ejercicio '''NodeRED-DB-01''' ====&lt;br /&gt;
* Cread una tabla en la base de datos '''aula206''' con el prefijo de vuestro puerto (por ejemplo '''m28XX_LDR''') con las columnas '''time''' (TIMESTAMP) y '''valueLDR''' (FLOAT). Insertad manualmente tres valores distintos mediante nodos ''inject'' y verificad la inserción consultando la tabla desde el terminal del VPS.&lt;br /&gt;
&lt;br /&gt;
==== Ejercicio '''NodeRED-DB-02''' ====&lt;br /&gt;
* A partir del flujo de aleatorización visto en clase, implementad un flujo que genere un valor aleatorio de LDR (entre 0 y 100) cada 5 segundos cuando el conmutador '''Randomize''' del panel de control esté activado, y que escriba cada valor generado en la tabla '''m28XX_LDR''' de la base de datos.&lt;br /&gt;
&lt;br /&gt;
==== Ejercicio '''NodeRED-DB-03''' ====&lt;br /&gt;
* Implementad un flujo que lea todos los registros de la tabla '''m28XX_LDR''' y muestre en un ''widget'' de tipo texto del panel de control el '''último valor''' registrado y en otro ''widget'' de texto la '''media aritmética''' de todos los valores almacenados.&lt;br /&gt;
&lt;br /&gt;
==== Ejercicio '''NodeRED-DB-04''' ====&lt;br /&gt;
* Cread una tabla '''m28XX_T_RH_LDR''' con las columnas '''valueT''', '''valueRH''' y '''valueLDR'''. Implementad un flujo que reciba los datos de temperatura, humedad relativa y nivel de luz de la placa IoT-02 de forma asíncrona y, usando variables de flujo y escritura síncrona (tal como se ha visto en clase), los almacene conjuntamente en la base de datos cada vez que llega cualquiera de los tres valores.&lt;br /&gt;
&lt;br /&gt;
==== Ejercicio '''NodeRED-DB-05''' ====&lt;br /&gt;
* Cread la tabla vista '''m28XX_T_RH_LDR_v''' sobre la tabla '''m28XX_T_RH_LDR''' con el tiempo en formato UNIX. Implementad un flujo que lea los últimos 10 registros de esta tabla vista y represente la temperatura en una gráfica en función del tiempo en el panel de control.&lt;br /&gt;
&lt;br /&gt;
==== Ejercicio '''NodeRED-DB-06''' ====&lt;br /&gt;
* Implementad un flujo con un ''slider'' en el panel de control que permita fijar un umbral de temperatura. Cada vez que llega un dato de temperatura de la placa IoT-02, el flujo lo guarda en la base de datos (tabla '''m28XX_alertas''', con las columnas '''valueT''' y '''alerta''' de tipo TINYINT). En la columna '''alerta''' se guardará '''1''' si la temperatura supera el umbral y '''0''' si no lo supera. En el panel de control se mostrará un ''widget'' de texto que indique el estado actual ('''⚠ Temperatura alta''' o '''✓ Temperatura normal''').&lt;br /&gt;
&lt;br /&gt;
==== Ejercicio '''NodeRED-DB-07''' ====&lt;br /&gt;
* Implementad un cuadro de mando completo que incluya: (a) generación periódica de datos aleatorios de temperatura, humedad relativa y LDR activada por un conmutador; (b) almacenamiento de los datos en la base de datos en la tabla '''m28XX_dashboard'''; (c) visualización de los últimos valores en ''widgets'' de tipo indicador (''gauge''); (d) un botón en el panel de control que al pulsarse borre todos los registros de la tabla ('''DELETE FROM m28XX_dashboard''') y muestre un mensaje de confirmación en un ''widget'' de texto.&lt;br /&gt;
&amp;lt;!--=== Ejercicios '''Telegram''' ===&lt;br /&gt;
* Desde el chat del bot: Al enviar la orden '''/ledWon''' se enciende el led blanco de la placa IoT-02. Al enviar la orden '''/ledWoff''' se apaga el led blanco.&lt;br /&gt;
&lt;br /&gt;
* Desde el chat del bot: Al enviar la orden '''/ledReleSet''' el relé se pone en estado SET. Al enviar la orden '''/ledReleReset''' el relé se pone en estado RESET.&lt;br /&gt;
&lt;br /&gt;
* El chat de vuestro bot recibe un mensaje cuando se aprieta vuestro botón I34 y cuando se deja de apretar.&lt;br /&gt;
&lt;br /&gt;
* Desde el chat del grupo donde pertenece vuestro bot: Al enviar la orden '''/entradas''' el bot contesta con los estados de los botones y la temperatura de la placa.--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Comentario de la práctica para el próximo día ===&lt;br /&gt;
El [https://binefa.com/upc-school/Enunciado_Practica_IoT_Hands-on_IoT_MVPs_2025-2026.pdf enunciado] estará en breve en el campus. Se comenzará después de haber usado Grafana y Telegram.&lt;/div&gt;</summary>
		<author><name>Jordi Binefa</name></author>
		
	</entry>
	<entry>
		<id>https://www.binefa.com/index.php?title=Uso_de_la_base_de_datos_MariaDB_desde_NodeRED_(2023)&amp;diff=12318</id>
		<title>Uso de la base de datos MariaDB desde NodeRED (2023)</title>
		<link rel="alternate" type="text/html" href="https://www.binefa.com/index.php?title=Uso_de_la_base_de_datos_MariaDB_desde_NodeRED_(2023)&amp;diff=12318"/>
		<updated>2026-05-16T06:52:43Z</updated>

		<summary type="html">&lt;p&gt;Jordi Binefa: /* Creación de una tabla en la base de datos MySQL */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Acceso =&lt;br /&gt;
Hay una base de datos creada en el MariaDB con el nombre '''aula206'''&lt;br /&gt;
&lt;br /&gt;
El usuario '''iot''' con contraseña '''iot''' tiene permisos de '''escritura y lectura''' sobre la base datos '''aula206'''&lt;br /&gt;
&lt;br /&gt;
El usuario '''convidat''' con contraseña '''benvingut''' tiene permisos de '''lectura''' sobre la base datos '''aula206'''&lt;br /&gt;
&lt;br /&gt;
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 [[Asignación de puertos para el curso 2022-2023 | número de puerto que se os ha assignado]].&lt;br /&gt;
&lt;br /&gt;
Explicación detallada en [[Uso de MariaDB en el VPS del Máster de Industria 4.0 el curso 2022-2023 | uso de MariaDB en el VPS del Máster de Industria 4.0]]&lt;br /&gt;
&lt;br /&gt;
= Nodos MariaDB en NodeRed =&lt;br /&gt;
== Instalación ==&lt;br /&gt;
[[Image:10MariaDbNodeRed00.png|center|thumb|Instalación de los nodos de MariaDB (''MySQL'') en NodeRED]]&lt;br /&gt;
&lt;br /&gt;
[https://flows.nodered.org/node/node-red-node-mysql Hace falta instalar el conjunto de nodos ''node-red-node-mysql'']&lt;br /&gt;
&lt;br /&gt;
[[Image:11nodoMariaDbNodeRed.png|center|thumb|Aspecto del nodo MySQL en NodeRED]]&lt;br /&gt;
== Configuración de la base de datos en el nodo MySQL ==&lt;br /&gt;
* Poner un nodo MySQL en el tapiz Node-RED&lt;br /&gt;
&lt;br /&gt;
* Hacer doble clic sobre el nodo MySQL&lt;br /&gt;
&lt;br /&gt;
[[Image:12nodoMariaDbNodeRed.png|center|thumb|Configuración del nodo MySQL]]&lt;br /&gt;
&lt;br /&gt;
* Ir al lápiz a la derecha del desplegable ''Add new MySQL database...'' presente en la fila ''Database''&lt;br /&gt;
&lt;br /&gt;
[[Image:13nodoMariaDbNodeRed.png|center|thumb|Configuración del nodo MySQL]]&lt;br /&gt;
&lt;br /&gt;
- 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.&lt;br /&gt;
&lt;br /&gt;
- En '''Port''' escribir el puerto TCP ('''3306''') por defecto de las bases de datos MySQL&lt;br /&gt;
&lt;br /&gt;
- 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''').&lt;br /&gt;
&lt;br /&gt;
- En '''Password''' escribir la contraseña del usuario (para el usuario '''iot''' es '''iot'''. Para el usuario '''convidat''' es '''benvingut''').&lt;br /&gt;
&lt;br /&gt;
- En '''Database''' escribir la base de datos que queremos acceder ('''aula206''')&lt;br /&gt;
&lt;br /&gt;
- En '''Charset''' escribir la codificación de carácteres ('''UTF8''')&lt;br /&gt;
== Creación de una tabla en la base de datos MySQL ==&lt;br /&gt;
[[Image:14nodoMariaDbNodeRed.png|center|Creación de una tabla]]&lt;br /&gt;
&lt;br /&gt;
Hay cuatro nodos enlazados: '''inject''', '''function''', '''mysql''' y '''debug'''.&lt;br /&gt;
&lt;br /&gt;
* Los nodos '''inject''' y '''debug''' no se modifican. Dejar la configuración por defecto.&lt;br /&gt;
&lt;br /&gt;
* El nodo '''mysql''' ha estado configurado en el paso anterior.&lt;br /&gt;
&lt;br /&gt;
* El nodo '''function''' se ha configurado de este modo:&lt;br /&gt;
&lt;br /&gt;
[[Image:15nodoMariaDbNodeRed.png|center|Creación de una tabla]]&lt;br /&gt;
&lt;br /&gt;
* Cambiar el nombre de la tabla substituyendo '''28XX''' por el [[Asignación de puertos para el curso 2025-2026 | número de puerto que se os ha asignado]].&lt;br /&gt;
Función '''CREATE TABLE m28XX_T_RH''':&lt;br /&gt;
 msg.topic = `&lt;br /&gt;
 CREATE TABLE m'''28XX'''_T_RH (&lt;br /&gt;
  time TIMESTAMP DEFAULT CURRENT_TIMESTAMP,&lt;br /&gt;
  valueT FLOAT,&lt;br /&gt;
  valueRH FLOAT,&lt;br /&gt;
  PRIMARY KEY (time));&lt;br /&gt;
 `;&lt;br /&gt;
 return msg;&lt;br /&gt;
&lt;br /&gt;
== Borrado de una tabla en la base de datos MySQL ==&lt;br /&gt;
[[Image:16nodoMariaDbNodeRed.png|center|Borrado de una tabla]]&lt;br /&gt;
&lt;br /&gt;
Función '''DROP TABLE m28XX_T_RH''':&lt;br /&gt;
 msg.topic = `DROP TABLE m28XX_T_RH;`;&lt;br /&gt;
 return msg;&lt;br /&gt;
&lt;br /&gt;
== Inserción de datos en una tabla de la base de datos MySQL ==&lt;br /&gt;
=== Configuración de nodos ''inject'' para generar datos de tipo JSON ===&lt;br /&gt;
[[Image:17nodoMariaDbNodeRed.png|center|Nodos ''inject'' para generar datos de tipo JSON]]&lt;br /&gt;
Doble clic sobre el nodo ''inject'' (seleccionar la opción '''{}'''):&lt;br /&gt;
[[Image:1701nodoMariaDbNodeRed.png|center|Edición del nodo ''inject'' para generar datos de tipo JSON]]&lt;br /&gt;
Clic sobre '''...''' (los tres puntos):&lt;br /&gt;
[[Image:1702nodoMariaDbNodeRed.png|center|Edición del nodo ''inject'' para generar datos de tipo JSON]]&lt;br /&gt;
En formato texto:&lt;br /&gt;
 {&lt;br /&gt;
    &amp;quot;valueT&amp;quot;: 17.89,&lt;br /&gt;
    &amp;quot;valueRH&amp;quot;: 44.32&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
=== Inserción de datos de tipo JSON en columnas de la tabla ===&lt;br /&gt;
[[Image:18nodoMariaDbNodeRed.png|center|Inserción de datos de tipo JSON en columnas de la tabla]]&lt;br /&gt;
&lt;br /&gt;
Función '''INSERT DATA''':&lt;br /&gt;
 msg.topic = `insert into m28XX_T_RH(valueT,valueRH) values(${msg.payload.valueT},${msg.payload.valueRH})`;&lt;br /&gt;
 return msg;&lt;br /&gt;
&lt;br /&gt;
== Lectura de datos en una tabla de la base de datos MySQL ==&lt;br /&gt;
[[Image:19nodoMariaDbNodeRed.png|center|Ejemplo de SELECT para MariaDB]]&lt;br /&gt;
Campo '''msg.topic''' del nodo ''inject'' para hacer un '''SELECT''':&lt;br /&gt;
[[Image:20nodoMariaDbNodeRed.png|center|Nodo ''inject'' para enviar un ''query'' de tipo ''SELECT'' a MariaDB]]&lt;br /&gt;
&lt;br /&gt;
Campo '''msg.topic''' del nodo ''inject'' con nombre '''SELECT''' en formato texto:&lt;br /&gt;
 select UNIX_TIMESTAMP(time) as time, valueT, valueRH from m28XX_T_RH&lt;br /&gt;
&lt;br /&gt;
== Creación de una tabla vista en la base de datos MySQL ==&lt;br /&gt;
[[Image:21nodoMariaDbNodeRed.png|center|Creación de una tabla vista partiendo de otra tabla en una base de datos MariaDB]]&lt;br /&gt;
&lt;br /&gt;
Función '''CREATE VIEW m28XX_T_RH_v''':&lt;br /&gt;
 msg.topic = `CREATE VIEW '''m28XX'''_T_RH_v AS select UNIX_TIMESTAMP(time) as time, valueT, valueRH from '''m28XX'''_T_RH;`;&lt;br /&gt;
 return msg;&lt;br /&gt;
== Tratamiento de datos leídos de la tabla ==&lt;br /&gt;
&lt;br /&gt;
[[Image:22nodoMariaDbNodeRed.png|center|Tratamiento de datos leídos de la tabla]]&lt;br /&gt;
&lt;br /&gt;
Añadir salidas a la función (en '''Outputs''' se ha cambiado de 1 a 3 salidas):&lt;br /&gt;
&lt;br /&gt;
[[Image:23nodoMariaDbNodeRed.png|center|Añadir salidas a la función]]&lt;br /&gt;
&lt;br /&gt;
Código de la función '''Tratamiento datos / Últimas entradas''':&lt;br /&gt;
&lt;br /&gt;
[[Image:24nodoMariaDbNodeRed.png|center|Código de la función '''Tratamiento datos / Últimas entradas''']]&lt;br /&gt;
&lt;br /&gt;
Función '''Tratamiento datos / Últimas entradas''' en modo texto:&lt;br /&gt;
 var a = msg.payload;&lt;br /&gt;
 var val = &amp;quot;&amp;quot;;&lt;br /&gt;
 var lastEntryValueT, lastEntryValueRH;&lt;br /&gt;
 a.forEach(function (entry) {&lt;br /&gt;
    val += &amp;quot;timestamp: &amp;quot; + entry.time + &amp;quot;, valueT: &amp;quot; + entry.valueT + &amp;quot;, valueRH: &amp;quot; + entry.valueRH + &amp;quot;\r&amp;quot;;&lt;br /&gt;
    lastEntryValueT = entry.valueT;&lt;br /&gt;
    lastEntryValueRH = entry.valueRH;&lt;br /&gt;
 });&lt;br /&gt;
 msg.payload = val;&lt;br /&gt;
 var msg_valT = { payload: lastEntryValueT };&lt;br /&gt;
 return [msg, msg_valT, { payload: lastEntryValueRH}];&lt;br /&gt;
&lt;br /&gt;
== Aleatorización controlada por el panel de control ==&lt;br /&gt;
Aprovechando el ejercicio hecho en la introducción al [[Uso del NodeRED (2023) | Uso del NodeRED]], añadiremos otro valor de aleatorización y haremos una escritura a la base de datos MariaDB.&lt;br /&gt;
&lt;br /&gt;
[[Image:25nodoMariaDbNodeRed.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.&lt;br /&gt;
&lt;br /&gt;
[[Image:26nodoMariaDbNodeRed.png|center|Generación de datos aleatorios]]&lt;br /&gt;
&lt;br /&gt;
[https://www.binefa.cat/training/upcSchool/2023/20230415/26nodeRedRandomUi.nodered.json Código para el NodeRED que genera dos 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 JSON value in range {&amp;quot;T&amp;quot;: &amp;lt;20.0,30.0&amp;gt;,&amp;quot;RH&amp;quot;: &amp;lt;45.0,55.0&amp;gt;}''':&lt;br /&gt;
 var randomT = parseFloat((200 + Math.floor(Math.random() * 101)) / 10); // value between 20.0 and 30.0&lt;br /&gt;
 var randomRH = parseFloat((450 + Math.floor(Math.random() * 101)) / 10); // value between 45.0 and 55.0&lt;br /&gt;
 var jsonR = {};&lt;br /&gt;
 jsonR[&amp;quot;T&amp;quot;] = randomT;&lt;br /&gt;
 jsonR[&amp;quot;RH&amp;quot;] = randomRH;&lt;br /&gt;
 &lt;br /&gt;
 var msg_jsonR = { payload: jsonR };&lt;br /&gt;
 var msg_valT = { payload: randomT };&lt;br /&gt;
 var msg_valRH = { payload: randomRH };&lt;br /&gt;
 &lt;br /&gt;
 return [msg_jsonR, msg_valT, msg_valRH];&lt;br /&gt;
&lt;br /&gt;
= Escritura síncrona de múltiples datos asíncronos al mismo tiempo. Uso del formato de datos '''json''' =&lt;br /&gt;
&lt;br /&gt;
[[Image:27nodoMariaDbNodeRed.png|center|Uso del formato de datos '''json''']]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[https://www.binefa.cat/training/upcSchool/2023/20230415/27nodeRedJson.nodered.json Código en NodeRED para el uso de Json en MariaDB]&lt;br /&gt;
&lt;br /&gt;
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''):&lt;br /&gt;
 flow.set(&amp;quot;IoT-02_RH&amp;quot;,74.6);&lt;br /&gt;
 flow.set(&amp;quot;IoT-02_T&amp;quot;,24.7);&lt;br /&gt;
 flow.set(&amp;quot;IoT-02_P&amp;quot;,1007.2);&lt;br /&gt;
 flow.set(&amp;quot;IoT-02_LDR&amp;quot;,47.3);&lt;br /&gt;
 return msg;&lt;br /&gt;
&lt;br /&gt;
Función '''T:21.3,RH:48.2,P:1003.5,LDR:89.4''':&lt;br /&gt;
 flow.set(&amp;quot;IoT-02_RH&amp;quot;,48.2);&lt;br /&gt;
 flow.set(&amp;quot;IoT-02_T&amp;quot;,21.3);&lt;br /&gt;
 flow.set(&amp;quot;IoT-02_P&amp;quot;,1003.5);&lt;br /&gt;
 flow.set(&amp;quot;IoT-02_LDR&amp;quot;,89.4);&lt;br /&gt;
 return msg;&lt;br /&gt;
&lt;br /&gt;
Función '''--&amp;gt; json''':&lt;br /&gt;
 var json00 = {};&lt;br /&gt;
 json00.RH = flow.get(&amp;quot;IoT-02_RH&amp;quot;);&lt;br /&gt;
 json00.T = flow.get(&amp;quot;IoT-02_T&amp;quot;);&lt;br /&gt;
 json00.P = flow.get(&amp;quot;IoT-02_P&amp;quot;);&lt;br /&gt;
 json00.LDR = flow.get(&amp;quot;IoT-02_LDR&amp;quot;);&lt;br /&gt;
 msg.payload = json00;&lt;br /&gt;
 return msg;&lt;br /&gt;
&lt;br /&gt;
Función '''INSERT INTO m28XX_T_RH_P_LDR(valueT,valueRH,valueP,valueLDR)''':&lt;br /&gt;
 msg.topic = `insert into m28XX_T_RH_P_LDR(valueT,valueRH,valueP,valueLDR) values(${msg.payload.T},${msg.payload.RH},${msg.payload.P},${msg.payload.LDR})`;&lt;br /&gt;
 return msg;&lt;br /&gt;
&lt;br /&gt;
Consulta a MariaDB desde el terminal del VPS:&lt;br /&gt;
 convidat@vps656540:~$ '''mysql -u convidat -p'''&lt;br /&gt;
 Enter password: ''(la contraseña es '''benvingut''')''&lt;br /&gt;
 Welcome to the MariaDB monitor.  Commands end with ; or \g.&lt;br /&gt;
 Your MariaDB connection id is 133&lt;br /&gt;
 Server version: 10.3.38-MariaDB-0+deb10u1 Debian 10&lt;br /&gt;
 &lt;br /&gt;
 Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others. &lt;br /&gt;
 &lt;br /&gt;
 Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.&lt;br /&gt;
 &lt;br /&gt;
 MariaDB [(none)]&amp;gt; '''use aula206;'''&lt;br /&gt;
 Reading table information for completion of table and column names&lt;br /&gt;
 You can turn off this feature to get a quicker startup with -A &lt;br /&gt;
 &lt;br /&gt;
 Database changed&lt;br /&gt;
 MariaDB [aula206]&amp;gt; '''select * from m28XX_T_RH_P_LDR_v;'''&lt;br /&gt;
 +------------+--------+---------+--------+----------+&lt;br /&gt;
 | time       | valueT | valueRH | valueP | valueLDR |&lt;br /&gt;
 +------------+--------+---------+--------+----------+&lt;br /&gt;
 | 1681149647 |   24.7 |    74.6 | 1007.2 |     47.3 |&lt;br /&gt;
 | 1681149886 |   21.3 |    48.2 | 1003.5 |     89.4 |&lt;br /&gt;
 +------------+--------+---------+--------+----------+&lt;br /&gt;
 2 rows in set (0.000 sec)&lt;br /&gt;
 &lt;br /&gt;
 MariaDB [aula206]&amp;gt; '''quit'''&lt;br /&gt;
 Bye&lt;/div&gt;</summary>
		<author><name>Jordi Binefa</name></author>
		
	</entry>
	<entry>
		<id>https://www.binefa.com/index.php?title=16_/_5_/_2026_-_IoT,_Embedded_Systems,_Edge_y_Cloud&amp;diff=12317</id>
		<title>16 / 5 / 2026 - IoT, Embedded Systems, Edge y Cloud</title>
		<link rel="alternate" type="text/html" href="https://www.binefa.com/index.php?title=16_/_5_/_2026_-_IoT,_Embedded_Systems,_Edge_y_Cloud&amp;diff=12317"/>
		<updated>2026-05-15T17:25:00Z</updated>

		<summary type="html">&lt;p&gt;Jordi Binefa: /* Ejercicios de NodeRED */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Conceptos previos (15 / 5 / 2026) =&lt;br /&gt;
Acceso a la base de datos del VPS del máster&lt;br /&gt;
&lt;br /&gt;
= Temario (16 / 5 / 2026) =&lt;br /&gt;
[https://meet.google.com/rke-afvm-eou Videoconferencia]&lt;br /&gt;
&lt;br /&gt;
== Información actualizada de los vídeos de la clase invertida ==&lt;br /&gt;
[https://binefa.com/upc-school/cambiosSegundoDia2026.pdf Cambios respecto los vídeos de la clase invertida]&lt;br /&gt;
* En todos los sitios donde aparece '''vps656540.ovh.net''' ahora es '''master.iotvertebrae.com'''&lt;br /&gt;
* Por seguridad, la contraseña para acceder al VPS por terminal está dentro de la descripción del vídeo en el Campus (en vez de **** está la contraseña):&lt;br /&gt;
&lt;br /&gt;
''Vídeo NodeRED con MySQL parte 1/3   (clase invertida) (VPS: convidat / ****)''&lt;br /&gt;
&lt;br /&gt;
- Acceso desde el terminal en Windows (cmd):&lt;br /&gt;
 ssh convidat@master.iotvertebrae.com&lt;br /&gt;
- Acceso desde el terminal en Linux:&lt;br /&gt;
 ssh -o ServerAliveInterval=30 convidat@master.iotvertebrae.com&lt;br /&gt;
&lt;br /&gt;
Una vez dentro del terminal del VPS se puede acceder a la base de datos con los usuarios (no hay cambios):&lt;br /&gt;
&lt;br /&gt;
- '''convidat''' (contraseña: '''''benvingut''''')&lt;br /&gt;
&lt;br /&gt;
- '''iot''' (contraseña: '''''iot''''')&lt;br /&gt;
&lt;br /&gt;
== Repaso del día anterior ==&lt;br /&gt;
* [https://www.binefa.cat/training/iot02/pdf/iot02_00_es.pdf Introducción a la placa IoT-02]&lt;br /&gt;
* [[El protocolo MQTT]]&lt;br /&gt;
* [[Gemelos digitales especializados]] (Placa IoT-02 e IoT-Vertebrae)&lt;br /&gt;
&lt;br /&gt;
== Conexión entre la placa IoT-02 y Snap! mediante MQTT ==&lt;br /&gt;
&amp;lt;!-- '''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;
&lt;br /&gt;
* Broker MQTT púplico:&lt;br /&gt;
** MQTT TCP por el puerto no seguro 1883: '''broker.emqx.io'''&lt;br /&gt;
** MQTT WSS por puerto seguro: '''wss://broker.emqx.io:8084/mqtt'''&lt;br /&gt;
* Broker MQTT en el VPS del máster:&lt;br /&gt;
** MQTT TCP por el puerto no seguro 1883: '''master.iotvertebrae.com'''&lt;br /&gt;
** MQTT WSS por puerto seguro: '''wss://master.iotvertebrae.com:9002'''&lt;br /&gt;
&amp;lt;!-- '''Nuevo firmware de la placa IoT-02 para el día de hoy''': [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]&lt;br /&gt;
[[Conexión entre la placa IoT-02 y Snap! v8 mediante MQTT]]&lt;br /&gt;
[[Conexión entre la placa IoT-02 y Snap! v9 mediante MQTT]] --&amp;gt;&lt;br /&gt;
[https://snap.berkeley.edu/snap/snap.html#present:Username=jordibinefa&amp;amp;ProjectName=IoT-02_board_segur_66C172FB482D_broker_master_iotvertebrae Control de la placa IoT-02. Broker del VPS del máster] El [https://github.com/jordibinefa/IoT-02/tree/master/codes/IoT-02_mqtt_sync_upcSchool_broker1 ''firmware'' IoT-02_mqtt_sync_upcSchool_broker1] enseña el número MAC por la pantalla OLED cuando la placa IoT-02 se conecta a vuestra wifi. (Cambiar el archivo [https://github.com/jordibinefa/IoT-02/blob/master/codes/IoT-02_mqtt_sync_upcSchool_broker1/IoT-02_wifiCredentials.h IoT-02_wifiCredentials.h] en la línea 21 substituyendo ''iotcat'' por el nombre de la SSID de vuestra wifi y ''1234567890a'' por vuestra contraseña).&lt;br /&gt;
&lt;br /&gt;
== Uso de la base de datos MariaDB para almacenar y leer datos IoT ==&lt;br /&gt;
[[Uso de MariaDB en el VPS del Máster de Industria 4.0 el curso 2025-2026 | Uso de MariaDB en el VPS del Máster de Industria 4.0]]&lt;br /&gt;
&amp;lt;!-- [[Uso de MariaDB en el VPS del Máster de Industria 4.0 el curso 2023-2024]]&lt;br /&gt;
[[Uso de MariaDB en el VPS del Máster de Industria 4.0 el curso 2022-2023 | Uso de MariaDB en el VPS del Máster de Industria 4.0 el curso 2023-2024]]--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Node-RED ==&lt;br /&gt;
[[Asignación de puertos para el curso 2025-2026 | Asignación de puertos para este curso]]&lt;br /&gt;
&amp;lt;!--[[Asignación de puertos para el curso 2023-2024]]&lt;br /&gt;
[[Asignación de puertos para el curso 2022-2023]]--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Uso del Node-RED ===&lt;br /&gt;
[[Uso del NodeRED (2024) | Uso del Node-RED]]&lt;br /&gt;
&amp;lt;!--[[Uso del NodeRED (2023) | Uso del Node-RED]]--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Uso de la base de datos MariaDB desde Node-RED===&lt;br /&gt;
[[Uso de la base de datos MariaDB desde NodeRED (2023) | Uso de la base de datos MariaDB desde Node-RED]]&lt;br /&gt;
&amp;lt;!-- == Telegram ==&lt;br /&gt;
[[Uso de Telegram desde NodeRED]]--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Repaso y dudas de la clase invertida ==&lt;br /&gt;
=== Verificación de nodos instalados ===&lt;br /&gt;
Antes de continuar verificamos que ya tenemos instalado el nodo de MySQL ('''node-red-node-mysql''') y los nodos del panel de control ('''node-red-dashboard''' -marcado como ''deprecated''-).&lt;br /&gt;
==== Nodo node-red-node-mysql ====&lt;br /&gt;
[https://flows.nodered.org/node/node-red-node-mysql Documentación oficial del nodo ''node-red-node-mysql'']&lt;br /&gt;
&lt;br /&gt;
[[Image:10MariaDbNodeRed00.png|center|thumb|Instalación de los nodos de MariaDB (''MySQL'') en NodeRED]]&lt;br /&gt;
[[Image:11nodoMariaDbNodeRed.png|center|thumb|Aspecto del nodo MySQL en NodeRED]]&lt;br /&gt;
&lt;br /&gt;
==== Nodos node-red-dashboard ====&lt;br /&gt;
[https://flows.nodered.org/node/node-red-dashboard Documentación oficial de los nodos ''node-red-dashboard''] (Ahora sale como ''deprecated'').&lt;br /&gt;
&lt;br /&gt;
[[Image:NodosDashboard.png|center|thumb|Nodos del panel de control (''Dashboard'') en NodeRED]]&lt;br /&gt;
&lt;br /&gt;
=== Acceso al VPS del máster ===&lt;br /&gt;
* La contraseña está dentro de la descripción del vídeo en el Campus (en vez de **** está la contraseña):&lt;br /&gt;
&lt;br /&gt;
''Vídeo NodeRED con MySQL parte 1/3   (clase invertida) (VPS: convidat / ****)''&lt;br /&gt;
* Acceso desde el terminal en Linux:&lt;br /&gt;
 ssh -o ServerAliveInterval=30 convidat@master.iotvertebrae.com&lt;br /&gt;
* Acceso desde el terminal en Windows (cmd):&lt;br /&gt;
 ssh convidat@master.iotvertebrae.com&lt;br /&gt;
&lt;br /&gt;
=== Acceso a la base de datos del VPS del máster ===&lt;br /&gt;
* Con permisos de lectura y escritura:&lt;br /&gt;
 mysql -u iot -p&lt;br /&gt;
* Con permisos de lectura:&lt;br /&gt;
 mysql -u convidat -p&lt;br /&gt;
&lt;br /&gt;
=== Repaso ===&lt;br /&gt;
* Uso de JSON con Snap!&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;
&lt;br /&gt;
* Aleatorización de múltiples datos controlada por el panel de control&lt;br /&gt;
&lt;br /&gt;
* Escritura síncrona de múltiples datos asíncronos al mismo tiempo. Uso del formato de datos json&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
* Telegram--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Ejercicios ==&lt;br /&gt;
=== Ejercicio de '''Snap! con MQTT''' ===&lt;br /&gt;
* Mediante Snap! hacer que en la pantalla aparezca, de forma infinita y con una cadencia de dos segundos, el porcentaje de luz leída por la LDR y después la temperatura en grados centígrados.&lt;br /&gt;
&lt;br /&gt;
=== Ejercicios de '''NodeRED''' ===&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;
==== 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;
==== Ejercicio '''NodeRED-03''' ====&lt;br /&gt;
* Implementad una pasarela (''gateway'') HTTP/MQTT para cambiar el estado de los leds y el relé biestable de la placa IoT-02.&lt;br /&gt;
&lt;br /&gt;
==== Ejercicio '''NodeRED-04''' ====&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;br /&gt;
&lt;br /&gt;
==== Ejercicio '''NodeRED-05''' ====&lt;br /&gt;
* Implementar un flujo de NodeRED que supervise continuamente el valor de la LDR. Introducir dos ''sliders'' para fijar umbrales. Cuando la luz supere el umbral establecido el led rojo se enciende y el relé biestable cambia a SET. Cuando la luz baje del segundo umbral establecido el led rojo se apaga (se enciende el verde) y el relé biestable cambia a RESET.&lt;br /&gt;
&lt;br /&gt;
==== Ejercicio '''NodeRED-06''' ====&lt;br /&gt;
* Implementar un flujo de NodeRED que permita la entrada de un texto y con un botón lo envie a la pantalla OLED.&lt;br /&gt;
&lt;br /&gt;
==== Ejercicio '''NodeRED-07''' ====&lt;br /&gt;
* Implementar un flujo de NodeRED que permita seleccionar un mode de funcionamiento automático o manual. En manual se puede encender y apagar el led blanco mediante un ''switch''. En modo automático el led blanco se enciende o se apaga en función de un umbral consignado mediante un ''slider''. (Para habilitar o inhabilitar un ''switch'' se puede usar ''msg.enabled'').&lt;br /&gt;
&lt;br /&gt;
==== Ejercicio '''NodeRED-DB-01''' ====&lt;br /&gt;
* Cread una tabla en la base de datos '''aula206''' con el prefijo de vuestro puerto (por ejemplo '''m28XX_LDR''') con las columnas '''time''' (TIMESTAMP) y '''valueLDR''' (FLOAT). Insertad manualmente tres valores distintos mediante nodos ''inject'' y verificad la inserción consultando la tabla desde el terminal del VPS.&lt;br /&gt;
&lt;br /&gt;
==== Ejercicio '''NodeRED-DB-02''' ====&lt;br /&gt;
* A partir del flujo de aleatorización visto en clase, implementad un flujo que genere un valor aleatorio de LDR (entre 0 y 100) cada 5 segundos cuando el conmutador '''Randomize''' del panel de control esté activado, y que escriba cada valor generado en la tabla '''m28XX_LDR''' de la base de datos.&lt;br /&gt;
&lt;br /&gt;
==== Ejercicio '''NodeRED-DB-03''' ====&lt;br /&gt;
* Implementad un flujo que lea todos los registros de la tabla '''m28XX_LDR''' y muestre en un ''widget'' de tipo texto del panel de control el '''último valor''' registrado y en otro ''widget'' de texto la '''media aritmética''' de todos los valores almacenados.&lt;br /&gt;
&lt;br /&gt;
==== Ejercicio '''NodeRED-DB-04''' ====&lt;br /&gt;
* Cread una tabla '''m28XX_T_RH_LDR''' con las columnas '''valueT''', '''valueRH''' y '''valueLDR'''. Implementad un flujo que reciba los datos de temperatura, humedad relativa y nivel de luz de la placa IoT-02 de forma asíncrona y, usando variables de flujo y escritura síncrona (tal como se ha visto en clase), los almacene conjuntamente en la base de datos cada vez que llega cualquiera de los tres valores.&lt;br /&gt;
&lt;br /&gt;
==== Ejercicio '''NodeRED-DB-05''' ====&lt;br /&gt;
* Cread la tabla vista '''m28XX_T_RH_LDR_v''' sobre la tabla '''m28XX_T_RH_LDR''' con el tiempo en formato UNIX. Implementad un flujo que lea los últimos 10 registros de esta tabla vista y represente la temperatura en una gráfica en función del tiempo en el panel de control.&lt;br /&gt;
&lt;br /&gt;
==== Ejercicio '''NodeRED-DB-06''' ====&lt;br /&gt;
* Implementad un flujo con un ''slider'' en el panel de control que permita fijar un umbral de temperatura. Cada vez que llega un dato de temperatura de la placa IoT-02, el flujo lo guarda en la base de datos (tabla '''m28XX_alertas''', con las columnas '''valueT''' y '''alerta''' de tipo TINYINT). En la columna '''alerta''' se guardará '''1''' si la temperatura supera el umbral y '''0''' si no lo supera. En el panel de control se mostrará un ''widget'' de texto que indique el estado actual ('''⚠ Temperatura alta''' o '''✓ Temperatura normal''').&lt;br /&gt;
&lt;br /&gt;
==== Ejercicio '''NodeRED-DB-07''' ====&lt;br /&gt;
* Implementad un cuadro de mando completo que incluya: (a) generación periódica de datos aleatorios de temperatura, humedad relativa y LDR activada por un conmutador; (b) almacenamiento de los datos en la base de datos en la tabla '''m28XX_dashboard'''; (c) visualización de los últimos valores en ''widgets'' de tipo indicador (''gauge''); (d) un botón en el panel de control que al pulsarse borre todos los registros de la tabla ('''DELETE FROM m28XX_dashboard''') y muestre un mensaje de confirmación en un ''widget'' de texto.&lt;br /&gt;
&amp;lt;!--=== Ejercicios '''Telegram''' ===&lt;br /&gt;
* Desde el chat del bot: Al enviar la orden '''/ledWon''' se enciende el led blanco de la placa IoT-02. Al enviar la orden '''/ledWoff''' se apaga el led blanco.&lt;br /&gt;
&lt;br /&gt;
* Desde el chat del bot: Al enviar la orden '''/ledReleSet''' el relé se pone en estado SET. Al enviar la orden '''/ledReleReset''' el relé se pone en estado RESET.&lt;br /&gt;
&lt;br /&gt;
* El chat de vuestro bot recibe un mensaje cuando se aprieta vuestro botón I34 y cuando se deja de apretar.&lt;br /&gt;
&lt;br /&gt;
* Desde el chat del grupo donde pertenece vuestro bot: Al enviar la orden '''/entradas''' el bot contesta con los estados de los botones y la temperatura de la placa.--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Comentario de la práctica para el próximo día ===&lt;br /&gt;
El enunciado estará en breve en el campus. Se comenzará después de haber usado Grafana y Telegram.&lt;/div&gt;</summary>
		<author><name>Jordi Binefa</name></author>
		
	</entry>
	<entry>
		<id>https://www.binefa.com/index.php?title=Carpetes_compartides_2n_d%27SMX-B._Curs_2025-2026&amp;diff=12316</id>
		<title>Carpetes compartides 2n d'SMX-B. Curs 2025-2026</title>
		<link rel="alternate" type="text/html" href="https://www.binefa.com/index.php?title=Carpetes_compartides_2n_d%27SMX-B._Curs_2025-2026&amp;diff=12316"/>
		<updated>2026-05-14T16:35:04Z</updated>

		<summary type="html">&lt;p&gt;Jordi Binefa: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[https://drive.google.com/drive/folders/13SE5HiieHczHyJ_-d5aArN2U8RYEqQbm Idrissi Belghalia, Aiman]&lt;br /&gt;
&lt;br /&gt;
[https://drive.google.com/drive/folders/1d118w9Y4J6APQhUJt-xc1tTEncKPoNmW Lin , Jia Jun]&lt;br /&gt;
&lt;br /&gt;
[https://drive.google.com/drive/folders/1fofqbFLjhtzQ4rLz9hdZzms4N45FCAH2 Marí Carreras, Alexei]&lt;br /&gt;
&lt;br /&gt;
[https://drive.google.com/drive/folders/1ksRW16PbGkLbQYqOkDP74r4rXn0Qv0JL Martín Martos, Raúl]&lt;br /&gt;
&lt;br /&gt;
[https://drive.google.com/drive/folders/19Bfl6PVeOswixZKqoNCsxqsVRYYPNCNN Martínez Portela, Nacho]&lt;br /&gt;
&lt;br /&gt;
[https://drive.google.com/drive/folders/1L-oNvPTfVh6Y5DgyYdY_5jRX4sCSzTNJ Martos Soto, Iñaki]&lt;br /&gt;
&lt;br /&gt;
[https://drive.google.com/drive/folders/1Bi8pkphwF2wykaNLn8yYKyHbPYddEPyM Mosquera Capell, Daniel]&lt;br /&gt;
&lt;br /&gt;
[https://drive.google.com/drive/folders/1llbqcQ4Cmad3eKFt51JNyRTgUH0ljPE5 Osagiede Momodu, Desmond Osayande]&lt;br /&gt;
&lt;br /&gt;
[https://drive.google.com/drive/folders/1zcZe-Hes69POXS3L8yMggSLoDHKxLKq8 Osca Iglesias, Pol]&lt;br /&gt;
&lt;br /&gt;
[https://drive.google.com/drive/folders/1YRzTok3xOYQnEE7PxN153OVTvSybr0Nr Pérez, Ian]&lt;br /&gt;
&lt;br /&gt;
[https://drive.google.com/drive/folders/1kbjpyG_vDdl3W7iHL4BsvAeqvak7paMV Potes Amaya, Angel David]&lt;br /&gt;
&lt;br /&gt;
[https://drive.google.com/drive/folders/1dXCtA7wX8_molp9Z5WUahd0bMAyXyrn_ Prat Lamas, Adrià]&lt;br /&gt;
&lt;br /&gt;
[https://drive.google.com/drive/folders/1HRUFpsP3U2SJiJMrZHgqct88NxRttp93 Quitian Reina, Samuel]&lt;br /&gt;
&lt;br /&gt;
[https://drive.google.com/drive/folders/1Eq_2N-RLVPtT_5_Uh6d8iGd5HFghKqze Redondo Castellón, Hector]&lt;br /&gt;
&lt;br /&gt;
[https://drive.google.com/drive/folders/1Yn4UdKeLNmrQd3cOPsL9h-mmYqiA9Jmw Rodríguez Díaz, Cristian Ismael]&lt;br /&gt;
&lt;br /&gt;
[https://drive.google.com/drive/folders/1a9-ddCiWnX2Y_ewxrYIJeZH0QB6MM1Cy Ruiz Sierra, Pol]&lt;br /&gt;
&lt;br /&gt;
[https://drive.google.com/drive/folders/1l_K_HuQ-qO41xQJupN7GyLNjp7fIWJwq Salguero Hormichea, Irene]&lt;br /&gt;
&lt;br /&gt;
[https://drive.google.com/drive/folders/1TndB79_viKPFT-qTgGzyZpNsuVgRgCct Salvany Llanos, David]&lt;br /&gt;
&lt;br /&gt;
[https://drive.google.com/drive/folders/1GyzZgZK8gXGp7V3NEggtajvlW5i9FWRU Sànchez Martínez, Èric Gabriel]&lt;br /&gt;
&lt;br /&gt;
[https://drive.google.com/drive/folders/1_E66j5u-s5e0tcGWpLEGSHrq_YlkX9yS Sandoval Vaides, Juan Diego]&lt;br /&gt;
&lt;br /&gt;
[https://drive.google.com/drive/folders/1jVOnKunjI1zyxtHfqBNvR3T-DlHAO5zQ Solsona Rodríguez, Carlos]&lt;br /&gt;
&lt;br /&gt;
[https://drive.google.com/drive/folders/1CvYymaFAzCjgzZzHFb9RE9BZuiWBpe81 Torrico Callejas, Ernest Samuel]&lt;br /&gt;
&lt;br /&gt;
[https://drive.google.com/drive/folders/1PET4lkuGz6ihAlcHqYlSPexmjocDOKFi Vilches Sanchez, Veronika]&lt;br /&gt;
&lt;br /&gt;
[https://drive.google.com/drive/folders/1f0NbHyFYbgNnLbPI2Bz2Dbnj3WXYdp3d Villalba, Jonathan]&lt;br /&gt;
&lt;br /&gt;
[https://drive.google.com/drive/folders/1_JqhaO_130BeBdeMHfA8GHQ4DTu316SB Ye , Qingsheng]&lt;br /&gt;
&lt;br /&gt;
[https://drive.google.com/drive/folders/13KgEyDejbrtvenWWfF9Bxz5WA8rGyKX1 Zamora Soler, Adrià] [https://drive.google.com/drive/folders/0AG2ZSdOhGFkXUk9PVA Python Zamora]&lt;/div&gt;</summary>
		<author><name>Jordi Binefa</name></author>
		
	</entry>
	<entry>
		<id>https://www.binefa.com/index.php?title=2n_SMX-A_per_dies._Curs_2025-2026&amp;diff=12315</id>
		<title>2n SMX-A per dies. Curs 2025-2026</title>
		<link rel="alternate" type="text/html" href="https://www.binefa.com/index.php?title=2n_SMX-A_per_dies._Curs_2025-2026&amp;diff=12315"/>
		<updated>2026-05-14T13:31:39Z</updated>

		<summary type="html">&lt;p&gt;Jordi Binefa: /* 20260512 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Quan tingueu les credencials d'accés a la [https://clot.fje.edu/ca NET] heu de compartir-nos (als '''dos''' professors) una carpeta amb aquest nom: '''2526-SMX2A-1rCognom2nCognomNom''' (Per exemple, si el vostre nom és Xavier López Pujol --&amp;gt; ''2526-SMX2A-LopezPujolXavier''). A aquest enllaç podreu veure si ja hi sou a la llista:&lt;br /&gt;
&lt;br /&gt;
[[Carpetes compartides 2n d'SMX-A. Curs 2025-2026]]&lt;br /&gt;
= Enllaços ràpids =&lt;br /&gt;
[https://meet.google.com/tbb-qgtn-kxb Teleconferència provisional]&lt;br /&gt;
&lt;br /&gt;
[https://snap.berkeley.edu/snap/snap.html Snap!]&lt;br /&gt;
&lt;br /&gt;
[https://moodle.binefa.cat/ Accés al Moodle de l'espai d'habilitats]&lt;br /&gt;
&lt;br /&gt;
[https://docs.google.com/spreadsheets/d/1PjpZhgqLMilMMzvnTGUtzbPYy6O3vPGKW74V_JUH8NE/edit?gid=1396246821#gid=1396246821 Llista 2n SMX-A] &amp;lt;!--&lt;br /&gt;
[https://fje.sharepoint.com/:x:/r/sites/GD_CLOT-FP-CLOT_FP-DptInformatica/Documentos%20compartidos/CLOT_FP-DptInformatica/2526/LLISTES%20ASSIST%C3%88NCIA/Llista%20SMX2A%202526.xlsx?d=w00118896baa440b8863a1e5525e54b64&amp;amp;csf=1&amp;amp;web=1&amp;amp;e=7XnnMG Llista 2n SMX-A] --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 20260519 ==&lt;br /&gt;
* Prova epistemològica de TKinter i Python.&lt;br /&gt;
== 20260512 ==&lt;br /&gt;
* Lliurament del projecte de TKinter&lt;br /&gt;
&lt;br /&gt;
== 20260505 ==&lt;br /&gt;
* Seguim fent el projecte de TKinter&lt;br /&gt;
&lt;br /&gt;
== 20260428 ==&lt;br /&gt;
* Fem el projecte de TKinter&lt;br /&gt;
* [https://aistudio.google.com/api-keys clau API]&lt;br /&gt;
&lt;br /&gt;
== 20260421 ==&lt;br /&gt;
* Seguim amb TKinter&lt;br /&gt;
&lt;br /&gt;
== 20260414 ==&lt;br /&gt;
* Seguim amb TKinter&lt;br /&gt;
&lt;br /&gt;
== 20260407 - TKinter ==&lt;br /&gt;
* [https://recull.binefa.cat/files/20260407/ Documentació de TKinter]&lt;br /&gt;
&lt;br /&gt;
== 20260324 ==&lt;br /&gt;
* Lliurar el [https://moodle.binefa.cat/pluginfile.php/1993/mod_resource/content/3/Proyecto_1.pdf projecte del 2n trimestre] amb un menú en Python ([https://recull.binefa.cat/files/20260317_menu/ Exemple de menú]) (Usuari / Contrasenya: smxA / smxA2526 )&lt;br /&gt;
&lt;br /&gt;
== 20260317 ==&lt;br /&gt;
* Seguim fent Python&lt;br /&gt;
* Exercici d'un menú en Python ([https://recull.binefa.cat/files/20260317_menu/ Exemple de menú]) (Usuari / Contrasenya: smxA / smxA2526 )&lt;br /&gt;
&lt;br /&gt;
== 20260310 ==&lt;br /&gt;
* Seguim fent Python&lt;br /&gt;
&lt;br /&gt;
== 20260224 ==&lt;br /&gt;
* Metacognició de síntesi tipus test.&lt;br /&gt;
&lt;br /&gt;
== 20260217 ==&lt;br /&gt;
* Acabeu els 8 exercicis de la pràctica 1 de Python que és al Moodle.&lt;br /&gt;
&lt;br /&gt;
== 20260210 ==&lt;br /&gt;
* Feu i documenteu els exercicis 1, 2 i 3 presents al Moodle. Els heu de lliurar abans d'acabar la classe.&lt;br /&gt;
&lt;br /&gt;
== 20260203 ==&lt;br /&gt;
* Seguim aprenent Python&lt;br /&gt;
* [https://pyscript.com/ pyscript.com]&lt;br /&gt;
&lt;br /&gt;
== 20260127 ==&lt;br /&gt;
* Seguim aprenent Python&lt;br /&gt;
&lt;br /&gt;
== 20260113 ==&lt;br /&gt;
* Presentació del projecte de Nadal&lt;br /&gt;
=== Primer contacte amb Python ===&lt;br /&gt;
* [https://www.python.org/downloads/ Instal·lació de ''Python'' amb ''pip'']&lt;br /&gt;
* [[Pràctiques d'introducció a Python - SMX | Pràctiques d'introducció a Python]]&lt;br /&gt;
* [[Exercicis d'introducció a Python]]&lt;br /&gt;
&lt;br /&gt;
== 20251125 ==&lt;br /&gt;
* Seguim treballant en el projecte Snap! de Nadal.&lt;br /&gt;
&lt;br /&gt;
== 20251118 ==&lt;br /&gt;
* Examen Snap!&lt;br /&gt;
== 20251111 ==&lt;br /&gt;
* Blocs amb Snap!&lt;br /&gt;
&lt;br /&gt;
== 20251104 ==&lt;br /&gt;
* Seguim amb Snap! Fem la pràctica 5 del Moodle&lt;br /&gt;
&lt;br /&gt;
== 20251028 ==&lt;br /&gt;
Seguim amb Snap!&lt;br /&gt;
&lt;br /&gt;
== 20251021 ==&lt;br /&gt;
Seguim amb Snap!&lt;br /&gt;
&lt;br /&gt;
Fem [https://moodle.binefa.cat/pluginfile.php/780/mod_resource/content/6/practica%204.pdf pràctica 4 del Moodle] ([https://snap.berkeley.edu/snap/snap.html#present:Username=jordibinefa&amp;amp;ProjectName=taur%C3%B3Ping%C3%BC%C3%AD_00 Un exemple no finalitzat])&lt;br /&gt;
&lt;br /&gt;
== 20251014 ==&lt;br /&gt;
Seguim amb Snap!&lt;br /&gt;
&lt;br /&gt;
* [https://recull.binefa.cat/files/20251014/ 5 camells de colors en format svg]&lt;br /&gt;
* [https://snap.berkeley.edu/snap/snap.html#present:Username=jordibinefa&amp;amp;ProjectName=carreraCamells Exemple de cursa de camells]&lt;br /&gt;
&lt;br /&gt;
== 20251007 ==&lt;br /&gt;
Seguim amb Snap!&lt;br /&gt;
&lt;br /&gt;
== 20250930 ==&lt;br /&gt;
Seguim amb Snap!&lt;br /&gt;
&lt;br /&gt;
== 20250923 ==&lt;br /&gt;
Seguim amb Snap!&lt;br /&gt;
&lt;br /&gt;
== 20250916 ==&lt;br /&gt;
[https://recull.binefa.cat/ Recull d'informació] (usuari: ''smxA'', contrasenya: ''smxA2526'')&lt;br /&gt;
&lt;br /&gt;
[https://snap.berkeley.edu/snap/snap.html Snap!]&lt;br /&gt;
&lt;br /&gt;
[https://gamifi.cat/docs/cs/snapguia.pdf Guia d'Snap!]&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
[https://docs.google.com/spreadsheets/d/16UHsIGuWNz3jo7g-LzVnMKPfv6thKUpyEowaZCUMyng/edit#gid=1118263977 Llista de 2n d'SMX-A]&lt;br /&gt;
== 20230511 ==&lt;br /&gt;
Seguim amb Python.&lt;br /&gt;
&lt;br /&gt;
[[Pràctiques d'introducció a Python . Part 3 - SMX | Estructures repetitives, o bucles, en Python]]&lt;br /&gt;
&lt;br /&gt;
[[Exercicis d'estructures de control repetitives en Python]]&lt;br /&gt;
== 20230504 ==&lt;br /&gt;
Seguim amb Python.&lt;br /&gt;
&lt;br /&gt;
[[Pràctiques d'introducció a Python . Part 3 - SMX | Estructures repetitives, o bucles, en Python]]&lt;br /&gt;
&lt;br /&gt;
[[Exercicis d'estructures de control repetitives en Python]]&lt;br /&gt;
&lt;br /&gt;
== 20230427 ==&lt;br /&gt;
Seguim amb Python.&lt;br /&gt;
&lt;br /&gt;
[[Pràctiques d'introducció a Python . Part 3 - SMX | Estructures repetitives, o bucles, en Python]]&lt;br /&gt;
&lt;br /&gt;
[[Exercicis d'estructures de control repetitives en Python]]&lt;br /&gt;
== 20230420 ==&lt;br /&gt;
Seguim amb Python.&lt;br /&gt;
&lt;br /&gt;
[[Pràctiques d'introducció a Python . Part 3 - SMX | Estructures repetitives, o bucles, en Python]]&lt;br /&gt;
&lt;br /&gt;
[[Exercicis d'estructures de control repetitives en Python]]&lt;br /&gt;
&lt;br /&gt;
== 20230413 ==&lt;br /&gt;
Seguim amb Python.&lt;br /&gt;
&lt;br /&gt;
[[Pràctiques d'introducció a Python . Part 3 - SMX | Estructures repetitives, o bucles, en Python]]&lt;br /&gt;
&lt;br /&gt;
[[Exercicis d'estructures de control repetitives en Python]]&lt;br /&gt;
=== Exercici del cinema ===&lt;br /&gt;
Primer ho farem amb [https://snap.berkeley.edu/snap/snap.html Snap!]. Després amb [https://app.edublocks.org/ EduBlocks]. Després amb [https://www.onlinegdb.com/ OnlineGDM] i finalment amb el [https://code.visualstudio.com/ VSCode].&lt;br /&gt;
&lt;br /&gt;
A partir de la qualificació d’una pel·lícula i l’edat de l'espectador, indiqueu si aquest pot o no passar.&lt;br /&gt;
&lt;br /&gt;
Qualificacions de les pel·lícules:&lt;br /&gt;
&lt;br /&gt;
'''T'''   –   Tots els públics.&lt;br /&gt;
&lt;br /&gt;
'''M'''  –   Majors de 13 anys.&lt;br /&gt;
&lt;br /&gt;
'''J'''   –   Majors de 16 anys.&lt;br /&gt;
&lt;br /&gt;
'''A'''   –   Majors de 18 anys.&lt;br /&gt;
&lt;br /&gt;
El programa demanarà la lletra que determina la qualificació de la pel·lícula i l’edat de l'espectador per, a continuació, mostrar per pantalla si aquest pot passar a la sala o no.&lt;br /&gt;
&lt;br /&gt;
El programa ha de controlar que la qualificació de la pel·lícula sigui T, M, J o A. Qualsevol altra entrada no serà vàlida.&lt;br /&gt;
&lt;br /&gt;
== 20230330 ==&lt;br /&gt;
Seguim amb Python.&lt;br /&gt;
&lt;br /&gt;
[[Pràctiques d'introducció a Python . Part 3 - SMX | Estructures repetitives, o bucles, en Python]]&lt;br /&gt;
&lt;br /&gt;
[[Exercicis d'estructures de control repetitives en Python]]&lt;br /&gt;
&lt;br /&gt;
== 20230323 ==&lt;br /&gt;
Seguim amb Python.&lt;br /&gt;
&lt;br /&gt;
[[Pràctiques d'introducció a Python . Part 3 - SMX | Estructures repetitives, o bucles, en Python]]&lt;br /&gt;
&lt;br /&gt;
[[Exercicis d'estructures de control repetitives en Python]]&lt;br /&gt;
&lt;br /&gt;
== 20230316 ==&lt;br /&gt;
Seguim amb Python.&lt;br /&gt;
&lt;br /&gt;
[[Pràctiques d'introducció a Python . Part 3 - SMX | Estructures repetitives, o bucles, en Python]]&lt;br /&gt;
&lt;br /&gt;
[[Exercicis d'estructures de control repetitives en Python]]&lt;br /&gt;
&lt;br /&gt;
== 20230302 ==&lt;br /&gt;
Seguim amb Python.&lt;br /&gt;
&lt;br /&gt;
[[Pràctiques d'introducció a Python . Part 2 - SMX | Condicionals en Python]]&lt;br /&gt;
&lt;br /&gt;
[[Exercicis de condicions en Python]]&lt;br /&gt;
&lt;br /&gt;
[[Pràctiques d'introducció a Python . Part 3 - SMX | Estructures repetitives, o bucles, en Python]]&lt;br /&gt;
&lt;br /&gt;
[[Exercicis d'estructures de control repetitives en Python]]&lt;br /&gt;
&lt;br /&gt;
* Nova eina: [https://app.edublocks.org/ edublocks]&lt;br /&gt;
&lt;br /&gt;
== 20230223 ==&lt;br /&gt;
Seguim amb Python.&lt;br /&gt;
&lt;br /&gt;
[[Pràctiques d'introducció a Python . Part 2 - SMX | Condicionals en Python]]&lt;br /&gt;
&lt;br /&gt;
[[Exercicis de condicions en Python]]&lt;br /&gt;
&lt;br /&gt;
[[Pràctiques d'introducció a Python . Part 3 - SMX | Estructures repetitives, o bucles, en Python]]&lt;br /&gt;
&lt;br /&gt;
[[Exercicis d'estructures de control repetitives en Python]]&lt;br /&gt;
&lt;br /&gt;
== 20230216 ==&lt;br /&gt;
Seguim amb Python.&lt;br /&gt;
&lt;br /&gt;
[[Pràctiques d'introducció a Python . Part 2 - SMX | Condicionals en Python]]&lt;br /&gt;
&lt;br /&gt;
[[Exercicis de condicions en Python]]&lt;br /&gt;
&lt;br /&gt;
== 20230209 ==&lt;br /&gt;
Seguim amb Python.&lt;br /&gt;
&lt;br /&gt;
[[Pràctiques d'introducció a Python . Part 2 - SMX | Condicionals en Python]]&lt;br /&gt;
&lt;br /&gt;
[[Exercicis de condicions en Python]]&lt;br /&gt;
&lt;br /&gt;
== 20230202 ==&lt;br /&gt;
Seguim amb Python.&lt;br /&gt;
&lt;br /&gt;
[[Exercicis d'introducció a Python]]&lt;br /&gt;
&lt;br /&gt;
[[Pràctiques d'introducció a Python . Part 2 - SMX | Condicionals en Python]]&lt;br /&gt;
&lt;br /&gt;
[[Exercicis de condicions en Python]]&lt;br /&gt;
&lt;br /&gt;
== 20230126 ==&lt;br /&gt;
Seguim amb Python.&lt;br /&gt;
&lt;br /&gt;
[[Exercicis d'introducció a Python]]&lt;br /&gt;
&lt;br /&gt;
[[Pràctiques d'introducció a Python . Part 2 - SMX | Condicionals en Python]]&lt;br /&gt;
&lt;br /&gt;
[[Exercicis de condicions en Python]]&lt;br /&gt;
&lt;br /&gt;
== 20230119 ==&lt;br /&gt;
Seguim amb Python.&lt;br /&gt;
 / És divisió real&lt;br /&gt;
 // És divisió entera&lt;br /&gt;
 % És el residu de la divisió&lt;br /&gt;
[[Pràctiques d'introducció a Python . Part 2 - SMX | Condicionals amb Python]]&lt;br /&gt;
&lt;br /&gt;
[[Exercicis de condicions en Python]]&lt;br /&gt;
&lt;br /&gt;
== 20230112 ==&lt;br /&gt;
Presentació projectes de Nadal.&lt;br /&gt;
&lt;br /&gt;
Seguim  fent [[Exercicis d'introducció a Python]]&lt;br /&gt;
&lt;br /&gt;
 pes = float(input(&amp;quot;Pes en Kg: &amp;quot;)) # float: real (amb decimals)&lt;br /&gt;
 print(&amp;quot;Pes %f Kg&amp;quot;%pes)&lt;br /&gt;
 print(&amp;quot;Pes amb tres decimals: %.3f Kg&amp;quot;%pes)&lt;br /&gt;
 nom = input(&amp;quot;Nom: &amp;quot;) # string: cadena&lt;br /&gt;
 print(&amp;quot;En %s pesa %.2fKg&amp;quot;%(nom,pes))&lt;br /&gt;
 n = int(input(&amp;quot;Cops per a repetir: &amp;quot;)) # int: enter (sense decimals)&lt;br /&gt;
 print(&amp;quot;Repetit %d cops&amp;quot;%n)&lt;br /&gt;
 for i in range(n):&lt;br /&gt;
    print(&amp;quot;En %s pesa %.2fKg&amp;quot;%(nom,pes))&lt;br /&gt;
&lt;br /&gt;
== 20221212 ==&lt;br /&gt;
Seguim fent el projecte de Nadal&lt;br /&gt;
&lt;br /&gt;
== 20221124 ==&lt;br /&gt;
Seguim fent el projecte de Nadal&lt;br /&gt;
&lt;br /&gt;
== 20221117 ==&lt;br /&gt;
[https://recull.binefa.cat/ Recull de codis fets a classe] usuari / contrasenya : ''smxA'' / ''smxA2223''&lt;br /&gt;
&lt;br /&gt;
[[Exercicis d'introducció a Python]]&lt;br /&gt;
&lt;br /&gt;
[https://snap.berkeley.edu/snap/snap.html Snap! en línia]&lt;br /&gt;
&lt;br /&gt;
== 20221110 ==&lt;br /&gt;
[https://recull.binefa.cat/ Recull de codis fets a classe] usuari / contrasenya : ''smxA'' / ''smxA2223''&lt;br /&gt;
&lt;br /&gt;
[[Exercicis d'introducció a Python]]&lt;br /&gt;
&lt;br /&gt;
== 20221103 ==&lt;br /&gt;
[https://recull.binefa.cat/ Recull de codis fets a classe] usuari / contrasenya : ''smxA'' / ''smxA2223''&lt;br /&gt;
&lt;br /&gt;
[[Pràctiques d'introducció a Python - SMX | Pràctiques d'introducció a Python]]&lt;br /&gt;
&lt;br /&gt;
[[Exercicis d'introducció a Python]]&lt;br /&gt;
&lt;br /&gt;
[https://www.onlinegdb.com/ Eina remota d'interpretació de Python]&lt;br /&gt;
&lt;br /&gt;
 &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
 eip01.py&lt;br /&gt;
 &lt;br /&gt;
 Cognom1 Cognom2, Nom &lt;br /&gt;
 &lt;br /&gt;
 Escriviu un programa que pregunti a l'usuari pel nombre d'hores treballades i el cost per hora. &lt;br /&gt;
 Després ha de mostrar per pantalla la paga que li correspon.&lt;br /&gt;
 &lt;br /&gt;
 20221103&lt;br /&gt;
 &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
 fHores = float(input(&amp;quot;Nombre d'hores treballades: &amp;quot;))&lt;br /&gt;
 # print(&amp;quot;Heu dit que heu treballat %.2f hores&amp;quot;%fHores)&lt;br /&gt;
 fCostPerHora = float(input(&amp;quot;Cost per hora: &amp;quot;))&lt;br /&gt;
 # print(&amp;quot;Heu dit que heu treballat %.2f hores amb un preu per hora de %.2f€&amp;quot;%(fHores,fCostPerHora))&lt;br /&gt;
 print(&amp;quot;Heu de cobrar %.2f€&amp;quot;%(fHores*fCostPerHora))&lt;br /&gt;
&lt;br /&gt;
== 20221027 ==&lt;br /&gt;
[https://recull.binefa.cat/ Recull de codis fets a classe] usuari / contrasenya : ''smxA'' / ''smxA2223''&lt;br /&gt;
&lt;br /&gt;
[[Pràctiques d'introducció a Python - SMX | Pràctiques d'introducció a Python]]&lt;br /&gt;
&lt;br /&gt;
[[Exercicis d'introducció a Python]]&lt;br /&gt;
&lt;br /&gt;
[https://www.onlinegdb.com/ Eina remota d'interpretació de Python]&lt;br /&gt;
&lt;br /&gt;
== 20221020 ==&lt;br /&gt;
[https://recull.binefa.cat/ Recull de codis fets a classe] usuari / contrasenya : ''smxA'' / ''smxA2223''&lt;br /&gt;
&lt;br /&gt;
[[Pràctiques d'introducció a Python - SMX | Pràctiques d'introducció a Python]]&lt;br /&gt;
&lt;br /&gt;
[[Exercicis d'introducció a Python]]&lt;br /&gt;
&lt;br /&gt;
[https://www.onlinegdb.com/ Eina remota d'interpretació de Python]&lt;br /&gt;
&lt;br /&gt;
 &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
 pr03.py&lt;br /&gt;
 Víctor Martorell Millán&lt;br /&gt;
 20221017&lt;br /&gt;
 &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
 print ('Hola SMX2')&lt;br /&gt;
 ciutat = input(&amp;quot;La teva ciutat: &amp;quot;)&lt;br /&gt;
 print (&amp;quot;Has dit que la teva ciutat és &amp;quot; + ciutat)&lt;br /&gt;
 print (&amp;quot;Has dit que la teva ciutat és %s&amp;quot; % ciutat)&lt;br /&gt;
 nDistrictes = input(&amp;quot;Numero de districtes: &amp;quot;)&lt;br /&gt;
 print (&amp;quot;Has dit que la teva ciutat és &amp;quot; + ciutat + &amp;quot; i te &amp;quot;+ nDistrictes + &amp;quot; districtes&amp;quot;)&lt;br /&gt;
 print (&amp;quot;Has dit que la teva ciutat és %s i te %s districtes&amp;quot; %(ciutat,nDistrictes))&lt;br /&gt;
 nD = int(nDistrictes)&lt;br /&gt;
 print (&amp;quot;Has dit que la teva ciutat és %s i te %d districtes&amp;quot; % (ciutat,nD))&lt;br /&gt;
&lt;br /&gt;
== 20221013 ==&lt;br /&gt;
[https://recull.binefa.cat/ Recull de codis fets a classe] usuari / contrasenya : ''smxA'' / ''smxA2223''&lt;br /&gt;
&lt;br /&gt;
[[Pràctiques d'introducció a Python - SMX | Pràctiques d'introducció a Python]]&lt;br /&gt;
&lt;br /&gt;
== 20221006 ==&lt;br /&gt;
[https://meet.google.com/zfu-znep-uos Meet a la primera hora]&lt;br /&gt;
&lt;br /&gt;
[https://recull.binefa.cat/ Recull de codis fets a classe] usuari / contrasenya : ''smxA'' / ''smxA2223''&lt;br /&gt;
&lt;br /&gt;
[https://www.onlinegdb.com/ Eina remota d'interpretació de Python]&lt;br /&gt;
&lt;br /&gt;
=== Instal·lacions de Python i VSCode ===&lt;br /&gt;
[https://www.python.org/downloads/ Descàrrega del llenguatge de programació interpretat '''Python''']. Seleccioneu que voleu inserir la ruta de l'executable al PATH. I si al final de la instal·lació us demana inhabilitar (''disable'') rutes llargues, premeu-hi el botó.&lt;br /&gt;
&lt;br /&gt;
[https://code.visualstudio.com/download Entorn de programació i editor de codis '''VSCode''']&lt;br /&gt;
&lt;br /&gt;
=== Python ===&lt;br /&gt;
Un cop instal·lat obrim el terminal i verifiquem:&lt;br /&gt;
 python --version&lt;br /&gt;
 pip --version&lt;br /&gt;
&lt;br /&gt;
Codi de crida a la calculador a Windows:&lt;br /&gt;
 # segon.py&lt;br /&gt;
 import os&lt;br /&gt;
 &lt;br /&gt;
 print(&amp;quot;Calculadora: &amp;quot;)&lt;br /&gt;
 os.system(&amp;quot;calc&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
[[Pràctiques d'introducció a Python - SMX | Pràctiques d'introducció a Python]]&lt;br /&gt;
&lt;br /&gt;
== 20220922 ==&lt;br /&gt;
[https://recull.binefa.cat/ Recull de codis fets a classe] usuari / contrasenya : ''smxA'' / ''smxA2223''&lt;br /&gt;
&lt;br /&gt;
Codis a desenvolupar:&lt;br /&gt;
 c00: pregunta de nom amb ''resposta''&lt;br /&gt;
 c01: pregunta de nom amb variable ''nom''&lt;br /&gt;
 c02: pregunta de nom amb variable ''nom'' i pregunta l'edat amb variable ''edat''&lt;br /&gt;
 c03: aprofitant c02 diem si és major d'edat o no&lt;br /&gt;
 c04: comptador de 0 a 10&lt;br /&gt;
 c05: aprofitant c04, feu una taula de multiplicar&lt;br /&gt;
 c06: aprofitant c04, dieu si el número del comptador és parell o senar&lt;br /&gt;
&lt;br /&gt;
Deseu-los com a ''.sb'' i captureu-los com a ''.png'' o ''.jpg''&lt;br /&gt;
&lt;br /&gt;
== 20220915 ==&lt;br /&gt;
[https://recull.binefa.cat/ Recull de codis fets a classe] usuari / contrasenya : ''smxA'' / ''smxA2223''&lt;br /&gt;
&lt;br /&gt;
A la carpeta compartida / 20220915:&lt;br /&gt;
 df_p01.png (png o jpg)&lt;br /&gt;
 df_p01.drawio&lt;br /&gt;
 p01.png (png o jpg)&lt;br /&gt;
 p01(22-23).sb&lt;br /&gt;
&lt;br /&gt;
Programació per blocs i digrames de flux.&lt;br /&gt;
&lt;br /&gt;
[[Repàs d'ordres del sistema operatiu GNU/Linux - 1a setmana del curs 2021-2022 | Repàs d'ordres del sistema operatiu GNU/Linux - 1a setmana del curs 2022-2023]]&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Snap! =&lt;br /&gt;
[https://snap.berkeley.edu/snap/snap.html Snap! a snap.berkeley.edu]&lt;br /&gt;
&lt;br /&gt;
[https://snap.berkeley.edu/snap/help/SnapManual.pdf Manual de referència d'Snap!]&lt;br /&gt;
&lt;br /&gt;
= Python =&lt;br /&gt;
[[Pràctiques d'introducció a Python - SMX | Pràctiques d'introducció a Python]]&lt;br /&gt;
&lt;br /&gt;
== Condicionals en Python ==&lt;br /&gt;
[[Pràctiques d'introducció a Python . Part 2 - SMX | Condicionals amb Python]]&lt;br /&gt;
&lt;br /&gt;
[[Exercicis de condicions en Python]]&lt;br /&gt;
&lt;br /&gt;
== Estructures repetitives, o bucles, en Python ==&lt;br /&gt;
&lt;br /&gt;
[[Pràctiques d'introducció a Python . Part 3 - SMX | Estructures repetitives, o bucles, en Python]]&lt;br /&gt;
&lt;br /&gt;
[[Exercicis d'estructures de control repetitives en Python]]&lt;br /&gt;
&lt;br /&gt;
== Instal·lació del Jupyter Lab ==&lt;br /&gt;
[https://jupyter.org/try Prova de Jupyter via web externa]&lt;br /&gt;
&lt;br /&gt;
Instal·lació de Jupyter Lab a la màquina virtual GNU/Linux. Des del terminal:&lt;br /&gt;
 $ su -&lt;br /&gt;
 # apt update&lt;br /&gt;
 # apt install python3-pip&lt;br /&gt;
 # exit&lt;br /&gt;
 $ pip --version&lt;br /&gt;
 $ pip install jupyterlab&lt;br /&gt;
 $ pip install jupyter-c-kernel&lt;br /&gt;
&lt;br /&gt;
Sortiu de la sessió i torneu-hi a entrar. Seguiu amb aquestes ordres:&lt;br /&gt;
&lt;br /&gt;
 $ install_c_kernel --user&lt;br /&gt;
 $ jupyter kernelspec list&lt;br /&gt;
&lt;br /&gt;
Un cop instal·lat s'executa des del terminal:&lt;br /&gt;
 $ jupyter-lab&lt;br /&gt;
&lt;br /&gt;
I apareix el navegador web amb el Jupyter Lab.&lt;br /&gt;
&lt;br /&gt;
= Eines en línia =&lt;br /&gt;
[https://recull.binefa.cat/ Recull de codis fets a classe] usuari / contrasenya : ''smxA'' / ''smxA2526''&lt;br /&gt;
&lt;br /&gt;
[https://app.diagrams.net/ Disseny de diagrames de flux en línia]&lt;br /&gt;
&lt;br /&gt;
[https://scratch.mit.edu/scratch_1.4/ Scratch 1.4]&lt;br /&gt;
&lt;br /&gt;
[https://scratch.mit.edu/projects/editor/ Scratch en línia]&lt;br /&gt;
&lt;br /&gt;
[https://snap.berkeley.edu/ Snap!] o [https://www.binefa.cat/Snap Snap! personalitzat]&lt;br /&gt;
&lt;br /&gt;
[https://www.onlinegdb.com/ Compilador en línia]&lt;br /&gt;
&lt;br /&gt;
[http://www.arduinoblocks.com/ Arduino Blocks]&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
= Enllaços a recursos =&lt;br /&gt;
[[Pràctiques d'introducció a Python - SMX | Pràctiques d'introducció a Python]]&lt;br /&gt;
&lt;br /&gt;
[[Pràctiques d'introducció a Python . Part 2 - SMX | Condicionals amb Python]]&lt;br /&gt;
&lt;br /&gt;
[[Exercicis de condicions en Python]]&lt;br /&gt;
&lt;br /&gt;
[[Pràctiques d'introducció a Python . Part 3 - SMX | Estructures repetitives, o bucles, en Python]]&lt;br /&gt;
&lt;br /&gt;
[[Exercicis d'estructures de control repetitives en Python]]&lt;br /&gt;
&lt;br /&gt;
[[Més exercicis de Python bàsic]]&lt;br /&gt;
&lt;br /&gt;
[[Com fer anar la consola de videojocs iNNEXT a Scratch 1.4]]&lt;br /&gt;
&lt;br /&gt;
[[Com fer anar la consola de videojocs iNNEXT a Snap! 6.2]]&lt;br /&gt;
== Instal·lació del Jupyter Lab ==&lt;br /&gt;
[https://jupyter.org/try Prova de Jupyter via web externa]&lt;br /&gt;
&lt;br /&gt;
Instal·lació de Jupyter Lab a la màquina virtual GNU/Linux. Des del terminal:&lt;br /&gt;
 $ su -&lt;br /&gt;
 # apt update&lt;br /&gt;
 # apt install python3-pip&lt;br /&gt;
 # exit&lt;br /&gt;
 $ pip --version&lt;br /&gt;
 $ pip install jupyterlab&lt;br /&gt;
 $ pip install jupyter-c-kernel&lt;br /&gt;
&lt;br /&gt;
Sortiu de la sessió i torneu-hi a entrar. Seguiu amb aquestes ordres:&lt;br /&gt;
&lt;br /&gt;
 $ install_c_kernel --user&lt;br /&gt;
 $ jupyter kernelspec list&lt;br /&gt;
&lt;br /&gt;
Un cop instal·lat s'executa des del terminal:&lt;br /&gt;
 $ jupyter-lab&lt;br /&gt;
&lt;br /&gt;
I apareix el navegador web amb el Jupyter Lab.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Baixada de programes =&lt;br /&gt;
[https://drive.google.com/drive/folders/1fObr8kPcF7358h3bgKPe_BQT3tyQtiV8?usp=sharing Zona compartida al campus virtual d'FJE]&lt;/div&gt;</summary>
		<author><name>Jordi Binefa</name></author>
		
	</entry>
	<entry>
		<id>https://www.binefa.com/index.php?title=2n_SMX-B_per_dies._Curs_2025-2026&amp;diff=12314</id>
		<title>2n SMX-B per dies. Curs 2025-2026</title>
		<link rel="alternate" type="text/html" href="https://www.binefa.com/index.php?title=2n_SMX-B_per_dies._Curs_2025-2026&amp;diff=12314"/>
		<updated>2026-05-14T13:30:56Z</updated>

		<summary type="html">&lt;p&gt;Jordi Binefa: /* 20260514 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Quan tingueu les credencials d'accés a la [https://clot.fje.edu/ca NET] heu de compartir-nos (als '''dos''' professors) una carpeta amb aquest nom: '''2526-SMX2B-1rCognom2nCognomNom''' (Per exemple, si el vostre nom és Xavier López Pujol --&amp;gt; ''2526-SMX2B-LopezPujolXavier''). A aquest enllaç podreu veure si ja hi sou a la llista:&lt;br /&gt;
&lt;br /&gt;
[[Carpetes compartides 2n d'SMX-B. Curs 2025-2026]]&lt;br /&gt;
= Enllaços ràpids =&lt;br /&gt;
[https://meet.google.com/tbb-qgtn-kxb Teleconferència provisional]&lt;br /&gt;
&lt;br /&gt;
[https://snap.berkeley.edu/snap/snap.html Snap!]&lt;br /&gt;
&lt;br /&gt;
[https://moodle.binefa.cat/ Accés al Moodle de l'espai d'habilitats]&lt;br /&gt;
&lt;br /&gt;
[https://docs.google.com/spreadsheets/d/1UzZ0ZDw8db-kJy153VIByWsCzFTcEcrf3l5RkQToHZE/edit?gid=21653362#gid=21653362 Llista 2n d'SMX-B] &amp;lt;!--&lt;br /&gt;
[https://fje.sharepoint.com/:x:/r/sites/GD_CLOT-FP-CLOT_FP-DptInformatica/Documentos%20compartidos/CLOT_FP-DptInformatica/2526/LLISTES%20ASSIST%C3%88NCIA/Llista%20SMX2B%202526.xlsx?d=w1d246af1dd3b49388ddf705ec81c417f&amp;amp;csf=1&amp;amp;web=1&amp;amp;e=OLzBDF Llista 2n d'SMX-B] --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 20260521 ==&lt;br /&gt;
* Prova epistemològica de TKinter i Python.&lt;br /&gt;
== 20260514 ==&lt;br /&gt;
* Lliurament del projecte de TKinter.&lt;br /&gt;
&lt;br /&gt;
== 20260507 ==&lt;br /&gt;
* Seguim amb el projecte de TKinter.&lt;br /&gt;
&lt;br /&gt;
== 20260430 ==&lt;br /&gt;
* Seguim amb el projecte de TKinter.&lt;br /&gt;
&lt;br /&gt;
== 20260423 ==&lt;br /&gt;
* Seguim amb TKinter. Comencem el projecte de TKinter.&lt;br /&gt;
* [https://aistudio.google.com/api-keys clau API]&lt;br /&gt;
&lt;br /&gt;
== 20260416 ==&lt;br /&gt;
* Seguim amb TKinter&lt;br /&gt;
&lt;br /&gt;
== 20260409 - TKinter ==&lt;br /&gt;
* [https://recull.binefa.cat/files/20260409/ Documentació de TKinter]&lt;br /&gt;
&lt;br /&gt;
== 20260326 ==&lt;br /&gt;
* [https://recull.binefa.cat/files/20260326/Proyecto_1.pdf Projecte 1]&lt;br /&gt;
&lt;br /&gt;
== 20260319 ==&lt;br /&gt;
* Seguim fent Python&lt;br /&gt;
* Exercici d'un menú en Python ([https://recull.binefa.cat/files/20260319_menu/ Exemple de menú]) (Usuari / Contrasenya: smxB / smxB2526 )&lt;br /&gt;
&lt;br /&gt;
== 20260312 ==&lt;br /&gt;
* Seguim fent Python&lt;br /&gt;
&lt;br /&gt;
== 20260305 ==&lt;br /&gt;
* Seguim fent Python&lt;br /&gt;
&lt;br /&gt;
== 20260226 ==&lt;br /&gt;
* Seguim fent Python&lt;br /&gt;
* 2a hora: Prova dew metacognició tipus test&lt;br /&gt;
&lt;br /&gt;
== 20260219 ==&lt;br /&gt;
* Seguim fent Python&lt;br /&gt;
&lt;br /&gt;
== 20260205 ==&lt;br /&gt;
* Seguim fent Python&lt;br /&gt;
&lt;br /&gt;
== 20260129 ==&lt;br /&gt;
* [https://pyscript.com/ pyscript.com]&lt;br /&gt;
* [https://recull.binefa.cat/ Recull d'informació] (usuari: ''smxB'', contrasenya: ''smxB2526'') o a [https://moodle.binefa.cat/ Moodle]&lt;br /&gt;
&lt;br /&gt;
== 20260122 ==&lt;br /&gt;
=== Primer contacte amb Python ===&lt;br /&gt;
* [https://www.python.org/downloads/ Instal·lació de ''Python'' amb ''pip'']&lt;br /&gt;
* [[Pràctiques d'introducció a Python - SMX | Pràctiques d'introducció a Python]]&lt;br /&gt;
* [[Exercicis d'introducció a Python]]&lt;br /&gt;
&lt;br /&gt;
== 20260115 ==&lt;br /&gt;
* Presentació del projecte de Nadal&lt;br /&gt;
&lt;br /&gt;
== 20260108 ==&lt;br /&gt;
* Presentació del projecte de Nadal&lt;br /&gt;
=== Primer contacte amb Python ===&lt;br /&gt;
* [https://www.python.org/downloads/ Instal·lació de ''Python'' amb ''pip'']&lt;br /&gt;
* [[Pràctiques d'introducció a Python - SMX | Pràctiques d'introducció a Python]]&lt;br /&gt;
* [[Exercicis d'introducció a Python]]&lt;br /&gt;
&lt;br /&gt;
== 20251211 ==&lt;br /&gt;
* Seguim amb projecte en Snap!&lt;br /&gt;
&lt;br /&gt;
== 20251204 ==&lt;br /&gt;
* Seguim amb projecte en Snap!&lt;br /&gt;
&lt;br /&gt;
== 20251113 ==&lt;br /&gt;
* Examen&lt;br /&gt;
* Projecte en Snap!&lt;br /&gt;
&lt;br /&gt;
== 20251106 ==&lt;br /&gt;
Blocs en Snap!&lt;br /&gt;
&lt;br /&gt;
== 20251023 ==&lt;br /&gt;
Seguim amb Snap!&lt;br /&gt;
&lt;br /&gt;
* [https://snap.berkeley.edu/snap/snap.html#present:Username=jordibinefa&amp;amp;ProjectName=carreraCamells Exemple de cursa de camells]&lt;br /&gt;
* Fem [https://moodle.binefa.cat/pluginfile.php/780/mod_resource/content/6/practica%204.pdf pràctica 4 del Moodle] ([https://snap.berkeley.edu/snap/snap.html#present:Username=jordibinefa&amp;amp;ProjectName=taur%C3%B3Ping%C3%BC%C3%AD_00 Un exemple no finalitzat])&lt;br /&gt;
&lt;br /&gt;
== 20251016 ==&lt;br /&gt;
Seguim amb Snap!&lt;br /&gt;
&lt;br /&gt;
[https://recull.binefa.cat/files/20251016/ 5 camells de colors en format svg]&lt;br /&gt;
&lt;br /&gt;
== 20251009 ==&lt;br /&gt;
Seguim amb Snap!&lt;br /&gt;
&lt;br /&gt;
== 20251002 ==&lt;br /&gt;
Seguim amb Snap!&lt;br /&gt;
&lt;br /&gt;
== 20250925 ==&lt;br /&gt;
Seguim amb Snap!&lt;br /&gt;
&lt;br /&gt;
== 20250918 ==&lt;br /&gt;
[https://recull.binefa.cat/ Recull d'informació] (usuari: ''smxB'', contrasenya: ''smxB2526'')&lt;br /&gt;
&lt;br /&gt;
[https://snap.berkeley.edu/snap/snap.html Snap!]&lt;br /&gt;
&lt;br /&gt;
[https://gamifi.cat/docs/cs/snapguia.pdf Guia d'Snap!]&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
[https://docs.google.com/spreadsheets/d/16UHsIGuWNz3jo7g-LzVnMKPfv6thKUpyEowaZCUMyng/edit#gid=1118263977 Llista de 2n d'SMX-A]&lt;br /&gt;
== 20230511 ==&lt;br /&gt;
Seguim amb Python.&lt;br /&gt;
&lt;br /&gt;
[[Pràctiques d'introducció a Python . Part 3 - SMX | Estructures repetitives, o bucles, en Python]]&lt;br /&gt;
&lt;br /&gt;
[[Exercicis d'estructures de control repetitives en Python]]&lt;br /&gt;
== 20230504 ==&lt;br /&gt;
Seguim amb Python.&lt;br /&gt;
&lt;br /&gt;
[[Pràctiques d'introducció a Python . Part 3 - SMX | Estructures repetitives, o bucles, en Python]]&lt;br /&gt;
&lt;br /&gt;
[[Exercicis d'estructures de control repetitives en Python]]&lt;br /&gt;
&lt;br /&gt;
== 20230427 ==&lt;br /&gt;
Seguim amb Python.&lt;br /&gt;
&lt;br /&gt;
[[Pràctiques d'introducció a Python . Part 3 - SMX | Estructures repetitives, o bucles, en Python]]&lt;br /&gt;
&lt;br /&gt;
[[Exercicis d'estructures de control repetitives en Python]]&lt;br /&gt;
== 20230420 ==&lt;br /&gt;
Seguim amb Python.&lt;br /&gt;
&lt;br /&gt;
[[Pràctiques d'introducció a Python . Part 3 - SMX | Estructures repetitives, o bucles, en Python]]&lt;br /&gt;
&lt;br /&gt;
[[Exercicis d'estructures de control repetitives en Python]]&lt;br /&gt;
&lt;br /&gt;
== 20230413 ==&lt;br /&gt;
Seguim amb Python.&lt;br /&gt;
&lt;br /&gt;
[[Pràctiques d'introducció a Python . Part 3 - SMX | Estructures repetitives, o bucles, en Python]]&lt;br /&gt;
&lt;br /&gt;
[[Exercicis d'estructures de control repetitives en Python]]&lt;br /&gt;
=== Exercici del cinema ===&lt;br /&gt;
Primer ho farem amb [https://snap.berkeley.edu/snap/snap.html Snap!]. Després amb [https://app.edublocks.org/ EduBlocks]. Després amb [https://www.onlinegdb.com/ OnlineGDM] i finalment amb el [https://code.visualstudio.com/ VSCode].&lt;br /&gt;
&lt;br /&gt;
A partir de la qualificació d’una pel·lícula i l’edat de l'espectador, indiqueu si aquest pot o no passar.&lt;br /&gt;
&lt;br /&gt;
Qualificacions de les pel·lícules:&lt;br /&gt;
&lt;br /&gt;
'''T'''   –   Tots els públics.&lt;br /&gt;
&lt;br /&gt;
'''M'''  –   Majors de 13 anys.&lt;br /&gt;
&lt;br /&gt;
'''J'''   –   Majors de 16 anys.&lt;br /&gt;
&lt;br /&gt;
'''A'''   –   Majors de 18 anys.&lt;br /&gt;
&lt;br /&gt;
El programa demanarà la lletra que determina la qualificació de la pel·lícula i l’edat de l'espectador per, a continuació, mostrar per pantalla si aquest pot passar a la sala o no.&lt;br /&gt;
&lt;br /&gt;
El programa ha de controlar que la qualificació de la pel·lícula sigui T, M, J o A. Qualsevol altra entrada no serà vàlida.&lt;br /&gt;
&lt;br /&gt;
== 20230330 ==&lt;br /&gt;
Seguim amb Python.&lt;br /&gt;
&lt;br /&gt;
[[Pràctiques d'introducció a Python . Part 3 - SMX | Estructures repetitives, o bucles, en Python]]&lt;br /&gt;
&lt;br /&gt;
[[Exercicis d'estructures de control repetitives en Python]]&lt;br /&gt;
&lt;br /&gt;
== 20230323 ==&lt;br /&gt;
Seguim amb Python.&lt;br /&gt;
&lt;br /&gt;
[[Pràctiques d'introducció a Python . Part 3 - SMX | Estructures repetitives, o bucles, en Python]]&lt;br /&gt;
&lt;br /&gt;
[[Exercicis d'estructures de control repetitives en Python]]&lt;br /&gt;
&lt;br /&gt;
== 20230316 ==&lt;br /&gt;
Seguim amb Python.&lt;br /&gt;
&lt;br /&gt;
[[Pràctiques d'introducció a Python . Part 3 - SMX | Estructures repetitives, o bucles, en Python]]&lt;br /&gt;
&lt;br /&gt;
[[Exercicis d'estructures de control repetitives en Python]]&lt;br /&gt;
&lt;br /&gt;
== 20230302 ==&lt;br /&gt;
Seguim amb Python.&lt;br /&gt;
&lt;br /&gt;
[[Pràctiques d'introducció a Python . Part 2 - SMX | Condicionals en Python]]&lt;br /&gt;
&lt;br /&gt;
[[Exercicis de condicions en Python]]&lt;br /&gt;
&lt;br /&gt;
[[Pràctiques d'introducció a Python . Part 3 - SMX | Estructures repetitives, o bucles, en Python]]&lt;br /&gt;
&lt;br /&gt;
[[Exercicis d'estructures de control repetitives en Python]]&lt;br /&gt;
&lt;br /&gt;
* Nova eina: [https://app.edublocks.org/ edublocks]&lt;br /&gt;
&lt;br /&gt;
== 20230223 ==&lt;br /&gt;
Seguim amb Python.&lt;br /&gt;
&lt;br /&gt;
[[Pràctiques d'introducció a Python . Part 2 - SMX | Condicionals en Python]]&lt;br /&gt;
&lt;br /&gt;
[[Exercicis de condicions en Python]]&lt;br /&gt;
&lt;br /&gt;
[[Pràctiques d'introducció a Python . Part 3 - SMX | Estructures repetitives, o bucles, en Python]]&lt;br /&gt;
&lt;br /&gt;
[[Exercicis d'estructures de control repetitives en Python]]&lt;br /&gt;
&lt;br /&gt;
== 20230216 ==&lt;br /&gt;
Seguim amb Python.&lt;br /&gt;
&lt;br /&gt;
[[Pràctiques d'introducció a Python . Part 2 - SMX | Condicionals en Python]]&lt;br /&gt;
&lt;br /&gt;
[[Exercicis de condicions en Python]]&lt;br /&gt;
&lt;br /&gt;
== 20230209 ==&lt;br /&gt;
Seguim amb Python.&lt;br /&gt;
&lt;br /&gt;
[[Pràctiques d'introducció a Python . Part 2 - SMX | Condicionals en Python]]&lt;br /&gt;
&lt;br /&gt;
[[Exercicis de condicions en Python]]&lt;br /&gt;
&lt;br /&gt;
== 20230202 ==&lt;br /&gt;
Seguim amb Python.&lt;br /&gt;
&lt;br /&gt;
[[Exercicis d'introducció a Python]]&lt;br /&gt;
&lt;br /&gt;
[[Pràctiques d'introducció a Python . Part 2 - SMX | Condicionals en Python]]&lt;br /&gt;
&lt;br /&gt;
[[Exercicis de condicions en Python]]&lt;br /&gt;
&lt;br /&gt;
== 20230126 ==&lt;br /&gt;
Seguim amb Python.&lt;br /&gt;
&lt;br /&gt;
[[Exercicis d'introducció a Python]]&lt;br /&gt;
&lt;br /&gt;
[[Pràctiques d'introducció a Python . Part 2 - SMX | Condicionals en Python]]&lt;br /&gt;
&lt;br /&gt;
[[Exercicis de condicions en Python]]&lt;br /&gt;
&lt;br /&gt;
== 20230119 ==&lt;br /&gt;
Seguim amb Python.&lt;br /&gt;
 / És divisió real&lt;br /&gt;
 // És divisió entera&lt;br /&gt;
 % És el residu de la divisió&lt;br /&gt;
[[Pràctiques d'introducció a Python . Part 2 - SMX | Condicionals amb Python]]&lt;br /&gt;
&lt;br /&gt;
[[Exercicis de condicions en Python]]&lt;br /&gt;
&lt;br /&gt;
== 20230112 ==&lt;br /&gt;
Presentació projectes de Nadal.&lt;br /&gt;
&lt;br /&gt;
Seguim  fent [[Exercicis d'introducció a Python]]&lt;br /&gt;
&lt;br /&gt;
 pes = float(input(&amp;quot;Pes en Kg: &amp;quot;)) # float: real (amb decimals)&lt;br /&gt;
 print(&amp;quot;Pes %f Kg&amp;quot;%pes)&lt;br /&gt;
 print(&amp;quot;Pes amb tres decimals: %.3f Kg&amp;quot;%pes)&lt;br /&gt;
 nom = input(&amp;quot;Nom: &amp;quot;) # string: cadena&lt;br /&gt;
 print(&amp;quot;En %s pesa %.2fKg&amp;quot;%(nom,pes))&lt;br /&gt;
 n = int(input(&amp;quot;Cops per a repetir: &amp;quot;)) # int: enter (sense decimals)&lt;br /&gt;
 print(&amp;quot;Repetit %d cops&amp;quot;%n)&lt;br /&gt;
 for i in range(n):&lt;br /&gt;
    print(&amp;quot;En %s pesa %.2fKg&amp;quot;%(nom,pes))&lt;br /&gt;
&lt;br /&gt;
== 20221212 ==&lt;br /&gt;
Seguim fent el projecte de Nadal&lt;br /&gt;
&lt;br /&gt;
== 20221124 ==&lt;br /&gt;
Seguim fent el projecte de Nadal&lt;br /&gt;
&lt;br /&gt;
== 20221117 ==&lt;br /&gt;
[https://recull.binefa.cat/ Recull de codis fets a classe] usuari / contrasenya : ''smxA'' / ''smxA2223''&lt;br /&gt;
&lt;br /&gt;
[[Exercicis d'introducció a Python]]&lt;br /&gt;
&lt;br /&gt;
[https://snap.berkeley.edu/snap/snap.html Snap! en línia]&lt;br /&gt;
&lt;br /&gt;
== 20221110 ==&lt;br /&gt;
[https://recull.binefa.cat/ Recull de codis fets a classe] usuari / contrasenya : ''smxA'' / ''smxA2223''&lt;br /&gt;
&lt;br /&gt;
[[Exercicis d'introducció a Python]]&lt;br /&gt;
&lt;br /&gt;
== 20221103 ==&lt;br /&gt;
[https://recull.binefa.cat/ Recull de codis fets a classe] usuari / contrasenya : ''smxA'' / ''smxA2223''&lt;br /&gt;
&lt;br /&gt;
[[Pràctiques d'introducció a Python - SMX | Pràctiques d'introducció a Python]]&lt;br /&gt;
&lt;br /&gt;
[[Exercicis d'introducció a Python]]&lt;br /&gt;
&lt;br /&gt;
[https://www.onlinegdb.com/ Eina remota d'interpretació de Python]&lt;br /&gt;
&lt;br /&gt;
 &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
 eip01.py&lt;br /&gt;
 &lt;br /&gt;
 Cognom1 Cognom2, Nom &lt;br /&gt;
 &lt;br /&gt;
 Escriviu un programa que pregunti a l'usuari pel nombre d'hores treballades i el cost per hora. &lt;br /&gt;
 Després ha de mostrar per pantalla la paga que li correspon.&lt;br /&gt;
 &lt;br /&gt;
 20221103&lt;br /&gt;
 &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
 fHores = float(input(&amp;quot;Nombre d'hores treballades: &amp;quot;))&lt;br /&gt;
 # print(&amp;quot;Heu dit que heu treballat %.2f hores&amp;quot;%fHores)&lt;br /&gt;
 fCostPerHora = float(input(&amp;quot;Cost per hora: &amp;quot;))&lt;br /&gt;
 # print(&amp;quot;Heu dit que heu treballat %.2f hores amb un preu per hora de %.2f€&amp;quot;%(fHores,fCostPerHora))&lt;br /&gt;
 print(&amp;quot;Heu de cobrar %.2f€&amp;quot;%(fHores*fCostPerHora))&lt;br /&gt;
&lt;br /&gt;
== 20221027 ==&lt;br /&gt;
[https://recull.binefa.cat/ Recull de codis fets a classe] usuari / contrasenya : ''smxA'' / ''smxA2223''&lt;br /&gt;
&lt;br /&gt;
[[Pràctiques d'introducció a Python - SMX | Pràctiques d'introducció a Python]]&lt;br /&gt;
&lt;br /&gt;
[[Exercicis d'introducció a Python]]&lt;br /&gt;
&lt;br /&gt;
[https://www.onlinegdb.com/ Eina remota d'interpretació de Python]&lt;br /&gt;
&lt;br /&gt;
== 20221020 ==&lt;br /&gt;
[https://recull.binefa.cat/ Recull de codis fets a classe] usuari / contrasenya : ''smxA'' / ''smxA2223''&lt;br /&gt;
&lt;br /&gt;
[[Pràctiques d'introducció a Python - SMX | Pràctiques d'introducció a Python]]&lt;br /&gt;
&lt;br /&gt;
[[Exercicis d'introducció a Python]]&lt;br /&gt;
&lt;br /&gt;
[https://www.onlinegdb.com/ Eina remota d'interpretació de Python]&lt;br /&gt;
&lt;br /&gt;
 &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
 pr03.py&lt;br /&gt;
 Víctor Martorell Millán&lt;br /&gt;
 20221017&lt;br /&gt;
 &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
 print ('Hola SMX2')&lt;br /&gt;
 ciutat = input(&amp;quot;La teva ciutat: &amp;quot;)&lt;br /&gt;
 print (&amp;quot;Has dit que la teva ciutat és &amp;quot; + ciutat)&lt;br /&gt;
 print (&amp;quot;Has dit que la teva ciutat és %s&amp;quot; % ciutat)&lt;br /&gt;
 nDistrictes = input(&amp;quot;Numero de districtes: &amp;quot;)&lt;br /&gt;
 print (&amp;quot;Has dit que la teva ciutat és &amp;quot; + ciutat + &amp;quot; i te &amp;quot;+ nDistrictes + &amp;quot; districtes&amp;quot;)&lt;br /&gt;
 print (&amp;quot;Has dit que la teva ciutat és %s i te %s districtes&amp;quot; %(ciutat,nDistrictes))&lt;br /&gt;
 nD = int(nDistrictes)&lt;br /&gt;
 print (&amp;quot;Has dit que la teva ciutat és %s i te %d districtes&amp;quot; % (ciutat,nD))&lt;br /&gt;
&lt;br /&gt;
== 20221013 ==&lt;br /&gt;
[https://recull.binefa.cat/ Recull de codis fets a classe] usuari / contrasenya : ''smxA'' / ''smxA2223''&lt;br /&gt;
&lt;br /&gt;
[[Pràctiques d'introducció a Python - SMX | Pràctiques d'introducció a Python]]&lt;br /&gt;
&lt;br /&gt;
== 20221006 ==&lt;br /&gt;
[https://meet.google.com/zfu-znep-uos Meet a la primera hora]&lt;br /&gt;
&lt;br /&gt;
[https://recull.binefa.cat/ Recull de codis fets a classe] usuari / contrasenya : ''smxA'' / ''smxA2223''&lt;br /&gt;
&lt;br /&gt;
[https://www.onlinegdb.com/ Eina remota d'interpretació de Python]&lt;br /&gt;
&lt;br /&gt;
=== Instal·lacions de Python i VSCode ===&lt;br /&gt;
[https://www.python.org/downloads/ Descàrrega del llenguatge de programació interpretat '''Python''']. Seleccioneu que voleu inserir la ruta de l'executable al PATH. I si al final de la instal·lació us demana inhabilitar (''disable'') rutes llargues, premeu-hi el botó.&lt;br /&gt;
&lt;br /&gt;
[https://code.visualstudio.com/download Entorn de programació i editor de codis '''VSCode''']&lt;br /&gt;
&lt;br /&gt;
=== Python ===&lt;br /&gt;
Un cop instal·lat obrim el terminal i verifiquem:&lt;br /&gt;
 python --version&lt;br /&gt;
 pip --version&lt;br /&gt;
&lt;br /&gt;
Codi de crida a la calculador a Windows:&lt;br /&gt;
 # segon.py&lt;br /&gt;
 import os&lt;br /&gt;
 &lt;br /&gt;
 print(&amp;quot;Calculadora: &amp;quot;)&lt;br /&gt;
 os.system(&amp;quot;calc&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
[[Pràctiques d'introducció a Python - SMX | Pràctiques d'introducció a Python]]&lt;br /&gt;
&lt;br /&gt;
== 20220922 ==&lt;br /&gt;
[https://recull.binefa.cat/ Recull de codis fets a classe] usuari / contrasenya : ''smxA'' / ''smxA2223''&lt;br /&gt;
&lt;br /&gt;
Codis a desenvolupar:&lt;br /&gt;
 c00: pregunta de nom amb ''resposta''&lt;br /&gt;
 c01: pregunta de nom amb variable ''nom''&lt;br /&gt;
 c02: pregunta de nom amb variable ''nom'' i pregunta l'edat amb variable ''edat''&lt;br /&gt;
 c03: aprofitant c02 diem si és major d'edat o no&lt;br /&gt;
 c04: comptador de 0 a 10&lt;br /&gt;
 c05: aprofitant c04, feu una taula de multiplicar&lt;br /&gt;
 c06: aprofitant c04, dieu si el número del comptador és parell o senar&lt;br /&gt;
&lt;br /&gt;
Deseu-los com a ''.sb'' i captureu-los com a ''.png'' o ''.jpg''&lt;br /&gt;
&lt;br /&gt;
== 20220915 ==&lt;br /&gt;
[https://recull.binefa.cat/ Recull de codis fets a classe] usuari / contrasenya : ''smxA'' / ''smxA2223''&lt;br /&gt;
&lt;br /&gt;
A la carpeta compartida / 20220915:&lt;br /&gt;
 df_p01.png (png o jpg)&lt;br /&gt;
 df_p01.drawio&lt;br /&gt;
 p01.png (png o jpg)&lt;br /&gt;
 p01(22-23).sb&lt;br /&gt;
&lt;br /&gt;
Programació per blocs i digrames de flux.&lt;br /&gt;
&lt;br /&gt;
[[Repàs d'ordres del sistema operatiu GNU/Linux - 1a setmana del curs 2021-2022 | Repàs d'ordres del sistema operatiu GNU/Linux - 1a setmana del curs 2022-2023]]&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Snap! =&lt;br /&gt;
[https://snap.berkeley.edu/snap/snap.html Snap! a snap.berkeley.edu]&lt;br /&gt;
&lt;br /&gt;
[https://snap.berkeley.edu/snap/help/SnapManual.pdf Manual de referència d'Snap!]&lt;br /&gt;
&lt;br /&gt;
= Python =&lt;br /&gt;
[[Pràctiques d'introducció a Python - SMX | Pràctiques d'introducció a Python]]&lt;br /&gt;
&lt;br /&gt;
== Condicionals en Python ==&lt;br /&gt;
[[Pràctiques d'introducció a Python . Part 2 - SMX | Condicionals amb Python]]&lt;br /&gt;
&lt;br /&gt;
[[Exercicis de condicions en Python]]&lt;br /&gt;
&lt;br /&gt;
== Estructures repetitives, o bucles, en Python ==&lt;br /&gt;
&lt;br /&gt;
[[Pràctiques d'introducció a Python . Part 3 - SMX | Estructures repetitives, o bucles, en Python]]&lt;br /&gt;
&lt;br /&gt;
[[Exercicis d'estructures de control repetitives en Python]]&lt;br /&gt;
&lt;br /&gt;
== Instal·lació del Jupyter Lab ==&lt;br /&gt;
[https://jupyter.org/try Prova de Jupyter via web externa]&lt;br /&gt;
&lt;br /&gt;
Instal·lació de Jupyter Lab a la màquina virtual GNU/Linux. Des del terminal:&lt;br /&gt;
 $ su -&lt;br /&gt;
 # apt update&lt;br /&gt;
 # apt install python3-pip&lt;br /&gt;
 # exit&lt;br /&gt;
 $ pip --version&lt;br /&gt;
 $ pip install jupyterlab&lt;br /&gt;
 $ pip install jupyter-c-kernel&lt;br /&gt;
&lt;br /&gt;
Sortiu de la sessió i torneu-hi a entrar. Seguiu amb aquestes ordres:&lt;br /&gt;
&lt;br /&gt;
 $ install_c_kernel --user&lt;br /&gt;
 $ jupyter kernelspec list&lt;br /&gt;
&lt;br /&gt;
Un cop instal·lat s'executa des del terminal:&lt;br /&gt;
 $ jupyter-lab&lt;br /&gt;
&lt;br /&gt;
I apareix el navegador web amb el Jupyter Lab.&lt;br /&gt;
&lt;br /&gt;
= Eines en línia =&lt;br /&gt;
[https://recull.binefa.cat/ Recull de codis fets a classe] usuari / contrasenya : ''smxB'' / ''smxB2526''&lt;br /&gt;
&lt;br /&gt;
[https://app.diagrams.net/ Disseny de diagrames de flux en línia]&lt;br /&gt;
&lt;br /&gt;
[https://scratch.mit.edu/scratch_1.4/ Scratch 1.4]&lt;br /&gt;
&lt;br /&gt;
[https://scratch.mit.edu/projects/editor/ Scratch en línia]&lt;br /&gt;
&lt;br /&gt;
[https://snap.berkeley.edu/ Snap!] o [https://www.binefa.cat/Snap Snap! personalitzat]&lt;br /&gt;
&lt;br /&gt;
[https://www.onlinegdb.com/ Compilador en línia]&lt;br /&gt;
&lt;br /&gt;
[http://www.arduinoblocks.com/ Arduino Blocks]&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
= Enllaços a recursos =&lt;br /&gt;
[[Pràctiques d'introducció a Python - SMX | Pràctiques d'introducció a Python]]&lt;br /&gt;
&lt;br /&gt;
[[Pràctiques d'introducció a Python . Part 2 - SMX | Condicionals amb Python]]&lt;br /&gt;
&lt;br /&gt;
[[Exercicis de condicions en Python]]&lt;br /&gt;
&lt;br /&gt;
[[Pràctiques d'introducció a Python . Part 3 - SMX | Estructures repetitives, o bucles, en Python]]&lt;br /&gt;
&lt;br /&gt;
[[Exercicis d'estructures de control repetitives en Python]]&lt;br /&gt;
&lt;br /&gt;
[[Més exercicis de Python bàsic]]&lt;br /&gt;
&lt;br /&gt;
[[Com fer anar la consola de videojocs iNNEXT a Scratch 1.4]]&lt;br /&gt;
&lt;br /&gt;
[[Com fer anar la consola de videojocs iNNEXT a Snap! 6.2]]&lt;br /&gt;
== Instal·lació del Jupyter Lab ==&lt;br /&gt;
[https://jupyter.org/try Prova de Jupyter via web externa]&lt;br /&gt;
&lt;br /&gt;
Instal·lació de Jupyter Lab a la màquina virtual GNU/Linux. Des del terminal:&lt;br /&gt;
 $ su -&lt;br /&gt;
 # apt update&lt;br /&gt;
 # apt install python3-pip&lt;br /&gt;
 # exit&lt;br /&gt;
 $ pip --version&lt;br /&gt;
 $ pip install jupyterlab&lt;br /&gt;
 $ pip install jupyter-c-kernel&lt;br /&gt;
&lt;br /&gt;
Sortiu de la sessió i torneu-hi a entrar. Seguiu amb aquestes ordres:&lt;br /&gt;
&lt;br /&gt;
 $ install_c_kernel --user&lt;br /&gt;
 $ jupyter kernelspec list&lt;br /&gt;
&lt;br /&gt;
Un cop instal·lat s'executa des del terminal:&lt;br /&gt;
 $ jupyter-lab&lt;br /&gt;
&lt;br /&gt;
I apareix el navegador web amb el Jupyter Lab.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Baixada de programes =&lt;br /&gt;
[https://drive.google.com/drive/folders/1fObr8kPcF7358h3bgKPe_BQT3tyQtiV8?usp=sharing Zona compartida al campus virtual d'FJE]&lt;/div&gt;</summary>
		<author><name>Jordi Binefa</name></author>
		
	</entry>
	<entry>
		<id>https://www.binefa.com/index.php?title=2n_SMX-B_per_dies._Curs_2025-2026&amp;diff=12313</id>
		<title>2n SMX-B per dies. Curs 2025-2026</title>
		<link rel="alternate" type="text/html" href="https://www.binefa.com/index.php?title=2n_SMX-B_per_dies._Curs_2025-2026&amp;diff=12313"/>
		<updated>2026-05-14T13:30:04Z</updated>

		<summary type="html">&lt;p&gt;Jordi Binefa: /* 20260514 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Quan tingueu les credencials d'accés a la [https://clot.fje.edu/ca NET] heu de compartir-nos (als '''dos''' professors) una carpeta amb aquest nom: '''2526-SMX2B-1rCognom2nCognomNom''' (Per exemple, si el vostre nom és Xavier López Pujol --&amp;gt; ''2526-SMX2B-LopezPujolXavier''). A aquest enllaç podreu veure si ja hi sou a la llista:&lt;br /&gt;
&lt;br /&gt;
[[Carpetes compartides 2n d'SMX-B. Curs 2025-2026]]&lt;br /&gt;
= Enllaços ràpids =&lt;br /&gt;
[https://meet.google.com/tbb-qgtn-kxb Teleconferència provisional]&lt;br /&gt;
&lt;br /&gt;
[https://snap.berkeley.edu/snap/snap.html Snap!]&lt;br /&gt;
&lt;br /&gt;
[https://moodle.binefa.cat/ Accés al Moodle de l'espai d'habilitats]&lt;br /&gt;
&lt;br /&gt;
[https://docs.google.com/spreadsheets/d/1UzZ0ZDw8db-kJy153VIByWsCzFTcEcrf3l5RkQToHZE/edit?gid=21653362#gid=21653362 Llista 2n d'SMX-B] &amp;lt;!--&lt;br /&gt;
[https://fje.sharepoint.com/:x:/r/sites/GD_CLOT-FP-CLOT_FP-DptInformatica/Documentos%20compartidos/CLOT_FP-DptInformatica/2526/LLISTES%20ASSIST%C3%88NCIA/Llista%20SMX2B%202526.xlsx?d=w1d246af1dd3b49388ddf705ec81c417f&amp;amp;csf=1&amp;amp;web=1&amp;amp;e=OLzBDF Llista 2n d'SMX-B] --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 20260514 ==&lt;br /&gt;
* Lliurament del projecte de TKinter.&lt;br /&gt;
&lt;br /&gt;
== 20260507 ==&lt;br /&gt;
* Seguim amb el projecte de TKinter.&lt;br /&gt;
&lt;br /&gt;
== 20260430 ==&lt;br /&gt;
* Seguim amb el projecte de TKinter.&lt;br /&gt;
&lt;br /&gt;
== 20260423 ==&lt;br /&gt;
* Seguim amb TKinter. Comencem el projecte de TKinter.&lt;br /&gt;
* [https://aistudio.google.com/api-keys clau API]&lt;br /&gt;
&lt;br /&gt;
== 20260416 ==&lt;br /&gt;
* Seguim amb TKinter&lt;br /&gt;
&lt;br /&gt;
== 20260409 - TKinter ==&lt;br /&gt;
* [https://recull.binefa.cat/files/20260409/ Documentació de TKinter]&lt;br /&gt;
&lt;br /&gt;
== 20260326 ==&lt;br /&gt;
* [https://recull.binefa.cat/files/20260326/Proyecto_1.pdf Projecte 1]&lt;br /&gt;
&lt;br /&gt;
== 20260319 ==&lt;br /&gt;
* Seguim fent Python&lt;br /&gt;
* Exercici d'un menú en Python ([https://recull.binefa.cat/files/20260319_menu/ Exemple de menú]) (Usuari / Contrasenya: smxB / smxB2526 )&lt;br /&gt;
&lt;br /&gt;
== 20260312 ==&lt;br /&gt;
* Seguim fent Python&lt;br /&gt;
&lt;br /&gt;
== 20260305 ==&lt;br /&gt;
* Seguim fent Python&lt;br /&gt;
&lt;br /&gt;
== 20260226 ==&lt;br /&gt;
* Seguim fent Python&lt;br /&gt;
* 2a hora: Prova dew metacognició tipus test&lt;br /&gt;
&lt;br /&gt;
== 20260219 ==&lt;br /&gt;
* Seguim fent Python&lt;br /&gt;
&lt;br /&gt;
== 20260205 ==&lt;br /&gt;
* Seguim fent Python&lt;br /&gt;
&lt;br /&gt;
== 20260129 ==&lt;br /&gt;
* [https://pyscript.com/ pyscript.com]&lt;br /&gt;
* [https://recull.binefa.cat/ Recull d'informació] (usuari: ''smxB'', contrasenya: ''smxB2526'') o a [https://moodle.binefa.cat/ Moodle]&lt;br /&gt;
&lt;br /&gt;
== 20260122 ==&lt;br /&gt;
=== Primer contacte amb Python ===&lt;br /&gt;
* [https://www.python.org/downloads/ Instal·lació de ''Python'' amb ''pip'']&lt;br /&gt;
* [[Pràctiques d'introducció a Python - SMX | Pràctiques d'introducció a Python]]&lt;br /&gt;
* [[Exercicis d'introducció a Python]]&lt;br /&gt;
&lt;br /&gt;
== 20260115 ==&lt;br /&gt;
* Presentació del projecte de Nadal&lt;br /&gt;
&lt;br /&gt;
== 20260108 ==&lt;br /&gt;
* Presentació del projecte de Nadal&lt;br /&gt;
=== Primer contacte amb Python ===&lt;br /&gt;
* [https://www.python.org/downloads/ Instal·lació de ''Python'' amb ''pip'']&lt;br /&gt;
* [[Pràctiques d'introducció a Python - SMX | Pràctiques d'introducció a Python]]&lt;br /&gt;
* [[Exercicis d'introducció a Python]]&lt;br /&gt;
&lt;br /&gt;
== 20251211 ==&lt;br /&gt;
* Seguim amb projecte en Snap!&lt;br /&gt;
&lt;br /&gt;
== 20251204 ==&lt;br /&gt;
* Seguim amb projecte en Snap!&lt;br /&gt;
&lt;br /&gt;
== 20251113 ==&lt;br /&gt;
* Examen&lt;br /&gt;
* Projecte en Snap!&lt;br /&gt;
&lt;br /&gt;
== 20251106 ==&lt;br /&gt;
Blocs en Snap!&lt;br /&gt;
&lt;br /&gt;
== 20251023 ==&lt;br /&gt;
Seguim amb Snap!&lt;br /&gt;
&lt;br /&gt;
* [https://snap.berkeley.edu/snap/snap.html#present:Username=jordibinefa&amp;amp;ProjectName=carreraCamells Exemple de cursa de camells]&lt;br /&gt;
* Fem [https://moodle.binefa.cat/pluginfile.php/780/mod_resource/content/6/practica%204.pdf pràctica 4 del Moodle] ([https://snap.berkeley.edu/snap/snap.html#present:Username=jordibinefa&amp;amp;ProjectName=taur%C3%B3Ping%C3%BC%C3%AD_00 Un exemple no finalitzat])&lt;br /&gt;
&lt;br /&gt;
== 20251016 ==&lt;br /&gt;
Seguim amb Snap!&lt;br /&gt;
&lt;br /&gt;
[https://recull.binefa.cat/files/20251016/ 5 camells de colors en format svg]&lt;br /&gt;
&lt;br /&gt;
== 20251009 ==&lt;br /&gt;
Seguim amb Snap!&lt;br /&gt;
&lt;br /&gt;
== 20251002 ==&lt;br /&gt;
Seguim amb Snap!&lt;br /&gt;
&lt;br /&gt;
== 20250925 ==&lt;br /&gt;
Seguim amb Snap!&lt;br /&gt;
&lt;br /&gt;
== 20250918 ==&lt;br /&gt;
[https://recull.binefa.cat/ Recull d'informació] (usuari: ''smxB'', contrasenya: ''smxB2526'')&lt;br /&gt;
&lt;br /&gt;
[https://snap.berkeley.edu/snap/snap.html Snap!]&lt;br /&gt;
&lt;br /&gt;
[https://gamifi.cat/docs/cs/snapguia.pdf Guia d'Snap!]&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
[https://docs.google.com/spreadsheets/d/16UHsIGuWNz3jo7g-LzVnMKPfv6thKUpyEowaZCUMyng/edit#gid=1118263977 Llista de 2n d'SMX-A]&lt;br /&gt;
== 20230511 ==&lt;br /&gt;
Seguim amb Python.&lt;br /&gt;
&lt;br /&gt;
[[Pràctiques d'introducció a Python . Part 3 - SMX | Estructures repetitives, o bucles, en Python]]&lt;br /&gt;
&lt;br /&gt;
[[Exercicis d'estructures de control repetitives en Python]]&lt;br /&gt;
== 20230504 ==&lt;br /&gt;
Seguim amb Python.&lt;br /&gt;
&lt;br /&gt;
[[Pràctiques d'introducció a Python . Part 3 - SMX | Estructures repetitives, o bucles, en Python]]&lt;br /&gt;
&lt;br /&gt;
[[Exercicis d'estructures de control repetitives en Python]]&lt;br /&gt;
&lt;br /&gt;
== 20230427 ==&lt;br /&gt;
Seguim amb Python.&lt;br /&gt;
&lt;br /&gt;
[[Pràctiques d'introducció a Python . Part 3 - SMX | Estructures repetitives, o bucles, en Python]]&lt;br /&gt;
&lt;br /&gt;
[[Exercicis d'estructures de control repetitives en Python]]&lt;br /&gt;
== 20230420 ==&lt;br /&gt;
Seguim amb Python.&lt;br /&gt;
&lt;br /&gt;
[[Pràctiques d'introducció a Python . Part 3 - SMX | Estructures repetitives, o bucles, en Python]]&lt;br /&gt;
&lt;br /&gt;
[[Exercicis d'estructures de control repetitives en Python]]&lt;br /&gt;
&lt;br /&gt;
== 20230413 ==&lt;br /&gt;
Seguim amb Python.&lt;br /&gt;
&lt;br /&gt;
[[Pràctiques d'introducció a Python . Part 3 - SMX | Estructures repetitives, o bucles, en Python]]&lt;br /&gt;
&lt;br /&gt;
[[Exercicis d'estructures de control repetitives en Python]]&lt;br /&gt;
=== Exercici del cinema ===&lt;br /&gt;
Primer ho farem amb [https://snap.berkeley.edu/snap/snap.html Snap!]. Després amb [https://app.edublocks.org/ EduBlocks]. Després amb [https://www.onlinegdb.com/ OnlineGDM] i finalment amb el [https://code.visualstudio.com/ VSCode].&lt;br /&gt;
&lt;br /&gt;
A partir de la qualificació d’una pel·lícula i l’edat de l'espectador, indiqueu si aquest pot o no passar.&lt;br /&gt;
&lt;br /&gt;
Qualificacions de les pel·lícules:&lt;br /&gt;
&lt;br /&gt;
'''T'''   –   Tots els públics.&lt;br /&gt;
&lt;br /&gt;
'''M'''  –   Majors de 13 anys.&lt;br /&gt;
&lt;br /&gt;
'''J'''   –   Majors de 16 anys.&lt;br /&gt;
&lt;br /&gt;
'''A'''   –   Majors de 18 anys.&lt;br /&gt;
&lt;br /&gt;
El programa demanarà la lletra que determina la qualificació de la pel·lícula i l’edat de l'espectador per, a continuació, mostrar per pantalla si aquest pot passar a la sala o no.&lt;br /&gt;
&lt;br /&gt;
El programa ha de controlar que la qualificació de la pel·lícula sigui T, M, J o A. Qualsevol altra entrada no serà vàlida.&lt;br /&gt;
&lt;br /&gt;
== 20230330 ==&lt;br /&gt;
Seguim amb Python.&lt;br /&gt;
&lt;br /&gt;
[[Pràctiques d'introducció a Python . Part 3 - SMX | Estructures repetitives, o bucles, en Python]]&lt;br /&gt;
&lt;br /&gt;
[[Exercicis d'estructures de control repetitives en Python]]&lt;br /&gt;
&lt;br /&gt;
== 20230323 ==&lt;br /&gt;
Seguim amb Python.&lt;br /&gt;
&lt;br /&gt;
[[Pràctiques d'introducció a Python . Part 3 - SMX | Estructures repetitives, o bucles, en Python]]&lt;br /&gt;
&lt;br /&gt;
[[Exercicis d'estructures de control repetitives en Python]]&lt;br /&gt;
&lt;br /&gt;
== 20230316 ==&lt;br /&gt;
Seguim amb Python.&lt;br /&gt;
&lt;br /&gt;
[[Pràctiques d'introducció a Python . Part 3 - SMX | Estructures repetitives, o bucles, en Python]]&lt;br /&gt;
&lt;br /&gt;
[[Exercicis d'estructures de control repetitives en Python]]&lt;br /&gt;
&lt;br /&gt;
== 20230302 ==&lt;br /&gt;
Seguim amb Python.&lt;br /&gt;
&lt;br /&gt;
[[Pràctiques d'introducció a Python . Part 2 - SMX | Condicionals en Python]]&lt;br /&gt;
&lt;br /&gt;
[[Exercicis de condicions en Python]]&lt;br /&gt;
&lt;br /&gt;
[[Pràctiques d'introducció a Python . Part 3 - SMX | Estructures repetitives, o bucles, en Python]]&lt;br /&gt;
&lt;br /&gt;
[[Exercicis d'estructures de control repetitives en Python]]&lt;br /&gt;
&lt;br /&gt;
* Nova eina: [https://app.edublocks.org/ edublocks]&lt;br /&gt;
&lt;br /&gt;
== 20230223 ==&lt;br /&gt;
Seguim amb Python.&lt;br /&gt;
&lt;br /&gt;
[[Pràctiques d'introducció a Python . Part 2 - SMX | Condicionals en Python]]&lt;br /&gt;
&lt;br /&gt;
[[Exercicis de condicions en Python]]&lt;br /&gt;
&lt;br /&gt;
[[Pràctiques d'introducció a Python . Part 3 - SMX | Estructures repetitives, o bucles, en Python]]&lt;br /&gt;
&lt;br /&gt;
[[Exercicis d'estructures de control repetitives en Python]]&lt;br /&gt;
&lt;br /&gt;
== 20230216 ==&lt;br /&gt;
Seguim amb Python.&lt;br /&gt;
&lt;br /&gt;
[[Pràctiques d'introducció a Python . Part 2 - SMX | Condicionals en Python]]&lt;br /&gt;
&lt;br /&gt;
[[Exercicis de condicions en Python]]&lt;br /&gt;
&lt;br /&gt;
== 20230209 ==&lt;br /&gt;
Seguim amb Python.&lt;br /&gt;
&lt;br /&gt;
[[Pràctiques d'introducció a Python . Part 2 - SMX | Condicionals en Python]]&lt;br /&gt;
&lt;br /&gt;
[[Exercicis de condicions en Python]]&lt;br /&gt;
&lt;br /&gt;
== 20230202 ==&lt;br /&gt;
Seguim amb Python.&lt;br /&gt;
&lt;br /&gt;
[[Exercicis d'introducció a Python]]&lt;br /&gt;
&lt;br /&gt;
[[Pràctiques d'introducció a Python . Part 2 - SMX | Condicionals en Python]]&lt;br /&gt;
&lt;br /&gt;
[[Exercicis de condicions en Python]]&lt;br /&gt;
&lt;br /&gt;
== 20230126 ==&lt;br /&gt;
Seguim amb Python.&lt;br /&gt;
&lt;br /&gt;
[[Exercicis d'introducció a Python]]&lt;br /&gt;
&lt;br /&gt;
[[Pràctiques d'introducció a Python . Part 2 - SMX | Condicionals en Python]]&lt;br /&gt;
&lt;br /&gt;
[[Exercicis de condicions en Python]]&lt;br /&gt;
&lt;br /&gt;
== 20230119 ==&lt;br /&gt;
Seguim amb Python.&lt;br /&gt;
 / És divisió real&lt;br /&gt;
 // És divisió entera&lt;br /&gt;
 % És el residu de la divisió&lt;br /&gt;
[[Pràctiques d'introducció a Python . Part 2 - SMX | Condicionals amb Python]]&lt;br /&gt;
&lt;br /&gt;
[[Exercicis de condicions en Python]]&lt;br /&gt;
&lt;br /&gt;
== 20230112 ==&lt;br /&gt;
Presentació projectes de Nadal.&lt;br /&gt;
&lt;br /&gt;
Seguim  fent [[Exercicis d'introducció a Python]]&lt;br /&gt;
&lt;br /&gt;
 pes = float(input(&amp;quot;Pes en Kg: &amp;quot;)) # float: real (amb decimals)&lt;br /&gt;
 print(&amp;quot;Pes %f Kg&amp;quot;%pes)&lt;br /&gt;
 print(&amp;quot;Pes amb tres decimals: %.3f Kg&amp;quot;%pes)&lt;br /&gt;
 nom = input(&amp;quot;Nom: &amp;quot;) # string: cadena&lt;br /&gt;
 print(&amp;quot;En %s pesa %.2fKg&amp;quot;%(nom,pes))&lt;br /&gt;
 n = int(input(&amp;quot;Cops per a repetir: &amp;quot;)) # int: enter (sense decimals)&lt;br /&gt;
 print(&amp;quot;Repetit %d cops&amp;quot;%n)&lt;br /&gt;
 for i in range(n):&lt;br /&gt;
    print(&amp;quot;En %s pesa %.2fKg&amp;quot;%(nom,pes))&lt;br /&gt;
&lt;br /&gt;
== 20221212 ==&lt;br /&gt;
Seguim fent el projecte de Nadal&lt;br /&gt;
&lt;br /&gt;
== 20221124 ==&lt;br /&gt;
Seguim fent el projecte de Nadal&lt;br /&gt;
&lt;br /&gt;
== 20221117 ==&lt;br /&gt;
[https://recull.binefa.cat/ Recull de codis fets a classe] usuari / contrasenya : ''smxA'' / ''smxA2223''&lt;br /&gt;
&lt;br /&gt;
[[Exercicis d'introducció a Python]]&lt;br /&gt;
&lt;br /&gt;
[https://snap.berkeley.edu/snap/snap.html Snap! en línia]&lt;br /&gt;
&lt;br /&gt;
== 20221110 ==&lt;br /&gt;
[https://recull.binefa.cat/ Recull de codis fets a classe] usuari / contrasenya : ''smxA'' / ''smxA2223''&lt;br /&gt;
&lt;br /&gt;
[[Exercicis d'introducció a Python]]&lt;br /&gt;
&lt;br /&gt;
== 20221103 ==&lt;br /&gt;
[https://recull.binefa.cat/ Recull de codis fets a classe] usuari / contrasenya : ''smxA'' / ''smxA2223''&lt;br /&gt;
&lt;br /&gt;
[[Pràctiques d'introducció a Python - SMX | Pràctiques d'introducció a Python]]&lt;br /&gt;
&lt;br /&gt;
[[Exercicis d'introducció a Python]]&lt;br /&gt;
&lt;br /&gt;
[https://www.onlinegdb.com/ Eina remota d'interpretació de Python]&lt;br /&gt;
&lt;br /&gt;
 &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
 eip01.py&lt;br /&gt;
 &lt;br /&gt;
 Cognom1 Cognom2, Nom &lt;br /&gt;
 &lt;br /&gt;
 Escriviu un programa que pregunti a l'usuari pel nombre d'hores treballades i el cost per hora. &lt;br /&gt;
 Després ha de mostrar per pantalla la paga que li correspon.&lt;br /&gt;
 &lt;br /&gt;
 20221103&lt;br /&gt;
 &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
 fHores = float(input(&amp;quot;Nombre d'hores treballades: &amp;quot;))&lt;br /&gt;
 # print(&amp;quot;Heu dit que heu treballat %.2f hores&amp;quot;%fHores)&lt;br /&gt;
 fCostPerHora = float(input(&amp;quot;Cost per hora: &amp;quot;))&lt;br /&gt;
 # print(&amp;quot;Heu dit que heu treballat %.2f hores amb un preu per hora de %.2f€&amp;quot;%(fHores,fCostPerHora))&lt;br /&gt;
 print(&amp;quot;Heu de cobrar %.2f€&amp;quot;%(fHores*fCostPerHora))&lt;br /&gt;
&lt;br /&gt;
== 20221027 ==&lt;br /&gt;
[https://recull.binefa.cat/ Recull de codis fets a classe] usuari / contrasenya : ''smxA'' / ''smxA2223''&lt;br /&gt;
&lt;br /&gt;
[[Pràctiques d'introducció a Python - SMX | Pràctiques d'introducció a Python]]&lt;br /&gt;
&lt;br /&gt;
[[Exercicis d'introducció a Python]]&lt;br /&gt;
&lt;br /&gt;
[https://www.onlinegdb.com/ Eina remota d'interpretació de Python]&lt;br /&gt;
&lt;br /&gt;
== 20221020 ==&lt;br /&gt;
[https://recull.binefa.cat/ Recull de codis fets a classe] usuari / contrasenya : ''smxA'' / ''smxA2223''&lt;br /&gt;
&lt;br /&gt;
[[Pràctiques d'introducció a Python - SMX | Pràctiques d'introducció a Python]]&lt;br /&gt;
&lt;br /&gt;
[[Exercicis d'introducció a Python]]&lt;br /&gt;
&lt;br /&gt;
[https://www.onlinegdb.com/ Eina remota d'interpretació de Python]&lt;br /&gt;
&lt;br /&gt;
 &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
 pr03.py&lt;br /&gt;
 Víctor Martorell Millán&lt;br /&gt;
 20221017&lt;br /&gt;
 &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
 print ('Hola SMX2')&lt;br /&gt;
 ciutat = input(&amp;quot;La teva ciutat: &amp;quot;)&lt;br /&gt;
 print (&amp;quot;Has dit que la teva ciutat és &amp;quot; + ciutat)&lt;br /&gt;
 print (&amp;quot;Has dit que la teva ciutat és %s&amp;quot; % ciutat)&lt;br /&gt;
 nDistrictes = input(&amp;quot;Numero de districtes: &amp;quot;)&lt;br /&gt;
 print (&amp;quot;Has dit que la teva ciutat és &amp;quot; + ciutat + &amp;quot; i te &amp;quot;+ nDistrictes + &amp;quot; districtes&amp;quot;)&lt;br /&gt;
 print (&amp;quot;Has dit que la teva ciutat és %s i te %s districtes&amp;quot; %(ciutat,nDistrictes))&lt;br /&gt;
 nD = int(nDistrictes)&lt;br /&gt;
 print (&amp;quot;Has dit que la teva ciutat és %s i te %d districtes&amp;quot; % (ciutat,nD))&lt;br /&gt;
&lt;br /&gt;
== 20221013 ==&lt;br /&gt;
[https://recull.binefa.cat/ Recull de codis fets a classe] usuari / contrasenya : ''smxA'' / ''smxA2223''&lt;br /&gt;
&lt;br /&gt;
[[Pràctiques d'introducció a Python - SMX | Pràctiques d'introducció a Python]]&lt;br /&gt;
&lt;br /&gt;
== 20221006 ==&lt;br /&gt;
[https://meet.google.com/zfu-znep-uos Meet a la primera hora]&lt;br /&gt;
&lt;br /&gt;
[https://recull.binefa.cat/ Recull de codis fets a classe] usuari / contrasenya : ''smxA'' / ''smxA2223''&lt;br /&gt;
&lt;br /&gt;
[https://www.onlinegdb.com/ Eina remota d'interpretació de Python]&lt;br /&gt;
&lt;br /&gt;
=== Instal·lacions de Python i VSCode ===&lt;br /&gt;
[https://www.python.org/downloads/ Descàrrega del llenguatge de programació interpretat '''Python''']. Seleccioneu que voleu inserir la ruta de l'executable al PATH. I si al final de la instal·lació us demana inhabilitar (''disable'') rutes llargues, premeu-hi el botó.&lt;br /&gt;
&lt;br /&gt;
[https://code.visualstudio.com/download Entorn de programació i editor de codis '''VSCode''']&lt;br /&gt;
&lt;br /&gt;
=== Python ===&lt;br /&gt;
Un cop instal·lat obrim el terminal i verifiquem:&lt;br /&gt;
 python --version&lt;br /&gt;
 pip --version&lt;br /&gt;
&lt;br /&gt;
Codi de crida a la calculador a Windows:&lt;br /&gt;
 # segon.py&lt;br /&gt;
 import os&lt;br /&gt;
 &lt;br /&gt;
 print(&amp;quot;Calculadora: &amp;quot;)&lt;br /&gt;
 os.system(&amp;quot;calc&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
[[Pràctiques d'introducció a Python - SMX | Pràctiques d'introducció a Python]]&lt;br /&gt;
&lt;br /&gt;
== 20220922 ==&lt;br /&gt;
[https://recull.binefa.cat/ Recull de codis fets a classe] usuari / contrasenya : ''smxA'' / ''smxA2223''&lt;br /&gt;
&lt;br /&gt;
Codis a desenvolupar:&lt;br /&gt;
 c00: pregunta de nom amb ''resposta''&lt;br /&gt;
 c01: pregunta de nom amb variable ''nom''&lt;br /&gt;
 c02: pregunta de nom amb variable ''nom'' i pregunta l'edat amb variable ''edat''&lt;br /&gt;
 c03: aprofitant c02 diem si és major d'edat o no&lt;br /&gt;
 c04: comptador de 0 a 10&lt;br /&gt;
 c05: aprofitant c04, feu una taula de multiplicar&lt;br /&gt;
 c06: aprofitant c04, dieu si el número del comptador és parell o senar&lt;br /&gt;
&lt;br /&gt;
Deseu-los com a ''.sb'' i captureu-los com a ''.png'' o ''.jpg''&lt;br /&gt;
&lt;br /&gt;
== 20220915 ==&lt;br /&gt;
[https://recull.binefa.cat/ Recull de codis fets a classe] usuari / contrasenya : ''smxA'' / ''smxA2223''&lt;br /&gt;
&lt;br /&gt;
A la carpeta compartida / 20220915:&lt;br /&gt;
 df_p01.png (png o jpg)&lt;br /&gt;
 df_p01.drawio&lt;br /&gt;
 p01.png (png o jpg)&lt;br /&gt;
 p01(22-23).sb&lt;br /&gt;
&lt;br /&gt;
Programació per blocs i digrames de flux.&lt;br /&gt;
&lt;br /&gt;
[[Repàs d'ordres del sistema operatiu GNU/Linux - 1a setmana del curs 2021-2022 | Repàs d'ordres del sistema operatiu GNU/Linux - 1a setmana del curs 2022-2023]]&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Snap! =&lt;br /&gt;
[https://snap.berkeley.edu/snap/snap.html Snap! a snap.berkeley.edu]&lt;br /&gt;
&lt;br /&gt;
[https://snap.berkeley.edu/snap/help/SnapManual.pdf Manual de referència d'Snap!]&lt;br /&gt;
&lt;br /&gt;
= Python =&lt;br /&gt;
[[Pràctiques d'introducció a Python - SMX | Pràctiques d'introducció a Python]]&lt;br /&gt;
&lt;br /&gt;
== Condicionals en Python ==&lt;br /&gt;
[[Pràctiques d'introducció a Python . Part 2 - SMX | Condicionals amb Python]]&lt;br /&gt;
&lt;br /&gt;
[[Exercicis de condicions en Python]]&lt;br /&gt;
&lt;br /&gt;
== Estructures repetitives, o bucles, en Python ==&lt;br /&gt;
&lt;br /&gt;
[[Pràctiques d'introducció a Python . Part 3 - SMX | Estructures repetitives, o bucles, en Python]]&lt;br /&gt;
&lt;br /&gt;
[[Exercicis d'estructures de control repetitives en Python]]&lt;br /&gt;
&lt;br /&gt;
== Instal·lació del Jupyter Lab ==&lt;br /&gt;
[https://jupyter.org/try Prova de Jupyter via web externa]&lt;br /&gt;
&lt;br /&gt;
Instal·lació de Jupyter Lab a la màquina virtual GNU/Linux. Des del terminal:&lt;br /&gt;
 $ su -&lt;br /&gt;
 # apt update&lt;br /&gt;
 # apt install python3-pip&lt;br /&gt;
 # exit&lt;br /&gt;
 $ pip --version&lt;br /&gt;
 $ pip install jupyterlab&lt;br /&gt;
 $ pip install jupyter-c-kernel&lt;br /&gt;
&lt;br /&gt;
Sortiu de la sessió i torneu-hi a entrar. Seguiu amb aquestes ordres:&lt;br /&gt;
&lt;br /&gt;
 $ install_c_kernel --user&lt;br /&gt;
 $ jupyter kernelspec list&lt;br /&gt;
&lt;br /&gt;
Un cop instal·lat s'executa des del terminal:&lt;br /&gt;
 $ jupyter-lab&lt;br /&gt;
&lt;br /&gt;
I apareix el navegador web amb el Jupyter Lab.&lt;br /&gt;
&lt;br /&gt;
= Eines en línia =&lt;br /&gt;
[https://recull.binefa.cat/ Recull de codis fets a classe] usuari / contrasenya : ''smxB'' / ''smxB2526''&lt;br /&gt;
&lt;br /&gt;
[https://app.diagrams.net/ Disseny de diagrames de flux en línia]&lt;br /&gt;
&lt;br /&gt;
[https://scratch.mit.edu/scratch_1.4/ Scratch 1.4]&lt;br /&gt;
&lt;br /&gt;
[https://scratch.mit.edu/projects/editor/ Scratch en línia]&lt;br /&gt;
&lt;br /&gt;
[https://snap.berkeley.edu/ Snap!] o [https://www.binefa.cat/Snap Snap! personalitzat]&lt;br /&gt;
&lt;br /&gt;
[https://www.onlinegdb.com/ Compilador en línia]&lt;br /&gt;
&lt;br /&gt;
[http://www.arduinoblocks.com/ Arduino Blocks]&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
= Enllaços a recursos =&lt;br /&gt;
[[Pràctiques d'introducció a Python - SMX | Pràctiques d'introducció a Python]]&lt;br /&gt;
&lt;br /&gt;
[[Pràctiques d'introducció a Python . Part 2 - SMX | Condicionals amb Python]]&lt;br /&gt;
&lt;br /&gt;
[[Exercicis de condicions en Python]]&lt;br /&gt;
&lt;br /&gt;
[[Pràctiques d'introducció a Python . Part 3 - SMX | Estructures repetitives, o bucles, en Python]]&lt;br /&gt;
&lt;br /&gt;
[[Exercicis d'estructures de control repetitives en Python]]&lt;br /&gt;
&lt;br /&gt;
[[Més exercicis de Python bàsic]]&lt;br /&gt;
&lt;br /&gt;
[[Com fer anar la consola de videojocs iNNEXT a Scratch 1.4]]&lt;br /&gt;
&lt;br /&gt;
[[Com fer anar la consola de videojocs iNNEXT a Snap! 6.2]]&lt;br /&gt;
== Instal·lació del Jupyter Lab ==&lt;br /&gt;
[https://jupyter.org/try Prova de Jupyter via web externa]&lt;br /&gt;
&lt;br /&gt;
Instal·lació de Jupyter Lab a la màquina virtual GNU/Linux. Des del terminal:&lt;br /&gt;
 $ su -&lt;br /&gt;
 # apt update&lt;br /&gt;
 # apt install python3-pip&lt;br /&gt;
 # exit&lt;br /&gt;
 $ pip --version&lt;br /&gt;
 $ pip install jupyterlab&lt;br /&gt;
 $ pip install jupyter-c-kernel&lt;br /&gt;
&lt;br /&gt;
Sortiu de la sessió i torneu-hi a entrar. Seguiu amb aquestes ordres:&lt;br /&gt;
&lt;br /&gt;
 $ install_c_kernel --user&lt;br /&gt;
 $ jupyter kernelspec list&lt;br /&gt;
&lt;br /&gt;
Un cop instal·lat s'executa des del terminal:&lt;br /&gt;
 $ jupyter-lab&lt;br /&gt;
&lt;br /&gt;
I apareix el navegador web amb el Jupyter Lab.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Baixada de programes =&lt;br /&gt;
[https://drive.google.com/drive/folders/1fObr8kPcF7358h3bgKPe_BQT3tyQtiV8?usp=sharing Zona compartida al campus virtual d'FJE]&lt;/div&gt;</summary>
		<author><name>Jordi Binefa</name></author>
		
	</entry>
	<entry>
		<id>https://www.binefa.com/index.php?title=2n_SMX-B_per_dies._Curs_2025-2026&amp;diff=12312</id>
		<title>2n SMX-B per dies. Curs 2025-2026</title>
		<link rel="alternate" type="text/html" href="https://www.binefa.com/index.php?title=2n_SMX-B_per_dies._Curs_2025-2026&amp;diff=12312"/>
		<updated>2026-05-14T13:29:00Z</updated>

		<summary type="html">&lt;p&gt;Jordi Binefa: /* 20260507 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Quan tingueu les credencials d'accés a la [https://clot.fje.edu/ca NET] heu de compartir-nos (als '''dos''' professors) una carpeta amb aquest nom: '''2526-SMX2B-1rCognom2nCognomNom''' (Per exemple, si el vostre nom és Xavier López Pujol --&amp;gt; ''2526-SMX2B-LopezPujolXavier''). A aquest enllaç podreu veure si ja hi sou a la llista:&lt;br /&gt;
&lt;br /&gt;
[[Carpetes compartides 2n d'SMX-B. Curs 2025-2026]]&lt;br /&gt;
= Enllaços ràpids =&lt;br /&gt;
[https://meet.google.com/tbb-qgtn-kxb Teleconferència provisional]&lt;br /&gt;
&lt;br /&gt;
[https://snap.berkeley.edu/snap/snap.html Snap!]&lt;br /&gt;
&lt;br /&gt;
[https://moodle.binefa.cat/ Accés al Moodle de l'espai d'habilitats]&lt;br /&gt;
&lt;br /&gt;
[https://docs.google.com/spreadsheets/d/1UzZ0ZDw8db-kJy153VIByWsCzFTcEcrf3l5RkQToHZE/edit?gid=21653362#gid=21653362 Llista 2n d'SMX-B] &amp;lt;!--&lt;br /&gt;
[https://fje.sharepoint.com/:x:/r/sites/GD_CLOT-FP-CLOT_FP-DptInformatica/Documentos%20compartidos/CLOT_FP-DptInformatica/2526/LLISTES%20ASSIST%C3%88NCIA/Llista%20SMX2B%202526.xlsx?d=w1d246af1dd3b49388ddf705ec81c417f&amp;amp;csf=1&amp;amp;web=1&amp;amp;e=OLzBDF Llista 2n d'SMX-B] --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 20260514 ==&lt;br /&gt;
* Seguim amb el projecte de TKinter.&lt;br /&gt;
== 20260507 ==&lt;br /&gt;
* Seguim amb el projecte de TKinter.&lt;br /&gt;
&lt;br /&gt;
== 20260430 ==&lt;br /&gt;
* Seguim amb el projecte de TKinter.&lt;br /&gt;
&lt;br /&gt;
== 20260423 ==&lt;br /&gt;
* Seguim amb TKinter. Comencem el projecte de TKinter.&lt;br /&gt;
* [https://aistudio.google.com/api-keys clau API]&lt;br /&gt;
&lt;br /&gt;
== 20260416 ==&lt;br /&gt;
* Seguim amb TKinter&lt;br /&gt;
&lt;br /&gt;
== 20260409 - TKinter ==&lt;br /&gt;
* [https://recull.binefa.cat/files/20260409/ Documentació de TKinter]&lt;br /&gt;
&lt;br /&gt;
== 20260326 ==&lt;br /&gt;
* [https://recull.binefa.cat/files/20260326/Proyecto_1.pdf Projecte 1]&lt;br /&gt;
&lt;br /&gt;
== 20260319 ==&lt;br /&gt;
* Seguim fent Python&lt;br /&gt;
* Exercici d'un menú en Python ([https://recull.binefa.cat/files/20260319_menu/ Exemple de menú]) (Usuari / Contrasenya: smxB / smxB2526 )&lt;br /&gt;
&lt;br /&gt;
== 20260312 ==&lt;br /&gt;
* Seguim fent Python&lt;br /&gt;
&lt;br /&gt;
== 20260305 ==&lt;br /&gt;
* Seguim fent Python&lt;br /&gt;
&lt;br /&gt;
== 20260226 ==&lt;br /&gt;
* Seguim fent Python&lt;br /&gt;
* 2a hora: Prova dew metacognició tipus test&lt;br /&gt;
&lt;br /&gt;
== 20260219 ==&lt;br /&gt;
* Seguim fent Python&lt;br /&gt;
&lt;br /&gt;
== 20260205 ==&lt;br /&gt;
* Seguim fent Python&lt;br /&gt;
&lt;br /&gt;
== 20260129 ==&lt;br /&gt;
* [https://pyscript.com/ pyscript.com]&lt;br /&gt;
* [https://recull.binefa.cat/ Recull d'informació] (usuari: ''smxB'', contrasenya: ''smxB2526'') o a [https://moodle.binefa.cat/ Moodle]&lt;br /&gt;
&lt;br /&gt;
== 20260122 ==&lt;br /&gt;
=== Primer contacte amb Python ===&lt;br /&gt;
* [https://www.python.org/downloads/ Instal·lació de ''Python'' amb ''pip'']&lt;br /&gt;
* [[Pràctiques d'introducció a Python - SMX | Pràctiques d'introducció a Python]]&lt;br /&gt;
* [[Exercicis d'introducció a Python]]&lt;br /&gt;
&lt;br /&gt;
== 20260115 ==&lt;br /&gt;
* Presentació del projecte de Nadal&lt;br /&gt;
&lt;br /&gt;
== 20260108 ==&lt;br /&gt;
* Presentació del projecte de Nadal&lt;br /&gt;
=== Primer contacte amb Python ===&lt;br /&gt;
* [https://www.python.org/downloads/ Instal·lació de ''Python'' amb ''pip'']&lt;br /&gt;
* [[Pràctiques d'introducció a Python - SMX | Pràctiques d'introducció a Python]]&lt;br /&gt;
* [[Exercicis d'introducció a Python]]&lt;br /&gt;
&lt;br /&gt;
== 20251211 ==&lt;br /&gt;
* Seguim amb projecte en Snap!&lt;br /&gt;
&lt;br /&gt;
== 20251204 ==&lt;br /&gt;
* Seguim amb projecte en Snap!&lt;br /&gt;
&lt;br /&gt;
== 20251113 ==&lt;br /&gt;
* Examen&lt;br /&gt;
* Projecte en Snap!&lt;br /&gt;
&lt;br /&gt;
== 20251106 ==&lt;br /&gt;
Blocs en Snap!&lt;br /&gt;
&lt;br /&gt;
== 20251023 ==&lt;br /&gt;
Seguim amb Snap!&lt;br /&gt;
&lt;br /&gt;
* [https://snap.berkeley.edu/snap/snap.html#present:Username=jordibinefa&amp;amp;ProjectName=carreraCamells Exemple de cursa de camells]&lt;br /&gt;
* Fem [https://moodle.binefa.cat/pluginfile.php/780/mod_resource/content/6/practica%204.pdf pràctica 4 del Moodle] ([https://snap.berkeley.edu/snap/snap.html#present:Username=jordibinefa&amp;amp;ProjectName=taur%C3%B3Ping%C3%BC%C3%AD_00 Un exemple no finalitzat])&lt;br /&gt;
&lt;br /&gt;
== 20251016 ==&lt;br /&gt;
Seguim amb Snap!&lt;br /&gt;
&lt;br /&gt;
[https://recull.binefa.cat/files/20251016/ 5 camells de colors en format svg]&lt;br /&gt;
&lt;br /&gt;
== 20251009 ==&lt;br /&gt;
Seguim amb Snap!&lt;br /&gt;
&lt;br /&gt;
== 20251002 ==&lt;br /&gt;
Seguim amb Snap!&lt;br /&gt;
&lt;br /&gt;
== 20250925 ==&lt;br /&gt;
Seguim amb Snap!&lt;br /&gt;
&lt;br /&gt;
== 20250918 ==&lt;br /&gt;
[https://recull.binefa.cat/ Recull d'informació] (usuari: ''smxB'', contrasenya: ''smxB2526'')&lt;br /&gt;
&lt;br /&gt;
[https://snap.berkeley.edu/snap/snap.html Snap!]&lt;br /&gt;
&lt;br /&gt;
[https://gamifi.cat/docs/cs/snapguia.pdf Guia d'Snap!]&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
[https://docs.google.com/spreadsheets/d/16UHsIGuWNz3jo7g-LzVnMKPfv6thKUpyEowaZCUMyng/edit#gid=1118263977 Llista de 2n d'SMX-A]&lt;br /&gt;
== 20230511 ==&lt;br /&gt;
Seguim amb Python.&lt;br /&gt;
&lt;br /&gt;
[[Pràctiques d'introducció a Python . Part 3 - SMX | Estructures repetitives, o bucles, en Python]]&lt;br /&gt;
&lt;br /&gt;
[[Exercicis d'estructures de control repetitives en Python]]&lt;br /&gt;
== 20230504 ==&lt;br /&gt;
Seguim amb Python.&lt;br /&gt;
&lt;br /&gt;
[[Pràctiques d'introducció a Python . Part 3 - SMX | Estructures repetitives, o bucles, en Python]]&lt;br /&gt;
&lt;br /&gt;
[[Exercicis d'estructures de control repetitives en Python]]&lt;br /&gt;
&lt;br /&gt;
== 20230427 ==&lt;br /&gt;
Seguim amb Python.&lt;br /&gt;
&lt;br /&gt;
[[Pràctiques d'introducció a Python . Part 3 - SMX | Estructures repetitives, o bucles, en Python]]&lt;br /&gt;
&lt;br /&gt;
[[Exercicis d'estructures de control repetitives en Python]]&lt;br /&gt;
== 20230420 ==&lt;br /&gt;
Seguim amb Python.&lt;br /&gt;
&lt;br /&gt;
[[Pràctiques d'introducció a Python . Part 3 - SMX | Estructures repetitives, o bucles, en Python]]&lt;br /&gt;
&lt;br /&gt;
[[Exercicis d'estructures de control repetitives en Python]]&lt;br /&gt;
&lt;br /&gt;
== 20230413 ==&lt;br /&gt;
Seguim amb Python.&lt;br /&gt;
&lt;br /&gt;
[[Pràctiques d'introducció a Python . Part 3 - SMX | Estructures repetitives, o bucles, en Python]]&lt;br /&gt;
&lt;br /&gt;
[[Exercicis d'estructures de control repetitives en Python]]&lt;br /&gt;
=== Exercici del cinema ===&lt;br /&gt;
Primer ho farem amb [https://snap.berkeley.edu/snap/snap.html Snap!]. Després amb [https://app.edublocks.org/ EduBlocks]. Després amb [https://www.onlinegdb.com/ OnlineGDM] i finalment amb el [https://code.visualstudio.com/ VSCode].&lt;br /&gt;
&lt;br /&gt;
A partir de la qualificació d’una pel·lícula i l’edat de l'espectador, indiqueu si aquest pot o no passar.&lt;br /&gt;
&lt;br /&gt;
Qualificacions de les pel·lícules:&lt;br /&gt;
&lt;br /&gt;
'''T'''   –   Tots els públics.&lt;br /&gt;
&lt;br /&gt;
'''M'''  –   Majors de 13 anys.&lt;br /&gt;
&lt;br /&gt;
'''J'''   –   Majors de 16 anys.&lt;br /&gt;
&lt;br /&gt;
'''A'''   –   Majors de 18 anys.&lt;br /&gt;
&lt;br /&gt;
El programa demanarà la lletra que determina la qualificació de la pel·lícula i l’edat de l'espectador per, a continuació, mostrar per pantalla si aquest pot passar a la sala o no.&lt;br /&gt;
&lt;br /&gt;
El programa ha de controlar que la qualificació de la pel·lícula sigui T, M, J o A. Qualsevol altra entrada no serà vàlida.&lt;br /&gt;
&lt;br /&gt;
== 20230330 ==&lt;br /&gt;
Seguim amb Python.&lt;br /&gt;
&lt;br /&gt;
[[Pràctiques d'introducció a Python . Part 3 - SMX | Estructures repetitives, o bucles, en Python]]&lt;br /&gt;
&lt;br /&gt;
[[Exercicis d'estructures de control repetitives en Python]]&lt;br /&gt;
&lt;br /&gt;
== 20230323 ==&lt;br /&gt;
Seguim amb Python.&lt;br /&gt;
&lt;br /&gt;
[[Pràctiques d'introducció a Python . Part 3 - SMX | Estructures repetitives, o bucles, en Python]]&lt;br /&gt;
&lt;br /&gt;
[[Exercicis d'estructures de control repetitives en Python]]&lt;br /&gt;
&lt;br /&gt;
== 20230316 ==&lt;br /&gt;
Seguim amb Python.&lt;br /&gt;
&lt;br /&gt;
[[Pràctiques d'introducció a Python . Part 3 - SMX | Estructures repetitives, o bucles, en Python]]&lt;br /&gt;
&lt;br /&gt;
[[Exercicis d'estructures de control repetitives en Python]]&lt;br /&gt;
&lt;br /&gt;
== 20230302 ==&lt;br /&gt;
Seguim amb Python.&lt;br /&gt;
&lt;br /&gt;
[[Pràctiques d'introducció a Python . Part 2 - SMX | Condicionals en Python]]&lt;br /&gt;
&lt;br /&gt;
[[Exercicis de condicions en Python]]&lt;br /&gt;
&lt;br /&gt;
[[Pràctiques d'introducció a Python . Part 3 - SMX | Estructures repetitives, o bucles, en Python]]&lt;br /&gt;
&lt;br /&gt;
[[Exercicis d'estructures de control repetitives en Python]]&lt;br /&gt;
&lt;br /&gt;
* Nova eina: [https://app.edublocks.org/ edublocks]&lt;br /&gt;
&lt;br /&gt;
== 20230223 ==&lt;br /&gt;
Seguim amb Python.&lt;br /&gt;
&lt;br /&gt;
[[Pràctiques d'introducció a Python . Part 2 - SMX | Condicionals en Python]]&lt;br /&gt;
&lt;br /&gt;
[[Exercicis de condicions en Python]]&lt;br /&gt;
&lt;br /&gt;
[[Pràctiques d'introducció a Python . Part 3 - SMX | Estructures repetitives, o bucles, en Python]]&lt;br /&gt;
&lt;br /&gt;
[[Exercicis d'estructures de control repetitives en Python]]&lt;br /&gt;
&lt;br /&gt;
== 20230216 ==&lt;br /&gt;
Seguim amb Python.&lt;br /&gt;
&lt;br /&gt;
[[Pràctiques d'introducció a Python . Part 2 - SMX | Condicionals en Python]]&lt;br /&gt;
&lt;br /&gt;
[[Exercicis de condicions en Python]]&lt;br /&gt;
&lt;br /&gt;
== 20230209 ==&lt;br /&gt;
Seguim amb Python.&lt;br /&gt;
&lt;br /&gt;
[[Pràctiques d'introducció a Python . Part 2 - SMX | Condicionals en Python]]&lt;br /&gt;
&lt;br /&gt;
[[Exercicis de condicions en Python]]&lt;br /&gt;
&lt;br /&gt;
== 20230202 ==&lt;br /&gt;
Seguim amb Python.&lt;br /&gt;
&lt;br /&gt;
[[Exercicis d'introducció a Python]]&lt;br /&gt;
&lt;br /&gt;
[[Pràctiques d'introducció a Python . Part 2 - SMX | Condicionals en Python]]&lt;br /&gt;
&lt;br /&gt;
[[Exercicis de condicions en Python]]&lt;br /&gt;
&lt;br /&gt;
== 20230126 ==&lt;br /&gt;
Seguim amb Python.&lt;br /&gt;
&lt;br /&gt;
[[Exercicis d'introducció a Python]]&lt;br /&gt;
&lt;br /&gt;
[[Pràctiques d'introducció a Python . Part 2 - SMX | Condicionals en Python]]&lt;br /&gt;
&lt;br /&gt;
[[Exercicis de condicions en Python]]&lt;br /&gt;
&lt;br /&gt;
== 20230119 ==&lt;br /&gt;
Seguim amb Python.&lt;br /&gt;
 / És divisió real&lt;br /&gt;
 // És divisió entera&lt;br /&gt;
 % És el residu de la divisió&lt;br /&gt;
[[Pràctiques d'introducció a Python . Part 2 - SMX | Condicionals amb Python]]&lt;br /&gt;
&lt;br /&gt;
[[Exercicis de condicions en Python]]&lt;br /&gt;
&lt;br /&gt;
== 20230112 ==&lt;br /&gt;
Presentació projectes de Nadal.&lt;br /&gt;
&lt;br /&gt;
Seguim  fent [[Exercicis d'introducció a Python]]&lt;br /&gt;
&lt;br /&gt;
 pes = float(input(&amp;quot;Pes en Kg: &amp;quot;)) # float: real (amb decimals)&lt;br /&gt;
 print(&amp;quot;Pes %f Kg&amp;quot;%pes)&lt;br /&gt;
 print(&amp;quot;Pes amb tres decimals: %.3f Kg&amp;quot;%pes)&lt;br /&gt;
 nom = input(&amp;quot;Nom: &amp;quot;) # string: cadena&lt;br /&gt;
 print(&amp;quot;En %s pesa %.2fKg&amp;quot;%(nom,pes))&lt;br /&gt;
 n = int(input(&amp;quot;Cops per a repetir: &amp;quot;)) # int: enter (sense decimals)&lt;br /&gt;
 print(&amp;quot;Repetit %d cops&amp;quot;%n)&lt;br /&gt;
 for i in range(n):&lt;br /&gt;
    print(&amp;quot;En %s pesa %.2fKg&amp;quot;%(nom,pes))&lt;br /&gt;
&lt;br /&gt;
== 20221212 ==&lt;br /&gt;
Seguim fent el projecte de Nadal&lt;br /&gt;
&lt;br /&gt;
== 20221124 ==&lt;br /&gt;
Seguim fent el projecte de Nadal&lt;br /&gt;
&lt;br /&gt;
== 20221117 ==&lt;br /&gt;
[https://recull.binefa.cat/ Recull de codis fets a classe] usuari / contrasenya : ''smxA'' / ''smxA2223''&lt;br /&gt;
&lt;br /&gt;
[[Exercicis d'introducció a Python]]&lt;br /&gt;
&lt;br /&gt;
[https://snap.berkeley.edu/snap/snap.html Snap! en línia]&lt;br /&gt;
&lt;br /&gt;
== 20221110 ==&lt;br /&gt;
[https://recull.binefa.cat/ Recull de codis fets a classe] usuari / contrasenya : ''smxA'' / ''smxA2223''&lt;br /&gt;
&lt;br /&gt;
[[Exercicis d'introducció a Python]]&lt;br /&gt;
&lt;br /&gt;
== 20221103 ==&lt;br /&gt;
[https://recull.binefa.cat/ Recull de codis fets a classe] usuari / contrasenya : ''smxA'' / ''smxA2223''&lt;br /&gt;
&lt;br /&gt;
[[Pràctiques d'introducció a Python - SMX | Pràctiques d'introducció a Python]]&lt;br /&gt;
&lt;br /&gt;
[[Exercicis d'introducció a Python]]&lt;br /&gt;
&lt;br /&gt;
[https://www.onlinegdb.com/ Eina remota d'interpretació de Python]&lt;br /&gt;
&lt;br /&gt;
 &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
 eip01.py&lt;br /&gt;
 &lt;br /&gt;
 Cognom1 Cognom2, Nom &lt;br /&gt;
 &lt;br /&gt;
 Escriviu un programa que pregunti a l'usuari pel nombre d'hores treballades i el cost per hora. &lt;br /&gt;
 Després ha de mostrar per pantalla la paga que li correspon.&lt;br /&gt;
 &lt;br /&gt;
 20221103&lt;br /&gt;
 &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
 fHores = float(input(&amp;quot;Nombre d'hores treballades: &amp;quot;))&lt;br /&gt;
 # print(&amp;quot;Heu dit que heu treballat %.2f hores&amp;quot;%fHores)&lt;br /&gt;
 fCostPerHora = float(input(&amp;quot;Cost per hora: &amp;quot;))&lt;br /&gt;
 # print(&amp;quot;Heu dit que heu treballat %.2f hores amb un preu per hora de %.2f€&amp;quot;%(fHores,fCostPerHora))&lt;br /&gt;
 print(&amp;quot;Heu de cobrar %.2f€&amp;quot;%(fHores*fCostPerHora))&lt;br /&gt;
&lt;br /&gt;
== 20221027 ==&lt;br /&gt;
[https://recull.binefa.cat/ Recull de codis fets a classe] usuari / contrasenya : ''smxA'' / ''smxA2223''&lt;br /&gt;
&lt;br /&gt;
[[Pràctiques d'introducció a Python - SMX | Pràctiques d'introducció a Python]]&lt;br /&gt;
&lt;br /&gt;
[[Exercicis d'introducció a Python]]&lt;br /&gt;
&lt;br /&gt;
[https://www.onlinegdb.com/ Eina remota d'interpretació de Python]&lt;br /&gt;
&lt;br /&gt;
== 20221020 ==&lt;br /&gt;
[https://recull.binefa.cat/ Recull de codis fets a classe] usuari / contrasenya : ''smxA'' / ''smxA2223''&lt;br /&gt;
&lt;br /&gt;
[[Pràctiques d'introducció a Python - SMX | Pràctiques d'introducció a Python]]&lt;br /&gt;
&lt;br /&gt;
[[Exercicis d'introducció a Python]]&lt;br /&gt;
&lt;br /&gt;
[https://www.onlinegdb.com/ Eina remota d'interpretació de Python]&lt;br /&gt;
&lt;br /&gt;
 &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
 pr03.py&lt;br /&gt;
 Víctor Martorell Millán&lt;br /&gt;
 20221017&lt;br /&gt;
 &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
 print ('Hola SMX2')&lt;br /&gt;
 ciutat = input(&amp;quot;La teva ciutat: &amp;quot;)&lt;br /&gt;
 print (&amp;quot;Has dit que la teva ciutat és &amp;quot; + ciutat)&lt;br /&gt;
 print (&amp;quot;Has dit que la teva ciutat és %s&amp;quot; % ciutat)&lt;br /&gt;
 nDistrictes = input(&amp;quot;Numero de districtes: &amp;quot;)&lt;br /&gt;
 print (&amp;quot;Has dit que la teva ciutat és &amp;quot; + ciutat + &amp;quot; i te &amp;quot;+ nDistrictes + &amp;quot; districtes&amp;quot;)&lt;br /&gt;
 print (&amp;quot;Has dit que la teva ciutat és %s i te %s districtes&amp;quot; %(ciutat,nDistrictes))&lt;br /&gt;
 nD = int(nDistrictes)&lt;br /&gt;
 print (&amp;quot;Has dit que la teva ciutat és %s i te %d districtes&amp;quot; % (ciutat,nD))&lt;br /&gt;
&lt;br /&gt;
== 20221013 ==&lt;br /&gt;
[https://recull.binefa.cat/ Recull de codis fets a classe] usuari / contrasenya : ''smxA'' / ''smxA2223''&lt;br /&gt;
&lt;br /&gt;
[[Pràctiques d'introducció a Python - SMX | Pràctiques d'introducció a Python]]&lt;br /&gt;
&lt;br /&gt;
== 20221006 ==&lt;br /&gt;
[https://meet.google.com/zfu-znep-uos Meet a la primera hora]&lt;br /&gt;
&lt;br /&gt;
[https://recull.binefa.cat/ Recull de codis fets a classe] usuari / contrasenya : ''smxA'' / ''smxA2223''&lt;br /&gt;
&lt;br /&gt;
[https://www.onlinegdb.com/ Eina remota d'interpretació de Python]&lt;br /&gt;
&lt;br /&gt;
=== Instal·lacions de Python i VSCode ===&lt;br /&gt;
[https://www.python.org/downloads/ Descàrrega del llenguatge de programació interpretat '''Python''']. Seleccioneu que voleu inserir la ruta de l'executable al PATH. I si al final de la instal·lació us demana inhabilitar (''disable'') rutes llargues, premeu-hi el botó.&lt;br /&gt;
&lt;br /&gt;
[https://code.visualstudio.com/download Entorn de programació i editor de codis '''VSCode''']&lt;br /&gt;
&lt;br /&gt;
=== Python ===&lt;br /&gt;
Un cop instal·lat obrim el terminal i verifiquem:&lt;br /&gt;
 python --version&lt;br /&gt;
 pip --version&lt;br /&gt;
&lt;br /&gt;
Codi de crida a la calculador a Windows:&lt;br /&gt;
 # segon.py&lt;br /&gt;
 import os&lt;br /&gt;
 &lt;br /&gt;
 print(&amp;quot;Calculadora: &amp;quot;)&lt;br /&gt;
 os.system(&amp;quot;calc&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
[[Pràctiques d'introducció a Python - SMX | Pràctiques d'introducció a Python]]&lt;br /&gt;
&lt;br /&gt;
== 20220922 ==&lt;br /&gt;
[https://recull.binefa.cat/ Recull de codis fets a classe] usuari / contrasenya : ''smxA'' / ''smxA2223''&lt;br /&gt;
&lt;br /&gt;
Codis a desenvolupar:&lt;br /&gt;
 c00: pregunta de nom amb ''resposta''&lt;br /&gt;
 c01: pregunta de nom amb variable ''nom''&lt;br /&gt;
 c02: pregunta de nom amb variable ''nom'' i pregunta l'edat amb variable ''edat''&lt;br /&gt;
 c03: aprofitant c02 diem si és major d'edat o no&lt;br /&gt;
 c04: comptador de 0 a 10&lt;br /&gt;
 c05: aprofitant c04, feu una taula de multiplicar&lt;br /&gt;
 c06: aprofitant c04, dieu si el número del comptador és parell o senar&lt;br /&gt;
&lt;br /&gt;
Deseu-los com a ''.sb'' i captureu-los com a ''.png'' o ''.jpg''&lt;br /&gt;
&lt;br /&gt;
== 20220915 ==&lt;br /&gt;
[https://recull.binefa.cat/ Recull de codis fets a classe] usuari / contrasenya : ''smxA'' / ''smxA2223''&lt;br /&gt;
&lt;br /&gt;
A la carpeta compartida / 20220915:&lt;br /&gt;
 df_p01.png (png o jpg)&lt;br /&gt;
 df_p01.drawio&lt;br /&gt;
 p01.png (png o jpg)&lt;br /&gt;
 p01(22-23).sb&lt;br /&gt;
&lt;br /&gt;
Programació per blocs i digrames de flux.&lt;br /&gt;
&lt;br /&gt;
[[Repàs d'ordres del sistema operatiu GNU/Linux - 1a setmana del curs 2021-2022 | Repàs d'ordres del sistema operatiu GNU/Linux - 1a setmana del curs 2022-2023]]&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Snap! =&lt;br /&gt;
[https://snap.berkeley.edu/snap/snap.html Snap! a snap.berkeley.edu]&lt;br /&gt;
&lt;br /&gt;
[https://snap.berkeley.edu/snap/help/SnapManual.pdf Manual de referència d'Snap!]&lt;br /&gt;
&lt;br /&gt;
= Python =&lt;br /&gt;
[[Pràctiques d'introducció a Python - SMX | Pràctiques d'introducció a Python]]&lt;br /&gt;
&lt;br /&gt;
== Condicionals en Python ==&lt;br /&gt;
[[Pràctiques d'introducció a Python . Part 2 - SMX | Condicionals amb Python]]&lt;br /&gt;
&lt;br /&gt;
[[Exercicis de condicions en Python]]&lt;br /&gt;
&lt;br /&gt;
== Estructures repetitives, o bucles, en Python ==&lt;br /&gt;
&lt;br /&gt;
[[Pràctiques d'introducció a Python . Part 3 - SMX | Estructures repetitives, o bucles, en Python]]&lt;br /&gt;
&lt;br /&gt;
[[Exercicis d'estructures de control repetitives en Python]]&lt;br /&gt;
&lt;br /&gt;
== Instal·lació del Jupyter Lab ==&lt;br /&gt;
[https://jupyter.org/try Prova de Jupyter via web externa]&lt;br /&gt;
&lt;br /&gt;
Instal·lació de Jupyter Lab a la màquina virtual GNU/Linux. Des del terminal:&lt;br /&gt;
 $ su -&lt;br /&gt;
 # apt update&lt;br /&gt;
 # apt install python3-pip&lt;br /&gt;
 # exit&lt;br /&gt;
 $ pip --version&lt;br /&gt;
 $ pip install jupyterlab&lt;br /&gt;
 $ pip install jupyter-c-kernel&lt;br /&gt;
&lt;br /&gt;
Sortiu de la sessió i torneu-hi a entrar. Seguiu amb aquestes ordres:&lt;br /&gt;
&lt;br /&gt;
 $ install_c_kernel --user&lt;br /&gt;
 $ jupyter kernelspec list&lt;br /&gt;
&lt;br /&gt;
Un cop instal·lat s'executa des del terminal:&lt;br /&gt;
 $ jupyter-lab&lt;br /&gt;
&lt;br /&gt;
I apareix el navegador web amb el Jupyter Lab.&lt;br /&gt;
&lt;br /&gt;
= Eines en línia =&lt;br /&gt;
[https://recull.binefa.cat/ Recull de codis fets a classe] usuari / contrasenya : ''smxB'' / ''smxB2526''&lt;br /&gt;
&lt;br /&gt;
[https://app.diagrams.net/ Disseny de diagrames de flux en línia]&lt;br /&gt;
&lt;br /&gt;
[https://scratch.mit.edu/scratch_1.4/ Scratch 1.4]&lt;br /&gt;
&lt;br /&gt;
[https://scratch.mit.edu/projects/editor/ Scratch en línia]&lt;br /&gt;
&lt;br /&gt;
[https://snap.berkeley.edu/ Snap!] o [https://www.binefa.cat/Snap Snap! personalitzat]&lt;br /&gt;
&lt;br /&gt;
[https://www.onlinegdb.com/ Compilador en línia]&lt;br /&gt;
&lt;br /&gt;
[http://www.arduinoblocks.com/ Arduino Blocks]&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
= Enllaços a recursos =&lt;br /&gt;
[[Pràctiques d'introducció a Python - SMX | Pràctiques d'introducció a Python]]&lt;br /&gt;
&lt;br /&gt;
[[Pràctiques d'introducció a Python . Part 2 - SMX | Condicionals amb Python]]&lt;br /&gt;
&lt;br /&gt;
[[Exercicis de condicions en Python]]&lt;br /&gt;
&lt;br /&gt;
[[Pràctiques d'introducció a Python . Part 3 - SMX | Estructures repetitives, o bucles, en Python]]&lt;br /&gt;
&lt;br /&gt;
[[Exercicis d'estructures de control repetitives en Python]]&lt;br /&gt;
&lt;br /&gt;
[[Més exercicis de Python bàsic]]&lt;br /&gt;
&lt;br /&gt;
[[Com fer anar la consola de videojocs iNNEXT a Scratch 1.4]]&lt;br /&gt;
&lt;br /&gt;
[[Com fer anar la consola de videojocs iNNEXT a Snap! 6.2]]&lt;br /&gt;
== Instal·lació del Jupyter Lab ==&lt;br /&gt;
[https://jupyter.org/try Prova de Jupyter via web externa]&lt;br /&gt;
&lt;br /&gt;
Instal·lació de Jupyter Lab a la màquina virtual GNU/Linux. Des del terminal:&lt;br /&gt;
 $ su -&lt;br /&gt;
 # apt update&lt;br /&gt;
 # apt install python3-pip&lt;br /&gt;
 # exit&lt;br /&gt;
 $ pip --version&lt;br /&gt;
 $ pip install jupyterlab&lt;br /&gt;
 $ pip install jupyter-c-kernel&lt;br /&gt;
&lt;br /&gt;
Sortiu de la sessió i torneu-hi a entrar. Seguiu amb aquestes ordres:&lt;br /&gt;
&lt;br /&gt;
 $ install_c_kernel --user&lt;br /&gt;
 $ jupyter kernelspec list&lt;br /&gt;
&lt;br /&gt;
Un cop instal·lat s'executa des del terminal:&lt;br /&gt;
 $ jupyter-lab&lt;br /&gt;
&lt;br /&gt;
I apareix el navegador web amb el Jupyter Lab.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Baixada de programes =&lt;br /&gt;
[https://drive.google.com/drive/folders/1fObr8kPcF7358h3bgKPe_BQT3tyQtiV8?usp=sharing Zona compartida al campus virtual d'FJE]&lt;/div&gt;</summary>
		<author><name>Jordi Binefa</name></author>
		
	</entry>
	<entry>
		<id>https://www.binefa.com/index.php?title=16_/_5_/_2026_-_IoT,_Embedded_Systems,_Edge_y_Cloud&amp;diff=12311</id>
		<title>16 / 5 / 2026 - IoT, Embedded Systems, Edge y Cloud</title>
		<link rel="alternate" type="text/html" href="https://www.binefa.com/index.php?title=16_/_5_/_2026_-_IoT,_Embedded_Systems,_Edge_y_Cloud&amp;diff=12311"/>
		<updated>2026-05-14T10:40:22Z</updated>

		<summary type="html">&lt;p&gt;Jordi Binefa: /* Nodos node-red-dashboard */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Conceptos previos (15 / 5 / 2026) =&lt;br /&gt;
Acceso a la base de datos del VPS del máster&lt;br /&gt;
&lt;br /&gt;
= Temario (16 / 5 / 2026) =&lt;br /&gt;
[https://meet.google.com/rke-afvm-eou Videoconferencia]&lt;br /&gt;
&lt;br /&gt;
== Información actualizada de los vídeos de la clase invertida ==&lt;br /&gt;
[https://binefa.com/upc-school/cambiosSegundoDia2026.pdf Cambios respecto los vídeos de la clase invertida]&lt;br /&gt;
* En todos los sitios donde aparece '''vps656540.ovh.net''' ahora es '''master.iotvertebrae.com'''&lt;br /&gt;
* Por seguridad, la contraseña para acceder al VPS por terminal está dentro de la descripción del vídeo en el Campus (en vez de **** está la contraseña):&lt;br /&gt;
&lt;br /&gt;
''Vídeo NodeRED con MySQL parte 1/3   (clase invertida) (VPS: convidat / ****)''&lt;br /&gt;
&lt;br /&gt;
- Acceso desde el terminal en Windows (cmd):&lt;br /&gt;
 ssh convidat@master.iotvertebrae.com&lt;br /&gt;
- Acceso desde el terminal en Linux:&lt;br /&gt;
 ssh -o ServerAliveInterval=30 convidat@master.iotvertebrae.com&lt;br /&gt;
&lt;br /&gt;
Una vez dentro del terminal del VPS se puede acceder a la base de datos con los usuarios (no hay cambios):&lt;br /&gt;
&lt;br /&gt;
- '''convidat''' (contraseña: '''''benvingut''''')&lt;br /&gt;
&lt;br /&gt;
- '''iot''' (contraseña: '''''iot''''')&lt;br /&gt;
&lt;br /&gt;
== Repaso del día anterior ==&lt;br /&gt;
* [https://www.binefa.cat/training/iot02/pdf/iot02_00_es.pdf Introducción a la placa IoT-02]&lt;br /&gt;
* [[El protocolo MQTT]]&lt;br /&gt;
* [[Gemelos digitales especializados]] (Placa IoT-02 e IoT-Vertebrae)&lt;br /&gt;
&lt;br /&gt;
== Conexión entre la placa IoT-02 y Snap! mediante MQTT ==&lt;br /&gt;
&amp;lt;!-- '''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;
&lt;br /&gt;
* Broker MQTT púplico:&lt;br /&gt;
** MQTT TCP por el puerto no seguro 1883: '''broker.emqx.io'''&lt;br /&gt;
** MQTT WSS por puerto seguro: '''wss://broker.emqx.io:8084/mqtt'''&lt;br /&gt;
* Broker MQTT en el VPS del máster:&lt;br /&gt;
** MQTT TCP por el puerto no seguro 1883: '''master.iotvertebrae.com'''&lt;br /&gt;
** MQTT WSS por puerto seguro: '''wss://master.iotvertebrae.com:9002'''&lt;br /&gt;
&amp;lt;!-- '''Nuevo firmware de la placa IoT-02 para el día de hoy''': [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]&lt;br /&gt;
[[Conexión entre la placa IoT-02 y Snap! v8 mediante MQTT]]&lt;br /&gt;
[[Conexión entre la placa IoT-02 y Snap! v9 mediante MQTT]] --&amp;gt;&lt;br /&gt;
[https://snap.berkeley.edu/snap/snap.html#present:Username=jordibinefa&amp;amp;ProjectName=IoT-02_board_segur_66C172FB482D_broker_master_iotvertebrae Control de la placa IoT-02. Broker del VPS del máster] El [https://github.com/jordibinefa/IoT-02/tree/master/codes/IoT-02_mqtt_sync_upcSchool_broker1 ''firmware'' IoT-02_mqtt_sync_upcSchool_broker1] enseña el número MAC por la pantalla OLED cuando la placa IoT-02 se conecta a vuestra wifi. (Cambiar el archivo [https://github.com/jordibinefa/IoT-02/blob/master/codes/IoT-02_mqtt_sync_upcSchool_broker1/IoT-02_wifiCredentials.h IoT-02_wifiCredentials.h] en la línea 21 substituyendo ''iotcat'' por el nombre de la SSID de vuestra wifi y ''1234567890a'' por vuestra contraseña).&lt;br /&gt;
&lt;br /&gt;
== Uso de la base de datos MariaDB para almacenar y leer datos IoT ==&lt;br /&gt;
[[Uso de MariaDB en el VPS del Máster de Industria 4.0 el curso 2025-2026 | Uso de MariaDB en el VPS del Máster de Industria 4.0]]&lt;br /&gt;
&amp;lt;!-- [[Uso de MariaDB en el VPS del Máster de Industria 4.0 el curso 2023-2024]]&lt;br /&gt;
[[Uso de MariaDB en el VPS del Máster de Industria 4.0 el curso 2022-2023 | Uso de MariaDB en el VPS del Máster de Industria 4.0 el curso 2023-2024]]--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Node-RED ==&lt;br /&gt;
[[Asignación de puertos para el curso 2025-2026 | Asignación de puertos para este curso]]&lt;br /&gt;
&amp;lt;!--[[Asignación de puertos para el curso 2023-2024]]&lt;br /&gt;
[[Asignación de puertos para el curso 2022-2023]]--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Uso del Node-RED ===&lt;br /&gt;
[[Uso del NodeRED (2024) | Uso del Node-RED]]&lt;br /&gt;
&amp;lt;!--[[Uso del NodeRED (2023) | Uso del Node-RED]]--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Uso de la base de datos MariaDB desde Node-RED===&lt;br /&gt;
[[Uso de la base de datos MariaDB desde NodeRED (2023) | Uso de la base de datos MariaDB desde Node-RED]]&lt;br /&gt;
&amp;lt;!-- == Telegram ==&lt;br /&gt;
[[Uso de Telegram desde NodeRED]]--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Repaso y dudas de la clase invertida ==&lt;br /&gt;
=== Verificación de nodos instalados ===&lt;br /&gt;
Antes de continuar verificamos que ya tenemos instalado el nodo de MySQL ('''node-red-node-mysql''') y los nodos del panel de control ('''node-red-dashboard''' -marcado como ''deprecated''-).&lt;br /&gt;
==== Nodo node-red-node-mysql ====&lt;br /&gt;
[https://flows.nodered.org/node/node-red-node-mysql Documentación oficial del nodo ''node-red-node-mysql'']&lt;br /&gt;
&lt;br /&gt;
[[Image:10MariaDbNodeRed00.png|center|thumb|Instalación de los nodos de MariaDB (''MySQL'') en NodeRED]]&lt;br /&gt;
[[Image:11nodoMariaDbNodeRed.png|center|thumb|Aspecto del nodo MySQL en NodeRED]]&lt;br /&gt;
&lt;br /&gt;
==== Nodos node-red-dashboard ====&lt;br /&gt;
[https://flows.nodered.org/node/node-red-dashboard Documentación oficial de los nodos ''node-red-dashboard''] (Ahora sale como ''deprecated'').&lt;br /&gt;
&lt;br /&gt;
[[Image:NodosDashboard.png|center|thumb|Nodos del panel de control (''Dashboard'') en NodeRED]]&lt;br /&gt;
&lt;br /&gt;
=== Acceso al VPS del máster ===&lt;br /&gt;
* La contraseña está dentro de la descripción del vídeo en el Campus (en vez de **** está la contraseña):&lt;br /&gt;
&lt;br /&gt;
''Vídeo NodeRED con MySQL parte 1/3   (clase invertida) (VPS: convidat / ****)''&lt;br /&gt;
* Acceso desde el terminal en Linux:&lt;br /&gt;
 ssh -o ServerAliveInterval=30 convidat@master.iotvertebrae.com&lt;br /&gt;
* Acceso desde el terminal en Windows (cmd):&lt;br /&gt;
 ssh convidat@master.iotvertebrae.com&lt;br /&gt;
&lt;br /&gt;
=== Acceso a la base de datos del VPS del máster ===&lt;br /&gt;
* Con permisos de lectura y escritura:&lt;br /&gt;
 mysql -u iot -p&lt;br /&gt;
* Con permisos de lectura:&lt;br /&gt;
 mysql -u convidat -p&lt;br /&gt;
&lt;br /&gt;
=== Repaso ===&lt;br /&gt;
* Uso de JSON con Snap!&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;
&lt;br /&gt;
* Aleatorización de múltiples datos controlada por el panel de control&lt;br /&gt;
&lt;br /&gt;
* Escritura síncrona de múltiples datos asíncronos al mismo tiempo. Uso del formato de datos json&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
* Telegram--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Ejercicios ==&lt;br /&gt;
=== Ejercicio de '''Snap! con MQTT''' ===&lt;br /&gt;
* Mediante Snap! hacer que en la pantalla aparezca, de forma infinita y con una cadencia de dos segundos, el porcentaje de luz leída por la LDR y después la temperatura en grados centígrados.&lt;br /&gt;
&lt;br /&gt;
=== Ejercicios de '''NodeRED''' ===&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;
==== 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;
==== Ejercicio '''NodeRED-03''' ====&lt;br /&gt;
* Implementad una pasarela (''gateway'') HTTP/MQTT para cambiar el estado de los leds y el relé biestable de la placa IoT-02.&lt;br /&gt;
&lt;br /&gt;
==== Ejercicio '''NodeRED-04''' ====&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;br /&gt;
&lt;br /&gt;
==== Ejercicio '''NodeRED-05''' ====&lt;br /&gt;
* Implementar un flujo de NodeRED que supervise continuamente el valor de la LDR. Introducir dos ''sliders'' para fijar umbrales. Cuando la luz supere el umbral establecido el led rojo se enciende y el relé biestable cambia a SET. Cuando la luz baje del segundo umbral establecido el led rojo se apaga (se enciende el verde) y el relé biestable cambia a RESET.&lt;br /&gt;
&lt;br /&gt;
==== Ejercicio '''NodeRED-06''' ====&lt;br /&gt;
* Implementar un flujo de NodeRED que permita la entrada de un texto y con un botón lo envie a la pantalla OLED.&lt;br /&gt;
&lt;br /&gt;
==== Ejercicio '''NodeRED-07''' ====&lt;br /&gt;
* Implementar un flujo de NodeRED que permita seleccionar un mode de funcionamiento automático o manual. En manual se puede encender y apagar el led blanco mediante un ''switch''. En modo automático el led blanco se enciende o se apaga en función de un umbral consignado mediante un ''slider''. (Para habilitar o inhabilitar un ''switch'' se puede usar ''msg.enabled'').&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--=== Ejercicios '''Telegram''' ===&lt;br /&gt;
* Desde el chat del bot: Al enviar la orden '''/ledWon''' se enciende el led blanco de la placa IoT-02. Al enviar la orden '''/ledWoff''' se apaga el led blanco.&lt;br /&gt;
&lt;br /&gt;
* Desde el chat del bot: Al enviar la orden '''/ledReleSet''' el relé se pone en estado SET. Al enviar la orden '''/ledReleReset''' el relé se pone en estado RESET.&lt;br /&gt;
&lt;br /&gt;
* El chat de vuestro bot recibe un mensaje cuando se aprieta vuestro botón I34 y cuando se deja de apretar.&lt;br /&gt;
&lt;br /&gt;
* Desde el chat del grupo donde pertenece vuestro bot: Al enviar la orden '''/entradas''' el bot contesta con los estados de los botones y la temperatura de la placa.--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Comentario de la práctica para el próximo día ===&lt;br /&gt;
El enunciado estará en breve en el campus. Se comenzará después de haber usado Grafana y Telegram.&lt;/div&gt;</summary>
		<author><name>Jordi Binefa</name></author>
		
	</entry>
	<entry>
		<id>https://www.binefa.com/index.php?title=16_/_5_/_2026_-_IoT,_Embedded_Systems,_Edge_y_Cloud&amp;diff=12310</id>
		<title>16 / 5 / 2026 - IoT, Embedded Systems, Edge y Cloud</title>
		<link rel="alternate" type="text/html" href="https://www.binefa.com/index.php?title=16_/_5_/_2026_-_IoT,_Embedded_Systems,_Edge_y_Cloud&amp;diff=12310"/>
		<updated>2026-05-14T10:36:54Z</updated>

		<summary type="html">&lt;p&gt;Jordi Binefa: /* Información actualizada de los vídeos de la clase invertida */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Conceptos previos (15 / 5 / 2026) =&lt;br /&gt;
Acceso a la base de datos del VPS del máster&lt;br /&gt;
&lt;br /&gt;
= Temario (16 / 5 / 2026) =&lt;br /&gt;
[https://meet.google.com/rke-afvm-eou Videoconferencia]&lt;br /&gt;
&lt;br /&gt;
== Información actualizada de los vídeos de la clase invertida ==&lt;br /&gt;
[https://binefa.com/upc-school/cambiosSegundoDia2026.pdf Cambios respecto los vídeos de la clase invertida]&lt;br /&gt;
* En todos los sitios donde aparece '''vps656540.ovh.net''' ahora es '''master.iotvertebrae.com'''&lt;br /&gt;
* Por seguridad, la contraseña para acceder al VPS por terminal está dentro de la descripción del vídeo en el Campus (en vez de **** está la contraseña):&lt;br /&gt;
&lt;br /&gt;
''Vídeo NodeRED con MySQL parte 1/3   (clase invertida) (VPS: convidat / ****)''&lt;br /&gt;
&lt;br /&gt;
- Acceso desde el terminal en Windows (cmd):&lt;br /&gt;
 ssh convidat@master.iotvertebrae.com&lt;br /&gt;
- Acceso desde el terminal en Linux:&lt;br /&gt;
 ssh -o ServerAliveInterval=30 convidat@master.iotvertebrae.com&lt;br /&gt;
&lt;br /&gt;
Una vez dentro del terminal del VPS se puede acceder a la base de datos con los usuarios (no hay cambios):&lt;br /&gt;
&lt;br /&gt;
- '''convidat''' (contraseña: '''''benvingut''''')&lt;br /&gt;
&lt;br /&gt;
- '''iot''' (contraseña: '''''iot''''')&lt;br /&gt;
&lt;br /&gt;
== Repaso del día anterior ==&lt;br /&gt;
* [https://www.binefa.cat/training/iot02/pdf/iot02_00_es.pdf Introducción a la placa IoT-02]&lt;br /&gt;
* [[El protocolo MQTT]]&lt;br /&gt;
* [[Gemelos digitales especializados]] (Placa IoT-02 e IoT-Vertebrae)&lt;br /&gt;
&lt;br /&gt;
== Conexión entre la placa IoT-02 y Snap! mediante MQTT ==&lt;br /&gt;
&amp;lt;!-- '''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;
&lt;br /&gt;
* Broker MQTT púplico:&lt;br /&gt;
** MQTT TCP por el puerto no seguro 1883: '''broker.emqx.io'''&lt;br /&gt;
** MQTT WSS por puerto seguro: '''wss://broker.emqx.io:8084/mqtt'''&lt;br /&gt;
* Broker MQTT en el VPS del máster:&lt;br /&gt;
** MQTT TCP por el puerto no seguro 1883: '''master.iotvertebrae.com'''&lt;br /&gt;
** MQTT WSS por puerto seguro: '''wss://master.iotvertebrae.com:9002'''&lt;br /&gt;
&amp;lt;!-- '''Nuevo firmware de la placa IoT-02 para el día de hoy''': [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]&lt;br /&gt;
[[Conexión entre la placa IoT-02 y Snap! v8 mediante MQTT]]&lt;br /&gt;
[[Conexión entre la placa IoT-02 y Snap! v9 mediante MQTT]] --&amp;gt;&lt;br /&gt;
[https://snap.berkeley.edu/snap/snap.html#present:Username=jordibinefa&amp;amp;ProjectName=IoT-02_board_segur_66C172FB482D_broker_master_iotvertebrae Control de la placa IoT-02. Broker del VPS del máster] El [https://github.com/jordibinefa/IoT-02/tree/master/codes/IoT-02_mqtt_sync_upcSchool_broker1 ''firmware'' IoT-02_mqtt_sync_upcSchool_broker1] enseña el número MAC por la pantalla OLED cuando la placa IoT-02 se conecta a vuestra wifi. (Cambiar el archivo [https://github.com/jordibinefa/IoT-02/blob/master/codes/IoT-02_mqtt_sync_upcSchool_broker1/IoT-02_wifiCredentials.h IoT-02_wifiCredentials.h] en la línea 21 substituyendo ''iotcat'' por el nombre de la SSID de vuestra wifi y ''1234567890a'' por vuestra contraseña).&lt;br /&gt;
&lt;br /&gt;
== Uso de la base de datos MariaDB para almacenar y leer datos IoT ==&lt;br /&gt;
[[Uso de MariaDB en el VPS del Máster de Industria 4.0 el curso 2025-2026 | Uso de MariaDB en el VPS del Máster de Industria 4.0]]&lt;br /&gt;
&amp;lt;!-- [[Uso de MariaDB en el VPS del Máster de Industria 4.0 el curso 2023-2024]]&lt;br /&gt;
[[Uso de MariaDB en el VPS del Máster de Industria 4.0 el curso 2022-2023 | Uso de MariaDB en el VPS del Máster de Industria 4.0 el curso 2023-2024]]--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Node-RED ==&lt;br /&gt;
[[Asignación de puertos para el curso 2025-2026 | Asignación de puertos para este curso]]&lt;br /&gt;
&amp;lt;!--[[Asignación de puertos para el curso 2023-2024]]&lt;br /&gt;
[[Asignación de puertos para el curso 2022-2023]]--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Uso del Node-RED ===&lt;br /&gt;
[[Uso del NodeRED (2024) | Uso del Node-RED]]&lt;br /&gt;
&amp;lt;!--[[Uso del NodeRED (2023) | Uso del Node-RED]]--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Uso de la base de datos MariaDB desde Node-RED===&lt;br /&gt;
[[Uso de la base de datos MariaDB desde NodeRED (2023) | Uso de la base de datos MariaDB desde Node-RED]]&lt;br /&gt;
&amp;lt;!-- == Telegram ==&lt;br /&gt;
[[Uso de Telegram desde NodeRED]]--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Repaso y dudas de la clase invertida ==&lt;br /&gt;
=== Verificación de nodos instalados ===&lt;br /&gt;
Antes de continuar verificamos que ya tenemos instalado el nodo de MySQL ('''node-red-node-mysql''') y los nodos del panel de control ('''node-red-dashboard''' -marcado como ''deprecated''-).&lt;br /&gt;
==== Nodo node-red-node-mysql ====&lt;br /&gt;
[https://flows.nodered.org/node/node-red-node-mysql Documentación oficial del nodo ''node-red-node-mysql'']&lt;br /&gt;
&lt;br /&gt;
[[Image:10MariaDbNodeRed00.png|center|thumb|Instalación de los nodos de MariaDB (''MySQL'') en NodeRED]]&lt;br /&gt;
[[Image:11nodoMariaDbNodeRed.png|center|thumb|Aspecto del nodo MySQL en NodeRED]]&lt;br /&gt;
&lt;br /&gt;
==== Nodos node-red-dashboard ====&lt;br /&gt;
[https://flows.nodered.org/node/node-red-dashboard Documentación oficial de los nodos ''node-red-dashboard'']&lt;br /&gt;
&lt;br /&gt;
[[Image:NodosDashboard.png|center|thumb|Nodos del panel de control (''Dashboard'') en NodeRED]]&lt;br /&gt;
&lt;br /&gt;
=== Acceso al VPS del máster ===&lt;br /&gt;
* La contraseña está dentro de la descripción del vídeo en el Campus (en vez de **** está la contraseña):&lt;br /&gt;
&lt;br /&gt;
''Vídeo NodeRED con MySQL parte 1/3   (clase invertida) (VPS: convidat / ****)''&lt;br /&gt;
* Acceso desde el terminal en Linux:&lt;br /&gt;
 ssh -o ServerAliveInterval=30 convidat@master.iotvertebrae.com&lt;br /&gt;
* Acceso desde el terminal en Windows (cmd):&lt;br /&gt;
 ssh convidat@master.iotvertebrae.com&lt;br /&gt;
&lt;br /&gt;
=== Acceso a la base de datos del VPS del máster ===&lt;br /&gt;
* Con permisos de lectura y escritura:&lt;br /&gt;
 mysql -u iot -p&lt;br /&gt;
* Con permisos de lectura:&lt;br /&gt;
 mysql -u convidat -p&lt;br /&gt;
&lt;br /&gt;
=== Repaso ===&lt;br /&gt;
* Uso de JSON con Snap!&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;
&lt;br /&gt;
* Aleatorización de múltiples datos controlada por el panel de control&lt;br /&gt;
&lt;br /&gt;
* Escritura síncrona de múltiples datos asíncronos al mismo tiempo. Uso del formato de datos json&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
* Telegram--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Ejercicios ==&lt;br /&gt;
=== Ejercicio de '''Snap! con MQTT''' ===&lt;br /&gt;
* Mediante Snap! hacer que en la pantalla aparezca, de forma infinita y con una cadencia de dos segundos, el porcentaje de luz leída por la LDR y después la temperatura en grados centígrados.&lt;br /&gt;
&lt;br /&gt;
=== Ejercicios de '''NodeRED''' ===&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;
==== 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;
==== Ejercicio '''NodeRED-03''' ====&lt;br /&gt;
* Implementad una pasarela (''gateway'') HTTP/MQTT para cambiar el estado de los leds y el relé biestable de la placa IoT-02.&lt;br /&gt;
&lt;br /&gt;
==== Ejercicio '''NodeRED-04''' ====&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;br /&gt;
&lt;br /&gt;
==== Ejercicio '''NodeRED-05''' ====&lt;br /&gt;
* Implementar un flujo de NodeRED que supervise continuamente el valor de la LDR. Introducir dos ''sliders'' para fijar umbrales. Cuando la luz supere el umbral establecido el led rojo se enciende y el relé biestable cambia a SET. Cuando la luz baje del segundo umbral establecido el led rojo se apaga (se enciende el verde) y el relé biestable cambia a RESET.&lt;br /&gt;
&lt;br /&gt;
==== Ejercicio '''NodeRED-06''' ====&lt;br /&gt;
* Implementar un flujo de NodeRED que permita la entrada de un texto y con un botón lo envie a la pantalla OLED.&lt;br /&gt;
&lt;br /&gt;
==== Ejercicio '''NodeRED-07''' ====&lt;br /&gt;
* Implementar un flujo de NodeRED que permita seleccionar un mode de funcionamiento automático o manual. En manual se puede encender y apagar el led blanco mediante un ''switch''. En modo automático el led blanco se enciende o se apaga en función de un umbral consignado mediante un ''slider''. (Para habilitar o inhabilitar un ''switch'' se puede usar ''msg.enabled'').&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--=== Ejercicios '''Telegram''' ===&lt;br /&gt;
* Desde el chat del bot: Al enviar la orden '''/ledWon''' se enciende el led blanco de la placa IoT-02. Al enviar la orden '''/ledWoff''' se apaga el led blanco.&lt;br /&gt;
&lt;br /&gt;
* Desde el chat del bot: Al enviar la orden '''/ledReleSet''' el relé se pone en estado SET. Al enviar la orden '''/ledReleReset''' el relé se pone en estado RESET.&lt;br /&gt;
&lt;br /&gt;
* El chat de vuestro bot recibe un mensaje cuando se aprieta vuestro botón I34 y cuando se deja de apretar.&lt;br /&gt;
&lt;br /&gt;
* Desde el chat del grupo donde pertenece vuestro bot: Al enviar la orden '''/entradas''' el bot contesta con los estados de los botones y la temperatura de la placa.--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Comentario de la práctica para el próximo día ===&lt;br /&gt;
El enunciado estará en breve en el campus. Se comenzará después de haber usado Grafana y Telegram.&lt;/div&gt;</summary>
		<author><name>Jordi Binefa</name></author>
		
	</entry>
	<entry>
		<id>https://www.binefa.com/index.php?title=16_/_5_/_2026_-_IoT,_Embedded_Systems,_Edge_y_Cloud&amp;diff=12309</id>
		<title>16 / 5 / 2026 - IoT, Embedded Systems, Edge y Cloud</title>
		<link rel="alternate" type="text/html" href="https://www.binefa.com/index.php?title=16_/_5_/_2026_-_IoT,_Embedded_Systems,_Edge_y_Cloud&amp;diff=12309"/>
		<updated>2026-05-14T10:36:35Z</updated>

		<summary type="html">&lt;p&gt;Jordi Binefa: /* Información actualizada de los vídeos de la clase invertida */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Conceptos previos (15 / 5 / 2026) =&lt;br /&gt;
Acceso a la base de datos del VPS del máster&lt;br /&gt;
&lt;br /&gt;
= Temario (16 / 5 / 2026) =&lt;br /&gt;
[https://meet.google.com/rke-afvm-eou Videoconferencia]&lt;br /&gt;
&lt;br /&gt;
== Información actualizada de los vídeos de la clase invertida ==&lt;br /&gt;
[https://binefa.com/upc-school/cambiosSegundoDia2026.pdf Cambios respecto los vídeos de la clase invertida]&lt;br /&gt;
* En todos los sitios donde aparece '''vps656540.ovh.net''' ahora es '''master.iotvertebrae.com'''&lt;br /&gt;
* Por seguridad, la contraseña para acceder al VPS por terminal está dentro de la descripción del vídeo en el Campus (en vez de **** está la contraseña):&lt;br /&gt;
&lt;br /&gt;
''Vídeo NodeRED con MySQL parte 1/3   (clase invertida) (VPS: convidat / ****)''&lt;br /&gt;
&lt;br /&gt;
- Acceso desde el terminal en Windows (cmd):&lt;br /&gt;
 ssh convidat@master.iotvertebrae.com&lt;br /&gt;
- Acceso desde el terminal en Linux:&lt;br /&gt;
 ssh -o ServerAliveInterval=30 convidat@master.iotvertebrae.com&lt;br /&gt;
&lt;br /&gt;
Una vez dentro del VPS se puede acceder a la base de datos con los usuarios (no hay cambios):&lt;br /&gt;
&lt;br /&gt;
- '''convidat''' (contraseña: '''''benvingut''''')&lt;br /&gt;
&lt;br /&gt;
- '''iot''' (contraseña: '''''iot''''')&lt;br /&gt;
&lt;br /&gt;
== Repaso del día anterior ==&lt;br /&gt;
* [https://www.binefa.cat/training/iot02/pdf/iot02_00_es.pdf Introducción a la placa IoT-02]&lt;br /&gt;
* [[El protocolo MQTT]]&lt;br /&gt;
* [[Gemelos digitales especializados]] (Placa IoT-02 e IoT-Vertebrae)&lt;br /&gt;
&lt;br /&gt;
== Conexión entre la placa IoT-02 y Snap! mediante MQTT ==&lt;br /&gt;
&amp;lt;!-- '''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;
&lt;br /&gt;
* Broker MQTT púplico:&lt;br /&gt;
** MQTT TCP por el puerto no seguro 1883: '''broker.emqx.io'''&lt;br /&gt;
** MQTT WSS por puerto seguro: '''wss://broker.emqx.io:8084/mqtt'''&lt;br /&gt;
* Broker MQTT en el VPS del máster:&lt;br /&gt;
** MQTT TCP por el puerto no seguro 1883: '''master.iotvertebrae.com'''&lt;br /&gt;
** MQTT WSS por puerto seguro: '''wss://master.iotvertebrae.com:9002'''&lt;br /&gt;
&amp;lt;!-- '''Nuevo firmware de la placa IoT-02 para el día de hoy''': [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]&lt;br /&gt;
[[Conexión entre la placa IoT-02 y Snap! v8 mediante MQTT]]&lt;br /&gt;
[[Conexión entre la placa IoT-02 y Snap! v9 mediante MQTT]] --&amp;gt;&lt;br /&gt;
[https://snap.berkeley.edu/snap/snap.html#present:Username=jordibinefa&amp;amp;ProjectName=IoT-02_board_segur_66C172FB482D_broker_master_iotvertebrae Control de la placa IoT-02. Broker del VPS del máster] El [https://github.com/jordibinefa/IoT-02/tree/master/codes/IoT-02_mqtt_sync_upcSchool_broker1 ''firmware'' IoT-02_mqtt_sync_upcSchool_broker1] enseña el número MAC por la pantalla OLED cuando la placa IoT-02 se conecta a vuestra wifi. (Cambiar el archivo [https://github.com/jordibinefa/IoT-02/blob/master/codes/IoT-02_mqtt_sync_upcSchool_broker1/IoT-02_wifiCredentials.h IoT-02_wifiCredentials.h] en la línea 21 substituyendo ''iotcat'' por el nombre de la SSID de vuestra wifi y ''1234567890a'' por vuestra contraseña).&lt;br /&gt;
&lt;br /&gt;
== Uso de la base de datos MariaDB para almacenar y leer datos IoT ==&lt;br /&gt;
[[Uso de MariaDB en el VPS del Máster de Industria 4.0 el curso 2025-2026 | Uso de MariaDB en el VPS del Máster de Industria 4.0]]&lt;br /&gt;
&amp;lt;!-- [[Uso de MariaDB en el VPS del Máster de Industria 4.0 el curso 2023-2024]]&lt;br /&gt;
[[Uso de MariaDB en el VPS del Máster de Industria 4.0 el curso 2022-2023 | Uso de MariaDB en el VPS del Máster de Industria 4.0 el curso 2023-2024]]--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Node-RED ==&lt;br /&gt;
[[Asignación de puertos para el curso 2025-2026 | Asignación de puertos para este curso]]&lt;br /&gt;
&amp;lt;!--[[Asignación de puertos para el curso 2023-2024]]&lt;br /&gt;
[[Asignación de puertos para el curso 2022-2023]]--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Uso del Node-RED ===&lt;br /&gt;
[[Uso del NodeRED (2024) | Uso del Node-RED]]&lt;br /&gt;
&amp;lt;!--[[Uso del NodeRED (2023) | Uso del Node-RED]]--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Uso de la base de datos MariaDB desde Node-RED===&lt;br /&gt;
[[Uso de la base de datos MariaDB desde NodeRED (2023) | Uso de la base de datos MariaDB desde Node-RED]]&lt;br /&gt;
&amp;lt;!-- == Telegram ==&lt;br /&gt;
[[Uso de Telegram desde NodeRED]]--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Repaso y dudas de la clase invertida ==&lt;br /&gt;
=== Verificación de nodos instalados ===&lt;br /&gt;
Antes de continuar verificamos que ya tenemos instalado el nodo de MySQL ('''node-red-node-mysql''') y los nodos del panel de control ('''node-red-dashboard''' -marcado como ''deprecated''-).&lt;br /&gt;
==== Nodo node-red-node-mysql ====&lt;br /&gt;
[https://flows.nodered.org/node/node-red-node-mysql Documentación oficial del nodo ''node-red-node-mysql'']&lt;br /&gt;
&lt;br /&gt;
[[Image:10MariaDbNodeRed00.png|center|thumb|Instalación de los nodos de MariaDB (''MySQL'') en NodeRED]]&lt;br /&gt;
[[Image:11nodoMariaDbNodeRed.png|center|thumb|Aspecto del nodo MySQL en NodeRED]]&lt;br /&gt;
&lt;br /&gt;
==== Nodos node-red-dashboard ====&lt;br /&gt;
[https://flows.nodered.org/node/node-red-dashboard Documentación oficial de los nodos ''node-red-dashboard'']&lt;br /&gt;
&lt;br /&gt;
[[Image:NodosDashboard.png|center|thumb|Nodos del panel de control (''Dashboard'') en NodeRED]]&lt;br /&gt;
&lt;br /&gt;
=== Acceso al VPS del máster ===&lt;br /&gt;
* La contraseña está dentro de la descripción del vídeo en el Campus (en vez de **** está la contraseña):&lt;br /&gt;
&lt;br /&gt;
''Vídeo NodeRED con MySQL parte 1/3   (clase invertida) (VPS: convidat / ****)''&lt;br /&gt;
* Acceso desde el terminal en Linux:&lt;br /&gt;
 ssh -o ServerAliveInterval=30 convidat@master.iotvertebrae.com&lt;br /&gt;
* Acceso desde el terminal en Windows (cmd):&lt;br /&gt;
 ssh convidat@master.iotvertebrae.com&lt;br /&gt;
&lt;br /&gt;
=== Acceso a la base de datos del VPS del máster ===&lt;br /&gt;
* Con permisos de lectura y escritura:&lt;br /&gt;
 mysql -u iot -p&lt;br /&gt;
* Con permisos de lectura:&lt;br /&gt;
 mysql -u convidat -p&lt;br /&gt;
&lt;br /&gt;
=== Repaso ===&lt;br /&gt;
* Uso de JSON con Snap!&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;
&lt;br /&gt;
* Aleatorización de múltiples datos controlada por el panel de control&lt;br /&gt;
&lt;br /&gt;
* Escritura síncrona de múltiples datos asíncronos al mismo tiempo. Uso del formato de datos json&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
* Telegram--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Ejercicios ==&lt;br /&gt;
=== Ejercicio de '''Snap! con MQTT''' ===&lt;br /&gt;
* Mediante Snap! hacer que en la pantalla aparezca, de forma infinita y con una cadencia de dos segundos, el porcentaje de luz leída por la LDR y después la temperatura en grados centígrados.&lt;br /&gt;
&lt;br /&gt;
=== Ejercicios de '''NodeRED''' ===&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;
==== 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;
==== Ejercicio '''NodeRED-03''' ====&lt;br /&gt;
* Implementad una pasarela (''gateway'') HTTP/MQTT para cambiar el estado de los leds y el relé biestable de la placa IoT-02.&lt;br /&gt;
&lt;br /&gt;
==== Ejercicio '''NodeRED-04''' ====&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;br /&gt;
&lt;br /&gt;
==== Ejercicio '''NodeRED-05''' ====&lt;br /&gt;
* Implementar un flujo de NodeRED que supervise continuamente el valor de la LDR. Introducir dos ''sliders'' para fijar umbrales. Cuando la luz supere el umbral establecido el led rojo se enciende y el relé biestable cambia a SET. Cuando la luz baje del segundo umbral establecido el led rojo se apaga (se enciende el verde) y el relé biestable cambia a RESET.&lt;br /&gt;
&lt;br /&gt;
==== Ejercicio '''NodeRED-06''' ====&lt;br /&gt;
* Implementar un flujo de NodeRED que permita la entrada de un texto y con un botón lo envie a la pantalla OLED.&lt;br /&gt;
&lt;br /&gt;
==== Ejercicio '''NodeRED-07''' ====&lt;br /&gt;
* Implementar un flujo de NodeRED que permita seleccionar un mode de funcionamiento automático o manual. En manual se puede encender y apagar el led blanco mediante un ''switch''. En modo automático el led blanco se enciende o se apaga en función de un umbral consignado mediante un ''slider''. (Para habilitar o inhabilitar un ''switch'' se puede usar ''msg.enabled'').&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--=== Ejercicios '''Telegram''' ===&lt;br /&gt;
* Desde el chat del bot: Al enviar la orden '''/ledWon''' se enciende el led blanco de la placa IoT-02. Al enviar la orden '''/ledWoff''' se apaga el led blanco.&lt;br /&gt;
&lt;br /&gt;
* Desde el chat del bot: Al enviar la orden '''/ledReleSet''' el relé se pone en estado SET. Al enviar la orden '''/ledReleReset''' el relé se pone en estado RESET.&lt;br /&gt;
&lt;br /&gt;
* El chat de vuestro bot recibe un mensaje cuando se aprieta vuestro botón I34 y cuando se deja de apretar.&lt;br /&gt;
&lt;br /&gt;
* Desde el chat del grupo donde pertenece vuestro bot: Al enviar la orden '''/entradas''' el bot contesta con los estados de los botones y la temperatura de la placa.--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Comentario de la práctica para el próximo día ===&lt;br /&gt;
El enunciado estará en breve en el campus. Se comenzará después de haber usado Grafana y Telegram.&lt;/div&gt;</summary>
		<author><name>Jordi Binefa</name></author>
		
	</entry>
	<entry>
		<id>https://www.binefa.com/index.php?title=16_/_5_/_2026_-_IoT,_Embedded_Systems,_Edge_y_Cloud&amp;diff=12308</id>
		<title>16 / 5 / 2026 - IoT, Embedded Systems, Edge y Cloud</title>
		<link rel="alternate" type="text/html" href="https://www.binefa.com/index.php?title=16_/_5_/_2026_-_IoT,_Embedded_Systems,_Edge_y_Cloud&amp;diff=12308"/>
		<updated>2026-05-14T10:36:11Z</updated>

		<summary type="html">&lt;p&gt;Jordi Binefa: /* Información actualizada de los vídeos de la clase invertida */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Conceptos previos (15 / 5 / 2026) =&lt;br /&gt;
Acceso a la base de datos del VPS del máster&lt;br /&gt;
&lt;br /&gt;
= Temario (16 / 5 / 2026) =&lt;br /&gt;
[https://meet.google.com/rke-afvm-eou Videoconferencia]&lt;br /&gt;
&lt;br /&gt;
== Información actualizada de los vídeos de la clase invertida ==&lt;br /&gt;
[https://binefa.com/upc-school/cambiosSegundoDia2026.pdf Cambios respecto los vídeos de la clase invertida]&lt;br /&gt;
* En todos los sitios donde aparece '''vps656540.ovh.net''' ahora es '''master.iotvertebrae.com'''&lt;br /&gt;
* Por seguridad, la contraseña para acceder al VPS por terminal está dentro de la descripción del vídeo en el Campus (en vez de **** está la contraseña):&lt;br /&gt;
&lt;br /&gt;
''Vídeo NodeRED con MySQL parte 1/3   (clase invertida) (VPS: convidat / ****)''&lt;br /&gt;
&lt;br /&gt;
- Acceso desde el terminal en Windows (cmd):&lt;br /&gt;
 ssh convidat@master.iotvertebrae.com&lt;br /&gt;
- Acceso desde el terminal en Linux:&lt;br /&gt;
 ssh -o ServerAliveInterval=30 convidat@master.iotvertebrae.com&lt;br /&gt;
&lt;br /&gt;
Una vez dentro del VPS se puede acceder a la base de datos con los usuarios (no hay cambios):&lt;br /&gt;
- '''convidat''' (contraseña: '''''benvingut''''')&lt;br /&gt;
- '''iot''' (contraseña: '''''iot''''')&lt;br /&gt;
&lt;br /&gt;
== Repaso del día anterior ==&lt;br /&gt;
* [https://www.binefa.cat/training/iot02/pdf/iot02_00_es.pdf Introducción a la placa IoT-02]&lt;br /&gt;
* [[El protocolo MQTT]]&lt;br /&gt;
* [[Gemelos digitales especializados]] (Placa IoT-02 e IoT-Vertebrae)&lt;br /&gt;
&lt;br /&gt;
== Conexión entre la placa IoT-02 y Snap! mediante MQTT ==&lt;br /&gt;
&amp;lt;!-- '''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;
&lt;br /&gt;
* Broker MQTT púplico:&lt;br /&gt;
** MQTT TCP por el puerto no seguro 1883: '''broker.emqx.io'''&lt;br /&gt;
** MQTT WSS por puerto seguro: '''wss://broker.emqx.io:8084/mqtt'''&lt;br /&gt;
* Broker MQTT en el VPS del máster:&lt;br /&gt;
** MQTT TCP por el puerto no seguro 1883: '''master.iotvertebrae.com'''&lt;br /&gt;
** MQTT WSS por puerto seguro: '''wss://master.iotvertebrae.com:9002'''&lt;br /&gt;
&amp;lt;!-- '''Nuevo firmware de la placa IoT-02 para el día de hoy''': [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]&lt;br /&gt;
[[Conexión entre la placa IoT-02 y Snap! v8 mediante MQTT]]&lt;br /&gt;
[[Conexión entre la placa IoT-02 y Snap! v9 mediante MQTT]] --&amp;gt;&lt;br /&gt;
[https://snap.berkeley.edu/snap/snap.html#present:Username=jordibinefa&amp;amp;ProjectName=IoT-02_board_segur_66C172FB482D_broker_master_iotvertebrae Control de la placa IoT-02. Broker del VPS del máster] El [https://github.com/jordibinefa/IoT-02/tree/master/codes/IoT-02_mqtt_sync_upcSchool_broker1 ''firmware'' IoT-02_mqtt_sync_upcSchool_broker1] enseña el número MAC por la pantalla OLED cuando la placa IoT-02 se conecta a vuestra wifi. (Cambiar el archivo [https://github.com/jordibinefa/IoT-02/blob/master/codes/IoT-02_mqtt_sync_upcSchool_broker1/IoT-02_wifiCredentials.h IoT-02_wifiCredentials.h] en la línea 21 substituyendo ''iotcat'' por el nombre de la SSID de vuestra wifi y ''1234567890a'' por vuestra contraseña).&lt;br /&gt;
&lt;br /&gt;
== Uso de la base de datos MariaDB para almacenar y leer datos IoT ==&lt;br /&gt;
[[Uso de MariaDB en el VPS del Máster de Industria 4.0 el curso 2025-2026 | Uso de MariaDB en el VPS del Máster de Industria 4.0]]&lt;br /&gt;
&amp;lt;!-- [[Uso de MariaDB en el VPS del Máster de Industria 4.0 el curso 2023-2024]]&lt;br /&gt;
[[Uso de MariaDB en el VPS del Máster de Industria 4.0 el curso 2022-2023 | Uso de MariaDB en el VPS del Máster de Industria 4.0 el curso 2023-2024]]--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Node-RED ==&lt;br /&gt;
[[Asignación de puertos para el curso 2025-2026 | Asignación de puertos para este curso]]&lt;br /&gt;
&amp;lt;!--[[Asignación de puertos para el curso 2023-2024]]&lt;br /&gt;
[[Asignación de puertos para el curso 2022-2023]]--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Uso del Node-RED ===&lt;br /&gt;
[[Uso del NodeRED (2024) | Uso del Node-RED]]&lt;br /&gt;
&amp;lt;!--[[Uso del NodeRED (2023) | Uso del Node-RED]]--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Uso de la base de datos MariaDB desde Node-RED===&lt;br /&gt;
[[Uso de la base de datos MariaDB desde NodeRED (2023) | Uso de la base de datos MariaDB desde Node-RED]]&lt;br /&gt;
&amp;lt;!-- == Telegram ==&lt;br /&gt;
[[Uso de Telegram desde NodeRED]]--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Repaso y dudas de la clase invertida ==&lt;br /&gt;
=== Verificación de nodos instalados ===&lt;br /&gt;
Antes de continuar verificamos que ya tenemos instalado el nodo de MySQL ('''node-red-node-mysql''') y los nodos del panel de control ('''node-red-dashboard''' -marcado como ''deprecated''-).&lt;br /&gt;
==== Nodo node-red-node-mysql ====&lt;br /&gt;
[https://flows.nodered.org/node/node-red-node-mysql Documentación oficial del nodo ''node-red-node-mysql'']&lt;br /&gt;
&lt;br /&gt;
[[Image:10MariaDbNodeRed00.png|center|thumb|Instalación de los nodos de MariaDB (''MySQL'') en NodeRED]]&lt;br /&gt;
[[Image:11nodoMariaDbNodeRed.png|center|thumb|Aspecto del nodo MySQL en NodeRED]]&lt;br /&gt;
&lt;br /&gt;
==== Nodos node-red-dashboard ====&lt;br /&gt;
[https://flows.nodered.org/node/node-red-dashboard Documentación oficial de los nodos ''node-red-dashboard'']&lt;br /&gt;
&lt;br /&gt;
[[Image:NodosDashboard.png|center|thumb|Nodos del panel de control (''Dashboard'') en NodeRED]]&lt;br /&gt;
&lt;br /&gt;
=== Acceso al VPS del máster ===&lt;br /&gt;
* La contraseña está dentro de la descripción del vídeo en el Campus (en vez de **** está la contraseña):&lt;br /&gt;
&lt;br /&gt;
''Vídeo NodeRED con MySQL parte 1/3   (clase invertida) (VPS: convidat / ****)''&lt;br /&gt;
* Acceso desde el terminal en Linux:&lt;br /&gt;
 ssh -o ServerAliveInterval=30 convidat@master.iotvertebrae.com&lt;br /&gt;
* Acceso desde el terminal en Windows (cmd):&lt;br /&gt;
 ssh convidat@master.iotvertebrae.com&lt;br /&gt;
&lt;br /&gt;
=== Acceso a la base de datos del VPS del máster ===&lt;br /&gt;
* Con permisos de lectura y escritura:&lt;br /&gt;
 mysql -u iot -p&lt;br /&gt;
* Con permisos de lectura:&lt;br /&gt;
 mysql -u convidat -p&lt;br /&gt;
&lt;br /&gt;
=== Repaso ===&lt;br /&gt;
* Uso de JSON con Snap!&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;
&lt;br /&gt;
* Aleatorización de múltiples datos controlada por el panel de control&lt;br /&gt;
&lt;br /&gt;
* Escritura síncrona de múltiples datos asíncronos al mismo tiempo. Uso del formato de datos json&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
* Telegram--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Ejercicios ==&lt;br /&gt;
=== Ejercicio de '''Snap! con MQTT''' ===&lt;br /&gt;
* Mediante Snap! hacer que en la pantalla aparezca, de forma infinita y con una cadencia de dos segundos, el porcentaje de luz leída por la LDR y después la temperatura en grados centígrados.&lt;br /&gt;
&lt;br /&gt;
=== Ejercicios de '''NodeRED''' ===&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;
==== 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;
==== Ejercicio '''NodeRED-03''' ====&lt;br /&gt;
* Implementad una pasarela (''gateway'') HTTP/MQTT para cambiar el estado de los leds y el relé biestable de la placa IoT-02.&lt;br /&gt;
&lt;br /&gt;
==== Ejercicio '''NodeRED-04''' ====&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;br /&gt;
&lt;br /&gt;
==== Ejercicio '''NodeRED-05''' ====&lt;br /&gt;
* Implementar un flujo de NodeRED que supervise continuamente el valor de la LDR. Introducir dos ''sliders'' para fijar umbrales. Cuando la luz supere el umbral establecido el led rojo se enciende y el relé biestable cambia a SET. Cuando la luz baje del segundo umbral establecido el led rojo se apaga (se enciende el verde) y el relé biestable cambia a RESET.&lt;br /&gt;
&lt;br /&gt;
==== Ejercicio '''NodeRED-06''' ====&lt;br /&gt;
* Implementar un flujo de NodeRED que permita la entrada de un texto y con un botón lo envie a la pantalla OLED.&lt;br /&gt;
&lt;br /&gt;
==== Ejercicio '''NodeRED-07''' ====&lt;br /&gt;
* Implementar un flujo de NodeRED que permita seleccionar un mode de funcionamiento automático o manual. En manual se puede encender y apagar el led blanco mediante un ''switch''. En modo automático el led blanco se enciende o se apaga en función de un umbral consignado mediante un ''slider''. (Para habilitar o inhabilitar un ''switch'' se puede usar ''msg.enabled'').&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--=== Ejercicios '''Telegram''' ===&lt;br /&gt;
* Desde el chat del bot: Al enviar la orden '''/ledWon''' se enciende el led blanco de la placa IoT-02. Al enviar la orden '''/ledWoff''' se apaga el led blanco.&lt;br /&gt;
&lt;br /&gt;
* Desde el chat del bot: Al enviar la orden '''/ledReleSet''' el relé se pone en estado SET. Al enviar la orden '''/ledReleReset''' el relé se pone en estado RESET.&lt;br /&gt;
&lt;br /&gt;
* El chat de vuestro bot recibe un mensaje cuando se aprieta vuestro botón I34 y cuando se deja de apretar.&lt;br /&gt;
&lt;br /&gt;
* Desde el chat del grupo donde pertenece vuestro bot: Al enviar la orden '''/entradas''' el bot contesta con los estados de los botones y la temperatura de la placa.--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Comentario de la práctica para el próximo día ===&lt;br /&gt;
El enunciado estará en breve en el campus. Se comenzará después de haber usado Grafana y Telegram.&lt;/div&gt;</summary>
		<author><name>Jordi Binefa</name></author>
		
	</entry>
	<entry>
		<id>https://www.binefa.com/index.php?title=16_/_5_/_2026_-_IoT,_Embedded_Systems,_Edge_y_Cloud&amp;diff=12307</id>
		<title>16 / 5 / 2026 - IoT, Embedded Systems, Edge y Cloud</title>
		<link rel="alternate" type="text/html" href="https://www.binefa.com/index.php?title=16_/_5_/_2026_-_IoT,_Embedded_Systems,_Edge_y_Cloud&amp;diff=12307"/>
		<updated>2026-05-14T10:35:32Z</updated>

		<summary type="html">&lt;p&gt;Jordi Binefa: /* Temario (16 / 5 / 2026) */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Conceptos previos (15 / 5 / 2026) =&lt;br /&gt;
Acceso a la base de datos del VPS del máster&lt;br /&gt;
&lt;br /&gt;
= Temario (16 / 5 / 2026) =&lt;br /&gt;
[https://meet.google.com/rke-afvm-eou Videoconferencia]&lt;br /&gt;
&lt;br /&gt;
== Información actualizada de los vídeos de la clase invertida ==&lt;br /&gt;
[https://binefa.com/upc-school/cambiosSegundoDia2026.pdf Cambios respecto los vídeos de la clase invertida]&lt;br /&gt;
* En todos los sitios donde aparece '''vps656540.ovh.net''' ahora es '''master.iotvertebrae.com'''&lt;br /&gt;
* Por seguridad, la contraseña para acceder al VPS por terminal está dentro de la descripción del vídeo en el Campus (en vez de **** está la contraseña):&lt;br /&gt;
&lt;br /&gt;
''Vídeo NodeRED con MySQL parte 1/3   (clase invertida) (VPS: convidat / ****)''&lt;br /&gt;
&lt;br /&gt;
** Acceso desde el terminal en Windows (cmd):&lt;br /&gt;
 ssh convidat@master.iotvertebrae.com&lt;br /&gt;
** Acceso desde el terminal en Linux:&lt;br /&gt;
 ssh -o ServerAliveInterval=30 convidat@master.iotvertebrae.com&lt;br /&gt;
&lt;br /&gt;
Una vez dentro del VPS se puede acceder a la base de datos con los usuarios (no hay cambios):&lt;br /&gt;
** '''convidat''' (contraseña: '''''benvingut''''')&lt;br /&gt;
** '''iot''' (contraseña: '''''iot''''') &lt;br /&gt;
&lt;br /&gt;
== Repaso del día anterior ==&lt;br /&gt;
* [https://www.binefa.cat/training/iot02/pdf/iot02_00_es.pdf Introducción a la placa IoT-02]&lt;br /&gt;
* [[El protocolo MQTT]]&lt;br /&gt;
* [[Gemelos digitales especializados]] (Placa IoT-02 e IoT-Vertebrae)&lt;br /&gt;
&lt;br /&gt;
== Conexión entre la placa IoT-02 y Snap! mediante MQTT ==&lt;br /&gt;
&amp;lt;!-- '''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;
&lt;br /&gt;
* Broker MQTT púplico:&lt;br /&gt;
** MQTT TCP por el puerto no seguro 1883: '''broker.emqx.io'''&lt;br /&gt;
** MQTT WSS por puerto seguro: '''wss://broker.emqx.io:8084/mqtt'''&lt;br /&gt;
* Broker MQTT en el VPS del máster:&lt;br /&gt;
** MQTT TCP por el puerto no seguro 1883: '''master.iotvertebrae.com'''&lt;br /&gt;
** MQTT WSS por puerto seguro: '''wss://master.iotvertebrae.com:9002'''&lt;br /&gt;
&amp;lt;!-- '''Nuevo firmware de la placa IoT-02 para el día de hoy''': [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]&lt;br /&gt;
[[Conexión entre la placa IoT-02 y Snap! v8 mediante MQTT]]&lt;br /&gt;
[[Conexión entre la placa IoT-02 y Snap! v9 mediante MQTT]] --&amp;gt;&lt;br /&gt;
[https://snap.berkeley.edu/snap/snap.html#present:Username=jordibinefa&amp;amp;ProjectName=IoT-02_board_segur_66C172FB482D_broker_master_iotvertebrae Control de la placa IoT-02. Broker del VPS del máster] El [https://github.com/jordibinefa/IoT-02/tree/master/codes/IoT-02_mqtt_sync_upcSchool_broker1 ''firmware'' IoT-02_mqtt_sync_upcSchool_broker1] enseña el número MAC por la pantalla OLED cuando la placa IoT-02 se conecta a vuestra wifi. (Cambiar el archivo [https://github.com/jordibinefa/IoT-02/blob/master/codes/IoT-02_mqtt_sync_upcSchool_broker1/IoT-02_wifiCredentials.h IoT-02_wifiCredentials.h] en la línea 21 substituyendo ''iotcat'' por el nombre de la SSID de vuestra wifi y ''1234567890a'' por vuestra contraseña).&lt;br /&gt;
&lt;br /&gt;
== Uso de la base de datos MariaDB para almacenar y leer datos IoT ==&lt;br /&gt;
[[Uso de MariaDB en el VPS del Máster de Industria 4.0 el curso 2025-2026 | Uso de MariaDB en el VPS del Máster de Industria 4.0]]&lt;br /&gt;
&amp;lt;!-- [[Uso de MariaDB en el VPS del Máster de Industria 4.0 el curso 2023-2024]]&lt;br /&gt;
[[Uso de MariaDB en el VPS del Máster de Industria 4.0 el curso 2022-2023 | Uso de MariaDB en el VPS del Máster de Industria 4.0 el curso 2023-2024]]--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Node-RED ==&lt;br /&gt;
[[Asignación de puertos para el curso 2025-2026 | Asignación de puertos para este curso]]&lt;br /&gt;
&amp;lt;!--[[Asignación de puertos para el curso 2023-2024]]&lt;br /&gt;
[[Asignación de puertos para el curso 2022-2023]]--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Uso del Node-RED ===&lt;br /&gt;
[[Uso del NodeRED (2024) | Uso del Node-RED]]&lt;br /&gt;
&amp;lt;!--[[Uso del NodeRED (2023) | Uso del Node-RED]]--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Uso de la base de datos MariaDB desde Node-RED===&lt;br /&gt;
[[Uso de la base de datos MariaDB desde NodeRED (2023) | Uso de la base de datos MariaDB desde Node-RED]]&lt;br /&gt;
&amp;lt;!-- == Telegram ==&lt;br /&gt;
[[Uso de Telegram desde NodeRED]]--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Repaso y dudas de la clase invertida ==&lt;br /&gt;
=== Verificación de nodos instalados ===&lt;br /&gt;
Antes de continuar verificamos que ya tenemos instalado el nodo de MySQL ('''node-red-node-mysql''') y los nodos del panel de control ('''node-red-dashboard''' -marcado como ''deprecated''-).&lt;br /&gt;
==== Nodo node-red-node-mysql ====&lt;br /&gt;
[https://flows.nodered.org/node/node-red-node-mysql Documentación oficial del nodo ''node-red-node-mysql'']&lt;br /&gt;
&lt;br /&gt;
[[Image:10MariaDbNodeRed00.png|center|thumb|Instalación de los nodos de MariaDB (''MySQL'') en NodeRED]]&lt;br /&gt;
[[Image:11nodoMariaDbNodeRed.png|center|thumb|Aspecto del nodo MySQL en NodeRED]]&lt;br /&gt;
&lt;br /&gt;
==== Nodos node-red-dashboard ====&lt;br /&gt;
[https://flows.nodered.org/node/node-red-dashboard Documentación oficial de los nodos ''node-red-dashboard'']&lt;br /&gt;
&lt;br /&gt;
[[Image:NodosDashboard.png|center|thumb|Nodos del panel de control (''Dashboard'') en NodeRED]]&lt;br /&gt;
&lt;br /&gt;
=== Acceso al VPS del máster ===&lt;br /&gt;
* La contraseña está dentro de la descripción del vídeo en el Campus (en vez de **** está la contraseña):&lt;br /&gt;
&lt;br /&gt;
''Vídeo NodeRED con MySQL parte 1/3   (clase invertida) (VPS: convidat / ****)''&lt;br /&gt;
* Acceso desde el terminal en Linux:&lt;br /&gt;
 ssh -o ServerAliveInterval=30 convidat@master.iotvertebrae.com&lt;br /&gt;
* Acceso desde el terminal en Windows (cmd):&lt;br /&gt;
 ssh convidat@master.iotvertebrae.com&lt;br /&gt;
&lt;br /&gt;
=== Acceso a la base de datos del VPS del máster ===&lt;br /&gt;
* Con permisos de lectura y escritura:&lt;br /&gt;
 mysql -u iot -p&lt;br /&gt;
* Con permisos de lectura:&lt;br /&gt;
 mysql -u convidat -p&lt;br /&gt;
&lt;br /&gt;
=== Repaso ===&lt;br /&gt;
* Uso de JSON con Snap!&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;
&lt;br /&gt;
* Aleatorización de múltiples datos controlada por el panel de control&lt;br /&gt;
&lt;br /&gt;
* Escritura síncrona de múltiples datos asíncronos al mismo tiempo. Uso del formato de datos json&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
* Telegram--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Ejercicios ==&lt;br /&gt;
=== Ejercicio de '''Snap! con MQTT''' ===&lt;br /&gt;
* Mediante Snap! hacer que en la pantalla aparezca, de forma infinita y con una cadencia de dos segundos, el porcentaje de luz leída por la LDR y después la temperatura en grados centígrados.&lt;br /&gt;
&lt;br /&gt;
=== Ejercicios de '''NodeRED''' ===&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;
==== 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;
==== Ejercicio '''NodeRED-03''' ====&lt;br /&gt;
* Implementad una pasarela (''gateway'') HTTP/MQTT para cambiar el estado de los leds y el relé biestable de la placa IoT-02.&lt;br /&gt;
&lt;br /&gt;
==== Ejercicio '''NodeRED-04''' ====&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;br /&gt;
&lt;br /&gt;
==== Ejercicio '''NodeRED-05''' ====&lt;br /&gt;
* Implementar un flujo de NodeRED que supervise continuamente el valor de la LDR. Introducir dos ''sliders'' para fijar umbrales. Cuando la luz supere el umbral establecido el led rojo se enciende y el relé biestable cambia a SET. Cuando la luz baje del segundo umbral establecido el led rojo se apaga (se enciende el verde) y el relé biestable cambia a RESET.&lt;br /&gt;
&lt;br /&gt;
==== Ejercicio '''NodeRED-06''' ====&lt;br /&gt;
* Implementar un flujo de NodeRED que permita la entrada de un texto y con un botón lo envie a la pantalla OLED.&lt;br /&gt;
&lt;br /&gt;
==== Ejercicio '''NodeRED-07''' ====&lt;br /&gt;
* Implementar un flujo de NodeRED que permita seleccionar un mode de funcionamiento automático o manual. En manual se puede encender y apagar el led blanco mediante un ''switch''. En modo automático el led blanco se enciende o se apaga en función de un umbral consignado mediante un ''slider''. (Para habilitar o inhabilitar un ''switch'' se puede usar ''msg.enabled'').&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--=== Ejercicios '''Telegram''' ===&lt;br /&gt;
* Desde el chat del bot: Al enviar la orden '''/ledWon''' se enciende el led blanco de la placa IoT-02. Al enviar la orden '''/ledWoff''' se apaga el led blanco.&lt;br /&gt;
&lt;br /&gt;
* Desde el chat del bot: Al enviar la orden '''/ledReleSet''' el relé se pone en estado SET. Al enviar la orden '''/ledReleReset''' el relé se pone en estado RESET.&lt;br /&gt;
&lt;br /&gt;
* El chat de vuestro bot recibe un mensaje cuando se aprieta vuestro botón I34 y cuando se deja de apretar.&lt;br /&gt;
&lt;br /&gt;
* Desde el chat del grupo donde pertenece vuestro bot: Al enviar la orden '''/entradas''' el bot contesta con los estados de los botones y la temperatura de la placa.--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Comentario de la práctica para el próximo día ===&lt;br /&gt;
El enunciado estará en breve en el campus. Se comenzará después de haber usado Grafana y Telegram.&lt;/div&gt;</summary>
		<author><name>Jordi Binefa</name></author>
		
	</entry>
	<entry>
		<id>https://www.binefa.com/index.php?title=16_/_5_/_2026_-_IoT,_Embedded_Systems,_Edge_y_Cloud&amp;diff=12306</id>
		<title>16 / 5 / 2026 - IoT, Embedded Systems, Edge y Cloud</title>
		<link rel="alternate" type="text/html" href="https://www.binefa.com/index.php?title=16_/_5_/_2026_-_IoT,_Embedded_Systems,_Edge_y_Cloud&amp;diff=12306"/>
		<updated>2026-05-14T10:21:50Z</updated>

		<summary type="html">&lt;p&gt;Jordi Binefa: /* Acceso al VPS del máster */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Conceptos previos (15 / 5 / 2026) =&lt;br /&gt;
Acceso a la base de datos del VPS del máster&lt;br /&gt;
&lt;br /&gt;
= Temario (16 / 5 / 2026) =&lt;br /&gt;
[https://meet.google.com/rke-afvm-eou Videoconferencia]&lt;br /&gt;
&lt;br /&gt;
== Repaso del día anterior ==&lt;br /&gt;
* [https://www.binefa.cat/training/iot02/pdf/iot02_00_es.pdf Introducción a la placa IoT-02]&lt;br /&gt;
* [[El protocolo MQTT]]&lt;br /&gt;
* [[Gemelos digitales especializados]] (Placa IoT-02 e IoT-Vertebrae)&lt;br /&gt;
&lt;br /&gt;
== Conexión entre la placa IoT-02 y Snap! mediante MQTT ==&lt;br /&gt;
&amp;lt;!-- '''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;
&lt;br /&gt;
* Broker MQTT púplico:&lt;br /&gt;
** MQTT TCP por el puerto no seguro 1883: '''broker.emqx.io'''&lt;br /&gt;
** MQTT WSS por puerto seguro: '''wss://broker.emqx.io:8084/mqtt'''&lt;br /&gt;
* Broker MQTT en el VPS del máster:&lt;br /&gt;
** MQTT TCP por el puerto no seguro 1883: '''master.iotvertebrae.com'''&lt;br /&gt;
** MQTT WSS por puerto seguro: '''wss://master.iotvertebrae.com:9002'''&lt;br /&gt;
&amp;lt;!-- '''Nuevo firmware de la placa IoT-02 para el día de hoy''': [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]&lt;br /&gt;
[[Conexión entre la placa IoT-02 y Snap! v8 mediante MQTT]]&lt;br /&gt;
[[Conexión entre la placa IoT-02 y Snap! v9 mediante MQTT]] --&amp;gt;&lt;br /&gt;
[https://snap.berkeley.edu/snap/snap.html#present:Username=jordibinefa&amp;amp;ProjectName=IoT-02_board_segur_66C172FB482D_broker_master_iotvertebrae Control de la placa IoT-02. Broker del VPS del máster] El [https://github.com/jordibinefa/IoT-02/tree/master/codes/IoT-02_mqtt_sync_upcSchool_broker1 ''firmware'' IoT-02_mqtt_sync_upcSchool_broker1] enseña el número MAC por la pantalla OLED cuando la placa IoT-02 se conecta a vuestra wifi. (Cambiar el archivo [https://github.com/jordibinefa/IoT-02/blob/master/codes/IoT-02_mqtt_sync_upcSchool_broker1/IoT-02_wifiCredentials.h IoT-02_wifiCredentials.h] en la línea 21 substituyendo ''iotcat'' por el nombre de la SSID de vuestra wifi y ''1234567890a'' por vuestra contraseña).&lt;br /&gt;
&lt;br /&gt;
== Uso de la base de datos MariaDB para almacenar y leer datos IoT ==&lt;br /&gt;
[[Uso de MariaDB en el VPS del Máster de Industria 4.0 el curso 2025-2026 | Uso de MariaDB en el VPS del Máster de Industria 4.0]]&lt;br /&gt;
&amp;lt;!-- [[Uso de MariaDB en el VPS del Máster de Industria 4.0 el curso 2023-2024]]&lt;br /&gt;
[[Uso de MariaDB en el VPS del Máster de Industria 4.0 el curso 2022-2023 | Uso de MariaDB en el VPS del Máster de Industria 4.0 el curso 2023-2024]]--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Node-RED ==&lt;br /&gt;
[[Asignación de puertos para el curso 2025-2026 | Asignación de puertos para este curso]]&lt;br /&gt;
&amp;lt;!--[[Asignación de puertos para el curso 2023-2024]]&lt;br /&gt;
[[Asignación de puertos para el curso 2022-2023]]--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Uso del Node-RED ===&lt;br /&gt;
[[Uso del NodeRED (2024) | Uso del Node-RED]]&lt;br /&gt;
&amp;lt;!--[[Uso del NodeRED (2023) | Uso del Node-RED]]--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Uso de la base de datos MariaDB desde Node-RED===&lt;br /&gt;
[[Uso de la base de datos MariaDB desde NodeRED (2023) | Uso de la base de datos MariaDB desde Node-RED]]&lt;br /&gt;
&amp;lt;!-- == Telegram ==&lt;br /&gt;
[[Uso de Telegram desde NodeRED]]--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Repaso y dudas de la clase invertida ==&lt;br /&gt;
=== Verificación de nodos instalados ===&lt;br /&gt;
Antes de continuar verificamos que ya tenemos instalado el nodo de MySQL ('''node-red-node-mysql''') y los nodos del panel de control ('''node-red-dashboard''' -marcado como ''deprecated''-).&lt;br /&gt;
==== Nodo node-red-node-mysql ====&lt;br /&gt;
[https://flows.nodered.org/node/node-red-node-mysql Documentación oficial del nodo ''node-red-node-mysql'']&lt;br /&gt;
&lt;br /&gt;
[[Image:10MariaDbNodeRed00.png|center|thumb|Instalación de los nodos de MariaDB (''MySQL'') en NodeRED]]&lt;br /&gt;
[[Image:11nodoMariaDbNodeRed.png|center|thumb|Aspecto del nodo MySQL en NodeRED]]&lt;br /&gt;
&lt;br /&gt;
==== Nodos node-red-dashboard ====&lt;br /&gt;
[https://flows.nodered.org/node/node-red-dashboard Documentación oficial de los nodos ''node-red-dashboard'']&lt;br /&gt;
&lt;br /&gt;
[[Image:NodosDashboard.png|center|thumb|Nodos del panel de control (''Dashboard'') en NodeRED]]&lt;br /&gt;
&lt;br /&gt;
=== Acceso al VPS del máster ===&lt;br /&gt;
* La contraseña está dentro de la descripción del vídeo en el Campus (en vez de **** está la contraseña):&lt;br /&gt;
&lt;br /&gt;
''Vídeo NodeRED con MySQL parte 1/3   (clase invertida) (VPS: convidat / ****)''&lt;br /&gt;
* Acceso desde el terminal en Linux:&lt;br /&gt;
 ssh -o ServerAliveInterval=30 convidat@master.iotvertebrae.com&lt;br /&gt;
* Acceso desde el terminal en Windows (cmd):&lt;br /&gt;
 ssh convidat@master.iotvertebrae.com&lt;br /&gt;
&lt;br /&gt;
=== Acceso a la base de datos del VPS del máster ===&lt;br /&gt;
* Con permisos de lectura y escritura:&lt;br /&gt;
 mysql -u iot -p&lt;br /&gt;
* Con permisos de lectura:&lt;br /&gt;
 mysql -u convidat -p&lt;br /&gt;
&lt;br /&gt;
=== Repaso ===&lt;br /&gt;
* Uso de JSON con Snap!&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;
&lt;br /&gt;
* Aleatorización de múltiples datos controlada por el panel de control&lt;br /&gt;
&lt;br /&gt;
* Escritura síncrona de múltiples datos asíncronos al mismo tiempo. Uso del formato de datos json&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
* Telegram--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Ejercicios ==&lt;br /&gt;
=== Ejercicio de '''Snap! con MQTT''' ===&lt;br /&gt;
* Mediante Snap! hacer que en la pantalla aparezca, de forma infinita y con una cadencia de dos segundos, el porcentaje de luz leída por la LDR y después la temperatura en grados centígrados.&lt;br /&gt;
&lt;br /&gt;
=== Ejercicios de '''NodeRED''' ===&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;
==== 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;
==== Ejercicio '''NodeRED-03''' ====&lt;br /&gt;
* Implementad una pasarela (''gateway'') HTTP/MQTT para cambiar el estado de los leds y el relé biestable de la placa IoT-02.&lt;br /&gt;
&lt;br /&gt;
==== Ejercicio '''NodeRED-04''' ====&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;br /&gt;
&lt;br /&gt;
==== Ejercicio '''NodeRED-05''' ====&lt;br /&gt;
* Implementar un flujo de NodeRED que supervise continuamente el valor de la LDR. Introducir dos ''sliders'' para fijar umbrales. Cuando la luz supere el umbral establecido el led rojo se enciende y el relé biestable cambia a SET. Cuando la luz baje del segundo umbral establecido el led rojo se apaga (se enciende el verde) y el relé biestable cambia a RESET.&lt;br /&gt;
&lt;br /&gt;
==== Ejercicio '''NodeRED-06''' ====&lt;br /&gt;
* Implementar un flujo de NodeRED que permita la entrada de un texto y con un botón lo envie a la pantalla OLED.&lt;br /&gt;
&lt;br /&gt;
==== Ejercicio '''NodeRED-07''' ====&lt;br /&gt;
* Implementar un flujo de NodeRED que permita seleccionar un mode de funcionamiento automático o manual. En manual se puede encender y apagar el led blanco mediante un ''switch''. En modo automático el led blanco se enciende o se apaga en función de un umbral consignado mediante un ''slider''. (Para habilitar o inhabilitar un ''switch'' se puede usar ''msg.enabled'').&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--=== Ejercicios '''Telegram''' ===&lt;br /&gt;
* Desde el chat del bot: Al enviar la orden '''/ledWon''' se enciende el led blanco de la placa IoT-02. Al enviar la orden '''/ledWoff''' se apaga el led blanco.&lt;br /&gt;
&lt;br /&gt;
* Desde el chat del bot: Al enviar la orden '''/ledReleSet''' el relé se pone en estado SET. Al enviar la orden '''/ledReleReset''' el relé se pone en estado RESET.&lt;br /&gt;
&lt;br /&gt;
* El chat de vuestro bot recibe un mensaje cuando se aprieta vuestro botón I34 y cuando se deja de apretar.&lt;br /&gt;
&lt;br /&gt;
* Desde el chat del grupo donde pertenece vuestro bot: Al enviar la orden '''/entradas''' el bot contesta con los estados de los botones y la temperatura de la placa.--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Comentario de la práctica para el próximo día ===&lt;br /&gt;
El enunciado estará en breve en el campus. Se comenzará después de haber usado Grafana y Telegram.&lt;/div&gt;</summary>
		<author><name>Jordi Binefa</name></author>
		
	</entry>
	<entry>
		<id>https://www.binefa.com/index.php?title=Uso_de_MariaDB_en_el_VPS_del_M%C3%A1ster_de_Industria_4.0_el_curso_2025-2026&amp;diff=12305</id>
		<title>Uso de MariaDB en el VPS del Máster de Industria 4.0 el curso 2025-2026</title>
		<link rel="alternate" type="text/html" href="https://www.binefa.com/index.php?title=Uso_de_MariaDB_en_el_VPS_del_M%C3%A1ster_de_Industria_4.0_el_curso_2025-2026&amp;diff=12305"/>
		<updated>2026-05-14T10:20:58Z</updated>

		<summary type="html">&lt;p&gt;Jordi Binefa: /* Acceso al terminal del VPS */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Acceso al terminal del VPS =&lt;br /&gt;
* Para acceder al terminal remoto del VPS desde Windows, abrir el teminal (''cmd'') o el ''powershell'' y escribir:&lt;br /&gt;
 ssh '''convidat'''@master.iotvertebrae.com&lt;br /&gt;
La contraseña era ''benvingut''. La contrasenya de esta edición del máster está dentro de la descripción del vídeo en el Campus (en vez de **** está la contraseña): ''Vídeo NodeRED con MySQL parte 1/3   (clase invertida) (VPS: convidat / ****)''&lt;br /&gt;
&lt;br /&gt;
* Para acceder al terminal remoto del VPS desde Linux, abrir el teminal escribir:&lt;br /&gt;
 ssh '''convidat'''@master.iotvertebrae.com&lt;br /&gt;
y en caso de querer enviar cada 30 segundos un ''blank token'' para evitar la desconexión por ''time out'':&lt;br /&gt;
 ssh -o ServerAliveInterval=30 '''convidat'''@master.iotvertebrae.com&lt;br /&gt;
&lt;br /&gt;
= Información sobre la instalación de la base de datos MariaDB =&lt;br /&gt;
'''Este apartado es puramente informativo'''. En el VPS ya está instalada la base de datos.&lt;br /&gt;
&lt;br /&gt;
[https://www.digitalocean.com/community/tutorials/how-to-install-mariadb-on-debian-11 Un tutorial de instalación de MariaDB en Debian 11]&lt;br /&gt;
&lt;br /&gt;
Pasos de la instalación desde el terminal:&lt;br /&gt;
 sudo apt update&lt;br /&gt;
 sudo apt install mariadb-server&lt;br /&gt;
 sudo mariadb-secure-installation ''(en este paso el sistema pregunta una contraseña para el usuario '''root''')''&lt;br /&gt;
&lt;br /&gt;
[https://www.digitalocean.com/community/tutorials/how-to-create-a-new-user-and-grant-permissions-in-mysql Un tutorial de creación de usuarios con diferentes permisos (''privilegios'')]&lt;br /&gt;
&lt;br /&gt;
Desde el terminal del sistema operativo se pide entrar al terminal de MariaDB. La primera vez como usuario ''root'':&lt;br /&gt;
 sudo mysql -u root -p&lt;br /&gt;
 ''(el sistema pide la contraseña del usuario root)''&lt;br /&gt;
Una vez dentro del terminal de MariaDB se crean los usuarios ''iot'' y ''convidat'' con sus respectivas contraseñas. Se crea la base de datos ''aula206'', se otorgan todos los permisos al usuario ''iot'' y tan solo la lectura al usuario ''convidat'':&lt;br /&gt;
 CREATE USER 'iot'@'localhost' IDENTIFIED BY 'iot';&lt;br /&gt;
 CREATE USER 'convidat'@'localhost' IDENTIFIED BY 'benvingut';&lt;br /&gt;
 &lt;br /&gt;
 CREATE DATABASE aula206;&lt;br /&gt;
 SHOW DATABASES;&lt;br /&gt;
 USE aula206;&lt;br /&gt;
 &lt;br /&gt;
 GRANT ALL PRIVILEGES ON aula206.* TO 'iot'@'localhost';&lt;br /&gt;
 GRANT SELECT ON aula206.* TO 'convidat'@'localhost';&lt;br /&gt;
 FLUSH PRIVILEGES;&lt;br /&gt;
&lt;br /&gt;
= Acceso a la base de datos desde el terminal del VPS =&lt;br /&gt;
Para acceder a la base de datos hay tres usuarios con permisos diferentes:&lt;br /&gt;
&lt;br /&gt;
- '''root''': Tiene todos los permisos. Puede crear usuarios y bases de datos.&lt;br /&gt;
&lt;br /&gt;
- '''iot''': Tiene permisos de '''lectura y escritura''' sobre la base de datos '''aula206'''.&lt;br /&gt;
&lt;br /&gt;
- '''convidat''': Tiene permisos de '''lectura''' sobre la base de datos '''aula206'''.&lt;br /&gt;
&lt;br /&gt;
Para acceder al terminal de MariaDB como usuario '''iot''':&lt;br /&gt;
 mysql -u '''iot''' -p&lt;br /&gt;
 (el sistema pregunta por la contraseña de este usuario. Es la que sale en el apartado anterior después de ''IDENTIFIED BY'')&lt;br /&gt;
&lt;br /&gt;
Para acceder al terminal de MariaDB como usuario '''convidat''':&lt;br /&gt;
 mysql -u '''convidat''' -p&lt;br /&gt;
 (el sistema pregunta por la contraseña de este usuario. Es la que sale en el apartado anterior después de ''IDENTIFIED BY'')&lt;br /&gt;
&lt;br /&gt;
= Creación de tablas =&lt;br /&gt;
Para crear tablas en la base de datos hace falta que el usuario tenga permisos de escritura a la base de datos ('''iot''' tiene permisos de escritura en la base de datos '''aula206'''. '''convidat''' no tiene permisos de escritura en la base de datos '''aula206''').&lt;br /&gt;
&lt;br /&gt;
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 [[Asignación de puertos para el curso 2022-2023 | número de puerto que se os ha asignado]].&lt;br /&gt;
&lt;br /&gt;
 mysql -u '''iot''' -p&lt;br /&gt;
 (el sistema pregunta por la contraseña de este usuario. Es la que sale en el apartado anterior después de ''IDENTIFIED BY'')&lt;br /&gt;
 USE aula206;&lt;br /&gt;
 '''CREATE''' TABLE m'''28XX'''_Temperatura (&lt;br /&gt;
  time TIMESTAMP DEFAULT CURRENT_TIMESTAMP,&lt;br /&gt;
  value FLOAT,&lt;br /&gt;
  PRIMARY KEY (time));&lt;br /&gt;
'''value''' es el nombre del valor que vamos a introducir en la tabla. Se declara como ''FLOAT'' (número real. Permite decimales).&lt;br /&gt;
&lt;br /&gt;
= Borrado de tablas =&lt;br /&gt;
'''Id con cuidado en el momento de borrar una tabla. El proceso borra todos los datos y la misma tabla. No es posible recuperar los datos de las tablas si no se ha hecho una copia de seguridad'''.&lt;br /&gt;
&lt;br /&gt;
Para borrar tablas en la base de datos hace falta que el usuario tenga permisos de escritura a la base de datos ('''iot''' tiene permisos de escritura en la base de datos '''aula206'''. '''convidat''' no tiene permisos de escritura en la base de datos '''aula206'''). &lt;br /&gt;
 mysql -u '''iot''' -p&lt;br /&gt;
 (el sistema pregunta por la contraseña de este usuario. Es la que sale en el apartado anterior después de ''IDENTIFIED BY'')&lt;br /&gt;
 USE aula206;&lt;br /&gt;
 '''DROP TABLE''' m28XX_Temperatura;&lt;br /&gt;
&lt;br /&gt;
= Inserción de datos =&lt;br /&gt;
La inserción (también conocida por escritura) de datos tiene que hacerla un usuario con permisos suficientes (el usuario '''iot''' puede escribir).&lt;br /&gt;
&lt;br /&gt;
Ejemplo de inserción del valor 23.4 como valor en el campo '''value'''.&lt;br /&gt;
 '''insert''' into m28XX_Temperatura (value) values (23.4);&lt;br /&gt;
&lt;br /&gt;
= Lectura de datos =&lt;br /&gt;
La lectura de datos tiene que hacerla un usuario con permisos suficientes (los usuarios '''iot''' y '''convidat''' pueden leer).&lt;br /&gt;
&lt;br /&gt;
[https://mariadb.com/kb/es/select/ Documentación oficial de la orden SELECT].&lt;br /&gt;
&lt;br /&gt;
Visualización de todos los datos de la tabla m28XX_Temperatura:&lt;br /&gt;
 '''select''' * from m28XX_Temperatura;&lt;br /&gt;
&lt;br /&gt;
Ejemplo de respuesta del terminal de MariaDB:&lt;br /&gt;
 MariaDB [aula206]&amp;gt; '''select * from m28XX_Temperatura;'''&lt;br /&gt;
 +---------------------+-------+&lt;br /&gt;
 | time                | value |&lt;br /&gt;
 +---------------------+-------+&lt;br /&gt;
 | 2023-04-05 17:23:59 |  23.4 |&lt;br /&gt;
 | 2023-04-05 17:28:29 |  23.7 |&lt;br /&gt;
 +---------------------+-------+&lt;br /&gt;
 2 rows in set (0.001 sec)&lt;br /&gt;
&lt;br /&gt;
[https://mariadb.com/kb/en/getting-data-from-mariadb/ Getting Data from MariaDB]&lt;br /&gt;
&lt;br /&gt;
= Creación de tablas vista =&lt;br /&gt;
Para poder usar la base de datos en sistemas externos de graficación nos hará falta que el registro del momento de inserción del dato esté expresado en [https://www.unixtimestamp.com/ formato de la época UNIX]. Ejemplo de visualización de una tabla vista con el valor del tiempo en formato Unix: &lt;br /&gt;
 MariaDB [aula206]&amp;gt; select * from m28XX_Temperatura_v;&lt;br /&gt;
 +------------+-------+&lt;br /&gt;
 | time       | value |&lt;br /&gt;
 +------------+-------+&lt;br /&gt;
 | 1680708239 |  23.4 |&lt;br /&gt;
 | 1680708509 |  23.7 |&lt;br /&gt;
 +------------+-------+&lt;br /&gt;
 2 rows in set (0.000 sec)&lt;br /&gt;
&lt;br /&gt;
Creación de la tabla vista '''m28XX_Temperatura_v''' con la unidad de tiempo cambiada (tomando como origen la tabla '''m28XX_Temperatura'''):&lt;br /&gt;
 '''CREATE VIEW''' m28XX_Temperatura_v AS select UNIX_TIMESTAMP(time) as time, value from m28XX_Temperatura;&lt;br /&gt;
&lt;br /&gt;
= Inserción y lectura de datos múltiples =&lt;br /&gt;
Habitualmente nos hará falta introducir un grupo de datos al mismo tiempo. Por ejemplo, esta tabla contiene tres valores en el mismo momento del registro: &lt;br /&gt;
 MariaDB [aula206]&amp;gt; select * from m28XX_T_RH_P_v;&lt;br /&gt;
 +------------+--------+---------+---------+&lt;br /&gt;
 | time       | valueT | valueRH | valueP  |&lt;br /&gt;
 +------------+--------+---------+---------+&lt;br /&gt;
 | 1680884504 |   23.4 |   45.64 | 1002.34 |&lt;br /&gt;
 | 1680884734 |   23.7 |   45.21 | 1003.04 |&lt;br /&gt;
 | 1680885724 |  17.89 |   44.32 | 1001.23 |&lt;br /&gt;
 | 1680885726 |  19.03 |   40.65 | 1002.11 |&lt;br /&gt;
 | 1680885728 |  15.43 |   56.78 | 1000.87 |&lt;br /&gt;
 | 1680886069 |  19.03 |   40.65 | 1002.11 |&lt;br /&gt;
 +------------+--------+---------+---------+&lt;br /&gt;
 6 rows in set (0.000 sec)&lt;br /&gt;
&lt;br /&gt;
* '''Creación''' de la tabla con datos múltiples ('''valueT''', '''valueRH''' y '''valueP'''):&lt;br /&gt;
 '''CREATE TABLE''' `m28XX_T_RH_P` (&lt;br /&gt;
  `time` TIMESTAMP DEFAULT CURRENT_TIMESTAMP,&lt;br /&gt;
  `'''valueT'''` FLOAT,&lt;br /&gt;
  `'''valueRH'''` FLOAT,&lt;br /&gt;
  `'''valueP'''` FLOAT,&lt;br /&gt;
  PRIMARY KEY (`time`))&lt;br /&gt;
 ENGINE = InnoDB;&lt;br /&gt;
&lt;br /&gt;
* '''Inserción''' de datos múltiples:&lt;br /&gt;
 '''insert into''' m28XX_T_RH_P ('''valueT''','''valueRH''','''valueP''') values (23.4,45.64,1002.34);&lt;br /&gt;
* '''Lectura''' de datos múltiples:&lt;br /&gt;
 '''select''' * '''from''' m28XX_T_RH_P;&lt;br /&gt;
* '''Creación''' de la '''tabla vista''':&lt;br /&gt;
 '''CREATE VIEW''' m28XX_T_RH_P_v '''AS''' select UNIX_TIMESTAMP(time) as time, valueT, valueRH, valueP from m28XX_T_RH_P;&lt;br /&gt;
* '''Borrado''' de la '''tabla vista'''&lt;br /&gt;
 '''DROP VIEW''' IF EXISTS m28XX_T_RH_P_v;&lt;br /&gt;
* '''Borrado''' de la '''tabla'''&lt;br /&gt;
 '''DROP TABLE''' m28XX_T_RH_P;&lt;/div&gt;</summary>
		<author><name>Jordi Binefa</name></author>
		
	</entry>
	<entry>
		<id>https://www.binefa.com/index.php?title=Uso_de_MariaDB_en_el_VPS_del_M%C3%A1ster_de_Industria_4.0_el_curso_2025-2026&amp;diff=12304</id>
		<title>Uso de MariaDB en el VPS del Máster de Industria 4.0 el curso 2025-2026</title>
		<link rel="alternate" type="text/html" href="https://www.binefa.com/index.php?title=Uso_de_MariaDB_en_el_VPS_del_M%C3%A1ster_de_Industria_4.0_el_curso_2025-2026&amp;diff=12304"/>
		<updated>2026-05-14T10:13:29Z</updated>

		<summary type="html">&lt;p&gt;Jordi Binefa: /* Acceso al terminal del VPS */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Acceso al terminal del VPS =&lt;br /&gt;
* Para acceder al terminal remoto del VPS desde Windows, abrir el teminal (''cmd'') o el ''powershell'' y escribir:&lt;br /&gt;
 ssh '''convidat'''@master.iotvertebrae.com&lt;br /&gt;
La contraseña era ''benvingut''. La contrasenya de esta edición del máster está dentro de la descripción del vídeo en el Campus (en vez de **** está la contraseña):&lt;br /&gt;
&lt;br /&gt;
''Vídeo NodeRED con MySQL parte 1/3   (clase invertida) (VPS: convidat / ****)''&lt;br /&gt;
&lt;br /&gt;
* Para acceder al terminal remoto del VPS desde Linux, abrir el teminal escribir:&lt;br /&gt;
 ssh '''convidat'''@master.iotvertebrae.com&lt;br /&gt;
y en caso de querer enviar cada 30 segundos un ''blank token'' para evitar la desconexión por ''time out'':&lt;br /&gt;
 ssh -o ServerAliveInterval=30 '''convidat'''@master.iotvertebrae.com&lt;br /&gt;
&lt;br /&gt;
= Información sobre la instalación de la base de datos MariaDB =&lt;br /&gt;
'''Este apartado es puramente informativo'''. En el VPS ya está instalada la base de datos.&lt;br /&gt;
&lt;br /&gt;
[https://www.digitalocean.com/community/tutorials/how-to-install-mariadb-on-debian-11 Un tutorial de instalación de MariaDB en Debian 11]&lt;br /&gt;
&lt;br /&gt;
Pasos de la instalación desde el terminal:&lt;br /&gt;
 sudo apt update&lt;br /&gt;
 sudo apt install mariadb-server&lt;br /&gt;
 sudo mariadb-secure-installation ''(en este paso el sistema pregunta una contraseña para el usuario '''root''')''&lt;br /&gt;
&lt;br /&gt;
[https://www.digitalocean.com/community/tutorials/how-to-create-a-new-user-and-grant-permissions-in-mysql Un tutorial de creación de usuarios con diferentes permisos (''privilegios'')]&lt;br /&gt;
&lt;br /&gt;
Desde el terminal del sistema operativo se pide entrar al terminal de MariaDB. La primera vez como usuario ''root'':&lt;br /&gt;
 sudo mysql -u root -p&lt;br /&gt;
 ''(el sistema pide la contraseña del usuario root)''&lt;br /&gt;
Una vez dentro del terminal de MariaDB se crean los usuarios ''iot'' y ''convidat'' con sus respectivas contraseñas. Se crea la base de datos ''aula206'', se otorgan todos los permisos al usuario ''iot'' y tan solo la lectura al usuario ''convidat'':&lt;br /&gt;
 CREATE USER 'iot'@'localhost' IDENTIFIED BY 'iot';&lt;br /&gt;
 CREATE USER 'convidat'@'localhost' IDENTIFIED BY 'benvingut';&lt;br /&gt;
 &lt;br /&gt;
 CREATE DATABASE aula206;&lt;br /&gt;
 SHOW DATABASES;&lt;br /&gt;
 USE aula206;&lt;br /&gt;
 &lt;br /&gt;
 GRANT ALL PRIVILEGES ON aula206.* TO 'iot'@'localhost';&lt;br /&gt;
 GRANT SELECT ON aula206.* TO 'convidat'@'localhost';&lt;br /&gt;
 FLUSH PRIVILEGES;&lt;br /&gt;
&lt;br /&gt;
= Acceso a la base de datos desde el terminal del VPS =&lt;br /&gt;
Para acceder a la base de datos hay tres usuarios con permisos diferentes:&lt;br /&gt;
&lt;br /&gt;
- '''root''': Tiene todos los permisos. Puede crear usuarios y bases de datos.&lt;br /&gt;
&lt;br /&gt;
- '''iot''': Tiene permisos de '''lectura y escritura''' sobre la base de datos '''aula206'''.&lt;br /&gt;
&lt;br /&gt;
- '''convidat''': Tiene permisos de '''lectura''' sobre la base de datos '''aula206'''.&lt;br /&gt;
&lt;br /&gt;
Para acceder al terminal de MariaDB como usuario '''iot''':&lt;br /&gt;
 mysql -u '''iot''' -p&lt;br /&gt;
 (el sistema pregunta por la contraseña de este usuario. Es la que sale en el apartado anterior después de ''IDENTIFIED BY'')&lt;br /&gt;
&lt;br /&gt;
Para acceder al terminal de MariaDB como usuario '''convidat''':&lt;br /&gt;
 mysql -u '''convidat''' -p&lt;br /&gt;
 (el sistema pregunta por la contraseña de este usuario. Es la que sale en el apartado anterior después de ''IDENTIFIED BY'')&lt;br /&gt;
&lt;br /&gt;
= Creación de tablas =&lt;br /&gt;
Para crear tablas en la base de datos hace falta que el usuario tenga permisos de escritura a la base de datos ('''iot''' tiene permisos de escritura en la base de datos '''aula206'''. '''convidat''' no tiene permisos de escritura en la base de datos '''aula206''').&lt;br /&gt;
&lt;br /&gt;
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 [[Asignación de puertos para el curso 2022-2023 | número de puerto que se os ha asignado]].&lt;br /&gt;
&lt;br /&gt;
 mysql -u '''iot''' -p&lt;br /&gt;
 (el sistema pregunta por la contraseña de este usuario. Es la que sale en el apartado anterior después de ''IDENTIFIED BY'')&lt;br /&gt;
 USE aula206;&lt;br /&gt;
 '''CREATE''' TABLE m'''28XX'''_Temperatura (&lt;br /&gt;
  time TIMESTAMP DEFAULT CURRENT_TIMESTAMP,&lt;br /&gt;
  value FLOAT,&lt;br /&gt;
  PRIMARY KEY (time));&lt;br /&gt;
'''value''' es el nombre del valor que vamos a introducir en la tabla. Se declara como ''FLOAT'' (número real. Permite decimales).&lt;br /&gt;
&lt;br /&gt;
= Borrado de tablas =&lt;br /&gt;
'''Id con cuidado en el momento de borrar una tabla. El proceso borra todos los datos y la misma tabla. No es posible recuperar los datos de las tablas si no se ha hecho una copia de seguridad'''.&lt;br /&gt;
&lt;br /&gt;
Para borrar tablas en la base de datos hace falta que el usuario tenga permisos de escritura a la base de datos ('''iot''' tiene permisos de escritura en la base de datos '''aula206'''. '''convidat''' no tiene permisos de escritura en la base de datos '''aula206'''). &lt;br /&gt;
 mysql -u '''iot''' -p&lt;br /&gt;
 (el sistema pregunta por la contraseña de este usuario. Es la que sale en el apartado anterior después de ''IDENTIFIED BY'')&lt;br /&gt;
 USE aula206;&lt;br /&gt;
 '''DROP TABLE''' m28XX_Temperatura;&lt;br /&gt;
&lt;br /&gt;
= Inserción de datos =&lt;br /&gt;
La inserción (también conocida por escritura) de datos tiene que hacerla un usuario con permisos suficientes (el usuario '''iot''' puede escribir).&lt;br /&gt;
&lt;br /&gt;
Ejemplo de inserción del valor 23.4 como valor en el campo '''value'''.&lt;br /&gt;
 '''insert''' into m28XX_Temperatura (value) values (23.4);&lt;br /&gt;
&lt;br /&gt;
= Lectura de datos =&lt;br /&gt;
La lectura de datos tiene que hacerla un usuario con permisos suficientes (los usuarios '''iot''' y '''convidat''' pueden leer).&lt;br /&gt;
&lt;br /&gt;
[https://mariadb.com/kb/es/select/ Documentación oficial de la orden SELECT].&lt;br /&gt;
&lt;br /&gt;
Visualización de todos los datos de la tabla m28XX_Temperatura:&lt;br /&gt;
 '''select''' * from m28XX_Temperatura;&lt;br /&gt;
&lt;br /&gt;
Ejemplo de respuesta del terminal de MariaDB:&lt;br /&gt;
 MariaDB [aula206]&amp;gt; '''select * from m28XX_Temperatura;'''&lt;br /&gt;
 +---------------------+-------+&lt;br /&gt;
 | time                | value |&lt;br /&gt;
 +---------------------+-------+&lt;br /&gt;
 | 2023-04-05 17:23:59 |  23.4 |&lt;br /&gt;
 | 2023-04-05 17:28:29 |  23.7 |&lt;br /&gt;
 +---------------------+-------+&lt;br /&gt;
 2 rows in set (0.001 sec)&lt;br /&gt;
&lt;br /&gt;
[https://mariadb.com/kb/en/getting-data-from-mariadb/ Getting Data from MariaDB]&lt;br /&gt;
&lt;br /&gt;
= Creación de tablas vista =&lt;br /&gt;
Para poder usar la base de datos en sistemas externos de graficación nos hará falta que el registro del momento de inserción del dato esté expresado en [https://www.unixtimestamp.com/ formato de la época UNIX]. Ejemplo de visualización de una tabla vista con el valor del tiempo en formato Unix: &lt;br /&gt;
 MariaDB [aula206]&amp;gt; select * from m28XX_Temperatura_v;&lt;br /&gt;
 +------------+-------+&lt;br /&gt;
 | time       | value |&lt;br /&gt;
 +------------+-------+&lt;br /&gt;
 | 1680708239 |  23.4 |&lt;br /&gt;
 | 1680708509 |  23.7 |&lt;br /&gt;
 +------------+-------+&lt;br /&gt;
 2 rows in set (0.000 sec)&lt;br /&gt;
&lt;br /&gt;
Creación de la tabla vista '''m28XX_Temperatura_v''' con la unidad de tiempo cambiada (tomando como origen la tabla '''m28XX_Temperatura'''):&lt;br /&gt;
 '''CREATE VIEW''' m28XX_Temperatura_v AS select UNIX_TIMESTAMP(time) as time, value from m28XX_Temperatura;&lt;br /&gt;
&lt;br /&gt;
= Inserción y lectura de datos múltiples =&lt;br /&gt;
Habitualmente nos hará falta introducir un grupo de datos al mismo tiempo. Por ejemplo, esta tabla contiene tres valores en el mismo momento del registro: &lt;br /&gt;
 MariaDB [aula206]&amp;gt; select * from m28XX_T_RH_P_v;&lt;br /&gt;
 +------------+--------+---------+---------+&lt;br /&gt;
 | time       | valueT | valueRH | valueP  |&lt;br /&gt;
 +------------+--------+---------+---------+&lt;br /&gt;
 | 1680884504 |   23.4 |   45.64 | 1002.34 |&lt;br /&gt;
 | 1680884734 |   23.7 |   45.21 | 1003.04 |&lt;br /&gt;
 | 1680885724 |  17.89 |   44.32 | 1001.23 |&lt;br /&gt;
 | 1680885726 |  19.03 |   40.65 | 1002.11 |&lt;br /&gt;
 | 1680885728 |  15.43 |   56.78 | 1000.87 |&lt;br /&gt;
 | 1680886069 |  19.03 |   40.65 | 1002.11 |&lt;br /&gt;
 +------------+--------+---------+---------+&lt;br /&gt;
 6 rows in set (0.000 sec)&lt;br /&gt;
&lt;br /&gt;
* '''Creación''' de la tabla con datos múltiples ('''valueT''', '''valueRH''' y '''valueP'''):&lt;br /&gt;
 '''CREATE TABLE''' `m28XX_T_RH_P` (&lt;br /&gt;
  `time` TIMESTAMP DEFAULT CURRENT_TIMESTAMP,&lt;br /&gt;
  `'''valueT'''` FLOAT,&lt;br /&gt;
  `'''valueRH'''` FLOAT,&lt;br /&gt;
  `'''valueP'''` FLOAT,&lt;br /&gt;
  PRIMARY KEY (`time`))&lt;br /&gt;
 ENGINE = InnoDB;&lt;br /&gt;
&lt;br /&gt;
* '''Inserción''' de datos múltiples:&lt;br /&gt;
 '''insert into''' m28XX_T_RH_P ('''valueT''','''valueRH''','''valueP''') values (23.4,45.64,1002.34);&lt;br /&gt;
* '''Lectura''' de datos múltiples:&lt;br /&gt;
 '''select''' * '''from''' m28XX_T_RH_P;&lt;br /&gt;
* '''Creación''' de la '''tabla vista''':&lt;br /&gt;
 '''CREATE VIEW''' m28XX_T_RH_P_v '''AS''' select UNIX_TIMESTAMP(time) as time, valueT, valueRH, valueP from m28XX_T_RH_P;&lt;br /&gt;
* '''Borrado''' de la '''tabla vista'''&lt;br /&gt;
 '''DROP VIEW''' IF EXISTS m28XX_T_RH_P_v;&lt;br /&gt;
* '''Borrado''' de la '''tabla'''&lt;br /&gt;
 '''DROP TABLE''' m28XX_T_RH_P;&lt;/div&gt;</summary>
		<author><name>Jordi Binefa</name></author>
		
	</entry>
	<entry>
		<id>https://www.binefa.com/index.php?title=16_/_5_/_2026_-_IoT,_Embedded_Systems,_Edge_y_Cloud&amp;diff=12303</id>
		<title>16 / 5 / 2026 - IoT, Embedded Systems, Edge y Cloud</title>
		<link rel="alternate" type="text/html" href="https://www.binefa.com/index.php?title=16_/_5_/_2026_-_IoT,_Embedded_Systems,_Edge_y_Cloud&amp;diff=12303"/>
		<updated>2026-05-14T10:11:46Z</updated>

		<summary type="html">&lt;p&gt;Jordi Binefa: /* Acceso al VPS del máster */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Conceptos previos (15 / 5 / 2026) =&lt;br /&gt;
Acceso a la base de datos del VPS del máster&lt;br /&gt;
&lt;br /&gt;
= Temario (16 / 5 / 2026) =&lt;br /&gt;
[https://meet.google.com/rke-afvm-eou Videoconferencia]&lt;br /&gt;
&lt;br /&gt;
== Repaso del día anterior ==&lt;br /&gt;
* [https://www.binefa.cat/training/iot02/pdf/iot02_00_es.pdf Introducción a la placa IoT-02]&lt;br /&gt;
* [[El protocolo MQTT]]&lt;br /&gt;
* [[Gemelos digitales especializados]] (Placa IoT-02 e IoT-Vertebrae)&lt;br /&gt;
&lt;br /&gt;
== Conexión entre la placa IoT-02 y Snap! mediante MQTT ==&lt;br /&gt;
&amp;lt;!-- '''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;
&lt;br /&gt;
* Broker MQTT púplico:&lt;br /&gt;
** MQTT TCP por el puerto no seguro 1883: '''broker.emqx.io'''&lt;br /&gt;
** MQTT WSS por puerto seguro: '''wss://broker.emqx.io:8084/mqtt'''&lt;br /&gt;
* Broker MQTT en el VPS del máster:&lt;br /&gt;
** MQTT TCP por el puerto no seguro 1883: '''master.iotvertebrae.com'''&lt;br /&gt;
** MQTT WSS por puerto seguro: '''wss://master.iotvertebrae.com:9002'''&lt;br /&gt;
&amp;lt;!-- '''Nuevo firmware de la placa IoT-02 para el día de hoy''': [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]&lt;br /&gt;
[[Conexión entre la placa IoT-02 y Snap! v8 mediante MQTT]]&lt;br /&gt;
[[Conexión entre la placa IoT-02 y Snap! v9 mediante MQTT]] --&amp;gt;&lt;br /&gt;
[https://snap.berkeley.edu/snap/snap.html#present:Username=jordibinefa&amp;amp;ProjectName=IoT-02_board_segur_66C172FB482D_broker_master_iotvertebrae Control de la placa IoT-02. Broker del VPS del máster] El [https://github.com/jordibinefa/IoT-02/tree/master/codes/IoT-02_mqtt_sync_upcSchool_broker1 ''firmware'' IoT-02_mqtt_sync_upcSchool_broker1] enseña el número MAC por la pantalla OLED cuando la placa IoT-02 se conecta a vuestra wifi. (Cambiar el archivo [https://github.com/jordibinefa/IoT-02/blob/master/codes/IoT-02_mqtt_sync_upcSchool_broker1/IoT-02_wifiCredentials.h IoT-02_wifiCredentials.h] en la línea 21 substituyendo ''iotcat'' por el nombre de la SSID de vuestra wifi y ''1234567890a'' por vuestra contraseña).&lt;br /&gt;
&lt;br /&gt;
== Uso de la base de datos MariaDB para almacenar y leer datos IoT ==&lt;br /&gt;
[[Uso de MariaDB en el VPS del Máster de Industria 4.0 el curso 2025-2026 | Uso de MariaDB en el VPS del Máster de Industria 4.0]]&lt;br /&gt;
&amp;lt;!-- [[Uso de MariaDB en el VPS del Máster de Industria 4.0 el curso 2023-2024]]&lt;br /&gt;
[[Uso de MariaDB en el VPS del Máster de Industria 4.0 el curso 2022-2023 | Uso de MariaDB en el VPS del Máster de Industria 4.0 el curso 2023-2024]]--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Node-RED ==&lt;br /&gt;
[[Asignación de puertos para el curso 2025-2026 | Asignación de puertos para este curso]]&lt;br /&gt;
&amp;lt;!--[[Asignación de puertos para el curso 2023-2024]]&lt;br /&gt;
[[Asignación de puertos para el curso 2022-2023]]--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Uso del Node-RED ===&lt;br /&gt;
[[Uso del NodeRED (2024) | Uso del Node-RED]]&lt;br /&gt;
&amp;lt;!--[[Uso del NodeRED (2023) | Uso del Node-RED]]--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Uso de la base de datos MariaDB desde Node-RED===&lt;br /&gt;
[[Uso de la base de datos MariaDB desde NodeRED (2023) | Uso de la base de datos MariaDB desde Node-RED]]&lt;br /&gt;
&amp;lt;!-- == Telegram ==&lt;br /&gt;
[[Uso de Telegram desde NodeRED]]--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Repaso y dudas de la clase invertida ==&lt;br /&gt;
=== Verificación de nodos instalados ===&lt;br /&gt;
Antes de continuar verificamos que ya tenemos instalado el nodo de MySQL ('''node-red-node-mysql''') y los nodos del panel de control ('''node-red-dashboard''' -marcado como ''deprecated''-).&lt;br /&gt;
==== Nodo node-red-node-mysql ====&lt;br /&gt;
[https://flows.nodered.org/node/node-red-node-mysql Documentación oficial del nodo ''node-red-node-mysql'']&lt;br /&gt;
&lt;br /&gt;
[[Image:10MariaDbNodeRed00.png|center|thumb|Instalación de los nodos de MariaDB (''MySQL'') en NodeRED]]&lt;br /&gt;
[[Image:11nodoMariaDbNodeRed.png|center|thumb|Aspecto del nodo MySQL en NodeRED]]&lt;br /&gt;
&lt;br /&gt;
==== Nodos node-red-dashboard ====&lt;br /&gt;
[https://flows.nodered.org/node/node-red-dashboard Documentación oficial de los nodos ''node-red-dashboard'']&lt;br /&gt;
&lt;br /&gt;
[[Image:NodosDashboard.png|center|thumb|Nodos del panel de control (''Dashboard'') en NodeRED]]&lt;br /&gt;
&lt;br /&gt;
=== Acceso al VPS del máster ===&lt;br /&gt;
* La contrasenya está dentro de la descripción del vídeo en el Campus (en vez de **** está la contraseña):&lt;br /&gt;
&lt;br /&gt;
''Vídeo NodeRED con MySQL parte 1/3   (clase invertida) (VPS: convidat / ****)''&lt;br /&gt;
* Acceso desde el terminal en Linux:&lt;br /&gt;
 ssh -o ServerAliveInterval=30 convidat@master.iotvertebrae.com&lt;br /&gt;
* Acceso desde el terminal en Windows (cmd):&lt;br /&gt;
 ssh convidat@master.iotvertebrae.com&lt;br /&gt;
&lt;br /&gt;
=== Acceso a la base de datos del VPS del máster ===&lt;br /&gt;
* Con permisos de lectura y escritura:&lt;br /&gt;
 mysql -u iot -p&lt;br /&gt;
* Con permisos de lectura:&lt;br /&gt;
 mysql -u convidat -p&lt;br /&gt;
&lt;br /&gt;
=== Repaso ===&lt;br /&gt;
* Uso de JSON con Snap!&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;
&lt;br /&gt;
* Aleatorización de múltiples datos controlada por el panel de control&lt;br /&gt;
&lt;br /&gt;
* Escritura síncrona de múltiples datos asíncronos al mismo tiempo. Uso del formato de datos json&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
* Telegram--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Ejercicios ==&lt;br /&gt;
=== Ejercicio de '''Snap! con MQTT''' ===&lt;br /&gt;
* Mediante Snap! hacer que en la pantalla aparezca, de forma infinita y con una cadencia de dos segundos, el porcentaje de luz leída por la LDR y después la temperatura en grados centígrados.&lt;br /&gt;
&lt;br /&gt;
=== Ejercicios de '''NodeRED''' ===&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;
==== 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;
==== Ejercicio '''NodeRED-03''' ====&lt;br /&gt;
* Implementad una pasarela (''gateway'') HTTP/MQTT para cambiar el estado de los leds y el relé biestable de la placa IoT-02.&lt;br /&gt;
&lt;br /&gt;
==== Ejercicio '''NodeRED-04''' ====&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;br /&gt;
&lt;br /&gt;
==== Ejercicio '''NodeRED-05''' ====&lt;br /&gt;
* Implementar un flujo de NodeRED que supervise continuamente el valor de la LDR. Introducir dos ''sliders'' para fijar umbrales. Cuando la luz supere el umbral establecido el led rojo se enciende y el relé biestable cambia a SET. Cuando la luz baje del segundo umbral establecido el led rojo se apaga (se enciende el verde) y el relé biestable cambia a RESET.&lt;br /&gt;
&lt;br /&gt;
==== Ejercicio '''NodeRED-06''' ====&lt;br /&gt;
* Implementar un flujo de NodeRED que permita la entrada de un texto y con un botón lo envie a la pantalla OLED.&lt;br /&gt;
&lt;br /&gt;
==== Ejercicio '''NodeRED-07''' ====&lt;br /&gt;
* Implementar un flujo de NodeRED que permita seleccionar un mode de funcionamiento automático o manual. En manual se puede encender y apagar el led blanco mediante un ''switch''. En modo automático el led blanco se enciende o se apaga en función de un umbral consignado mediante un ''slider''. (Para habilitar o inhabilitar un ''switch'' se puede usar ''msg.enabled'').&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--=== Ejercicios '''Telegram''' ===&lt;br /&gt;
* Desde el chat del bot: Al enviar la orden '''/ledWon''' se enciende el led blanco de la placa IoT-02. Al enviar la orden '''/ledWoff''' se apaga el led blanco.&lt;br /&gt;
&lt;br /&gt;
* Desde el chat del bot: Al enviar la orden '''/ledReleSet''' el relé se pone en estado SET. Al enviar la orden '''/ledReleReset''' el relé se pone en estado RESET.&lt;br /&gt;
&lt;br /&gt;
* El chat de vuestro bot recibe un mensaje cuando se aprieta vuestro botón I34 y cuando se deja de apretar.&lt;br /&gt;
&lt;br /&gt;
* Desde el chat del grupo donde pertenece vuestro bot: Al enviar la orden '''/entradas''' el bot contesta con los estados de los botones y la temperatura de la placa.--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Comentario de la práctica para el próximo día ===&lt;br /&gt;
El enunciado estará en breve en el campus. Se comenzará después de haber usado Grafana y Telegram.&lt;/div&gt;</summary>
		<author><name>Jordi Binefa</name></author>
		
	</entry>
	<entry>
		<id>https://www.binefa.com/index.php?title=16_/_5_/_2026_-_IoT,_Embedded_Systems,_Edge_y_Cloud&amp;diff=12302</id>
		<title>16 / 5 / 2026 - IoT, Embedded Systems, Edge y Cloud</title>
		<link rel="alternate" type="text/html" href="https://www.binefa.com/index.php?title=16_/_5_/_2026_-_IoT,_Embedded_Systems,_Edge_y_Cloud&amp;diff=12302"/>
		<updated>2026-05-14T10:10:55Z</updated>

		<summary type="html">&lt;p&gt;Jordi Binefa: /* Acceso al VPS del máster */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Conceptos previos (15 / 5 / 2026) =&lt;br /&gt;
Acceso a la base de datos del VPS del máster&lt;br /&gt;
&lt;br /&gt;
= Temario (16 / 5 / 2026) =&lt;br /&gt;
[https://meet.google.com/rke-afvm-eou Videoconferencia]&lt;br /&gt;
&lt;br /&gt;
== Repaso del día anterior ==&lt;br /&gt;
* [https://www.binefa.cat/training/iot02/pdf/iot02_00_es.pdf Introducción a la placa IoT-02]&lt;br /&gt;
* [[El protocolo MQTT]]&lt;br /&gt;
* [[Gemelos digitales especializados]] (Placa IoT-02 e IoT-Vertebrae)&lt;br /&gt;
&lt;br /&gt;
== Conexión entre la placa IoT-02 y Snap! mediante MQTT ==&lt;br /&gt;
&amp;lt;!-- '''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;
&lt;br /&gt;
* Broker MQTT púplico:&lt;br /&gt;
** MQTT TCP por el puerto no seguro 1883: '''broker.emqx.io'''&lt;br /&gt;
** MQTT WSS por puerto seguro: '''wss://broker.emqx.io:8084/mqtt'''&lt;br /&gt;
* Broker MQTT en el VPS del máster:&lt;br /&gt;
** MQTT TCP por el puerto no seguro 1883: '''master.iotvertebrae.com'''&lt;br /&gt;
** MQTT WSS por puerto seguro: '''wss://master.iotvertebrae.com:9002'''&lt;br /&gt;
&amp;lt;!-- '''Nuevo firmware de la placa IoT-02 para el día de hoy''': [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]&lt;br /&gt;
[[Conexión entre la placa IoT-02 y Snap! v8 mediante MQTT]]&lt;br /&gt;
[[Conexión entre la placa IoT-02 y Snap! v9 mediante MQTT]] --&amp;gt;&lt;br /&gt;
[https://snap.berkeley.edu/snap/snap.html#present:Username=jordibinefa&amp;amp;ProjectName=IoT-02_board_segur_66C172FB482D_broker_master_iotvertebrae Control de la placa IoT-02. Broker del VPS del máster] El [https://github.com/jordibinefa/IoT-02/tree/master/codes/IoT-02_mqtt_sync_upcSchool_broker1 ''firmware'' IoT-02_mqtt_sync_upcSchool_broker1] enseña el número MAC por la pantalla OLED cuando la placa IoT-02 se conecta a vuestra wifi. (Cambiar el archivo [https://github.com/jordibinefa/IoT-02/blob/master/codes/IoT-02_mqtt_sync_upcSchool_broker1/IoT-02_wifiCredentials.h IoT-02_wifiCredentials.h] en la línea 21 substituyendo ''iotcat'' por el nombre de la SSID de vuestra wifi y ''1234567890a'' por vuestra contraseña).&lt;br /&gt;
&lt;br /&gt;
== Uso de la base de datos MariaDB para almacenar y leer datos IoT ==&lt;br /&gt;
[[Uso de MariaDB en el VPS del Máster de Industria 4.0 el curso 2025-2026 | Uso de MariaDB en el VPS del Máster de Industria 4.0]]&lt;br /&gt;
&amp;lt;!-- [[Uso de MariaDB en el VPS del Máster de Industria 4.0 el curso 2023-2024]]&lt;br /&gt;
[[Uso de MariaDB en el VPS del Máster de Industria 4.0 el curso 2022-2023 | Uso de MariaDB en el VPS del Máster de Industria 4.0 el curso 2023-2024]]--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Node-RED ==&lt;br /&gt;
[[Asignación de puertos para el curso 2025-2026 | Asignación de puertos para este curso]]&lt;br /&gt;
&amp;lt;!--[[Asignación de puertos para el curso 2023-2024]]&lt;br /&gt;
[[Asignación de puertos para el curso 2022-2023]]--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Uso del Node-RED ===&lt;br /&gt;
[[Uso del NodeRED (2024) | Uso del Node-RED]]&lt;br /&gt;
&amp;lt;!--[[Uso del NodeRED (2023) | Uso del Node-RED]]--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Uso de la base de datos MariaDB desde Node-RED===&lt;br /&gt;
[[Uso de la base de datos MariaDB desde NodeRED (2023) | Uso de la base de datos MariaDB desde Node-RED]]&lt;br /&gt;
&amp;lt;!-- == Telegram ==&lt;br /&gt;
[[Uso de Telegram desde NodeRED]]--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Repaso y dudas de la clase invertida ==&lt;br /&gt;
=== Verificación de nodos instalados ===&lt;br /&gt;
Antes de continuar verificamos que ya tenemos instalado el nodo de MySQL ('''node-red-node-mysql''') y los nodos del panel de control ('''node-red-dashboard''' -marcado como ''deprecated''-).&lt;br /&gt;
==== Nodo node-red-node-mysql ====&lt;br /&gt;
[https://flows.nodered.org/node/node-red-node-mysql Documentación oficial del nodo ''node-red-node-mysql'']&lt;br /&gt;
&lt;br /&gt;
[[Image:10MariaDbNodeRed00.png|center|thumb|Instalación de los nodos de MariaDB (''MySQL'') en NodeRED]]&lt;br /&gt;
[[Image:11nodoMariaDbNodeRed.png|center|thumb|Aspecto del nodo MySQL en NodeRED]]&lt;br /&gt;
&lt;br /&gt;
==== Nodos node-red-dashboard ====&lt;br /&gt;
[https://flows.nodered.org/node/node-red-dashboard Documentación oficial de los nodos ''node-red-dashboard'']&lt;br /&gt;
&lt;br /&gt;
[[Image:NodosDashboard.png|center|thumb|Nodos del panel de control (''Dashboard'') en NodeRED]]&lt;br /&gt;
&lt;br /&gt;
=== Acceso al VPS del máster ===&lt;br /&gt;
La contrasenya está dentro de la descripción del vídeo en el Campus (en vez de **** está la contraseña):&lt;br /&gt;
&lt;br /&gt;
''Vídeo NodeRED con MySQL parte 1/3   (clase invertida) (VPS: convidat / ****)''&lt;br /&gt;
 ssh -o ServerAliveInterval=30 convidat@master.iotvertebrae.com&lt;br /&gt;
o&lt;br /&gt;
 ssh convidat@master.iotvertebrae.com&lt;br /&gt;
&lt;br /&gt;
=== Acceso a la base de datos del VPS del máster ===&lt;br /&gt;
* Con permisos de lectura y escritura:&lt;br /&gt;
 mysql -u iot -p&lt;br /&gt;
* Con permisos de lectura:&lt;br /&gt;
 mysql -u convidat -p&lt;br /&gt;
&lt;br /&gt;
=== Repaso ===&lt;br /&gt;
* Uso de JSON con Snap!&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;
&lt;br /&gt;
* Aleatorización de múltiples datos controlada por el panel de control&lt;br /&gt;
&lt;br /&gt;
* Escritura síncrona de múltiples datos asíncronos al mismo tiempo. Uso del formato de datos json&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
* Telegram--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Ejercicios ==&lt;br /&gt;
=== Ejercicio de '''Snap! con MQTT''' ===&lt;br /&gt;
* Mediante Snap! hacer que en la pantalla aparezca, de forma infinita y con una cadencia de dos segundos, el porcentaje de luz leída por la LDR y después la temperatura en grados centígrados.&lt;br /&gt;
&lt;br /&gt;
=== Ejercicios de '''NodeRED''' ===&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;
==== 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;
==== Ejercicio '''NodeRED-03''' ====&lt;br /&gt;
* Implementad una pasarela (''gateway'') HTTP/MQTT para cambiar el estado de los leds y el relé biestable de la placa IoT-02.&lt;br /&gt;
&lt;br /&gt;
==== Ejercicio '''NodeRED-04''' ====&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;br /&gt;
&lt;br /&gt;
==== Ejercicio '''NodeRED-05''' ====&lt;br /&gt;
* Implementar un flujo de NodeRED que supervise continuamente el valor de la LDR. Introducir dos ''sliders'' para fijar umbrales. Cuando la luz supere el umbral establecido el led rojo se enciende y el relé biestable cambia a SET. Cuando la luz baje del segundo umbral establecido el led rojo se apaga (se enciende el verde) y el relé biestable cambia a RESET.&lt;br /&gt;
&lt;br /&gt;
==== Ejercicio '''NodeRED-06''' ====&lt;br /&gt;
* Implementar un flujo de NodeRED que permita la entrada de un texto y con un botón lo envie a la pantalla OLED.&lt;br /&gt;
&lt;br /&gt;
==== Ejercicio '''NodeRED-07''' ====&lt;br /&gt;
* Implementar un flujo de NodeRED que permita seleccionar un mode de funcionamiento automático o manual. En manual se puede encender y apagar el led blanco mediante un ''switch''. En modo automático el led blanco se enciende o se apaga en función de un umbral consignado mediante un ''slider''. (Para habilitar o inhabilitar un ''switch'' se puede usar ''msg.enabled'').&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--=== Ejercicios '''Telegram''' ===&lt;br /&gt;
* Desde el chat del bot: Al enviar la orden '''/ledWon''' se enciende el led blanco de la placa IoT-02. Al enviar la orden '''/ledWoff''' se apaga el led blanco.&lt;br /&gt;
&lt;br /&gt;
* Desde el chat del bot: Al enviar la orden '''/ledReleSet''' el relé se pone en estado SET. Al enviar la orden '''/ledReleReset''' el relé se pone en estado RESET.&lt;br /&gt;
&lt;br /&gt;
* El chat de vuestro bot recibe un mensaje cuando se aprieta vuestro botón I34 y cuando se deja de apretar.&lt;br /&gt;
&lt;br /&gt;
* Desde el chat del grupo donde pertenece vuestro bot: Al enviar la orden '''/entradas''' el bot contesta con los estados de los botones y la temperatura de la placa.--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Comentario de la práctica para el próximo día ===&lt;br /&gt;
El enunciado estará en breve en el campus. Se comenzará después de haber usado Grafana y Telegram.&lt;/div&gt;</summary>
		<author><name>Jordi Binefa</name></author>
		
	</entry>
	<entry>
		<id>https://www.binefa.com/index.php?title=16_/_5_/_2026_-_IoT,_Embedded_Systems,_Edge_y_Cloud&amp;diff=12301</id>
		<title>16 / 5 / 2026 - IoT, Embedded Systems, Edge y Cloud</title>
		<link rel="alternate" type="text/html" href="https://www.binefa.com/index.php?title=16_/_5_/_2026_-_IoT,_Embedded_Systems,_Edge_y_Cloud&amp;diff=12301"/>
		<updated>2026-05-14T10:10:32Z</updated>

		<summary type="html">&lt;p&gt;Jordi Binefa: /* Acceso al VPS del máster */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Conceptos previos (15 / 5 / 2026) =&lt;br /&gt;
Acceso a la base de datos del VPS del máster&lt;br /&gt;
&lt;br /&gt;
= Temario (16 / 5 / 2026) =&lt;br /&gt;
[https://meet.google.com/rke-afvm-eou Videoconferencia]&lt;br /&gt;
&lt;br /&gt;
== Repaso del día anterior ==&lt;br /&gt;
* [https://www.binefa.cat/training/iot02/pdf/iot02_00_es.pdf Introducción a la placa IoT-02]&lt;br /&gt;
* [[El protocolo MQTT]]&lt;br /&gt;
* [[Gemelos digitales especializados]] (Placa IoT-02 e IoT-Vertebrae)&lt;br /&gt;
&lt;br /&gt;
== Conexión entre la placa IoT-02 y Snap! mediante MQTT ==&lt;br /&gt;
&amp;lt;!-- '''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;
&lt;br /&gt;
* Broker MQTT púplico:&lt;br /&gt;
** MQTT TCP por el puerto no seguro 1883: '''broker.emqx.io'''&lt;br /&gt;
** MQTT WSS por puerto seguro: '''wss://broker.emqx.io:8084/mqtt'''&lt;br /&gt;
* Broker MQTT en el VPS del máster:&lt;br /&gt;
** MQTT TCP por el puerto no seguro 1883: '''master.iotvertebrae.com'''&lt;br /&gt;
** MQTT WSS por puerto seguro: '''wss://master.iotvertebrae.com:9002'''&lt;br /&gt;
&amp;lt;!-- '''Nuevo firmware de la placa IoT-02 para el día de hoy''': [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]&lt;br /&gt;
[[Conexión entre la placa IoT-02 y Snap! v8 mediante MQTT]]&lt;br /&gt;
[[Conexión entre la placa IoT-02 y Snap! v9 mediante MQTT]] --&amp;gt;&lt;br /&gt;
[https://snap.berkeley.edu/snap/snap.html#present:Username=jordibinefa&amp;amp;ProjectName=IoT-02_board_segur_66C172FB482D_broker_master_iotvertebrae Control de la placa IoT-02. Broker del VPS del máster] El [https://github.com/jordibinefa/IoT-02/tree/master/codes/IoT-02_mqtt_sync_upcSchool_broker1 ''firmware'' IoT-02_mqtt_sync_upcSchool_broker1] enseña el número MAC por la pantalla OLED cuando la placa IoT-02 se conecta a vuestra wifi. (Cambiar el archivo [https://github.com/jordibinefa/IoT-02/blob/master/codes/IoT-02_mqtt_sync_upcSchool_broker1/IoT-02_wifiCredentials.h IoT-02_wifiCredentials.h] en la línea 21 substituyendo ''iotcat'' por el nombre de la SSID de vuestra wifi y ''1234567890a'' por vuestra contraseña).&lt;br /&gt;
&lt;br /&gt;
== Uso de la base de datos MariaDB para almacenar y leer datos IoT ==&lt;br /&gt;
[[Uso de MariaDB en el VPS del Máster de Industria 4.0 el curso 2025-2026 | Uso de MariaDB en el VPS del Máster de Industria 4.0]]&lt;br /&gt;
&amp;lt;!-- [[Uso de MariaDB en el VPS del Máster de Industria 4.0 el curso 2023-2024]]&lt;br /&gt;
[[Uso de MariaDB en el VPS del Máster de Industria 4.0 el curso 2022-2023 | Uso de MariaDB en el VPS del Máster de Industria 4.0 el curso 2023-2024]]--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Node-RED ==&lt;br /&gt;
[[Asignación de puertos para el curso 2025-2026 | Asignación de puertos para este curso]]&lt;br /&gt;
&amp;lt;!--[[Asignación de puertos para el curso 2023-2024]]&lt;br /&gt;
[[Asignación de puertos para el curso 2022-2023]]--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Uso del Node-RED ===&lt;br /&gt;
[[Uso del NodeRED (2024) | Uso del Node-RED]]&lt;br /&gt;
&amp;lt;!--[[Uso del NodeRED (2023) | Uso del Node-RED]]--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Uso de la base de datos MariaDB desde Node-RED===&lt;br /&gt;
[[Uso de la base de datos MariaDB desde NodeRED (2023) | Uso de la base de datos MariaDB desde Node-RED]]&lt;br /&gt;
&amp;lt;!-- == Telegram ==&lt;br /&gt;
[[Uso de Telegram desde NodeRED]]--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Repaso y dudas de la clase invertida ==&lt;br /&gt;
=== Verificación de nodos instalados ===&lt;br /&gt;
Antes de continuar verificamos que ya tenemos instalado el nodo de MySQL ('''node-red-node-mysql''') y los nodos del panel de control ('''node-red-dashboard''' -marcado como ''deprecated''-).&lt;br /&gt;
==== Nodo node-red-node-mysql ====&lt;br /&gt;
[https://flows.nodered.org/node/node-red-node-mysql Documentación oficial del nodo ''node-red-node-mysql'']&lt;br /&gt;
&lt;br /&gt;
[[Image:10MariaDbNodeRed00.png|center|thumb|Instalación de los nodos de MariaDB (''MySQL'') en NodeRED]]&lt;br /&gt;
[[Image:11nodoMariaDbNodeRed.png|center|thumb|Aspecto del nodo MySQL en NodeRED]]&lt;br /&gt;
&lt;br /&gt;
==== Nodos node-red-dashboard ====&lt;br /&gt;
[https://flows.nodered.org/node/node-red-dashboard Documentación oficial de los nodos ''node-red-dashboard'']&lt;br /&gt;
&lt;br /&gt;
[[Image:NodosDashboard.png|center|thumb|Nodos del panel de control (''Dashboard'') en NodeRED]]&lt;br /&gt;
&lt;br /&gt;
=== Acceso al VPS del máster ===&lt;br /&gt;
La contrasenya está dentro de la descripción del vídeo (en vez de **** está la contraseña):&lt;br /&gt;
&lt;br /&gt;
''Vídeo NodeRED con MySQL parte 1/3   (clase invertida) (VPS: convidat / ****)''&lt;br /&gt;
 ssh -o ServerAliveInterval=30 convidat@master.iotvertebrae.com&lt;br /&gt;
o&lt;br /&gt;
 ssh convidat@master.iotvertebrae.com&lt;br /&gt;
&lt;br /&gt;
=== Acceso a la base de datos del VPS del máster ===&lt;br /&gt;
* Con permisos de lectura y escritura:&lt;br /&gt;
 mysql -u iot -p&lt;br /&gt;
* Con permisos de lectura:&lt;br /&gt;
 mysql -u convidat -p&lt;br /&gt;
&lt;br /&gt;
=== Repaso ===&lt;br /&gt;
* Uso de JSON con Snap!&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;
&lt;br /&gt;
* Aleatorización de múltiples datos controlada por el panel de control&lt;br /&gt;
&lt;br /&gt;
* Escritura síncrona de múltiples datos asíncronos al mismo tiempo. Uso del formato de datos json&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
* Telegram--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Ejercicios ==&lt;br /&gt;
=== Ejercicio de '''Snap! con MQTT''' ===&lt;br /&gt;
* Mediante Snap! hacer que en la pantalla aparezca, de forma infinita y con una cadencia de dos segundos, el porcentaje de luz leída por la LDR y después la temperatura en grados centígrados.&lt;br /&gt;
&lt;br /&gt;
=== Ejercicios de '''NodeRED''' ===&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;
==== 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;
==== Ejercicio '''NodeRED-03''' ====&lt;br /&gt;
* Implementad una pasarela (''gateway'') HTTP/MQTT para cambiar el estado de los leds y el relé biestable de la placa IoT-02.&lt;br /&gt;
&lt;br /&gt;
==== Ejercicio '''NodeRED-04''' ====&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;br /&gt;
&lt;br /&gt;
==== Ejercicio '''NodeRED-05''' ====&lt;br /&gt;
* Implementar un flujo de NodeRED que supervise continuamente el valor de la LDR. Introducir dos ''sliders'' para fijar umbrales. Cuando la luz supere el umbral establecido el led rojo se enciende y el relé biestable cambia a SET. Cuando la luz baje del segundo umbral establecido el led rojo se apaga (se enciende el verde) y el relé biestable cambia a RESET.&lt;br /&gt;
&lt;br /&gt;
==== Ejercicio '''NodeRED-06''' ====&lt;br /&gt;
* Implementar un flujo de NodeRED que permita la entrada de un texto y con un botón lo envie a la pantalla OLED.&lt;br /&gt;
&lt;br /&gt;
==== Ejercicio '''NodeRED-07''' ====&lt;br /&gt;
* Implementar un flujo de NodeRED que permita seleccionar un mode de funcionamiento automático o manual. En manual se puede encender y apagar el led blanco mediante un ''switch''. En modo automático el led blanco se enciende o se apaga en función de un umbral consignado mediante un ''slider''. (Para habilitar o inhabilitar un ''switch'' se puede usar ''msg.enabled'').&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--=== Ejercicios '''Telegram''' ===&lt;br /&gt;
* Desde el chat del bot: Al enviar la orden '''/ledWon''' se enciende el led blanco de la placa IoT-02. Al enviar la orden '''/ledWoff''' se apaga el led blanco.&lt;br /&gt;
&lt;br /&gt;
* Desde el chat del bot: Al enviar la orden '''/ledReleSet''' el relé se pone en estado SET. Al enviar la orden '''/ledReleReset''' el relé se pone en estado RESET.&lt;br /&gt;
&lt;br /&gt;
* El chat de vuestro bot recibe un mensaje cuando se aprieta vuestro botón I34 y cuando se deja de apretar.&lt;br /&gt;
&lt;br /&gt;
* Desde el chat del grupo donde pertenece vuestro bot: Al enviar la orden '''/entradas''' el bot contesta con los estados de los botones y la temperatura de la placa.--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Comentario de la práctica para el próximo día ===&lt;br /&gt;
El enunciado estará en breve en el campus. Se comenzará después de haber usado Grafana y Telegram.&lt;/div&gt;</summary>
		<author><name>Jordi Binefa</name></author>
		
	</entry>
	<entry>
		<id>https://www.binefa.com/index.php?title=16_/_5_/_2026_-_IoT,_Embedded_Systems,_Edge_y_Cloud&amp;diff=12300</id>
		<title>16 / 5 / 2026 - IoT, Embedded Systems, Edge y Cloud</title>
		<link rel="alternate" type="text/html" href="https://www.binefa.com/index.php?title=16_/_5_/_2026_-_IoT,_Embedded_Systems,_Edge_y_Cloud&amp;diff=12300"/>
		<updated>2026-05-14T10:08:35Z</updated>

		<summary type="html">&lt;p&gt;Jordi Binefa: /* Acceso al VPS del máster */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Conceptos previos (15 / 5 / 2026) =&lt;br /&gt;
Acceso a la base de datos del VPS del máster&lt;br /&gt;
&lt;br /&gt;
= Temario (16 / 5 / 2026) =&lt;br /&gt;
[https://meet.google.com/rke-afvm-eou Videoconferencia]&lt;br /&gt;
&lt;br /&gt;
== Repaso del día anterior ==&lt;br /&gt;
* [https://www.binefa.cat/training/iot02/pdf/iot02_00_es.pdf Introducción a la placa IoT-02]&lt;br /&gt;
* [[El protocolo MQTT]]&lt;br /&gt;
* [[Gemelos digitales especializados]] (Placa IoT-02 e IoT-Vertebrae)&lt;br /&gt;
&lt;br /&gt;
== Conexión entre la placa IoT-02 y Snap! mediante MQTT ==&lt;br /&gt;
&amp;lt;!-- '''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;
&lt;br /&gt;
* Broker MQTT púplico:&lt;br /&gt;
** MQTT TCP por el puerto no seguro 1883: '''broker.emqx.io'''&lt;br /&gt;
** MQTT WSS por puerto seguro: '''wss://broker.emqx.io:8084/mqtt'''&lt;br /&gt;
* Broker MQTT en el VPS del máster:&lt;br /&gt;
** MQTT TCP por el puerto no seguro 1883: '''master.iotvertebrae.com'''&lt;br /&gt;
** MQTT WSS por puerto seguro: '''wss://master.iotvertebrae.com:9002'''&lt;br /&gt;
&amp;lt;!-- '''Nuevo firmware de la placa IoT-02 para el día de hoy''': [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]&lt;br /&gt;
[[Conexión entre la placa IoT-02 y Snap! v8 mediante MQTT]]&lt;br /&gt;
[[Conexión entre la placa IoT-02 y Snap! v9 mediante MQTT]] --&amp;gt;&lt;br /&gt;
[https://snap.berkeley.edu/snap/snap.html#present:Username=jordibinefa&amp;amp;ProjectName=IoT-02_board_segur_66C172FB482D_broker_master_iotvertebrae Control de la placa IoT-02. Broker del VPS del máster] El [https://github.com/jordibinefa/IoT-02/tree/master/codes/IoT-02_mqtt_sync_upcSchool_broker1 ''firmware'' IoT-02_mqtt_sync_upcSchool_broker1] enseña el número MAC por la pantalla OLED cuando la placa IoT-02 se conecta a vuestra wifi. (Cambiar el archivo [https://github.com/jordibinefa/IoT-02/blob/master/codes/IoT-02_mqtt_sync_upcSchool_broker1/IoT-02_wifiCredentials.h IoT-02_wifiCredentials.h] en la línea 21 substituyendo ''iotcat'' por el nombre de la SSID de vuestra wifi y ''1234567890a'' por vuestra contraseña).&lt;br /&gt;
&lt;br /&gt;
== Uso de la base de datos MariaDB para almacenar y leer datos IoT ==&lt;br /&gt;
[[Uso de MariaDB en el VPS del Máster de Industria 4.0 el curso 2025-2026 | Uso de MariaDB en el VPS del Máster de Industria 4.0]]&lt;br /&gt;
&amp;lt;!-- [[Uso de MariaDB en el VPS del Máster de Industria 4.0 el curso 2023-2024]]&lt;br /&gt;
[[Uso de MariaDB en el VPS del Máster de Industria 4.0 el curso 2022-2023 | Uso de MariaDB en el VPS del Máster de Industria 4.0 el curso 2023-2024]]--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Node-RED ==&lt;br /&gt;
[[Asignación de puertos para el curso 2025-2026 | Asignación de puertos para este curso]]&lt;br /&gt;
&amp;lt;!--[[Asignación de puertos para el curso 2023-2024]]&lt;br /&gt;
[[Asignación de puertos para el curso 2022-2023]]--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Uso del Node-RED ===&lt;br /&gt;
[[Uso del NodeRED (2024) | Uso del Node-RED]]&lt;br /&gt;
&amp;lt;!--[[Uso del NodeRED (2023) | Uso del Node-RED]]--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Uso de la base de datos MariaDB desde Node-RED===&lt;br /&gt;
[[Uso de la base de datos MariaDB desde NodeRED (2023) | Uso de la base de datos MariaDB desde Node-RED]]&lt;br /&gt;
&amp;lt;!-- == Telegram ==&lt;br /&gt;
[[Uso de Telegram desde NodeRED]]--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Repaso y dudas de la clase invertida ==&lt;br /&gt;
=== Verificación de nodos instalados ===&lt;br /&gt;
Antes de continuar verificamos que ya tenemos instalado el nodo de MySQL ('''node-red-node-mysql''') y los nodos del panel de control ('''node-red-dashboard''' -marcado como ''deprecated''-).&lt;br /&gt;
==== Nodo node-red-node-mysql ====&lt;br /&gt;
[https://flows.nodered.org/node/node-red-node-mysql Documentación oficial del nodo ''node-red-node-mysql'']&lt;br /&gt;
&lt;br /&gt;
[[Image:10MariaDbNodeRed00.png|center|thumb|Instalación de los nodos de MariaDB (''MySQL'') en NodeRED]]&lt;br /&gt;
[[Image:11nodoMariaDbNodeRed.png|center|thumb|Aspecto del nodo MySQL en NodeRED]]&lt;br /&gt;
&lt;br /&gt;
==== Nodos node-red-dashboard ====&lt;br /&gt;
[https://flows.nodered.org/node/node-red-dashboard Documentación oficial de los nodos ''node-red-dashboard'']&lt;br /&gt;
&lt;br /&gt;
[[Image:NodosDashboard.png|center|thumb|Nodos del panel de control (''Dashboard'') en NodeRED]]&lt;br /&gt;
&lt;br /&gt;
=== Acceso al VPS del máster ===&lt;br /&gt;
 ssh -o ServerAliveInterval=30 convidat@master.iotvertebrae.com&lt;br /&gt;
o&lt;br /&gt;
 ssh convidat@master.iotvertebrae.com&lt;br /&gt;
&lt;br /&gt;
=== Acceso a la base de datos del VPS del máster ===&lt;br /&gt;
* Con permisos de lectura y escritura:&lt;br /&gt;
 mysql -u iot -p&lt;br /&gt;
* Con permisos de lectura:&lt;br /&gt;
 mysql -u convidat -p&lt;br /&gt;
&lt;br /&gt;
=== Repaso ===&lt;br /&gt;
* Uso de JSON con Snap!&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;
&lt;br /&gt;
* Aleatorización de múltiples datos controlada por el panel de control&lt;br /&gt;
&lt;br /&gt;
* Escritura síncrona de múltiples datos asíncronos al mismo tiempo. Uso del formato de datos json&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
* Telegram--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Ejercicios ==&lt;br /&gt;
=== Ejercicio de '''Snap! con MQTT''' ===&lt;br /&gt;
* Mediante Snap! hacer que en la pantalla aparezca, de forma infinita y con una cadencia de dos segundos, el porcentaje de luz leída por la LDR y después la temperatura en grados centígrados.&lt;br /&gt;
&lt;br /&gt;
=== Ejercicios de '''NodeRED''' ===&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;
==== 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;
==== Ejercicio '''NodeRED-03''' ====&lt;br /&gt;
* Implementad una pasarela (''gateway'') HTTP/MQTT para cambiar el estado de los leds y el relé biestable de la placa IoT-02.&lt;br /&gt;
&lt;br /&gt;
==== Ejercicio '''NodeRED-04''' ====&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;br /&gt;
&lt;br /&gt;
==== Ejercicio '''NodeRED-05''' ====&lt;br /&gt;
* Implementar un flujo de NodeRED que supervise continuamente el valor de la LDR. Introducir dos ''sliders'' para fijar umbrales. Cuando la luz supere el umbral establecido el led rojo se enciende y el relé biestable cambia a SET. Cuando la luz baje del segundo umbral establecido el led rojo se apaga (se enciende el verde) y el relé biestable cambia a RESET.&lt;br /&gt;
&lt;br /&gt;
==== Ejercicio '''NodeRED-06''' ====&lt;br /&gt;
* Implementar un flujo de NodeRED que permita la entrada de un texto y con un botón lo envie a la pantalla OLED.&lt;br /&gt;
&lt;br /&gt;
==== Ejercicio '''NodeRED-07''' ====&lt;br /&gt;
* Implementar un flujo de NodeRED que permita seleccionar un mode de funcionamiento automático o manual. En manual se puede encender y apagar el led blanco mediante un ''switch''. En modo automático el led blanco se enciende o se apaga en función de un umbral consignado mediante un ''slider''. (Para habilitar o inhabilitar un ''switch'' se puede usar ''msg.enabled'').&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--=== Ejercicios '''Telegram''' ===&lt;br /&gt;
* Desde el chat del bot: Al enviar la orden '''/ledWon''' se enciende el led blanco de la placa IoT-02. Al enviar la orden '''/ledWoff''' se apaga el led blanco.&lt;br /&gt;
&lt;br /&gt;
* Desde el chat del bot: Al enviar la orden '''/ledReleSet''' el relé se pone en estado SET. Al enviar la orden '''/ledReleReset''' el relé se pone en estado RESET.&lt;br /&gt;
&lt;br /&gt;
* El chat de vuestro bot recibe un mensaje cuando se aprieta vuestro botón I34 y cuando se deja de apretar.&lt;br /&gt;
&lt;br /&gt;
* Desde el chat del grupo donde pertenece vuestro bot: Al enviar la orden '''/entradas''' el bot contesta con los estados de los botones y la temperatura de la placa.--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Comentario de la práctica para el próximo día ===&lt;br /&gt;
El enunciado estará en breve en el campus. Se comenzará después de haber usado Grafana y Telegram.&lt;/div&gt;</summary>
		<author><name>Jordi Binefa</name></author>
		
	</entry>
	<entry>
		<id>https://www.binefa.com/index.php?title=IoT,_Embedded_Systems,_Edge_y_Cloud_(2026)&amp;diff=12299</id>
		<title>IoT, Embedded Systems, Edge y Cloud (2026)</title>
		<link rel="alternate" type="text/html" href="https://www.binefa.com/index.php?title=IoT,_Embedded_Systems,_Edge_y_Cloud_(2026)&amp;diff=12299"/>
		<updated>2026-05-12T18:03:12Z</updated>

		<summary type="html">&lt;p&gt;Jordi Binefa: /* Por días */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;* [[Temario - IoT, Embedded Systems, Edge y Cloud (2026)]]&lt;br /&gt;
* Acceso rápido a esta página: https://t.ly/-LmC9&lt;br /&gt;
= Por días =&lt;br /&gt;
* [[9 / 5 / 2026 - IoT, Embedded Systems, Edge y Cloud]]&lt;br /&gt;
&amp;lt;!-- * 16 / 5 / 2026 - IoT, Embedded Systems, Edge y Cloud --&amp;gt;&lt;br /&gt;
* [[16 / 5 / 2026 - IoT, Embedded Systems, Edge y Cloud]]&lt;br /&gt;
* 23 / 5 / 2026 - IoT, Embedded Systems, Edge y Cloud&lt;br /&gt;
&amp;lt;!-- &lt;br /&gt;
* [[9 / 5 / 2026 - Impresión 3D, Robótica e Iot, Hands on y MVPs]] (versió preliminar)&lt;br /&gt;
* [[24 / 5 / 2025 - Impresión 3D, Robótica e Iot, Hands on y MVPs]]&lt;br /&gt;
* [[31 / 5 / 2025 - Impresión 3D, Robótica e Iot, Hands on y MVPs]]&lt;br /&gt;
* [[7 / 6 / 2025 - Impresión 3D, Robótica e Iot, Hands on y MVPs]] --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Herramientas y recursos =&lt;br /&gt;
* [[Adición del ESP32 en el IDE de Arduino]]&lt;br /&gt;
* [[Simulador de la placa IoT-02 en línea]] &lt;br /&gt;
&amp;lt;!-- [https://meet.google.com/noa-yasq-xeb Videoconferencia] --&amp;gt;&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
username:   docent.industria4.0@talent.upc.edu&lt;br /&gt;
password:   Industria4@online2020&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
* [https://github.com/jordibinefa/IoT-02 Placa IoT-02 en GitHub] ([https://github.com/jordibinefa/iot02-simulator Código del gemelo digital de la placa IoT-02 en GitHub])&lt;br /&gt;
* [https://www.binefa.cat/training/iot02/pdf/iot02_00_es.pdf Introducción a la placa IoT-02 en castellano] en pdf ([https://www.binefa.cat/training/iot02/pdf/iot02_00_ca.pdf ''Introducció a la placa IoT-02'' en catalán])&lt;br /&gt;
* [https://youtu.be/_EIXCGkGQ0U Vídeo de introducción a la placa IoT-02]&lt;br /&gt;
* [https://youtu.be/JothMIY4DWE Vídeo de configuración del IDE de Arduino v1.8.19]&lt;br /&gt;
* [https://youtu.be/UjtULePAbTE Vídeo de configuración del IDE de Arduino v2] ([https://youtu.be/BvdHeNRDgL8 Vídeo de como usar el IDE de Arduino v2 para programar la placa IoT-02])&lt;br /&gt;
* [https://binefa.com/upc-school/libraries_20240420.zip Enlace para bajar las bibliotecas (''libraries'') necesarias para los códigos de ''firmware'' usados en este máster] para el IDE de Arduino ([https://www.arduino.cc/ Página de Arduino])&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- [https://www.binefa.cat/training/iot02/libraries/libraries_20240420.zip Enlace para bajar las bibliotecas (''libraries'') necesarias para los códigos de ''firmware'' usados en este máster] para el IDE de Arduino ([https://www.arduino.cc/ Página de Arduino])&lt;br /&gt;
&lt;br /&gt;
[http://rebost.binefa.cat/iot/videos/01_Intro_placa_IoT-02_es.mkv Vídeo introductorio a la placa IoT-02] &lt;br /&gt;
&lt;br /&gt;
[http://rebost.binefa.cat/iot/videos/02_IDE_Arduino_ESP32_es.mkv Vídeo de instalación del Arduino IDE y algunas bibliotecas extra para probar los códigos en la placa IoT-02] --&amp;gt;&lt;br /&gt;
&amp;lt;!-- [[Instalación de controladores (drivers) para Tecnologías IoT, Hands on y MVP (2022)]] --&amp;gt;&lt;br /&gt;
&amp;lt;!-- [http://formacio.things.cat/mac_IoT-02_mI40/ Herramienta de gestión de la MAC de la placa IoT-02, mediante un cliente web usando JS] --&amp;gt;&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
[[Instalación de programas para Tecnologías IoT, Hands on y MVP (2022)]] --&amp;gt;&lt;br /&gt;
* [[esptool: Herramienta para borrar toda la memoria flash del ESP32 en caso de tener problemas en la subida del firmware]]&lt;br /&gt;
&amp;lt;!-- [http://popotamo.binefa.cat/iot/maqVirt/IoT%20-%20eCat%20-%20Debian%2011.x%2064-bit_v20210304_00.zip Máquina virtual para VMware Workstation Player] basada en Debian GNU/Linux 11. Usuario '''clot''' y contraseña '''fjeclot'''. --&amp;gt;&lt;br /&gt;
* [https://www.onlinegdb.com/ Programación en línea para C, C++, Python y JavaScript, entre otros]&lt;br /&gt;
* [https://app.edublocks.org/#Python Herramienta de conversión de bloques de programación a Python]&lt;br /&gt;
* [https://upcommons.upc.edu/handle/2117/363087 Combining Low-Code Programming and SDL-Based Modeling with Snap! in the Industry 4.0 Context]&lt;br /&gt;
* [[Asignación de puertos para el curso 2025-2026]]&lt;br /&gt;
&amp;lt;!-- * [[Asignación de puertos para el curso 2024-2025]]&lt;br /&gt;
[[Asignación de puertos para el curso 2023-2024]]&lt;br /&gt;
== Proyecto Final ==&lt;br /&gt;
[https://onedrive.live.com/view.aspx?resid=7B61369ED41066A2!819702&amp;amp;ithint=file%2cpptx&amp;amp;authkey=!AN_I9zWRZwOSkKE Asignación de proyectos]&lt;br /&gt;
&lt;br /&gt;
=== Propuestas de Proyecto Final ===&lt;br /&gt;
[[Propuestas de Proyecto Final para el Máster de Industria 4.0 del curso 2020-2021]] --&amp;gt;&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
[[Propuestas de Proyecto Final para el Máster de Industria 4.0 de la empresa Siarq (2020)]]&lt;br /&gt;
&lt;br /&gt;
[[Otras propuestas de Proyecto Final para el Máster de Industria 4.0 (2020)]]&lt;br /&gt;
&lt;br /&gt;
[[Otras propuestas de Proyecto Final para el Máster de Industria 4.0 de la empresa Siarq (2020)]]&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
user: docent.industria4.0@fundacioupc.com&lt;br /&gt;
password: Industria4@online2020&lt;br /&gt;
[[Uso de Grafana en el VPS del Máster de Industria 4.0 el curso 2023-2024]]&lt;br /&gt;
&lt;br /&gt;
Broker MQTT&lt;br /&gt;
Address:  vps656540.ovh.net&lt;br /&gt;
&lt;br /&gt;
MQTT native plain port 1883&lt;br /&gt;
MQTT Websockets plain port 8081&lt;br /&gt;
MQTT Websockets encrypted port 8082&lt;br /&gt;
&lt;br /&gt;
Allow anonymous: No&lt;br /&gt;
Credentials&lt;br /&gt;
username: user&lt;br /&gt;
password: pass&lt;br /&gt;
&lt;br /&gt;
Xavier Pi, [2/5/25 16:17]&lt;br /&gt;
https://vps656540.ovh.net:5678&lt;br /&gt;
&lt;br /&gt;
Xavier Pi, [2/5/25 16:19]&lt;br /&gt;
user:  masterenindustria4.0@gmail.com&lt;br /&gt;
pass:  Society5_0&lt;br /&gt;
&lt;br /&gt;
Xavier Pi, [2/5/25 17:03]&lt;br /&gt;
http://xavierpi.com/n8n_test&lt;br /&gt;
&lt;br /&gt;
Xavier Pi, [2/5/25 17:23]&lt;br /&gt;
pass:  TransformacioDigital4_0&lt;br /&gt;
Xavier Pi, [2/5/25 17:23]&lt;br /&gt;
masterenindustria4.0@gmail.com&lt;br /&gt;
&lt;br /&gt;
Xavier Pi, [2/5/25 17:23]&lt;br /&gt;
pass:  TransformacioDigital4_0&lt;br /&gt;
--&amp;gt;&lt;/div&gt;</summary>
		<author><name>Jordi Binefa</name></author>
		
	</entry>
	<entry>
		<id>https://www.binefa.com/index.php?title=Uso_de_MariaDB_en_el_VPS_del_M%C3%A1ster_de_Industria_4.0_el_curso_2025-2026&amp;diff=12298</id>
		<title>Uso de MariaDB en el VPS del Máster de Industria 4.0 el curso 2025-2026</title>
		<link rel="alternate" type="text/html" href="https://www.binefa.com/index.php?title=Uso_de_MariaDB_en_el_VPS_del_M%C3%A1ster_de_Industria_4.0_el_curso_2025-2026&amp;diff=12298"/>
		<updated>2026-05-12T18:00:59Z</updated>

		<summary type="html">&lt;p&gt;Jordi Binefa: /* Acceso al terminal del VPS */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Acceso al terminal del VPS =&lt;br /&gt;
* Para acceder al terminal remoto del VPS desde Windows, abrir el teminal (''cmd'') o el ''powershell'' y escribir:&lt;br /&gt;
 ssh '''convidat'''@master.iotvertebrae.com&lt;br /&gt;
La contraseña era ''benvingut'' ('''desactivado el acceso ''ssh'' por seguridad''')&lt;br /&gt;
&lt;br /&gt;
* Para acceder al terminal remoto del VPS desde Linux, abrir el teminal escribir:&lt;br /&gt;
 ssh '''convidat'''@master.iotvertebrae.com&lt;br /&gt;
y en caso de querer enviar cada 30 segundos un ''blank token'' para evitar la desconexión por ''time out'':&lt;br /&gt;
 ssh -o ServerAliveInterval=30 '''convidat'''@master.iotvertebrae.com&lt;br /&gt;
&lt;br /&gt;
= Información sobre la instalación de la base de datos MariaDB =&lt;br /&gt;
'''Este apartado es puramente informativo'''. En el VPS ya está instalada la base de datos.&lt;br /&gt;
&lt;br /&gt;
[https://www.digitalocean.com/community/tutorials/how-to-install-mariadb-on-debian-11 Un tutorial de instalación de MariaDB en Debian 11]&lt;br /&gt;
&lt;br /&gt;
Pasos de la instalación desde el terminal:&lt;br /&gt;
 sudo apt update&lt;br /&gt;
 sudo apt install mariadb-server&lt;br /&gt;
 sudo mariadb-secure-installation ''(en este paso el sistema pregunta una contraseña para el usuario '''root''')''&lt;br /&gt;
&lt;br /&gt;
[https://www.digitalocean.com/community/tutorials/how-to-create-a-new-user-and-grant-permissions-in-mysql Un tutorial de creación de usuarios con diferentes permisos (''privilegios'')]&lt;br /&gt;
&lt;br /&gt;
Desde el terminal del sistema operativo se pide entrar al terminal de MariaDB. La primera vez como usuario ''root'':&lt;br /&gt;
 sudo mysql -u root -p&lt;br /&gt;
 ''(el sistema pide la contraseña del usuario root)''&lt;br /&gt;
Una vez dentro del terminal de MariaDB se crean los usuarios ''iot'' y ''convidat'' con sus respectivas contraseñas. Se crea la base de datos ''aula206'', se otorgan todos los permisos al usuario ''iot'' y tan solo la lectura al usuario ''convidat'':&lt;br /&gt;
 CREATE USER 'iot'@'localhost' IDENTIFIED BY 'iot';&lt;br /&gt;
 CREATE USER 'convidat'@'localhost' IDENTIFIED BY 'benvingut';&lt;br /&gt;
 &lt;br /&gt;
 CREATE DATABASE aula206;&lt;br /&gt;
 SHOW DATABASES;&lt;br /&gt;
 USE aula206;&lt;br /&gt;
 &lt;br /&gt;
 GRANT ALL PRIVILEGES ON aula206.* TO 'iot'@'localhost';&lt;br /&gt;
 GRANT SELECT ON aula206.* TO 'convidat'@'localhost';&lt;br /&gt;
 FLUSH PRIVILEGES;&lt;br /&gt;
&lt;br /&gt;
= Acceso a la base de datos desde el terminal del VPS =&lt;br /&gt;
Para acceder a la base de datos hay tres usuarios con permisos diferentes:&lt;br /&gt;
&lt;br /&gt;
- '''root''': Tiene todos los permisos. Puede crear usuarios y bases de datos.&lt;br /&gt;
&lt;br /&gt;
- '''iot''': Tiene permisos de '''lectura y escritura''' sobre la base de datos '''aula206'''.&lt;br /&gt;
&lt;br /&gt;
- '''convidat''': Tiene permisos de '''lectura''' sobre la base de datos '''aula206'''.&lt;br /&gt;
&lt;br /&gt;
Para acceder al terminal de MariaDB como usuario '''iot''':&lt;br /&gt;
 mysql -u '''iot''' -p&lt;br /&gt;
 (el sistema pregunta por la contraseña de este usuario. Es la que sale en el apartado anterior después de ''IDENTIFIED BY'')&lt;br /&gt;
&lt;br /&gt;
Para acceder al terminal de MariaDB como usuario '''convidat''':&lt;br /&gt;
 mysql -u '''convidat''' -p&lt;br /&gt;
 (el sistema pregunta por la contraseña de este usuario. Es la que sale en el apartado anterior después de ''IDENTIFIED BY'')&lt;br /&gt;
&lt;br /&gt;
= Creación de tablas =&lt;br /&gt;
Para crear tablas en la base de datos hace falta que el usuario tenga permisos de escritura a la base de datos ('''iot''' tiene permisos de escritura en la base de datos '''aula206'''. '''convidat''' no tiene permisos de escritura en la base de datos '''aula206''').&lt;br /&gt;
&lt;br /&gt;
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 [[Asignación de puertos para el curso 2022-2023 | número de puerto que se os ha asignado]].&lt;br /&gt;
&lt;br /&gt;
 mysql -u '''iot''' -p&lt;br /&gt;
 (el sistema pregunta por la contraseña de este usuario. Es la que sale en el apartado anterior después de ''IDENTIFIED BY'')&lt;br /&gt;
 USE aula206;&lt;br /&gt;
 '''CREATE''' TABLE m'''28XX'''_Temperatura (&lt;br /&gt;
  time TIMESTAMP DEFAULT CURRENT_TIMESTAMP,&lt;br /&gt;
  value FLOAT,&lt;br /&gt;
  PRIMARY KEY (time));&lt;br /&gt;
'''value''' es el nombre del valor que vamos a introducir en la tabla. Se declara como ''FLOAT'' (número real. Permite decimales).&lt;br /&gt;
&lt;br /&gt;
= Borrado de tablas =&lt;br /&gt;
'''Id con cuidado en el momento de borrar una tabla. El proceso borra todos los datos y la misma tabla. No es posible recuperar los datos de las tablas si no se ha hecho una copia de seguridad'''.&lt;br /&gt;
&lt;br /&gt;
Para borrar tablas en la base de datos hace falta que el usuario tenga permisos de escritura a la base de datos ('''iot''' tiene permisos de escritura en la base de datos '''aula206'''. '''convidat''' no tiene permisos de escritura en la base de datos '''aula206'''). &lt;br /&gt;
 mysql -u '''iot''' -p&lt;br /&gt;
 (el sistema pregunta por la contraseña de este usuario. Es la que sale en el apartado anterior después de ''IDENTIFIED BY'')&lt;br /&gt;
 USE aula206;&lt;br /&gt;
 '''DROP TABLE''' m28XX_Temperatura;&lt;br /&gt;
&lt;br /&gt;
= Inserción de datos =&lt;br /&gt;
La inserción (también conocida por escritura) de datos tiene que hacerla un usuario con permisos suficientes (el usuario '''iot''' puede escribir).&lt;br /&gt;
&lt;br /&gt;
Ejemplo de inserción del valor 23.4 como valor en el campo '''value'''.&lt;br /&gt;
 '''insert''' into m28XX_Temperatura (value) values (23.4);&lt;br /&gt;
&lt;br /&gt;
= Lectura de datos =&lt;br /&gt;
La lectura de datos tiene que hacerla un usuario con permisos suficientes (los usuarios '''iot''' y '''convidat''' pueden leer).&lt;br /&gt;
&lt;br /&gt;
[https://mariadb.com/kb/es/select/ Documentación oficial de la orden SELECT].&lt;br /&gt;
&lt;br /&gt;
Visualización de todos los datos de la tabla m28XX_Temperatura:&lt;br /&gt;
 '''select''' * from m28XX_Temperatura;&lt;br /&gt;
&lt;br /&gt;
Ejemplo de respuesta del terminal de MariaDB:&lt;br /&gt;
 MariaDB [aula206]&amp;gt; '''select * from m28XX_Temperatura;'''&lt;br /&gt;
 +---------------------+-------+&lt;br /&gt;
 | time                | value |&lt;br /&gt;
 +---------------------+-------+&lt;br /&gt;
 | 2023-04-05 17:23:59 |  23.4 |&lt;br /&gt;
 | 2023-04-05 17:28:29 |  23.7 |&lt;br /&gt;
 +---------------------+-------+&lt;br /&gt;
 2 rows in set (0.001 sec)&lt;br /&gt;
&lt;br /&gt;
[https://mariadb.com/kb/en/getting-data-from-mariadb/ Getting Data from MariaDB]&lt;br /&gt;
&lt;br /&gt;
= Creación de tablas vista =&lt;br /&gt;
Para poder usar la base de datos en sistemas externos de graficación nos hará falta que el registro del momento de inserción del dato esté expresado en [https://www.unixtimestamp.com/ formato de la época UNIX]. Ejemplo de visualización de una tabla vista con el valor del tiempo en formato Unix: &lt;br /&gt;
 MariaDB [aula206]&amp;gt; select * from m28XX_Temperatura_v;&lt;br /&gt;
 +------------+-------+&lt;br /&gt;
 | time       | value |&lt;br /&gt;
 +------------+-------+&lt;br /&gt;
 | 1680708239 |  23.4 |&lt;br /&gt;
 | 1680708509 |  23.7 |&lt;br /&gt;
 +------------+-------+&lt;br /&gt;
 2 rows in set (0.000 sec)&lt;br /&gt;
&lt;br /&gt;
Creación de la tabla vista '''m28XX_Temperatura_v''' con la unidad de tiempo cambiada (tomando como origen la tabla '''m28XX_Temperatura'''):&lt;br /&gt;
 '''CREATE VIEW''' m28XX_Temperatura_v AS select UNIX_TIMESTAMP(time) as time, value from m28XX_Temperatura;&lt;br /&gt;
&lt;br /&gt;
= Inserción y lectura de datos múltiples =&lt;br /&gt;
Habitualmente nos hará falta introducir un grupo de datos al mismo tiempo. Por ejemplo, esta tabla contiene tres valores en el mismo momento del registro: &lt;br /&gt;
 MariaDB [aula206]&amp;gt; select * from m28XX_T_RH_P_v;&lt;br /&gt;
 +------------+--------+---------+---------+&lt;br /&gt;
 | time       | valueT | valueRH | valueP  |&lt;br /&gt;
 +------------+--------+---------+---------+&lt;br /&gt;
 | 1680884504 |   23.4 |   45.64 | 1002.34 |&lt;br /&gt;
 | 1680884734 |   23.7 |   45.21 | 1003.04 |&lt;br /&gt;
 | 1680885724 |  17.89 |   44.32 | 1001.23 |&lt;br /&gt;
 | 1680885726 |  19.03 |   40.65 | 1002.11 |&lt;br /&gt;
 | 1680885728 |  15.43 |   56.78 | 1000.87 |&lt;br /&gt;
 | 1680886069 |  19.03 |   40.65 | 1002.11 |&lt;br /&gt;
 +------------+--------+---------+---------+&lt;br /&gt;
 6 rows in set (0.000 sec)&lt;br /&gt;
&lt;br /&gt;
* '''Creación''' de la tabla con datos múltiples ('''valueT''', '''valueRH''' y '''valueP'''):&lt;br /&gt;
 '''CREATE TABLE''' `m28XX_T_RH_P` (&lt;br /&gt;
  `time` TIMESTAMP DEFAULT CURRENT_TIMESTAMP,&lt;br /&gt;
  `'''valueT'''` FLOAT,&lt;br /&gt;
  `'''valueRH'''` FLOAT,&lt;br /&gt;
  `'''valueP'''` FLOAT,&lt;br /&gt;
  PRIMARY KEY (`time`))&lt;br /&gt;
 ENGINE = InnoDB;&lt;br /&gt;
&lt;br /&gt;
* '''Inserción''' de datos múltiples:&lt;br /&gt;
 '''insert into''' m28XX_T_RH_P ('''valueT''','''valueRH''','''valueP''') values (23.4,45.64,1002.34);&lt;br /&gt;
* '''Lectura''' de datos múltiples:&lt;br /&gt;
 '''select''' * '''from''' m28XX_T_RH_P;&lt;br /&gt;
* '''Creación''' de la '''tabla vista''':&lt;br /&gt;
 '''CREATE VIEW''' m28XX_T_RH_P_v '''AS''' select UNIX_TIMESTAMP(time) as time, valueT, valueRH, valueP from m28XX_T_RH_P;&lt;br /&gt;
* '''Borrado''' de la '''tabla vista'''&lt;br /&gt;
 '''DROP VIEW''' IF EXISTS m28XX_T_RH_P_v;&lt;br /&gt;
* '''Borrado''' de la '''tabla'''&lt;br /&gt;
 '''DROP TABLE''' m28XX_T_RH_P;&lt;/div&gt;</summary>
		<author><name>Jordi Binefa</name></author>
		
	</entry>
	<entry>
		<id>https://www.binefa.com/index.php?title=16_/_5_/_2026_-_IoT,_Embedded_Systems,_Edge_y_Cloud&amp;diff=12297</id>
		<title>16 / 5 / 2026 - IoT, Embedded Systems, Edge y Cloud</title>
		<link rel="alternate" type="text/html" href="https://www.binefa.com/index.php?title=16_/_5_/_2026_-_IoT,_Embedded_Systems,_Edge_y_Cloud&amp;diff=12297"/>
		<updated>2026-05-12T17:59:14Z</updated>

		<summary type="html">&lt;p&gt;Jordi Binefa: /* Conexión entre la placa IoT-02 y Snap! mediante MQTT */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Conceptos previos (15 / 5 / 2026) =&lt;br /&gt;
Acceso a la base de datos del VPS del máster&lt;br /&gt;
&lt;br /&gt;
= Temario (16 / 5 / 2026) =&lt;br /&gt;
[https://meet.google.com/rke-afvm-eou Videoconferencia]&lt;br /&gt;
&lt;br /&gt;
== Repaso del día anterior ==&lt;br /&gt;
* [https://www.binefa.cat/training/iot02/pdf/iot02_00_es.pdf Introducción a la placa IoT-02]&lt;br /&gt;
* [[El protocolo MQTT]]&lt;br /&gt;
* [[Gemelos digitales especializados]] (Placa IoT-02 e IoT-Vertebrae)&lt;br /&gt;
&lt;br /&gt;
== Conexión entre la placa IoT-02 y Snap! mediante MQTT ==&lt;br /&gt;
&amp;lt;!-- '''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;
&lt;br /&gt;
* Broker MQTT púplico:&lt;br /&gt;
** MQTT TCP por el puerto no seguro 1883: '''broker.emqx.io'''&lt;br /&gt;
** MQTT WSS por puerto seguro: '''wss://broker.emqx.io:8084/mqtt'''&lt;br /&gt;
* Broker MQTT en el VPS del máster:&lt;br /&gt;
** MQTT TCP por el puerto no seguro 1883: '''master.iotvertebrae.com'''&lt;br /&gt;
** MQTT WSS por puerto seguro: '''wss://master.iotvertebrae.com:9002'''&lt;br /&gt;
&amp;lt;!-- '''Nuevo firmware de la placa IoT-02 para el día de hoy''': [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]&lt;br /&gt;
[[Conexión entre la placa IoT-02 y Snap! v8 mediante MQTT]]&lt;br /&gt;
[[Conexión entre la placa IoT-02 y Snap! v9 mediante MQTT]] --&amp;gt;&lt;br /&gt;
[https://snap.berkeley.edu/snap/snap.html#present:Username=jordibinefa&amp;amp;ProjectName=IoT-02_board_segur_66C172FB482D_broker_master_iotvertebrae Control de la placa IoT-02. Broker del VPS del máster] El [https://github.com/jordibinefa/IoT-02/tree/master/codes/IoT-02_mqtt_sync_upcSchool_broker1 ''firmware'' IoT-02_mqtt_sync_upcSchool_broker1] enseña el número MAC por la pantalla OLED cuando la placa IoT-02 se conecta a vuestra wifi. (Cambiar el archivo [https://github.com/jordibinefa/IoT-02/blob/master/codes/IoT-02_mqtt_sync_upcSchool_broker1/IoT-02_wifiCredentials.h IoT-02_wifiCredentials.h] en la línea 21 substituyendo ''iotcat'' por el nombre de la SSID de vuestra wifi y ''1234567890a'' por vuestra contraseña).&lt;br /&gt;
&lt;br /&gt;
== Uso de la base de datos MariaDB para almacenar y leer datos IoT ==&lt;br /&gt;
[[Uso de MariaDB en el VPS del Máster de Industria 4.0 el curso 2025-2026 | Uso de MariaDB en el VPS del Máster de Industria 4.0]]&lt;br /&gt;
&amp;lt;!-- [[Uso de MariaDB en el VPS del Máster de Industria 4.0 el curso 2023-2024]]&lt;br /&gt;
[[Uso de MariaDB en el VPS del Máster de Industria 4.0 el curso 2022-2023 | Uso de MariaDB en el VPS del Máster de Industria 4.0 el curso 2023-2024]]--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Node-RED ==&lt;br /&gt;
[[Asignación de puertos para el curso 2025-2026 | Asignación de puertos para este curso]]&lt;br /&gt;
&amp;lt;!--[[Asignación de puertos para el curso 2023-2024]]&lt;br /&gt;
[[Asignación de puertos para el curso 2022-2023]]--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Uso del Node-RED ===&lt;br /&gt;
[[Uso del NodeRED (2024) | Uso del Node-RED]]&lt;br /&gt;
&amp;lt;!--[[Uso del NodeRED (2023) | Uso del Node-RED]]--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Uso de la base de datos MariaDB desde Node-RED===&lt;br /&gt;
[[Uso de la base de datos MariaDB desde NodeRED (2023) | Uso de la base de datos MariaDB desde Node-RED]]&lt;br /&gt;
&amp;lt;!-- == Telegram ==&lt;br /&gt;
[[Uso de Telegram desde NodeRED]]--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Repaso y dudas de la clase invertida ==&lt;br /&gt;
=== Verificación de nodos instalados ===&lt;br /&gt;
Antes de continuar verificamos que ya tenemos instalado el nodo de MySQL ('''node-red-node-mysql''') y los nodos del panel de control ('''node-red-dashboard''' -marcado como ''deprecated''-).&lt;br /&gt;
==== Nodo node-red-node-mysql ====&lt;br /&gt;
[https://flows.nodered.org/node/node-red-node-mysql Documentación oficial del nodo ''node-red-node-mysql'']&lt;br /&gt;
&lt;br /&gt;
[[Image:10MariaDbNodeRed00.png|center|thumb|Instalación de los nodos de MariaDB (''MySQL'') en NodeRED]]&lt;br /&gt;
[[Image:11nodoMariaDbNodeRed.png|center|thumb|Aspecto del nodo MySQL en NodeRED]]&lt;br /&gt;
&lt;br /&gt;
==== Nodos node-red-dashboard ====&lt;br /&gt;
[https://flows.nodered.org/node/node-red-dashboard Documentación oficial de los nodos ''node-red-dashboard'']&lt;br /&gt;
&lt;br /&gt;
[[Image:NodosDashboard.png|center|thumb|Nodos del panel de control (''Dashboard'') en NodeRED]]&lt;br /&gt;
&lt;br /&gt;
=== Acceso al VPS del máster ===&lt;br /&gt;
 ssh -o ServerAliveInterval=30 convidat@vps656540.ovh.net&lt;br /&gt;
o&lt;br /&gt;
 ssh convidat@vps656540.ovh.net&lt;br /&gt;
=== Acceso a la base de datos del VPS del máster ===&lt;br /&gt;
* Con permisos de lectura y escritura:&lt;br /&gt;
 mysql -u iot -p&lt;br /&gt;
* Con permisos de lectura:&lt;br /&gt;
 mysql -u convidat -p&lt;br /&gt;
&lt;br /&gt;
=== Repaso ===&lt;br /&gt;
* Uso de JSON con Snap!&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;
&lt;br /&gt;
* Aleatorización de múltiples datos controlada por el panel de control&lt;br /&gt;
&lt;br /&gt;
* Escritura síncrona de múltiples datos asíncronos al mismo tiempo. Uso del formato de datos json&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
* Telegram--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Ejercicios ==&lt;br /&gt;
=== Ejercicio de '''Snap! con MQTT''' ===&lt;br /&gt;
* Mediante Snap! hacer que en la pantalla aparezca, de forma infinita y con una cadencia de dos segundos, el porcentaje de luz leída por la LDR y después la temperatura en grados centígrados.&lt;br /&gt;
&lt;br /&gt;
=== Ejercicios de '''NodeRED''' ===&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;
==== 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;
==== Ejercicio '''NodeRED-03''' ====&lt;br /&gt;
* Implementad una pasarela (''gateway'') HTTP/MQTT para cambiar el estado de los leds y el relé biestable de la placa IoT-02.&lt;br /&gt;
&lt;br /&gt;
==== Ejercicio '''NodeRED-04''' ====&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;br /&gt;
&lt;br /&gt;
==== Ejercicio '''NodeRED-05''' ====&lt;br /&gt;
* Implementar un flujo de NodeRED que supervise continuamente el valor de la LDR. Introducir dos ''sliders'' para fijar umbrales. Cuando la luz supere el umbral establecido el led rojo se enciende y el relé biestable cambia a SET. Cuando la luz baje del segundo umbral establecido el led rojo se apaga (se enciende el verde) y el relé biestable cambia a RESET.&lt;br /&gt;
&lt;br /&gt;
==== Ejercicio '''NodeRED-06''' ====&lt;br /&gt;
* Implementar un flujo de NodeRED que permita la entrada de un texto y con un botón lo envie a la pantalla OLED.&lt;br /&gt;
&lt;br /&gt;
==== Ejercicio '''NodeRED-07''' ====&lt;br /&gt;
* Implementar un flujo de NodeRED que permita seleccionar un mode de funcionamiento automático o manual. En manual se puede encender y apagar el led blanco mediante un ''switch''. En modo automático el led blanco se enciende o se apaga en función de un umbral consignado mediante un ''slider''. (Para habilitar o inhabilitar un ''switch'' se puede usar ''msg.enabled'').&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--=== Ejercicios '''Telegram''' ===&lt;br /&gt;
* Desde el chat del bot: Al enviar la orden '''/ledWon''' se enciende el led blanco de la placa IoT-02. Al enviar la orden '''/ledWoff''' se apaga el led blanco.&lt;br /&gt;
&lt;br /&gt;
* Desde el chat del bot: Al enviar la orden '''/ledReleSet''' el relé se pone en estado SET. Al enviar la orden '''/ledReleReset''' el relé se pone en estado RESET.&lt;br /&gt;
&lt;br /&gt;
* El chat de vuestro bot recibe un mensaje cuando se aprieta vuestro botón I34 y cuando se deja de apretar.&lt;br /&gt;
&lt;br /&gt;
* Desde el chat del grupo donde pertenece vuestro bot: Al enviar la orden '''/entradas''' el bot contesta con los estados de los botones y la temperatura de la placa.--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Comentario de la práctica para el próximo día ===&lt;br /&gt;
El enunciado estará en breve en el campus. Se comenzará después de haber usado Grafana y Telegram.&lt;/div&gt;</summary>
		<author><name>Jordi Binefa</name></author>
		
	</entry>
	<entry>
		<id>https://www.binefa.com/index.php?title=16_/_5_/_2026_-_IoT,_Embedded_Systems,_Edge_y_Cloud&amp;diff=12296</id>
		<title>16 / 5 / 2026 - IoT, Embedded Systems, Edge y Cloud</title>
		<link rel="alternate" type="text/html" href="https://www.binefa.com/index.php?title=16_/_5_/_2026_-_IoT,_Embedded_Systems,_Edge_y_Cloud&amp;diff=12296"/>
		<updated>2026-05-12T17:57:26Z</updated>

		<summary type="html">&lt;p&gt;Jordi Binefa: /* Repaso del día anterior */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Conceptos previos (15 / 5 / 2026) =&lt;br /&gt;
Acceso a la base de datos del VPS del máster&lt;br /&gt;
&lt;br /&gt;
= Temario (16 / 5 / 2026) =&lt;br /&gt;
[https://meet.google.com/rke-afvm-eou Videoconferencia]&lt;br /&gt;
&lt;br /&gt;
== Repaso del día anterior ==&lt;br /&gt;
* [https://www.binefa.cat/training/iot02/pdf/iot02_00_es.pdf Introducción a la placa IoT-02]&lt;br /&gt;
* [[El protocolo MQTT]]&lt;br /&gt;
* [[Gemelos digitales especializados]] (Placa IoT-02 e IoT-Vertebrae)&lt;br /&gt;
&lt;br /&gt;
== Conexión entre la placa IoT-02 y Snap! mediante MQTT ==&lt;br /&gt;
&amp;lt;!-- '''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;
&lt;br /&gt;
* Broker MQTT púplico:&lt;br /&gt;
** MQTT TCP por el puerto no seguro 1883: '''broker.emqx.io'''&lt;br /&gt;
** MQTT WSS por puerto seguro: '''wss://broker.emqx.io:8084/mqtt'''&lt;br /&gt;
* Broker MQTT en el VPS del máster:&lt;br /&gt;
** MQTT TCP por el puerto no seguro 1883: '''master.iotvertebrae.com'''&lt;br /&gt;
** MQTT WSS por puerto seguro: '''wss://master.iotvertebrae.com:9002'''&lt;br /&gt;
&amp;lt;!-- '''Nuevo firmware de la placa IoT-02 para el día de hoy''': [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]&lt;br /&gt;
[[Conexión entre la placa IoT-02 y Snap! v8 mediante MQTT]]&lt;br /&gt;
[[Conexión entre la placa IoT-02 y Snap! v9 mediante MQTT]] --&amp;gt;&lt;br /&gt;
[https://snap.berkeley.edu/snap/snap.html#open:https://wa.binefa.cat/snapCodes/IoT-02_board.xml Código Snap! v10] El [https://github.com/jordibinefa/IoT-02/tree/master/codes/IoT-02_mqtt_sync_upcSchool_broker1 ''firmware'' IoT-02_mqtt_sync_upcSchool_broker1] enseña el número MAC por la pantalla OLED cuando la placa IoT-02 se conecta a vuestra wifi. (Cambiar el archivo [https://github.com/jordibinefa/IoT-02/blob/master/codes/IoT-02_mqtt_sync_upcSchool_broker1/IoT-02_wifiCredentials.h IoT-02_wifiCredentials.h] en la línea 21 substituyendo ''iotcat'' por el nombre de la SSID de vuestra wifi y ''1234567890a'' por vuestra contraseña).&lt;br /&gt;
&lt;br /&gt;
== Uso de la base de datos MariaDB para almacenar y leer datos IoT ==&lt;br /&gt;
[[Uso de MariaDB en el VPS del Máster de Industria 4.0 el curso 2025-2026 | Uso de MariaDB en el VPS del Máster de Industria 4.0]]&lt;br /&gt;
&amp;lt;!-- [[Uso de MariaDB en el VPS del Máster de Industria 4.0 el curso 2023-2024]]&lt;br /&gt;
[[Uso de MariaDB en el VPS del Máster de Industria 4.0 el curso 2022-2023 | Uso de MariaDB en el VPS del Máster de Industria 4.0 el curso 2023-2024]]--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Node-RED ==&lt;br /&gt;
[[Asignación de puertos para el curso 2025-2026 | Asignación de puertos para este curso]]&lt;br /&gt;
&amp;lt;!--[[Asignación de puertos para el curso 2023-2024]]&lt;br /&gt;
[[Asignación de puertos para el curso 2022-2023]]--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Uso del Node-RED ===&lt;br /&gt;
[[Uso del NodeRED (2024) | Uso del Node-RED]]&lt;br /&gt;
&amp;lt;!--[[Uso del NodeRED (2023) | Uso del Node-RED]]--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Uso de la base de datos MariaDB desde Node-RED===&lt;br /&gt;
[[Uso de la base de datos MariaDB desde NodeRED (2023) | Uso de la base de datos MariaDB desde Node-RED]]&lt;br /&gt;
&amp;lt;!-- == Telegram ==&lt;br /&gt;
[[Uso de Telegram desde NodeRED]]--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Repaso y dudas de la clase invertida ==&lt;br /&gt;
=== Verificación de nodos instalados ===&lt;br /&gt;
Antes de continuar verificamos que ya tenemos instalado el nodo de MySQL ('''node-red-node-mysql''') y los nodos del panel de control ('''node-red-dashboard''' -marcado como ''deprecated''-).&lt;br /&gt;
==== Nodo node-red-node-mysql ====&lt;br /&gt;
[https://flows.nodered.org/node/node-red-node-mysql Documentación oficial del nodo ''node-red-node-mysql'']&lt;br /&gt;
&lt;br /&gt;
[[Image:10MariaDbNodeRed00.png|center|thumb|Instalación de los nodos de MariaDB (''MySQL'') en NodeRED]]&lt;br /&gt;
[[Image:11nodoMariaDbNodeRed.png|center|thumb|Aspecto del nodo MySQL en NodeRED]]&lt;br /&gt;
&lt;br /&gt;
==== Nodos node-red-dashboard ====&lt;br /&gt;
[https://flows.nodered.org/node/node-red-dashboard Documentación oficial de los nodos ''node-red-dashboard'']&lt;br /&gt;
&lt;br /&gt;
[[Image:NodosDashboard.png|center|thumb|Nodos del panel de control (''Dashboard'') en NodeRED]]&lt;br /&gt;
&lt;br /&gt;
=== Acceso al VPS del máster ===&lt;br /&gt;
 ssh -o ServerAliveInterval=30 convidat@vps656540.ovh.net&lt;br /&gt;
o&lt;br /&gt;
 ssh convidat@vps656540.ovh.net&lt;br /&gt;
=== Acceso a la base de datos del VPS del máster ===&lt;br /&gt;
* Con permisos de lectura y escritura:&lt;br /&gt;
 mysql -u iot -p&lt;br /&gt;
* Con permisos de lectura:&lt;br /&gt;
 mysql -u convidat -p&lt;br /&gt;
&lt;br /&gt;
=== Repaso ===&lt;br /&gt;
* Uso de JSON con Snap!&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;
&lt;br /&gt;
* Aleatorización de múltiples datos controlada por el panel de control&lt;br /&gt;
&lt;br /&gt;
* Escritura síncrona de múltiples datos asíncronos al mismo tiempo. Uso del formato de datos json&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
* Telegram--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Ejercicios ==&lt;br /&gt;
=== Ejercicio de '''Snap! con MQTT''' ===&lt;br /&gt;
* Mediante Snap! hacer que en la pantalla aparezca, de forma infinita y con una cadencia de dos segundos, el porcentaje de luz leída por la LDR y después la temperatura en grados centígrados.&lt;br /&gt;
&lt;br /&gt;
=== Ejercicios de '''NodeRED''' ===&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;
==== 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;
==== Ejercicio '''NodeRED-03''' ====&lt;br /&gt;
* Implementad una pasarela (''gateway'') HTTP/MQTT para cambiar el estado de los leds y el relé biestable de la placa IoT-02.&lt;br /&gt;
&lt;br /&gt;
==== Ejercicio '''NodeRED-04''' ====&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;br /&gt;
&lt;br /&gt;
==== Ejercicio '''NodeRED-05''' ====&lt;br /&gt;
* Implementar un flujo de NodeRED que supervise continuamente el valor de la LDR. Introducir dos ''sliders'' para fijar umbrales. Cuando la luz supere el umbral establecido el led rojo se enciende y el relé biestable cambia a SET. Cuando la luz baje del segundo umbral establecido el led rojo se apaga (se enciende el verde) y el relé biestable cambia a RESET.&lt;br /&gt;
&lt;br /&gt;
==== Ejercicio '''NodeRED-06''' ====&lt;br /&gt;
* Implementar un flujo de NodeRED que permita la entrada de un texto y con un botón lo envie a la pantalla OLED.&lt;br /&gt;
&lt;br /&gt;
==== Ejercicio '''NodeRED-07''' ====&lt;br /&gt;
* Implementar un flujo de NodeRED que permita seleccionar un mode de funcionamiento automático o manual. En manual se puede encender y apagar el led blanco mediante un ''switch''. En modo automático el led blanco se enciende o se apaga en función de un umbral consignado mediante un ''slider''. (Para habilitar o inhabilitar un ''switch'' se puede usar ''msg.enabled'').&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--=== Ejercicios '''Telegram''' ===&lt;br /&gt;
* Desde el chat del bot: Al enviar la orden '''/ledWon''' se enciende el led blanco de la placa IoT-02. Al enviar la orden '''/ledWoff''' se apaga el led blanco.&lt;br /&gt;
&lt;br /&gt;
* Desde el chat del bot: Al enviar la orden '''/ledReleSet''' el relé se pone en estado SET. Al enviar la orden '''/ledReleReset''' el relé se pone en estado RESET.&lt;br /&gt;
&lt;br /&gt;
* El chat de vuestro bot recibe un mensaje cuando se aprieta vuestro botón I34 y cuando se deja de apretar.&lt;br /&gt;
&lt;br /&gt;
* Desde el chat del grupo donde pertenece vuestro bot: Al enviar la orden '''/entradas''' el bot contesta con los estados de los botones y la temperatura de la placa.--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Comentario de la práctica para el próximo día ===&lt;br /&gt;
El enunciado estará en breve en el campus. Se comenzará después de haber usado Grafana y Telegram.&lt;/div&gt;</summary>
		<author><name>Jordi Binefa</name></author>
		
	</entry>
	<entry>
		<id>https://www.binefa.com/index.php?title=ASIX2_-_SM7._Fonaments_de_desenvolupament_Web_amb_PHP._Curs_2025-2026&amp;diff=12295</id>
		<title>ASIX2 - SM7. Fonaments de desenvolupament Web amb PHP. Curs 2025-2026</title>
		<link rel="alternate" type="text/html" href="https://www.binefa.com/index.php?title=ASIX2_-_SM7._Fonaments_de_desenvolupament_Web_amb_PHP._Curs_2025-2026&amp;diff=12295"/>
		<updated>2026-05-12T16:23:57Z</updated>

		<summary type="html">&lt;p&gt;Jordi Binefa: /* 20260505 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Quan tingueu les credencials d'accés a la [https://clot.fje.edu/ca NET] heu de compartir una carpeta amb aquest nom: '''2526-ASIX-SM7-1rCognom2nCognomNom''' (Per exemple, si el teu nom és Xavier López Pujol --&amp;gt; ''2526-ASIX-SM7-LopezPujolXavier''). A aquest enllaç podreu veure si ja hi sou a la llista:&lt;br /&gt;
&lt;br /&gt;
[[Carpetes compartides del SM7 de 2n d'ASIX. Curs 2025-2026]]&lt;br /&gt;
&lt;br /&gt;
= Enllaços ràpids =&lt;br /&gt;
[https://meet.google.com/wwr-knez-ukp Compartició de pantalla]&lt;br /&gt;
&lt;br /&gt;
[[Recull de pràctiques de 2n d'ASIX. Curs 2025-2026]]&lt;br /&gt;
&lt;br /&gt;
[https://recull.binefa.cat/ recull.binefa.cat] (''sm7'' / ''asix2526'')&lt;br /&gt;
&lt;br /&gt;
[https://docs.google.com/spreadsheets/d/1K3viCV5UNCye_wC0J4WukpH986n_lIsqRPGNhq-SX-E/edit?gid=393653686#gid=393653686  Llista de 2n d'ASIX] &amp;lt;!--&lt;br /&gt;
[https://fje.sharepoint.com/:x:/r/sites/GD_CLOT-FP-CLOT_FP-DptInformatica/Documentos%20compartidos/CLOT_FP-DptInformatica/2526/LLISTES%20ASSIST%C3%88NCIA/Llista%20ASIX2%202526.xlsx?d=w83d99398a6c44200a67911022d7b58c0&amp;amp;csf=1&amp;amp;web=1&amp;amp;e=CBlwJo Llista de 2n d'ASIX] --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[https://docs.google.com/spreadsheets/d/1KEI7gPDFn8QVRUpTURUZ4LY2J38w5E03ivrBA4nTR0g/edit?gid=0#gid=0 Notes]&lt;br /&gt;
== 20260512 ==&lt;br /&gt;
* Projecte final de cicle&lt;br /&gt;
== 20260505 ==&lt;br /&gt;
* Projecte final de cicle&lt;br /&gt;
&lt;br /&gt;
== 20260428 ==&lt;br /&gt;
* Projecte final de cicle&lt;br /&gt;
&lt;br /&gt;
== 20260421 ==&lt;br /&gt;
Presentació del [[Projecte del tercer trimestre. SM7 Curs 2025-2026 | projecte del tercer trimestre]]&lt;br /&gt;
&lt;br /&gt;
== 20260414 ==&lt;br /&gt;
Seguim fent el [[Projecte del tercer trimestre. SM7 Curs 2025-2026 | projecte del tercer trimestre]]&lt;br /&gt;
&lt;br /&gt;
== 20260407 ==&lt;br /&gt;
Seguim fent el [[Projecte del tercer trimestre. SM7 Curs 2025-2026 | projecte del tercer trimestre]]&lt;br /&gt;
&lt;br /&gt;
== 20260324 ==&lt;br /&gt;
Presentació i començament del [[Projecte del tercer trimestre. SM7 Curs 2025-2026 | projecte del tercer trimestre]]&lt;br /&gt;
&lt;br /&gt;
== 20260317 ==&lt;br /&gt;
&amp;lt;!-- * RA4 — Teoria 2: FileBrowser, Microserveis i Gotenberg --&amp;gt;&lt;br /&gt;
* [https://binefa.com/asix2/sm7/ra4/.teoria2_RA4.html RA4 — Teoria 2: FileBrowser, Microserveis i Gotenberg]&lt;br /&gt;
&amp;lt;!-- * RA4 — Pràctica 2: FileBrowser, Gotenberg i Integració  --&amp;gt;&lt;br /&gt;
* [https://binefa.com/asix2/sm7/ra4/.practica2_RA4.html RA4 — Pràctica 2: FileBrowser, Gotenberg i Integració]&lt;br /&gt;
&lt;br /&gt;
== 20260310 ==&lt;br /&gt;
* [https://binefa.com/asix2/sm7/ra4/teoria1_RA4.html RA4 — Teoria 1: Ofimàtica Web i Contenidors]&lt;br /&gt;
&amp;lt;!-- * RA4 — Pràctica 1: Nextcloud amb Docker Compose --&amp;gt;&lt;br /&gt;
* [https://binefa.com/asix2/sm7/ra4/practica1_RA4.html RA4 — Pràctica 1: Nextcloud amb Docker Compose]&lt;br /&gt;
&lt;br /&gt;
== 20260224 ==&lt;br /&gt;
* 1a hora: Acabeu les [[Recull de pràctiques de 2n d'ASIX. Curs 2025-2026 | pràctiques]] pendents&lt;br /&gt;
* 2a hora: Metacognició de síntesi tipus test&lt;br /&gt;
&lt;br /&gt;
== 20260217 ==&lt;br /&gt;
* Anem acabant les [[Recull de pràctiques de 2n d'ASIX. Curs 2025-2026 | pràctiques]] desant-les a la vostra carpeta compartida&lt;br /&gt;
== 20260210 ==&lt;br /&gt;
* [[Instal·lació de MediaWiki amb dockers]]&lt;br /&gt;
* [[Desenvolupament d'extensions per a MediaWiki]]&lt;br /&gt;
* A classe s'afegeix la [[Recull de pràctiques de 2n d'ASIX. Curs 2025-2026#Pr.C3.A0ctica_9 | pràctica 9]] d'extensions per a MediaWiki. Seguiu fent els exercicis pendents del [[Recull de pràctiques de 2n d'ASIX. Curs 2025-2026 | recull de pràctiques]] desant-los a la vostra carpeta compartida&lt;br /&gt;
* A la part de teoria de [[Desenvolupament d'extensions per a WordPress]] trobareu l'enllac a l'explicació dels ganxos (''hooks'')&lt;br /&gt;
&lt;br /&gt;
== 20260203 ==&lt;br /&gt;
* [[Desenvolupament d'extensions per a WordPress]]&lt;br /&gt;
* S'ha afegit la [[Recull de pràctiques de 2n d'ASIX. Curs 2025-2026#Pr.C3.A0ctica_8 | pràctica 8]] d'extensions per a WordPress. Seguiu fent els exercicis pendents del [[Recull de pràctiques de 2n d'ASIX. Curs 2025-2026 | recull de pràctiques]] desant-los a la vostra carpeta compartida&lt;br /&gt;
&lt;br /&gt;
== 20260127 ==&lt;br /&gt;
* [[WordPress amb docker. Curs 2025-2026]]&lt;br /&gt;
* [[WordPress amb Compose. Curs 2025-2026]]&lt;br /&gt;
* Seguiu fent la [[Recull de pràctiques de 2n d'ASIX. Curs 2025-2026#Pr.C3.A0ctica_6 | pràctica 6]] desant-la a la vostra carpeta compartida&lt;br /&gt;
* Feu la [[Recull de pràctiques de 2n d'ASIX. Curs 2025-2026#Pr.C3.A0ctica_7 | pràctica 7]] desant-la a la vostra carpeta compartida&lt;br /&gt;
&lt;br /&gt;
== 20260120 ==&lt;br /&gt;
* Seguiu fent la [[Recull de pràctiques de 2n d'ASIX. Curs 2025-2026#Pràctica 6 - PHP+MariaDB emprant dockers | pràctica 6 - PHP+MariaDB emprant dockers]] desant-la a la vostra carpeta compartida&lt;br /&gt;
* Mentre feu la darrera pràctica, s'aprofitarà per fer la revisió del [[Enunciat del projecte de connexió PDO entre PHP i MariaDB. Curs 2025-2026 | projecte PDO]], [[Recull de pràctiques de 2n d'ASIX. Curs 2025-2026#Pr.C3.A0ctica_4_-_Galetes | Pràctica 4 - Galetes]] i [[Recull de pràctiques de 2n d'ASIX. Curs 2025-2026#Pr.C3.A0ctica_5_-_Sessions | Pràctica 5 - Sessions]] a aquells alumnes que encara no ho han presentat oralment al professor.&lt;br /&gt;
&lt;br /&gt;
== 20260113 ==&lt;br /&gt;
* [[PHP+MariaDB emprant ''dockers'' | PHP+MariaDB emprant dockers]]&lt;br /&gt;
* Feu la [[Recull de pràctiques de 2n d'ASIX. Curs 2025-2026#Pràctica 6 - PHP+MariaDB emprant dockers | pràctica 6 - PHP+MariaDB emprant dockers]] desant-la a la vostra carpeta compartida&lt;br /&gt;
* Mentre feu la darrera pràctica, s'aprofitarà per fer la revisió del [[Enunciat del projecte de connexió PDO entre PHP i MariaDB. Curs 2025-2026 | projecte PDO]], [[Recull de pràctiques de 2n d'ASIX. Curs 2025-2026#Pr.C3.A0ctica_4_-_Galetes | Pràctica 4 - Galetes]] i [[Recull de pràctiques de 2n d'ASIX. Curs 2025-2026#Pr.C3.A0ctica_5_-_Sessions | Pràctica 5 - Sessions]] a aquells alumnes que encara no ho han presentat oralment al professor.&lt;br /&gt;
&lt;br /&gt;
== 20251216 ==&lt;br /&gt;
* [https://sm9b.binefa.cat/sessions/sessions_teoria.pdf Teoria de Sessions en PHP]&lt;br /&gt;
* [https://sm9b.binefa.cat/sessions/Sessions-en-PHP.pdf Presentació '''Sessions en PHP'''] feta amb [https://gamma.app/ Gamma.app] a partir de [https://sm9b.binefa.cat/sessions/sessions_presentacio.pdf sessions_presentacio.pdf].&lt;br /&gt;
* [https://sm9b.binefa.cat/sessions/sessions_resum.pdf Resum Sessions - Guia Ràpida]&lt;br /&gt;
* [https://sm9b.binefa.cat/sessions/ Pàgina web d'exemple de sessions]&lt;br /&gt;
* [[Recull de pràctiques de 2n d'ASIX. Curs 2025-2026#Pr.C3.A0ctica_5_-_Sessions | Pràctica 5 - Sessions]]&lt;br /&gt;
&lt;br /&gt;
== 20251209 ==&lt;br /&gt;
* El control d'escapament amb la funció '''htmlspecialchars''':&lt;br /&gt;
El control d'escapament amb la funció [https://www.php.net/manual/en/function.htmlspecialchars.php '''htmlspecialchars'''] a PHP és fonamental per la seguretat de les aplicacions web, principalment per prevenir atacs de tipus [https://ca.eitca.org/seguretat-cibern%C3%A8tica/eitc-is-wasf-fonaments-de-seguretat-d%27aplicacions-web/script-de-llocs-creuats/cross-site-scripting-xss/revisi%C3%B3-d%27examen-cross-site-scripting-xss/qu%C3%A8-%C3%A9s-cross-site-scripting-xss-i-com-representa-una-amena%C3%A7a-per-a-les-aplicacions-web/ Cross-Site Scripting (XSS)].&lt;br /&gt;
&lt;br /&gt;
Aquesta funció agafa certs caràcters especials que tenen un significat a HTML i els converteix en les seves entitats HTML corresponents, evitant que el navegador els interpreti com a codi.&lt;br /&gt;
&lt;br /&gt;
🛡️ Prevenció d'Atacs XSS&lt;br /&gt;
La raó principal de la seva importància és que '''htmlspecialchars''' neutralitza la capacitat d'un atacant d'injectar codi maliciós (com ara JavaScript) a la teva pàgina web a través de dades d'usuari (formularis, paràmetres URL, etc.).&lt;br /&gt;
&lt;br /&gt;
- Com funciona?&lt;br /&gt;
Quan un usuari maliciós introdueix codi com: &amp;lt;script&amp;gt;alert('XSS Attack!');&amp;lt;/script&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Si es mostra directament a la pàgina amb echo $input;, el navegador l'interpretarà com a codi JavaScript i l'executarà.&lt;br /&gt;
&lt;br /&gt;
No obstant això, si es processa amb '''htmlspecialchars($input)''' abans de mostrar-se, PHP converteix els caràcters perillosos:&lt;br /&gt;
&lt;br /&gt;
&amp;lt; es converteix en &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;&amp;amp;amp;lt;&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;gt; es converteix en &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;&amp;amp;amp;gt;&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;quot; es converteix en &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;&amp;amp;amp;quot;&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt; (depenent de les flags utilitzades)&lt;br /&gt;
&lt;br /&gt;
' es converteix en &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;&amp;amp;amp;#039;&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt; (depenent de les flags utilitzades, utilitzant ENT_QUOTES)&lt;br /&gt;
&lt;br /&gt;
&amp;amp; es converteix en &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;&amp;amp;amp;amp;&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--El resultat que es mostra a la pàgina és: '''&amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;&amp;amp;lt;script&amp;amp;gt;alert(&amp;amp;#039;XSS Attack!&amp;amp;#039;);&amp;amp;lt;/script&amp;amp;gt;&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;'''&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
El resultat que es mostra a la pàgina és: '''&amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;&amp;amp;amp;lt;script&amp;amp;amp;gt;alert(&amp;amp;amp;#039;XSS Attack!&amp;amp;amp;#039;);&amp;amp;amp;lt;/script&amp;amp;amp;gt;&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;'''&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;amp;lt;script&amp;amp;gt;alert(&amp;amp;#039;XSS Attack!&amp;amp;#039;);&amp;amp;lt;/script&amp;amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
    &amp;amp;amp;lt;script&amp;amp;amp;gt;alert(&amp;amp;amp;#039;XSS Attack!&amp;amp;amp;#039;);&amp;amp;amp;lt;/script&amp;amp;amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
El navegador veurà això com a text pla (&amp;lt;script&amp;gt;alert('XSS Attack!');&amp;lt;/script&amp;gt;) i no com a codi executable.&lt;br /&gt;
* [https://sm9b.binefa.cat/xss/vulnerable/ Exemple de vulnerabilitat XSS] Text de prova: &amp;lt;script&amp;gt;alert('XSS Attack!');&amp;lt;/script&amp;gt;&lt;br /&gt;
* [https://sm9b.binefa.cat/xss/segur/ Exemple de protecció a atacs XSS]&lt;br /&gt;
* [https://sm9b.binefa.cat/galetes/galetes_teoria.pdf Teoria de galetes (''cookies'')]&lt;br /&gt;
* [https://sm9b.binefa.cat/galetes/Galetes-Cookies-en-PHP.pdf Presentació '''Galetes (Cookies) en PHP'''] feta amb [https://gamma.app/ Gamma.app] a partir de [https://sm9b.binefa.cat/galetes/galetes_presentacio.pdf galetes_presentacio.pdf].&lt;br /&gt;
* [https://sm9b.binefa.cat/galetes/galetes_resum.pdf Resum Galetes (Cookies) - Guia Ràpida]&lt;br /&gt;
* [https://sm9b.binefa.cat/galetes/ Pàgina web d'exemple de galetes]&lt;br /&gt;
* [[Recull de pràctiques de 2n d'ASIX. Curs 2025-2026#Pr.C3.A0ctica_4_-_Galetes | Pràctica 4 - Galetes]]&lt;br /&gt;
&lt;br /&gt;
== 20251125 ==&lt;br /&gt;
* Seguim fent els exercicis pendents del [[Recull de pràctiques de 2n d'ASIX. Curs 2025-2026 | recull de pràctiques]].&lt;br /&gt;
&lt;br /&gt;
== 20251111 ==&lt;br /&gt;
* Seguim fent els exercicis pendents del [[Recull de pràctiques de 2n d'ASIX. Curs 2025-2026 | recull de pràctiques]].&lt;br /&gt;
&lt;br /&gt;
== 20251104 ==&lt;br /&gt;
* Seguim fent els exercicis pendents del [[Recull de pràctiques de 2n d'ASIX. Curs 2025-2026 | recull de pràctiques]].&lt;br /&gt;
* [[Enunciat del projecte de connexió PDO entre PHP i MariaDB. Curs 2025-2026]]&lt;br /&gt;
* Afegit a l'exemple de selecció de base de dades:  [[Explicació dels mètodes fets servir a php_mysql_select]]&lt;br /&gt;
* Per a evitar haver de ser root (ús de sudo) pera accedir a la BD com a usuari root (també explicat a la pràctica 1 del [[Recull de pràctiques de 2n d'ASIX. Curs 2025-2026 | recull de pràctiques]]):&lt;br /&gt;
 ALTER USER 'root'@'localhost' IDENTIFIED BY 'una_contrasenya_forta_pel_root' PASSWORD EXPIRE NEVER;&lt;br /&gt;
 FLUSH PRIVILEGES;&lt;br /&gt;
 EXIT;&lt;br /&gt;
&lt;br /&gt;
== 20251028 ==&lt;br /&gt;
Seguim fent els exercicis recollits al [[Recull de pràctiques de 2n d'ASIX. Curs 2025-2026 | recull de pràctiques]].&lt;br /&gt;
&lt;br /&gt;
== 20251021 ==&lt;br /&gt;
Exercicis recollits a [[Recull de pràctiques de 2n d'ASIX. Curs 2025-2026]]:&lt;br /&gt;
&lt;br /&gt;
* Instal·leu a la màquina virtual ''zip'', ''libzip-dev'' i ''libpng-dev'':&lt;br /&gt;
 sudo apt update&lt;br /&gt;
 sudo apt install zip libzip-dev libpng-dev&lt;br /&gt;
* Si no teniu instal·lats les extensions PDO de PHP per a MariaDB: ''mysqli'', ''pdo'', ''pdo_mysql'', ''gd'' i ''zip''. Entre d'altres:&lt;br /&gt;
 sudo apt install php libapache2-mod-php php-mysql&lt;br /&gt;
[https://www.digitalocean.com/community/tutorials/how-to-install-linux-apache-mariadb-php-lamp-stack-on-debian-11 Aquí podeu trobar més ajuda]&lt;br /&gt;
&lt;br /&gt;
Documenteu els següents exemples:&lt;br /&gt;
&lt;br /&gt;
* Feu una primera connexió des de PHP a la vostra base de dades. Heu de fer una verificació [https://sm9b.binefa.cat/bd/00_connect.php d'aquest estil] ([http://localhost/php/bd/00_connect.php localhost])&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;?php&lt;br /&gt;
 // Example (PDO) at https://www.w3schools.com/php/php_mysql_connect.asp&lt;br /&gt;
 &amp;lt;!-- // $servername = &amp;quot;172.18.0.12&amp;quot;; // docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' sm9b_binefa_cat_db_docker --&amp;gt;&lt;br /&gt;
 $servername = &amp;quot;127.0.0.1&amp;quot;;&lt;br /&gt;
 $username = &amp;quot;root&amp;quot;;&lt;br /&gt;
 $password = &amp;quot;fjeclot&amp;quot;;&lt;br /&gt;
 &lt;br /&gt;
 try {&lt;br /&gt;
  $conn = new PDO(&amp;quot;mysql:host=$servername;dbname=lamp_db&amp;quot;, $username, $password);&lt;br /&gt;
  // set the PDO error mode to exception&lt;br /&gt;
  $conn-&amp;gt;setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);&lt;br /&gt;
  echo &amp;quot;Connectat a la base de dades.&amp;quot;;&lt;br /&gt;
 } catch(PDOException $e) {&lt;br /&gt;
  echo &amp;quot;No es pot connectar. Motiu: &amp;quot; . $e-&amp;gt;getMessage();&lt;br /&gt;
 }&lt;br /&gt;
 ?&amp;gt;&lt;br /&gt;
* Feu un exemple de [https://www.w3schools.com/php/php_mysql_create.asp creació de base de dades] (PDO)&lt;br /&gt;
&lt;br /&gt;
* Feu un exemple de [https://www.w3schools.com/php/php_mysql_create_table.asp creació d'una taula] (PDO)&lt;br /&gt;
&lt;br /&gt;
* Feu un exemple [https://www.w3schools.com/php/php_mysql_insert.asp d'inserció de dades] (PDO)&lt;br /&gt;
&lt;br /&gt;
* Feu un exemple [https://www.w3schools.com/php/php_mysql_insert_lastid.asp d'obtenció del darrer ID] (PDO)&lt;br /&gt;
&lt;br /&gt;
* Feu un exemple [https://www.w3schools.com/php/php_mysql_insert_multiple.asp d'inserció múltiple] (PDO)&lt;br /&gt;
&lt;br /&gt;
* Feu un exemple de [https://www.w3schools.com/php/php_mysql_prepared_statements.asp declaracions preparades i paràmetres enllaçats] (PDO)&lt;br /&gt;
&lt;br /&gt;
* Feu un exemple de [https://www.w3schools.com/php/php_mysql_select.asp selecció de dades] (PDO) [[Explicació dels mètodes fets servir a php_mysql_select]]&lt;br /&gt;
&lt;br /&gt;
 function current()''': string''' { // Afegiu : ''string'' per indicar el tipus de dades a retornar. Així eviteu missatge ''Deprecated''&lt;br /&gt;
 ...&lt;br /&gt;
 function beginChildren()''': void''' { // Afegiu : ''void'' per indicar el tipus de dades a retornar. Així eviteu missatge ''Deprecated''&lt;br /&gt;
 ...&lt;br /&gt;
 function endChildren()''': void''' { // Afegiu : ''void'' per indicar el tipus de dades a retornar. Així eviteu missatge ''Deprecated''&lt;br /&gt;
&lt;br /&gt;
* Feu un exemple de l'[https://www.w3schools.com/php/php_mysql_select_where.asp ordre WHERE] (PDO)&lt;br /&gt;
&lt;br /&gt;
* Feu un exemple de l'[https://www.w3schools.com/php/php_mysql_select_orderby.asp ordre ORDER BY] (PDO)&lt;br /&gt;
&lt;br /&gt;
* Feu un exemple d'[https://www.w3schools.com/php/php_mysql_delete.asp esborrament de dades] (PDO)&lt;br /&gt;
&lt;br /&gt;
* Feu un exemple d'[https://www.w3schools.com/php/php_mysql_update.asp actualització de dades] (PDO)&lt;br /&gt;
&lt;br /&gt;
* Feu un exemple de [https://www.w3schools.com/php/php_mysql_select_limit.asp limitació de dades] (PDO) Aprofiteu el codi de selecció de dades per a limitar quantes línies de la taula s'han de veure i a partir de quina es comença.&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
[[Instal·lació MariaDB. Curs 2024-2025]]&lt;br /&gt;
&lt;br /&gt;
[[Temari oficial d'implantació d'aplicacions web a ASIX. Curs 2025-2026]]&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 20251014 ==&lt;br /&gt;
* Seguim fent el [[Recull de pràctiques de 2n d'ASIX. Curs 2025-2026 | recull de pràctiques]]&lt;br /&gt;
== 20251007 ==&lt;br /&gt;
* [https://ioc.xtec.cat/materials/FP/Recursos/fp_asx_m09_/web/fp_asx_m09_htmlindex/WebContent/u1/a4/continguts.html Condicionals i bucles]&lt;br /&gt;
* [https://recull.binefa.cat/files/exemplesPHP/ Exemples de codis PHP]&lt;br /&gt;
* Seguim fent el [[Recull de pràctiques de 2n d'ASIX. Curs 2025-2026 | recull de pràctiques]]&lt;br /&gt;
&lt;br /&gt;
== 20250930 ==&lt;br /&gt;
Seguim fent el [[Recull de pràctiques de 2n d'ASIX. Curs 2025-2026 | recull de pràctiques]]&lt;br /&gt;
&lt;br /&gt;
== 20250923 ==&lt;br /&gt;
* Revisió de la instal·lació de l'entorn LAMP ([[Instal·lació d'un entorn LAMP. Curs 2025-2026]]) d'aquells alumnes que ja l'han acabada. El document en pdf demostrant el funcionament de la vostra instal·lació a una màquina virtual emprant Debian 13 ha d'estar a la [[Carpetes compartides del SM7 de 2n d'ASIX. Curs 2025-2026 | carpeta compartida]]. La data de lliurament és el '''30 de setembre de 2025'''&lt;br /&gt;
&lt;br /&gt;
* Variables en PHP:&lt;br /&gt;
&lt;br /&gt;
[https://sm9.binefa.cat/20241001/ Primer contacte amb les variables en PHP]&lt;br /&gt;
&lt;br /&gt;
[https://sm9.binefa.cat/523.php 5.2.3 Variables]&lt;br /&gt;
&lt;br /&gt;
* Ús del mètode GET i dos arxius (html i php):&lt;br /&gt;
 &lt;br /&gt;
[https://sm9.binefa.cat/527/ 5.2.7. (GET) Ús de PHP per a aplicacions web]&lt;br /&gt;
&lt;br /&gt;
* Ús del mètode POST i dos arxius (html i php):&lt;br /&gt;
&lt;br /&gt;
[https://sm9.binefa.cat/527_post/ 5.2.7. (POST) Ús de PHP per a aplicacions web]&lt;br /&gt;
&lt;br /&gt;
* [https://www.w3schools.com/PHP/php_superglobals.asp Variables superglobals]:&lt;br /&gt;
&lt;br /&gt;
[https://sm9.binefa.cat/527/server_var.php Variable superglobal $_SERVER]&lt;br /&gt;
&lt;br /&gt;
[https://sm9.binefa.cat/527_request_get/ REQUEST fent servir GET a un sol arxiu]&lt;br /&gt;
&lt;br /&gt;
[https://sm9.binefa.cat/527_request_post/ REQUEST fent servir POST a un sol arxiu]&lt;br /&gt;
&lt;br /&gt;
* [https://www.phptutorial.net/php-tutorial/php-select-option/ PHP Select Option] (Codis [https://sm9.binefa.cat/select/select0/ select0] i [https://sm9.binefa.cat/select/select1/ select1] al [https://recull.binefa.cat/files/20250923/ recull d'avui])&lt;br /&gt;
&lt;br /&gt;
* [[Recull de pràctiques de 2n d'ASIX. Curs 2025-2026]]&lt;br /&gt;
&lt;br /&gt;
== 20250916 ==&lt;br /&gt;
[[Temari oficial d'implantació d'aplicacions web a ASIX. Curs 2025-2026]]&lt;br /&gt;
&lt;br /&gt;
[[Normes i avaluació. Curs 2025-2026]]&lt;br /&gt;
&lt;br /&gt;
[[Instal·lació d'un entorn LAMP. Curs 2025-2026]]&lt;br /&gt;
&lt;br /&gt;
[[Instal·lació MariaDB. Curs 2025-2026]]&lt;br /&gt;
&lt;br /&gt;
= Documentació extra =&lt;br /&gt;
[https://www.w3schools.com/php/default.asp Tutorial de PHP]&lt;br /&gt;
&lt;br /&gt;
[https://wiki.lordwektabyte.cat/wiki/ASIX/M09/UF1 Wiki lordwektabyte]&lt;br /&gt;
&lt;br /&gt;
[https://www.collados.org/daw2/index_daw2_sm7.php Introducció al PHP amb exemples]&lt;br /&gt;
&lt;br /&gt;
[https://ioc.xtec.cat/materials/FP/Recursos/fp_asx_m09_/web/fp_asx_m09_htmlindex/WebContent/u1/introduccio.html Implantació d'Aplicacions Web a l'IOC]&lt;br /&gt;
&lt;br /&gt;
[https://youtu.be/C44iCr6czAo?si=PL0PSKlIJZWw2VUn Windows 11]&lt;br /&gt;
&lt;br /&gt;
[https://portal.azure.com azure]&lt;br /&gt;
== VPS ==&lt;br /&gt;
* [https://www.ovhcloud.com/es-es/vps/ VPS a OVH]&lt;br /&gt;
* [https://www.nominalia.com/dominios/?lang=ca Dominis a Nominalia]&lt;br /&gt;
* [https://www.things.cat/index.php/Servidor_intermediari_invers Servidor intermediari invers amb nginx]&lt;br /&gt;
* [https://broker.binefa.cat/wordpressTraefik_00.html Servidor intermediari invers amb Traefik]&lt;br /&gt;
* [https://www.things.cat/index.php/File_Browser File Browser]&lt;br /&gt;
* [https://www.things.cat/index.php/Redireccions_a_subdomini Redireccions a subdomini]&lt;/div&gt;</summary>
		<author><name>Jordi Binefa</name></author>
		
	</entry>
	<entry>
		<id>https://www.binefa.com/index.php?title=2n_SMX-A_per_dies._Curs_2025-2026&amp;diff=12294</id>
		<title>2n SMX-A per dies. Curs 2025-2026</title>
		<link rel="alternate" type="text/html" href="https://www.binefa.com/index.php?title=2n_SMX-A_per_dies._Curs_2025-2026&amp;diff=12294"/>
		<updated>2026-05-12T14:13:21Z</updated>

		<summary type="html">&lt;p&gt;Jordi Binefa: /* 20260505 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Quan tingueu les credencials d'accés a la [https://clot.fje.edu/ca NET] heu de compartir-nos (als '''dos''' professors) una carpeta amb aquest nom: '''2526-SMX2A-1rCognom2nCognomNom''' (Per exemple, si el vostre nom és Xavier López Pujol --&amp;gt; ''2526-SMX2A-LopezPujolXavier''). A aquest enllaç podreu veure si ja hi sou a la llista:&lt;br /&gt;
&lt;br /&gt;
[[Carpetes compartides 2n d'SMX-A. Curs 2025-2026]]&lt;br /&gt;
= Enllaços ràpids =&lt;br /&gt;
[https://meet.google.com/tbb-qgtn-kxb Teleconferència provisional]&lt;br /&gt;
&lt;br /&gt;
[https://snap.berkeley.edu/snap/snap.html Snap!]&lt;br /&gt;
&lt;br /&gt;
[https://moodle.binefa.cat/ Accés al Moodle de l'espai d'habilitats]&lt;br /&gt;
&lt;br /&gt;
[https://docs.google.com/spreadsheets/d/1PjpZhgqLMilMMzvnTGUtzbPYy6O3vPGKW74V_JUH8NE/edit?gid=1396246821#gid=1396246821 Llista 2n SMX-A] &amp;lt;!--&lt;br /&gt;
[https://fje.sharepoint.com/:x:/r/sites/GD_CLOT-FP-CLOT_FP-DptInformatica/Documentos%20compartidos/CLOT_FP-DptInformatica/2526/LLISTES%20ASSIST%C3%88NCIA/Llista%20SMX2A%202526.xlsx?d=w00118896baa440b8863a1e5525e54b64&amp;amp;csf=1&amp;amp;web=1&amp;amp;e=7XnnMG Llista 2n SMX-A] --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 20260512 ==&lt;br /&gt;
* Seguim fent el projecte de TKinter&lt;br /&gt;
== 20260505 ==&lt;br /&gt;
* Seguim fent el projecte de TKinter&lt;br /&gt;
&lt;br /&gt;
== 20260428 ==&lt;br /&gt;
* Fem el projecte de TKinter&lt;br /&gt;
* [https://aistudio.google.com/api-keys clau API]&lt;br /&gt;
&lt;br /&gt;
== 20260421 ==&lt;br /&gt;
* Seguim amb TKinter&lt;br /&gt;
&lt;br /&gt;
== 20260414 ==&lt;br /&gt;
* Seguim amb TKinter&lt;br /&gt;
&lt;br /&gt;
== 20260407 - TKinter ==&lt;br /&gt;
* [https://recull.binefa.cat/files/20260407/ Documentació de TKinter]&lt;br /&gt;
&lt;br /&gt;
== 20260324 ==&lt;br /&gt;
* Lliurar el [https://moodle.binefa.cat/pluginfile.php/1993/mod_resource/content/3/Proyecto_1.pdf projecte del 2n trimestre] amb un menú en Python ([https://recull.binefa.cat/files/20260317_menu/ Exemple de menú]) (Usuari / Contrasenya: smxA / smxA2526 )&lt;br /&gt;
&lt;br /&gt;
== 20260317 ==&lt;br /&gt;
* Seguim fent Python&lt;br /&gt;
* Exercici d'un menú en Python ([https://recull.binefa.cat/files/20260317_menu/ Exemple de menú]) (Usuari / Contrasenya: smxA / smxA2526 )&lt;br /&gt;
&lt;br /&gt;
== 20260310 ==&lt;br /&gt;
* Seguim fent Python&lt;br /&gt;
&lt;br /&gt;
== 20260224 ==&lt;br /&gt;
* Metacognició de síntesi tipus test.&lt;br /&gt;
&lt;br /&gt;
== 20260217 ==&lt;br /&gt;
* Acabeu els 8 exercicis de la pràctica 1 de Python que és al Moodle.&lt;br /&gt;
&lt;br /&gt;
== 20260210 ==&lt;br /&gt;
* Feu i documenteu els exercicis 1, 2 i 3 presents al Moodle. Els heu de lliurar abans d'acabar la classe.&lt;br /&gt;
&lt;br /&gt;
== 20260203 ==&lt;br /&gt;
* Seguim aprenent Python&lt;br /&gt;
* [https://pyscript.com/ pyscript.com]&lt;br /&gt;
&lt;br /&gt;
== 20260127 ==&lt;br /&gt;
* Seguim aprenent Python&lt;br /&gt;
&lt;br /&gt;
== 20260113 ==&lt;br /&gt;
* Presentació del projecte de Nadal&lt;br /&gt;
=== Primer contacte amb Python ===&lt;br /&gt;
* [https://www.python.org/downloads/ Instal·lació de ''Python'' amb ''pip'']&lt;br /&gt;
* [[Pràctiques d'introducció a Python - SMX | Pràctiques d'introducció a Python]]&lt;br /&gt;
* [[Exercicis d'introducció a Python]]&lt;br /&gt;
&lt;br /&gt;
== 20251125 ==&lt;br /&gt;
* Seguim treballant en el projecte Snap! de Nadal.&lt;br /&gt;
&lt;br /&gt;
== 20251118 ==&lt;br /&gt;
* Examen Snap!&lt;br /&gt;
== 20251111 ==&lt;br /&gt;
* Blocs amb Snap!&lt;br /&gt;
&lt;br /&gt;
== 20251104 ==&lt;br /&gt;
* Seguim amb Snap! Fem la pràctica 5 del Moodle&lt;br /&gt;
&lt;br /&gt;
== 20251028 ==&lt;br /&gt;
Seguim amb Snap!&lt;br /&gt;
&lt;br /&gt;
== 20251021 ==&lt;br /&gt;
Seguim amb Snap!&lt;br /&gt;
&lt;br /&gt;
Fem [https://moodle.binefa.cat/pluginfile.php/780/mod_resource/content/6/practica%204.pdf pràctica 4 del Moodle] ([https://snap.berkeley.edu/snap/snap.html#present:Username=jordibinefa&amp;amp;ProjectName=taur%C3%B3Ping%C3%BC%C3%AD_00 Un exemple no finalitzat])&lt;br /&gt;
&lt;br /&gt;
== 20251014 ==&lt;br /&gt;
Seguim amb Snap!&lt;br /&gt;
&lt;br /&gt;
* [https://recull.binefa.cat/files/20251014/ 5 camells de colors en format svg]&lt;br /&gt;
* [https://snap.berkeley.edu/snap/snap.html#present:Username=jordibinefa&amp;amp;ProjectName=carreraCamells Exemple de cursa de camells]&lt;br /&gt;
&lt;br /&gt;
== 20251007 ==&lt;br /&gt;
Seguim amb Snap!&lt;br /&gt;
&lt;br /&gt;
== 20250930 ==&lt;br /&gt;
Seguim amb Snap!&lt;br /&gt;
&lt;br /&gt;
== 20250923 ==&lt;br /&gt;
Seguim amb Snap!&lt;br /&gt;
&lt;br /&gt;
== 20250916 ==&lt;br /&gt;
[https://recull.binefa.cat/ Recull d'informació] (usuari: ''smxA'', contrasenya: ''smxA2526'')&lt;br /&gt;
&lt;br /&gt;
[https://snap.berkeley.edu/snap/snap.html Snap!]&lt;br /&gt;
&lt;br /&gt;
[https://gamifi.cat/docs/cs/snapguia.pdf Guia d'Snap!]&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
[https://docs.google.com/spreadsheets/d/16UHsIGuWNz3jo7g-LzVnMKPfv6thKUpyEowaZCUMyng/edit#gid=1118263977 Llista de 2n d'SMX-A]&lt;br /&gt;
== 20230511 ==&lt;br /&gt;
Seguim amb Python.&lt;br /&gt;
&lt;br /&gt;
[[Pràctiques d'introducció a Python . Part 3 - SMX | Estructures repetitives, o bucles, en Python]]&lt;br /&gt;
&lt;br /&gt;
[[Exercicis d'estructures de control repetitives en Python]]&lt;br /&gt;
== 20230504 ==&lt;br /&gt;
Seguim amb Python.&lt;br /&gt;
&lt;br /&gt;
[[Pràctiques d'introducció a Python . Part 3 - SMX | Estructures repetitives, o bucles, en Python]]&lt;br /&gt;
&lt;br /&gt;
[[Exercicis d'estructures de control repetitives en Python]]&lt;br /&gt;
&lt;br /&gt;
== 20230427 ==&lt;br /&gt;
Seguim amb Python.&lt;br /&gt;
&lt;br /&gt;
[[Pràctiques d'introducció a Python . Part 3 - SMX | Estructures repetitives, o bucles, en Python]]&lt;br /&gt;
&lt;br /&gt;
[[Exercicis d'estructures de control repetitives en Python]]&lt;br /&gt;
== 20230420 ==&lt;br /&gt;
Seguim amb Python.&lt;br /&gt;
&lt;br /&gt;
[[Pràctiques d'introducció a Python . Part 3 - SMX | Estructures repetitives, o bucles, en Python]]&lt;br /&gt;
&lt;br /&gt;
[[Exercicis d'estructures de control repetitives en Python]]&lt;br /&gt;
&lt;br /&gt;
== 20230413 ==&lt;br /&gt;
Seguim amb Python.&lt;br /&gt;
&lt;br /&gt;
[[Pràctiques d'introducció a Python . Part 3 - SMX | Estructures repetitives, o bucles, en Python]]&lt;br /&gt;
&lt;br /&gt;
[[Exercicis d'estructures de control repetitives en Python]]&lt;br /&gt;
=== Exercici del cinema ===&lt;br /&gt;
Primer ho farem amb [https://snap.berkeley.edu/snap/snap.html Snap!]. Després amb [https://app.edublocks.org/ EduBlocks]. Després amb [https://www.onlinegdb.com/ OnlineGDM] i finalment amb el [https://code.visualstudio.com/ VSCode].&lt;br /&gt;
&lt;br /&gt;
A partir de la qualificació d’una pel·lícula i l’edat de l'espectador, indiqueu si aquest pot o no passar.&lt;br /&gt;
&lt;br /&gt;
Qualificacions de les pel·lícules:&lt;br /&gt;
&lt;br /&gt;
'''T'''   –   Tots els públics.&lt;br /&gt;
&lt;br /&gt;
'''M'''  –   Majors de 13 anys.&lt;br /&gt;
&lt;br /&gt;
'''J'''   –   Majors de 16 anys.&lt;br /&gt;
&lt;br /&gt;
'''A'''   –   Majors de 18 anys.&lt;br /&gt;
&lt;br /&gt;
El programa demanarà la lletra que determina la qualificació de la pel·lícula i l’edat de l'espectador per, a continuació, mostrar per pantalla si aquest pot passar a la sala o no.&lt;br /&gt;
&lt;br /&gt;
El programa ha de controlar que la qualificació de la pel·lícula sigui T, M, J o A. Qualsevol altra entrada no serà vàlida.&lt;br /&gt;
&lt;br /&gt;
== 20230330 ==&lt;br /&gt;
Seguim amb Python.&lt;br /&gt;
&lt;br /&gt;
[[Pràctiques d'introducció a Python . Part 3 - SMX | Estructures repetitives, o bucles, en Python]]&lt;br /&gt;
&lt;br /&gt;
[[Exercicis d'estructures de control repetitives en Python]]&lt;br /&gt;
&lt;br /&gt;
== 20230323 ==&lt;br /&gt;
Seguim amb Python.&lt;br /&gt;
&lt;br /&gt;
[[Pràctiques d'introducció a Python . Part 3 - SMX | Estructures repetitives, o bucles, en Python]]&lt;br /&gt;
&lt;br /&gt;
[[Exercicis d'estructures de control repetitives en Python]]&lt;br /&gt;
&lt;br /&gt;
== 20230316 ==&lt;br /&gt;
Seguim amb Python.&lt;br /&gt;
&lt;br /&gt;
[[Pràctiques d'introducció a Python . Part 3 - SMX | Estructures repetitives, o bucles, en Python]]&lt;br /&gt;
&lt;br /&gt;
[[Exercicis d'estructures de control repetitives en Python]]&lt;br /&gt;
&lt;br /&gt;
== 20230302 ==&lt;br /&gt;
Seguim amb Python.&lt;br /&gt;
&lt;br /&gt;
[[Pràctiques d'introducció a Python . Part 2 - SMX | Condicionals en Python]]&lt;br /&gt;
&lt;br /&gt;
[[Exercicis de condicions en Python]]&lt;br /&gt;
&lt;br /&gt;
[[Pràctiques d'introducció a Python . Part 3 - SMX | Estructures repetitives, o bucles, en Python]]&lt;br /&gt;
&lt;br /&gt;
[[Exercicis d'estructures de control repetitives en Python]]&lt;br /&gt;
&lt;br /&gt;
* Nova eina: [https://app.edublocks.org/ edublocks]&lt;br /&gt;
&lt;br /&gt;
== 20230223 ==&lt;br /&gt;
Seguim amb Python.&lt;br /&gt;
&lt;br /&gt;
[[Pràctiques d'introducció a Python . Part 2 - SMX | Condicionals en Python]]&lt;br /&gt;
&lt;br /&gt;
[[Exercicis de condicions en Python]]&lt;br /&gt;
&lt;br /&gt;
[[Pràctiques d'introducció a Python . Part 3 - SMX | Estructures repetitives, o bucles, en Python]]&lt;br /&gt;
&lt;br /&gt;
[[Exercicis d'estructures de control repetitives en Python]]&lt;br /&gt;
&lt;br /&gt;
== 20230216 ==&lt;br /&gt;
Seguim amb Python.&lt;br /&gt;
&lt;br /&gt;
[[Pràctiques d'introducció a Python . Part 2 - SMX | Condicionals en Python]]&lt;br /&gt;
&lt;br /&gt;
[[Exercicis de condicions en Python]]&lt;br /&gt;
&lt;br /&gt;
== 20230209 ==&lt;br /&gt;
Seguim amb Python.&lt;br /&gt;
&lt;br /&gt;
[[Pràctiques d'introducció a Python . Part 2 - SMX | Condicionals en Python]]&lt;br /&gt;
&lt;br /&gt;
[[Exercicis de condicions en Python]]&lt;br /&gt;
&lt;br /&gt;
== 20230202 ==&lt;br /&gt;
Seguim amb Python.&lt;br /&gt;
&lt;br /&gt;
[[Exercicis d'introducció a Python]]&lt;br /&gt;
&lt;br /&gt;
[[Pràctiques d'introducció a Python . Part 2 - SMX | Condicionals en Python]]&lt;br /&gt;
&lt;br /&gt;
[[Exercicis de condicions en Python]]&lt;br /&gt;
&lt;br /&gt;
== 20230126 ==&lt;br /&gt;
Seguim amb Python.&lt;br /&gt;
&lt;br /&gt;
[[Exercicis d'introducció a Python]]&lt;br /&gt;
&lt;br /&gt;
[[Pràctiques d'introducció a Python . Part 2 - SMX | Condicionals en Python]]&lt;br /&gt;
&lt;br /&gt;
[[Exercicis de condicions en Python]]&lt;br /&gt;
&lt;br /&gt;
== 20230119 ==&lt;br /&gt;
Seguim amb Python.&lt;br /&gt;
 / És divisió real&lt;br /&gt;
 // És divisió entera&lt;br /&gt;
 % És el residu de la divisió&lt;br /&gt;
[[Pràctiques d'introducció a Python . Part 2 - SMX | Condicionals amb Python]]&lt;br /&gt;
&lt;br /&gt;
[[Exercicis de condicions en Python]]&lt;br /&gt;
&lt;br /&gt;
== 20230112 ==&lt;br /&gt;
Presentació projectes de Nadal.&lt;br /&gt;
&lt;br /&gt;
Seguim  fent [[Exercicis d'introducció a Python]]&lt;br /&gt;
&lt;br /&gt;
 pes = float(input(&amp;quot;Pes en Kg: &amp;quot;)) # float: real (amb decimals)&lt;br /&gt;
 print(&amp;quot;Pes %f Kg&amp;quot;%pes)&lt;br /&gt;
 print(&amp;quot;Pes amb tres decimals: %.3f Kg&amp;quot;%pes)&lt;br /&gt;
 nom = input(&amp;quot;Nom: &amp;quot;) # string: cadena&lt;br /&gt;
 print(&amp;quot;En %s pesa %.2fKg&amp;quot;%(nom,pes))&lt;br /&gt;
 n = int(input(&amp;quot;Cops per a repetir: &amp;quot;)) # int: enter (sense decimals)&lt;br /&gt;
 print(&amp;quot;Repetit %d cops&amp;quot;%n)&lt;br /&gt;
 for i in range(n):&lt;br /&gt;
    print(&amp;quot;En %s pesa %.2fKg&amp;quot;%(nom,pes))&lt;br /&gt;
&lt;br /&gt;
== 20221212 ==&lt;br /&gt;
Seguim fent el projecte de Nadal&lt;br /&gt;
&lt;br /&gt;
== 20221124 ==&lt;br /&gt;
Seguim fent el projecte de Nadal&lt;br /&gt;
&lt;br /&gt;
== 20221117 ==&lt;br /&gt;
[https://recull.binefa.cat/ Recull de codis fets a classe] usuari / contrasenya : ''smxA'' / ''smxA2223''&lt;br /&gt;
&lt;br /&gt;
[[Exercicis d'introducció a Python]]&lt;br /&gt;
&lt;br /&gt;
[https://snap.berkeley.edu/snap/snap.html Snap! en línia]&lt;br /&gt;
&lt;br /&gt;
== 20221110 ==&lt;br /&gt;
[https://recull.binefa.cat/ Recull de codis fets a classe] usuari / contrasenya : ''smxA'' / ''smxA2223''&lt;br /&gt;
&lt;br /&gt;
[[Exercicis d'introducció a Python]]&lt;br /&gt;
&lt;br /&gt;
== 20221103 ==&lt;br /&gt;
[https://recull.binefa.cat/ Recull de codis fets a classe] usuari / contrasenya : ''smxA'' / ''smxA2223''&lt;br /&gt;
&lt;br /&gt;
[[Pràctiques d'introducció a Python - SMX | Pràctiques d'introducció a Python]]&lt;br /&gt;
&lt;br /&gt;
[[Exercicis d'introducció a Python]]&lt;br /&gt;
&lt;br /&gt;
[https://www.onlinegdb.com/ Eina remota d'interpretació de Python]&lt;br /&gt;
&lt;br /&gt;
 &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
 eip01.py&lt;br /&gt;
 &lt;br /&gt;
 Cognom1 Cognom2, Nom &lt;br /&gt;
 &lt;br /&gt;
 Escriviu un programa que pregunti a l'usuari pel nombre d'hores treballades i el cost per hora. &lt;br /&gt;
 Després ha de mostrar per pantalla la paga que li correspon.&lt;br /&gt;
 &lt;br /&gt;
 20221103&lt;br /&gt;
 &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
 fHores = float(input(&amp;quot;Nombre d'hores treballades: &amp;quot;))&lt;br /&gt;
 # print(&amp;quot;Heu dit que heu treballat %.2f hores&amp;quot;%fHores)&lt;br /&gt;
 fCostPerHora = float(input(&amp;quot;Cost per hora: &amp;quot;))&lt;br /&gt;
 # print(&amp;quot;Heu dit que heu treballat %.2f hores amb un preu per hora de %.2f€&amp;quot;%(fHores,fCostPerHora))&lt;br /&gt;
 print(&amp;quot;Heu de cobrar %.2f€&amp;quot;%(fHores*fCostPerHora))&lt;br /&gt;
&lt;br /&gt;
== 20221027 ==&lt;br /&gt;
[https://recull.binefa.cat/ Recull de codis fets a classe] usuari / contrasenya : ''smxA'' / ''smxA2223''&lt;br /&gt;
&lt;br /&gt;
[[Pràctiques d'introducció a Python - SMX | Pràctiques d'introducció a Python]]&lt;br /&gt;
&lt;br /&gt;
[[Exercicis d'introducció a Python]]&lt;br /&gt;
&lt;br /&gt;
[https://www.onlinegdb.com/ Eina remota d'interpretació de Python]&lt;br /&gt;
&lt;br /&gt;
== 20221020 ==&lt;br /&gt;
[https://recull.binefa.cat/ Recull de codis fets a classe] usuari / contrasenya : ''smxA'' / ''smxA2223''&lt;br /&gt;
&lt;br /&gt;
[[Pràctiques d'introducció a Python - SMX | Pràctiques d'introducció a Python]]&lt;br /&gt;
&lt;br /&gt;
[[Exercicis d'introducció a Python]]&lt;br /&gt;
&lt;br /&gt;
[https://www.onlinegdb.com/ Eina remota d'interpretació de Python]&lt;br /&gt;
&lt;br /&gt;
 &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
 pr03.py&lt;br /&gt;
 Víctor Martorell Millán&lt;br /&gt;
 20221017&lt;br /&gt;
 &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
 print ('Hola SMX2')&lt;br /&gt;
 ciutat = input(&amp;quot;La teva ciutat: &amp;quot;)&lt;br /&gt;
 print (&amp;quot;Has dit que la teva ciutat és &amp;quot; + ciutat)&lt;br /&gt;
 print (&amp;quot;Has dit que la teva ciutat és %s&amp;quot; % ciutat)&lt;br /&gt;
 nDistrictes = input(&amp;quot;Numero de districtes: &amp;quot;)&lt;br /&gt;
 print (&amp;quot;Has dit que la teva ciutat és &amp;quot; + ciutat + &amp;quot; i te &amp;quot;+ nDistrictes + &amp;quot; districtes&amp;quot;)&lt;br /&gt;
 print (&amp;quot;Has dit que la teva ciutat és %s i te %s districtes&amp;quot; %(ciutat,nDistrictes))&lt;br /&gt;
 nD = int(nDistrictes)&lt;br /&gt;
 print (&amp;quot;Has dit que la teva ciutat és %s i te %d districtes&amp;quot; % (ciutat,nD))&lt;br /&gt;
&lt;br /&gt;
== 20221013 ==&lt;br /&gt;
[https://recull.binefa.cat/ Recull de codis fets a classe] usuari / contrasenya : ''smxA'' / ''smxA2223''&lt;br /&gt;
&lt;br /&gt;
[[Pràctiques d'introducció a Python - SMX | Pràctiques d'introducció a Python]]&lt;br /&gt;
&lt;br /&gt;
== 20221006 ==&lt;br /&gt;
[https://meet.google.com/zfu-znep-uos Meet a la primera hora]&lt;br /&gt;
&lt;br /&gt;
[https://recull.binefa.cat/ Recull de codis fets a classe] usuari / contrasenya : ''smxA'' / ''smxA2223''&lt;br /&gt;
&lt;br /&gt;
[https://www.onlinegdb.com/ Eina remota d'interpretació de Python]&lt;br /&gt;
&lt;br /&gt;
=== Instal·lacions de Python i VSCode ===&lt;br /&gt;
[https://www.python.org/downloads/ Descàrrega del llenguatge de programació interpretat '''Python''']. Seleccioneu que voleu inserir la ruta de l'executable al PATH. I si al final de la instal·lació us demana inhabilitar (''disable'') rutes llargues, premeu-hi el botó.&lt;br /&gt;
&lt;br /&gt;
[https://code.visualstudio.com/download Entorn de programació i editor de codis '''VSCode''']&lt;br /&gt;
&lt;br /&gt;
=== Python ===&lt;br /&gt;
Un cop instal·lat obrim el terminal i verifiquem:&lt;br /&gt;
 python --version&lt;br /&gt;
 pip --version&lt;br /&gt;
&lt;br /&gt;
Codi de crida a la calculador a Windows:&lt;br /&gt;
 # segon.py&lt;br /&gt;
 import os&lt;br /&gt;
 &lt;br /&gt;
 print(&amp;quot;Calculadora: &amp;quot;)&lt;br /&gt;
 os.system(&amp;quot;calc&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
[[Pràctiques d'introducció a Python - SMX | Pràctiques d'introducció a Python]]&lt;br /&gt;
&lt;br /&gt;
== 20220922 ==&lt;br /&gt;
[https://recull.binefa.cat/ Recull de codis fets a classe] usuari / contrasenya : ''smxA'' / ''smxA2223''&lt;br /&gt;
&lt;br /&gt;
Codis a desenvolupar:&lt;br /&gt;
 c00: pregunta de nom amb ''resposta''&lt;br /&gt;
 c01: pregunta de nom amb variable ''nom''&lt;br /&gt;
 c02: pregunta de nom amb variable ''nom'' i pregunta l'edat amb variable ''edat''&lt;br /&gt;
 c03: aprofitant c02 diem si és major d'edat o no&lt;br /&gt;
 c04: comptador de 0 a 10&lt;br /&gt;
 c05: aprofitant c04, feu una taula de multiplicar&lt;br /&gt;
 c06: aprofitant c04, dieu si el número del comptador és parell o senar&lt;br /&gt;
&lt;br /&gt;
Deseu-los com a ''.sb'' i captureu-los com a ''.png'' o ''.jpg''&lt;br /&gt;
&lt;br /&gt;
== 20220915 ==&lt;br /&gt;
[https://recull.binefa.cat/ Recull de codis fets a classe] usuari / contrasenya : ''smxA'' / ''smxA2223''&lt;br /&gt;
&lt;br /&gt;
A la carpeta compartida / 20220915:&lt;br /&gt;
 df_p01.png (png o jpg)&lt;br /&gt;
 df_p01.drawio&lt;br /&gt;
 p01.png (png o jpg)&lt;br /&gt;
 p01(22-23).sb&lt;br /&gt;
&lt;br /&gt;
Programació per blocs i digrames de flux.&lt;br /&gt;
&lt;br /&gt;
[[Repàs d'ordres del sistema operatiu GNU/Linux - 1a setmana del curs 2021-2022 | Repàs d'ordres del sistema operatiu GNU/Linux - 1a setmana del curs 2022-2023]]&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Snap! =&lt;br /&gt;
[https://snap.berkeley.edu/snap/snap.html Snap! a snap.berkeley.edu]&lt;br /&gt;
&lt;br /&gt;
[https://snap.berkeley.edu/snap/help/SnapManual.pdf Manual de referència d'Snap!]&lt;br /&gt;
&lt;br /&gt;
= Python =&lt;br /&gt;
[[Pràctiques d'introducció a Python - SMX | Pràctiques d'introducció a Python]]&lt;br /&gt;
&lt;br /&gt;
== Condicionals en Python ==&lt;br /&gt;
[[Pràctiques d'introducció a Python . Part 2 - SMX | Condicionals amb Python]]&lt;br /&gt;
&lt;br /&gt;
[[Exercicis de condicions en Python]]&lt;br /&gt;
&lt;br /&gt;
== Estructures repetitives, o bucles, en Python ==&lt;br /&gt;
&lt;br /&gt;
[[Pràctiques d'introducció a Python . Part 3 - SMX | Estructures repetitives, o bucles, en Python]]&lt;br /&gt;
&lt;br /&gt;
[[Exercicis d'estructures de control repetitives en Python]]&lt;br /&gt;
&lt;br /&gt;
== Instal·lació del Jupyter Lab ==&lt;br /&gt;
[https://jupyter.org/try Prova de Jupyter via web externa]&lt;br /&gt;
&lt;br /&gt;
Instal·lació de Jupyter Lab a la màquina virtual GNU/Linux. Des del terminal:&lt;br /&gt;
 $ su -&lt;br /&gt;
 # apt update&lt;br /&gt;
 # apt install python3-pip&lt;br /&gt;
 # exit&lt;br /&gt;
 $ pip --version&lt;br /&gt;
 $ pip install jupyterlab&lt;br /&gt;
 $ pip install jupyter-c-kernel&lt;br /&gt;
&lt;br /&gt;
Sortiu de la sessió i torneu-hi a entrar. Seguiu amb aquestes ordres:&lt;br /&gt;
&lt;br /&gt;
 $ install_c_kernel --user&lt;br /&gt;
 $ jupyter kernelspec list&lt;br /&gt;
&lt;br /&gt;
Un cop instal·lat s'executa des del terminal:&lt;br /&gt;
 $ jupyter-lab&lt;br /&gt;
&lt;br /&gt;
I apareix el navegador web amb el Jupyter Lab.&lt;br /&gt;
&lt;br /&gt;
= Eines en línia =&lt;br /&gt;
[https://recull.binefa.cat/ Recull de codis fets a classe] usuari / contrasenya : ''smxA'' / ''smxA2526''&lt;br /&gt;
&lt;br /&gt;
[https://app.diagrams.net/ Disseny de diagrames de flux en línia]&lt;br /&gt;
&lt;br /&gt;
[https://scratch.mit.edu/scratch_1.4/ Scratch 1.4]&lt;br /&gt;
&lt;br /&gt;
[https://scratch.mit.edu/projects/editor/ Scratch en línia]&lt;br /&gt;
&lt;br /&gt;
[https://snap.berkeley.edu/ Snap!] o [https://www.binefa.cat/Snap Snap! personalitzat]&lt;br /&gt;
&lt;br /&gt;
[https://www.onlinegdb.com/ Compilador en línia]&lt;br /&gt;
&lt;br /&gt;
[http://www.arduinoblocks.com/ Arduino Blocks]&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
= Enllaços a recursos =&lt;br /&gt;
[[Pràctiques d'introducció a Python - SMX | Pràctiques d'introducció a Python]]&lt;br /&gt;
&lt;br /&gt;
[[Pràctiques d'introducció a Python . Part 2 - SMX | Condicionals amb Python]]&lt;br /&gt;
&lt;br /&gt;
[[Exercicis de condicions en Python]]&lt;br /&gt;
&lt;br /&gt;
[[Pràctiques d'introducció a Python . Part 3 - SMX | Estructures repetitives, o bucles, en Python]]&lt;br /&gt;
&lt;br /&gt;
[[Exercicis d'estructures de control repetitives en Python]]&lt;br /&gt;
&lt;br /&gt;
[[Més exercicis de Python bàsic]]&lt;br /&gt;
&lt;br /&gt;
[[Com fer anar la consola de videojocs iNNEXT a Scratch 1.4]]&lt;br /&gt;
&lt;br /&gt;
[[Com fer anar la consola de videojocs iNNEXT a Snap! 6.2]]&lt;br /&gt;
== Instal·lació del Jupyter Lab ==&lt;br /&gt;
[https://jupyter.org/try Prova de Jupyter via web externa]&lt;br /&gt;
&lt;br /&gt;
Instal·lació de Jupyter Lab a la màquina virtual GNU/Linux. Des del terminal:&lt;br /&gt;
 $ su -&lt;br /&gt;
 # apt update&lt;br /&gt;
 # apt install python3-pip&lt;br /&gt;
 # exit&lt;br /&gt;
 $ pip --version&lt;br /&gt;
 $ pip install jupyterlab&lt;br /&gt;
 $ pip install jupyter-c-kernel&lt;br /&gt;
&lt;br /&gt;
Sortiu de la sessió i torneu-hi a entrar. Seguiu amb aquestes ordres:&lt;br /&gt;
&lt;br /&gt;
 $ install_c_kernel --user&lt;br /&gt;
 $ jupyter kernelspec list&lt;br /&gt;
&lt;br /&gt;
Un cop instal·lat s'executa des del terminal:&lt;br /&gt;
 $ jupyter-lab&lt;br /&gt;
&lt;br /&gt;
I apareix el navegador web amb el Jupyter Lab.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Baixada de programes =&lt;br /&gt;
[https://drive.google.com/drive/folders/1fObr8kPcF7358h3bgKPe_BQT3tyQtiV8?usp=sharing Zona compartida al campus virtual d'FJE]&lt;/div&gt;</summary>
		<author><name>Jordi Binefa</name></author>
		
	</entry>
	<entry>
		<id>https://www.binefa.com/index.php?title=ASIX_2025-2026&amp;diff=12293</id>
		<title>ASIX 2025-2026</title>
		<link rel="alternate" type="text/html" href="https://www.binefa.com/index.php?title=ASIX_2025-2026&amp;diff=12293"/>
		<updated>2026-05-11T17:42:41Z</updated>

		<summary type="html">&lt;p&gt;Jordi Binefa: /* 20260508 (1h) */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Quan tingueu les credencials d'accés a la [https://clot.fje.edu/ca NET] heu de compartir-nos (als '''dos''' professors) una carpeta amb aquest nom: '''2526-ASIX-SM3-1rCognom2nCognomNom''' (Per exemple, si el teu nom és Xavier López Pujol --&amp;gt; ''2526-ASIX-SM3-LopezPujolXavier''). A aquest enllaç podreu veure si ja hi sou a la llista:&lt;br /&gt;
&lt;br /&gt;
[[Carpetes compartides del SM3 de 1r d'ASIX. Curs 2025-2026]]&lt;br /&gt;
&lt;br /&gt;
Estructura de les carpetes:&lt;br /&gt;
 EH1 ''(depenent del subgrup)''&lt;br /&gt;
 SM1 ''(depenent del subgrup)'' [https://www.collados.org/ collados.org]&lt;br /&gt;
 SM3&lt;br /&gt;
   examens&lt;br /&gt;
   exercicis&lt;br /&gt;
     C&lt;br /&gt;
     Python&lt;br /&gt;
     Encastats&lt;br /&gt;
   perDies&lt;br /&gt;
= Enllaços ràpids =&lt;br /&gt;
[https://meet.google.com/wwr-knez-ukp Compartició de pantalla]&lt;br /&gt;
&lt;br /&gt;
[https://docs.google.com/spreadsheets/d/1YZuh2vPnUnUA8A6Q4hY2DZ4CDq7RQM9KzoEB9ubtti0/edit?gid=2064628236#gid=2064628236 Llista de 1r d'ASIX]&amp;lt;!-- [https://fje.sharepoint.com/:x:/r/sites/GD_CLOT-FP-CLOT_FP-DptInformatica/Documentos%20compartidos/CLOT_FP-DptInformatica/2526/LLISTES%20ASSIST%C3%88NCIA/Llista%20ASIX1%202526.xlsx?d=w65d09601018e4e8c92c86544758999d6&amp;amp;csf=1&amp;amp;web=1&amp;amp;e=TdenDy Llista de 1r d'ASIX] --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[https://fje.sharepoint.com/sites/GD_CLOT-FP-CLOT_FP-DptInformatica/Documentos%20compartidos/Forms/AllItems.aspx?id=%2Fsites%2FGD%5FCLOT%2DFP%2DCLOT%5FFP%2DDptInformatica%2FDocumentos%20compartidos%2FCLOT%5FFP%2DDptInformatica%2F2526%2FLLISTES%20ASSIST%C3%88NCIA&amp;amp;viewid=0378dc70%2Dd30b%2D4dbf%2D9ffc%2D0a0ea8f8bf65&amp;amp;FolderCTID=0x0120003BC8367864239F40A596CE0A21832195 Totes les llistes]&lt;br /&gt;
== Proves de final de curs - EH1 ==&lt;br /&gt;
* Listening: 15/5/26 (15.00 - 15.55)&lt;br /&gt;
* Skills:    18/5/26 (15.00 - 16.50)&lt;br /&gt;
* Reading:   21/5/26 (15.55 - 16.50)&lt;br /&gt;
&lt;br /&gt;
= EH2: '''Programació de sistemes encastats''' =&lt;br /&gt;
* [[Introducció a Arduino]]&lt;br /&gt;
* [https://wokwi.com/projects/354037245005603841 Simulació dels 4 leds i 4 botons de la placa S4A]&lt;br /&gt;
* [https://wokwi.com/projects/355572920722910209 Simulació dels 4 leds i 4 botons de la placa S4A, permetent prémer més d'un botó alhora]&lt;br /&gt;
* [https://s4a.binefa.cat/ Simulador de la placa S4A en línia]. ([https://raw.githubusercontent.com/jordibinefa/arduino-IDE-codes/refs/heads/master/s4a_test_00/s4a_test_00.ino Codi de test])&lt;br /&gt;
* [[Detalls sobre la programació d'Arduino]]&lt;br /&gt;
* [[Pràctiques Arduino sobre placa S4A i Snap4Arduino - 1a part]]&lt;br /&gt;
* [[Pràctiques Arduino sobre placa S4A i Snap4Arduino - 2a part]]&lt;br /&gt;
* [[Pràctiques amb el robot versió 6]]&lt;br /&gt;
== 20260511 (2h) ==&lt;br /&gt;
* Seguim amb el robot ([[Pràctiques amb el robot versió 6]])&lt;br /&gt;
== 20260508 (1h) ==&lt;br /&gt;
* Seguim amb el robot ([[Pràctiques amb el robot versió 6]])&lt;br /&gt;
&lt;br /&gt;
== 20260504 (2h) ==&lt;br /&gt;
* Seguim amb el robot ([[Pràctiques amb el robot versió 6]])&lt;br /&gt;
&lt;br /&gt;
== 20260427 (2h) ==&lt;br /&gt;
* Seguim amb el robot ([[Pràctiques amb el robot versió 6]])&lt;br /&gt;
&lt;br /&gt;
== 20260424 (1h) ==&lt;br /&gt;
* Seguim amb el robot ([[Pràctiques amb el robot versió 6]])&lt;br /&gt;
&lt;br /&gt;
== 20260420 (2h) ==&lt;br /&gt;
* Seguim amb el robot ([[Pràctiques amb el robot versió 6]])&lt;br /&gt;
&lt;br /&gt;
== 20260417 (1h) ==&lt;br /&gt;
* Comencem amb el robot&lt;br /&gt;
&lt;br /&gt;
== 20260413 (2h) ==&lt;br /&gt;
* Seguim amb la introducció a Arduino&lt;br /&gt;
&lt;br /&gt;
== 20260410 (1h) ==&lt;br /&gt;
* Seguim amb la introducció a Arduino&lt;br /&gt;
&lt;br /&gt;
== 20260323 (2h) ==&lt;br /&gt;
* Seguim amb la introducció a Arduino&lt;br /&gt;
&lt;br /&gt;
== 20260316 (2h) ==&lt;br /&gt;
* Seguim amb la introducció a Arduino&lt;br /&gt;
&lt;br /&gt;
== 20260313 (1h) ==&lt;br /&gt;
* [[Introducció a Arduino]]&lt;br /&gt;
* [https://wokwi.com/projects/354037245005603841 Simulació dels 4 leds i 4 botons de la placa S4A]&lt;br /&gt;
* [https://wokwi.com/projects/355572920722910209 Simulació dels 4 leds i 4 botons de la placa S4A, permetent prémer més d'un botó alhora]&lt;br /&gt;
* [https://s4a.binefa.cat/ Simulador de la placa S4A en línia]. ([https://raw.githubusercontent.com/jordibinefa/arduino-IDE-codes/refs/heads/master/s4a_test_00/s4a_test_00.ino Codi de test])&lt;br /&gt;
* [https://www.binefa.cat/doc/Dropbox/Public/oshw20160621/20160621_00.pdf Introducció a la placa S4A PLB]&lt;br /&gt;
* [[Detalls sobre la programació d'Arduino]]&lt;br /&gt;
* [[Pràctiques Arduino sobre placa S4A i Snap4Arduino - 1a part]]&lt;br /&gt;
&lt;br /&gt;
= SM3: '''Fonaments de Programació''' =&lt;br /&gt;
== 20260309 (2h) ==&lt;br /&gt;
* Resolem l'examen d'ús de fitxers 20220524exM03Uf3.pdf de la col·lecció d'exàmens del recull.&lt;br /&gt;
== 20260302 (2h) ==&lt;br /&gt;
* Seguim amb [[Fonaments de gestió de fitxers, estructures i gestió dinàmica de memòria]]&lt;br /&gt;
* Resolem un examen d'un any anterior&lt;br /&gt;
== 20260227 (1h) ==&lt;br /&gt;
* Metacognició&lt;br /&gt;
== 20260223 (2h) ==&lt;br /&gt;
Seguim amb [[Fonaments de gestió de fitxers, estructures i gestió dinàmica de memòria]]&lt;br /&gt;
&lt;br /&gt;
== 20260220 (1h) ==&lt;br /&gt;
[[Fonaments de gestió de fitxers, estructures i gestió dinàmica de memòria]]&lt;br /&gt;
&lt;br /&gt;
 #include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
 #include &amp;lt;stdlib.h&amp;gt; // Necessari per a malloc i free&lt;br /&gt;
 &lt;br /&gt;
 int main() {&lt;br /&gt;
    int n, i;&lt;br /&gt;
    float *notes, suma = 0.0, mitjana;&lt;br /&gt;
    &lt;br /&gt;
    printf(&amp;quot;Introduïu la quantitat de notes: &amp;quot;);&lt;br /&gt;
    scanf(&amp;quot;%d&amp;quot;, &amp;amp;n);&lt;br /&gt;
    &lt;br /&gt;
    // Reserva de memòria dinàmicament emprant apuntadors&lt;br /&gt;
    notes = (float*)malloc(n * sizeof(float));&lt;br /&gt;
    &lt;br /&gt;
    if (notes == NULL) {&lt;br /&gt;
        printf(&amp;quot;Error: No hi ha memòria suficient.\n&amp;quot;);&lt;br /&gt;
        return 1;&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    // Entrada de dades emprant apuntadors&lt;br /&gt;
    for (i = 0; i &amp;lt; n; i++) {&lt;br /&gt;
        printf(&amp;quot;Introduïu la nota %d: &amp;quot;, i + 1);&lt;br /&gt;
        scanf(&amp;quot;%f&amp;quot;, (notes + i)); // Usa aritmètica d'apuntadors&lt;br /&gt;
        suma += *(notes + i);// Accedeix al valor de lapuntadors&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    // Càlcul de la mitjana&lt;br /&gt;
    mitjana = suma / n;&lt;br /&gt;
    printf(&amp;quot;\nLa mitjana de les %d notes és: %.2f\n&amp;quot;, n, mitjana);&lt;br /&gt;
    &lt;br /&gt;
    // Alliberament de la memòria reservada&lt;br /&gt;
    free(notes);&lt;br /&gt;
    &lt;br /&gt;
    return 0;&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
== 20260209 (2h) ==&lt;br /&gt;
* Dubtes&lt;br /&gt;
[https://recull.binefa.cat/files/20260209/ Codis comentats avui a classe] usuari: ''asix'' / contrasenya: ''asix2425''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- Exercicis de '''recursivitat'''. ([https://recull.binefa.cat/files/20231214/ m4p01.c, m4p02.c, m4e1.c, m4e2.c i m4e2.py])&lt;br /&gt;
&lt;br /&gt;
[http://www.xtec.cat/formaciotic/ateneu_historic/materials/td97/d97m4/annex.htm La '''depuració''' en C emprant '''gdb''']&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
=== Separació d'arxius en Python ===&lt;br /&gt;
&lt;br /&gt;
'''crida01.py''':&lt;br /&gt;
 # crida01.py&lt;br /&gt;
 &lt;br /&gt;
 def nLaTevaEdat():&lt;br /&gt;
    return int(input(&amp;quot;La teva edat: &amp;quot;))&lt;br /&gt;
 &lt;br /&gt;
 '''if __name__ == &amp;quot;__main__&amp;quot;:'''&lt;br /&gt;
    print(&amp;quot;Dius tenir %d anys&amp;quot;%nLaTevaEdat())&lt;br /&gt;
&lt;br /&gt;
'''principal.py''':&lt;br /&gt;
 # principal.py&lt;br /&gt;
 '''import''' ''crida01''&lt;br /&gt;
 &lt;br /&gt;
 nEdat = ''crida01''.nLaTevaEdat()&lt;br /&gt;
 print(&amp;quot;Heu dit que teniu %d anys&amp;quot;%nEdat)&lt;br /&gt;
&lt;br /&gt;
'''principal02.py''':&lt;br /&gt;
 # principal02.py&lt;br /&gt;
 '''from''' crida01 '''import''' ''nLaTevaEdat''&lt;br /&gt;
 &lt;br /&gt;
 nEdat = ''nLaTevaEdat''()&lt;br /&gt;
 print(&amp;quot;Heu dit que teniu %d anys&amp;quot;%nEdat)&lt;br /&gt;
&lt;br /&gt;
'''principal03.py''':&lt;br /&gt;
 # principal03.py&lt;br /&gt;
 '''from''' crida01 '''import''' nLaTevaEdat '''as''' ''nIntroEdat''&lt;br /&gt;
 &lt;br /&gt;
 nEdat = ''nIntroEdat''()&lt;br /&gt;
 print(&amp;quot;Heu dit que teniu %d anys&amp;quot;%nEdat)&lt;br /&gt;
=== Separació d'arxius en C ===&lt;br /&gt;
[https://recull.binefa.cat/files/20260209/ Exemple de separació d'arxius en C al recull d'avui]&lt;br /&gt;
&lt;br /&gt;
== 20260206 (1h) ==&lt;br /&gt;
* Dubtes&lt;br /&gt;
* [[Comparació dels diccionaris de Python amb les estructures de C]]&lt;br /&gt;
* [[try-except a Python]]&lt;br /&gt;
* [[Estructures de Dades Lineals a Python: Llistes i Tuples]]&lt;br /&gt;
&lt;br /&gt;
== 20260202 (2h) ==&lt;br /&gt;
* Dubtes&lt;br /&gt;
* Es comença a implementar un codi per saber si una frase és un palíndrom, o no. De moment no es fa pre-processament de les dades.&lt;br /&gt;
* ''strcpy()'' i ''strcat()''&lt;br /&gt;
* Pre-processament de les dades pels palíndroms emprant ''strcpy()'' i ''strcat()''&lt;br /&gt;
== 20260130 (1h) ==&lt;br /&gt;
* Dubtes&lt;br /&gt;
* Examen sorpresa (''ja no és sorpresa'') de bucles, condicionals i aleatorietat.&lt;br /&gt;
&lt;br /&gt;
== 20260126 (2h) ==&lt;br /&gt;
* Dubtes&lt;br /&gt;
* Algorisme per saber si una frase és anagrama, o no.&lt;br /&gt;
&lt;br /&gt;
== 20260123 (1h) ==&lt;br /&gt;
* Dubtes&lt;br /&gt;
* Heu de dur fet cesar00.c basat en cesar00.py del recull del dia anterior&lt;br /&gt;
* Anul·lat l'examen sorpresa de bucles, condicionals i aleatorietat. Queda posposat al proper divendres&lt;br /&gt;
&lt;br /&gt;
== 20260119 (2h) ==&lt;br /&gt;
* Explicació dels punts febles del darrer examen&lt;br /&gt;
* [[Mètodes de cadenes a Python]]&lt;br /&gt;
&lt;br /&gt;
== 20260112 (2h) ==&lt;br /&gt;
* Dubtes&lt;br /&gt;
* Exercici de trobar el mínim de les temperatures entrades&lt;br /&gt;
&lt;br /&gt;
== 20260109 (1h) ==&lt;br /&gt;
* Dubtes&lt;br /&gt;
* Seguim amb vectors&lt;br /&gt;
&lt;br /&gt;
== 20260109 (1h) ==&lt;br /&gt;
* Dubtes&lt;br /&gt;
* Introducció als vectors (''array'')&lt;br /&gt;
&lt;br /&gt;
== 20251215 (2h) ==&lt;br /&gt;
* Dubtes&lt;br /&gt;
* pi01.c&lt;br /&gt;
&lt;br /&gt;
 // Utilitza RAND_MAX (el màxim valor de rand()) per a una millor distribució.&lt;br /&gt;
 // rand() / (RAND_MAX + 1.0) produeix un valor entre 0.0 i &amp;lt; 1.0&lt;br /&gt;
 double lfNombreAleatori(double lfMin, double lfMax) {&lt;br /&gt;
    return lfMin + (lfMax - lfMin) * (rand() / (RAND_MAX + 1.0));&lt;br /&gt;
 }&lt;br /&gt;
* Vectors (''arrays'')&lt;br /&gt;
&lt;br /&gt;
== 20251212 (1h) ==&lt;br /&gt;
* Dubtes&lt;br /&gt;
* Trobar número PI&lt;br /&gt;
&lt;br /&gt;
== 20251205 (1h) ==&lt;br /&gt;
* Dubtes&lt;br /&gt;
* m4e6.c (fet m4e6.py el dia anterior)&lt;br /&gt;
* Resolem m4e5.py i m4e5.c&lt;br /&gt;
* Exercicis&lt;br /&gt;
&lt;br /&gt;
== 20251201 (1h) ==&lt;br /&gt;
* Dubtes&lt;br /&gt;
* Exercicis&lt;br /&gt;
&lt;br /&gt;
== 20251128 (1h) ==&lt;br /&gt;
* Dubtes&lt;br /&gt;
* Aleatorietat&lt;br /&gt;
&lt;br /&gt;
=== Aleatorietat a C ===&lt;br /&gt;
&lt;br /&gt;
 #include &amp;lt;stdlib.h&amp;gt;&lt;br /&gt;
 #include &amp;lt;time.h&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 void vLlavorAleatorietat(){&lt;br /&gt;
    '''srand'''( (unsigned)time( NULL ) );&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 int nNumAleat(int nMin,int nMax){&lt;br /&gt;
    return nMin+ '''rand()'''% ((nMax-nMin)+1);&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
=== Aleatorietat a Python ===&lt;br /&gt;
[https://docs.python.org/3/library/random.html Números aleatoris en Python]&lt;br /&gt;
 '''import random'''&lt;br /&gt;
 nN = '''random.randint(a, b)'''&lt;br /&gt;
Retorna un enter aleatori ''nN'', tal que ''a &amp;lt;= nN &amp;lt;= b''. Àlies de '''''randrange(a, b+1)'''''.&lt;br /&gt;
&lt;br /&gt;
== 20251124 (2h) ==&lt;br /&gt;
* Resolem [http://www.xtec.cat/formaciotic/ateneu_historic/materials/td97/d97m4/d97m4ex.htm m4e1.c] (m4e1.py es va resoldre el darrer dia)&lt;br /&gt;
* Dubtes&lt;br /&gt;
* Recursivitat&lt;br /&gt;
* Les '''torres de Hanoi''':&lt;br /&gt;
[https://ca.wikipedia.org/wiki/Torres_de_Hanoi Què són les torres de Hanoi?]&lt;br /&gt;
&lt;br /&gt;
Explicació de [http://www.xtec.cat/formaciotic/ateneu_historic/materials/td97/d97m4/d97m4p2.htm Les torres de Hanoi]&lt;br /&gt;
&lt;br /&gt;
[https://youtu.be/lilBGvaOSy8 Vídeo: Entendiendo la recursividad con las Torres de Hanoi]&lt;br /&gt;
&lt;br /&gt;
* Seguim amb exemples&lt;br /&gt;
&lt;br /&gt;
== 20251121 (1h) ==&lt;br /&gt;
* Dubtes&lt;br /&gt;
* Recursivitat&lt;br /&gt;
&lt;br /&gt;
== 20251117 (2h) ==&lt;br /&gt;
* Dubtes&lt;br /&gt;
* Repàs de bucles&lt;br /&gt;
&lt;br /&gt;
== 20251114 (1h) ==&lt;br /&gt;
* Prova teòrica manuscrita ''(Heu d'escriure a la part superior: '''1)''' Cognom1 Cognom2, Nom '''2)''' ASIX '''3)''' CO o JB en funció del professor que heu tingut més hores)''&lt;br /&gt;
&lt;br /&gt;
== 20251110 (1h) ==&lt;br /&gt;
* Dubtes&lt;br /&gt;
* Declaració, assignació i instanciació de variables&lt;br /&gt;
* Prototipus de funcions&lt;br /&gt;
* ord() i chr() a [[Mètodes de cadenes a Python]]&lt;br /&gt;
&lt;br /&gt;
 &amp;gt;&amp;gt;&amp;gt; c = 'z'&lt;br /&gt;
 &amp;gt;&amp;gt;&amp;gt; print(f&amp;quot;c: {c}&amp;quot;)&lt;br /&gt;
 c: z&lt;br /&gt;
 &amp;gt;&amp;gt;&amp;gt; print(f&amp;quot;c: {'''ord'''(c)}&amp;quot;)&lt;br /&gt;
 c: 122&lt;br /&gt;
 &amp;gt;&amp;gt;&amp;gt; print(&amp;quot;c: %c&amp;quot;%(c))&lt;br /&gt;
 c: z&lt;br /&gt;
 &amp;gt;&amp;gt;&amp;gt; print(&amp;quot;c: %d&amp;quot;%('''ord'''(c)))&lt;br /&gt;
 c: 122&lt;br /&gt;
 &amp;gt;&amp;gt;&amp;gt; d = 121&lt;br /&gt;
 &amp;gt;&amp;gt;&amp;gt; print(f&amp;quot;d: {d}&amp;quot;)&lt;br /&gt;
 d: 121&lt;br /&gt;
 &amp;gt;&amp;gt;&amp;gt; print(f&amp;quot;d: {'''chr'''(d)}&amp;quot;)&lt;br /&gt;
 d: y&lt;br /&gt;
 &amp;gt;&amp;gt;&amp;gt; print(&amp;quot;c: %c&amp;quot;%('''chr'''(d)))&lt;br /&gt;
 c: y&lt;br /&gt;
 &amp;gt;&amp;gt;&amp;gt; print(&amp;quot;c: %d&amp;quot;%(d))&lt;br /&gt;
 c: 121&lt;br /&gt;
 &amp;gt;&amp;gt;&amp;gt;&lt;br /&gt;
* Exercicis&lt;br /&gt;
&lt;br /&gt;
== 20251031 (1h) ==&lt;br /&gt;
* Dubtes&lt;br /&gt;
* Bucles&lt;br /&gt;
* Exercicis&lt;br /&gt;
&lt;br /&gt;
== 20251024 (1h) ==&lt;br /&gt;
* Dubtes&lt;br /&gt;
* Condicionals&lt;br /&gt;
* Operador ternari&lt;br /&gt;
&lt;br /&gt;
== 20251017 (1h) ==&lt;br /&gt;
* Dubtes&lt;br /&gt;
* Condicionals&lt;br /&gt;
&lt;br /&gt;
== 20251013 (2h) ==&lt;br /&gt;
* Dubtes&lt;br /&gt;
* Condicionals&lt;br /&gt;
== 20251006 (2h) ==&lt;br /&gt;
* Dubtes&lt;br /&gt;
* Correcció d'exercicis pendents&lt;br /&gt;
* Variables booleanes i condicionals&lt;br /&gt;
&lt;br /&gt;
== 20251003 (1h) ==&lt;br /&gt;
[https://recull.binefa.cat/ Codis comentats avui a classe] usuari: ''asix'' / contrasenya: ''asix2526''&lt;br /&gt;
&lt;br /&gt;
== 20250929 (2h) ==&lt;br /&gt;
[https://recull.binefa.cat/ Codis comentats avui a classe] usuari: ''asix'' / contrasenya: ''asix2526''&lt;br /&gt;
&lt;br /&gt;
== 20250926 (1h) ==&lt;br /&gt;
[https://recull.binefa.cat/ Codis comentats avui a classe] usuari: ''asix'' / contrasenya: ''asix2526''&lt;br /&gt;
&lt;br /&gt;
[https://xtec.dev/python/computation Python - Computació]&lt;br /&gt;
&lt;br /&gt;
[http://www.xtec.cat/formaciotic/ateneu_historic/materials/td97/index.htm Fonaments de Programació. Llenguatge C/C++ (d97)]&lt;br /&gt;
&lt;br /&gt;
== 20250922 (2h) ==&lt;br /&gt;
[https://recull.binefa.cat/files/20240922/ Codis comentats avui a classe] usuari: ''asix'' / contrasenya: ''asix2526''&lt;br /&gt;
&lt;br /&gt;
== 20250919 (1h) ==&lt;br /&gt;
[https://recull.binefa.cat/files/20240916/ Codis comentats avui a classe] usuari: ''asix'' / contrasenya: ''asix2526''&lt;br /&gt;
&lt;br /&gt;
[https://www.onlinegdb.com/ Compilador / intèrpret en línia onlinegdb.com]&lt;br /&gt;
&lt;br /&gt;
=== Snap! ===&lt;br /&gt;
[https://snap.berkeley.edu/snap/snap.html Snap!]&lt;br /&gt;
&lt;br /&gt;
=== Python ===&lt;br /&gt;
[https://www.python.org/downloads/ Instal·lador de Python per a Windows]&lt;br /&gt;
&lt;br /&gt;
[https://app.edublocks.org/project/new?mode=python Convertidor de blocs a Python]&lt;br /&gt;
&lt;br /&gt;
[[Pràctiques d'introducció a Python - SMX | Pràctiques d'introducció a Python]]&lt;br /&gt;
&lt;br /&gt;
=== C ===&lt;br /&gt;
[https://sourceforge.net/projects/mingw/ Instal·lador de C per a Windows]&lt;br /&gt;
&lt;br /&gt;
[https://code.visualstudio.com/docs/cpp/config-mingw Using GCC with MinGW]&lt;br /&gt;
&lt;br /&gt;
[http://www.xtec.cat/formaciotic/ateneu_historic/materials/td97/index.htm Fonaments de programació en C]&lt;br /&gt;
&lt;br /&gt;
=== IDE ===&lt;br /&gt;
[https://code.visualstudio.com/download Visual Studio Code]&lt;br /&gt;
&lt;br /&gt;
[https://www.geany.org/download/releases/ Geany]&lt;br /&gt;
&lt;br /&gt;
[https://www.onlinegdb.com/ Compilador / intèrpret en línia onlinegdb.com]&lt;br /&gt;
&lt;br /&gt;
= Repositori de codis fet a classe durant el curs =&lt;br /&gt;
[https://recull.binefa.cat/files/ Codis fets a les classes de 1r d'ASIX] usuari: ''asix'' / contrasenya: ''asix2526''&lt;br /&gt;
&lt;br /&gt;
== Algorísmica ==&lt;br /&gt;
[https://www.binefa.cat/asix2122/m03_m16/doc/1PRG_M03UF1_EXE001_BasicsPseudocodi.pdf Exercicis bàsics de pesudocodi - Ex01]&lt;br /&gt;
&lt;br /&gt;
== Python ==&lt;br /&gt;
[[Pràctiques d'introducció a Python - SMX | Pràctiques d'introducció a Python]]&lt;br /&gt;
&lt;br /&gt;
=== Condicionals en Python ===&lt;br /&gt;
[[Pràctiques d'introducció a Python . Part 2 - SMX | Condicionals amb Python]]&lt;br /&gt;
&lt;br /&gt;
[[Exercicis de condicions en Python]]&lt;br /&gt;
&lt;br /&gt;
=== Estructures repetitives, o bucles, en Python ===&lt;br /&gt;
&lt;br /&gt;
[[Pràctiques d'introducció a Python . Part 3 - SMX | Estructures repetitives, o bucles, en Python]]&lt;br /&gt;
&lt;br /&gt;
[[Exercicis d'estructures de control repetitives en Python]]&lt;br /&gt;
&lt;br /&gt;
=== Instal·lació del Jupyter Lab ===&lt;br /&gt;
[https://jupyter.org/try Prova de Jupyter via web externa]&lt;br /&gt;
&lt;br /&gt;
Instal·lació de Jupyter Lab a la màquina virtual GNU/Linux. Des del terminal:&lt;br /&gt;
 $ su -&lt;br /&gt;
 # apt update&lt;br /&gt;
 # apt install python3-pip&lt;br /&gt;
 # exit&lt;br /&gt;
 $ pip --version&lt;br /&gt;
 $ pip install jupyterlab&lt;br /&gt;
 $ pip install jupyter-c-kernel&lt;br /&gt;
&lt;br /&gt;
Sortiu de la sessió i torneu-hi a entrar. Seguiu amb aquestes ordres:&lt;br /&gt;
&lt;br /&gt;
 $ install_c_kernel --user&lt;br /&gt;
 $ jupyter kernelspec list&lt;br /&gt;
&lt;br /&gt;
Un cop instal·lat s'executa des del terminal:&lt;br /&gt;
 $ jupyter-lab&lt;br /&gt;
&lt;br /&gt;
I apareix el navegador web amb el Jupyter Lab.&lt;br /&gt;
&lt;br /&gt;
== C ==&lt;br /&gt;
[http://www.xtec.cat/formaciotic/ateneu_historic/materials/td97/index.htm Fonaments de programació en C]&lt;/div&gt;</summary>
		<author><name>Jordi Binefa</name></author>
		
	</entry>
	<entry>
		<id>https://www.binefa.com/index.php?title=DAM2_-_EH3._IoT_Lab._Curs_2025-2026&amp;diff=12292</id>
		<title>DAM2 - EH3. IoT Lab. Curs 2025-2026</title>
		<link rel="alternate" type="text/html" href="https://www.binefa.com/index.php?title=DAM2_-_EH3._IoT_Lab._Curs_2025-2026&amp;diff=12292"/>
		<updated>2026-05-11T15:37:49Z</updated>

		<summary type="html">&lt;p&gt;Jordi Binefa: /* 20260508 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Quan tingueu les credencials d'accés a la [https://clot.fje.edu/ca NET] heu de compartir una carpeta amb aquest nom: '''2526-DAM-1rCognom2nCognomNom''' (Per exemple, si el vostre nom és Xavier López Pujol --&amp;gt; ''2526-DAM-LopezPujolXavier''). Heu de compartir-la amb el professor transversal dels projectes globals i amb mi. A aquest enllaç podreu veure si ja hi sou a la llista:&lt;br /&gt;
&lt;br /&gt;
[[Carpetes compartides de 2n de DAM. Curs 2025-2026]]&lt;br /&gt;
= Enllaços ràpids =&lt;br /&gt;
[https://meet.google.com/wwr-knez-ukp Compartició de pantalla]&lt;br /&gt;
&lt;br /&gt;
[[Recull de pràctiques de 2n de DAM. Curs 2025-2026]]&lt;br /&gt;
&lt;br /&gt;
[https://recull.binefa.cat/ Recull de codis fets a classe. Curs 2025-2026]&lt;br /&gt;
&lt;br /&gt;
[[Introducció al QML. Curs 2025-2026]]&lt;br /&gt;
&lt;br /&gt;
[https://docs.google.com/spreadsheets/d/1IdtuoZh2A1T8vC-ir6JPHBQ_DqJIro33SS0CJbb_NNU/edit?gid=580554084#gid=580554084 Llista de 2n de DAM] &amp;lt;!-- [https://fje.sharepoint.com/:x:/r/sites/GD_CLOT-FP-CLOT_FP-DptInformatica/Documentos%20compartidos/CLOT_FP-DptInformatica/2526/LLISTES%20ASSIST%C3%88NCIA/Llista%20DAM2%202526.xlsx?d=webe7c8c6c208440ca796d6682b083ea4&amp;amp;csf=1&amp;amp;web=1&amp;amp;e=UuzgX1 Llista de 2n de DAM] --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[https://fje.sharepoint.com/sites/GD_CLOT-FP-CLOT_FP-DptInformatica/Documentos%20compartidos/Forms/AllItems.aspx?id=%2Fsites%2FGD%5FCLOT%2DFP%2DCLOT%5FFP%2DDptInformatica%2FDocumentos%20compartidos%2FCLOT%5FFP%2DDptInformatica%2F2526%2FLLISTES%20ASSIST%C3%88NCIA&amp;amp;viewid=0378dc70%2Dd30b%2D4dbf%2D9ffc%2D0a0ea8f8bf65&amp;amp;FolderCTID=0x0120003BC8367864239F40A596CE0A21832195 Totes les llistes]&lt;br /&gt;
&lt;br /&gt;
= Algunes classes =&lt;br /&gt;
== 20260511 ==&lt;br /&gt;
* Es continua amb el projecte final de cicle, anomenat '''''Repte'''''.&lt;br /&gt;
== 20260508 ==&lt;br /&gt;
* Es continua amb el projecte final de cicle, anomenat '''''Repte'''''.&lt;br /&gt;
&lt;br /&gt;
== 20260504 ==&lt;br /&gt;
* Es continua amb el projecte final de cicle, anomenat '''''Repte'''''.&lt;br /&gt;
&lt;br /&gt;
== 20260427 ==&lt;br /&gt;
* Es comença el projecte final de cicle. Anomenat '''''Repte'''''.&lt;br /&gt;
&lt;br /&gt;
== 20260420 - ex 3rT ==&lt;br /&gt;
* [https://recull.binefa.cat/files/20260420_eh3_3rT/ Prova epistemològica del tercer trimestre]&lt;br /&gt;
&amp;lt;!--* [https://binefa.com/dam/20260420ex/ Funcionament p5] [https://binefa.com/dam/20260420ex/p10/ Funcionament p10]--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 20260417 ==&lt;br /&gt;
* Seguim amb les pràctiques pendents del [[Recull de pràctiques de 2n de DAM. Curs 2025-2026 | recull de pràctiques]]&lt;br /&gt;
== 20260413 ==&lt;br /&gt;
* Seguim amb les pràctiques pendents del [[Recull de pràctiques de 2n de DAM. Curs 2025-2026 | recull de pràctiques]]&lt;br /&gt;
* Afegida la [[Recull de pràctiques de 2n de DAM. Curs 2025-2026#M03 | pràctica M03]]&lt;br /&gt;
&lt;br /&gt;
== 20260410 ==&lt;br /&gt;
* Seguim amb les pràctiques pendents del [[Recull de pràctiques de 2n de DAM. Curs 2025-2026 | recull de pràctiques]]&lt;br /&gt;
&lt;br /&gt;
== 20260327 ==&lt;br /&gt;
* Com graficar amb l'IDE d'Arduino ([https://wokwi.com/projects/330035502407221843 Exemple de graficació])&lt;br /&gt;
* Prova d'un [[Simulador de la placa IoT-02 en línia]]&lt;br /&gt;
* Afegides les pràctiques M01.0, M01.1, M01.2 i M01.3 al [[Recull de pràctiques de 2n de DAM. Curs 2025-2026 | recull de pràctiques]]&lt;br /&gt;
&lt;br /&gt;
== 20260323 ==&lt;br /&gt;
* Seguim amb les comunicacions per port sèrie&lt;br /&gt;
&lt;br /&gt;
== 20260316 ==&lt;br /&gt;
* Seguim amb les comunicacions per port sèrie&lt;br /&gt;
&lt;br /&gt;
== 20260314 ==&lt;br /&gt;
* [https://ca.wikipedia.org/wiki/SCADA Sistemes SCADA]&lt;br /&gt;
* [[Modbus RTU]]&lt;br /&gt;
* [[Comunicació entre Arduino i Python fent servir el port sèrie]]&lt;br /&gt;
* Fent servir l'eina de manteniment de les Qt feu la instal·lació de les biblioteques addicionals [https://doc.qt.io/qt-6/qserialport.html QSerialPort] i [https://doc.qt.io/qt-6/qtserialbus-index.html QtSerialBus] (M00.2)&lt;br /&gt;
* [https://doc.qt.io/qt-6/qtserialport-terminal-example.html Serial Terminal] Exemple estàndard de les Qt per a fer ús de [https://doc.qt.io/qt-6/qserialport.html QSerialPort] (M00.3)&lt;br /&gt;
* [https://recull.binefa.cat/files/material/modbus/m01_3_00.zip Ús de QSerialPort] Codi minimitzat d'ús de QSerialPort (M00.4)&lt;br /&gt;
* Pràctiques noves per a fer: &lt;br /&gt;
- '''M00.1''' (prova del terminal sèrie), '''M00.2''' (instal·lació de QSerialPort), '''M00.3''' (prova de [https://doc.qt.io/qt-6/qtserialport-terminal-example.html Serial Terminal]) i '''M00.4''' (exemple minimalista d'ús de QSerialPort)&lt;br /&gt;
&lt;br /&gt;
- '''M02''' (ús de [https://github.com/jordibinefa/IoT-02/tree/master/codes/python/modbus mb_IoT_00.py] per a ModBus)&lt;br /&gt;
&lt;br /&gt;
* Seguim fent els exercicis pendents del [[Recull de pràctiques de 2n de DAM. Curs 2025-2026 | recull de pràctiques]]&lt;br /&gt;
&lt;br /&gt;
== 20260309 ==&lt;br /&gt;
* Seguim fent exercicis pendents del [[Recull de pràctiques de 2n de DAM. Curs 2025-2026 | recull de pràctiques]]&lt;br /&gt;
&lt;br /&gt;
== 20260302 ==&lt;br /&gt;
* Seguim fent exercicis pendents del [[Recull de pràctiques de 2n de DAM. Curs 2025-2026 | recull de pràctiques]]&lt;br /&gt;
&lt;br /&gt;
== 20260227 - ex IoT 2nT==&lt;br /&gt;
* [https://recull.binefa.cat/files/20260227_exIoT_2nT/ Prova epistemològica sobre IoT]&lt;br /&gt;
&lt;br /&gt;
== 20260223 - ex QML 2nT ==&lt;br /&gt;
* [https://recull.binefa.cat/files/20260223_exQML_2nT/ Prova epistemològica sobre QML]&lt;br /&gt;
* [https://binefa.com/diner12/ diner12] i [https://binefa.com/rc08/ rc08]&lt;br /&gt;
&lt;br /&gt;
== 20260220 ==&lt;br /&gt;
* Seguim fent exercicis pendents del [[Recull de pràctiques de 2n de DAM. Curs 2025-2026 | recull de pràctiques]]&lt;br /&gt;
== 20260213 ==&lt;br /&gt;
* Seguim fent exercicis pendents del [[Recull de pràctiques de 2n de DAM. Curs 2025-2026 | recull de pràctiques]]&lt;br /&gt;
&lt;br /&gt;
== 20260209 ==&lt;br /&gt;
* Seguim fent exercicis pendents del [[Recull de pràctiques de 2n de DAM. Curs 2025-2026 | recull de pràctiques]]&lt;br /&gt;
&lt;br /&gt;
== 20260206 ==&lt;br /&gt;
* Seguim fent exercicis pendents del [[Recull de pràctiques de 2n de DAM. Curs 2025-2026 | recull de pràctiques]]&lt;br /&gt;
&lt;br /&gt;
== 20260202 ==&lt;br /&gt;
* Seguim fent exercicis pendents del [[Recull de pràctiques de 2n de DAM. Curs 2025-2026 | recull de pràctiques]]&lt;br /&gt;
&lt;br /&gt;
== 20260130 ==&lt;br /&gt;
* Interacció de missatgeria Telegram amb la placa IoT-02&lt;br /&gt;
** [[Bot de Telegram]]&lt;br /&gt;
** [https://t.me/+_VLkz6Lbv3dlZWJk Enllaç d'invitació al grup de Telegram DAM 2025-2026]&lt;br /&gt;
** [http://formacio.things.cat:2345/#flow/18de37d8.c91f68 Node-RED de prova] (per mostrar a classe un Node-RED funcionant amb el grup de Telegram DAM 2025-2026)&lt;br /&gt;
* [[Desenvolupament d'una API en NodeRed. Pasarel·la HTTP a MQTT]] ([[Introducció a l'ús del Node-RED#Passarel·la HTTP a MQTT | Passarel·la HTTP a MQTT]])&lt;br /&gt;
* [https://snap.berkeley.edu/snap/snap.html#present:Username=jordibinefa&amp;amp;ProjectName=AI%20API Connexió amb Gemini] Cal una [https://aistudio.google.com/app/apikey clau d'API (API key)] ([https://ai.google.dev/gemini-api/docs/quickstart?lang=python Guia ràpida d'ús a l'API de Gemini])&lt;br /&gt;
 curl &amp;quot;https://generativelanguage.googleapis.com/v1beta/models/gemini-flash-latest:generateContent?key='''LA_TEVA_CLAU_API'''&amp;quot; \&lt;br /&gt;
    -H 'Content-Type: application/json' \&lt;br /&gt;
    -X POST \&lt;br /&gt;
    -d '{&lt;br /&gt;
      &amp;quot;contents&amp;quot;: [{&lt;br /&gt;
        &amp;quot;parts&amp;quot;:[{&amp;quot;text&amp;quot;: &amp;quot;Hola! Estàs funcionant amb la versió latest?&amp;quot;}]&lt;br /&gt;
      }]&lt;br /&gt;
    }'&lt;br /&gt;
* Incorporats els exercicis A14.2, A14.3, A14.9, A14.10 i A14.11 al [[Recull de pràctiques de 2n de DAM. Curs 2025-2026 | recull de pràctiques]]&lt;br /&gt;
&lt;br /&gt;
== 20260126 ==&lt;br /&gt;
* Lliurament de la pràctica A08.04 (Joc Pedra, Paper, Tisora)&lt;br /&gt;
* [https://binefa.com/iot-02/ Bessó digital de la placa IoT-02] ([https://binefa.com/iot-02/dt14.zip Codi font]) ([https://binefa.com/iot-02/dt14.apk dt14.apk])&lt;br /&gt;
* [https://snap.berkeley.edu/snap/snap.html#present:Username=jordibinefa&amp;amp;ProjectName=IoT-02_board_segur_123456789A11 Codi amb Snap! per a controlar el bessó digital] i qualsevol placa IoT-02 amb el [https://github.com/jordibinefa/IoT-02/tree/master/codes/IoT_02_mqtts_json_formacioThingsCat microprogramari adient]&lt;br /&gt;
* Brokers wss: wss://broker.emqx.io:8084/mqtt (https://www.emqx.com/en/mqtt/public-mqtt5-broker) i wss://broker.binefa.cat:9002 (https://broker.binefa.cat/)&lt;br /&gt;
* Incorporat exercici A13.05 al [[Recull de pràctiques de 2n de DAM. Curs 2025-2026 | recull de pràctiques]]&lt;br /&gt;
&lt;br /&gt;
== 20260123 ==&lt;br /&gt;
* Recordeu dur la [[Placa IoT-02]]&lt;br /&gt;
* [[Introducció a l'ús del Node-RED]]&lt;br /&gt;
* [[Autenticació d'accés a NodeRED]]&lt;br /&gt;
* [[Ús de la base de dades MariaDB des de NodeRED]]&lt;br /&gt;
* [[Transmissió d'un número real de tipus IEEE-754 (4 bytes) i llur recuperació a NodeRED]]&lt;br /&gt;
* Exercici A14.1 i A14.8 del [[Recull de pràctiques de 2n de DAM. Curs 2025-2026 | recull de pràctiques]]&lt;br /&gt;
&lt;br /&gt;
== 20260119 ==&lt;br /&gt;
* Dubtes&lt;br /&gt;
* [https://binefa.com/dam/teoria/qrc/qrc.html Com incorporar imatges a QML] (resum curt del dos enllaços del darrer dia sobre gestió de recursos o QRC)&lt;br /&gt;
* [https://binefa.com/dam/rps/A08.04.3b.html Guia didàctica: Rock, Paper, Scissors amb Configuració] Com fer A08.04.3 emprant el sistema modern d'ús de recursos (sense emprar QRC)&lt;br /&gt;
&lt;br /&gt;
== 20260116 ==&lt;br /&gt;
* Dubtes&lt;br /&gt;
* Seguim fent els exercicis pendents del [[Recull de pràctiques de 2n de DAM. Curs 2025-2026 | recull de pràctiques]]&lt;br /&gt;
=== Sobre arxius .qrc ===&lt;br /&gt;
* [https://binefa.com/dam/teoria/qrc/info_QRC.html Ús de l'arxiu de recursos .qrc]&lt;br /&gt;
* [https://binefa.com/dam/teoria/qrc/info_QRC_02.html Gestió de recursos en Qt6]&lt;br /&gt;
&lt;br /&gt;
== 20260112 ==&lt;br /&gt;
* [https://binefa.com/dam/rps/a08.04.1/ Proposta de solució A08.04.1]&lt;br /&gt;
* [https://binefa.com/dam/rps/a08.04.2/ Proposta de solució A08.04.2]&lt;br /&gt;
* [https://binefa.com/dam/rps/a08.04.3/ Proposta de solució A08.04.3]&lt;br /&gt;
* [https://binefa.com/dam/rps/guiaA08.html Guia A08 - Desenvolupament Joc Pedra, Paper, Tisora] &amp;lt;-- Guia actualitzada&lt;br /&gt;
* [https://binefa.com/dam/rps/teoriaA08/ Codis] de [https://binefa.com/dam/rps/teoriaA08.html Teoria A08 - Joc Pedra, Paper, Tisora amb Qt Quick]&lt;br /&gt;
&lt;br /&gt;
== 20260109 ==&lt;br /&gt;
* [https://binefa.com/dam/rps/teoriaA08.html Teoria A08 - Joc Pedra, Paper, Tisora amb Qt Quick]&lt;br /&gt;
* [https://binefa.com/dam/rps/guiaA08.html Guia A08 - Desenvolupament Joc Pedra, Paper, Tisora]&lt;br /&gt;
== 20251215 ==&lt;br /&gt;
* Activitat '''A08.04''': [[Recull de pràctiques de 2n de DAM._Curs_2025-2026#A08.04 | joc pedra, paper, tisora]] ([https://binefa.com/dam/rps/ Una idea del joc])&lt;br /&gt;
&lt;br /&gt;
== 20251212 ==&lt;br /&gt;
Creació de projectes Qt multiplataforma emprant sòcols web segurs (wss) sobre escriptori, WebAssembly i Android.&lt;br /&gt;
&lt;br /&gt;
 alumne@qtedu:~/QtPrj/qml$ '''./qt_project_generator.py''' &lt;br /&gt;
 ============================================================&lt;br /&gt;
  GENERADOR DE PROJECTES QT MULTIPLATAFORMA&lt;br /&gt;
 ============================================================&lt;br /&gt;
 &lt;br /&gt;
 📦 Nom del projecte (ex: mqtt00): '''mqt00'''&lt;br /&gt;
 📱 Nom de l'aplicació [appmqt00]: &lt;br /&gt;
 📌 Versió del projecte [0.1]: &lt;br /&gt;
 🎨 URI QML [premeu Enter per deixar buit o ex: com.example.mqt00]: &lt;br /&gt;
 &lt;br /&gt;
 ✅ Projecte 'mqt00' creat correctament!&lt;br /&gt;
 📁 Ubicació: /home/alumne/QtPrj/qml/mqt00&lt;br /&gt;
 &lt;br /&gt;
 📝 Passos següents:&lt;br /&gt;
   1. Copia a la nova carpeta els arxius (.h i .cpp): connexio, mqttbasic i websocketiodevice&lt;br /&gt;
   2. Obre Qt Creator&lt;br /&gt;
   3. File → Open File or Project...&lt;br /&gt;
   4. Selecciona: /home/alumne/QtPrj/qml/mqt00/CMakeLists.txt&lt;br /&gt;
   5. Configura els kits (Desktop, Android, WebAssembly)&lt;br /&gt;
   6. Build → Build All&lt;br /&gt;
 alumne@qtedu:~/QtPrj/qml$&lt;br /&gt;
[https://binefa.com/dam/codis/wss/ Lloc web per a descarregar-se els arxius necessaris per a fer una aplicació multiplataforma emprant wss sobre escriptori, WebAssembly i Android]&lt;br /&gt;
&lt;br /&gt;
Per a connectar el rerefons amb el QML, afegiu a [https://binefa.com/dam/codis/wss/main.cpp main.cpp] el text en negreta:&lt;br /&gt;
 #include &amp;lt;QGuiApplication&amp;gt;&lt;br /&gt;
 #include &amp;lt;QQmlApplicationEngine&amp;gt;&lt;br /&gt;
 '''#include &amp;quot;connexio.h&amp;quot;'''&lt;br /&gt;
 &lt;br /&gt;
 int main(int argc, char *argv[]){&lt;br /&gt;
    QGuiApplication app(argc, argv);&lt;br /&gt;
 &lt;br /&gt;
    '''qmlRegisterType&amp;lt;Connexio&amp;gt;(&amp;quot;desDe.connexio&amp;quot;,1,0,&amp;quot;Connexio&amp;quot;);'''&lt;br /&gt;
 &lt;br /&gt;
    QQmlApplicationEngine engine;&lt;br /&gt;
    ...&lt;br /&gt;
Així podeu importar el rerefons des del [https://binefa.com/dam/codis/wss/main.qml main.qml]:&lt;br /&gt;
 import QtQuick&lt;br /&gt;
 import QtQuick.Controls&lt;br /&gt;
 '''import desDe.connexio 1.0'''&lt;br /&gt;
&lt;br /&gt;
Podent fer crides a mètodes públics de la classe C++ de rerefons:&lt;br /&gt;
 '''mqttController'''.on_btConnecta_clicked(); // on_btConnecta_clicked() és un mètode osca públic (''public slot'') de la classe Connexió a C++&lt;br /&gt;
Tots les captures dels senyals de la classe en C++ duen ''on'' al davant i es posa en majúscula el primer caràcter del senyal:&lt;br /&gt;
        Connexio {&lt;br /&gt;
            id: '''mqttController'''&lt;br /&gt;
 &lt;br /&gt;
            // Rep el senyal quan el C++ confirma la connexió&lt;br /&gt;
            '''onV'''SignalMqttConnected: {&lt;br /&gt;
                estatText.text = &amp;quot;Connectat!&amp;quot;;&lt;br /&gt;
                estatText.color = &amp;quot;green&amp;quot;;&lt;br /&gt;
                exitButton.text = &amp;quot;&amp;amp;Desconnecta&amp;quot;;&lt;br /&gt;
            }&lt;br /&gt;
&lt;br /&gt;
== 20251205 ==&lt;br /&gt;
[https://binefa.com/dam/qmlMqtt00/ mqttQml03] ([https://binefa.com/dam/qmlMqtt00/mqttQml03.zip mqttQml03.zip])&lt;br /&gt;
&lt;br /&gt;
== 20251201 ==&lt;br /&gt;
* Seguim amb QML&lt;br /&gt;
* Seguim fent exercicis pendents&lt;br /&gt;
* A l'exemple qml05 surt aquest advertiment:&lt;br /&gt;
 qt.qml.context: qrc:/qml05/main.qml:22:9 Parameter &amp;quot;event&amp;quot; is not declared. Injection of parameters into signal handlers is '''deprecated'''. Use JavaScript functions with formal parameters instead.&lt;br /&gt;
&lt;br /&gt;
Solució (afegiu '''function(event)'''):&lt;br /&gt;
        Keys.onDownPressed: square.y += 8&lt;br /&gt;
        Keys.onPressed: '''function(event)'''{&lt;br /&gt;
            switch(event.key) {&lt;br /&gt;
                case Qt.Key_Plus:&lt;br /&gt;
                    square.scale += 0.2&lt;br /&gt;
                    break;&lt;br /&gt;
                case Qt.Key_Minus:&lt;br /&gt;
                    square.scale -= 0.2&lt;br /&gt;
                    break;&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
== 20251128 ==&lt;br /&gt;
* Seguim amb QML&lt;br /&gt;
* Seguim fent exercicis pendents&lt;br /&gt;
&lt;br /&gt;
== 20251124 ==&lt;br /&gt;
* Seguim fent exercicis pendents&lt;br /&gt;
* Primer exemple:&lt;br /&gt;
 import QtQuick&lt;br /&gt;
 &lt;br /&gt;
 Window {&lt;br /&gt;
    width: 640&lt;br /&gt;
    height: 480&lt;br /&gt;
    visible: true&lt;br /&gt;
    title: qsTr(&amp;quot;Primera prova. Curs 2025-2026&amp;quot;)&lt;br /&gt;
    Rectangle{&lt;br /&gt;
        anchors.centerIn: parent&lt;br /&gt;
        anchors.fill: parent&lt;br /&gt;
        color: &amp;quot;lime&amp;quot;&lt;br /&gt;
        Text{&lt;br /&gt;
            anchors.centerIn: parent&lt;br /&gt;
            text: &amp;quot;DAM 2025-2026&amp;quot;&lt;br /&gt;
            color: &amp;quot;darkblue&amp;quot;&lt;br /&gt;
            font.family: &amp;quot;Comic Sans&amp;quot;&lt;br /&gt;
            font.pixelSize: 32&lt;br /&gt;
            font.bold: true&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
 }&lt;br /&gt;
* [[Introducció al QML. Curs 2025-2026]]&lt;br /&gt;
=== PureQML ===&lt;br /&gt;
[https://pureqml.com/ Pàgina oficial de PureQML]&lt;br /&gt;
&lt;br /&gt;
==== Posada en marxa del PureQML ====&lt;br /&gt;
* Instal·lació de l'eina '''python-future''':&lt;br /&gt;
 pip3 install future&lt;br /&gt;
&lt;br /&gt;
A GNU/Linux Debian 13:&lt;br /&gt;
  sudo apt update&lt;br /&gt;
  sudo apt install python3-venv &lt;br /&gt;
  python -m venv entorn&lt;br /&gt;
  source entorn/bin/'''activate'''&lt;br /&gt;
  '''deactivate'''&lt;br /&gt;
&lt;br /&gt;
A Windows:&lt;br /&gt;
 pip install future&lt;br /&gt;
&lt;br /&gt;
* Primera aplicació&lt;br /&gt;
 mkdir prjFolder&lt;br /&gt;
 cd prjFolder&lt;br /&gt;
 git clone https://github.com/pureqml/qmlcore.git&lt;br /&gt;
 git clone https://github.com/pureqml/controls.git&lt;br /&gt;
 ./qmlcore/build --boilerplate&lt;br /&gt;
 ./qmlcore/build&lt;br /&gt;
A Windows, les dues darreres passes:&lt;br /&gt;
 python qmlcore/build --boilerplate&lt;br /&gt;
 python qmlcore/build&lt;br /&gt;
&lt;br /&gt;
Obriu amb un navegador l'arxiu ''prjFolder/build.web/index.html''&lt;br /&gt;
&lt;br /&gt;
* Modificació de ''prjFolder/src/app.qml'':&lt;br /&gt;
 Text {&lt;br /&gt;
        anchors.fill: context;&lt;br /&gt;
         &lt;br /&gt;
        '''text: 'Primer exemple de pureQML';'''&lt;br /&gt;
        '''color: 'red';'''&lt;br /&gt;
        font.pixelSize: 32;&lt;br /&gt;
        verticalAlignment: Text.AlignVCenter;&lt;br /&gt;
        horizontalAlignment: Text.AlignHCenter;&lt;br /&gt;
 }&lt;br /&gt;
Reconstruïu-ho:&lt;br /&gt;
 ./qmlcore/build &lt;br /&gt;
&lt;br /&gt;
A Windows:&lt;br /&gt;
 python qmlcore/build&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Torneu a obrir amb un navegador l'arxiu ''prjFolder/build.web/index.html'' per a observar els canvis&lt;br /&gt;
&lt;br /&gt;
Activitats '''A08.00''' del [[Recull de pràctiques de 2n de DAM._Curs_2025-2026 | recull de pràctiques de 2n de DAM. Curs_2026-2026]]&lt;br /&gt;
&lt;br /&gt;
== 20251121 ==&lt;br /&gt;
* [https://recull.binefa.cat/files/20251121/ Solucions de l'examen]&lt;br /&gt;
* Nou exercici [https://www.binefa.com/index.php/Recull_de_pr%C3%A0ctiques_de_2n_de_DAM._Curs_2025-2026#A06.03 A06.03]&lt;br /&gt;
* Seguim fent exercicis&lt;br /&gt;
&lt;br /&gt;
== 20251117 - ex Qt 1rT ==&lt;br /&gt;
* [https://recull.binefa.cat/files/20251117ex/ Enunciat de la prova del primer trimestre]&lt;br /&gt;
* [https://binefa.com/dam/20251117ex/ex05/ ex05 en WebAssembly]&lt;br /&gt;
* [https://snap.berkeley.edu/snap/snap.html#present:Username=jordib&amp;amp;ProjectName=dam20251117ex Aplicació en Snap! per a provar ex05]&lt;br /&gt;
&lt;br /&gt;
The Emscripten versions are:&lt;br /&gt;
&lt;br /&gt;
    Qt 6.2: 2.0.14&lt;br /&gt;
    Qt 6.3: 3.0.0&lt;br /&gt;
    Qt 6.4: 3.1.14&lt;br /&gt;
    Qt 6.5: 3.1.25&lt;br /&gt;
    Qt 6.6: 3.1.37&lt;br /&gt;
    Qt 6.7: 3.1.50&lt;br /&gt;
    Qt 6.8: 3.1.56&lt;br /&gt;
    Qt 6.9: 3.1.70&lt;br /&gt;
    Qt 6.10: 4.0.7&lt;br /&gt;
&lt;br /&gt;
Use emsdk to install specific Emscripten versions. For example, to install it for Qt 6.8 enter:&lt;br /&gt;
&lt;br /&gt;
    ./emsdk install 3.1.70&lt;br /&gt;
    ./emsdk activate 3.1.70&lt;br /&gt;
&lt;br /&gt;
On Windows, Emscripten is in your path after installation. On macOS or Linux you need to add it to your path, like this:&lt;br /&gt;
&lt;br /&gt;
 source /path/to/emsdk/emsdk_env.sh&lt;br /&gt;
&lt;br /&gt;
Check this with the following command:&lt;br /&gt;
&lt;br /&gt;
 em++ --version&lt;br /&gt;
&lt;br /&gt;
== 20251114 ==&lt;br /&gt;
Seguim fent els exercicis pendents de Qt i IoT del [[Recull de pràctiques de 2n de DAM. Curs 2025-2026 | recull]].&lt;br /&gt;
&lt;br /&gt;
== 20251110 ==&lt;br /&gt;
* Aneu a [https://recull.binefa.cat/files/programes_i_apps/qt/ alguns exemples amb Qt] i baixeu-vos '''01_simpleclient_usr_pwd_CMake.zip''', '''exQt_05.zip''' i '''ginyMqtt04_cmake.zip'''. Analitzem els codis i llur funcionament.&lt;br /&gt;
* Baixeu-vos tots els arxius d'avui al [https://recull.binefa.cat/files/20251110/ recull]. Analitzem els codis i llur funcionament.&lt;br /&gt;
* Comencem '''A12.01''' i '''A12.02''' del [[Recull de pràctiques de 2n de DAM. Curs 2025-2026 | recull]]&lt;br /&gt;
&lt;br /&gt;
== 20251107 ==&lt;br /&gt;
* Acabem exercicis pendents&lt;br /&gt;
* Connexió MQTT: [https://binefa.com/clot/smx/telecontrol01/ botonera] ([https://binefa.com/clot/smx/telecontrol01/telecontrol01.zip codi font QML/Qt] i [https://binefa.com/clot/smx/telecontrol01/android-build-apptelecontrol01-debug-signed.apk apk per Android]) i [https://snap.berkeley.edu/snap/snap.html#present:Username=jordibinefa&amp;amp;ProjectName=estelaMqtt02 codi Snap! amb MQTT (sols temes)] o [https://snap.berkeley.edu/snap/snap.html#present:Username=jordibinefa&amp;amp;ProjectName=estelaMqtt03 codi Snap! amb MQTT (mou personatges)] o [https://snap.berkeley.edu/snap/snap.html#present:Username=jordibinefa&amp;amp;ProjectName=estelaMqtt04 codi Snap! amb MQTT (mou personatges amb blocs personalitzats)]&lt;br /&gt;
&lt;br /&gt;
== 20251031 ==&lt;br /&gt;
* Acabem de comentar A06.2&lt;br /&gt;
* [[Introducció a l'ús del Node-RED]]&lt;br /&gt;
* Fem A07.02 i A07.03&lt;br /&gt;
&lt;br /&gt;
== 20251027 ==&lt;br /&gt;
* Acabem A06.02 del [[Recull de pràctiques de 2n de DAM. Curs 2025-2026 | recull de pràctiques]]&lt;br /&gt;
&lt;br /&gt;
'''set(CMAKE_AUTORCC ON)'''&lt;br /&gt;
&lt;br /&gt;
== 20251024 ==&lt;br /&gt;
* Fem A06.02 del [[Recull de pràctiques de 2n de DAM. Curs 2025-2026 | recull de pràctiques]]&lt;br /&gt;
* Canvis al CMakeLists.txt (ho teniu penjat al recull del dia d'avui ''ex04siva.zip''):&lt;br /&gt;
- Afegiu '''set(CMAKE_AUTORCC ON)''' - això processa automàticament els fitxers .qrc- (també és convenient, no necessari a aquesta pràctica,  afegir '''set(CMAKE_AUTOMOC ON)''') a ''CMakeLists.txt''&lt;br /&gt;
&lt;br /&gt;
== 20251017 ==&lt;br /&gt;
* Seguim amb Pr03&lt;br /&gt;
 void Giny::on_btCesar_clicked()&lt;br /&gt;
 {&lt;br /&gt;
    qDebug() &amp;lt;&amp;lt; &amp;quot;Cesar&amp;quot;;&lt;br /&gt;
    //ui-&amp;gt;lbNom-&amp;gt;setText(&amp;quot;César&amp;quot;);&lt;br /&gt;
    n+=2;&lt;br /&gt;
    //ui-&amp;gt;lbNom-&amp;gt;setNum(n);&lt;br /&gt;
    vEscriuNum(n);&lt;br /&gt;
    '''emit senyalNum(n); // &amp;lt;----- !!!!!'''&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
 void Base::vMostraN(int n){&lt;br /&gt;
    //qDebug() &amp;lt;&amp;lt; &amp;quot;Número: &amp;quot; &amp;lt;&amp;lt; QString::number(ui-&amp;gt;spN-&amp;gt;value());&lt;br /&gt;
    qDebug() &amp;lt;&amp;lt; &amp;quot;Número: &amp;quot; &amp;lt;&amp;lt; QString::number(n);&lt;br /&gt;
    '''setN(n); // &amp;lt;-- !!!!!!!'''&lt;br /&gt;
 }&lt;br /&gt;
[https://recull.binefa.cat/files/20251017/pr03b.zip pr03b.zip]&lt;br /&gt;
&lt;br /&gt;
== 20251013 ==&lt;br /&gt;
* Dubtes del dia anterior&lt;br /&gt;
* Exercicis pendents&lt;br /&gt;
&lt;br /&gt;
== 20251006 ==&lt;br /&gt;
* Dubtes del dia anterior&lt;br /&gt;
* Seguim analitzant codis&lt;br /&gt;
* Exercicis pendents&lt;br /&gt;
== 20251003 ==&lt;br /&gt;
* Analitzem [https://recull.binefa.cat/files/20251003/term00_0x.zip term00_0x.zip] i [https://recull.binefa.cat/files/20251003/term01.zip term01.zip].&lt;br /&gt;
* Analitzem [https://recull.binefa.cat/files/20251003/pr00.zip pr00.zip] i [https://recull.binefa.cat/files/20251003/pr00_02.zip pr00_02.zip].&lt;br /&gt;
* Analitzem implementacions GUI en Qt/C++ (02_ .. 03_)&lt;br /&gt;
&lt;br /&gt;
== 20250929 ==&lt;br /&gt;
[http://extensions.snap.berkeley.edu/snap/snap.html#present:Username=jordib&amp;amp;ProjectName=IoT-02_board_noSegur Control de la placa IoT-02 amb Snap!] (Modifiqueu la MAC i poseu-hi la vostra)&lt;br /&gt;
== 20250926 ==&lt;br /&gt;
* [[Instal·lació de l'IDE d'Arduino v2.3.6]].&lt;br /&gt;
* Lliurament de les [[Placa IoT-02 | plaques IoT-02]] que es faran servir durant el curs (al final del curs s'han de tornar).&lt;br /&gt;
* [[Addició de l'ESP32 a l'IDE d'Arduino]] (Instal·leu les versions 2 i 3 del compilador d'Espressif alhora).&lt;br /&gt;
* Prova de programació de microprogramari a la [[Placa IoT-02 | placa IoT-02]].&lt;br /&gt;
* [https://snap.berkeley.edu/snap/snap.html#open:https://raw.githubusercontent.com/jordibinefa/IoT-02/refs/heads/master/codes/snap/07_IoT-02_with_json_Broker1.xml Control amb Snap!]&lt;br /&gt;
----&lt;br /&gt;
* Analitzem [https://recull.binefa.cat/files/20250919/term00_0x.zip term00_0x.zip] i [https://recull.binefa.cat/files/20250919/term01.zip term01.zip].&lt;br /&gt;
&lt;br /&gt;
== 20250922 ==&lt;br /&gt;
[https://recull.binefa.cat/files/20250919/ Recull del dia 20250919] usuari: dam | contrasenya: dam2526&lt;br /&gt;
=== Instal·lació del Node-RED ===&lt;br /&gt;
==== Linux Installers for Node-RED ====&lt;br /&gt;
Per a Debian 13 i Raspberry Pi:&lt;br /&gt;
 sudo apt install build-essential&lt;br /&gt;
 bash &amp;lt;(curl -sL https://github.com/node-red/linux-installers/releases/latest/download/update-nodejs-and-nodered-deb)&lt;br /&gt;
 sudo systemctl enable nodered&lt;br /&gt;
 sudo systemctl start nodered&lt;br /&gt;
[https://github.com/node-red/linux-installers Linux Installers for Node-RED] (GitHub)&lt;br /&gt;
&lt;br /&gt;
==== Running Node-RED locally ====&lt;br /&gt;
[https://nodered.org/docs/getting-started/local Running Node-RED locally] (nodered.org)&lt;br /&gt;
=== Prova de funcionament del Node-RED ===&lt;br /&gt;
[http://localhost:1880/ http://localhost:1880/]&lt;br /&gt;
=== Instal·lació del Node-RED Dashboard 2.0 ===&lt;br /&gt;
El Node-RED diu que la col·lecció de nodes ''node-red-dashboard'' és obsoleta. La versió actual és Node-RED Dashboard 2.0. En el moment de fer aquesta entrada no es pot instal·lar Node-RED Dashboard 2.0 des del mateix gestor del Node-RED.&lt;br /&gt;
&lt;br /&gt;
Una solució és anar al directori ''.node-red'' i fer la instal·lació emprant ''npm''&lt;br /&gt;
 jb@clotfje:~$ '''cd ~/.node-red'''&lt;br /&gt;
 jb@clotfje:~/.node-red$ '''npm install @flowfuse/node-red-dashboard'''&lt;br /&gt;
 &lt;br /&gt;
 added 172 packages, and audited 173 packages in 7s&lt;br /&gt;
 &lt;br /&gt;
 20 packages are looking for funding&lt;br /&gt;
   run `npm fund` for details&lt;br /&gt;
 &lt;br /&gt;
 found 0 vulnerabilities&lt;br /&gt;
 jb@clotfje:~/.node-red$ '''sudo systemctl stop nodered'''&lt;br /&gt;
 jb@clotfje:~/.node-red$ '''sudo systemctl start nodered'''&lt;br /&gt;
 jb@clotfje:~/.node-red$&lt;br /&gt;
=== Connectant Snap! i Node-RED mitjançant MQTT ===&lt;br /&gt;
[https://snap.berkeley.edu/snap/snap.html Snap!]&lt;br /&gt;
== 20250919 ==&lt;br /&gt;
[https://recull.binefa.cat/files/20250919/ Recull del dia 20250919] usuari: dam | contrasenya: dam2526&lt;br /&gt;
&lt;br /&gt;
'''La nota final de l'Espai d'Habilitats 3 (EH3) es calcula fent que el 40% de la nota siguin les pràctiques del recull de pràctiques, el 30% l'examen del tercer trimestre, el 20% l'examen del segon trimestre i el 10% l'examen del primer trimestre. En cap cas es farà el càlcul amb resultat d'aprovat si alguna d'aquestes notes no és superior a 3'''. ([https://docs.google.com/document/d/1goYy4VENADhMvjt29BTquHPc_zuM4KbzlSL1B0VO8Lw/edit?tab=t.0 Document al Drive])&lt;br /&gt;
=== Distribució de M07UF1 i M13 al curs 2024-2025 (obsolet) ===&lt;br /&gt;
[[Distribució de M07UF1 i M13 al curs 2024-2025 de 2n de DAM]]&lt;br /&gt;
=== Qt ===&lt;br /&gt;
[https://www.qt.io/qt-educational-license Qt Educational License]&lt;br /&gt;
&lt;br /&gt;
El '''Qt Creator''' serà l'IDE que farem servir per a desenvolupar el '''disseny d'aplicacions gràfiques d'usuari''':&lt;br /&gt;
&lt;br /&gt;
Aneu a la pàgina [https://www.qt.io/download-open-source Qt for Open Source Development] i cerqueu '''Download the Qt Online Installer'''. Baixeu-vos-ho i instal·leu-ho (us demana registrar-vos per a poder-ho instal·lar).&lt;br /&gt;
&lt;br /&gt;
[https://www.binefa.cat/curs2022-2023/projecteGlobal/dam2223/doc/projecteGlobal/activitats/a06/ Activitat 6]&lt;br /&gt;
&lt;br /&gt;
Paquets que manquen per a fer funcionar les Qt a l'Ubuntu: &lt;br /&gt;
 sudo apt install libx11-xcb-dev libglu1-mesa-dev libxcb-xinerama0&lt;br /&gt;
&lt;br /&gt;
=== IoT ===&lt;br /&gt;
* [[Placa IoT-02]]&lt;br /&gt;
&lt;br /&gt;
* NodeRED ([https://nodered.org/docs/getting-started/local Running Node-RED locally])&lt;br /&gt;
&lt;br /&gt;
[https://nodejs.org/en/download/ Instal·lació de Node.js] [https://tecadmin.net/install-latest-nodejs-npm-on-debian/ Guia d'instal·lació de node i npm]&lt;br /&gt;
&lt;br /&gt;
[https://nodered.org/docs/faq/node-versions Supported Node versions on NodeRed]&lt;br /&gt;
&lt;br /&gt;
Verificació:&lt;br /&gt;
 node --version&lt;br /&gt;
 npm --version&lt;br /&gt;
&lt;br /&gt;
==== Instal·lació i funcionament del NodeRed autònom ====&lt;br /&gt;
 ecat@iot-ecat:~$ '''mkdir bin'''&lt;br /&gt;
 ecat@iot-ecat:~$ '''cd bin'''&lt;br /&gt;
 ecat@iot-ecat:~/bin$ '''sudo apt install unzip'''&lt;br /&gt;
 ecat@iot-ecat:~/bin$ '''mkdir nodered-ui'''&lt;br /&gt;
 ecat@iot-ecat:~/bin$ '''cd nodered-ui'''&lt;br /&gt;
 ecat@iot-ecat:~/bin/nodered-ui$ '''wget https://www.binefa.cat/IoT/nodeRed/node_red_ui.zip'''&lt;br /&gt;
 ecat@iot-ecat:~/bin/nodered-ui$ '''unzip node_red_ui.zip'''&lt;br /&gt;
 ecat@iot-ecat:~/bin/nodered-ui$ '''node node_modules/node-red/red.js --userDir node_modules/node-red/data --settings node_modules/node-red/settings.js -v --port 2222 --title elmeuTitol --safe flows_meuTitol.json'''&lt;br /&gt;
&lt;br /&gt;
Si hi ha problemes de confiança amb el certificat al descarrega l'arxiu .zip, hi podeu afegir l'opció '''--no-check-certificate''':&lt;br /&gt;
&lt;br /&gt;
 wget --no-check-certificate https://www.binefa.cat/IoT/nodeRed/node_red_ui.zip&lt;br /&gt;
&lt;br /&gt;
[https://www.binefa.cat/curs2022-2023/projecteGlobal/dam2223/doc/projecteGlobal/activitats/a07/ Activitat 7]&lt;br /&gt;
==== Credencials IoT ====&lt;br /&gt;
 #define EAP_ANONYMOUS_IDENTITY &amp;quot;CL-Internet_de_les_coses&amp;quot;&lt;br /&gt;
 #define EAP_IDENTITY &amp;quot;CL-Internet_de_les_coses&amp;quot;&lt;br /&gt;
 #define EAP_PASSWORD &amp;quot;CLioT2022_&amp;quot;&lt;br /&gt;
 #define EAP_USERNAME &amp;quot;CL-Internet_de_les_coses&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
 const char* ssid = &amp;quot;IOTJE&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
= Repositori de codis fet a classe durant el curs =&lt;br /&gt;
[https://recull.binefa.cat/files/ Codis fets a les classes de 2n de DAM] usuari: dam | contrasenya: dam2526&lt;br /&gt;
= Documentació =&lt;br /&gt;
[https://drive.google.com/drive/folders/1vaeeJgMHMJMWCO6fOtQkrzfeP9_HVa5a Documentació EH3_IoT Lab]&lt;br /&gt;
&lt;br /&gt;
[[Alguns exàmens Qt/QML]]&lt;br /&gt;
&lt;br /&gt;
[https://drive.google.com/drive/folders/1Wo6ncP4mHNnmrsW6D3Y5KpjeXyuDSR1C Curs2024-2025]&lt;br /&gt;
[https://docs.google.com/spreadsheets/d/16DA_uFnKB23bx7VaH3bfJ4qMuuffrgRh/edit?gid=1882428378#gid=1882428378 Eina d'avaluació GP1]&lt;br /&gt;
[https://drive.google.com/drive/u/0/folders/1YPZVFpC3KCQK9tVXpSO6wuzEHjvPaIv2 Curs 2024-2025 - Departament]&lt;br /&gt;
&lt;br /&gt;
[https://drive.google.com/drive/folders/1P4FlwnGsX4qXIXBJJL9vS8KK1R-OUeZM Drive curs 2023-2024] ([https://web2.alexiaedu.com/ACWeb/paginas/Home/HomeMetro.aspx Alèxia], [https://sac.net.fje.edu/v1.0/#/home/ SAC]). [https://drive.google.com/drive/folders/1dcGDwZBWcG3utW6OxXBkQey7oHa_3ZNx Eina d'avaluació GP1]&lt;br /&gt;
&lt;br /&gt;
[https://drive.google.com/drive/folders/0AG8LE_yosU7JUk9PVA novaFP ASIX/DAW/DAM]&lt;br /&gt;
&lt;br /&gt;
[https://drive.google.com/drive/folders/1plnk2yt-SlPEwJDE7ILUkrGRsm2hf1fw Totes les llistes]&lt;br /&gt;
&lt;br /&gt;
[[Distribució de M07UF1 i M13 al curs 2022-2023 de 2n de DAM]]&lt;br /&gt;
&lt;br /&gt;
[[Recull de pràctiques de 2n de DAM. Curs 2022-2023]]&lt;br /&gt;
&lt;br /&gt;
[https://drive.google.com/drive/folders/1vorYyIsiOUU6Ia3ViqDCpfG-gFUqnroc Projecte global GP1. IoT]&lt;br /&gt;
&lt;br /&gt;
[http://192.168.10.17:9191/app?service=page/UserWebPrint Impressió]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- [https://docs.google.com/spreadsheets/d/1jxpQM8EaMrWeWnBrbSBBbYi8lwblSla3/edit#gid=1066652034 Seguiment de tutories]&lt;br /&gt;
&lt;br /&gt;
[https://docs.google.com/forms/d/1VwVSCWRftkxRUdqQKi_Uqi8LboIrHDh53ZFdei303gA/edit Enquesta del 17 de novembre de 2022] --&amp;gt;&lt;br /&gt;
== Qt/QML ==&lt;br /&gt;
[https://www.youtube.com/watch?v=gzvjb5qMaIw How To Install the Qt Educational License]&lt;br /&gt;
&lt;br /&gt;
Paquets que manquen per a fer funcionar les Qt a l'Ubuntu: &lt;br /&gt;
 sudo apt install libx11-xcb-dev libglu1-mesa-dev libxcb-xinerama0&lt;br /&gt;
 sudo apt install libxcb-cursor0 libxcb-cursor-dev&lt;br /&gt;
[https://youtu.be/b936UY3YZe4 Activació de l'editor QML al QtCreator 6]&lt;br /&gt;
&lt;br /&gt;
[http://zetcode.com/gui/qt5/ Qt5] de [https://twitter.com/janbodnar Jan Bodnar]&lt;br /&gt;
&lt;br /&gt;
[[Vídeos QML]]&lt;br /&gt;
&lt;br /&gt;
[https://qmlbook.github.io/ Qt5 Cadaques!] A Book about Qt5&lt;br /&gt;
&lt;br /&gt;
[http://zetcode.com/gui/qtquick/ Qt Quick tutorial] de [https://twitter.com/janbodnar Jan Bodnar]&lt;br /&gt;
&lt;br /&gt;
[http://zetcode.com/gui/pyqt5/ PyQt5] de [https://twitter.com/janbodnar Jan Bodnar]&lt;br /&gt;
&lt;br /&gt;
[[Instal·lació de QtMQtt a les Qt]]&lt;br /&gt;
&lt;br /&gt;
=== Qt for Android ===&lt;br /&gt;
[https://doc.qt.io/qt-6/android.html Qt for Android]&lt;br /&gt;
&lt;br /&gt;
[https://doc.qt.io/qt-6/android-getting-started.html Getting Started with Qt for Android]&lt;br /&gt;
&lt;br /&gt;
[https://doc.qt.io/qt-6.5/android-getting-started.html Getting Started with Qt6.5 for Android]&lt;br /&gt;
&lt;br /&gt;
[[Instal·lació de les eines mínimes (SDK, NDK i eines de terminal) per a fer aplicacions en Qt per a Android]]&lt;br /&gt;
&lt;br /&gt;
=== Qt for WebAssembly ===&lt;br /&gt;
[https://wiki.qt.io/Qt_for_WebAssembly Qt for WebAssembly]&lt;br /&gt;
&lt;br /&gt;
=== json ===&lt;br /&gt;
[http://erickveil.github.io/2016/04/06/How-To-Manipulate-JSON-With-C++-and-Qt.html How To Manipulate JSON With C++ and Qt]&lt;br /&gt;
&lt;br /&gt;
=== QProcess ===&lt;br /&gt;
[https://gist.github.com/ynonp/8148340 QProcess example]&lt;br /&gt;
&lt;br /&gt;
[https://www.bogotobogo.com/Qt/Qt5_QProcess_QFileDialog_QTextEdit_FFmpeg.php Qt5 tutorial FFmpeg converter using QProcess - 2020]&lt;br /&gt;
&lt;br /&gt;
=== CMake ===&lt;br /&gt;
Cal fer la instal·lació d'aquests paquets a Debian 11:&lt;br /&gt;
 sudo apt-get install '''libqt5svg5-dev qtscript5-dev'''&lt;br /&gt;
 sudo apt-get install '^libxcb.*-dev' libx11-xcb-dev libglu1-mesa-dev libxrender-dev libxi-dev libxkbcommon-dev libxkbcommon-x11-dev&lt;br /&gt;
 sudo apt purge ibus&lt;br /&gt;
=== Vídeos externs per aprendre QML ===&lt;br /&gt;
(Gentilesa d'en Raül Gil García)&lt;br /&gt;
* [https://www.youtube.com/playlist?list=PL54fdmMKYUJvahGcI0cZCwrNesEsNd42V (10) Tutorial QML - YouTube]&lt;br /&gt;
* [https://www.youtube.com/playlist?list=PLxkHKJE0D3pCkRIFzEfpSly687BUjxUzk qmlscene]&lt;br /&gt;
* [https://www.youtube.com/@techcoderhub/videos Tesla Model 3 Dashboard with Advanced Map Integration and Seamless Music Control Using QT QML]&lt;br /&gt;
&lt;br /&gt;
== IoT ==&lt;br /&gt;
[https://www.binefa.cat/IoT/nodeRed/nodeRed01.pdf Introducció al Node-RED]&lt;br /&gt;
&lt;br /&gt;
[https://www.binefa.cat/IoT/teoria/ethernetTcpUdp_00.pdf TCP/UDP Capa de transport d'Ethernet]&lt;br /&gt;
&lt;br /&gt;
[https://www.binefa.cat/IoT/teoria/mqtt_00.pdf Introducció a MQTT]&lt;br /&gt;
&lt;br /&gt;
[https://wiki.binefa.cat/index.php?title=Afegint_la_targeta_ESP8266_a_l%27IDE_d%27Arduino Afegint la targeta ESP8266 a l'IDE d'Arduino] (NodeMCU1.0)&lt;br /&gt;
&lt;br /&gt;
[https://blog.miguelgrinberg.com/post/micropython-and-the-internet-of-things-part-i-welcome Micropython and the Internet of Things]&lt;br /&gt;
&lt;br /&gt;
[https://wiki.binefa.cat/index.php?title=SCADA_fent_servir_Python_QML_i_Arduino SCADA fent servir Python QML i Arduino]&lt;br /&gt;
&lt;br /&gt;
[http://silanus.fr/sin/?p=1194 MQTT avec Qt]&lt;br /&gt;
&lt;br /&gt;
[[Introducció al testing]]&lt;br /&gt;
=== Placa IoT-02 ===&lt;br /&gt;
[[Placa IoT-02]]&lt;br /&gt;
&lt;br /&gt;
[https://www.binefa.cat/IoT/IoT-02/info/iot02_00_ca.pdf Introducció a la placa IoT-02]&lt;br /&gt;
&lt;br /&gt;
Per a la programació amb l'IDE d'Arduino: https://dl.espressif.com/dl/package_esp32_index.json&lt;br /&gt;
&lt;br /&gt;
[https://www.things.cat/index.php/P%C3%A0gina_principal#MicroPython_2 Programació en MicroPython]&lt;br /&gt;
&lt;br /&gt;
=== '''LoRaWAN''' ===&lt;br /&gt;
[[LoRa 2021-2022 | LoRa 2022-2023]]&lt;br /&gt;
&lt;br /&gt;
[https://eu1.cloud.thethings.network/ Consola de The Things Stack (Community Edition)] de [https://www.thethingsnetwork.org/ The Things Network]&lt;br /&gt;
&lt;br /&gt;
[https://www.binefa.cat/IoT/lora/lorawan/lorawan01d.pdf Presentació LoRaWAN (esborrany v0.4)]&lt;br /&gt;
&lt;br /&gt;
[https://www.binefa.cat/IoT/05_lorawan_usPractic.pdf Ús pràctic de LoRaWAN TTNv2]&lt;br /&gt;
&lt;br /&gt;
[https://recull.binefa.cat/files/lora/intro/ Recull introductori per a treballar amb LoRa] ( usuari: ''dam'' / contrasenya: ''dam2122'')&lt;br /&gt;
&lt;br /&gt;
[[Recull de pràctiques de 2n de DAM. Curs 2021-2022]]&lt;br /&gt;
&lt;br /&gt;
[[Transmissió d'un número real de tipus IEEE-754 (4 bytes) i llur recuperació a NodeRED]]&lt;br /&gt;
&lt;br /&gt;
[[Downlink LoRaWAN fent servir TTSv3]]&lt;/div&gt;</summary>
		<author><name>Jordi Binefa</name></author>
		
	</entry>
	<entry>
		<id>https://www.binefa.com/index.php?title=16_/_5_/_2026_-_IoT,_Embedded_Systems,_Edge_y_Cloud&amp;diff=12291</id>
		<title>16 / 5 / 2026 - IoT, Embedded Systems, Edge y Cloud</title>
		<link rel="alternate" type="text/html" href="https://www.binefa.com/index.php?title=16_/_5_/_2026_-_IoT,_Embedded_Systems,_Edge_y_Cloud&amp;diff=12291"/>
		<updated>2026-05-09T19:56:14Z</updated>

		<summary type="html">&lt;p&gt;Jordi Binefa: /* Verificación de nodos instalados */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Conceptos previos (15 / 5 / 2026) =&lt;br /&gt;
Acceso a la base de datos del VPS del máster&lt;br /&gt;
&lt;br /&gt;
= Temario (16 / 5 / 2026) =&lt;br /&gt;
[https://meet.google.com/rke-afvm-eou Videoconferencia]&lt;br /&gt;
&lt;br /&gt;
== Repaso del día anterior ==&lt;br /&gt;
[https://www.binefa.cat/training/iot02/pdf/iot02_00_es.pdf Introducción a la placa IoT-02]&lt;br /&gt;
&lt;br /&gt;
[[El protocolo MQTT]]&lt;br /&gt;
&lt;br /&gt;
== Conexión entre la placa IoT-02 y Snap! mediante MQTT ==&lt;br /&gt;
&amp;lt;!-- '''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;
&lt;br /&gt;
* Broker MQTT púplico:&lt;br /&gt;
** MQTT TCP por el puerto no seguro 1883: '''broker.emqx.io'''&lt;br /&gt;
** MQTT WSS por puerto seguro: '''wss://broker.emqx.io:8084/mqtt'''&lt;br /&gt;
* Broker MQTT en el VPS del máster:&lt;br /&gt;
** MQTT TCP por el puerto no seguro 1883: '''master.iotvertebrae.com'''&lt;br /&gt;
** MQTT WSS por puerto seguro: '''wss://master.iotvertebrae.com:9002'''&lt;br /&gt;
&amp;lt;!-- '''Nuevo firmware de la placa IoT-02 para el día de hoy''': [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]&lt;br /&gt;
[[Conexión entre la placa IoT-02 y Snap! v8 mediante MQTT]]&lt;br /&gt;
[[Conexión entre la placa IoT-02 y Snap! v9 mediante MQTT]] --&amp;gt;&lt;br /&gt;
[https://snap.berkeley.edu/snap/snap.html#open:https://wa.binefa.cat/snapCodes/IoT-02_board.xml Código Snap! v10] El [https://github.com/jordibinefa/IoT-02/tree/master/codes/IoT-02_mqtt_sync_upcSchool_broker1 ''firmware'' IoT-02_mqtt_sync_upcSchool_broker1] enseña el número MAC por la pantalla OLED cuando la placa IoT-02 se conecta a vuestra wifi. (Cambiar el archivo [https://github.com/jordibinefa/IoT-02/blob/master/codes/IoT-02_mqtt_sync_upcSchool_broker1/IoT-02_wifiCredentials.h IoT-02_wifiCredentials.h] en la línea 21 substituyendo ''iotcat'' por el nombre de la SSID de vuestra wifi y ''1234567890a'' por vuestra contraseña).&lt;br /&gt;
&lt;br /&gt;
== Uso de la base de datos MariaDB para almacenar y leer datos IoT ==&lt;br /&gt;
[[Uso de MariaDB en el VPS del Máster de Industria 4.0 el curso 2025-2026 | Uso de MariaDB en el VPS del Máster de Industria 4.0]]&lt;br /&gt;
&amp;lt;!-- [[Uso de MariaDB en el VPS del Máster de Industria 4.0 el curso 2023-2024]]&lt;br /&gt;
[[Uso de MariaDB en el VPS del Máster de Industria 4.0 el curso 2022-2023 | Uso de MariaDB en el VPS del Máster de Industria 4.0 el curso 2023-2024]]--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Node-RED ==&lt;br /&gt;
[[Asignación de puertos para el curso 2025-2026 | Asignación de puertos para este curso]]&lt;br /&gt;
&amp;lt;!--[[Asignación de puertos para el curso 2023-2024]]&lt;br /&gt;
[[Asignación de puertos para el curso 2022-2023]]--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Uso del Node-RED ===&lt;br /&gt;
[[Uso del NodeRED (2024) | Uso del Node-RED]]&lt;br /&gt;
&amp;lt;!--[[Uso del NodeRED (2023) | Uso del Node-RED]]--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Uso de la base de datos MariaDB desde Node-RED===&lt;br /&gt;
[[Uso de la base de datos MariaDB desde NodeRED (2023) | Uso de la base de datos MariaDB desde Node-RED]]&lt;br /&gt;
&amp;lt;!-- == Telegram ==&lt;br /&gt;
[[Uso de Telegram desde NodeRED]]--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Repaso y dudas de la clase invertida ==&lt;br /&gt;
=== Verificación de nodos instalados ===&lt;br /&gt;
Antes de continuar verificamos que ya tenemos instalado el nodo de MySQL ('''node-red-node-mysql''') y los nodos del panel de control ('''node-red-dashboard''' -marcado como ''deprecated''-).&lt;br /&gt;
==== Nodo node-red-node-mysql ====&lt;br /&gt;
[https://flows.nodered.org/node/node-red-node-mysql Documentación oficial del nodo ''node-red-node-mysql'']&lt;br /&gt;
&lt;br /&gt;
[[Image:10MariaDbNodeRed00.png|center|thumb|Instalación de los nodos de MariaDB (''MySQL'') en NodeRED]]&lt;br /&gt;
[[Image:11nodoMariaDbNodeRed.png|center|thumb|Aspecto del nodo MySQL en NodeRED]]&lt;br /&gt;
&lt;br /&gt;
==== Nodos node-red-dashboard ====&lt;br /&gt;
[https://flows.nodered.org/node/node-red-dashboard Documentación oficial de los nodos ''node-red-dashboard'']&lt;br /&gt;
&lt;br /&gt;
[[Image:NodosDashboard.png|center|thumb|Nodos del panel de control (''Dashboard'') en NodeRED]]&lt;br /&gt;
&lt;br /&gt;
=== Acceso al VPS del máster ===&lt;br /&gt;
 ssh -o ServerAliveInterval=30 convidat@vps656540.ovh.net&lt;br /&gt;
o&lt;br /&gt;
 ssh convidat@vps656540.ovh.net&lt;br /&gt;
=== Acceso a la base de datos del VPS del máster ===&lt;br /&gt;
* Con permisos de lectura y escritura:&lt;br /&gt;
 mysql -u iot -p&lt;br /&gt;
* Con permisos de lectura:&lt;br /&gt;
 mysql -u convidat -p&lt;br /&gt;
&lt;br /&gt;
=== Repaso ===&lt;br /&gt;
* Uso de JSON con Snap!&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;
&lt;br /&gt;
* Aleatorización de múltiples datos controlada por el panel de control&lt;br /&gt;
&lt;br /&gt;
* Escritura síncrona de múltiples datos asíncronos al mismo tiempo. Uso del formato de datos json&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
* Telegram--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Ejercicios ==&lt;br /&gt;
=== Ejercicio de '''Snap! con MQTT''' ===&lt;br /&gt;
* Mediante Snap! hacer que en la pantalla aparezca, de forma infinita y con una cadencia de dos segundos, el porcentaje de luz leída por la LDR y después la temperatura en grados centígrados.&lt;br /&gt;
&lt;br /&gt;
=== Ejercicios de '''NodeRED''' ===&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;
==== 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;
==== Ejercicio '''NodeRED-03''' ====&lt;br /&gt;
* Implementad una pasarela (''gateway'') HTTP/MQTT para cambiar el estado de los leds y el relé biestable de la placa IoT-02.&lt;br /&gt;
&lt;br /&gt;
==== Ejercicio '''NodeRED-04''' ====&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;br /&gt;
&lt;br /&gt;
==== Ejercicio '''NodeRED-05''' ====&lt;br /&gt;
* Implementar un flujo de NodeRED que supervise continuamente el valor de la LDR. Introducir dos ''sliders'' para fijar umbrales. Cuando la luz supere el umbral establecido el led rojo se enciende y el relé biestable cambia a SET. Cuando la luz baje del segundo umbral establecido el led rojo se apaga (se enciende el verde) y el relé biestable cambia a RESET.&lt;br /&gt;
&lt;br /&gt;
==== Ejercicio '''NodeRED-06''' ====&lt;br /&gt;
* Implementar un flujo de NodeRED que permita la entrada de un texto y con un botón lo envie a la pantalla OLED.&lt;br /&gt;
&lt;br /&gt;
==== Ejercicio '''NodeRED-07''' ====&lt;br /&gt;
* Implementar un flujo de NodeRED que permita seleccionar un mode de funcionamiento automático o manual. En manual se puede encender y apagar el led blanco mediante un ''switch''. En modo automático el led blanco se enciende o se apaga en función de un umbral consignado mediante un ''slider''. (Para habilitar o inhabilitar un ''switch'' se puede usar ''msg.enabled'').&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--=== Ejercicios '''Telegram''' ===&lt;br /&gt;
* Desde el chat del bot: Al enviar la orden '''/ledWon''' se enciende el led blanco de la placa IoT-02. Al enviar la orden '''/ledWoff''' se apaga el led blanco.&lt;br /&gt;
&lt;br /&gt;
* Desde el chat del bot: Al enviar la orden '''/ledReleSet''' el relé se pone en estado SET. Al enviar la orden '''/ledReleReset''' el relé se pone en estado RESET.&lt;br /&gt;
&lt;br /&gt;
* El chat de vuestro bot recibe un mensaje cuando se aprieta vuestro botón I34 y cuando se deja de apretar.&lt;br /&gt;
&lt;br /&gt;
* Desde el chat del grupo donde pertenece vuestro bot: Al enviar la orden '''/entradas''' el bot contesta con los estados de los botones y la temperatura de la placa.--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Comentario de la práctica para el próximo día ===&lt;br /&gt;
El enunciado estará en breve en el campus. Se comenzará después de haber usado Grafana y Telegram.&lt;/div&gt;</summary>
		<author><name>Jordi Binefa</name></author>
		
	</entry>
	<entry>
		<id>https://www.binefa.com/index.php?title=16_/_5_/_2026_-_IoT,_Embedded_Systems,_Edge_y_Cloud&amp;diff=12290</id>
		<title>16 / 5 / 2026 - IoT, Embedded Systems, Edge y Cloud</title>
		<link rel="alternate" type="text/html" href="https://www.binefa.com/index.php?title=16_/_5_/_2026_-_IoT,_Embedded_Systems,_Edge_y_Cloud&amp;diff=12290"/>
		<updated>2026-05-09T19:56:04Z</updated>

		<summary type="html">&lt;p&gt;Jordi Binefa: /* Verificación de nodos instalados */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Conceptos previos (15 / 5 / 2026) =&lt;br /&gt;
Acceso a la base de datos del VPS del máster&lt;br /&gt;
&lt;br /&gt;
= Temario (16 / 5 / 2026) =&lt;br /&gt;
[https://meet.google.com/rke-afvm-eou Videoconferencia]&lt;br /&gt;
&lt;br /&gt;
== Repaso del día anterior ==&lt;br /&gt;
[https://www.binefa.cat/training/iot02/pdf/iot02_00_es.pdf Introducción a la placa IoT-02]&lt;br /&gt;
&lt;br /&gt;
[[El protocolo MQTT]]&lt;br /&gt;
&lt;br /&gt;
== Conexión entre la placa IoT-02 y Snap! mediante MQTT ==&lt;br /&gt;
&amp;lt;!-- '''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;
&lt;br /&gt;
* Broker MQTT púplico:&lt;br /&gt;
** MQTT TCP por el puerto no seguro 1883: '''broker.emqx.io'''&lt;br /&gt;
** MQTT WSS por puerto seguro: '''wss://broker.emqx.io:8084/mqtt'''&lt;br /&gt;
* Broker MQTT en el VPS del máster:&lt;br /&gt;
** MQTT TCP por el puerto no seguro 1883: '''master.iotvertebrae.com'''&lt;br /&gt;
** MQTT WSS por puerto seguro: '''wss://master.iotvertebrae.com:9002'''&lt;br /&gt;
&amp;lt;!-- '''Nuevo firmware de la placa IoT-02 para el día de hoy''': [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]&lt;br /&gt;
[[Conexión entre la placa IoT-02 y Snap! v8 mediante MQTT]]&lt;br /&gt;
[[Conexión entre la placa IoT-02 y Snap! v9 mediante MQTT]] --&amp;gt;&lt;br /&gt;
[https://snap.berkeley.edu/snap/snap.html#open:https://wa.binefa.cat/snapCodes/IoT-02_board.xml Código Snap! v10] El [https://github.com/jordibinefa/IoT-02/tree/master/codes/IoT-02_mqtt_sync_upcSchool_broker1 ''firmware'' IoT-02_mqtt_sync_upcSchool_broker1] enseña el número MAC por la pantalla OLED cuando la placa IoT-02 se conecta a vuestra wifi. (Cambiar el archivo [https://github.com/jordibinefa/IoT-02/blob/master/codes/IoT-02_mqtt_sync_upcSchool_broker1/IoT-02_wifiCredentials.h IoT-02_wifiCredentials.h] en la línea 21 substituyendo ''iotcat'' por el nombre de la SSID de vuestra wifi y ''1234567890a'' por vuestra contraseña).&lt;br /&gt;
&lt;br /&gt;
== Uso de la base de datos MariaDB para almacenar y leer datos IoT ==&lt;br /&gt;
[[Uso de MariaDB en el VPS del Máster de Industria 4.0 el curso 2025-2026 | Uso de MariaDB en el VPS del Máster de Industria 4.0]]&lt;br /&gt;
&amp;lt;!-- [[Uso de MariaDB en el VPS del Máster de Industria 4.0 el curso 2023-2024]]&lt;br /&gt;
[[Uso de MariaDB en el VPS del Máster de Industria 4.0 el curso 2022-2023 | Uso de MariaDB en el VPS del Máster de Industria 4.0 el curso 2023-2024]]--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Node-RED ==&lt;br /&gt;
[[Asignación de puertos para el curso 2025-2026 | Asignación de puertos para este curso]]&lt;br /&gt;
&amp;lt;!--[[Asignación de puertos para el curso 2023-2024]]&lt;br /&gt;
[[Asignación de puertos para el curso 2022-2023]]--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Uso del Node-RED ===&lt;br /&gt;
[[Uso del NodeRED (2024) | Uso del Node-RED]]&lt;br /&gt;
&amp;lt;!--[[Uso del NodeRED (2023) | Uso del Node-RED]]--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Uso de la base de datos MariaDB desde Node-RED===&lt;br /&gt;
[[Uso de la base de datos MariaDB desde NodeRED (2023) | Uso de la base de datos MariaDB desde Node-RED]]&lt;br /&gt;
&amp;lt;!-- == Telegram ==&lt;br /&gt;
[[Uso de Telegram desde NodeRED]]--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Repaso y dudas de la clase invertida ==&lt;br /&gt;
=== Verificación de nodos instalados ===&lt;br /&gt;
Antes de continuar verificamos que ya tenemos instalado el nodo de MySQL ('''node-red-node-mysql''') y los nodos del panel de control ('''node-red-dashboard''' -marcado como ''deprecated'').&lt;br /&gt;
==== Nodo node-red-node-mysql ====&lt;br /&gt;
[https://flows.nodered.org/node/node-red-node-mysql Documentación oficial del nodo ''node-red-node-mysql'']&lt;br /&gt;
&lt;br /&gt;
[[Image:10MariaDbNodeRed00.png|center|thumb|Instalación de los nodos de MariaDB (''MySQL'') en NodeRED]]&lt;br /&gt;
[[Image:11nodoMariaDbNodeRed.png|center|thumb|Aspecto del nodo MySQL en NodeRED]]&lt;br /&gt;
&lt;br /&gt;
==== Nodos node-red-dashboard ====&lt;br /&gt;
[https://flows.nodered.org/node/node-red-dashboard Documentación oficial de los nodos ''node-red-dashboard'']&lt;br /&gt;
&lt;br /&gt;
[[Image:NodosDashboard.png|center|thumb|Nodos del panel de control (''Dashboard'') en NodeRED]]&lt;br /&gt;
&lt;br /&gt;
=== Acceso al VPS del máster ===&lt;br /&gt;
 ssh -o ServerAliveInterval=30 convidat@vps656540.ovh.net&lt;br /&gt;
o&lt;br /&gt;
 ssh convidat@vps656540.ovh.net&lt;br /&gt;
=== Acceso a la base de datos del VPS del máster ===&lt;br /&gt;
* Con permisos de lectura y escritura:&lt;br /&gt;
 mysql -u iot -p&lt;br /&gt;
* Con permisos de lectura:&lt;br /&gt;
 mysql -u convidat -p&lt;br /&gt;
&lt;br /&gt;
=== Repaso ===&lt;br /&gt;
* Uso de JSON con Snap!&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;
&lt;br /&gt;
* Aleatorización de múltiples datos controlada por el panel de control&lt;br /&gt;
&lt;br /&gt;
* Escritura síncrona de múltiples datos asíncronos al mismo tiempo. Uso del formato de datos json&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
* Telegram--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Ejercicios ==&lt;br /&gt;
=== Ejercicio de '''Snap! con MQTT''' ===&lt;br /&gt;
* Mediante Snap! hacer que en la pantalla aparezca, de forma infinita y con una cadencia de dos segundos, el porcentaje de luz leída por la LDR y después la temperatura en grados centígrados.&lt;br /&gt;
&lt;br /&gt;
=== Ejercicios de '''NodeRED''' ===&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;
==== 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;
==== Ejercicio '''NodeRED-03''' ====&lt;br /&gt;
* Implementad una pasarela (''gateway'') HTTP/MQTT para cambiar el estado de los leds y el relé biestable de la placa IoT-02.&lt;br /&gt;
&lt;br /&gt;
==== Ejercicio '''NodeRED-04''' ====&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;br /&gt;
&lt;br /&gt;
==== Ejercicio '''NodeRED-05''' ====&lt;br /&gt;
* Implementar un flujo de NodeRED que supervise continuamente el valor de la LDR. Introducir dos ''sliders'' para fijar umbrales. Cuando la luz supere el umbral establecido el led rojo se enciende y el relé biestable cambia a SET. Cuando la luz baje del segundo umbral establecido el led rojo se apaga (se enciende el verde) y el relé biestable cambia a RESET.&lt;br /&gt;
&lt;br /&gt;
==== Ejercicio '''NodeRED-06''' ====&lt;br /&gt;
* Implementar un flujo de NodeRED que permita la entrada de un texto y con un botón lo envie a la pantalla OLED.&lt;br /&gt;
&lt;br /&gt;
==== Ejercicio '''NodeRED-07''' ====&lt;br /&gt;
* Implementar un flujo de NodeRED que permita seleccionar un mode de funcionamiento automático o manual. En manual se puede encender y apagar el led blanco mediante un ''switch''. En modo automático el led blanco se enciende o se apaga en función de un umbral consignado mediante un ''slider''. (Para habilitar o inhabilitar un ''switch'' se puede usar ''msg.enabled'').&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--=== Ejercicios '''Telegram''' ===&lt;br /&gt;
* Desde el chat del bot: Al enviar la orden '''/ledWon''' se enciende el led blanco de la placa IoT-02. Al enviar la orden '''/ledWoff''' se apaga el led blanco.&lt;br /&gt;
&lt;br /&gt;
* Desde el chat del bot: Al enviar la orden '''/ledReleSet''' el relé se pone en estado SET. Al enviar la orden '''/ledReleReset''' el relé se pone en estado RESET.&lt;br /&gt;
&lt;br /&gt;
* El chat de vuestro bot recibe un mensaje cuando se aprieta vuestro botón I34 y cuando se deja de apretar.&lt;br /&gt;
&lt;br /&gt;
* Desde el chat del grupo donde pertenece vuestro bot: Al enviar la orden '''/entradas''' el bot contesta con los estados de los botones y la temperatura de la placa.--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Comentario de la práctica para el próximo día ===&lt;br /&gt;
El enunciado estará en breve en el campus. Se comenzará después de haber usado Grafana y Telegram.&lt;/div&gt;</summary>
		<author><name>Jordi Binefa</name></author>
		
	</entry>
	<entry>
		<id>https://www.binefa.com/index.php?title=16_/_5_/_2026_-_IoT,_Embedded_Systems,_Edge_y_Cloud&amp;diff=12289</id>
		<title>16 / 5 / 2026 - IoT, Embedded Systems, Edge y Cloud</title>
		<link rel="alternate" type="text/html" href="https://www.binefa.com/index.php?title=16_/_5_/_2026_-_IoT,_Embedded_Systems,_Edge_y_Cloud&amp;diff=12289"/>
		<updated>2026-05-09T19:54:52Z</updated>

		<summary type="html">&lt;p&gt;Jordi Binefa: /* Node-RED */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Conceptos previos (15 / 5 / 2026) =&lt;br /&gt;
Acceso a la base de datos del VPS del máster&lt;br /&gt;
&lt;br /&gt;
= Temario (16 / 5 / 2026) =&lt;br /&gt;
[https://meet.google.com/rke-afvm-eou Videoconferencia]&lt;br /&gt;
&lt;br /&gt;
== Repaso del día anterior ==&lt;br /&gt;
[https://www.binefa.cat/training/iot02/pdf/iot02_00_es.pdf Introducción a la placa IoT-02]&lt;br /&gt;
&lt;br /&gt;
[[El protocolo MQTT]]&lt;br /&gt;
&lt;br /&gt;
== Conexión entre la placa IoT-02 y Snap! mediante MQTT ==&lt;br /&gt;
&amp;lt;!-- '''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;
&lt;br /&gt;
* Broker MQTT púplico:&lt;br /&gt;
** MQTT TCP por el puerto no seguro 1883: '''broker.emqx.io'''&lt;br /&gt;
** MQTT WSS por puerto seguro: '''wss://broker.emqx.io:8084/mqtt'''&lt;br /&gt;
* Broker MQTT en el VPS del máster:&lt;br /&gt;
** MQTT TCP por el puerto no seguro 1883: '''master.iotvertebrae.com'''&lt;br /&gt;
** MQTT WSS por puerto seguro: '''wss://master.iotvertebrae.com:9002'''&lt;br /&gt;
&amp;lt;!-- '''Nuevo firmware de la placa IoT-02 para el día de hoy''': [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]&lt;br /&gt;
[[Conexión entre la placa IoT-02 y Snap! v8 mediante MQTT]]&lt;br /&gt;
[[Conexión entre la placa IoT-02 y Snap! v9 mediante MQTT]] --&amp;gt;&lt;br /&gt;
[https://snap.berkeley.edu/snap/snap.html#open:https://wa.binefa.cat/snapCodes/IoT-02_board.xml Código Snap! v10] El [https://github.com/jordibinefa/IoT-02/tree/master/codes/IoT-02_mqtt_sync_upcSchool_broker1 ''firmware'' IoT-02_mqtt_sync_upcSchool_broker1] enseña el número MAC por la pantalla OLED cuando la placa IoT-02 se conecta a vuestra wifi. (Cambiar el archivo [https://github.com/jordibinefa/IoT-02/blob/master/codes/IoT-02_mqtt_sync_upcSchool_broker1/IoT-02_wifiCredentials.h IoT-02_wifiCredentials.h] en la línea 21 substituyendo ''iotcat'' por el nombre de la SSID de vuestra wifi y ''1234567890a'' por vuestra contraseña).&lt;br /&gt;
&lt;br /&gt;
== Uso de la base de datos MariaDB para almacenar y leer datos IoT ==&lt;br /&gt;
[[Uso de MariaDB en el VPS del Máster de Industria 4.0 el curso 2025-2026 | Uso de MariaDB en el VPS del Máster de Industria 4.0]]&lt;br /&gt;
&amp;lt;!-- [[Uso de MariaDB en el VPS del Máster de Industria 4.0 el curso 2023-2024]]&lt;br /&gt;
[[Uso de MariaDB en el VPS del Máster de Industria 4.0 el curso 2022-2023 | Uso de MariaDB en el VPS del Máster de Industria 4.0 el curso 2023-2024]]--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Node-RED ==&lt;br /&gt;
[[Asignación de puertos para el curso 2025-2026 | Asignación de puertos para este curso]]&lt;br /&gt;
&amp;lt;!--[[Asignación de puertos para el curso 2023-2024]]&lt;br /&gt;
[[Asignación de puertos para el curso 2022-2023]]--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Uso del Node-RED ===&lt;br /&gt;
[[Uso del NodeRED (2024) | Uso del Node-RED]]&lt;br /&gt;
&amp;lt;!--[[Uso del NodeRED (2023) | Uso del Node-RED]]--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Uso de la base de datos MariaDB desde Node-RED===&lt;br /&gt;
[[Uso de la base de datos MariaDB desde NodeRED (2023) | Uso de la base de datos MariaDB desde Node-RED]]&lt;br /&gt;
&amp;lt;!-- == Telegram ==&lt;br /&gt;
[[Uso de Telegram desde NodeRED]]--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Repaso y dudas de la clase invertida ==&lt;br /&gt;
=== Verificación de nodos instalados ===&lt;br /&gt;
Antes de continuar verificamos que ya tenemos instalado el nodo de MySQL ('''node-red-node-mysql''') y los nodos del panel de control ('''node-red-dashboard''').&lt;br /&gt;
==== Nodo node-red-node-mysql ====&lt;br /&gt;
[https://flows.nodered.org/node/node-red-node-mysql Documentación oficial del nodo ''node-red-node-mysql'']&lt;br /&gt;
&lt;br /&gt;
[[Image:10MariaDbNodeRed00.png|center|thumb|Instalación de los nodos de MariaDB (''MySQL'') en NodeRED]]&lt;br /&gt;
[[Image:11nodoMariaDbNodeRed.png|center|thumb|Aspecto del nodo MySQL en NodeRED]]&lt;br /&gt;
&lt;br /&gt;
==== Nodos node-red-dashboard ====&lt;br /&gt;
[https://flows.nodered.org/node/node-red-dashboard Documentación oficial de los nodos ''node-red-dashboard'']&lt;br /&gt;
&lt;br /&gt;
[[Image:NodosDashboard.png|center|thumb|Nodos del panel de control (''Dashboard'') en NodeRED]]&lt;br /&gt;
=== Acceso al VPS del máster ===&lt;br /&gt;
 ssh -o ServerAliveInterval=30 convidat@vps656540.ovh.net&lt;br /&gt;
o&lt;br /&gt;
 ssh convidat@vps656540.ovh.net&lt;br /&gt;
=== Acceso a la base de datos del VPS del máster ===&lt;br /&gt;
* Con permisos de lectura y escritura:&lt;br /&gt;
 mysql -u iot -p&lt;br /&gt;
* Con permisos de lectura:&lt;br /&gt;
 mysql -u convidat -p&lt;br /&gt;
&lt;br /&gt;
=== Repaso ===&lt;br /&gt;
* Uso de JSON con Snap!&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;
&lt;br /&gt;
* Aleatorización de múltiples datos controlada por el panel de control&lt;br /&gt;
&lt;br /&gt;
* Escritura síncrona de múltiples datos asíncronos al mismo tiempo. Uso del formato de datos json&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
* Telegram--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Ejercicios ==&lt;br /&gt;
=== Ejercicio de '''Snap! con MQTT''' ===&lt;br /&gt;
* Mediante Snap! hacer que en la pantalla aparezca, de forma infinita y con una cadencia de dos segundos, el porcentaje de luz leída por la LDR y después la temperatura en grados centígrados.&lt;br /&gt;
&lt;br /&gt;
=== Ejercicios de '''NodeRED''' ===&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;
==== 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;
==== Ejercicio '''NodeRED-03''' ====&lt;br /&gt;
* Implementad una pasarela (''gateway'') HTTP/MQTT para cambiar el estado de los leds y el relé biestable de la placa IoT-02.&lt;br /&gt;
&lt;br /&gt;
==== Ejercicio '''NodeRED-04''' ====&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;br /&gt;
&lt;br /&gt;
==== Ejercicio '''NodeRED-05''' ====&lt;br /&gt;
* Implementar un flujo de NodeRED que supervise continuamente el valor de la LDR. Introducir dos ''sliders'' para fijar umbrales. Cuando la luz supere el umbral establecido el led rojo se enciende y el relé biestable cambia a SET. Cuando la luz baje del segundo umbral establecido el led rojo se apaga (se enciende el verde) y el relé biestable cambia a RESET.&lt;br /&gt;
&lt;br /&gt;
==== Ejercicio '''NodeRED-06''' ====&lt;br /&gt;
* Implementar un flujo de NodeRED que permita la entrada de un texto y con un botón lo envie a la pantalla OLED.&lt;br /&gt;
&lt;br /&gt;
==== Ejercicio '''NodeRED-07''' ====&lt;br /&gt;
* Implementar un flujo de NodeRED que permita seleccionar un mode de funcionamiento automático o manual. En manual se puede encender y apagar el led blanco mediante un ''switch''. En modo automático el led blanco se enciende o se apaga en función de un umbral consignado mediante un ''slider''. (Para habilitar o inhabilitar un ''switch'' se puede usar ''msg.enabled'').&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--=== Ejercicios '''Telegram''' ===&lt;br /&gt;
* Desde el chat del bot: Al enviar la orden '''/ledWon''' se enciende el led blanco de la placa IoT-02. Al enviar la orden '''/ledWoff''' se apaga el led blanco.&lt;br /&gt;
&lt;br /&gt;
* Desde el chat del bot: Al enviar la orden '''/ledReleSet''' el relé se pone en estado SET. Al enviar la orden '''/ledReleReset''' el relé se pone en estado RESET.&lt;br /&gt;
&lt;br /&gt;
* El chat de vuestro bot recibe un mensaje cuando se aprieta vuestro botón I34 y cuando se deja de apretar.&lt;br /&gt;
&lt;br /&gt;
* Desde el chat del grupo donde pertenece vuestro bot: Al enviar la orden '''/entradas''' el bot contesta con los estados de los botones y la temperatura de la placa.--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Comentario de la práctica para el próximo día ===&lt;br /&gt;
El enunciado estará en breve en el campus. Se comenzará después de haber usado Grafana y Telegram.&lt;/div&gt;</summary>
		<author><name>Jordi Binefa</name></author>
		
	</entry>
	<entry>
		<id>https://www.binefa.com/index.php?title=16_/_5_/_2026_-_IoT,_Embedded_Systems,_Edge_y_Cloud&amp;diff=12288</id>
		<title>16 / 5 / 2026 - IoT, Embedded Systems, Edge y Cloud</title>
		<link rel="alternate" type="text/html" href="https://www.binefa.com/index.php?title=16_/_5_/_2026_-_IoT,_Embedded_Systems,_Edge_y_Cloud&amp;diff=12288"/>
		<updated>2026-05-09T19:54:32Z</updated>

		<summary type="html">&lt;p&gt;Jordi Binefa: /* Uso de la base de datos MariaDB para almacenar y leer datos IoT */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Conceptos previos (15 / 5 / 2026) =&lt;br /&gt;
Acceso a la base de datos del VPS del máster&lt;br /&gt;
&lt;br /&gt;
= Temario (16 / 5 / 2026) =&lt;br /&gt;
[https://meet.google.com/rke-afvm-eou Videoconferencia]&lt;br /&gt;
&lt;br /&gt;
== Repaso del día anterior ==&lt;br /&gt;
[https://www.binefa.cat/training/iot02/pdf/iot02_00_es.pdf Introducción a la placa IoT-02]&lt;br /&gt;
&lt;br /&gt;
[[El protocolo MQTT]]&lt;br /&gt;
&lt;br /&gt;
== Conexión entre la placa IoT-02 y Snap! mediante MQTT ==&lt;br /&gt;
&amp;lt;!-- '''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;
&lt;br /&gt;
* Broker MQTT púplico:&lt;br /&gt;
** MQTT TCP por el puerto no seguro 1883: '''broker.emqx.io'''&lt;br /&gt;
** MQTT WSS por puerto seguro: '''wss://broker.emqx.io:8084/mqtt'''&lt;br /&gt;
* Broker MQTT en el VPS del máster:&lt;br /&gt;
** MQTT TCP por el puerto no seguro 1883: '''master.iotvertebrae.com'''&lt;br /&gt;
** MQTT WSS por puerto seguro: '''wss://master.iotvertebrae.com:9002'''&lt;br /&gt;
&amp;lt;!-- '''Nuevo firmware de la placa IoT-02 para el día de hoy''': [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]&lt;br /&gt;
[[Conexión entre la placa IoT-02 y Snap! v8 mediante MQTT]]&lt;br /&gt;
[[Conexión entre la placa IoT-02 y Snap! v9 mediante MQTT]] --&amp;gt;&lt;br /&gt;
[https://snap.berkeley.edu/snap/snap.html#open:https://wa.binefa.cat/snapCodes/IoT-02_board.xml Código Snap! v10] El [https://github.com/jordibinefa/IoT-02/tree/master/codes/IoT-02_mqtt_sync_upcSchool_broker1 ''firmware'' IoT-02_mqtt_sync_upcSchool_broker1] enseña el número MAC por la pantalla OLED cuando la placa IoT-02 se conecta a vuestra wifi. (Cambiar el archivo [https://github.com/jordibinefa/IoT-02/blob/master/codes/IoT-02_mqtt_sync_upcSchool_broker1/IoT-02_wifiCredentials.h IoT-02_wifiCredentials.h] en la línea 21 substituyendo ''iotcat'' por el nombre de la SSID de vuestra wifi y ''1234567890a'' por vuestra contraseña).&lt;br /&gt;
&lt;br /&gt;
== Uso de la base de datos MariaDB para almacenar y leer datos IoT ==&lt;br /&gt;
[[Uso de MariaDB en el VPS del Máster de Industria 4.0 el curso 2025-2026 | Uso de MariaDB en el VPS del Máster de Industria 4.0]]&lt;br /&gt;
&amp;lt;!-- [[Uso de MariaDB en el VPS del Máster de Industria 4.0 el curso 2023-2024]]&lt;br /&gt;
[[Uso de MariaDB en el VPS del Máster de Industria 4.0 el curso 2022-2023 | Uso de MariaDB en el VPS del Máster de Industria 4.0 el curso 2023-2024]]--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Node-RED ==&lt;br /&gt;
[[Asignación de puertos para el curso 2024-2025 | Asignación de puertos para este curso]]&lt;br /&gt;
&amp;lt;!--[[Asignación de puertos para el curso 2023-2024]]&lt;br /&gt;
[[Asignación de puertos para el curso 2022-2023]]--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Uso del Node-RED ===&lt;br /&gt;
[[Uso del NodeRED (2024) | Uso del Node-RED]]&lt;br /&gt;
&amp;lt;!--[[Uso del NodeRED (2023) | Uso del Node-RED]]--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Uso de la base de datos MariaDB desde Node-RED===&lt;br /&gt;
[[Uso de la base de datos MariaDB desde NodeRED (2023) | Uso de la base de datos MariaDB desde Node-RED]]&lt;br /&gt;
&amp;lt;!-- == Telegram ==&lt;br /&gt;
[[Uso de Telegram desde NodeRED]]--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Repaso y dudas de la clase invertida ==&lt;br /&gt;
=== Verificación de nodos instalados ===&lt;br /&gt;
Antes de continuar verificamos que ya tenemos instalado el nodo de MySQL ('''node-red-node-mysql''') y los nodos del panel de control ('''node-red-dashboard''').&lt;br /&gt;
==== Nodo node-red-node-mysql ====&lt;br /&gt;
[https://flows.nodered.org/node/node-red-node-mysql Documentación oficial del nodo ''node-red-node-mysql'']&lt;br /&gt;
&lt;br /&gt;
[[Image:10MariaDbNodeRed00.png|center|thumb|Instalación de los nodos de MariaDB (''MySQL'') en NodeRED]]&lt;br /&gt;
[[Image:11nodoMariaDbNodeRed.png|center|thumb|Aspecto del nodo MySQL en NodeRED]]&lt;br /&gt;
&lt;br /&gt;
==== Nodos node-red-dashboard ====&lt;br /&gt;
[https://flows.nodered.org/node/node-red-dashboard Documentación oficial de los nodos ''node-red-dashboard'']&lt;br /&gt;
&lt;br /&gt;
[[Image:NodosDashboard.png|center|thumb|Nodos del panel de control (''Dashboard'') en NodeRED]]&lt;br /&gt;
=== Acceso al VPS del máster ===&lt;br /&gt;
 ssh -o ServerAliveInterval=30 convidat@vps656540.ovh.net&lt;br /&gt;
o&lt;br /&gt;
 ssh convidat@vps656540.ovh.net&lt;br /&gt;
=== Acceso a la base de datos del VPS del máster ===&lt;br /&gt;
* Con permisos de lectura y escritura:&lt;br /&gt;
 mysql -u iot -p&lt;br /&gt;
* Con permisos de lectura:&lt;br /&gt;
 mysql -u convidat -p&lt;br /&gt;
&lt;br /&gt;
=== Repaso ===&lt;br /&gt;
* Uso de JSON con Snap!&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;
&lt;br /&gt;
* Aleatorización de múltiples datos controlada por el panel de control&lt;br /&gt;
&lt;br /&gt;
* Escritura síncrona de múltiples datos asíncronos al mismo tiempo. Uso del formato de datos json&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
* Telegram--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Ejercicios ==&lt;br /&gt;
=== Ejercicio de '''Snap! con MQTT''' ===&lt;br /&gt;
* Mediante Snap! hacer que en la pantalla aparezca, de forma infinita y con una cadencia de dos segundos, el porcentaje de luz leída por la LDR y después la temperatura en grados centígrados.&lt;br /&gt;
&lt;br /&gt;
=== Ejercicios de '''NodeRED''' ===&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;
==== 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;
==== Ejercicio '''NodeRED-03''' ====&lt;br /&gt;
* Implementad una pasarela (''gateway'') HTTP/MQTT para cambiar el estado de los leds y el relé biestable de la placa IoT-02.&lt;br /&gt;
&lt;br /&gt;
==== Ejercicio '''NodeRED-04''' ====&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;br /&gt;
&lt;br /&gt;
==== Ejercicio '''NodeRED-05''' ====&lt;br /&gt;
* Implementar un flujo de NodeRED que supervise continuamente el valor de la LDR. Introducir dos ''sliders'' para fijar umbrales. Cuando la luz supere el umbral establecido el led rojo se enciende y el relé biestable cambia a SET. Cuando la luz baje del segundo umbral establecido el led rojo se apaga (se enciende el verde) y el relé biestable cambia a RESET.&lt;br /&gt;
&lt;br /&gt;
==== Ejercicio '''NodeRED-06''' ====&lt;br /&gt;
* Implementar un flujo de NodeRED que permita la entrada de un texto y con un botón lo envie a la pantalla OLED.&lt;br /&gt;
&lt;br /&gt;
==== Ejercicio '''NodeRED-07''' ====&lt;br /&gt;
* Implementar un flujo de NodeRED que permita seleccionar un mode de funcionamiento automático o manual. En manual se puede encender y apagar el led blanco mediante un ''switch''. En modo automático el led blanco se enciende o se apaga en función de un umbral consignado mediante un ''slider''. (Para habilitar o inhabilitar un ''switch'' se puede usar ''msg.enabled'').&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--=== Ejercicios '''Telegram''' ===&lt;br /&gt;
* Desde el chat del bot: Al enviar la orden '''/ledWon''' se enciende el led blanco de la placa IoT-02. Al enviar la orden '''/ledWoff''' se apaga el led blanco.&lt;br /&gt;
&lt;br /&gt;
* Desde el chat del bot: Al enviar la orden '''/ledReleSet''' el relé se pone en estado SET. Al enviar la orden '''/ledReleReset''' el relé se pone en estado RESET.&lt;br /&gt;
&lt;br /&gt;
* El chat de vuestro bot recibe un mensaje cuando se aprieta vuestro botón I34 y cuando se deja de apretar.&lt;br /&gt;
&lt;br /&gt;
* Desde el chat del grupo donde pertenece vuestro bot: Al enviar la orden '''/entradas''' el bot contesta con los estados de los botones y la temperatura de la placa.--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Comentario de la práctica para el próximo día ===&lt;br /&gt;
El enunciado estará en breve en el campus. Se comenzará después de haber usado Grafana y Telegram.&lt;/div&gt;</summary>
		<author><name>Jordi Binefa</name></author>
		
	</entry>
	<entry>
		<id>https://www.binefa.com/index.php?title=16_/_5_/_2026_-_IoT,_Embedded_Systems,_Edge_y_Cloud&amp;diff=12287</id>
		<title>16 / 5 / 2026 - IoT, Embedded Systems, Edge y Cloud</title>
		<link rel="alternate" type="text/html" href="https://www.binefa.com/index.php?title=16_/_5_/_2026_-_IoT,_Embedded_Systems,_Edge_y_Cloud&amp;diff=12287"/>
		<updated>2026-05-09T19:54:17Z</updated>

		<summary type="html">&lt;p&gt;Jordi Binefa: /* Conexión entre la placa IoT-02 y Snap! mediante MQTT */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Conceptos previos (15 / 5 / 2026) =&lt;br /&gt;
Acceso a la base de datos del VPS del máster&lt;br /&gt;
&lt;br /&gt;
= Temario (16 / 5 / 2026) =&lt;br /&gt;
[https://meet.google.com/rke-afvm-eou Videoconferencia]&lt;br /&gt;
&lt;br /&gt;
== Repaso del día anterior ==&lt;br /&gt;
[https://www.binefa.cat/training/iot02/pdf/iot02_00_es.pdf Introducción a la placa IoT-02]&lt;br /&gt;
&lt;br /&gt;
[[El protocolo MQTT]]&lt;br /&gt;
&lt;br /&gt;
== Conexión entre la placa IoT-02 y Snap! mediante MQTT ==&lt;br /&gt;
&amp;lt;!-- '''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;
&lt;br /&gt;
* Broker MQTT púplico:&lt;br /&gt;
** MQTT TCP por el puerto no seguro 1883: '''broker.emqx.io'''&lt;br /&gt;
** MQTT WSS por puerto seguro: '''wss://broker.emqx.io:8084/mqtt'''&lt;br /&gt;
* Broker MQTT en el VPS del máster:&lt;br /&gt;
** MQTT TCP por el puerto no seguro 1883: '''master.iotvertebrae.com'''&lt;br /&gt;
** MQTT WSS por puerto seguro: '''wss://master.iotvertebrae.com:9002'''&lt;br /&gt;
&amp;lt;!-- '''Nuevo firmware de la placa IoT-02 para el día de hoy''': [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]&lt;br /&gt;
[[Conexión entre la placa IoT-02 y Snap! v8 mediante MQTT]]&lt;br /&gt;
[[Conexión entre la placa IoT-02 y Snap! v9 mediante MQTT]] --&amp;gt;&lt;br /&gt;
[https://snap.berkeley.edu/snap/snap.html#open:https://wa.binefa.cat/snapCodes/IoT-02_board.xml Código Snap! v10] El [https://github.com/jordibinefa/IoT-02/tree/master/codes/IoT-02_mqtt_sync_upcSchool_broker1 ''firmware'' IoT-02_mqtt_sync_upcSchool_broker1] enseña el número MAC por la pantalla OLED cuando la placa IoT-02 se conecta a vuestra wifi. (Cambiar el archivo [https://github.com/jordibinefa/IoT-02/blob/master/codes/IoT-02_mqtt_sync_upcSchool_broker1/IoT-02_wifiCredentials.h IoT-02_wifiCredentials.h] en la línea 21 substituyendo ''iotcat'' por el nombre de la SSID de vuestra wifi y ''1234567890a'' por vuestra contraseña).&lt;br /&gt;
&lt;br /&gt;
== Uso de la base de datos MariaDB para almacenar y leer datos IoT ==&lt;br /&gt;
[[Uso de MariaDB en el VPS del Máster de Industria 4.0 el curso 2024-2025 | Uso de MariaDB en el VPS del Máster de Industria 4.0]]&lt;br /&gt;
&amp;lt;!-- [[Uso de MariaDB en el VPS del Máster de Industria 4.0 el curso 2023-2024]]&lt;br /&gt;
[[Uso de MariaDB en el VPS del Máster de Industria 4.0 el curso 2022-2023 | Uso de MariaDB en el VPS del Máster de Industria 4.0 el curso 2023-2024]]--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Node-RED ==&lt;br /&gt;
[[Asignación de puertos para el curso 2024-2025 | Asignación de puertos para este curso]]&lt;br /&gt;
&amp;lt;!--[[Asignación de puertos para el curso 2023-2024]]&lt;br /&gt;
[[Asignación de puertos para el curso 2022-2023]]--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Uso del Node-RED ===&lt;br /&gt;
[[Uso del NodeRED (2024) | Uso del Node-RED]]&lt;br /&gt;
&amp;lt;!--[[Uso del NodeRED (2023) | Uso del Node-RED]]--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Uso de la base de datos MariaDB desde Node-RED===&lt;br /&gt;
[[Uso de la base de datos MariaDB desde NodeRED (2023) | Uso de la base de datos MariaDB desde Node-RED]]&lt;br /&gt;
&amp;lt;!-- == Telegram ==&lt;br /&gt;
[[Uso de Telegram desde NodeRED]]--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Repaso y dudas de la clase invertida ==&lt;br /&gt;
=== Verificación de nodos instalados ===&lt;br /&gt;
Antes de continuar verificamos que ya tenemos instalado el nodo de MySQL ('''node-red-node-mysql''') y los nodos del panel de control ('''node-red-dashboard''').&lt;br /&gt;
==== Nodo node-red-node-mysql ====&lt;br /&gt;
[https://flows.nodered.org/node/node-red-node-mysql Documentación oficial del nodo ''node-red-node-mysql'']&lt;br /&gt;
&lt;br /&gt;
[[Image:10MariaDbNodeRed00.png|center|thumb|Instalación de los nodos de MariaDB (''MySQL'') en NodeRED]]&lt;br /&gt;
[[Image:11nodoMariaDbNodeRed.png|center|thumb|Aspecto del nodo MySQL en NodeRED]]&lt;br /&gt;
&lt;br /&gt;
==== Nodos node-red-dashboard ====&lt;br /&gt;
[https://flows.nodered.org/node/node-red-dashboard Documentación oficial de los nodos ''node-red-dashboard'']&lt;br /&gt;
&lt;br /&gt;
[[Image:NodosDashboard.png|center|thumb|Nodos del panel de control (''Dashboard'') en NodeRED]]&lt;br /&gt;
=== Acceso al VPS del máster ===&lt;br /&gt;
 ssh -o ServerAliveInterval=30 convidat@vps656540.ovh.net&lt;br /&gt;
o&lt;br /&gt;
 ssh convidat@vps656540.ovh.net&lt;br /&gt;
=== Acceso a la base de datos del VPS del máster ===&lt;br /&gt;
* Con permisos de lectura y escritura:&lt;br /&gt;
 mysql -u iot -p&lt;br /&gt;
* Con permisos de lectura:&lt;br /&gt;
 mysql -u convidat -p&lt;br /&gt;
&lt;br /&gt;
=== Repaso ===&lt;br /&gt;
* Uso de JSON con Snap!&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;
&lt;br /&gt;
* Aleatorización de múltiples datos controlada por el panel de control&lt;br /&gt;
&lt;br /&gt;
* Escritura síncrona de múltiples datos asíncronos al mismo tiempo. Uso del formato de datos json&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
* Telegram--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Ejercicios ==&lt;br /&gt;
=== Ejercicio de '''Snap! con MQTT''' ===&lt;br /&gt;
* Mediante Snap! hacer que en la pantalla aparezca, de forma infinita y con una cadencia de dos segundos, el porcentaje de luz leída por la LDR y después la temperatura en grados centígrados.&lt;br /&gt;
&lt;br /&gt;
=== Ejercicios de '''NodeRED''' ===&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;
==== 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;
==== Ejercicio '''NodeRED-03''' ====&lt;br /&gt;
* Implementad una pasarela (''gateway'') HTTP/MQTT para cambiar el estado de los leds y el relé biestable de la placa IoT-02.&lt;br /&gt;
&lt;br /&gt;
==== Ejercicio '''NodeRED-04''' ====&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;br /&gt;
&lt;br /&gt;
==== Ejercicio '''NodeRED-05''' ====&lt;br /&gt;
* Implementar un flujo de NodeRED que supervise continuamente el valor de la LDR. Introducir dos ''sliders'' para fijar umbrales. Cuando la luz supere el umbral establecido el led rojo se enciende y el relé biestable cambia a SET. Cuando la luz baje del segundo umbral establecido el led rojo se apaga (se enciende el verde) y el relé biestable cambia a RESET.&lt;br /&gt;
&lt;br /&gt;
==== Ejercicio '''NodeRED-06''' ====&lt;br /&gt;
* Implementar un flujo de NodeRED que permita la entrada de un texto y con un botón lo envie a la pantalla OLED.&lt;br /&gt;
&lt;br /&gt;
==== Ejercicio '''NodeRED-07''' ====&lt;br /&gt;
* Implementar un flujo de NodeRED que permita seleccionar un mode de funcionamiento automático o manual. En manual se puede encender y apagar el led blanco mediante un ''switch''. En modo automático el led blanco se enciende o se apaga en función de un umbral consignado mediante un ''slider''. (Para habilitar o inhabilitar un ''switch'' se puede usar ''msg.enabled'').&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--=== Ejercicios '''Telegram''' ===&lt;br /&gt;
* Desde el chat del bot: Al enviar la orden '''/ledWon''' se enciende el led blanco de la placa IoT-02. Al enviar la orden '''/ledWoff''' se apaga el led blanco.&lt;br /&gt;
&lt;br /&gt;
* Desde el chat del bot: Al enviar la orden '''/ledReleSet''' el relé se pone en estado SET. Al enviar la orden '''/ledReleReset''' el relé se pone en estado RESET.&lt;br /&gt;
&lt;br /&gt;
* El chat de vuestro bot recibe un mensaje cuando se aprieta vuestro botón I34 y cuando se deja de apretar.&lt;br /&gt;
&lt;br /&gt;
* Desde el chat del grupo donde pertenece vuestro bot: Al enviar la orden '''/entradas''' el bot contesta con los estados de los botones y la temperatura de la placa.--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Comentario de la práctica para el próximo día ===&lt;br /&gt;
El enunciado estará en breve en el campus. Se comenzará después de haber usado Grafana y Telegram.&lt;/div&gt;</summary>
		<author><name>Jordi Binefa</name></author>
		
	</entry>
	<entry>
		<id>https://www.binefa.com/index.php?title=16_/_5_/_2026_-_IoT,_Embedded_Systems,_Edge_y_Cloud&amp;diff=12286</id>
		<title>16 / 5 / 2026 - IoT, Embedded Systems, Edge y Cloud</title>
		<link rel="alternate" type="text/html" href="https://www.binefa.com/index.php?title=16_/_5_/_2026_-_IoT,_Embedded_Systems,_Edge_y_Cloud&amp;diff=12286"/>
		<updated>2026-05-09T19:52:43Z</updated>

		<summary type="html">&lt;p&gt;Jordi Binefa: /* Temario (31 / 5 / 2025) */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Conceptos previos (15 / 5 / 2026) =&lt;br /&gt;
Acceso a la base de datos del VPS del máster&lt;br /&gt;
&lt;br /&gt;
= Temario (16 / 5 / 2026) =&lt;br /&gt;
[https://meet.google.com/rke-afvm-eou Videoconferencia]&lt;br /&gt;
&lt;br /&gt;
== Repaso del día anterior ==&lt;br /&gt;
[https://www.binefa.cat/training/iot02/pdf/iot02_00_es.pdf Introducción a la placa IoT-02]&lt;br /&gt;
&lt;br /&gt;
[[El protocolo MQTT]]&lt;br /&gt;
&lt;br /&gt;
== Conexión entre la placa IoT-02 y Snap! mediante MQTT ==&lt;br /&gt;
&amp;lt;!-- '''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;'''vps656540.ovh.net'''&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;
&lt;br /&gt;
&amp;lt;!-- '''Nuevo firmware de la placa IoT-02 para el día de hoy''': [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]&lt;br /&gt;
[[Conexión entre la placa IoT-02 y Snap! v8 mediante MQTT]]&lt;br /&gt;
[[Conexión entre la placa IoT-02 y Snap! v9 mediante MQTT]] --&amp;gt;&lt;br /&gt;
[https://snap.berkeley.edu/snap/snap.html#open:https://wa.binefa.cat/snapCodes/IoT-02_board.xml Código Snap! v10] El [https://github.com/jordibinefa/IoT-02/tree/master/codes/IoT-02_mqtt_sync_upcSchool_broker1 ''firmware'' IoT-02_mqtt_sync_upcSchool_broker1] enseña el número MAC por la pantalla OLED cuando la placa IoT-02 se conecta a vuestra wifi. (Cambiar el archivo [https://github.com/jordibinefa/IoT-02/blob/master/codes/IoT-02_mqtt_sync_upcSchool_broker1/IoT-02_wifiCredentials.h IoT-02_wifiCredentials.h] en la línea 21 substituyendo ''iotcat'' por el nombre de la SSID de vuestra wifi y ''1234567890a'' por vuestra contraseña).&lt;br /&gt;
&lt;br /&gt;
== Uso de la base de datos MariaDB para almacenar y leer datos IoT ==&lt;br /&gt;
[[Uso de MariaDB en el VPS del Máster de Industria 4.0 el curso 2024-2025 | Uso de MariaDB en el VPS del Máster de Industria 4.0]]&lt;br /&gt;
&amp;lt;!-- [[Uso de MariaDB en el VPS del Máster de Industria 4.0 el curso 2023-2024]]&lt;br /&gt;
[[Uso de MariaDB en el VPS del Máster de Industria 4.0 el curso 2022-2023 | Uso de MariaDB en el VPS del Máster de Industria 4.0 el curso 2023-2024]]--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Node-RED ==&lt;br /&gt;
[[Asignación de puertos para el curso 2024-2025 | Asignación de puertos para este curso]]&lt;br /&gt;
&amp;lt;!--[[Asignación de puertos para el curso 2023-2024]]&lt;br /&gt;
[[Asignación de puertos para el curso 2022-2023]]--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Uso del Node-RED ===&lt;br /&gt;
[[Uso del NodeRED (2024) | Uso del Node-RED]]&lt;br /&gt;
&amp;lt;!--[[Uso del NodeRED (2023) | Uso del Node-RED]]--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Uso de la base de datos MariaDB desde Node-RED===&lt;br /&gt;
[[Uso de la base de datos MariaDB desde NodeRED (2023) | Uso de la base de datos MariaDB desde Node-RED]]&lt;br /&gt;
&amp;lt;!-- == Telegram ==&lt;br /&gt;
[[Uso de Telegram desde NodeRED]]--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Repaso y dudas de la clase invertida ==&lt;br /&gt;
=== Verificación de nodos instalados ===&lt;br /&gt;
Antes de continuar verificamos que ya tenemos instalado el nodo de MySQL ('''node-red-node-mysql''') y los nodos del panel de control ('''node-red-dashboard''').&lt;br /&gt;
==== Nodo node-red-node-mysql ====&lt;br /&gt;
[https://flows.nodered.org/node/node-red-node-mysql Documentación oficial del nodo ''node-red-node-mysql'']&lt;br /&gt;
&lt;br /&gt;
[[Image:10MariaDbNodeRed00.png|center|thumb|Instalación de los nodos de MariaDB (''MySQL'') en NodeRED]]&lt;br /&gt;
[[Image:11nodoMariaDbNodeRed.png|center|thumb|Aspecto del nodo MySQL en NodeRED]]&lt;br /&gt;
&lt;br /&gt;
==== Nodos node-red-dashboard ====&lt;br /&gt;
[https://flows.nodered.org/node/node-red-dashboard Documentación oficial de los nodos ''node-red-dashboard'']&lt;br /&gt;
&lt;br /&gt;
[[Image:NodosDashboard.png|center|thumb|Nodos del panel de control (''Dashboard'') en NodeRED]]&lt;br /&gt;
=== Acceso al VPS del máster ===&lt;br /&gt;
 ssh -o ServerAliveInterval=30 convidat@vps656540.ovh.net&lt;br /&gt;
o&lt;br /&gt;
 ssh convidat@vps656540.ovh.net&lt;br /&gt;
=== Acceso a la base de datos del VPS del máster ===&lt;br /&gt;
* Con permisos de lectura y escritura:&lt;br /&gt;
 mysql -u iot -p&lt;br /&gt;
* Con permisos de lectura:&lt;br /&gt;
 mysql -u convidat -p&lt;br /&gt;
&lt;br /&gt;
=== Repaso ===&lt;br /&gt;
* Uso de JSON con Snap!&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;
&lt;br /&gt;
* Aleatorización de múltiples datos controlada por el panel de control&lt;br /&gt;
&lt;br /&gt;
* Escritura síncrona de múltiples datos asíncronos al mismo tiempo. Uso del formato de datos json&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
* Telegram--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Ejercicios ==&lt;br /&gt;
=== Ejercicio de '''Snap! con MQTT''' ===&lt;br /&gt;
* Mediante Snap! hacer que en la pantalla aparezca, de forma infinita y con una cadencia de dos segundos, el porcentaje de luz leída por la LDR y después la temperatura en grados centígrados.&lt;br /&gt;
&lt;br /&gt;
=== Ejercicios de '''NodeRED''' ===&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;
==== 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;
==== Ejercicio '''NodeRED-03''' ====&lt;br /&gt;
* Implementad una pasarela (''gateway'') HTTP/MQTT para cambiar el estado de los leds y el relé biestable de la placa IoT-02.&lt;br /&gt;
&lt;br /&gt;
==== Ejercicio '''NodeRED-04''' ====&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;br /&gt;
&lt;br /&gt;
==== Ejercicio '''NodeRED-05''' ====&lt;br /&gt;
* Implementar un flujo de NodeRED que supervise continuamente el valor de la LDR. Introducir dos ''sliders'' para fijar umbrales. Cuando la luz supere el umbral establecido el led rojo se enciende y el relé biestable cambia a SET. Cuando la luz baje del segundo umbral establecido el led rojo se apaga (se enciende el verde) y el relé biestable cambia a RESET.&lt;br /&gt;
&lt;br /&gt;
==== Ejercicio '''NodeRED-06''' ====&lt;br /&gt;
* Implementar un flujo de NodeRED que permita la entrada de un texto y con un botón lo envie a la pantalla OLED.&lt;br /&gt;
&lt;br /&gt;
==== Ejercicio '''NodeRED-07''' ====&lt;br /&gt;
* Implementar un flujo de NodeRED que permita seleccionar un mode de funcionamiento automático o manual. En manual se puede encender y apagar el led blanco mediante un ''switch''. En modo automático el led blanco se enciende o se apaga en función de un umbral consignado mediante un ''slider''. (Para habilitar o inhabilitar un ''switch'' se puede usar ''msg.enabled'').&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--=== Ejercicios '''Telegram''' ===&lt;br /&gt;
* Desde el chat del bot: Al enviar la orden '''/ledWon''' se enciende el led blanco de la placa IoT-02. Al enviar la orden '''/ledWoff''' se apaga el led blanco.&lt;br /&gt;
&lt;br /&gt;
* Desde el chat del bot: Al enviar la orden '''/ledReleSet''' el relé se pone en estado SET. Al enviar la orden '''/ledReleReset''' el relé se pone en estado RESET.&lt;br /&gt;
&lt;br /&gt;
* El chat de vuestro bot recibe un mensaje cuando se aprieta vuestro botón I34 y cuando se deja de apretar.&lt;br /&gt;
&lt;br /&gt;
* Desde el chat del grupo donde pertenece vuestro bot: Al enviar la orden '''/entradas''' el bot contesta con los estados de los botones y la temperatura de la placa.--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Comentario de la práctica para el próximo día ===&lt;br /&gt;
El enunciado estará en breve en el campus. Se comenzará después de haber usado Grafana y Telegram.&lt;/div&gt;</summary>
		<author><name>Jordi Binefa</name></author>
		
	</entry>
	<entry>
		<id>https://www.binefa.com/index.php?title=16_/_5_/_2026_-_IoT,_Embedded_Systems,_Edge_y_Cloud&amp;diff=12285</id>
		<title>16 / 5 / 2026 - IoT, Embedded Systems, Edge y Cloud</title>
		<link rel="alternate" type="text/html" href="https://www.binefa.com/index.php?title=16_/_5_/_2026_-_IoT,_Embedded_Systems,_Edge_y_Cloud&amp;diff=12285"/>
		<updated>2026-05-09T19:52:05Z</updated>

		<summary type="html">&lt;p&gt;Jordi Binefa: /* Conceptos previos (30 / 5 / 2025) */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Conceptos previos (15 / 5 / 2026) =&lt;br /&gt;
Acceso a la base de datos del VPS del máster&lt;br /&gt;
&lt;br /&gt;
= Temario (31 / 5 / 2025) =&lt;br /&gt;
[https://meet.google.com/uko-nrvp-neu Videoconferencia]&lt;br /&gt;
&lt;br /&gt;
== Repaso del día anterior ==&lt;br /&gt;
[https://www.binefa.cat/training/iot02/pdf/iot02_00_es.pdf Introducción a la placa IoT-02]&lt;br /&gt;
&lt;br /&gt;
[[El protocolo MQTT]]&lt;br /&gt;
&lt;br /&gt;
== Conexión entre la placa IoT-02 y Snap! mediante MQTT ==&lt;br /&gt;
&amp;lt;!-- '''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;'''vps656540.ovh.net'''&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;
&lt;br /&gt;
&amp;lt;!-- '''Nuevo firmware de la placa IoT-02 para el día de hoy''': [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]&lt;br /&gt;
[[Conexión entre la placa IoT-02 y Snap! v8 mediante MQTT]]&lt;br /&gt;
[[Conexión entre la placa IoT-02 y Snap! v9 mediante MQTT]] --&amp;gt;&lt;br /&gt;
[https://snap.berkeley.edu/snap/snap.html#open:https://wa.binefa.cat/snapCodes/IoT-02_board.xml Código Snap! v10] El [https://github.com/jordibinefa/IoT-02/tree/master/codes/IoT-02_mqtt_sync_upcSchool_broker1 ''firmware'' IoT-02_mqtt_sync_upcSchool_broker1] enseña el número MAC por la pantalla OLED cuando la placa IoT-02 se conecta a vuestra wifi. (Cambiar el archivo [https://github.com/jordibinefa/IoT-02/blob/master/codes/IoT-02_mqtt_sync_upcSchool_broker1/IoT-02_wifiCredentials.h IoT-02_wifiCredentials.h] en la línea 21 substituyendo ''iotcat'' por el nombre de la SSID de vuestra wifi y ''1234567890a'' por vuestra contraseña).&lt;br /&gt;
&lt;br /&gt;
== Uso de la base de datos MariaDB para almacenar y leer datos IoT ==&lt;br /&gt;
[[Uso de MariaDB en el VPS del Máster de Industria 4.0 el curso 2024-2025 | Uso de MariaDB en el VPS del Máster de Industria 4.0]]&lt;br /&gt;
&amp;lt;!-- [[Uso de MariaDB en el VPS del Máster de Industria 4.0 el curso 2023-2024]]&lt;br /&gt;
[[Uso de MariaDB en el VPS del Máster de Industria 4.0 el curso 2022-2023 | Uso de MariaDB en el VPS del Máster de Industria 4.0 el curso 2023-2024]]--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Node-RED ==&lt;br /&gt;
[[Asignación de puertos para el curso 2024-2025 | Asignación de puertos para este curso]]&lt;br /&gt;
&amp;lt;!--[[Asignación de puertos para el curso 2023-2024]]&lt;br /&gt;
[[Asignación de puertos para el curso 2022-2023]]--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Uso del Node-RED ===&lt;br /&gt;
[[Uso del NodeRED (2024) | Uso del Node-RED]]&lt;br /&gt;
&amp;lt;!--[[Uso del NodeRED (2023) | Uso del Node-RED]]--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Uso de la base de datos MariaDB desde Node-RED===&lt;br /&gt;
[[Uso de la base de datos MariaDB desde NodeRED (2023) | Uso de la base de datos MariaDB desde Node-RED]]&lt;br /&gt;
&amp;lt;!-- == Telegram ==&lt;br /&gt;
[[Uso de Telegram desde NodeRED]]--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Repaso y dudas de la clase invertida ==&lt;br /&gt;
=== Verificación de nodos instalados ===&lt;br /&gt;
Antes de continuar verificamos que ya tenemos instalado el nodo de MySQL ('''node-red-node-mysql''') y los nodos del panel de control ('''node-red-dashboard''').&lt;br /&gt;
==== Nodo node-red-node-mysql ====&lt;br /&gt;
[https://flows.nodered.org/node/node-red-node-mysql Documentación oficial del nodo ''node-red-node-mysql'']&lt;br /&gt;
&lt;br /&gt;
[[Image:10MariaDbNodeRed00.png|center|thumb|Instalación de los nodos de MariaDB (''MySQL'') en NodeRED]]&lt;br /&gt;
[[Image:11nodoMariaDbNodeRed.png|center|thumb|Aspecto del nodo MySQL en NodeRED]]&lt;br /&gt;
&lt;br /&gt;
==== Nodos node-red-dashboard ====&lt;br /&gt;
[https://flows.nodered.org/node/node-red-dashboard Documentación oficial de los nodos ''node-red-dashboard'']&lt;br /&gt;
&lt;br /&gt;
[[Image:NodosDashboard.png|center|thumb|Nodos del panel de control (''Dashboard'') en NodeRED]]&lt;br /&gt;
=== Acceso al VPS del máster ===&lt;br /&gt;
 ssh -o ServerAliveInterval=30 convidat@vps656540.ovh.net&lt;br /&gt;
o&lt;br /&gt;
 ssh convidat@vps656540.ovh.net&lt;br /&gt;
=== Acceso a la base de datos del VPS del máster ===&lt;br /&gt;
* Con permisos de lectura y escritura:&lt;br /&gt;
 mysql -u iot -p&lt;br /&gt;
* Con permisos de lectura:&lt;br /&gt;
 mysql -u convidat -p&lt;br /&gt;
&lt;br /&gt;
=== Repaso ===&lt;br /&gt;
* Uso de JSON con Snap!&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;
&lt;br /&gt;
* Aleatorización de múltiples datos controlada por el panel de control&lt;br /&gt;
&lt;br /&gt;
* Escritura síncrona de múltiples datos asíncronos al mismo tiempo. Uso del formato de datos json&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
* Telegram--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Ejercicios ==&lt;br /&gt;
=== Ejercicio de '''Snap! con MQTT''' ===&lt;br /&gt;
* Mediante Snap! hacer que en la pantalla aparezca, de forma infinita y con una cadencia de dos segundos, el porcentaje de luz leída por la LDR y después la temperatura en grados centígrados.&lt;br /&gt;
&lt;br /&gt;
=== Ejercicios de '''NodeRED''' ===&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;
==== 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;
==== Ejercicio '''NodeRED-03''' ====&lt;br /&gt;
* Implementad una pasarela (''gateway'') HTTP/MQTT para cambiar el estado de los leds y el relé biestable de la placa IoT-02.&lt;br /&gt;
&lt;br /&gt;
==== Ejercicio '''NodeRED-04''' ====&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;br /&gt;
&lt;br /&gt;
==== Ejercicio '''NodeRED-05''' ====&lt;br /&gt;
* Implementar un flujo de NodeRED que supervise continuamente el valor de la LDR. Introducir dos ''sliders'' para fijar umbrales. Cuando la luz supere el umbral establecido el led rojo se enciende y el relé biestable cambia a SET. Cuando la luz baje del segundo umbral establecido el led rojo se apaga (se enciende el verde) y el relé biestable cambia a RESET.&lt;br /&gt;
&lt;br /&gt;
==== Ejercicio '''NodeRED-06''' ====&lt;br /&gt;
* Implementar un flujo de NodeRED que permita la entrada de un texto y con un botón lo envie a la pantalla OLED.&lt;br /&gt;
&lt;br /&gt;
==== Ejercicio '''NodeRED-07''' ====&lt;br /&gt;
* Implementar un flujo de NodeRED que permita seleccionar un mode de funcionamiento automático o manual. En manual se puede encender y apagar el led blanco mediante un ''switch''. En modo automático el led blanco se enciende o se apaga en función de un umbral consignado mediante un ''slider''. (Para habilitar o inhabilitar un ''switch'' se puede usar ''msg.enabled'').&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--=== Ejercicios '''Telegram''' ===&lt;br /&gt;
* Desde el chat del bot: Al enviar la orden '''/ledWon''' se enciende el led blanco de la placa IoT-02. Al enviar la orden '''/ledWoff''' se apaga el led blanco.&lt;br /&gt;
&lt;br /&gt;
* Desde el chat del bot: Al enviar la orden '''/ledReleSet''' el relé se pone en estado SET. Al enviar la orden '''/ledReleReset''' el relé se pone en estado RESET.&lt;br /&gt;
&lt;br /&gt;
* El chat de vuestro bot recibe un mensaje cuando se aprieta vuestro botón I34 y cuando se deja de apretar.&lt;br /&gt;
&lt;br /&gt;
* Desde el chat del grupo donde pertenece vuestro bot: Al enviar la orden '''/entradas''' el bot contesta con los estados de los botones y la temperatura de la placa.--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Comentario de la práctica para el próximo día ===&lt;br /&gt;
El enunciado estará en breve en el campus. Se comenzará después de haber usado Grafana y Telegram.&lt;/div&gt;</summary>
		<author><name>Jordi Binefa</name></author>
		
	</entry>
	<entry>
		<id>https://www.binefa.com/index.php?title=IoT,_Embedded_Systems,_Edge_y_Cloud_(2026)&amp;diff=12284</id>
		<title>IoT, Embedded Systems, Edge y Cloud (2026)</title>
		<link rel="alternate" type="text/html" href="https://www.binefa.com/index.php?title=IoT,_Embedded_Systems,_Edge_y_Cloud_(2026)&amp;diff=12284"/>
		<updated>2026-05-09T19:51:33Z</updated>

		<summary type="html">&lt;p&gt;Jordi Binefa: /* Por días */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;* [[Temario - IoT, Embedded Systems, Edge y Cloud (2026)]]&lt;br /&gt;
* Acceso rápido a esta página: https://t.ly/-LmC9&lt;br /&gt;
= Por días =&lt;br /&gt;
* [[9 / 5 / 2026 - IoT, Embedded Systems, Edge y Cloud]]&lt;br /&gt;
* 16 / 5 / 2026 - IoT, Embedded Systems, Edge y Cloud&lt;br /&gt;
&amp;lt;!-- * [[16 / 5 / 2026 - IoT, Embedded Systems, Edge y Cloud]] --&amp;gt;&lt;br /&gt;
* 23 / 5 / 2026 - IoT, Embedded Systems, Edge y Cloud&lt;br /&gt;
&amp;lt;!-- &lt;br /&gt;
* [[9 / 5 / 2026 - Impresión 3D, Robótica e Iot, Hands on y MVPs]] (versió preliminar)&lt;br /&gt;
* [[24 / 5 / 2025 - Impresión 3D, Robótica e Iot, Hands on y MVPs]]&lt;br /&gt;
* [[31 / 5 / 2025 - Impresión 3D, Robótica e Iot, Hands on y MVPs]]&lt;br /&gt;
* [[7 / 6 / 2025 - Impresión 3D, Robótica e Iot, Hands on y MVPs]] --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Herramientas y recursos =&lt;br /&gt;
* [[Adición del ESP32 en el IDE de Arduino]]&lt;br /&gt;
* [[Simulador de la placa IoT-02 en línea]] &lt;br /&gt;
&amp;lt;!-- [https://meet.google.com/noa-yasq-xeb Videoconferencia] --&amp;gt;&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
username:   docent.industria4.0@talent.upc.edu&lt;br /&gt;
password:   Industria4@online2020&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
* [https://github.com/jordibinefa/IoT-02 Placa IoT-02 en GitHub] ([https://github.com/jordibinefa/iot02-simulator Código del gemelo digital de la placa IoT-02 en GitHub])&lt;br /&gt;
* [https://www.binefa.cat/training/iot02/pdf/iot02_00_es.pdf Introducción a la placa IoT-02 en castellano] en pdf ([https://www.binefa.cat/training/iot02/pdf/iot02_00_ca.pdf ''Introducció a la placa IoT-02'' en catalán])&lt;br /&gt;
* [https://youtu.be/_EIXCGkGQ0U Vídeo de introducción a la placa IoT-02]&lt;br /&gt;
* [https://youtu.be/JothMIY4DWE Vídeo de configuración del IDE de Arduino v1.8.19]&lt;br /&gt;
* [https://youtu.be/UjtULePAbTE Vídeo de configuración del IDE de Arduino v2] ([https://youtu.be/BvdHeNRDgL8 Vídeo de como usar el IDE de Arduino v2 para programar la placa IoT-02])&lt;br /&gt;
* [https://binefa.com/upc-school/libraries_20240420.zip Enlace para bajar las bibliotecas (''libraries'') necesarias para los códigos de ''firmware'' usados en este máster] para el IDE de Arduino ([https://www.arduino.cc/ Página de Arduino])&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- [https://www.binefa.cat/training/iot02/libraries/libraries_20240420.zip Enlace para bajar las bibliotecas (''libraries'') necesarias para los códigos de ''firmware'' usados en este máster] para el IDE de Arduino ([https://www.arduino.cc/ Página de Arduino])&lt;br /&gt;
&lt;br /&gt;
[http://rebost.binefa.cat/iot/videos/01_Intro_placa_IoT-02_es.mkv Vídeo introductorio a la placa IoT-02] &lt;br /&gt;
&lt;br /&gt;
[http://rebost.binefa.cat/iot/videos/02_IDE_Arduino_ESP32_es.mkv Vídeo de instalación del Arduino IDE y algunas bibliotecas extra para probar los códigos en la placa IoT-02] --&amp;gt;&lt;br /&gt;
&amp;lt;!-- [[Instalación de controladores (drivers) para Tecnologías IoT, Hands on y MVP (2022)]] --&amp;gt;&lt;br /&gt;
&amp;lt;!-- [http://formacio.things.cat/mac_IoT-02_mI40/ Herramienta de gestión de la MAC de la placa IoT-02, mediante un cliente web usando JS] --&amp;gt;&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
[[Instalación de programas para Tecnologías IoT, Hands on y MVP (2022)]] --&amp;gt;&lt;br /&gt;
* [[esptool: Herramienta para borrar toda la memoria flash del ESP32 en caso de tener problemas en la subida del firmware]]&lt;br /&gt;
&amp;lt;!-- [http://popotamo.binefa.cat/iot/maqVirt/IoT%20-%20eCat%20-%20Debian%2011.x%2064-bit_v20210304_00.zip Máquina virtual para VMware Workstation Player] basada en Debian GNU/Linux 11. Usuario '''clot''' y contraseña '''fjeclot'''. --&amp;gt;&lt;br /&gt;
* [https://www.onlinegdb.com/ Programación en línea para C, C++, Python y JavaScript, entre otros]&lt;br /&gt;
* [https://app.edublocks.org/#Python Herramienta de conversión de bloques de programación a Python]&lt;br /&gt;
* [https://upcommons.upc.edu/handle/2117/363087 Combining Low-Code Programming and SDL-Based Modeling with Snap! in the Industry 4.0 Context]&lt;br /&gt;
* [[Asignación de puertos para el curso 2025-2026]]&lt;br /&gt;
&amp;lt;!-- * [[Asignación de puertos para el curso 2024-2025]]&lt;br /&gt;
[[Asignación de puertos para el curso 2023-2024]]&lt;br /&gt;
== Proyecto Final ==&lt;br /&gt;
[https://onedrive.live.com/view.aspx?resid=7B61369ED41066A2!819702&amp;amp;ithint=file%2cpptx&amp;amp;authkey=!AN_I9zWRZwOSkKE Asignación de proyectos]&lt;br /&gt;
&lt;br /&gt;
=== Propuestas de Proyecto Final ===&lt;br /&gt;
[[Propuestas de Proyecto Final para el Máster de Industria 4.0 del curso 2020-2021]] --&amp;gt;&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
[[Propuestas de Proyecto Final para el Máster de Industria 4.0 de la empresa Siarq (2020)]]&lt;br /&gt;
&lt;br /&gt;
[[Otras propuestas de Proyecto Final para el Máster de Industria 4.0 (2020)]]&lt;br /&gt;
&lt;br /&gt;
[[Otras propuestas de Proyecto Final para el Máster de Industria 4.0 de la empresa Siarq (2020)]]&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
user: docent.industria4.0@fundacioupc.com&lt;br /&gt;
password: Industria4@online2020&lt;br /&gt;
[[Uso de Grafana en el VPS del Máster de Industria 4.0 el curso 2023-2024]]&lt;br /&gt;
&lt;br /&gt;
Broker MQTT&lt;br /&gt;
Address:  vps656540.ovh.net&lt;br /&gt;
&lt;br /&gt;
MQTT native plain port 1883&lt;br /&gt;
MQTT Websockets plain port 8081&lt;br /&gt;
MQTT Websockets encrypted port 8082&lt;br /&gt;
&lt;br /&gt;
Allow anonymous: No&lt;br /&gt;
Credentials&lt;br /&gt;
username: user&lt;br /&gt;
password: pass&lt;br /&gt;
&lt;br /&gt;
Xavier Pi, [2/5/25 16:17]&lt;br /&gt;
https://vps656540.ovh.net:5678&lt;br /&gt;
&lt;br /&gt;
Xavier Pi, [2/5/25 16:19]&lt;br /&gt;
user:  masterenindustria4.0@gmail.com&lt;br /&gt;
pass:  Society5_0&lt;br /&gt;
&lt;br /&gt;
Xavier Pi, [2/5/25 17:03]&lt;br /&gt;
http://xavierpi.com/n8n_test&lt;br /&gt;
&lt;br /&gt;
Xavier Pi, [2/5/25 17:23]&lt;br /&gt;
pass:  TransformacioDigital4_0&lt;br /&gt;
Xavier Pi, [2/5/25 17:23]&lt;br /&gt;
masterenindustria4.0@gmail.com&lt;br /&gt;
&lt;br /&gt;
Xavier Pi, [2/5/25 17:23]&lt;br /&gt;
pass:  TransformacioDigital4_0&lt;br /&gt;
--&amp;gt;&lt;/div&gt;</summary>
		<author><name>Jordi Binefa</name></author>
		
	</entry>
	<entry>
		<id>https://www.binefa.com/index.php?title=16_/_5_/_2026_-_IoT,_Embedded_Systems,_Edge_y_Cloud&amp;diff=12283</id>
		<title>16 / 5 / 2026 - IoT, Embedded Systems, Edge y Cloud</title>
		<link rel="alternate" type="text/html" href="https://www.binefa.com/index.php?title=16_/_5_/_2026_-_IoT,_Embedded_Systems,_Edge_y_Cloud&amp;diff=12283"/>
		<updated>2026-05-09T19:51:15Z</updated>

		<summary type="html">&lt;p&gt;Jordi Binefa: Es crea la pàgina amb «= Conceptos previos (30 / 5 / 2025) = Acceso a la base de datos del VPS del máster  = Temario (31 / 5 / 2025) = [https://meet.google.com/uko-nrvp-neu Videoconferencia...».&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Conceptos previos (30 / 5 / 2025) =&lt;br /&gt;
Acceso a la base de datos del VPS del máster&lt;br /&gt;
&lt;br /&gt;
= Temario (31 / 5 / 2025) =&lt;br /&gt;
[https://meet.google.com/uko-nrvp-neu Videoconferencia]&lt;br /&gt;
&lt;br /&gt;
== Repaso del día anterior ==&lt;br /&gt;
[https://www.binefa.cat/training/iot02/pdf/iot02_00_es.pdf Introducción a la placa IoT-02]&lt;br /&gt;
&lt;br /&gt;
[[El protocolo MQTT]]&lt;br /&gt;
&lt;br /&gt;
== Conexión entre la placa IoT-02 y Snap! mediante MQTT ==&lt;br /&gt;
&amp;lt;!-- '''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;'''vps656540.ovh.net'''&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;
&lt;br /&gt;
&amp;lt;!-- '''Nuevo firmware de la placa IoT-02 para el día de hoy''': [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]&lt;br /&gt;
[[Conexión entre la placa IoT-02 y Snap! v8 mediante MQTT]]&lt;br /&gt;
[[Conexión entre la placa IoT-02 y Snap! v9 mediante MQTT]] --&amp;gt;&lt;br /&gt;
[https://snap.berkeley.edu/snap/snap.html#open:https://wa.binefa.cat/snapCodes/IoT-02_board.xml Código Snap! v10] El [https://github.com/jordibinefa/IoT-02/tree/master/codes/IoT-02_mqtt_sync_upcSchool_broker1 ''firmware'' IoT-02_mqtt_sync_upcSchool_broker1] enseña el número MAC por la pantalla OLED cuando la placa IoT-02 se conecta a vuestra wifi. (Cambiar el archivo [https://github.com/jordibinefa/IoT-02/blob/master/codes/IoT-02_mqtt_sync_upcSchool_broker1/IoT-02_wifiCredentials.h IoT-02_wifiCredentials.h] en la línea 21 substituyendo ''iotcat'' por el nombre de la SSID de vuestra wifi y ''1234567890a'' por vuestra contraseña).&lt;br /&gt;
&lt;br /&gt;
== Uso de la base de datos MariaDB para almacenar y leer datos IoT ==&lt;br /&gt;
[[Uso de MariaDB en el VPS del Máster de Industria 4.0 el curso 2024-2025 | Uso de MariaDB en el VPS del Máster de Industria 4.0]]&lt;br /&gt;
&amp;lt;!-- [[Uso de MariaDB en el VPS del Máster de Industria 4.0 el curso 2023-2024]]&lt;br /&gt;
[[Uso de MariaDB en el VPS del Máster de Industria 4.0 el curso 2022-2023 | Uso de MariaDB en el VPS del Máster de Industria 4.0 el curso 2023-2024]]--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Node-RED ==&lt;br /&gt;
[[Asignación de puertos para el curso 2024-2025 | Asignación de puertos para este curso]]&lt;br /&gt;
&amp;lt;!--[[Asignación de puertos para el curso 2023-2024]]&lt;br /&gt;
[[Asignación de puertos para el curso 2022-2023]]--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Uso del Node-RED ===&lt;br /&gt;
[[Uso del NodeRED (2024) | Uso del Node-RED]]&lt;br /&gt;
&amp;lt;!--[[Uso del NodeRED (2023) | Uso del Node-RED]]--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Uso de la base de datos MariaDB desde Node-RED===&lt;br /&gt;
[[Uso de la base de datos MariaDB desde NodeRED (2023) | Uso de la base de datos MariaDB desde Node-RED]]&lt;br /&gt;
&amp;lt;!-- == Telegram ==&lt;br /&gt;
[[Uso de Telegram desde NodeRED]]--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Repaso y dudas de la clase invertida ==&lt;br /&gt;
=== Verificación de nodos instalados ===&lt;br /&gt;
Antes de continuar verificamos que ya tenemos instalado el nodo de MySQL ('''node-red-node-mysql''') y los nodos del panel de control ('''node-red-dashboard''').&lt;br /&gt;
==== Nodo node-red-node-mysql ====&lt;br /&gt;
[https://flows.nodered.org/node/node-red-node-mysql Documentación oficial del nodo ''node-red-node-mysql'']&lt;br /&gt;
&lt;br /&gt;
[[Image:10MariaDbNodeRed00.png|center|thumb|Instalación de los nodos de MariaDB (''MySQL'') en NodeRED]]&lt;br /&gt;
[[Image:11nodoMariaDbNodeRed.png|center|thumb|Aspecto del nodo MySQL en NodeRED]]&lt;br /&gt;
&lt;br /&gt;
==== Nodos node-red-dashboard ====&lt;br /&gt;
[https://flows.nodered.org/node/node-red-dashboard Documentación oficial de los nodos ''node-red-dashboard'']&lt;br /&gt;
&lt;br /&gt;
[[Image:NodosDashboard.png|center|thumb|Nodos del panel de control (''Dashboard'') en NodeRED]]&lt;br /&gt;
=== Acceso al VPS del máster ===&lt;br /&gt;
 ssh -o ServerAliveInterval=30 convidat@vps656540.ovh.net&lt;br /&gt;
o&lt;br /&gt;
 ssh convidat@vps656540.ovh.net&lt;br /&gt;
=== Acceso a la base de datos del VPS del máster ===&lt;br /&gt;
* Con permisos de lectura y escritura:&lt;br /&gt;
 mysql -u iot -p&lt;br /&gt;
* Con permisos de lectura:&lt;br /&gt;
 mysql -u convidat -p&lt;br /&gt;
&lt;br /&gt;
=== Repaso ===&lt;br /&gt;
* Uso de JSON con Snap!&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;
&lt;br /&gt;
* Aleatorización de múltiples datos controlada por el panel de control&lt;br /&gt;
&lt;br /&gt;
* Escritura síncrona de múltiples datos asíncronos al mismo tiempo. Uso del formato de datos json&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
* Telegram--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Ejercicios ==&lt;br /&gt;
=== Ejercicio de '''Snap! con MQTT''' ===&lt;br /&gt;
* Mediante Snap! hacer que en la pantalla aparezca, de forma infinita y con una cadencia de dos segundos, el porcentaje de luz leída por la LDR y después la temperatura en grados centígrados.&lt;br /&gt;
&lt;br /&gt;
=== Ejercicios de '''NodeRED''' ===&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;
==== 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;
==== Ejercicio '''NodeRED-03''' ====&lt;br /&gt;
* Implementad una pasarela (''gateway'') HTTP/MQTT para cambiar el estado de los leds y el relé biestable de la placa IoT-02.&lt;br /&gt;
&lt;br /&gt;
==== Ejercicio '''NodeRED-04''' ====&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;br /&gt;
&lt;br /&gt;
==== Ejercicio '''NodeRED-05''' ====&lt;br /&gt;
* Implementar un flujo de NodeRED que supervise continuamente el valor de la LDR. Introducir dos ''sliders'' para fijar umbrales. Cuando la luz supere el umbral establecido el led rojo se enciende y el relé biestable cambia a SET. Cuando la luz baje del segundo umbral establecido el led rojo se apaga (se enciende el verde) y el relé biestable cambia a RESET.&lt;br /&gt;
&lt;br /&gt;
==== Ejercicio '''NodeRED-06''' ====&lt;br /&gt;
* Implementar un flujo de NodeRED que permita la entrada de un texto y con un botón lo envie a la pantalla OLED.&lt;br /&gt;
&lt;br /&gt;
==== Ejercicio '''NodeRED-07''' ====&lt;br /&gt;
* Implementar un flujo de NodeRED que permita seleccionar un mode de funcionamiento automático o manual. En manual se puede encender y apagar el led blanco mediante un ''switch''. En modo automático el led blanco se enciende o se apaga en función de un umbral consignado mediante un ''slider''. (Para habilitar o inhabilitar un ''switch'' se puede usar ''msg.enabled'').&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--=== Ejercicios '''Telegram''' ===&lt;br /&gt;
* Desde el chat del bot: Al enviar la orden '''/ledWon''' se enciende el led blanco de la placa IoT-02. Al enviar la orden '''/ledWoff''' se apaga el led blanco.&lt;br /&gt;
&lt;br /&gt;
* Desde el chat del bot: Al enviar la orden '''/ledReleSet''' el relé se pone en estado SET. Al enviar la orden '''/ledReleReset''' el relé se pone en estado RESET.&lt;br /&gt;
&lt;br /&gt;
* El chat de vuestro bot recibe un mensaje cuando se aprieta vuestro botón I34 y cuando se deja de apretar.&lt;br /&gt;
&lt;br /&gt;
* Desde el chat del grupo donde pertenece vuestro bot: Al enviar la orden '''/entradas''' el bot contesta con los estados de los botones y la temperatura de la placa.--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Comentario de la práctica para el próximo día ===&lt;br /&gt;
El enunciado estará en breve en el campus. Se comenzará después de haber usado Grafana y Telegram.&lt;/div&gt;</summary>
		<author><name>Jordi Binefa</name></author>
		
	</entry>
	<entry>
		<id>https://www.binefa.com/index.php?title=IoT,_Embedded_Systems,_Edge_y_Cloud_(2026)&amp;diff=12282</id>
		<title>IoT, Embedded Systems, Edge y Cloud (2026)</title>
		<link rel="alternate" type="text/html" href="https://www.binefa.com/index.php?title=IoT,_Embedded_Systems,_Edge_y_Cloud_(2026)&amp;diff=12282"/>
		<updated>2026-05-09T19:50:55Z</updated>

		<summary type="html">&lt;p&gt;Jordi Binefa: /* Por días */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;* [[Temario - IoT, Embedded Systems, Edge y Cloud (2026)]]&lt;br /&gt;
* Acceso rápido a esta página: https://t.ly/-LmC9&lt;br /&gt;
= Por días =&lt;br /&gt;
* [[9 / 5 / 2026 - IoT, Embedded Systems, Edge y Cloud]]&lt;br /&gt;
* 16 / 5 / 2026 - IoT, Embedded Systems, Edge y Cloud&lt;br /&gt;
* [[16 / 5 / 2026 - IoT, Embedded Systems, Edge y Cloud]]&lt;br /&gt;
* 23 / 5 / 2026 - IoT, Embedded Systems, Edge y Cloud&lt;br /&gt;
&amp;lt;!-- &lt;br /&gt;
* [[9 / 5 / 2026 - Impresión 3D, Robótica e Iot, Hands on y MVPs]] (versió preliminar)&lt;br /&gt;
* [[24 / 5 / 2025 - Impresión 3D, Robótica e Iot, Hands on y MVPs]]&lt;br /&gt;
* [[31 / 5 / 2025 - Impresión 3D, Robótica e Iot, Hands on y MVPs]]&lt;br /&gt;
* [[7 / 6 / 2025 - Impresión 3D, Robótica e Iot, Hands on y MVPs]] --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Herramientas y recursos =&lt;br /&gt;
* [[Adición del ESP32 en el IDE de Arduino]]&lt;br /&gt;
* [[Simulador de la placa IoT-02 en línea]] &lt;br /&gt;
&amp;lt;!-- [https://meet.google.com/noa-yasq-xeb Videoconferencia] --&amp;gt;&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
username:   docent.industria4.0@talent.upc.edu&lt;br /&gt;
password:   Industria4@online2020&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
* [https://github.com/jordibinefa/IoT-02 Placa IoT-02 en GitHub] ([https://github.com/jordibinefa/iot02-simulator Código del gemelo digital de la placa IoT-02 en GitHub])&lt;br /&gt;
* [https://www.binefa.cat/training/iot02/pdf/iot02_00_es.pdf Introducción a la placa IoT-02 en castellano] en pdf ([https://www.binefa.cat/training/iot02/pdf/iot02_00_ca.pdf ''Introducció a la placa IoT-02'' en catalán])&lt;br /&gt;
* [https://youtu.be/_EIXCGkGQ0U Vídeo de introducción a la placa IoT-02]&lt;br /&gt;
* [https://youtu.be/JothMIY4DWE Vídeo de configuración del IDE de Arduino v1.8.19]&lt;br /&gt;
* [https://youtu.be/UjtULePAbTE Vídeo de configuración del IDE de Arduino v2] ([https://youtu.be/BvdHeNRDgL8 Vídeo de como usar el IDE de Arduino v2 para programar la placa IoT-02])&lt;br /&gt;
* [https://binefa.com/upc-school/libraries_20240420.zip Enlace para bajar las bibliotecas (''libraries'') necesarias para los códigos de ''firmware'' usados en este máster] para el IDE de Arduino ([https://www.arduino.cc/ Página de Arduino])&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- [https://www.binefa.cat/training/iot02/libraries/libraries_20240420.zip Enlace para bajar las bibliotecas (''libraries'') necesarias para los códigos de ''firmware'' usados en este máster] para el IDE de Arduino ([https://www.arduino.cc/ Página de Arduino])&lt;br /&gt;
&lt;br /&gt;
[http://rebost.binefa.cat/iot/videos/01_Intro_placa_IoT-02_es.mkv Vídeo introductorio a la placa IoT-02] &lt;br /&gt;
&lt;br /&gt;
[http://rebost.binefa.cat/iot/videos/02_IDE_Arduino_ESP32_es.mkv Vídeo de instalación del Arduino IDE y algunas bibliotecas extra para probar los códigos en la placa IoT-02] --&amp;gt;&lt;br /&gt;
&amp;lt;!-- [[Instalación de controladores (drivers) para Tecnologías IoT, Hands on y MVP (2022)]] --&amp;gt;&lt;br /&gt;
&amp;lt;!-- [http://formacio.things.cat/mac_IoT-02_mI40/ Herramienta de gestión de la MAC de la placa IoT-02, mediante un cliente web usando JS] --&amp;gt;&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
[[Instalación de programas para Tecnologías IoT, Hands on y MVP (2022)]] --&amp;gt;&lt;br /&gt;
* [[esptool: Herramienta para borrar toda la memoria flash del ESP32 en caso de tener problemas en la subida del firmware]]&lt;br /&gt;
&amp;lt;!-- [http://popotamo.binefa.cat/iot/maqVirt/IoT%20-%20eCat%20-%20Debian%2011.x%2064-bit_v20210304_00.zip Máquina virtual para VMware Workstation Player] basada en Debian GNU/Linux 11. Usuario '''clot''' y contraseña '''fjeclot'''. --&amp;gt;&lt;br /&gt;
* [https://www.onlinegdb.com/ Programación en línea para C, C++, Python y JavaScript, entre otros]&lt;br /&gt;
* [https://app.edublocks.org/#Python Herramienta de conversión de bloques de programación a Python]&lt;br /&gt;
* [https://upcommons.upc.edu/handle/2117/363087 Combining Low-Code Programming and SDL-Based Modeling with Snap! in the Industry 4.0 Context]&lt;br /&gt;
* [[Asignación de puertos para el curso 2025-2026]]&lt;br /&gt;
&amp;lt;!-- * [[Asignación de puertos para el curso 2024-2025]]&lt;br /&gt;
[[Asignación de puertos para el curso 2023-2024]]&lt;br /&gt;
== Proyecto Final ==&lt;br /&gt;
[https://onedrive.live.com/view.aspx?resid=7B61369ED41066A2!819702&amp;amp;ithint=file%2cpptx&amp;amp;authkey=!AN_I9zWRZwOSkKE Asignación de proyectos]&lt;br /&gt;
&lt;br /&gt;
=== Propuestas de Proyecto Final ===&lt;br /&gt;
[[Propuestas de Proyecto Final para el Máster de Industria 4.0 del curso 2020-2021]] --&amp;gt;&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
[[Propuestas de Proyecto Final para el Máster de Industria 4.0 de la empresa Siarq (2020)]]&lt;br /&gt;
&lt;br /&gt;
[[Otras propuestas de Proyecto Final para el Máster de Industria 4.0 (2020)]]&lt;br /&gt;
&lt;br /&gt;
[[Otras propuestas de Proyecto Final para el Máster de Industria 4.0 de la empresa Siarq (2020)]]&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
user: docent.industria4.0@fundacioupc.com&lt;br /&gt;
password: Industria4@online2020&lt;br /&gt;
[[Uso de Grafana en el VPS del Máster de Industria 4.0 el curso 2023-2024]]&lt;br /&gt;
&lt;br /&gt;
Broker MQTT&lt;br /&gt;
Address:  vps656540.ovh.net&lt;br /&gt;
&lt;br /&gt;
MQTT native plain port 1883&lt;br /&gt;
MQTT Websockets plain port 8081&lt;br /&gt;
MQTT Websockets encrypted port 8082&lt;br /&gt;
&lt;br /&gt;
Allow anonymous: No&lt;br /&gt;
Credentials&lt;br /&gt;
username: user&lt;br /&gt;
password: pass&lt;br /&gt;
&lt;br /&gt;
Xavier Pi, [2/5/25 16:17]&lt;br /&gt;
https://vps656540.ovh.net:5678&lt;br /&gt;
&lt;br /&gt;
Xavier Pi, [2/5/25 16:19]&lt;br /&gt;
user:  masterenindustria4.0@gmail.com&lt;br /&gt;
pass:  Society5_0&lt;br /&gt;
&lt;br /&gt;
Xavier Pi, [2/5/25 17:03]&lt;br /&gt;
http://xavierpi.com/n8n_test&lt;br /&gt;
&lt;br /&gt;
Xavier Pi, [2/5/25 17:23]&lt;br /&gt;
pass:  TransformacioDigital4_0&lt;br /&gt;
Xavier Pi, [2/5/25 17:23]&lt;br /&gt;
masterenindustria4.0@gmail.com&lt;br /&gt;
&lt;br /&gt;
Xavier Pi, [2/5/25 17:23]&lt;br /&gt;
pass:  TransformacioDigital4_0&lt;br /&gt;
--&amp;gt;&lt;/div&gt;</summary>
		<author><name>Jordi Binefa</name></author>
		
	</entry>
	<entry>
		<id>https://www.binefa.com/index.php?title=Uso_de_MariaDB_en_el_VPS_del_M%C3%A1ster_de_Industria_4.0_el_curso_2025-2026&amp;diff=12281</id>
		<title>Uso de MariaDB en el VPS del Máster de Industria 4.0 el curso 2025-2026</title>
		<link rel="alternate" type="text/html" href="https://www.binefa.com/index.php?title=Uso_de_MariaDB_en_el_VPS_del_M%C3%A1ster_de_Industria_4.0_el_curso_2025-2026&amp;diff=12281"/>
		<updated>2026-05-09T19:38:31Z</updated>

		<summary type="html">&lt;p&gt;Jordi Binefa: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Acceso al terminal del VPS =&lt;br /&gt;
* Para acceder al terminal remoto del VPS desde Windows, abrir el teminal (''cmd'') o el ''powershell'' y escribir:&lt;br /&gt;
 ssh '''convidat'''@vps656540.ovh.net&lt;br /&gt;
La contraseña es ''benvingut''&lt;br /&gt;
&lt;br /&gt;
* Para acceder al terminal remoto del VPS desde Linux, abrir el teminal escribir:&lt;br /&gt;
 ssh '''convidat'''@vps656540.ovh.net&lt;br /&gt;
y en caso de querer enviar cada 30 segundos un ''blank token'' para evitar la desconexión por ''time out'':&lt;br /&gt;
 ssh -o ServerAliveInterval=30 '''convidat'''@vps656540.ovh.net&lt;br /&gt;
= Información sobre la instalación de la base de datos MariaDB =&lt;br /&gt;
'''Este apartado es puramente informativo'''. En el VPS ya está instalada la base de datos.&lt;br /&gt;
&lt;br /&gt;
[https://www.digitalocean.com/community/tutorials/how-to-install-mariadb-on-debian-11 Un tutorial de instalación de MariaDB en Debian 11]&lt;br /&gt;
&lt;br /&gt;
Pasos de la instalación desde el terminal:&lt;br /&gt;
 sudo apt update&lt;br /&gt;
 sudo apt install mariadb-server&lt;br /&gt;
 sudo mariadb-secure-installation ''(en este paso el sistema pregunta una contraseña para el usuario '''root''')''&lt;br /&gt;
&lt;br /&gt;
[https://www.digitalocean.com/community/tutorials/how-to-create-a-new-user-and-grant-permissions-in-mysql Un tutorial de creación de usuarios con diferentes permisos (''privilegios'')]&lt;br /&gt;
&lt;br /&gt;
Desde el terminal del sistema operativo se pide entrar al terminal de MariaDB. La primera vez como usuario ''root'':&lt;br /&gt;
 sudo mysql -u root -p&lt;br /&gt;
 ''(el sistema pide la contraseña del usuario root)''&lt;br /&gt;
Una vez dentro del terminal de MariaDB se crean los usuarios ''iot'' y ''convidat'' con sus respectivas contraseñas. Se crea la base de datos ''aula206'', se otorgan todos los permisos al usuario ''iot'' y tan solo la lectura al usuario ''convidat'':&lt;br /&gt;
 CREATE USER 'iot'@'localhost' IDENTIFIED BY 'iot';&lt;br /&gt;
 CREATE USER 'convidat'@'localhost' IDENTIFIED BY 'benvingut';&lt;br /&gt;
 &lt;br /&gt;
 CREATE DATABASE aula206;&lt;br /&gt;
 SHOW DATABASES;&lt;br /&gt;
 USE aula206;&lt;br /&gt;
 &lt;br /&gt;
 GRANT ALL PRIVILEGES ON aula206.* TO 'iot'@'localhost';&lt;br /&gt;
 GRANT SELECT ON aula206.* TO 'convidat'@'localhost';&lt;br /&gt;
 FLUSH PRIVILEGES;&lt;br /&gt;
&lt;br /&gt;
= Acceso a la base de datos desde el terminal del VPS =&lt;br /&gt;
Para acceder a la base de datos hay tres usuarios con permisos diferentes:&lt;br /&gt;
&lt;br /&gt;
- '''root''': Tiene todos los permisos. Puede crear usuarios y bases de datos.&lt;br /&gt;
&lt;br /&gt;
- '''iot''': Tiene permisos de '''lectura y escritura''' sobre la base de datos '''aula206'''.&lt;br /&gt;
&lt;br /&gt;
- '''convidat''': Tiene permisos de '''lectura''' sobre la base de datos '''aula206'''.&lt;br /&gt;
&lt;br /&gt;
Para acceder al terminal de MariaDB como usuario '''iot''':&lt;br /&gt;
 mysql -u '''iot''' -p&lt;br /&gt;
 (el sistema pregunta por la contraseña de este usuario. Es la que sale en el apartado anterior después de ''IDENTIFIED BY'')&lt;br /&gt;
&lt;br /&gt;
Para acceder al terminal de MariaDB como usuario '''convidat''':&lt;br /&gt;
 mysql -u '''convidat''' -p&lt;br /&gt;
 (el sistema pregunta por la contraseña de este usuario. Es la que sale en el apartado anterior después de ''IDENTIFIED BY'')&lt;br /&gt;
&lt;br /&gt;
= Creación de tablas =&lt;br /&gt;
Para crear tablas en la base de datos hace falta que el usuario tenga permisos de escritura a la base de datos ('''iot''' tiene permisos de escritura en la base de datos '''aula206'''. '''convidat''' no tiene permisos de escritura en la base de datos '''aula206''').&lt;br /&gt;
&lt;br /&gt;
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 [[Asignación de puertos para el curso 2022-2023 | número de puerto que se os ha asignado]].&lt;br /&gt;
&lt;br /&gt;
 mysql -u '''iot''' -p&lt;br /&gt;
 (el sistema pregunta por la contraseña de este usuario. Es la que sale en el apartado anterior después de ''IDENTIFIED BY'')&lt;br /&gt;
 USE aula206;&lt;br /&gt;
 '''CREATE''' TABLE m'''28XX'''_Temperatura (&lt;br /&gt;
  time TIMESTAMP DEFAULT CURRENT_TIMESTAMP,&lt;br /&gt;
  value FLOAT,&lt;br /&gt;
  PRIMARY KEY (time));&lt;br /&gt;
'''value''' es el nombre del valor que vamos a introducir en la tabla. Se declara como ''FLOAT'' (número real. Permite decimales).&lt;br /&gt;
&lt;br /&gt;
= Borrado de tablas =&lt;br /&gt;
'''Id con cuidado en el momento de borrar una tabla. El proceso borra todos los datos y la misma tabla. No es posible recuperar los datos de las tablas si no se ha hecho una copia de seguridad'''.&lt;br /&gt;
&lt;br /&gt;
Para borrar tablas en la base de datos hace falta que el usuario tenga permisos de escritura a la base de datos ('''iot''' tiene permisos de escritura en la base de datos '''aula206'''. '''convidat''' no tiene permisos de escritura en la base de datos '''aula206'''). &lt;br /&gt;
 mysql -u '''iot''' -p&lt;br /&gt;
 (el sistema pregunta por la contraseña de este usuario. Es la que sale en el apartado anterior después de ''IDENTIFIED BY'')&lt;br /&gt;
 USE aula206;&lt;br /&gt;
 '''DROP TABLE''' m28XX_Temperatura;&lt;br /&gt;
&lt;br /&gt;
= Inserción de datos =&lt;br /&gt;
La inserción (también conocida por escritura) de datos tiene que hacerla un usuario con permisos suficientes (el usuario '''iot''' puede escribir).&lt;br /&gt;
&lt;br /&gt;
Ejemplo de inserción del valor 23.4 como valor en el campo '''value'''.&lt;br /&gt;
 '''insert''' into m28XX_Temperatura (value) values (23.4);&lt;br /&gt;
&lt;br /&gt;
= Lectura de datos =&lt;br /&gt;
La lectura de datos tiene que hacerla un usuario con permisos suficientes (los usuarios '''iot''' y '''convidat''' pueden leer).&lt;br /&gt;
&lt;br /&gt;
[https://mariadb.com/kb/es/select/ Documentación oficial de la orden SELECT].&lt;br /&gt;
&lt;br /&gt;
Visualización de todos los datos de la tabla m28XX_Temperatura:&lt;br /&gt;
 '''select''' * from m28XX_Temperatura;&lt;br /&gt;
&lt;br /&gt;
Ejemplo de respuesta del terminal de MariaDB:&lt;br /&gt;
 MariaDB [aula206]&amp;gt; '''select * from m28XX_Temperatura;'''&lt;br /&gt;
 +---------------------+-------+&lt;br /&gt;
 | time                | value |&lt;br /&gt;
 +---------------------+-------+&lt;br /&gt;
 | 2023-04-05 17:23:59 |  23.4 |&lt;br /&gt;
 | 2023-04-05 17:28:29 |  23.7 |&lt;br /&gt;
 +---------------------+-------+&lt;br /&gt;
 2 rows in set (0.001 sec)&lt;br /&gt;
&lt;br /&gt;
[https://mariadb.com/kb/en/getting-data-from-mariadb/ Getting Data from MariaDB]&lt;br /&gt;
&lt;br /&gt;
= Creación de tablas vista =&lt;br /&gt;
Para poder usar la base de datos en sistemas externos de graficación nos hará falta que el registro del momento de inserción del dato esté expresado en [https://www.unixtimestamp.com/ formato de la época UNIX]. Ejemplo de visualización de una tabla vista con el valor del tiempo en formato Unix: &lt;br /&gt;
 MariaDB [aula206]&amp;gt; select * from m28XX_Temperatura_v;&lt;br /&gt;
 +------------+-------+&lt;br /&gt;
 | time       | value |&lt;br /&gt;
 +------------+-------+&lt;br /&gt;
 | 1680708239 |  23.4 |&lt;br /&gt;
 | 1680708509 |  23.7 |&lt;br /&gt;
 +------------+-------+&lt;br /&gt;
 2 rows in set (0.000 sec)&lt;br /&gt;
&lt;br /&gt;
Creación de la tabla vista '''m28XX_Temperatura_v''' con la unidad de tiempo cambiada (tomando como origen la tabla '''m28XX_Temperatura'''):&lt;br /&gt;
 '''CREATE VIEW''' m28XX_Temperatura_v AS select UNIX_TIMESTAMP(time) as time, value from m28XX_Temperatura;&lt;br /&gt;
&lt;br /&gt;
= Inserción y lectura de datos múltiples =&lt;br /&gt;
Habitualmente nos hará falta introducir un grupo de datos al mismo tiempo. Por ejemplo, esta tabla contiene tres valores en el mismo momento del registro: &lt;br /&gt;
 MariaDB [aula206]&amp;gt; select * from m28XX_T_RH_P_v;&lt;br /&gt;
 +------------+--------+---------+---------+&lt;br /&gt;
 | time       | valueT | valueRH | valueP  |&lt;br /&gt;
 +------------+--------+---------+---------+&lt;br /&gt;
 | 1680884504 |   23.4 |   45.64 | 1002.34 |&lt;br /&gt;
 | 1680884734 |   23.7 |   45.21 | 1003.04 |&lt;br /&gt;
 | 1680885724 |  17.89 |   44.32 | 1001.23 |&lt;br /&gt;
 | 1680885726 |  19.03 |   40.65 | 1002.11 |&lt;br /&gt;
 | 1680885728 |  15.43 |   56.78 | 1000.87 |&lt;br /&gt;
 | 1680886069 |  19.03 |   40.65 | 1002.11 |&lt;br /&gt;
 +------------+--------+---------+---------+&lt;br /&gt;
 6 rows in set (0.000 sec)&lt;br /&gt;
&lt;br /&gt;
* '''Creación''' de la tabla con datos múltiples ('''valueT''', '''valueRH''' y '''valueP'''):&lt;br /&gt;
 '''CREATE TABLE''' `m28XX_T_RH_P` (&lt;br /&gt;
  `time` TIMESTAMP DEFAULT CURRENT_TIMESTAMP,&lt;br /&gt;
  `'''valueT'''` FLOAT,&lt;br /&gt;
  `'''valueRH'''` FLOAT,&lt;br /&gt;
  `'''valueP'''` FLOAT,&lt;br /&gt;
  PRIMARY KEY (`time`))&lt;br /&gt;
 ENGINE = InnoDB;&lt;br /&gt;
&lt;br /&gt;
* '''Inserción''' de datos múltiples:&lt;br /&gt;
 '''insert into''' m28XX_T_RH_P ('''valueT''','''valueRH''','''valueP''') values (23.4,45.64,1002.34);&lt;br /&gt;
* '''Lectura''' de datos múltiples:&lt;br /&gt;
 '''select''' * '''from''' m28XX_T_RH_P;&lt;br /&gt;
* '''Creación''' de la '''tabla vista''':&lt;br /&gt;
 '''CREATE VIEW''' m28XX_T_RH_P_v '''AS''' select UNIX_TIMESTAMP(time) as time, valueT, valueRH, valueP from m28XX_T_RH_P;&lt;br /&gt;
* '''Borrado''' de la '''tabla vista'''&lt;br /&gt;
 '''DROP VIEW''' IF EXISTS m28XX_T_RH_P_v;&lt;br /&gt;
* '''Borrado''' de la '''tabla'''&lt;br /&gt;
 '''DROP TABLE''' m28XX_T_RH_P;&lt;/div&gt;</summary>
		<author><name>Jordi Binefa</name></author>
		
	</entry>
</feed>