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

De binefa.com
Salta a la navegació Salta a la cerca
 
(372 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 =
== 20201008 Qt/QML (1,5h) ==
+
== 20210609 (3h presencial) '''Avaluació extraordinària''' ==
[https://binefa.cat/dam2021/20201008_qt/term.zip Codis de terminal]. Classes: Constructors, destructors, atributs i mètodes (públics, protegits i privats).
+
[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
 +
 
 +
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''').
 +
 
 +
 
 +
[https://botsin.space/@siarq_sensors Exemple de bot de Mastodon] per a fer lectures de sensors cada hora.
 +
 
 +
[https://gist.github.com/aparrish/661fca5ce7b4882a8c6823db12d42d26 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) ==
 +
[https://binefa.cat/dam2021/20201215_iot/ Alguns codis d'avui]
 +
 
 +
=== Autenticació d'accés a NodeRED ===
 +
[https://nodered.org/docs/user-guide/runtime/securing-node-red 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''' ===
 +
[https://wiki.binefa.cat/index.php?title=Bot_de_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
 +
 
 +
[https://binefa.cat/training/adtelecom/20201209/ Material per a fer el bot]
 +
 
 +
 
 +
[https://binefa.cat/dam2021/20201215_iot/provantBotTelegram.txt Flux de prova per al bot de Telegram]
 +
 
 +
=== '''Deures pel proper dia''' ===
 +
 
 +
Feu-vos membres d'aquesta instància de Mastodon: [https://botsin.space/ 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) ==
 +
[https://binefa.cat/dam2021/20201211_qt_iot/notes_1rT_v2.png 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) ==
 +
[https://binefa.cat/dam2021/20201204_qt_iot/notes_1rT.png Notes provisionals del 1r trimestre]
 +
 
 +
[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)
 +
 
 +
== 20201201 '''Examen 1r trimestre''' ==
 +
 
 +
[https://binefa.cat/dam2021/20201201_qt_iot_Ex1rT/enunciat/ Enunciat de l'examen del 1r trimestre]
 +
 
 +
[https://binefa.cat/dam2021/20201201_qt_iot_Ex1rT/pr20201201.png Notes provisionals de les pràctiques a 1 de desembre de 2020]
 +
 
 +
== 20201130 (dubtes i Qt, 1h síncrona) ==
 +
[https://binefa.cat/dam2021/20201130_qt_iot/ 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]]
 +
 
 +
[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ó =
 +
== Qt/QML ==
 +
[http://zetcode.com/gui/qt5/ Qt5] de [https://twitter.com/janbodnar Jan Bodnar]
 +
 
 +
[[Vídeos QML]]
  
Paradigma '''senyal / osca''' (''signal / slot'')
+
[https://qmlbook.github.io/ Qt5 Cadaques!] A Book about Qt5
  
== 20201008 IoT (1,5h) ==
+
[http://zetcode.com/gui/qtquick/ Qt Quick tutorial] de [https://twitter.com/janbodnar Jan Bodnar]
Comunicació '''UDP''' entre la placa IoT-02 i el NodeRED
 
  
== 20201005 IoT (1h) ==
+
[http://zetcode.com/gui/pyqt5/ PyQt5] de [https://twitter.com/janbodnar Jan Bodnar]
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
+
=== Qt for WebAssembly ===
 +
[https://wiki.qt.io/Qt_for_WebAssembly Qt for WebAssembly]
  
[https://binefa.cat/esp8266/doc/ethernetTcpUdp_00.pdf Què és TCP i UDP?]
+
=== json ===
 +
[http://erickveil.github.io/2016/04/06/How-To-Manipulate-JSON-With-C++-and-Qt.html How To Manipulate JSON With C++ and Qt]
  
[https://binefa.cat/dam2021/20201005/ Codis de NodeRED] (UDP in i UDP out)
+
=== QProcess ===
 +
[https://gist.github.com/ynonp/8148340 QProcess example]
  
== 20201002 IoT (2h) ==
+
[https://www.bogotobogo.com/Qt/Qt5_QProcess_QFileDialog_QTextEdit_FFmpeg.php Qt5 tutorial FFmpeg converter using QProcess - 2020]
[https://github.com/jordibinefa/IoT-02 La placa IoT-02 al GitHub]
 
  
== 20201001 IoT (3h) ==
+
== IoT ==
'''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/IoT/nodeRed/nodeRed01.pdf Introducció al Node-RED]
  
[https://www.aliexpress.com/item/33027891253.html Enllaç a un cable miniusb i microusb B (els dos)]
+
[https://binefa.cat/IoT/teoria/ethernetTcpUdp_00.pdf TCP/UDP Capa de transport d'Ethernet]
  
[https://www.aliexpress.com/item/32894794476.html Enllaça a una font d'alimentació de %V / 3A amb connector microusb]
+
[https://binefa.cat/IoT/teoria/mqtt_00.pdf Introducció a MQTT]
  
Presa de contacte amb la '''placa IoT-02'''.
+
[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)
  
== 20200928 IoT (1h) ==
+
[https://blog.miguelgrinberg.com/post/micropython-and-the-internet-of-things-part-i-welcome Micropython and the Internet of Things]
[https://binefa.cat/dam2021/20200928/ NodeRed autònom i d'altres codis]
 
  
== 20200425 Qt/QML (2h) ==
+
[https://wiki.binefa.cat/index.php?title=SCADA_fent_servir_Python_QML_i_Arduino SCADA fent servir Python QML i Arduino]
[https://binefa.cat/dam2021/20200925/ Codis de presa de contacte amb el Qt Creator]
 
  
== 20200922 Qt/QML (2h) ==
+
[http://silanus.fr/sin/?p=1194 MQTT avec Qt]
[https://www.qt.io/download-qt-installer Instal·lador de Qt]
 
  
[https://binefa.cat/daw/m03/20200511_covid19/ Codis de l'11 de maig de 2020]
+
= 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[modifica]

2n de DAM

Teleconferència del curs 2020-2021[modifica]

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[modifica]

QML[modifica]

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[modifica]

Pseudoservidor UDP emprant Qt5 (1/2)

Pseudoservidor UDP emprant Qt5 (2/2)

Algunes classes[modifica]

20210609 (3h presencial) Avaluació extraordinària[modifica]

Enunciats de l'avaluació extraordinària

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

Sala Meet de la presentació de projectes

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

Sala Meet de la presentació de projectes

20210520 (1h presencial)[modifica]

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

20210517 (1h presencial)[modifica]

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

20210514 (2h presencial)[modifica]

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

20210513 (3h presencial)[modifica]

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

20210510 (1h presencial)[modifica]

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

20210507 (2h presencial)[modifica]

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

20210506 (3h presencial)[modifica]

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

20210503 (1h presencial)[modifica]

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

20210430 (2h presencial)[modifica]

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

20210429 (3h presencial)[modifica]

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

20210426 Comença el projecte (1h presencial)[modifica]

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

20210423 Darrer dia (2h síncrona)[modifica]

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)[modifica]

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)[modifica]

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)[modifica]

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)[modifica]

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)[modifica]

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)[modifica]

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

20210408 (3h presencial)[modifica]

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)[modifica]

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)[modifica]

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)[modifica]

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

Comentem l'exercici 3.7

20210319 (2h síncrona)[modifica]

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

Alguns codis explicats avui

FreeRTOS[modifica]

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)[modifica]

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)[modifica]

Conceptes de LoRa 2020-2021

20210312 (2h presencial)[modifica]

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)[modifica]

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[modifica]

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

LoRa 2020-2021

20210308 (1h presencial)[modifica]

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

FreeRTOS[modifica]

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)[modifica]

Continuem amb el temes d'ahir.

HTTP a MQTT[modifica]

Flux de NodeRED per a convertir crides HTTP a MQTT

Exercici d'HTTP a MQTT[modifica]

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)[modifica]

Alguns codis comentats avui

Bases de dades temporals i visualització[modifica]

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

Exercici de bases de dades temporals i visualització[modifica]

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

HTTP a MQTT[modifica]

Flux de NodeRED per a convertir crides HTTP a MQTT

FreeRTOS[modifica]

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

20210301 (1h presencial)[modifica]

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

Notes provisionals d'avaluació ordinària del M07UF1

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

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

InfluxDB v2.0[modifica]

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[modifica]

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[modifica]

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)[modifica]

  • 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[modifica]

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

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

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

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

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

Resolució de dubtes.

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

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)[modifica]

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

Seguim amb els Exercicis de QML

20210212 (QML, 2h presencial)[modifica]

Alguns codis comentats avui

QmlExporter

20210211 (QML, 3h síncrona)[modifica]

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)[modifica]

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)[modifica]

Alguns codis comentats avui

Actualització de la màquina virtual[modifica]

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)[modifica]

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[modifica]

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[modifica]

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[modifica]

  • 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[modifica]

MQTT_i_MQTTS

20210201 (QML, 1h presencial)[modifica]

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)[modifica]

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

20210128 (QML, 3h síncrona)[modifica]

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[modifica]

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[modifica]

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)[modifica]

Connexió entre el frontal QML i el rerefons en C++[modifica]

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)[modifica]

   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)[modifica]

Un tutorial curt de QML[modifica]

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ó[modifica]

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

Connexió entre el frontal QML i el rerefons en C++[modifica]

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[modifica]

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[modifica]

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)[modifica]

Seguim amb QML[modifica]

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[modifica]

Ancoratge[modifica]

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ó[modifica]

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)[modifica]

Connectem Qt/QML a Android[modifica]

  • 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[modifica]

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)[modifica]

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)[modifica]

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)[modifica]

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)[modifica]

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)[modifica]

Alguns codis d'avui

Autenticació d'accés a NodeRED[modifica]

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[modifica]

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[modifica]

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)[modifica]

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)[modifica]

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[modifica]

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)[modifica]

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

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

Revisem l'exercici proposat el darrer dia.

20201124 (IoT i Qt) (3h, presencial)[modifica]

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[modifica]

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)[modifica]

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)[modifica]

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)[modifica]

Biblioteca Arduino_JSON per l'IDE d'Arduino

Codis d'avui

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

Exercici[modifica]

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)[modifica]

Codis d'avui

Exercici[modifica]

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ó[modifica]

Qt/QML[modifica]

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[modifica]

Qt for WebAssembly

json[modifica]

How To Manipulate JSON With C++ and Qt

QProcess[modifica]

QProcess example

Qt5 tutorial FFmpeg converter using QProcess - 2020

IoT[modifica]

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ó[modifica]

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