Diferència entre revisions de la pàgina «DAM 2020-2021»

De binefa.com
Salta a la navegació Salta a la cerca
 
(339 revisions intermèdies per 2 usuaris que no es mostren)
Línia 1: Línia 1:
 +
= Horari a partir del 18 de gener =
 +
[[Image:PPandGener2021_DAM2b.png|center|2n de DAM]]
 +
 
= Teleconferència del curs 2020-2021 =
 
= Teleconferència del curs 2020-2021 =
 
[https://meet.google.com/wum-fjat-cow Adreça de la teleconferència]
 
[https://meet.google.com/wum-fjat-cow Adreça de la teleconferència]
 +
 +
[https://docs.google.com/spreadsheets/d/1kvyONuw9stK7VuuQS8i45lzwkhquwA_9jmXnNemjZNk/edit#gid=306804274 Llista 2n de DAM 2020-2021]
 +
 +
[[Carpetes compartides 2n de DAM. Curs 2020-2021]]
 +
 +
= Alguns vídeos d'ajuda =
 +
== QML ==
 +
[https://www.youtube.com/playlist?list=PL6CJYn40gN6hdNC1IGQZfVI707dh9DPRc Introduction to Qt / QML - all videos so far] by [https://www.kdab.com/ KDAB] ([https://github.com/KDAB/kdabtv/tree/master/qml-intro Codis QML de la sèrie de vídeos])
 +
 +
[[Vídeos QML]] de connexió entre el rerefons en C++ i el frontal en QML.
 +
 +
[https://www.youtube.com/watch?v=9BRJ1qJkjZM Photoshop to QML exporter]
 +
 +
== Pseudoservidor UDP ==
 +
[https://youtu.be/lKNdgHVRal0 Pseudoservidor UDP emprant Qt5 (1/2)]
 +
 +
[https://youtu.be/ElYaaytNb0s Pseudoservidor UDP emprant Qt5 (2/2)]
  
 
= Algunes classes =
 
= Algunes classes =
== 20201019 ('''lliurament Ex01 v2''') ==
+
== 20210609 (3h presencial) '''Avaluació extraordinària''' ==
[https://binefa.cat/dam2021/20201019_qt/ Codis d'avui]
+
[https://binefa.cat/dam2021/20210610_xtra/ Enunciats de l'avaluació extraordinària]
 +
 
 +
== 20210528 (2h en línia) '''Presentació de projectes de 2n de DAM''' ==
 +
[https://meet.google.com/vkc-uupk-kai Sala Meet de la presentació de projectes]
 +
 
 +
== 20210527 (3h en línia) '''Presentació de projectes de 2n de DAM''' ==
 +
[https://meet.google.com/vkc-uupk-kai Sala Meet de la presentació de projectes]
 +
 
 +
== 20210520 (1h presencial) ==
 +
Seguim amb el [[Projecte de final de CFGS DAM (2020-2021)]]
 +
 
 +
== 20210517 (1h presencial) ==
 +
Seguim amb el [[Projecte de final de CFGS DAM (2020-2021)]]
 +
 
 +
== 20210514 (2h presencial) ==
 +
Seguim amb el [[Projecte de final de CFGS DAM (2020-2021)]]
 +
 
 +
== 20210513 (3h presencial) ==
 +
Seguim amb el [[Projecte de final de CFGS DAM (2020-2021)]]
 +
 
 +
== 20210510 (1h presencial) ==
 +
Seguim amb el [[Projecte de final de CFGS DAM (2020-2021)]]
 +
 
 +
== 20210507 (2h presencial) ==
 +
Seguim amb el [[Projecte de final de CFGS DAM (2020-2021)]]
 +
 
 +
== 20210506 (3h presencial) ==
 +
Seguim amb el [[Projecte de final de CFGS DAM (2020-2021)]]
 +
 
 +
== 20210503 (1h presencial) ==
 +
Seguim amb el [[Projecte de final de CFGS DAM (2020-2021)]]
 +
 
 +
== 20210430 (2h presencial) ==
 +
Seguim amb el [[Projecte de final de CFGS DAM (2020-2021)]]
 +
 
 +
== 20210429 (3h presencial) ==
 +
Seguim amb el [[Projecte de final de CFGS DAM (2020-2021)]]
 +
 
 +
== 20210426 '''Comença el projecte''' (1h presencial) ==
 +
Comentem les notes provisionals i comença el temps de projecte.
 +
 
 +
== 20210423 '''Darrer dia''' (2h síncrona) ==
 +
Feu alguns exercicis que no vau fer ahir de l'[https://binefa.cat/dam2021/20210423_darrerDia/ examen d'ordinària del curs 2020-2021] amb l'objectiu de pujar nota. He afegit l'arxiu de NodeRED de control de l'ascensor i he corregit alguna errata que vau detectar ahir.
 +
 
 +
== 20210422 '''Examen''' (3h presencial) ==
 +
[https://binefa.cat/dam2021/20210422_ex/ Examen d'ordinària del curs 2020-2021]
 +
 
 +
[http://extensions.snap.berkeley.edu/ Snap! per HTTP] per a fer servir sòcols web no segurs.
 +
 
 +
He afegit [https://binefa.cat/dam2021/20210422_ex/ascensor.nodered.txt flux de NodeRED per a l'ascensor]. Recordeu-vos de canviar la MAC a tot arreu i d'afegir-hi usuari i contrasenya al ''broker''.
 +
 
 +
''Errata'':
 +
 
 +
M09UF3.6) Feu un control del led blanc mitjançant el NodeRED emprant el protocol UDP
 +
 
 +
== 20210419 (1h presencial) ==
 +
Per a canviar l'Spread Factor ([https://github.com/jordibinefa/arduino-IDE-codes/blob/master/esp32_lorawan_ttnEsp32_ttgo_multichannel_02b/esp32_lorawan_ttnEsp32_ttgo_multichannel_02b.ino línia 497 d'aquest codi d'exemple]):
 +
 
 +
  // Set data rate and transmit power for uplink (note: txpow seems to be ignored by the library)
 +
  LMIC_setDrTxpow('''DR_SF7''', 14);
 +
 
 +
 
 +
== 20210416 (2h presencial) ==
 +
Anem acabant els [[Exercicis d'Internet de les Coses (M15UF1, M09UF2 i M09UF3 del curs 2020-2021)]] i comentem algunes propostes de projectes relacionats amb M03UF1, M15UF1, M09UF2 i M09UF3
 +
 
 +
[https://binefa.cat/dam2021/20210416/ Alguns codis comentats avui]
 +
 
 +
Instal·lació de l'OpenMPI a la màquina (per a molts, virtual) de Linux.
 +
 
 +
== 20210415 (3h presencial) ==
 +
[https://binefa.cat/dam2021/20210415/funcio4sortides.nodered.txt Exemple de funció amb 4 sortides] (Cal que canvieu a la funció la única sortida per defecte a quatre)
 +
 
 +
var amunt = {payload: "amunt"};
 +
var mig = {payload: "mig"};
 +
var avall = {payload: "avall"};
 +
 +
return [amunt,mig,avall,msg];
 +
 
 +
[https://binefa.cat/dam2021/20210415/ Alguns codis comentats avui]
 +
 
 +
Instal·lació de l'OpenMPI a la màquina (per a molts, virtual) de Linux.
 +
 
 +
Anem acabant els [[Exercicis d'Internet de les Coses (M15UF1, M09UF2 i M09UF3 del curs 2020-2021)]] i comentem algunes propostes de projectes relacionats amb M03UF1, M15UF1, M09UF2 i M09UF3
 +
 
 +
== 20210412 (1h presencial) ==
 +
Anem acabant els [[Exercicis d'Internet de les Coses (M15UF1, M09UF2 i M09UF3 del curs 2020-2021)]] i comentem algunes propostes de projectes relacionats amb M03UF1, M15UF1, M09UF2 i M09UF3
 +
 
 +
== 20210409 (2h síncrona) ==
 +
[[Exercicis d'Internet de les Coses (M15UF1, M09UF2 i M09UF3 del curs 2020-2021)]]
 +
 
 +
== 20210408 (3h presencial) ==
 +
[https://www.things.cat/index.php?title=P%C3%A0gina_principal#Programaci.C3.B3_remota_.28OTA.29 Programació remota (OTA)] (JESUITESFP / IOTcl1220_)
 +
 
 +
[[Exercicis d'Internet de les Coses (M15UF1, M09UF2 i M09UF3 del curs 2020-2021)]]
 +
 
 +
[https://binefa.cat/dam2021/20210408/ Alguns codis comentats avui]
 +
 
 +
== 20210326 (2h presencial) ==
 +
[[Exercicis d'Internet de les Coses (M15UF1, M09UF2 i M09UF3 del curs 2020-2021)]]
 +
 
 +
[https://binefa.cat/dam2021/20210326/ Alguns codis comentats avui]
 +
 
 +
[https://binefa.cat/dam2021/20210326/cadena4bytes_a_float.nodered.txt Flux de NodeRED que agafa una cadena de text de 4 bytes i ho converteix a un número real (''float'')]
 +
 
 +
== 20210325 (3h presencial) ==
 +
[[Exercicis d'Internet de les Coses (M15UF1, M09UF2 i M09UF3 del curs 2020-2021)]]
 +
 
 +
[https://binefa.cat/dam2021/20210325/ Alguns codis comentats avui] per a passar vectors de bytes (''unsigned char'') a nombres enters o reals fent servir les funcions de Javascript per a NodeRED.
 +
 
 +
== 20210322 (1h presencial) ==
 +
[[Exercicis d'Internet de les Coses (M15UF1, M09UF2 i M09UF3 del curs 2020-2021)]]
 +
 
 +
Comentem l'exercici 3.7
 +
 
 +
== 20210319 (2h síncrona) ==
 +
[[Exercicis d'Internet de les Coses (M15UF1, M09UF2 i M09UF3 del curs 2020-2021)]]
 +
 
 +
[https://binefa.cat/dam2021/20210319/ Alguns codis explicats avui]
 +
 
 +
=== '''FreeRTOS''' ===
 +
[https://github.com/jordibinefa/IoT-02/tree/master/codes/freeRTOS Alguns codis funcionant amb FreeRTOS per a la placa IoT-02 basada en ESP32]
 +
 
 +
[https://techtutorialsx.com/2017/05/06/esp32-arduino-creating-a-task/ Explicació d'un codi bàsic en FreeRTOS]
 +
 
 +
[https://www.freertos.org/Documentation/RTOS_book.html '''Manual de referència per al FreeRTOS''']
 +
 
 +
== 20210318 (3h presencial) ==
 +
[[Exercicis d'Internet de les Coses (M15UF1, M09UF2 i M09UF3 del curs 2020-2021)]]
 +
 
 +
sudo cat '''/etc/mosquitto/mosquitto.conf''':
 +
pid_file /var/run/mosquitto.pid
 +
 +
persistence true
 +
persistence_location /var/lib/mosquitto/
 +
 +
log_dest file /var/log/mosquitto/mosquitto.log
 +
 +
include_dir /etc/mosquitto/conf.d
 +
 +
'''allow_anonymous false'''
 +
'''password_file /etc/mosquitto/certs/contrasenyes.txt'''
 +
 +
'''listener 1883'''
 +
 +
listener 9001
 +
protocol websockets
 +
 
 +
cat '''/etc/mosquitto/certs/contrasenyes.txt''' (usuaris ''ecat'' i ''ad''):
 +
'''ecat''':$6$SdtdpCPcQ4wonN7Y$Dgix123455BRyzvUQxMKX2lmr/4r/K3b9/su9KzMdMZhLxS3cm6a+nCrRahz+r9DFOh0ecsoZVwlG+G9tnA==
 +
'''ad''':$6$Nu8O3BxNBORplkSW$LZAqGNiPnX1HnC0ZbI789787867677565eJZAQnWWrWDaFjJz5OIZ8ljJRBbL6GFCKlgoaUFllFGvBhMtnfJQ==
 +
 
 +
== 20210315 (1h presencial) ==
 +
Conceptes de [[LoRa 2020-2021]]
 +
 
 +
== 20210312 (2h presencial) ==
 +
[[Exercicis d'Internet de les Coses (M15UF1, M09UF2 i M09UF3 del curs 2020-2021)]]
 +
 
 +
[https://binefa.cat/dam2021/20210312_iot/missatgeAscendentTTN.nodered.txt Codi de desxifratge d'un missatge ascendent de The Things Network]
 +
 
 +
Codi basat en [https://binefa.cat/IoT/nodeRed/nodeRed01.pdf la pàgina 42 d'aquest pdf]:
 +
var b = new Buffer(msg.payload.payload_raw,'base64')
 +
msg.payload = b.toString()
 +
return msg;
 +
 
 +
== 20210311 (3h presencial) ==
 +
Avui assistiré les dues primeres hores. La tercera he de ser a una sessió d'avaluació, aneu fent els [[Exercicis d'Internet de les Coses (M15UF1, M09UF2 i M09UF3 del curs 2020-2021)]].
 +
 
 +
La pràctica de LoRaWAN requereix que hi sigueu a un lloc amb cobertura. Per tant, feu tot el possible per a ser-hi presencialment.
 +
 
 +
=== '''LoRaWAN''' ===
 +
Doneu-vos d'alta com a usuaris de [https://www.thethingsnetwork.org/ The Things Network]
 +
 
 +
[[LoRa 2020-2021]]
 +
 
 +
== 20210308 (1h presencial) ==
 +
Repassem el funcionament de la vostra placa IoT-02 al vostre ''broker'' MQTT, el vostre NodeRED, el vostre InfluxDB i el vostre Grafana.
 +
 
 +
=== '''FreeRTOS''' ===
 +
[https://github.com/jordibinefa/IoT-02/tree/master/codes/freeRTOS Alguns codis funcionant amb FreeRTOS per a la placa IoT-02 basada en ESP32]
 +
 
 +
[https://techtutorialsx.com/2017/05/06/esp32-arduino-creating-a-task/ Explicació d'un codi bàsic en FreeRTOS]
 +
 
 +
[https://www.freertos.org/Documentation/RTOS_book.html '''Manual de referència per al FreeRTOS''']
 +
 
 +
== 20210305 (2h síncrona) ==
 +
Continuem amb el temes d'ahir.
 +
 
 +
=== HTTP a MQTT ===
 +
[https://binefa.cat/dam2021/20210304_iot/http_a_mqtt/http_mqtt.nodered.txt Flux de NodeRED per a convertir crides HTTP a MQTT]
 +
 
 +
==== Exercici d'HTTP a MQTT ====
 +
Mitjançant ''curl'' o navegador web encén i/o apaga qualsevol led de la placa IoT-02 connectada a un ''broker'' MQTT.
 +
 
 +
== 20210304 (3h presencial) ==
 +
[https://binefa.cat/dam2021/20210304_iot/ Alguns codis comentats avui]
 +
 
 +
=== Bases de dades temporals i visualització ===
 +
Seguim amb la instal·lació d'InfluxDB i Grafana.
 +
 
 +
==== Exercici de bases de dades temporals i visualització ====
 +
* Visualitzeu a Grafana les dades de temperatura, humitat relativa, pressió atmosfèrica i de nivell de llum.
 +
 
 +
=== HTTP a MQTT ===
 +
[https://binefa.cat/dam2021/20210304_iot/http_a_mqtt/http_mqtt.nodered.txt Flux de NodeRED per a convertir crides HTTP a MQTT]
 +
 
 +
=== '''FreeRTOS''' ===
 +
[https://github.com/jordibinefa/IoT-02/tree/master/codes/freeRTOS Alguns codis funcionant amb FreeRTOS per a la placa IoT-02 basada en ESP32]
 +
 
 +
== 20210301 (1h presencial) ==
 +
Seguim amb la instal·lació d'InfluxDB i Grafana.
 +
 
 +
[https://binefa.cat/dam2021/20210301/notesProvisionals20210301.png Notes provisionals d'avaluació ordinària del M07UF1]
 +
 
 +
== 20210226 (IoT: '''InfluxDB''' i '''Grafana''', 2h presencial) ==
 +
Part pròpia del M15UF1 (Internet de les Coses) i M09UF2 (Processos i fils).
 +
 
 +
=== InfluxDB v2.0 ===
 +
* Instal·lació de la base de dades temporal a la [http://www.binefa.com/index.php?title=DAM_2020-2021#Actualitzaci.C3.B3_de_la_m.C3.A0quina_virtual màquina virtual Linux]
 +
[https://docs.influxdata.com/influxdb/v2.0/get-started/ Instal·lació d'InfluxDB 2.0] i [https://portal.influxdata.com/downloads/ lloc de descàrregues]
 +
 
 +
curl -s https://repos.influxdata.com/influxdb2.key | gpg --import -
 +
wget -qO- https://repos.influxdata.com/influxdb2.key | sudo apt-key add -
 +
wget https://dl.influxdata.com/influxdb/releases/influxdb2-2.0.4-linux-amd64.tar.gz.asc
 +
wget https://dl.influxdata.com/influxdb/releases/influxdb2-2.0.4-amd64.deb
 +
sudo dpkg -i influxdb2-2.0.4-amd64.deb
 +
 
 +
Un cop instal·lat ha de sortir:
 +
...
 +
Setting up influxdb2 (2.0.4) ...
 +
Created symlink /etc/systemd/system/influxd.service → /lib/systemd/system/influxdb.service.
 +
Created symlink /etc/systemd/system/multi-user.target.wants/influxdb.service → /lib/systemd/system/influxdb.service.
 +
 
 +
 
 +
* Configuració a la nova màquina virtual:
 +
InfluxDB : ecat / clotfje1234
 +
Organization Name: Clot
 +
Bucket Name: api/v2/query
 +
 
 +
* Escriptura i lectura de dades des del NodeRed a Influx DB v2.0
 +
[https://www.binefa.cat/training/nodered/influxDB_2.0/escripturaInfluxDB.nodered.txt Escriptura de dades múltiple des del NodeRed]
 +
 
 +
[https://www.binefa.cat/training/nodered/influxDB_2.0/lecturaInfluxDB.nodered.txt Lectura de dades múltiple des del NodeRed]
 +
 
 +
=== Grafana ===
 +
* Instal·lació de l'aplicació web de visualització de dades a la [http://binefa.com/index.php?title=DAM_2020-2021#Actualitzaci.C3.B3_de_la_m.C3.A0quina_virtual màquina virtual Linux]
 +
[https://grafana.com/grafana/download?platform=linux Descàrrega de Grafana]
 +
 
 +
* Posada en marxa
 +
Recàrrega dels serveis dimoni:
 +
'''sudo systemctl daemon-reload'''
 +
 
 +
Feu que arrenqui el servei quan poseu en marxa la màquina virtual:
 +
'''sudo systemctl enable grafana-server'''
 +
 
 +
Poseu el servei en marxa:
 +
'''sudo systemctl start grafana-server'''
 +
 
 +
Verifiqueu l'estat del servei:
 +
'''systemctl status grafana-server'''
 +
 
 +
* Primer accés
 +
admin / admin
 +
 
 +
Us demanarà un canvi de la contrasenya d'administració. A la nova màquina virtual és:
 +
admin / clotfje1234
 +
 
 +
* Configuració de Grafana per rebre dades d'InfluxDB mitjançant Flux
 +
[https://docs.influxdata.com/influxdb/v2.0/tools/grafana/ Configure Grafana to use Flux]
 +
 
 +
* Ús de les dades d'InfluxDB a Grafana
 +
[https://grafana.com/docs/grafana/latest/datasources/influxdb/ Using InfluxDB in Grafana]
 +
 
 +
from(bucket: "api/v2/query")
 +
|> range(start: v.timeRangeStart, stop: v.timeRangeStop)
 +
 
 +
 
 +
=== Exercici de prova  ===
 +
[https://www.binefa.cat/training/nodered/influxDB_2.0/escripturaUnaDadaAleatoriaInfluxDB.nodered.txt Flux NodeRED d'escriptura d'una dada aleatòria a InfluxDB] a l'organització '''Clot''' al ''bucket'' '''aleatori/v1'''
 +
 
 +
Codi Flux per a la graficació a Grafana:
 +
from(bucket: "aleatori/v1")
 +
|> range(start: v.timeRangeStart, stop: v.timeRangeStop)
 +
 
 +
=== Serveis (Processos) ===
 +
* Per saber si el servei està en marxa:
 +
systemctl status influxd
 +
 
 +
* Per a engegar un servei
 +
sudo systemctl start influxd
 +
 
 +
* Per a aturar un servei
 +
sudo systemctl stop influxd
 +
 
 +
* Per a fer que el servei s'engegui a l'iniciar el sistema:
 +
sudo systemctl enable influxd
 +
 
 +
* Per a fer que el servei deixi d'engeggar-se a l'iniciar el sistema:
 +
sudo systemctl disable influxd
 +
 
 +
* Llista els serveis que arrenquen (enable) a l'iniciar el sistema:
 +
systemctl list-unit-files --type=service | grep influx
 +
 
 +
* Per a veure els ports TCP / UDP dels serveis:
 +
sudo netstat -aputn
 +
Sense sudo no es veu el nom del procés.
 +
 
 +
=== Més teoria ===
 +
[https://www.grafanacon.org/2019/presentations/Grafana_Flux_JTL.pdf Grafana & Flux. New Flux support in Grafana] by Jacob Lisi @JacobLisi
 +
 
 +
== 20210225 ('''Examen final del M07UF1'''. Part de QML amb IoT, 3h presencial) ==
 +
[https://binefa.cat/dam2021/20210225_ex_M07UF1ord/ Accés a l'examen en format pdf, odt i el material comprimit necessari per a desenvolupar-lo]
 +
 
 +
== 20210222 (QML / IoT, 2h síncrona) ==
 +
Darrer dia abans de l'examen de final de la UF1 del M07.
 +
 
 +
Resolució de dubtes.
 +
 
 +
== 20210219 (QML / IoT, 2h síncrona) ==
 +
[https://binefa.cat/dam2021/20210219_qml/ Alguns codis comentats avui] fent servir '''comportaments elàstics''' (''easing'').
 +
 
 +
Comentem la importància del centratge de les imatges. Al codi comentat avui es fan servir [https://freesvg.org/vector-image-of-analog-clock dissenys vectorials lliures i oberts] aconseguits a [https://freesvg.org https://freesvg.org]
 +
 
 +
Seguim amb els [[Exercicis de QML]]
 +
 
 +
== 20210218 (QML / IoT, 3h presencial) ==
 +
[https://binefa.cat/dam2021/20210218_qml/ Alguns codis comentats avui] fent servir '''comportaments elàstics''' (''easing'').
 +
 
 +
Seguim amb els [[Exercicis de QML]]
 +
 
 +
== 20210212 (QML, 2h presencial) ==
 +
[https://binefa.cat/dam2021/20210212_qml_iot/ Alguns codis comentats avui]
 +
 
 +
[https://sourceforge.net/projects/qmlexporter/ QmlExporter]
 +
 
 +
== 20210211 (QML, 3h síncrona) ==
 +
[https://binefa.cat/dam2021/20210211_qml_iot/ Alguns codis comentats avui]
 +
 
 +
Recordeu-vos de canviar l''''SSID''' i '''contrasenya''' de la connexió sense fils, per adaptar-la a casa vostra.
 +
 
 +
Recordeu-vos de personalitzar '''#define MAC_PLACA "'''xxxxxxxxxxx'''"'''
 +
 
 +
== 20210208 (QML, 1h presencial) ==
 +
Microprogramari [https://binefa.cat/dam2021/20210208_qml_iot/IoT-02_mqtts_10_dam.zip IoT-02_mqtts_10_dam.zip] per a la placa IoT-02 per a provar els exercicis 7 i 8 dels [[Exercicis de QML]].
 +
 
 +
[[Guia per a desenvolupar l'ex07 dels exercicis de QML]] fent servir senyals. Us pot ajudar per a la vostra implementació fent servir '''propietats'''.
 +
 
 +
== 20210205 (QML, 2h síncrona) ==
 +
[https://binefa.cat/dam2021/20210205_qml_iot/ Alguns codis comentats avui]
 +
 
 +
=== Actualització de la màquina virtual ===
 +
* [https://www.digitalocean.com/community/tutorials/how-to-install-and-secure-the-mosquitto-mqtt-messaging-broker-on-debian-10 Instal·lació de MQTT amb contrasenya]
 +
 
 +
* [https://github.com/nodesource/distributions/blob/master/README.md Instal·lació de node i npm]
 +
ecat@iot-ecat:~$ '''sudo bash'''
 +
root@iot-ecat:/home/ecat# '''curl -sL https://deb.nodesource.com/setup_14.x | bash -'''
 +
root@iot-ecat:/home/ecat# '''apt install -y nodejs'''
 +
root@iot-ecat:/home/ecat# '''exit'''
 +
ecat@iot-ecat:~$ '''node --version'''
 +
v14.15.4
 +
ecat@iot-ecat:~$ '''npm -- version'''
 +
6.14.10
 +
 
 +
* Instal·lació i funcionament del NodeRed autònom:
 +
ecat@iot-ecat:~$ '''mkdir bin'''
 +
ecat@iot-ecat:~$ '''cd bin'''
 +
ecat@iot-ecat:~/bin$ '''sudo apt install unzip'''
 +
ecat@iot-ecat:~/bin$ '''mkdir nodered-ui'''
 +
ecat@iot-ecat:~/bin$ '''cd nodered-ui'''
 +
ecat@iot-ecat:~/bin/nodered-ui$ '''wget https://binefa.cat/dam2021/20200928/node_red_ui.zip'''
 +
ecat@iot-ecat:~/bin/nodered-ui$ '''unzip node_red_ui.zip'''
 +
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'''
 +
 
 +
== 20210204 (QML, 3h presencial) ==
 +
Al disc dur que us passaré hi ha dues màquines virtuals (''andro_8.1-r4-VM-32bit.7z'' de 543,8 MB i ''IoT - eCat - Debian 11.x 64-bit _v20210202_00.zip'' de 19,0 GB) al directori ''maquinesVirtuals/Android_i_Qt''
 +
 
 +
=== Màquina virtual amb emulador per a Android ===
 +
El darrer dia va haver dos talls de llum. Van assistir a classe 6 alumnes. Els hi vaig passar una màquina virtual amb un emulador d'Android ('''Android-x86 8.1-R4 Oreo'''). Els que no vau assistir el darrer dia, '''porteu instal·lada''' [https://www.osboxes.org/android-x86/ la màquina virtual de l'emulador d'Android].
 +
 
 +
És important que aquesta màquina virtual estigui configurada amb:
 +
* Connexió pont (''bridge'' i no ''NAT'')
 +
* Memòria mínima de 2GB
 +
 
 +
=== Màquina virtual amb Debian 11, Android Studio i Qt6 per a escriptori i Android ===
 +
[http://popotamo.binefa.cat/iot/maqVirt/IoT%20-%20eCat%20-%20Debian%2011.x%2064-bit%20_v20210202_00.zip Adreça de descàrrega de la màquina virtual amb Debian 11, Android Studio i Qt6 per a escriptori i Android]
 +
 
 +
Avui us passaré, comprimida a 19GB, una màquina virtual basada en Debian 11 (a hores d'ara, Debian 11 és en fase de ''testing'') amb els següents programes ja instal·lats i preparats per a funcionar:
 +
 
 +
* Android Studio
 +
* QtCreator amb la darrera Qt5 LTS i les Qt6
 +
* Biblioteca qtMqtt preparada per a funcionar a l'escriptori i a Android amb les Qt6
 +
 
 +
Configuració de la màquina virtual:
 +
* L'usuari per defecte és '''ecat''' (''eCat'')
 +
* La contrasenya de l'usuari '''ecat''' és '''clotfje''' (''ecat'' és membre del grup d'usuaris ''sudo'' i ''dialout''). Almenys a l'hora de passar-vos la màquina virtual. És aconsellable que canvieu la vostra contrasenya d'accés.
 +
* És aconsellable tenir la connexió de xarxa en connexió pont (''bridge''). Però no cal per a connectar-ho amb l'emulador d'Android amb màquina virtual. Sí que caldria per a tenir accés extern al ''broker'' MQTT i al NodeRED (no instal·lats en aquesta primera versió).
 +
* Memòria mínima de 4GB
 +
 
 +
=== Connectant les dues màquines virtuals ===
 +
* Trobeu quina IP té la màquina virtual amb l'emulador d'Android (a l'explicació faré servir com a IP de l'emulador '''172.20.''xy''.''xyz''''').
 +
* Obriu un terminal a la màquina virtual amb Debian 11:
 +
ecat@iot-ecat:~$ '''cd Android/Sdk/platform-tools/'''
 +
ecat@iot-ecat:~/Android/Sdk/platform-tools$ '''./adb connect 172.20.''xy''.''xyz'':5555'''
 +
* daemon not running; starting now at tcp:5037
 +
* daemon started successfully
 +
connected to 172.20.25.152:5555
 +
ecat@iot-ecat:~/Android/Sdk/platform-tools$ '''./adb shell'''
 +
x86:/ $
 +
* Obriu el Qt Creator (premeu la supertecla -aquella amb el símbol d'una finestra propietària- i escriviu-hi Qt). Feu un exemple simple de QML (per exemple el del ''swipe''). Seleccioneu les Qt6 per a escriptori i Android x86 (amb l'opció ''Release'' i sense ''Debug'' ni ''Profile''). Aneu a ''Tools'' / ''Options'' / ''Devices'' i verifiqueu que no hi dóna cap error de configuració (és possible que al principi surtin marques vermelles, però al cap de pocs segons se'n van). Assegureu-vos que compilareu per Android i feu ''Play'' al projecte de les Qt. Seleccioneu el dispositiu compatible ''VMware Virtual Platform''. I premeu al botó ''OK''.
 +
* Al cap de pocs segons hi apareix el programa bàsic ''swipe'' a l'emulador sobre màquina virtual. El podeu aturar prement el botó quadrat vermell d'''Application Output''.
 +
 
 +
=== MQTT i MQTTS ===
 +
[https://wiki.binefa.cat/index.php?title=MQTT_i_MQTTS MQTT_i_MQTTS]
 +
 
 +
== 20210201 (QML, 1h presencial) ==
 +
 
 +
[https://www.osboxes.org/android-x86/ Emulador d'Android a una màquina virtual]
 +
 
 +
Aneu amb cura, malgrat és obsolet quelcom es pot fer servir en part: [https://visualgdb.com/tutorials/android/vmware/ Using VMWare to replace the slow Android Emulator]
 +
 
 +
* Poseu en marxa la màquina virtual (connexió pont -''bridge'' i no ''NAT''-) i cerqueu la IP del dispositiu Android virtualitzat. Connecteu-vos-hi:
 +
 
 +
jordi@ecat-XPS13:~$ '''cd Android/Sdk/platform-tools/'''
 +
jordi@ecat-XPS13:~/Android/Sdk/platform-tools$ '''./adb connect 172.20.''xy''.''xyz'':5555'''
 +
* daemon not running; starting now at tcp:5037
 +
* daemon started successfully
 +
connected to 172.20.''xy''.''xyz'':5555
 +
jordi@ecat-XPS13:~/Android/Sdk/platform-tools$ '''./adb shell'''
 +
x86:/ $
 +
 
 +
* Aneu al QtCreator, compileu i executeu una aplicació per a Android. Us sortirà a la llista de dispositius compatibles la màquina virtual emulant Android.
 +
 
 +
== 20210129 (QML, 2h presencial) ==
 +
Comencem per l'exercici '''ex06_07''' dels [[Exercicis de QML]] (Vídeo 7/10 a [[Vídeos QML]])
 +
 
 +
== 20210128 (QML, 3h síncrona) ==
 +
'''Avui, abans de començar la classe, s'han d'haver tramès per correu electrònic els exercicis ex01, ex02, ex03, ex04 i ex05 dels [[Exercicis de QML]]''', seguint les indicacions a la capçalera de la pàgina.
 +
 
 +
'''Acabem l'exercici 6 de la col·lecció''' dels [[Exercicis de QML]]
 +
 
 +
=== Millores de codi ===
 +
Aquest codi:
 +
    Connections {
 +
        target: appCore // Specify the target to connect
 +
        '''onSendToQml: {'''
 +
            p1.etiqueta.text = count // Set the counter to the text label
 +
            // count <-- Mateix nom que al senyal void sendToQml(int count);
 +
        }
 +
    }
 +
Provoca aquest avís (''warning''):
 +
qrc:/main.qml:13:5: QML Connections: Implicitly defined onFoo properties in Connections are deprecated. Use this syntax instead: function onFoo(<arguments>) { ... }
 +
 
 +
I aquesta és la solució que s'aconsella actualment:
 +
    Connections {
 +
        target: appCore // Specify the target to connect
 +
        '''function onSendToQml(count){'''
 +
            p1.etiqueta.text = count // Set the counter to the text label
 +
            // count <-- Mateix nom que al senyal void sendToQml(int count);
 +
        }
 +
    }
 +
 
 +
=== ProgressBar a QML per a Qt6 ===
 +
La propietat de valor màxim ha desaparegut a les Qt6
 +
    ProgressBar {
 +
        id: progressBar
 +
        y: 189
 +
        value: ''50''
 +
        '''//maximumValue: 100'''
 +
        anchors.right: parent.right
 +
        anchors.rightMargin: 20
 +
        anchors.left: parent.left
 +
        anchors.leftMargin: 20
 +
    }
 +
 
 +
A Qt 6 el valor màxim està a 1.0, per tant:
 +
    ProgressBar {
 +
        id: progressBar
 +
        y: 189
 +
        '''value: 0.5'''
 +
        anchors.right: parent.right
 +
        anchors.rightMargin: 20
 +
        anchors.left: parent.left
 +
        anchors.leftMargin: 20
 +
    }
 +
 
 +
i al '''main.qml''' de [https://binefa.cat/training/qml/01_qmlLliscant_10.zip 01_qmlLliscant_10]:
 +
 
 +
        function actualitzaBarraDeProgres(n){
 +
            l01.progressBar.value = '''n/100'''; // Originàriament hi havia '''n'''
 +
            l01.text1.text = n; // canvieu element1 per text1 a l'editor QML
 +
        }
 +
 
 +
[https://binefa.cat/training/qml/01_qmlLliscant_10_qt6.zip '''Codi actualitzat per a Qt6: 01_qmlLliscant_10_qt6''']
 +
 
 +
A l'arxiu '''main.cpp''' també he afegit un ''#if / #endif'' per a verificar si el codi és previ a les Qt6.0.0:
 +
'''#if QT_VERSION < QT_VERSION_CHECK(6, 0, 0)'''
 +
    QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling);
 +
'''#endif'''
 +
 
 +
== 20210125 (QML, 1h presencial) ==
 +
=== Connexió entre el frontal QML i el rerefons en C++ ===
 +
[https://binefa.cat/dam2021/20210121_qml/qmlEd01.zip Exemple de connexió entre el frontal QML i el rerefons en C++] (El codi de connexió és basat en [https://evileg.com/en/post/569/ QML - Tutorial 036. Working with Signals and Slots in QML]).
 +
 
 +
Aquí teniu alguns [[Vídeos QML]] que guien pas a pas la connexió entre el frontal i el rerefons.
 +
 
 +
'''Comenceu l'exercici 6 de la col·lecció''' [[Exercicis de QML]]
 +
 
 +
== 20210122 (QML, 2h síncrona) ==
 +
* Ajuda per a fer els '''ex04''' i '''ex05''' dels [[Exercicis de QML]]:
 +
    MqttClient {
 +
        id: client
 +
        hostname: hostnameField.text
 +
        port: portField.text
 +
        '''username: userField.text'''
 +
        '''password: pwdField.text'''
 +
    }
 +
Modifiqueu el broker per un que faci servir usuari i contrasenya:
 +
        TextField {
 +
            id: hostnameField
 +
            Layout.fillWidth: true
 +
            text: '''"rubi.xoic.coop"'''
 +
            placeholderText: "<Enter host running MQTT broker>"
 +
            enabled: client.state === MqttClient.Disconnected
 +
        }
 +
Afegiu l'etiqueta d'usuari:
 +
        Label {
 +
            text: '''"Usuari:"'''
 +
            enabled: client.state === MqttClient.Disconnected
 +
        }
 +
Al camp de text d'usuari, poseu el nom d'usuari per defecte:
 +
        TextField {
 +
            id: '''userField'''
 +
            Layout.fillWidth: true
 +
            text: '''"rubi"'''
 +
            placeholderText: '''"<Usuari>"'''
 +
            enabled: client.state === MqttClient.Disconnected
 +
        }
 +
Afegiu l'etiqueta de contrasenya:
 +
        Label {
 +
            text: '''"Contrasenya:"'''
 +
            enabled: client.state === MqttClient.Disconnected
 +
        }
 +
Al camp de text de la contrasenya, poseu la contrasenya per defecte:
 +
        TextField {
 +
            id: '''pwdField'''
 +
            '''echoMode: TextInput.Password'''
 +
            Layout.fillWidth: true
 +
            text: '''"iotRubi"'''
 +
            placeholderText: '''"<Contrasenya>"'''
 +
            passwordCharacter: '''"x"'''
 +
            enabled: client.state === MqttClient.Disconnected
 +
        }
 +
 
 +
Proveu les dues aplicacions a l'escriptori i al dispositiu Android.
 +
 
 +
Proveu un altre ''broker'' que també faci servir usuari i contrasenya.
 +
 
 +
Proveu si funciona a un ''broker'' que no faci servir usuari i contrasenya
 +
 
 +
== 20210121 (QML, 3h presencial) ==
 +
=== Un tutorial curt de QML ===
 +
[https://doc.qt.io/qt-5/qml-tutorial1.html Un tutorial amb tres exemples de codi QML] ([https://binefa.cat/dam2021/20210121_qml/qmlTut01_03.zip Els tres codis del tutorial curt]).
 +
 
 +
Seguint amb el tema dels '''estats''', baixeu-vos i executeu l'[https://binefa.cat/dam2021/20210121_qml/qmlState01.zip exemple qmlState01 d'estats en QML] i l'[https://binefa.cat/dam2021/20210121_qml/qmlState02.zip exemple qmlState02 d'estats en QML] (Basats en la [https://doc.qt.io/qt-5/qml-qtquick-state.html documentació sobre estats de les Qt]).
 +
 
 +
=== Bucles de vinculació ===
 +
Què són els [http://binefa.com/index.php?title=DAM_2020-2021#Bucles_de_vinculaci.C3.B3_2 bucles de vinculació] (''binding loops'')?
 +
 
 +
=== Connexió entre el frontal QML i el rerefons en C++ ===
 +
[https://binefa.cat/dam2021/20210121_qml/qmlEd01.zip Exemple de connexió entre el frontal QML i el rerefons en C++] (El codi de connexió és basat en [https://evileg.com/en/post/569/ QML - Tutorial 036. Working with Signals and Slots in QML]).
 +
 
 +
Aquí teniu alguns [[Vídeos QML]] que guien pas a pas la connexió entre el frontal i el rerefons.
 +
 
 +
'''Comenceu l'exercici 6 de la col·lecció''' [[Exercicis de QML]]
 +
 
 +
=== Instal·lació de '''QtMqtt per Android''' ===
 +
Malgrat que ja us funcioni la biblioteca QtMqtt en programes d'escriptori, heu de fer la compilació de la biblioteca QtMqtt per a la versió de Qt/QML que feu servir per a poder executar programes que duguin aquesta biblioteca a Android.
 +
 
 +
Hi ha diversos suggeriments de com fer-ho. Després de diversos intents, aquest és el sistema que a mi m'ha funcionat:
 +
 
 +
Cerqueu el directori '''lib''' de la vostra distribució Qt per a '''Android x86''':
 +
jordi@ecat-XPS13:~$ '''/home/jordi/Qt/6.0.0/android_x86/bin/qmake -query QT_INSTALL_LIBS'''
 +
/home/jordi/Qt/6.0.0/android_x86/lib
 +
o, per al dispositiu físic Android amb tecnologia '''Android ARM''':
 +
ecat@iot-ecat:~$ '''/home/ecat/Qt/6.0.0/android_armv7/bin/qmake -query QT_INSTALL_LIBS'''
 +
/home/ecat/Qt/6.0.0/android_armv7/lib
 +
Aneu a la carpeta que ens retorna l'ordre anterior ('''Android x86'''):
 +
jordi@ecat-XPS13:~$ '''cd /home/jordi/Qt/6.0.0/android_x86/lib'''
 +
o, per al dispositiu físic Android amb tecnologia '''Android ARM''':
 +
ecat@iot-ecat:~$ cd /home/ecat/Qt/6.0.0/android_armv7/lib
 +
I feu el procés d'instal·lació ('''Android x86'''):
 +
jordi@ecat-XPS13:~/Qt/6.0.0/android_x86/lib$ '''git clone git://code.qt.io/qt/qtmqtt.git'''
 +
jordi@ecat-XPS13:~/Qt/6.0.0/android_x86/lib$ '''cd qtmqtt/'''
 +
jordi@ecat-XPS13:~/Qt/6.0.0/android_x86/lib/qtmqtt$ '''git checkout 6.0'''
 +
jordi@ecat-XPS13:~/Qt/6.0.0/android_x86/lib/qtmqtt$ '''rm -r examples/'''
 +
o, per al dispositiu físic Android amb tecnologia '''Android ARM''':
 +
ecat@iot-ecat:~/Qt/6.0.0/android_armv7/lib$ '''git clone git://code.qt.io/qt/qtmqtt.git'''
 +
ecat@iot-ecat:~/Qt/6.0.0/android_armv7/lib$ '''cd qtmqtt/'''
 +
ecat@iot-ecat:~/Qt/6.0.0/android_armv7/lib/qtmqtt$ '''git checkout 6.0'''
 +
ecat@iot-ecat:~/Qt/6.0.0/android_armv7/lib/qtmqtt$ rm -r examples/
 +
Per a '''Android x86''', mitjançant el '''Qt Creator''' obriu el projecte /home/jordi/Qt/6.0.0/android_x86/lib/qtmqtt/'''qtmqtt.pro'''. Aneu al menú i seleccioneu '''Build / Run qmake'''
 +
 
 +
Per a '''Android ARM''', mitjançant el '''Qt Creator''' obriu el projecte /home/ecat/Qt/6.0.0/android_armv7/lib/qtmqtt/'''qtmqtt.pro'''. Aneu al menú i seleccioneu '''Build / Run qmake'''
 +
 
 +
Torneu al terminal d'abans i feu ('''Android x86'''):
 +
jordi@ecat-XPS13:~/Qt/6.0.0/android_x86/lib/qtmqtt$ '''make'''
 +
jordi@ecat-XPS13:~/Qt/6.0.0/android_x86/lib/qtmqtt$ '''sudo make install'''
 +
o, per al dispositiu físic Android amb tecnologia '''Android ARM''':
 +
ecat@iot-ecat:~/Qt/6.0.0/android_armv7/lib/qtmqtt$ '''make'''
 +
ecat@iot-ecat:~/Qt/6.0.0/android_armv7/lib/qtmqtt$ '''sudo make install'''
 +
Copieu, fora de la ruta de les Qt, els projectes d'exemple [https://binefa.cat/dam2021/20210121_qml/quickpublication.zip '''quickpublication'''] i [https://binefa.cat/dam2021/20210121_qml/quicksubscription.zip '''quicksubscription''']. Obriu els dos projectes per a que puguin ser executats des de l'escriptori i des del mòbil (emulat o no). Per a verificar llur funcionament, podeu executar un projecte al dispositiu mòbil i l'altre a l'escriptori.
 +
 
 +
=== En cas de no poder actualitzar l'editor de QML ===
 +
Si us surt el missatge '''Qt Quick emulator layer crash''' i no s'actualitza el visor QML, però podeu editar l'arxiu en mode text, haureu d'anar al menú:
 +
 +
Tools / Options... / Qt Quick / Qt Quick Designer
 +
 
 +
i canvieu la selecció '''Use fallback QML emulation layer''' per '''Use QML emulation layer that is built with the selected Qt''', deixant buit el ''Top level build path:''. Quan torneu a editar des de l'editor QML es farà una recompilació del visor (sigueu pacients i deixeu acabar tot el procés).
 +
 
 +
== 20210118 (QML, 1h presencial) ==
 +
=== Seguim amb QML ===
 +
El darrer dia es va recomanar veure els tres primers capítols dels vídeos de KDAB sobre QML.
 +
 
 +
[[Exercicis de QML]]
 +
 
 +
[https://binefa.cat/dam2021/20210118_qml/ Alguns codis explicats avui]
 +
 
 +
[https://github.com/KDAB/kdabtv/tree/master/qml-intro Codis QML] dels [https://www.youtube.com/playlist?list=PL6CJYn40gN6hdNC1IGQZfVI707dh9DPRc vídeos de KDAB]
 +
 
 +
=== qml_02_kdab ===
 +
==== Ancoratge ====
 +
[https://github.com/KDAB/kdabtv/blob/master/qml-intro/ex-anchor-layout/anchors.qml anchors.qml:]
 +
[[Image:00_anchors.png|center|anchors.qml]]
 +
 
 +
[https://github.com/KDAB/kdabtv/blob/master/qml-intro/ex-anchor-layout/anchors2.qml anchors2.qml:]
 +
[[Image:01_anchors2.png|center|anchors2.qml]]
 +
 
 +
[https://github.com/KDAB/kdabtv/blob/master/qml-intro/ex-anchor-layout/anchors-centerin-parent-keyword.qml anchors-centerin-parent-keyword.qml:]
 +
[[Image:02_anchors-centerin-parent-keyword.png|center|anchors-centerin-parent-keyword.qml]]
 +
 
 +
[https://github.com/KDAB/kdabtv/blob/master/qml-intro/ex-anchor-layout/anchors-expanding.qml anchors-expanding.qml:]
 +
[[Image:03_anchors-expanding.png|center|anchors-expanding.qml]]
 +
 
 +
[https://github.com/KDAB/kdabtv/blob/master/qml-intro/ex-anchor-layout/anchors-fill.qml anchors-fill.qml:]
 +
[[Image:04_anchors-expanding.png|center|anchors-fill.qml]]
 +
 
 +
==== Bucles de vinculació ====
 +
[https://github.com/KDAB/kdabtv/blob/master/qml-intro/ex-binding-loop/main.qml Bucles de vinculació (''binding loop'')]
 +
 
 +
Exemple de bucle de vinculació:
 +
import QtQuick 2.0
 +
 +
Rectangle {
 +
    color: "black"
 +
    '''width: child.width'''
 +
    '''height: child.width'''
 +
 +
    Image {
 +
        '''id: child'''
 +
        source : "../images/vertical-gradient.png"
 +
        '''anchors.fill: parent'''
 +
        anchors.margins: 5
 +
    }
 +
}
 +
 
 +
Una solució per a evitar bucles de vinculació:
 +
import QtQuick 2.0
 +
 +
Rectangle {
 +
    color: "black"
 +
    '''implicitWidth: child.implicitWidth'''
 +
    '''implicitHeight: child.implicitWidth'''
 +
 +
    Image {
 +
        '''id: child'''
 +
        source : "../images/vertical-gradient.png"
 +
        '''anchors.fill: parent'''
 +
        anchors.margins: 5
 +
    }
 +
}
 +
 
 +
== 20210115 (QML, 1h síncrona) ==
 +
=== '''Connectem Qt/QML a Android''' ===
 +
* Obriu l'Android Studio i virtualitzeu un telèfon mòbil d'arquitectura x86 (molt més ràpid que virtualitzar un ARM):
 +
jordi@ecat-XPS13:/opt/android-studio/bin$ ./studio.sh
 +
 
 +
* Feu un nou projecte '''Application (Qt Quick)''' / '''Qt Quick Application - Swipe'''.
 +
 
 +
* Anomeneu i deseu el projecte. Per exemple amb el nom '''prMobil00'''
 +
 
 +
* Seleccioneu els kits d'Android i d'escriptori, seleccionant l'opció '''release'''. Per exemple: '''Android Qt 6.0.0 Clang x86''' i '''Desktop Qt 6.0.0 GCC 64bit'''
 +
 
 +
* Proveu que us funciona amb la versió d'escriptori
 +
 
 +
* Proveu que us funciona amb la versió d'Android virtualitzat. Quan ho executeu heu de seleccionar a quin dispositiu virtual ho voleu fer córrer.
 +
 
 +
=== Seguim amb QML ===
 +
Es recomana veure els tres primers capítols dels vídeos de KDAB sobre QML.
 +
 
 +
[[Exercicis de QML]]
 +
 
 +
[https://binefa.cat/dam2021/20210115_qml/ Alguns codis explicats avui]
 +
 
 +
[https://github.com/KDAB/kdabtv/tree/master/qml-intro Codis QML] dels [https://www.youtube.com/playlist?list=PL6CJYn40gN6hdNC1IGQZfVI707dh9DPRc vídeos de KDAB]
 +
 
 +
== 20210112 (QML, 3h presencial) ==
 +
[https://qmlbook.github.io/ Accés al llibre de Qt/QML en línia]
 +
 
 +
Execució de codis QML des del terminal:
 +
/home/jordi/Qt/5.15.2/gcc_64/bin/qmlscene showcase.qml
 +
 
 +
[https://binefa.cat/dam2021/20210112_qml/ Exemples treballats avui]
 +
 
 +
'''Exercicis QML''':
 +
 
 +
* ex1) Feu un programa en QML que al principi hi surti un quadrat vermell centrat. Al prémer la tecla B hi sortirà de color blau, al prémer la tecla G hi sortirà de color verd i al prémer la tecla R torna a ser vermell.
 +
 
 +
* ex2) Feu un programa en QML a on hi aparegui centrat, horitzontalment i vertical, ben gros i en negreta el nom '''Escola del Clot'''. Al prémer la tecla + la lletra es farà més grossa. I al prémer la tecla - la lletra es farà més petita.
 +
 
 +
* ex3) Feu un programa que hi surti el text, centrat a la finestra, "Comptador: 0" de color vermell. Al prémer el botó + incrementarà el valor del comptador, i al prémer el botó '-' es decrementarà. Al prémer la tecla N el text serà de color negre i al prémer V tornarà a ser de color vermell.
 +
 
 +
== 20210111 (QML, 1h síncrona) ==
 +
A partir dels [http://zetcode.com/gui/qtquick/ exemples en QML d'en Jan Bodnar] fem servir el Qt Creator per a executar-los.
 +
 
 +
[https://binefa.cat/dam2021/20210111_qml/ Exemples treballats avui]
 +
 
 +
== 20201221 (IoT, 1h síncrona) ==
 +
S'acaba el termini de lliurament de pràctiques desenvolupades fins les festes de Nadal.
 +
 
 +
Les dues darreres:
 +
* Control de la placa IoT-02 mitjançant Telegram
 +
 
 +
* Publicació de dades del sensor BM280 de la placa IoT-02 a Mastodon
 +
 
 +
== 20201218 (IoT, 1h síncrona) ==
 +
[https://binefa.cat/dam2021/20201218_iot/ Codis d'avui i material d'ajuda per a fer l'exercici]
 +
 
 +
* Mastodon, una alternativa lliure a Twitter
  
* Aquesta segona versió de la pràctica ha de fer la pregunta després de rebre la resposta. Exemple:
+
No totes les instàncies de [https://ca.wikipedia.org/wiki/Mastodon_(xarxa_social) Mastodon] faciliten la instal·lació de ''bots''. Per a fer els primers passos us recomano aquesta [https://botsin.space/ instància pensada per a hostatjar ''bots'' de Mastodon] ('''tal i com es va demanar el dia anterior, heu d'haver demanat les credencials a la instància de Mastodon [https://botsin.space/ botsin.space] amb molta antelació. Si ho sol·liciteu avui mateix no podreu seguir la classe''').
  
Pregunto cada segon '''L''' -> espero a rebre la resposta d''''L'''.
 
  
Un cop rebo la resposta d''''L''', trameto la pregunta '''i'''.
+
[https://botsin.space/@siarq_sensors Exemple de bot de Mastodon] per a fer lectures de sensors cada hora.
  
Un cop rebo la resposta d''''i''', trameto la pregunta '''i34'''.
+
[https://gist.github.com/aparrish/661fca5ce7b4882a8c6823db12d42d26 Getting credentials for the Mastodon API with Mastodon.py, step by step]
  
Un cop rebo la resposta d''''i34''', trameto la pregunta '''i35'''.
+
* '''Exercici''':
  
* Documenteu com configureu MQTT Dash (o similar) per a connectar-ho a NodeRED fent servir un ''broker'' '''MQTT''' públic.
+
Publiqueu la temperatura, humitat relativa i pressió atmosfèrica llegides per la vostra placa IoT-02 i les publiqueu a Mastodon mitjançant NodeRED.
  
== 202010116 Qt (2h) ==
+
Feu un informe de com ho heu programat i captures de llur funcionament.
  
[https://binefa.cat/dam2021/20201016_qt/ Codis d'avui]
+
== 20201215 (IoT, 3h presencial) ==
 +
[https://binefa.cat/dam2021/20201215_iot/ Alguns codis d'avui]
  
== 202010115 (IoT i Qt) (3h) ==
+
=== Autenticació d'accés a NodeRED ===
 +
[https://nodered.org/docs/user-guide/runtime/securing-node-red Securing NodeRED]
  
== 20201012 ('''lliurament Ex01''') ==
+
Generació de la contrasenya d'accés en mode hash des de la carpeta d'execució del NodeRED:
Finalització del termini de lliurament de l'[[Pràctica de connexió de la placa IoT-02 al NodeRED mitjançant UDP | Exercici 01]]. Recordeu les condicions del [http://binefa.com/index.php?title=DAM_2020-2021#Planteig_de_l.27Exercici_01 planteig i lliurament de l'Exercici 1]
+
node node_modules/node-red/red.js admin hash-pw
  
== 20201009 Qt/QML (1h) ==
+
En aquest exemple fem servir aquesta contrasenya en mode hash:
Acabar l'explicació del dia anterior. 1) [http://binefa.com/index.php?title=DAM_2020-2021#Conceptes_b.C3.A0sics_sobre_classes_i_objectes Revisió de conceptes bàsics de programació orientada a objectes en C++] 2) [http://binefa.com/index.php?title=DAM_2020-2021#Distribuci.C3.B3_de_ginys Distribució de ginys emprant Qt (editor XML gràfic)] 3) [http://binefa.com/index.php?title=DAM_2020-2021#Paradigma_senyal_.2F_osca Paradigma senyal-osca]
+
'''$2a$08$PbYFpiQSnoVaOfD1daCelU2Kvcg19KElO1DbVtE8GAJXacD6ABq'''
  
== 20201009 IoT (1h) ==
+
Edició de '''settings.js''':
Acabar l'explicació de tot el necessari per a fer l'[[Pràctica de connexió de la placa IoT-02 al NodeRED mitjançant UDP | Exercici 01]].
+
toni@vps-10d8edcd:~/bin/nodered$ nano ./node_modules/node-red/settings.js
  
== 20201008 Qt/QML (1,5h) ==
+
    // Securing Node-RED
=== Conceptes bàsics sobre classes i objectes ===
+
    // -----------------
[https://binefa.cat/dam2021/20201008_qt/term.zip Codis de terminal]. Classes: Constructors, destructors, atributs i mètodes (públics, protegits i privats).
+
    // To password protect the Node-RED editor and admin API, the following
 +
    // property can be used. See http://nodered.org/docs/security.html for details.
 +
    adminAuth: {
 +
        type: "credentials",
 +
        users: [{
 +
            username: "'''toni'''",
 +
            password: "'''$2a$08$PbYFpiQSnoVaOfD1daCelU2Kvcg19KElO1DbVtE8GAJXacD6ABq'''",
 +
            permissions: "*"
 +
        }]
 +
    },
  
=== Distribució de ginys ===
+
Un cop fets el canvis '''cal reiniciar el NodeRED'''.
[https://binefa.cat/dam2021/20201008_qt/pr00.zip Redimensió de la distribució i pistes (''tips'')]
 
  
[https://binefa.cat/dam2021/20201008_qt/pr00_02.zip Canvi de la forma del cursor en funció de la zona a la distribució]
+
=== '''Telegram''' ===
 +
[https://wiki.binefa.cat/index.php?title=Bot_de_Telegram Bot de Telegram]
  
=== Paradigma '''senyal / osca''' ===
+
* Creació de bots amb BotFather
[https://doc.qt.io/qt-5/signalsandslots.html Explicació del paradigma '''senyal / osca''' (''signal / slot'')]
 
  
[https://binefa.cat/dam2021/20201008_qt/02_mesMenys.zip Interfície gràfica d'usuari emprants senyals i osques]
+
* Instal·lació de nodes de Telegram a NodeRED (afegiu els nodes '''node-red-contrib-telegrambot''')
  
== 20201008 IoT (1,5h) ==
+
* Interacció amb un usuari de Telegram
=== '''UDP''' a la placa IoT-02 ===
 
[[Connexió wifi a la placa IoT-02]] ([https://binefa.cat/dam2021/20201008_iot/IoT-02_wifi_00b_scan_channel/IoT-02_wifi_00b_scan_channel.ino Codi que mostra el canal de la SSID detectada]).
 
  
[https://github.com/jordibinefa/IoT-02/tree/master/codes/IoT-02_wifi_00_scan Microprogramari (''firmware'') per visualitzar les xarxes wifi visibles des de la placa IoT-02]. Aprofitem aquest codi per a explicar la introducció d'arxius '''.cpp''' i '''.h''' al mateix directori que l'arxiu '''.ino'''
+
* Interacció amb un grup de Telegram
  
[https://github.com/jordibinefa/IoT-02/tree/master/codes/IoT-02_wifi_04_udp Microprogramari per treballar amb UDP a la placa IoT-02]
+
[https://binefa.cat/training/adtelecom/20201209/ Material per a fer el bot]
  
=== Planteig de l''''Exercici 01''' ===
 
Visualització de ginys al tauler de control (''dashboard'') al NodeRED. Connexió '''UDP''' entre la placa IoT-02 i el NodeRED.
 
  
Enllaç a l'enunciat de l'[[Pràctica de connexió de la placa IoT-02 al NodeRED mitjançant UDP | Exercici 01]].
+
[https://binefa.cat/dam2021/20201215_iot/provantBotTelegram.txt Flux de prova per al bot de Telegram]
  
L'exercici s'ha de fer a classe de manera individual (es proposa com a data de lliurament per correu electrònic el dia 12 d'octubre de 2020). Heu de fer el report en pdf amb el títol '''dam_iot_pr01_cognom_nom.pdf''' (essent '''cognom''' el vostre cognom i '''nom''' el vostre nom. En cas de compartir nom i cognom amb un company canvieu '''cognom''' per '''cognom1_cognom2''', essent '''cognom1''' el primer cognom i '''cognom2''' el segon cognom) i el tema del correu ha de ser '''dam_iot_pr01_cognom_nom'''. És molt important respectar el format dels caràcters, majúscules i minúscules per a poder automatitzar correctament la recepció dels vostres reports.
+
=== '''Deures pel proper dia''' ===
  
== 20201005 IoT (1h) ==
+
Feu-vos membres d'aquesta instància de Mastodon: [https://botsin.space/ botsin.space]
Executeu a la carpeta a on heu descomprimit el [https://binefa.cat/dam2021/20200928/ NodeRed autònom]
 
  
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
+
'''Feu-ho amb prou antelació''', és possible que trigui més de tres hores a donar-vos accés.
  
[https://binefa.cat/esp8266/doc/ethernetTcpUdp_00.pdf Què és TCP i UDP?]
+
== 20201211 (Qt i IoT, 1h síncrona) ==
 +
[https://binefa.cat/dam2021/20201211_qt_iot/notes_1rT_v2.png Notes del 1r trimestre]
  
[https://binefa.cat/dam2021/20201005/ Codis de NodeRED] (UDP in i UDP out)
+
Comentarem dubtes de la darrera pràctica.
  
== 20201002 IoT (2h) ==
+
Es demana de dur instal·lat Telegram al telèfon mòbil per a la propera classe del 14 de desembre de 2020.
[https://github.com/jordibinefa/IoT-02 La placa IoT-02 al GitHub]
 
  
== 20201001 IoT (3h) ==
+
== 20201204 (Qt i IoT, 1h síncrona) ==
'''A aquest classe cal dur un cable microusb B i un cable miniusb o un cable miniusb i una font d'alimentació amb microusb B'''
+
[https://binefa.cat/dam2021/20201204_qt_iot/notes_1rT.png Notes provisionals del 1r trimestre]
  
[https://www.aliexpress.com/item/33027891253.html Enllaç a un cable miniusb i microusb B (els dos)]
+
[https://binefa.cat/dam2021/20201204_qt_iot/20201201_exQt_IoT_01.pdf Desenvolupem com a pràctica puntuable la resolució dels exercicis 5, 6 i 7] (Trameteu per separat P5, P6 i P7)
  
[https://www.aliexpress.com/item/32894794476.html Enllaça a una font d'alimentació de %V / 3A amb connector microusb]
+
== 20201201 '''Examen 1r trimestre''' ==
  
Presa de contacte amb la '''placa IoT-02'''.
+
[https://binefa.cat/dam2021/20201201_qt_iot_Ex1rT/enunciat/ Enunciat de l'examen del 1r trimestre]
  
== 20200928 IoT (1h) ==
+
[https://binefa.cat/dam2021/20201201_qt_iot_Ex1rT/pr20201201.png Notes provisionals de les pràctiques a 1 de desembre de 2020]
[https://binefa.cat/dam2021/20200928/ NodeRed autònom i d'altres codis]
 
  
== 20200425 Qt/QML (2h) ==
+
== 20201130 (dubtes i Qt, 1h síncrona) ==
[https://binefa.cat/dam2021/20200925/ Codis de presa de contacte amb el Qt Creator]
+
[https://binefa.cat/dam2021/20201130_qt_iot/ Codis d'avui] (Senyals, osques, agrupacions i connexions)
  
== 20200922 Qt/QML (2h) ==
+
== 20201127 (Qt i IoT, 1h síncrona) ==
[https://www.qt.io/download-qt-installer Instal·lador de Qt]
+
Revisem l'exercici proposat el darrer dia.
  
[https://binefa.cat/daw/m03/20200511_covid19/ Codis de l'11 de maig de 2020]
+
== 20201124 (IoT i Qt) (3h, presencial) ==
 +
[[Control de la placa IoT-02 mitjançant MQTT emprant Qt i missatges JSON]]
 +
 
 +
[https://binefa.cat/dam2021/20201123_qt_iot/ '''Codis d'interacció amb la placa IoT-02 emprant C++ per a Qt, fent servir JSON i MQTT'''].
 +
 
 +
[https://binefa.cat/dam2021/20201124_qt_iot/controlLeds.nodered.txt Codi de flux de NodeRED per a controlar els leds de la placa IoT-02 mitjançant un JSON]
 +
 
 +
[https://binefa.cat/dam2021/20201124_qt_iot/ledsBotonsBidireccional.nodered.txt Flux de NodeRED emprant MQTT i JSON bidireccional]
 +
 
 +
=== Exercici amb '''la placa IoT-02 emprant C++ per a Qt, fent servir JSON i MQTT''' ===
 +
Desenvolupeu el projecte '''15_mqtt_IoT02_03''', basant-vos en el darrer [https://binefa.cat/dam2021/20201123_qt_iot/14_mqtt_IoT02_02.zip codi de control de la placa IoT-02 en C++ per a Qt], que visualitzi en una barra de progrés el nivell de llum rebut per la LDR.
 +
 
 +
== 20201123 (Qt i IoT, 1h síncrona) ==
 +
[[Control de la placa IoT-02 mitjançant MQTT emprant Qt i missatges JSON]]
 +
 
 +
[https://binefa.cat/dam2021/20201123_qt_iot/ '''Codis d'interacció amb la placa IoT-02 emprant C++ per a Qt, fent servir JSON i MQTT'''].
 +
 
 +
== 20201120 (Qt i IoT, 1h síncrona) ==
 +
Al dia d'avui us he posat el codi per a poder visualitzar el color dels leds.
 +
 
 +
Fent servir MQTT, feu una aplicació emprant Qt que ensenyi l'estat dels botons i dels leds de la placa IoT-02
 +
 
 +
[https://binefa.cat/dam2021/20201120_qt_iot/ Codis d'avui]
 +
 
 +
== 20201117 (Qt i IoT, 3h presencial) ==
 +
[https://binefa.cat/dam2021/20201117_qt_iot/Arduino_JSON.zip Biblioteca '''Arduino_JSON''' per l'IDE d'Arduino]
 +
 
 +
[https://binefa.cat/dam2021/20201117_qt_iot/ Codis d'avui]
 +
 
 +
Dades encapsulades en JSON al NodeRED i a la placa IoT-02.
 +
 
 +
=== Exercici ===
 +
Desenvolupeu una aplicació GUI feta amb Qt que mitjançant el protocol MQTT:
 +
* Controli els quatre leds mitjançant botons seleccionadors (''check box'')
 +
 
 +
* Indiqui l'estat dels tres botons mitjançant etiqueta (premut / no premut)
 +
 
 +
* Indiqui l'estat dels tres botons mitjançant etiqueta gràfica (color viu / color fosc)
 +
 
 +
* Una barra de progrés indiqui el nivell de llum
 +
 
 +
* Trameti missatges a la pantalla OLED (tres botons seleccionadors de mida del text)
 +
 
 +
== 20201116 (Qt, 1h síncrona) ==
 +
[https://binefa.cat/dam2021/20201116_qt_iot/ Codis d'avui]
 +
 
 +
=== Exercici ===
 +
Modifiqueu el codi de [https://binefa.cat/dam2021/20201116_qt_iot/simpleclient.zip MQTT's simpleclient] per a admetre usuari i contrasenya (podeu fer servir el ''broker'' '''formacio.things.cat''' amb usuari '''ecat''' i contrasenya '''clotClot''').
 +
 
 +
[https://www.binefa.cat/dam2021/20201116_qt_iot/simpleClient_usrPwd.png Captura de l'exercici a fer]
  
 
= Documentació =
 
= Documentació =
Línia 129: Línia 937:
  
 
[https://wiki.binefa.cat/index.php?title=SCADA_fent_servir_Python_QML_i_Arduino SCADA fent servir Python QML i Arduino]
 
[https://wiki.binefa.cat/index.php?title=SCADA_fent_servir_Python_QML_i_Arduino SCADA fent servir Python QML i Arduino]
 +
 +
[http://silanus.fr/sin/?p=1194 MQTT avec Qt]
 +
 +
= Planificació =
 +
[[Distribució de M07UF1, M09UF2, M09UF3, M15UF1 i M13 al curs 2020-2021 de 2n de DAM]]

Revisió de 17:45, 26 feb 2022

Contingut

Horari a partir del 18 de gener

2n de DAM

Teleconferència del curs 2020-2021

Adreça de la teleconferència

Llista 2n de DAM 2020-2021

Carpetes compartides 2n de DAM. Curs 2020-2021

Alguns vídeos d'ajuda

QML

Introduction to Qt / QML - all videos so far by KDAB (Codis QML de la sèrie de vídeos)

Vídeos QML de connexió entre el rerefons en C++ i el frontal en QML.

Photoshop to QML exporter

Pseudoservidor UDP

Pseudoservidor UDP emprant Qt5 (1/2)

Pseudoservidor UDP emprant Qt5 (2/2)

Algunes classes

20210609 (3h presencial) Avaluació extraordinària

Enunciats de l'avaluació extraordinària

20210528 (2h en línia) Presentació de projectes de 2n de DAM

Sala Meet de la presentació de projectes

20210527 (3h en línia) Presentació de projectes de 2n de DAM

Sala Meet de la presentació de projectes

20210520 (1h presencial)

Seguim amb el Projecte de final de CFGS DAM (2020-2021)

20210517 (1h presencial)

Seguim amb el Projecte de final de CFGS DAM (2020-2021)

20210514 (2h presencial)

Seguim amb el Projecte de final de CFGS DAM (2020-2021)

20210513 (3h presencial)

Seguim amb el Projecte de final de CFGS DAM (2020-2021)

20210510 (1h presencial)

Seguim amb el Projecte de final de CFGS DAM (2020-2021)

20210507 (2h presencial)

Seguim amb el Projecte de final de CFGS DAM (2020-2021)

20210506 (3h presencial)

Seguim amb el Projecte de final de CFGS DAM (2020-2021)

20210503 (1h presencial)

Seguim amb el Projecte de final de CFGS DAM (2020-2021)

20210430 (2h presencial)

Seguim amb el Projecte de final de CFGS DAM (2020-2021)

20210429 (3h presencial)

Seguim amb el Projecte de final de CFGS DAM (2020-2021)

20210426 Comença el projecte (1h presencial)

Comentem les notes provisionals i comença el temps de projecte.

20210423 Darrer dia (2h síncrona)

Feu alguns exercicis que no vau fer ahir de l'examen d'ordinària del curs 2020-2021 amb l'objectiu de pujar nota. He afegit l'arxiu de NodeRED de control de l'ascensor i he corregit alguna errata que vau detectar ahir.

20210422 Examen (3h presencial)

Examen d'ordinària del curs 2020-2021

Snap! per HTTP per a fer servir sòcols web no segurs.

He afegit flux de NodeRED per a l'ascensor. Recordeu-vos de canviar la MAC a tot arreu i d'afegir-hi usuari i contrasenya al broker.

Errata:

M09UF3.6) Feu un control del led blanc mitjançant el NodeRED emprant el protocol UDP

20210419 (1h presencial)

Per a canviar l'Spread Factor (línia 497 d'aquest codi d'exemple):

 // Set data rate and transmit power for uplink (note: txpow seems to be ignored by the library)
 LMIC_setDrTxpow(DR_SF7, 14);


20210416 (2h presencial)

Anem acabant els Exercicis d'Internet de les Coses (M15UF1, M09UF2 i M09UF3 del curs 2020-2021) i comentem algunes propostes de projectes relacionats amb M03UF1, M15UF1, M09UF2 i M09UF3

Alguns codis comentats avui

Instal·lació de l'OpenMPI a la màquina (per a molts, virtual) de Linux.

20210415 (3h presencial)

Exemple de funció amb 4 sortides (Cal que canvieu a la funció la única sortida per defecte a quatre)

var amunt = {payload: "amunt"};
var mig = {payload: "mig"};
var avall = {payload: "avall"};

return [amunt,mig,avall,msg];

Alguns codis comentats avui

Instal·lació de l'OpenMPI a la màquina (per a molts, virtual) de Linux.

Anem acabant els Exercicis d'Internet de les Coses (M15UF1, M09UF2 i M09UF3 del curs 2020-2021) i comentem algunes propostes de projectes relacionats amb M03UF1, M15UF1, M09UF2 i M09UF3

20210412 (1h presencial)

Anem acabant els Exercicis d'Internet de les Coses (M15UF1, M09UF2 i M09UF3 del curs 2020-2021) i comentem algunes propostes de projectes relacionats amb M03UF1, M15UF1, M09UF2 i M09UF3

20210409 (2h síncrona)

Exercicis d'Internet de les Coses (M15UF1, M09UF2 i M09UF3 del curs 2020-2021)

20210408 (3h presencial)

Programació remota (OTA) (JESUITESFP / IOTcl1220_)

Exercicis d'Internet de les Coses (M15UF1, M09UF2 i M09UF3 del curs 2020-2021)

Alguns codis comentats avui

20210326 (2h presencial)

Exercicis d'Internet de les Coses (M15UF1, M09UF2 i M09UF3 del curs 2020-2021)

Alguns codis comentats avui

Flux de NodeRED que agafa una cadena de text de 4 bytes i ho converteix a un número real (float)

20210325 (3h presencial)

Exercicis d'Internet de les Coses (M15UF1, M09UF2 i M09UF3 del curs 2020-2021)

Alguns codis comentats avui per a passar vectors de bytes (unsigned char) a nombres enters o reals fent servir les funcions de Javascript per a NodeRED.

20210322 (1h presencial)

Exercicis d'Internet de les Coses (M15UF1, M09UF2 i M09UF3 del curs 2020-2021)

Comentem l'exercici 3.7

20210319 (2h síncrona)

Exercicis d'Internet de les Coses (M15UF1, M09UF2 i M09UF3 del curs 2020-2021)

Alguns codis explicats avui

FreeRTOS

Alguns codis funcionant amb FreeRTOS per a la placa IoT-02 basada en ESP32

Explicació d'un codi bàsic en FreeRTOS

Manual de referència per al FreeRTOS

20210318 (3h presencial)

Exercicis d'Internet de les Coses (M15UF1, M09UF2 i M09UF3 del curs 2020-2021)

sudo cat /etc/mosquitto/mosquitto.conf:

pid_file /var/run/mosquitto.pid

persistence true
persistence_location /var/lib/mosquitto/

log_dest file /var/log/mosquitto/mosquitto.log

include_dir /etc/mosquitto/conf.d

allow_anonymous false
password_file /etc/mosquitto/certs/contrasenyes.txt

listener 1883

listener 9001
protocol websockets

cat /etc/mosquitto/certs/contrasenyes.txt (usuaris ecat i ad):

ecat:$6$SdtdpCPcQ4wonN7Y$Dgix123455BRyzvUQxMKX2lmr/4r/K3b9/su9KzMdMZhLxS3cm6a+nCrRahz+r9DFOh0ecsoZVwlG+G9tnA==
ad:$6$Nu8O3BxNBORplkSW$LZAqGNiPnX1HnC0ZbI789787867677565eJZAQnWWrWDaFjJz5OIZ8ljJRBbL6GFCKlgoaUFllFGvBhMtnfJQ==

20210315 (1h presencial)

Conceptes de LoRa 2020-2021

20210312 (2h presencial)

Exercicis d'Internet de les Coses (M15UF1, M09UF2 i M09UF3 del curs 2020-2021)

Codi de desxifratge d'un missatge ascendent de The Things Network

Codi basat en la pàgina 42 d'aquest pdf:

var b = new Buffer(msg.payload.payload_raw,'base64')
msg.payload = b.toString()
return msg;

20210311 (3h presencial)

Avui assistiré les dues primeres hores. La tercera he de ser a una sessió d'avaluació, aneu fent els Exercicis d'Internet de les Coses (M15UF1, M09UF2 i M09UF3 del curs 2020-2021).

La pràctica de LoRaWAN requereix que hi sigueu a un lloc amb cobertura. Per tant, feu tot el possible per a ser-hi presencialment.

LoRaWAN

Doneu-vos d'alta com a usuaris de The Things Network

LoRa 2020-2021

20210308 (1h presencial)

Repassem el funcionament de la vostra placa IoT-02 al vostre broker MQTT, el vostre NodeRED, el vostre InfluxDB i el vostre Grafana.

FreeRTOS

Alguns codis funcionant amb FreeRTOS per a la placa IoT-02 basada en ESP32

Explicació d'un codi bàsic en FreeRTOS

Manual de referència per al FreeRTOS

20210305 (2h síncrona)

Continuem amb el temes d'ahir.

HTTP a MQTT

Flux de NodeRED per a convertir crides HTTP a MQTT

Exercici d'HTTP a MQTT

Mitjançant curl o navegador web encén i/o apaga qualsevol led de la placa IoT-02 connectada a un broker MQTT.

20210304 (3h presencial)

Alguns codis comentats avui

Bases de dades temporals i visualització

Seguim amb la instal·lació d'InfluxDB i Grafana.

Exercici de bases de dades temporals i visualització

  • Visualitzeu a Grafana les dades de temperatura, humitat relativa, pressió atmosfèrica i de nivell de llum.

HTTP a MQTT

Flux de NodeRED per a convertir crides HTTP a MQTT

FreeRTOS

Alguns codis funcionant amb FreeRTOS per a la placa IoT-02 basada en ESP32

20210301 (1h presencial)

Seguim amb la instal·lació d'InfluxDB i Grafana.

Notes provisionals d'avaluació ordinària del M07UF1

20210226 (IoT: InfluxDB i Grafana, 2h presencial)

Part pròpia del M15UF1 (Internet de les Coses) i M09UF2 (Processos i fils).

InfluxDB v2.0

Instal·lació d'InfluxDB 2.0 i lloc de descàrregues

curl -s https://repos.influxdata.com/influxdb2.key | gpg --import -
wget -qO- https://repos.influxdata.com/influxdb2.key | sudo apt-key add -
wget https://dl.influxdata.com/influxdb/releases/influxdb2-2.0.4-linux-amd64.tar.gz.asc
wget https://dl.influxdata.com/influxdb/releases/influxdb2-2.0.4-amd64.deb
sudo dpkg -i influxdb2-2.0.4-amd64.deb

Un cop instal·lat ha de sortir:

...
Setting up influxdb2 (2.0.4) ...
Created symlink /etc/systemd/system/influxd.service → /lib/systemd/system/influxdb.service.
Created symlink /etc/systemd/system/multi-user.target.wants/influxdb.service → /lib/systemd/system/influxdb.service.


  • Configuració a la nova màquina virtual:
InfluxDB : ecat / clotfje1234
Organization Name: Clot
Bucket Name: api/v2/query
  • Escriptura i lectura de dades des del NodeRed a Influx DB v2.0

Escriptura de dades múltiple des del NodeRed

Lectura de dades múltiple des del NodeRed

Grafana

Descàrrega de Grafana

  • Posada en marxa

Recàrrega dels serveis dimoni:

sudo systemctl daemon-reload

Feu que arrenqui el servei quan poseu en marxa la màquina virtual:

sudo systemctl enable grafana-server

Poseu el servei en marxa:

sudo systemctl start grafana-server

Verifiqueu l'estat del servei:

systemctl status grafana-server
  • Primer accés
admin / admin

Us demanarà un canvi de la contrasenya d'administració. A la nova màquina virtual és:

admin / clotfje1234
  • Configuració de Grafana per rebre dades d'InfluxDB mitjançant Flux

Configure Grafana to use Flux

  • Ús de les dades d'InfluxDB a Grafana

Using InfluxDB in Grafana

from(bucket: "api/v2/query")
|> range(start: v.timeRangeStart, stop: v.timeRangeStop)


Exercici de prova

Flux NodeRED d'escriptura d'una dada aleatòria a InfluxDB a l'organització Clot al bucket aleatori/v1

Codi Flux per a la graficació a Grafana:

from(bucket: "aleatori/v1")
|> range(start: v.timeRangeStart, stop: v.timeRangeStop)

Serveis (Processos)

  • Per saber si el servei està en marxa:
systemctl status influxd
  • Per a engegar un servei
sudo systemctl start influxd
  • Per a aturar un servei
sudo systemctl stop influxd
  • Per a fer que el servei s'engegui a l'iniciar el sistema:
sudo systemctl enable influxd
  • Per a fer que el servei deixi d'engeggar-se a l'iniciar el sistema:
sudo systemctl disable influxd
  • Llista els serveis que arrenquen (enable) a l'iniciar el sistema:
systemctl list-unit-files --type=service | grep influx
  • Per a veure els ports TCP / UDP dels serveis:
sudo netstat -aputn

Sense sudo no es veu el nom del procés.

Més teoria

Grafana & Flux. New Flux support in Grafana by Jacob Lisi @JacobLisi

20210225 (Examen final del M07UF1. Part de QML amb IoT, 3h presencial)

Accés a l'examen en format pdf, odt i el material comprimit necessari per a desenvolupar-lo

20210222 (QML / IoT, 2h síncrona)

Darrer dia abans de l'examen de final de la UF1 del M07.

Resolució de dubtes.

20210219 (QML / IoT, 2h síncrona)

Alguns codis comentats avui fent servir comportaments elàstics (easing).

Comentem la importància del centratge de les imatges. Al codi comentat avui es fan servir dissenys vectorials lliures i oberts aconseguits a https://freesvg.org

Seguim amb els Exercicis de QML

20210218 (QML / IoT, 3h presencial)

Alguns codis comentats avui fent servir comportaments elàstics (easing).

Seguim amb els Exercicis de QML

20210212 (QML, 2h presencial)

Alguns codis comentats avui

QmlExporter

20210211 (QML, 3h síncrona)

Alguns codis comentats avui

Recordeu-vos de canviar l'SSID i contrasenya de la connexió sense fils, per adaptar-la a casa vostra.

Recordeu-vos de personalitzar #define MAC_PLACA "xxxxxxxxxxx"

20210208 (QML, 1h presencial)

Microprogramari IoT-02_mqtts_10_dam.zip per a la placa IoT-02 per a provar els exercicis 7 i 8 dels Exercicis de QML.

Guia per a desenvolupar l'ex07 dels exercicis de QML fent servir senyals. Us pot ajudar per a la vostra implementació fent servir propietats.

20210205 (QML, 2h síncrona)

Alguns codis comentats avui

Actualització de la màquina virtual

ecat@iot-ecat:~$ sudo bash
root@iot-ecat:/home/ecat# curl -sL https://deb.nodesource.com/setup_14.x | bash -
root@iot-ecat:/home/ecat# apt install -y nodejs
root@iot-ecat:/home/ecat# exit
ecat@iot-ecat:~$ node --version
v14.15.4
ecat@iot-ecat:~$ npm -- version
6.14.10
  • Instal·lació i funcionament del NodeRed autònom:
ecat@iot-ecat:~$ mkdir bin
ecat@iot-ecat:~$ cd bin
ecat@iot-ecat:~/bin$ sudo apt install unzip
ecat@iot-ecat:~/bin$ mkdir nodered-ui
ecat@iot-ecat:~/bin$ cd nodered-ui
ecat@iot-ecat:~/bin/nodered-ui$ wget https://binefa.cat/dam2021/20200928/node_red_ui.zip
ecat@iot-ecat:~/bin/nodered-ui$ unzip node_red_ui.zip
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

20210204 (QML, 3h presencial)

Al disc dur que us passaré hi ha dues màquines virtuals (andro_8.1-r4-VM-32bit.7z de 543,8 MB i IoT - eCat - Debian 11.x 64-bit _v20210202_00.zip de 19,0 GB) al directori maquinesVirtuals/Android_i_Qt

Màquina virtual amb emulador per a Android

El darrer dia va haver dos talls de llum. Van assistir a classe 6 alumnes. Els hi vaig passar una màquina virtual amb un emulador d'Android (Android-x86 8.1-R4 Oreo). Els que no vau assistir el darrer dia, porteu instal·lada la màquina virtual de l'emulador d'Android.

És important que aquesta màquina virtual estigui configurada amb:

  • Connexió pont (bridge i no NAT)
  • Memòria mínima de 2GB

Màquina virtual amb Debian 11, Android Studio i Qt6 per a escriptori i Android

Adreça de descàrrega de la màquina virtual amb Debian 11, Android Studio i Qt6 per a escriptori i Android

Avui us passaré, comprimida a 19GB, una màquina virtual basada en Debian 11 (a hores d'ara, Debian 11 és en fase de testing) amb els següents programes ja instal·lats i preparats per a funcionar:

  • Android Studio
  • QtCreator amb la darrera Qt5 LTS i les Qt6
  • Biblioteca qtMqtt preparada per a funcionar a l'escriptori i a Android amb les Qt6

Configuració de la màquina virtual:

  • L'usuari per defecte és ecat (eCat)
  • La contrasenya de l'usuari ecat és clotfje (ecat és membre del grup d'usuaris sudo i dialout). Almenys a l'hora de passar-vos la màquina virtual. És aconsellable que canvieu la vostra contrasenya d'accés.
  • És aconsellable tenir la connexió de xarxa en connexió pont (bridge). Però no cal per a connectar-ho amb l'emulador d'Android amb màquina virtual. Sí que caldria per a tenir accés extern al broker MQTT i al NodeRED (no instal·lats en aquesta primera versió).
  • Memòria mínima de 4GB

Connectant les dues màquines virtuals

  • Trobeu quina IP té la màquina virtual amb l'emulador d'Android (a l'explicació faré servir com a IP de l'emulador 172.20.xy.xyz).
  • Obriu un terminal a la màquina virtual amb Debian 11:
ecat@iot-ecat:~$ cd Android/Sdk/platform-tools/
ecat@iot-ecat:~/Android/Sdk/platform-tools$ ./adb connect 172.20.xy.xyz:5555
* daemon not running; starting now at tcp:5037
* daemon started successfully
connected to 172.20.25.152:5555
ecat@iot-ecat:~/Android/Sdk/platform-tools$ ./adb shell
x86:/ $
  • Obriu el Qt Creator (premeu la supertecla -aquella amb el símbol d'una finestra propietària- i escriviu-hi Qt). Feu un exemple simple de QML (per exemple el del swipe). Seleccioneu les Qt6 per a escriptori i Android x86 (amb l'opció Release i sense Debug ni Profile). Aneu a Tools / Options / Devices i verifiqueu que no hi dóna cap error de configuració (és possible que al principi surtin marques vermelles, però al cap de pocs segons se'n van). Assegureu-vos que compilareu per Android i feu Play al projecte de les Qt. Seleccioneu el dispositiu compatible VMware Virtual Platform. I premeu al botó OK.
  • Al cap de pocs segons hi apareix el programa bàsic swipe a l'emulador sobre màquina virtual. El podeu aturar prement el botó quadrat vermell d'Application Output.

MQTT i MQTTS

MQTT_i_MQTTS

20210201 (QML, 1h presencial)

Emulador d'Android a una màquina virtual

Aneu amb cura, malgrat és obsolet quelcom es pot fer servir en part: Using VMWare to replace the slow Android Emulator

  • Poseu en marxa la màquina virtual (connexió pont -bridge i no NAT-) i cerqueu la IP del dispositiu Android virtualitzat. Connecteu-vos-hi:
jordi@ecat-XPS13:~$ cd Android/Sdk/platform-tools/
jordi@ecat-XPS13:~/Android/Sdk/platform-tools$ ./adb connect 172.20.xy.xyz:5555
* daemon not running; starting now at tcp:5037
* daemon started successfully
connected to 172.20.xy.xyz:5555
jordi@ecat-XPS13:~/Android/Sdk/platform-tools$ ./adb shell
x86:/ $
  • Aneu al QtCreator, compileu i executeu una aplicació per a Android. Us sortirà a la llista de dispositius compatibles la màquina virtual emulant Android.

20210129 (QML, 2h presencial)

Comencem per l'exercici ex06_07 dels Exercicis de QML (Vídeo 7/10 a Vídeos QML)

20210128 (QML, 3h síncrona)

Avui, abans de començar la classe, s'han d'haver tramès per correu electrònic els exercicis ex01, ex02, ex03, ex04 i ex05 dels Exercicis de QML, seguint les indicacions a la capçalera de la pàgina.

Acabem l'exercici 6 de la col·lecció dels Exercicis de QML

Millores de codi

Aquest codi:

   Connections {
       target: appCore // Specify the target to connect
       onSendToQml: {
           p1.etiqueta.text = count // Set the counter to the text label
           // count <-- Mateix nom que al senyal void sendToQml(int count);
       }
   }

Provoca aquest avís (warning):

qrc:/main.qml:13:5: QML Connections: Implicitly defined onFoo properties in Connections are deprecated. Use this syntax instead: function onFoo(<arguments>) { ... }

I aquesta és la solució que s'aconsella actualment:

   Connections {
       target: appCore // Specify the target to connect
       function onSendToQml(count){
           p1.etiqueta.text = count // Set the counter to the text label
           // count <-- Mateix nom que al senyal void sendToQml(int count);
       }
   }

ProgressBar a QML per a Qt6

La propietat de valor màxim ha desaparegut a les Qt6

   ProgressBar {
       id: progressBar
       y: 189
       value: 50
       //maximumValue: 100
       anchors.right: parent.right
       anchors.rightMargin: 20
       anchors.left: parent.left
       anchors.leftMargin: 20
   }

A Qt 6 el valor màxim està a 1.0, per tant:

   ProgressBar {
       id: progressBar
       y: 189
       value: 0.5
       anchors.right: parent.right
       anchors.rightMargin: 20
       anchors.left: parent.left
       anchors.leftMargin: 20
   }

i al main.qml de 01_qmlLliscant_10:

       function actualitzaBarraDeProgres(n){
           l01.progressBar.value = n/100; // Originàriament hi havia n
           l01.text1.text = n; // canvieu element1 per text1 a l'editor QML
       }

Codi actualitzat per a Qt6: 01_qmlLliscant_10_qt6

A l'arxiu main.cpp també he afegit un #if / #endif per a verificar si el codi és previ a les Qt6.0.0:

#if QT_VERSION < QT_VERSION_CHECK(6, 0, 0)
   QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling);
#endif

20210125 (QML, 1h presencial)

Connexió entre el frontal QML i el rerefons en C++

Exemple de connexió entre el frontal QML i el rerefons en C++ (El codi de connexió és basat en QML - Tutorial 036. Working with Signals and Slots in QML).

Aquí teniu alguns Vídeos QML que guien pas a pas la connexió entre el frontal i el rerefons.

Comenceu l'exercici 6 de la col·lecció Exercicis de QML

20210122 (QML, 2h síncrona)

   MqttClient {
       id: client
       hostname: hostnameField.text
       port: portField.text
       username: userField.text
       password: pwdField.text
   }

Modifiqueu el broker per un que faci servir usuari i contrasenya:

       TextField {
           id: hostnameField
           Layout.fillWidth: true
           text: "rubi.xoic.coop"
           placeholderText: "<Enter host running MQTT broker>"
           enabled: client.state === MqttClient.Disconnected
       }

Afegiu l'etiqueta d'usuari:

       Label {
           text: "Usuari:"
           enabled: client.state === MqttClient.Disconnected
       }

Al camp de text d'usuari, poseu el nom d'usuari per defecte:

       TextField {
           id: userField
           Layout.fillWidth: true
           text: "rubi"
           placeholderText: "<Usuari>"
           enabled: client.state === MqttClient.Disconnected
       }

Afegiu l'etiqueta de contrasenya:

       Label {
           text: "Contrasenya:"
           enabled: client.state === MqttClient.Disconnected
       }

Al camp de text de la contrasenya, poseu la contrasenya per defecte:

       TextField {
           id: pwdField
           echoMode: TextInput.Password
           Layout.fillWidth: true
           text: "iotRubi"
           placeholderText: "<Contrasenya>"
           passwordCharacter: "x"
           enabled: client.state === MqttClient.Disconnected
       }

Proveu les dues aplicacions a l'escriptori i al dispositiu Android.

Proveu un altre broker que també faci servir usuari i contrasenya.

Proveu si funciona a un broker que no faci servir usuari i contrasenya

20210121 (QML, 3h presencial)

Un tutorial curt de QML

Un tutorial amb tres exemples de codi QML (Els tres codis del tutorial curt).

Seguint amb el tema dels estats, baixeu-vos i executeu l'exemple qmlState01 d'estats en QML i l'exemple qmlState02 d'estats en QML (Basats en la documentació sobre estats de les Qt).

Bucles de vinculació

Què són els bucles de vinculació (binding loops)?

Connexió entre el frontal QML i el rerefons en C++

Exemple de connexió entre el frontal QML i el rerefons en C++ (El codi de connexió és basat en QML - Tutorial 036. Working with Signals and Slots in QML).

Aquí teniu alguns Vídeos QML que guien pas a pas la connexió entre el frontal i el rerefons.

Comenceu l'exercici 6 de la col·lecció Exercicis de QML

Instal·lació de QtMqtt per Android

Malgrat que ja us funcioni la biblioteca QtMqtt en programes d'escriptori, heu de fer la compilació de la biblioteca QtMqtt per a la versió de Qt/QML que feu servir per a poder executar programes que duguin aquesta biblioteca a Android.

Hi ha diversos suggeriments de com fer-ho. Després de diversos intents, aquest és el sistema que a mi m'ha funcionat:

Cerqueu el directori lib de la vostra distribució Qt per a Android x86:

jordi@ecat-XPS13:~$ /home/jordi/Qt/6.0.0/android_x86/bin/qmake -query QT_INSTALL_LIBS
/home/jordi/Qt/6.0.0/android_x86/lib

o, per al dispositiu físic Android amb tecnologia Android ARM:

ecat@iot-ecat:~$ /home/ecat/Qt/6.0.0/android_armv7/bin/qmake -query QT_INSTALL_LIBS
/home/ecat/Qt/6.0.0/android_armv7/lib

Aneu a la carpeta que ens retorna l'ordre anterior (Android x86):

jordi@ecat-XPS13:~$ cd /home/jordi/Qt/6.0.0/android_x86/lib

o, per al dispositiu físic Android amb tecnologia Android ARM:

ecat@iot-ecat:~$ cd /home/ecat/Qt/6.0.0/android_armv7/lib

I feu el procés d'instal·lació (Android x86):

jordi@ecat-XPS13:~/Qt/6.0.0/android_x86/lib$ git clone git://code.qt.io/qt/qtmqtt.git
jordi@ecat-XPS13:~/Qt/6.0.0/android_x86/lib$ cd qtmqtt/
jordi@ecat-XPS13:~/Qt/6.0.0/android_x86/lib/qtmqtt$ git checkout 6.0
jordi@ecat-XPS13:~/Qt/6.0.0/android_x86/lib/qtmqtt$ rm -r examples/

o, per al dispositiu físic Android amb tecnologia Android ARM:

ecat@iot-ecat:~/Qt/6.0.0/android_armv7/lib$ git clone git://code.qt.io/qt/qtmqtt.git
ecat@iot-ecat:~/Qt/6.0.0/android_armv7/lib$ cd qtmqtt/
ecat@iot-ecat:~/Qt/6.0.0/android_armv7/lib/qtmqtt$ git checkout 6.0
ecat@iot-ecat:~/Qt/6.0.0/android_armv7/lib/qtmqtt$ rm -r examples/

Per a Android x86, mitjançant el Qt Creator obriu el projecte /home/jordi/Qt/6.0.0/android_x86/lib/qtmqtt/qtmqtt.pro. Aneu al menú i seleccioneu Build / Run qmake

Per a Android ARM, mitjançant el Qt Creator obriu el projecte /home/ecat/Qt/6.0.0/android_armv7/lib/qtmqtt/qtmqtt.pro. Aneu al menú i seleccioneu Build / Run qmake

Torneu al terminal d'abans i feu (Android x86):

jordi@ecat-XPS13:~/Qt/6.0.0/android_x86/lib/qtmqtt$ make
jordi@ecat-XPS13:~/Qt/6.0.0/android_x86/lib/qtmqtt$ sudo make install

o, per al dispositiu físic Android amb tecnologia Android ARM:

ecat@iot-ecat:~/Qt/6.0.0/android_armv7/lib/qtmqtt$ make
ecat@iot-ecat:~/Qt/6.0.0/android_armv7/lib/qtmqtt$ sudo make install

Copieu, fora de la ruta de les Qt, els projectes d'exemple quickpublication i quicksubscription. Obriu els dos projectes per a que puguin ser executats des de l'escriptori i des del mòbil (emulat o no). Per a verificar llur funcionament, podeu executar un projecte al dispositiu mòbil i l'altre a l'escriptori.

En cas de no poder actualitzar l'editor de QML

Si us surt el missatge Qt Quick emulator layer crash i no s'actualitza el visor QML, però podeu editar l'arxiu en mode text, haureu d'anar al menú:

Tools / Options... / Qt Quick / Qt Quick Designer

i canvieu la selecció Use fallback QML emulation layer per Use QML emulation layer that is built with the selected Qt, deixant buit el Top level build path:. Quan torneu a editar des de l'editor QML es farà una recompilació del visor (sigueu pacients i deixeu acabar tot el procés).

20210118 (QML, 1h presencial)

Seguim amb QML

El darrer dia es va recomanar veure els tres primers capítols dels vídeos de KDAB sobre QML.

Exercicis de QML

Alguns codis explicats avui

Codis QML dels vídeos de KDAB

qml_02_kdab

Ancoratge

anchors.qml:

anchors.qml

anchors2.qml:

anchors2.qml

anchors-centerin-parent-keyword.qml:

anchors-centerin-parent-keyword.qml

anchors-expanding.qml:

anchors-expanding.qml

anchors-fill.qml:

anchors-fill.qml

Bucles de vinculació

Bucles de vinculació (binding loop)

Exemple de bucle de vinculació:

import QtQuick 2.0

Rectangle {
   color: "black"
   width: child.width
   height: child.width

   Image {
       id: child
       source : "../images/vertical-gradient.png"
       anchors.fill: parent
       anchors.margins: 5
   }
}

Una solució per a evitar bucles de vinculació:

import QtQuick 2.0

Rectangle {
   color: "black"
   implicitWidth: child.implicitWidth
   implicitHeight: child.implicitWidth

   Image {
       id: child
       source : "../images/vertical-gradient.png"
       anchors.fill: parent
       anchors.margins: 5
   }
}

20210115 (QML, 1h síncrona)

Connectem Qt/QML a Android

  • Obriu l'Android Studio i virtualitzeu un telèfon mòbil d'arquitectura x86 (molt més ràpid que virtualitzar un ARM):
jordi@ecat-XPS13:/opt/android-studio/bin$ ./studio.sh
  • Feu un nou projecte Application (Qt Quick) / Qt Quick Application - Swipe.
  • Anomeneu i deseu el projecte. Per exemple amb el nom prMobil00
  • Seleccioneu els kits d'Android i d'escriptori, seleccionant l'opció release. Per exemple: Android Qt 6.0.0 Clang x86 i Desktop Qt 6.0.0 GCC 64bit
  • Proveu que us funciona amb la versió d'escriptori
  • Proveu que us funciona amb la versió d'Android virtualitzat. Quan ho executeu heu de seleccionar a quin dispositiu virtual ho voleu fer córrer.

Seguim amb QML

Es recomana veure els tres primers capítols dels vídeos de KDAB sobre QML.

Exercicis de QML

Alguns codis explicats avui

Codis QML dels vídeos de KDAB

20210112 (QML, 3h presencial)

Accés al llibre de Qt/QML en línia

Execució de codis QML des del terminal:

/home/jordi/Qt/5.15.2/gcc_64/bin/qmlscene showcase.qml

Exemples treballats avui

Exercicis QML:

  • ex1) Feu un programa en QML que al principi hi surti un quadrat vermell centrat. Al prémer la tecla B hi sortirà de color blau, al prémer la tecla G hi sortirà de color verd i al prémer la tecla R torna a ser vermell.
  • ex2) Feu un programa en QML a on hi aparegui centrat, horitzontalment i vertical, ben gros i en negreta el nom Escola del Clot. Al prémer la tecla + la lletra es farà més grossa. I al prémer la tecla - la lletra es farà més petita.
  • ex3) Feu un programa que hi surti el text, centrat a la finestra, "Comptador: 0" de color vermell. Al prémer el botó + incrementarà el valor del comptador, i al prémer el botó '-' es decrementarà. Al prémer la tecla N el text serà de color negre i al prémer V tornarà a ser de color vermell.

20210111 (QML, 1h síncrona)

A partir dels exemples en QML d'en Jan Bodnar fem servir el Qt Creator per a executar-los.

Exemples treballats avui

20201221 (IoT, 1h síncrona)

S'acaba el termini de lliurament de pràctiques desenvolupades fins les festes de Nadal.

Les dues darreres:

  • Control de la placa IoT-02 mitjançant Telegram
  • Publicació de dades del sensor BM280 de la placa IoT-02 a Mastodon

20201218 (IoT, 1h síncrona)

Codis d'avui i material d'ajuda per a fer l'exercici

  • Mastodon, una alternativa lliure a Twitter

No totes les instàncies de Mastodon faciliten la instal·lació de bots. Per a fer els primers passos us recomano aquesta instància pensada per a hostatjar bots de Mastodon (tal i com es va demanar el dia anterior, heu d'haver demanat les credencials a la instància de Mastodon botsin.space amb molta antelació. Si ho sol·liciteu avui mateix no podreu seguir la classe).


Exemple de bot de Mastodon per a fer lectures de sensors cada hora.

Getting credentials for the Mastodon API with Mastodon.py, step by step

  • Exercici:

Publiqueu la temperatura, humitat relativa i pressió atmosfèrica llegides per la vostra placa IoT-02 i les publiqueu a Mastodon mitjançant NodeRED.

Feu un informe de com ho heu programat i captures de llur funcionament.

20201215 (IoT, 3h presencial)

Alguns codis d'avui

Autenticació d'accés a NodeRED

Securing NodeRED

Generació de la contrasenya d'accés en mode hash des de la carpeta d'execució del NodeRED:

node node_modules/node-red/red.js admin hash-pw

En aquest exemple fem servir aquesta contrasenya en mode hash:

$2a$08$PbYFpiQSnoVaOfD1daCelU2Kvcg19KElO1DbVtE8GAJXacD6ABq

Edició de settings.js:

toni@vps-10d8edcd:~/bin/nodered$ nano ./node_modules/node-red/settings.js
   // Securing Node-RED
   // -----------------
   // To password protect the Node-RED editor and admin API, the following
   // property can be used. See http://nodered.org/docs/security.html for details.
   adminAuth: {
       type: "credentials",
       users: [{
           username: "toni",
           password: "$2a$08$PbYFpiQSnoVaOfD1daCelU2Kvcg19KElO1DbVtE8GAJXacD6ABq",
           permissions: "*"
       }]
   },

Un cop fets el canvis cal reiniciar el NodeRED.

Telegram

Bot de Telegram

  • Creació de bots amb BotFather
  • Instal·lació de nodes de Telegram a NodeRED (afegiu els nodes node-red-contrib-telegrambot)
  • Interacció amb un usuari de Telegram
  • Interacció amb un grup de Telegram

Material per a fer el bot


Flux de prova per al bot de Telegram

Deures pel proper dia

Feu-vos membres d'aquesta instància de Mastodon: botsin.space

Feu-ho amb prou antelació, és possible que trigui més de tres hores a donar-vos accés.

20201211 (Qt i IoT, 1h síncrona)

Notes del 1r trimestre

Comentarem dubtes de la darrera pràctica.

Es demana de dur instal·lat Telegram al telèfon mòbil per a la propera classe del 14 de desembre de 2020.

20201204 (Qt i IoT, 1h síncrona)

Notes provisionals del 1r trimestre

Desenvolupem com a pràctica puntuable la resolució dels exercicis 5, 6 i 7 (Trameteu per separat P5, P6 i P7)

20201201 Examen 1r trimestre

Enunciat de l'examen del 1r trimestre

Notes provisionals de les pràctiques a 1 de desembre de 2020

20201130 (dubtes i Qt, 1h síncrona)

Codis d'avui (Senyals, osques, agrupacions i connexions)

20201127 (Qt i IoT, 1h síncrona)

Revisem l'exercici proposat el darrer dia.

20201124 (IoT i Qt) (3h, presencial)

Control de la placa IoT-02 mitjançant MQTT emprant Qt i missatges JSON

Codis d'interacció amb la placa IoT-02 emprant C++ per a Qt, fent servir JSON i MQTT.

Codi de flux de NodeRED per a controlar els leds de la placa IoT-02 mitjançant un JSON

Flux de NodeRED emprant MQTT i JSON bidireccional

Exercici amb la placa IoT-02 emprant C++ per a Qt, fent servir JSON i MQTT

Desenvolupeu el projecte 15_mqtt_IoT02_03, basant-vos en el darrer codi de control de la placa IoT-02 en C++ per a Qt, que visualitzi en una barra de progrés el nivell de llum rebut per la LDR.

20201123 (Qt i IoT, 1h síncrona)

Control de la placa IoT-02 mitjançant MQTT emprant Qt i missatges JSON

Codis d'interacció amb la placa IoT-02 emprant C++ per a Qt, fent servir JSON i MQTT.

20201120 (Qt i IoT, 1h síncrona)

Al dia d'avui us he posat el codi per a poder visualitzar el color dels leds.

Fent servir MQTT, feu una aplicació emprant Qt que ensenyi l'estat dels botons i dels leds de la placa IoT-02

Codis d'avui

20201117 (Qt i IoT, 3h presencial)

Biblioteca Arduino_JSON per l'IDE d'Arduino

Codis d'avui

Dades encapsulades en JSON al NodeRED i a la placa IoT-02.

Exercici

Desenvolupeu una aplicació GUI feta amb Qt que mitjançant el protocol MQTT:

  • Controli els quatre leds mitjançant botons seleccionadors (check box)
  • Indiqui l'estat dels tres botons mitjançant etiqueta (premut / no premut)
  • Indiqui l'estat dels tres botons mitjançant etiqueta gràfica (color viu / color fosc)
  • Una barra de progrés indiqui el nivell de llum
  • Trameti missatges a la pantalla OLED (tres botons seleccionadors de mida del text)

20201116 (Qt, 1h síncrona)

Codis d'avui

Exercici

Modifiqueu el codi de MQTT's simpleclient per a admetre usuari i contrasenya (podeu fer servir el broker formacio.things.cat amb usuari ecat i contrasenya clotClot).

Captura de l'exercici a fer

Documentació

Qt/QML

Qt5 de Jan Bodnar

Vídeos QML

Qt5 Cadaques! A Book about Qt5

Qt Quick tutorial de Jan Bodnar

PyQt5 de Jan Bodnar

Qt for WebAssembly

Qt for WebAssembly

json

How To Manipulate JSON With C++ and Qt

QProcess

QProcess example

Qt5 tutorial FFmpeg converter using QProcess - 2020

IoT

Introducció al Node-RED

TCP/UDP Capa de transport d'Ethernet

Introducció a MQTT

Afegint la targeta ESP8266 a l'IDE d'Arduino (NodeMCU1.0)

Micropython and the Internet of Things

SCADA fent servir Python QML i Arduino

MQTT avec Qt

Planificació

Distribució de M07UF1, M09UF2, M09UF3, M15UF1 i M13 al curs 2020-2021 de 2n de DAM