Curso IoT Avanzado (Sesión 4)
Ajuste de pantallaEl ajuste de pantalla se aprecia al ver el vídeo en pantalla completa. Elige la presentación que más te guste:
El próximo miércoles prácticas a ver si la rematamos los que vais un poquito más
00:00:00
retrasados y luego ya el 4 de mayo que es el siguiente miércoles teoría y en un principio
00:00:14
el día 10 de mayo el examen de batería más este tema y el otro me va a la película.
00:00:22
Estaba ya oyendo el examen y tal y digo bueno, bueno, que esto es esto.
00:00:29
O digo todo lo que me he perdido, digo la madre que me he parido acojonado estaba.
00:00:36
Nada, nada, que os iba a decir, silenciaros por favor los micros siempre y ya sé que
00:00:40
es un poco rollo sobre todo en estos principios, pero es que si no pasan estas cosas vale
00:00:49
quitáis el mute habláis y lo volvéis a poner, aunque sea un poco tedioso, porque
00:00:53
si no, si no al final se nos cuelan conversaciones y nos enteramos de cosas que no queremos
00:00:59
saber.
00:01:04
Vale, entonces ya por mi parte os he muteado a todos.
00:01:05
Tú tienes la posibilidad de silenciar a todos por si te digo la mejor.
00:01:12
Vale, tú estás como organizador, o sea que tú debes tener todo el poder.
00:01:19
Hombre, es mi sesión con mi nombre.
00:01:26
Ya, ya, por eso, pero no puedes grabar y yo sí.
00:01:29
Son los misterios de Microsoft, tú eres el que tiene los poderes de todo menos de grabar.
00:01:32
Si la última la grabé yo.
00:01:38
Vale, pues ya está.
00:01:43
Cuando quieras, Jorge, la clase es tuya.
00:01:45
Vale, ¿me veis?
00:01:51
Sí, perfecto.
00:01:55
Sí, sí, sí.
00:01:56
Vale, estupendo.
00:01:57
Sí.
00:01:58
Vale, muy bien, pues nada, vamos a continuar un poco donde lo dejamos.
00:02:00
La semana pasada estuvimos jugando con la parte sobre todo de las funciones de Javascript, ¿verdad?
00:02:08
Y estuvimos, acabamos, si no recuerdo mal, corregidme por favor.
00:02:20
Acabamos con la práctica del semáforo.
00:02:24
No sé si había quedado pendiente por corregir o la habíamos dado por finalizada.
00:02:28
Yo creo que sí, que quedó corregido.
00:02:39
Vale, y me quedaba por explicar unas cuantas cosillas que quedaban relacionadas con esto para las funciones Change y Switch.
00:02:42
Vale, entonces, si volvemos a la documentación, este es el anexo.
00:03:03
Vale.
00:03:14
Vale, esta parte la expliqué, ¿verdad?
00:03:18
La diferencia entre lo que eran las memorias de contexto, los tres tipos de variables que podíamos llegar a crear, los flujos.
00:03:20
Explicamos por qué a veces era interesante utilizar una memoria externa, que no se perdiera junto con el flujo.
00:03:28
Una vez creado el flujo se destruye toda la información.
00:03:36
Y lo que no habíamos estado viendo es cómo se manipulan las variables de contexto desde los bloques de forma gráfica.
00:03:38
Que no sea utilizando código.
00:03:53
Un segundillo.
00:03:57
Entonces, si os fijáis, en la documentación del Change aparece marcado como subrayado que este es el único nodo quitando el nodo de función,
00:04:02
es decir, el único gráfico que nos permite o que es capaz de acceder al espacio context en modo escritura.
00:04:19
Entonces, ¿cómo se manipulan desde modo gráfico las variables de contexto?
00:04:26
Estas quedamos en que si nos veníamos aquí, a ContextData, aquí podíamos comprobar qué cosas estaban establecidas y cuáles no.
00:04:36
Aquí, por ejemplo, me quedó el contador de uno de los ejercicios anteriores.
00:04:44
Vamos a ir viendo en el bloque de Change, que es este de aquí, cómo se hace para acceder a una variable de ese tipo.
00:04:49
Por ejemplo, aquí estamos acostumbrados, cuando establecemos algo, a manejar siempre MSG.
00:05:00
O hasta ahora habíamos estado manejando MSG. Ponemos MSG a lo que fuera.
00:05:08
Pero si os fijáis, este bloque también nos permite establecer algo de tipo Flow o algo de tipo Global.
00:05:12
Aquí veis, por ejemplo, que como decía del ejemplo anterior, habíamos dejado guardado en Contador un 201, que lo utilizábamos como una especie de variable de curación.
00:05:20
Pues aquí lo voy a marcar directamente con la palabra hola.
00:05:29
Si a esto yo le pongo un INYECT.
00:05:34
Despliego y ejecuto.
00:05:41
Esta variable llamada contador, que antes tenía un 201, en cuanto yo lo refresqué.
00:05:44
Ah, vale, claro. Sí. Porque no le he puesto... Perdona.
00:05:50
Claro, como he establecido global.payload, lo que hay que hacer es global.contador.
00:06:01
Ahora sí voy a borrar esta.
00:06:10
Recargo y ahora sí. He machacado la variable contador por un nuevo valor que ha establecido el nodo Change.
00:06:12
Como os decía, este es el único nodo gráfico que tiene capacidad de modificar lo que son las variables de tipo Flow o de tipo Global, que son las que decimos que son de contexto.
00:06:25
Por otro lado, tenemos en el bloque If y en algunos otros, la capacidad también aquí de preguntarnos por variables que forman parte del espacio Context.
00:06:38
Es decir, yo puedo preguntar si global.payload es lo mismo que hola.
00:06:49
Y en este caso hace...
00:06:57
Contador.
00:06:59
¿Perdón?
00:07:01
Contador.
00:07:03
¿Sí?
00:07:08
No entiendo.
00:07:10
No, que habías dicho global.payload, ¿no?
00:07:12
Ah, perdón. Sí, correcto.
00:07:15
Sí, sí, bien, te han visto.
00:07:18
Por cierto, te escucho muy bajito.
00:07:20
Vale, entonces.
00:07:24
Aquí podemos preguntarnos si global.contador, que en este caso no es una propiedad, sino que digamos que sería el nombre de una variable del ámbito global,
00:07:26
se parece a... o es lo mismo que hola, y en ese caso progresaría.
00:07:34
De forma que si yo aquí añado un debug
00:07:39
y con este inject, por ejemplo, provoco que se realice esa comprobación,
00:07:44
me voy a la ventana de debug, pues esto tiene que generar un mensaje
00:07:51
porque esta condición se ha cumplido.
00:07:55
He evaluado si esta variable está establecida dentro de global y si estando establecida contenía la palabra hola.
00:07:57
Bien.
00:08:08
¿Alguna...?
00:08:09
A ver, ¿dónde estáis?
00:08:10
Vale.
00:08:15
¿Alguna duda con esto?
00:08:16
Habiendo hecho esto de forma textual, de forma programática, pues hacerlo de forma gráfica es bastante sencillo.
00:08:17
Donde antes hacíamos el global.set o el global.get, pues ahora directamente elegimos qué queremos escribir o de dónde queremos evaluar
00:08:23
y el flujo continúa por donde queramos nosotros.
00:08:34
Vale.
00:08:40
¿Alguna duda de lo que llevamos hasta aquí?
00:08:41
Porque hoy mi idea es pediros una serie de ejercicios que están previstos en la parte final del tema 2
00:08:43
e ir corrigiendo poco a poco.
00:08:51
Entonces, antes de empezar a pedir sus ejercicios, ¿alguna consulta?
00:08:54
¿Alguna cosa que no haya quedado clara, sobre todo de lo que vimos el miércoles pasado,
00:08:58
que es cuando más tiempo dedicamos a ver la parte de programación?
00:09:02
Yo tengo una duda.
00:09:07
Sí.
00:09:08
¿Por qué Pablo no ha registrado la entrada si está aquí?
00:09:09
Perdona.
00:09:13
Es que es el único que me falta.
00:09:15
Es que estaba buscando. Está en el chat el número.
00:09:18
Está en el chat, está en el chat, sí.
00:09:21
Tranquilo, tú sigue ahí.
00:09:25
Gracias.
00:09:31
Vale.
00:09:35
Bueno, ¿alguna duda técnica?
00:09:37
Venga, pues vamos a ir viendo poco a poco los ejercicios que tenía previstos.
00:09:40
Vale, y vamos a empezar por este.
00:09:52
Estamos en la página 23.
00:09:54
Y os lo leo.
00:09:56
Hay veces que la redacción de lo que se quiere, como son ejercicios que son todavía un poco abstractos,
00:09:58
en el sentido en el que no estamos resolviendo realmente un problema de verdad,
00:10:05
eso va a entrar un poquito más adelante, son ejercicios un poco abstractos.
00:10:10
Entonces, hay veces que cuesta expresarlos y cuesta, por tanto, resolverlos, entenderlos.
00:10:13
Dice, en este caso vamos a utilizar nodo change.
00:10:19
Dice, cread un flujo de trabajo nuevo, un sistema para guardar una variable en el espacio context.
00:10:21
Esto lo que nos está diciendo es que utilicemos o bien una de flujo, una global,
00:10:28
con el valor booleano true.
00:10:32
Y esto se debe activar cuando hagamos clic en un inject.
00:10:34
Y en otro nodo inject tenemos que proceder a la lectura.
00:10:39
Y esa lectura será visualizada en un nodo de depuración.
00:10:45
¿Se entiende lo que queremos?
00:10:52
Que no estoy muy seguro cómo es.
00:10:54
Creo que os lo he dicho el primer día.
00:10:55
Es primera edición de este curso.
00:10:58
Entonces estoy un poco...
00:11:01
Yo no lo entiendo.
00:11:03
Vamos a verlo un poquito mejor.
00:11:05
Vamos por parches.
00:11:12
Nos pide que utilicemos el nodo change para basarnos en esto.
00:11:14
Necesitamos que haya un inject que al ser pulsado actúe sobre un change.
00:11:17
Y eso lo que haga es establecer una variable del espacio context, que son las que hemos visto, que son o flujo o global, guardado con un booleano.
00:11:26
Cada vez que yo pulse en un inject se va a almacenar, gracias a un nodo change, una variable.
00:11:37
Se va a guardar un true en una variable.
00:11:45
Y luego en otro hilo de ejecución diferente, en otro conjunto de nodos,
00:11:48
estará unido un inject con algo.
00:11:53
Y eso lo que tiene que hacer es que por el puerto de depuración nos deberá mostrar el contenido de la variable que hemos establecido en el flujo anterior.
00:11:56
No sé si ya os habéis quedado iguales.
00:12:09
¿Ahora un poquito bajar?
00:12:11
Vamos a dejar 2-3 minutos.
00:12:19
Hoy he salido para el 3º hilo.
00:12:25
Igual empezar la clase así con esto es un poco más duro.
00:12:29
Bueno, si queréis vamos a cerrar. Vamos a dejar 3 minutillos para que el que lo tenga claro lo pueda intentar.
00:12:35
Y esto lo resolvemos rápido para poder seguir con otros un poquito más complicados.
00:12:42
Si os digo, describir algo textualmente que en realidad debería ser con una captura de pantalla es complicado.
00:12:48
Pero si pongo una captura de pantalla ya no hay ejercicio.
00:12:55
¿Dónde está este enunciado del ejercicio? ¿En qué tema? ¿Dónde...?
00:13:04
Es del PDF que acaba con tema 2 y es la página 23.
00:13:28
¿23? Yo solo tengo 10.
00:13:44
Es la página 8 del PDF pero que en el margen inferior pone...
00:13:49
Vale, vale, vale.
00:13:54
Gracias.
00:13:59
Aquí está.
00:14:02
Gracias.
00:14:24
Gracias.
00:14:54
Gracias.
00:15:24
Vale, ¿cómo lo lleváis? ¿Alguien lo tiene resuelto?
00:15:54
¿Alguien lo tiene resuelto? ¿O alguien está medio encaminado para terminarlo?
00:16:23
Vale.
00:16:31
Vale.
00:16:33
Vale, ¿los demás cómo lo veis? ¿Queréis unos minutillos más o resolvemos este primero así un poco más rápido para...?
00:16:46
Unos minutillos sí puede ser.
00:16:53
Vale, genial.
00:16:55
Vale.
00:17:02
Vale.
00:17:32
Vale.
00:18:02
Gracias.
00:18:32
Gracias.
00:18:33
Gracias.
00:19:02
Gracias.
00:19:33
Gracias.
00:19:34
Gracias.
00:19:35
Gracias.
00:20:02
Gracias.
00:20:26
Gracias.
00:20:56
Gracias.
00:21:26
Gracias.
00:21:56
Cuando queráis, ¿eh?
00:22:16
¿Podemos corregir?
00:22:28
Venga, estupendo.
00:22:32
Pues, ¿quién se anima a darme su solución?
00:22:33
A ver, ¿alguien de los que haya resuelto?
00:22:53
Pues Manuel o Esteban, ¿os animáis?
00:22:55
Yo, vamos, probablemente lo tenga mal, pero lo he visto muy fácil.
00:23:02
Sí, bueno, probemos.
00:23:07
Vamos a ver, yo he puesto un nodo ENGINE.
00:23:10
Vamos, que no hacía falta, porque puedes directamente asignarlo desde el SiteFlow Pilot, ¿no?
00:23:13
O sea, he puesto un nodo... ¿Qué hago? ¿Comparto la pantalla?
00:23:20
No, a ver si quieres dictándome, por así decirlo.
00:23:24
Sí, bueno, he puesto un nodo ENGINE y al que le he inyectado un valor booleano, aunque no haría falta, ¿no?
00:23:28
Simplemente el ENGINE lo que hace es hacer que el SiteFlow Pilot se ejecute, ¿no?
00:23:36
Y en el SiteFlow Pilot he puesto un valor de TRUE.
00:23:42
Y luego, pues directamente con otro INYECT he llamado al FlowPilot a un NSGPilot, ¿no?
00:23:50
Entonces me saca el TRUE.
00:24:00
Creo que es eso lo que quería, no sé si es exactamente...
00:24:03
¿Cómo? No entiendo.
00:24:09
Sí, como es una variable de...
00:24:11
Espera, espera, espera, el primer INYECT, ¿la salida a dónde va?
00:24:14
Del primer INYECT la salida va a SetFlowPilot, o sea...
00:24:18
O sea, un Change.
00:24:22
Un Change, un nodo Change.
00:24:23
Y en el que pongo SetFlowPilot, ¿no?
00:24:25
Set... eh... Flow...
00:24:29
Sí, y ya está. Y ahí le pongo un TRUE.
00:24:33
TRUE de valor TRUE, ¿no?
00:24:36
Ah, vale.
00:24:38
O sea, que es redundante porque se lo vuelves a llamar a la otra vez, ¿no? Con el INYECT.
00:24:40
Vale, bueno, me vale. No he especificado de otra manera.
00:24:47
O sea, se podía hacer también que tú establecieras el SetFlow, lo que sea, a el contenido...
00:24:50
Sí, lo que te manda el INYECT, ¿no?
00:24:59
...de MSF.Payload.
00:25:02
Sí, sí.
00:25:04
Pero bueno, de esa forma está bien.
00:25:05
Y este nodo muere aquí, ¿verdad? Ya no es el INYECT Continuar.
00:25:08
Y este otro...
00:25:11
Y ese ahora, pues, le inyectas el Flow.Payload, se lo inyectas a un nodo de Back y ya está.
00:25:13
¿Cómo inyectas el Flow....?
00:25:23
Pues, eh...
00:25:27
Flow.Payload, ¿no?
00:25:29
MSF.Payload igual a Flow.Payload.
00:25:31
Ya está.
00:25:35
Correcto.
00:25:36
Y eso se lo inyectas a un Debug.
00:25:37
Es correcto, lo he interpretado bien.
00:25:40
Sí, sí, es perfecto.
00:25:42
Vale, lo instalamos.
00:25:49
Vamos a borrar este.
00:25:51
Comprobamos que no hay ninguno más.
00:25:55
Mandamos el True que esto ocasiona...
00:25:57
Ah, perdón, el DaFlow.
00:26:00
Esto ocasiona que se haya generado un mensaje de Payload a True.
00:26:02
Y si ejecutamos aquí y nos vamos a la ventana de decoración...
00:26:06
Vemos que efectivamente en MSG.Payload se ha generado el contenido de Payload.
00:26:11
Perfecto.
00:26:20
Otra opción podría haber sido que este Inyect sólo mande un...
00:26:22
O sea, que sea simplemente un Trigger, por así decirlo.
00:26:31
Algo que sólo mande un booleano.
00:26:34
Y que este booleano cause que en MSG.Payload se grabe el contenido de Flow.Payload.
00:26:36
Pero es dar un paso intermedio para llegar al mismo sitio.
00:26:45
Con lo cual, tal y como lo tenéis establecido tú, está perfecto.
00:26:49
Bien con la solución.
00:26:56
¿Los demás? ¿Alguien lo tenía resuelto de una forma diferente?
00:27:01
Yo lo tenía resuelto así, pero lo que no sé es por qué no me sale en la pantalla de Debug.
00:27:06
Me sale en el Context.
00:27:11
En el Payload me sale a True, pero en el Debug no me sale nada. No sé.
00:27:14
A ver, comparteme la pantalla, por favor.
00:27:19
Vale, por ahí veo también alguna otra cara de que no le está funcionando.
00:27:22
Compartir. Aquí está.
00:27:32
¿Me ves?
00:27:36
No, es que se me ha quedado parado el nodo de red. No sé qué está pasando.
00:27:39
Pues mira, aquí tengo mi Context, tengo aquí mi True.
00:27:43
Y te falta el nodo de Debug, ¿no? Para poder ver.
00:27:47
Recuerda que si no pones un nodo de Debug...
00:27:52
¿Dónde lo tengo que conectar, aquí?
00:27:56
Al de abajo, entiendo.
00:27:59
Vale, en este no había hecho nada. Solo había dado aquí a este.
00:28:02
Vale, comprueba a ver. Vete al Context Data.
00:28:07
Arriba a la derecha.
00:28:11
O sea, tú ya has inyectado, ¿verdad? No, no. Dale a Adam.
00:28:14
¿Dónde voy? Arriba a la derecha, cerca del Deploy.
00:28:18
Sí, al Context Data.
00:28:22
Refresca eso para comprobar. Vale, perfecto.
00:28:25
Y ahora sí, enséñame el switch, por favor. El de abajo.
00:28:28
Aquí no había hecho nada.
00:28:32
Claro, ese switch va a hacer que no progrese ningún mensaje.
00:28:35
Vale, vale, ahora lo entiendo. Sí, sí, sí.
00:28:40
Pues quita el switch ese. Vamos a resolverlo de la forma en la que lo había hecho Esteban, ¿verdad?
00:28:43
Que es que...
00:28:48
Conecta uno con otro.
00:28:51
Y ahora vamos a editar el timestamp.
00:28:54
Y entonces queremos establecer en msg.payload...
00:28:58
Ese topic te lo puedes quitar si quieres.
00:29:03
Este. No, no, el topic.
00:29:06
Lo añado. Aquí en el payload, ¿no?
00:29:09
Y aquí lo dejo como un lado.
00:29:15
No, queremos leer. Queremos obtener lo que sea que esté escrito en flow.payload.
00:29:18
Vale, vale, vale. O sea, en payload, vale.
00:29:24
Vale.
00:29:29
Y ahora le doy a inyectar.
00:29:32
Ah, aquí está. Y aquí...
00:29:36
Ahí, despliega payload.
00:29:40
No, pero ahí tenía que salir el true, ¿no?
00:29:44
Sí, has...
00:29:50
Has inyectado.
00:29:53
Borro si quieres, ¿sabes? Borro todo.
00:29:56
Está de prueba. Le doy aquí, ¿no?
00:29:59
Bueno, así está establecido. Eso no debería hacer falta. Y ahora le bajo.
00:30:02
Ese. Vale, ahora sí.
00:30:06
Ah, sí, qué raro.
00:30:09
Sí, porque probablemente...
00:30:11
Tendrías ese mensaje de curación anterior, ¿no?
00:30:16
Puede ser, creo que sí.
00:30:19
Vale, bueno, pues...
00:30:22
Voy a...
00:30:24
Ah, bueno, es que estaba recomprobando.
00:30:26
Estaba... Vale.
00:30:29
Simplemente eso era comprobar, o sea, experimentar un poco
00:30:32
cómo hacemos para establecer desde modo de gráfico,
00:30:36
de modo de nodos, cómo establecemos una variable de contexto
00:30:42
y cómo la rescatamos para luego, en este caso, sacarla a depuración.
00:30:45
Vale. María, cuéntame, ¿has podido solucionarlo?
00:30:53
Sí, sí, sí. Es que se me había quedado bloqueado el nodo de red,
00:30:58
pero ya ha vuelto a la vida.
00:31:02
Vale, vale. Estupendo.
00:31:05
Muy bien. Jorge, ¿alguna duda con respecto a esto?
00:31:08
¿Me oyes?
00:31:12
Sí.
00:31:13
Ah, sí.
00:31:14
Bueno, que sí, que tenía una duda.
00:31:15
Estoy expugnando el programa, pero si lo doy a la derecha,
00:31:18
en context data, donde sale node flow y global,
00:31:22
no me sale nada en flow.
00:31:26
Recuerda que no se autorrefresca.
00:31:29
Esa parte de la ventana del entorno no se autorrefresca.
00:31:32
Tienes que darle a las flechitas que están como en un círculo.
00:31:35
Es que le voy a refrescar y tampoco.
00:31:39
Si lo pongo en global, entonces sí, pero si lo pongo en flow, no.
00:31:41
Uy, esto se me agarra. A ver, compárselo en la pantalla, por favor.
00:31:45
A ver si...
00:31:49
A ver, estoy con...
00:31:51
Espera para compartir.
00:32:01
No.
00:32:04
Mira, a la derecha del micrófono, de cuando te muteas el micrófono,
00:32:05
tiene que haber un cuadradito.
00:32:09
No, me pone bandeja de uso compartido.
00:32:11
Eso es, sí.
00:32:14
Ah, vale.
00:32:15
Y abajo tiene que aparecer algo de compartir pantalla.
00:32:16
Vale.
00:32:19
Pues le he dado, no sé si...
00:32:21
Sí, estamos vendo.
00:32:24
¿Se ve?
00:32:25
Sí.
00:32:26
Vale, pues aquí he puesto un true.
00:32:27
O sea, si le das a true, pues sale...
00:32:30
Al poner esto sale true, si le das a false, al poner esto sale false, para comprobar que...
00:32:34
La que funciona, sabemos que está funcionando.
00:32:38
Si me voy aquí a ContextData, yo pincho aquí donde sea, lo voy a refrescar...
00:32:40
Ah, es que...
00:32:46
Me sale...
00:32:47
No, no, no.
00:32:48
Esa es la S.
00:32:49
Ah, donde no es.
00:32:50
Vale, vale, ya está.
00:32:51
Sí.
00:32:52
Espera que la veré.
00:32:53
Eso, sinceramente, el cuadradito, supuestamente, es para que se auto-refresque.
00:32:54
Es el check que pone refresh on selection chain.
00:33:01
Pero a mí, por lo menos, no sé si es la versión que estoy utilizando,
00:33:05
nunca he conseguido que se me auto-refresque.
00:33:09
Entonces tienes que darle tú manualmente a esas flechitas, como si fueran de reciclar,
00:33:12
para ver los distintos valores.
00:33:17
Vale.
00:33:19
Vale, vale.
00:33:20
Es el que lo estaba dando mal.
00:33:21
Vale.
00:33:23
Pues nada, pues eso era la duda.
00:33:24
Eh...
00:33:26
Vale, si lo veo aquí, dejo de compartir, ¿no?
00:33:27
En este.
00:33:29
Vale, sí.
00:33:30
Vale, venga.
00:33:31
Muy bien.
00:33:32
Venga, pues vamos con otro.
00:33:33
Va.
00:33:44
Siguiente.
00:33:45
Este ya es, bueno, un pelín más complicado.
00:33:46
Y nos obliga a utilizar algo de JsonAta.
00:33:49
Pero lo vamos a ver con calma.
00:33:54
Lo que dice es lo siguiente.
00:33:56
Dice, partiendo de un mensaje generado por un nodo inject que contenga la propiedad invoice.
00:33:58
Vale.
00:34:03
Eh...
00:34:04
Vale.
00:34:07
Es decir, vamos a tener que crear un inject que contenga este Json que tenemos aquí expuesto.
00:34:08
Y entonces lo que hay que hacer es que después de pasar por algún nodo, el que consideremos,
00:34:16
se tiene que añadir una nueva propiedad, ¿vale?
00:34:22
Al mismo nivel de invoice, que contenga cuál es el precio total de esta factura.
00:34:25
¿Vale?
00:34:32
Es decir, de alguna manera tenemos que ser capaces de sumar esto, más esto, más esto,
00:34:33
y ponerlo como parte de una propiedad.
00:34:38
Interesante.
00:34:41
Vamos a empezar, si queréis, construyendo el mensaje.
00:34:45
Y luego le damos una vuelta a ver cómo lo podríamos calcular.
00:34:48
Ah, perdón.
00:35:15
Está muteado.
00:35:16
Sí, comentaba que si podéis bajar la mano, la tenéis subida y luego ya la vais subiendo
00:35:17
según terminéis de resolver el ejercicio.
00:35:18
Vale.
00:35:19
Vale.
00:35:20
Vale.
00:35:21
Vale.
00:35:22
Vale.
00:35:23
Vale.
00:35:24
Vale.
00:35:25
Vale.
00:35:26
Vale.
00:35:27
Vale.
00:35:28
Vale.
00:35:29
Vale.
00:35:30
Vale.
00:35:31
Vale.
00:35:32
Vale.
00:35:33
Vale.
00:35:34
Vale.
00:35:35
Vale.
00:35:36
Vale.
00:35:37
Vale.
00:35:38
Vale.
00:35:39
Vale.
00:35:40
Vale.
00:35:41
Vale.
00:35:42
Vale.
00:35:43
Vale.
00:35:44
Vale.
00:35:45
Vale.
00:35:46
Manuel, ¿ya lo tienes?
00:41:14
Vamos a darle unos minutillos más y ahora lo ponemos en común.
00:41:35
¡Gracias por ver el vídeo!
00:41:59
Subtítulos realizados por la comunidad de Amara.org
00:42:29
Subtítulos realizados por la comunidad de Amara.org
00:42:59
Subtítulos realizados por la comunidad de Amara.org
00:43:29
Subtítulos realizados por la comunidad de Amara.org
00:43:59
Subtítulos realizados por la comunidad de Amara.org
00:44:29
Subtítulos realizados por la comunidad de Amara.org
00:44:59
Subtítulos realizados por la comunidad de Amara.org
00:45:29
Subtítulos realizados por la comunidad de Amara.org
00:45:59
Subtítulos realizados por la comunidad de Amara.org
00:46:02
Subtítulos realizados por la comunidad de Amara.org
00:46:29
Subtítulos realizados por la comunidad de Amara.org
00:46:59
Subtítulos realizados por la comunidad de Amara.org
00:47:29
Subtítulos realizados por la comunidad de Amara.org
00:47:59
Subtítulos realizados por la comunidad de Amara.org
00:48:29
Subtítulos realizados por la comunidad de Amara.org
00:48:59
Subtítulos realizados por la comunidad de Amara.org
00:49:29
Subtítulos realizados por la comunidad de Amara.org
00:49:59
Subtítulos realizados por la comunidad de Amara.org
00:50:29
Subtítulos realizados por la comunidad de Amara.org
00:50:59
Subtítulos realizados por la comunidad de Amara.org
00:51:29
¿Puedes subirte el volumen del micrófono porfa? Te escucho muy muy bajito.
00:51:59
Es que no tengo el micrófono. Vamos a ver.
00:52:02
A ver ahora. ¿Me oyes mejor ahora?
00:52:05
Sí, sí, mucho mejor.
00:52:08
En el ejercicio que has hecho antes con la función, ¿cómo harías para que ese valor total fuera otra propiedad del objeto?
00:52:11
Ya es una propiedad del objeto. Fíjate.
00:52:23
El valor total forma parte de... o quieres que forme parte de Invoice.
00:52:26
Claro. Así es como lo he interpretado yo en el enunciado.
00:52:32
Así.
00:52:38
Vale, vamos a comprobarlo.
00:52:43
Despliego. Inyecto.
00:52:46
Y ahora ya solo tengo un objeto dentro de mi mensaje que es Invoice.
00:52:49
Y no aparece. A ver. ¿Por qué no me aparece?
00:52:57
Ah, porque claro. La historia está en que esto es un Array.
00:53:03
Está definido como un Array.
00:53:08
Claro. Esto está definido como un Array de mensajes.
00:53:16
Entonces si quieres que sea una propiedad, no puedes. Puedes hacer que sea un nuevo elemento.
00:53:20
Hay que definirlo al principio en el Injet.
00:53:27
No, no. Lo puedes hacer directamente con código.
00:53:31
Pero no puedes poner aquí el total porque Invoice es un Array.
00:53:34
Entonces podrías decirle que msg.invoice de elemento 3, que sería el siguiente válido.
00:53:38
Que es igual a un objeto.
00:53:56
Vale. Y ese objeto msg.invoice3.total ya se lo podría exponer.
00:54:00
Ahora vamos a comprobar que funcione.
00:54:10
Ejecutamos.
00:54:13
Y ahora el elemento número 3 ya tiene la propiedad que estábamos buscando.
00:54:17
Pero mira, repito cómo lo he hecho.
00:54:24
Básicamente, como Invoice es un Array de objetos, yo no puedo crear directamente una propiedad en ese nivel.
00:54:26
Porque ahí lo que se aceptan son nuevos elementos del Array.
00:54:33
Entonces lo que he hecho ha sido decirle.
00:54:36
Créame un cuarto elemento, que es el de índice 3.
00:54:38
Y ese va a contener un objeto.
00:54:43
Que el objeto está vacío. Hay que crearlo así, de esta manera.
00:54:45
Y luego, como una de las propiedades de ese objeto, voy a añadir el punto total.
00:54:47
Que va a contener este contenido.
00:54:53
A mí, sinceramente, creo que queda más ordenado.
00:54:56
Porque así queda raro que el total esté al mismo nivel que Invoice.
00:54:58
Que es como lo teníamos al principio.
00:55:05
O sea, que te generas un Array vacío de 3 elementos y luego el tercero lo generas.
00:55:10
Es lo que dice eso.
00:55:18
Es la única forma de meter un elemento cero.
00:55:20
Voy a poner las dos soluciones.
00:55:23
Esto luego, como otras veces, lo voy a compartir.
00:55:25
Voy a poner el de arriba, tal y como estaba al principio.
00:55:27
Que sería decir que msg.invoice.total.
00:55:29
Voy a enseñar la diferencia entre las dos.
00:55:36
Esta es la que sugerimos al principio.
00:55:39
Msg.total.
00:55:42
Esta es la primera que hicimos.
00:55:52
Que es que nos llega la propiedad total, la propiedad Invoice, con lo que ya teníamos.
00:55:54
Y esta es la segunda forma de hacerlo.
00:56:00
Que es que si queremos que forme parte de Invoice, hay que añadir un nuevo ítem al Array.
00:56:02
Tenemos aquí este que es un objeto, otro objeto, otro objeto.
00:56:09
Y este lo que tiene es una propiedad con el valor total de la función.
00:56:14
Es que si no, no podemos meter una propiedad directamente dentro de algo que no existe.
00:56:26
Entonces primero hay que decirle que esto va a ser un objeto.
00:56:31
Y luego meterle la propiedad con el contenido que queramos.
00:56:34
Vale. Muchas gracias.
00:56:39
Vale. ¿Alguien lo ha conseguido hacer con bloques?
00:56:43
¿No? ¿Nadie?
00:56:55
Vale. Vamos a tratar de resolverlo con bloques, que quizás también es un poco más fácil.
00:56:57
Bueno, más fácil, sobre todo más que más fácil, nos permite hacer una función sumatoria
00:57:02
en la cual no dependemos de que haya tres variables o tres objetos en la factura,
00:57:07
sino que sí hay siete tras la suma de todos.
00:57:17
Vamos a verlo.
00:57:19
Hacemos un change.
00:57:20
Y ahora le vamos a decir qué queremos.
00:57:24
¿Cómo le hemos llamado antes? Total, ¿no?
00:57:26
Que en total guarde algo.
00:57:29
¿Qué queremos guardar aquí?
00:57:32
Pues un jsonata, una j-expresión.
00:57:33
Entonces recordad que un j-expresión directamente yo podría acceder a diferentes partes del mensaje.
00:57:36
Dejadme un segundo, que esto falle.
00:57:46
Y voy a copiarme esto para poder analizar con calma la expresión.
00:57:48
Voy a decir que para el testeo quiero que utilice este json, que es el que he utilizado.
00:57:59
Entonces, ¿cómo voy probando con diferentes cosas?
00:58:10
Por ejemplo, si yo pongo invoice, a ver, claro.
00:58:13
Entonces, cuando pido por invoice, obtendría toda esta información.
00:58:43
Si nos quedamos, por ejemplo, con...
00:59:10
Queremos coger, por ejemplo, de un primer elemento, por ejemplo, del invoice cero.
00:59:14
Al hacer esto, cogeríamos solo el primer elemento, así solo el segundo.
00:59:20
Así podríamos ir cogiendo el precio.
00:59:26
Y yo podría, mediante el operando suma, o sumatorio, perdón, que vimos el otro día,
00:59:30
podría hacer, por ejemplo, la suma de todos los precios que forman parte de este json.
00:59:38
Entonces, ¿cómo haría eso?
00:59:44
Por ejemplo, si yo cojo y hago $sum del invoice, dejo esto vacío y le digo esto.
00:59:46
¿Veis que me ha generado ya directamente cuál es el total?
00:59:56
Sí, sí, cómo mola.
01:00:01
Es más, esto se abre la posibilidad de que yo, por ejemplo, aquí en el json que hemos generado,
01:00:04
vemos que ha sido bueno, y he puesto que todos los productos se han vendido una unidad de cada uno de ellos.
01:00:12
Pero, ¿y si resulta que yo de este vendo 2 y de este vendo 3?
01:00:18
Esta suma ya nos correcta, ¿verdad?
01:00:26
¿Cómo lo arreglamos?
01:00:29
Pues multiplicando por el quantity, ¿no?
01:00:34
Claro, lo que pasa es que yo lo que quiero es multiplicar, claro, por el quantity, pero de cada una de las propiedades.
01:00:38
Por dentro, ahí pones un por, me imagino, o algo así, o un multi, no sé cómo se llama.
01:00:47
Aquí, esto lo ponemos entre paréntesis, y aquí queremos multiplicar por quantity.
01:00:55
Eso es.
01:01:01
Pero fijaos que esta sintaxis es rara, ¿vale?
01:01:03
Este paréntesis es el que finaliza el somatorio, y esto es, de todos los elementos que forman parte del array,
01:01:07
me multiplicas, de cada uno de ellos, su precio por su cantidad.
01:01:15
A ver, a mí me parece raro porque yo hubiese jugado y yo hubiese puesto algo como invoice otra vez con los corchetes, punto quantity, ¿no?
01:01:21
¿Sabes lo que te digo?
01:01:28
Sí, sí, pero en ese caso no estoy seguro que habría hecho.
01:01:30
Quizá...
01:01:35
Es que así parece que está como, ese quantity está como ahí sin su base, ¿no? Sin la referencia donde está.
01:01:37
Sí, porque al estar dentro de los paréntesis hace referencia a lo mismo que hay fuera, por así decirlo.
01:01:43
Ah, qué chulo pues, mira.
01:01:50
Esto es muy cómodo.
01:01:52
Pero si lo vieras como te he dicho yo, ¿no funcionaría también?
01:01:53
Pues vamos a probarlo.
01:01:56
¡Oh!
01:02:00
Bueno, me parece que lo borrarás todo, ¿no? Poner otra vez el invoice.
01:02:02
Sí, sí, lo tengo marcanado por ahí.
01:02:06
Entonces podríamos, tú lo que decías es, súmame del invoice el precio.
01:02:08
Bueno, perdón, del invoice.
01:02:15
De todos, del price.
01:02:17
Del price.
01:02:19
Y me lo multiplica.
01:02:21
Claro, es que fíjate, esto ya me está haciendo un 54x01.
01:02:22
Si lo multiplico por el sumatorio.
01:02:28
No, pero yo decía dentro, dentro del mismo paréntesis, no puedes decirle por...
01:02:31
Por ahí dentro, por, y ahí poner el invoice.quantity.
01:02:35
Eso, el invoice.
01:02:40
Eso es lo que yo decía, no sé si funcionará, pero eso es lo que yo decía.
01:02:42
No, no, porque no es capaz de iterar sobre...
01:02:45
O sea, ya está iterando.
01:02:48
Aquí esto, en realidad, esto ya es una iteración.
01:02:49
Vale.
01:02:53
Es para cada uno de los elementos.
01:02:54
Y esto sería otra iteración, con lo cual estaría multiplicando el primer precio por el primer valor.
01:02:55
Luego por el segundo, luego por el tercero.
01:02:59
¿Y si le quitas los corchetes tampoco?
01:03:01
No, porque tendrías que decirle como, del invoice de este, ¿no?
01:03:06
En concreto, de esta primera iteración.
01:03:09
Ya, ya, ya, vale, pues nada.
01:03:11
Vale, entonces es de este mismo, de cada uno de los valores sobre los que se ha iterado, quiero su precio.
01:03:13
Sí, pero es súper potente esta...
01:03:22
Por su cantidad.
01:03:24
Es súper potente.
01:03:26
Permite hacer cosas, fijaos, esto se ha resuelto con esto que son 40 caracteres.
01:03:30
Sí.
01:03:34
¿Cuánto costaría hacer esto en una función?
01:03:35
Sí, sí, sí.
01:03:38
Un for dentro de otro for.
01:03:41
Bueno, a lo mejor no haría falta, a ver...
01:03:43
No haría falta un segundo for.
01:03:46
Pero un for mínimo no lo quita nadie.
01:03:48
Ay, qué estraso.
01:03:53
Declarar la variable, guardarla para ir poniéndolo, sí, sí, es una maravilla.
01:03:55
Sí, por eso digo, el JSONATA merece la pena que le echéis un vistazo a la documentación que trae.
01:04:01
Porque son un montón de pijadillas que, sabiendo dónde utilizarlas, nos ahorran un montonazo de tiempo.
01:04:08
Vale, pues vamos a comprobar que esto funciona.
01:04:18
O sea, con este, habéis visto lo cómodo que es venir aquí, establecer el ejemplo y comprobar cómo queda.
01:04:20
Vale, pero ahora ya la prueba de fuego.
01:04:29
Es generar esto.
01:04:32
Despegamos.
01:04:34
Ejecutamos.
01:04:37
Y aquí comprobamos que tenemos otra vez el mismo resultado que arriba.
01:04:38
Que es el invoice con todos los elementos que teníamos.
01:04:42
Y aquí tenemos el total.
01:04:45
Lo único que yo ahora, si aquí decido, por ejemplo, cambiar que es de este componente o de este...
01:04:47
Lo que sea, que sea vendido, son dos.
01:04:55
Vale.
01:04:58
Automáticamente esto ya me actualiza el precio porque ha iterado de cada elemento por el número de ítems que se han vendido.
01:05:00
Vale, bien hasta aquí.
01:05:16
Entonces, voy a poner el ejercicio 2.
01:05:17
Esto va a ser con funciones.
01:05:21
Esto lo vas a dejar en el aula habitual, ¿verdad?
01:05:24
Sí, sí, sí. Esto lo subo cuando acabe la clase.
01:05:26
Y esto es con change más JSON alta.
01:05:28
Vale.
01:05:40
Este no, este no.
01:05:43
Vale.
01:05:48
Pero en funciones no hemos metido la opción de multiplicar, ¿no?
01:05:50
Por el número de unidades.
01:05:55
No hemos metido la opción de multiplicar.
01:05:57
Venga, os lo dejo a vosotros. Vamos a añadir un ejercicio extra.
01:06:00
Vamos a dar 2-3 minutillos para que modifiquéis la función de forma que se pueda hacer multiplicando.
01:06:05
O sea, que se pueda establecer diferentes números de ítems para cada una de las facturas.
01:06:13
Una buena práctica.
01:06:20
Lo que no vamos a hacer, porque se complicaría más, es recorrer el array.
01:06:24
Porque si hubiera varios elementos del array, pues ya no nos valdría.
01:06:31
Este sí.
01:06:34
Este sí. Yo aquí en este JSON cojo, modifico y creo otro elemento nuevo.
01:06:35
Este va a valer 100, por ejemplo, para que se vea en el cálculo.
01:06:43
Y esto lo vuelvo a poner a 1.
01:06:47
Esto va a ser el elemento...
01:06:50
Este automáticamente aquí ya me saca los 154,01 porque he metido un nuevo elemento que vale 100.
01:07:02
Pero sí, me parece bien.
01:07:10
Modifiquemos la función para que sea capaz de calcular cuál es el total, teniendo en cuenta que puede haber diferentes cantidades.
01:07:12
Gracias por ver el video.
01:07:40
Subtítulos realizados por la comunidad de Amara.org
01:08:10
Subtítulos realizados por la comunidad de Amara.org
01:08:40
María tampoco te oye.
01:09:10
Sí, perdón, que me había muteado.
01:09:13
Perdona, Carlos, te he entendido muy bajito. Sé que me has pedido algo, pero no sé exactamente qué es lo que me has pedido.
01:09:15
Sí, sí, perdón. A ver si puedes mostrar la función que has hecho, pero antes de modificarla, que es lo que estás pidiendo ahora.
01:09:20
Ah, sí. Y a partir de ahí ya puedo modificar algo.
01:09:32
Gracias.
01:09:36
Estupendo.
01:09:37
Subtítulos realizados por la comunidad de Amara.org
01:09:40
Subtítulos realizados por la comunidad de Amara.org
01:10:10
Subtítulos realizados por la comunidad de Amara.org
01:10:40
Subtítulos realizados por la comunidad de Amara.org
01:11:10
Subtítulos realizados por la comunidad de Amara.org
01:11:40
Subtítulos realizados por la comunidad de Amara.org
01:12:10
Subtítulos realizados por la comunidad de Amara.org
01:12:40
Subtítulos realizados por la comunidad de Amara.org
01:13:10
Subtítulos realizados por la comunidad de Amara.org
01:13:40
Subtítulos realizados por la comunidad de Amara.org
01:14:10
Subtítulos realizados por la comunidad de Amara.org
01:14:40
Subtítulos realizados por la comunidad de Amara.org
01:15:10
Subtítulos realizados por la comunidad de Amara.org
01:15:40
Subtítulos realizados por la comunidad de Amara.org
01:16:10
Subtítulos realizados por la comunidad de Amara.org
01:16:40
Subtítulos realizados por la comunidad de Amara.org
01:17:10
Subtítulos realizados por la comunidad de Amara.org
01:17:40
Subtítulos realizados por la comunidad de Amara.org
01:18:10
Subtítulos realizados por la comunidad de Amara.org
01:18:40
Subtítulos realizados por la comunidad de Amara.org
01:19:10
Subtítulos realizados por la comunidad de Amara.org
01:19:40
Subtítulos realizados por la comunidad de Amara.org
01:20:10
Subtítulos realizados por la comunidad de Amara.org
01:20:40
Subtítulos realizados por la comunidad de Amara.org
01:21:10
Subtítulos realizados por la comunidad de Amara.org
01:21:40
Subtítulos realizados por la comunidad de Amara.org
01:22:10
Subtítulos realizados por la comunidad de Amara.org
01:22:40
Subtítulos realizados por la comunidad de Amara.org
01:23:10
Subtítulos realizados por la comunidad de Amara.org
01:23:40
Subtítulos realizados por la comunidad de Amara.org
01:24:10
Subtítulos realizados por la comunidad de Amara.org
01:24:40
Subtítulos realizados por la comunidad de Amara.org
01:25:10
Subtítulos realizados por la comunidad de Amara.org
01:25:40
Subtítulos realizados por la comunidad de Amara.org
01:26:10
Subtítulos realizados por la comunidad de Amara.org
01:26:40
Subtítulos realizados por la comunidad de Amara.org
01:27:10
Subtítulos realizados por la comunidad de Amara.org
01:27:40
Subtítulos realizados por la comunidad de Amara.org
01:28:10
Subtítulos realizados por la comunidad de Amara.org
01:28:40
Subtítulos realizados por la comunidad de Amara.org
01:29:10
Subtítulos realizados por la comunidad de Amara.org
01:29:40
Subtítulos realizados por la comunidad de Amara.org
01:30:10
Subtítulos realizados por la comunidad de Amara.org
01:30:40
Subtítulos realizados por la comunidad de Amara.org
01:31:10
Subtítulos realizados por la comunidad de Amara.org
01:31:40
Subtítulos realizados por la comunidad de Amara.org
01:32:10
Subtítulos realizados por la comunidad de Amara.org
01:32:40
Subtítulos realizados por la comunidad de Amara.org
01:33:10
Subtítulos realizados por la comunidad de Amara.org
01:33:40
Subtítulos realizados por la comunidad de Amara.org
01:34:10
Subtítulos realizados por la comunidad de Amara.org
01:34:40
Subtítulos realizados por la comunidad de Amara.org
01:35:10
Subtítulos realizados por la comunidad de Amara.org
01:35:40
Subtítulos realizados por la comunidad de Amara.org
01:36:10
Subtítulos realizados por la comunidad de Amara.org
01:36:40
Subtítulos realizados por la comunidad de Amara.org
01:37:10
Subtítulos realizados por la comunidad de Amara.org
01:37:40
Subtítulos realizados por la comunidad de Amara.org
01:38:10
Subtítulos realizados por la comunidad de Amara.org
01:38:40
Subtítulos realizados por la comunidad de Amara.org
01:39:10
Subtítulos realizados por la comunidad de Amara.org
01:39:40
Subtítulos realizados por la comunidad de Amara.org
01:39:43
Subtítulos realizados por la comunidad de Amara.org
01:39:46
Subtítulos realizados por la comunidad de Amara.org
01:39:49
Subtítulos realizados por la comunidad de Amara.org
01:39:52
Subtítulos realizados por la comunidad de Amara.org
01:39:55
Subtítulos realizados por la comunidad de Amara.org
01:39:58
Subtítulos realizados por la comunidad de Amara.org
01:40:01
Subtítulos realizados por la comunidad de Amara.org
01:40:04
Subtítulos realizados por la comunidad de Amara.org
01:40:07
Subtítulos realizados por la comunidad de Amara.org
01:40:10
Subtítulos realizados por la comunidad de Amara.org
01:40:13
Subtítulos realizados por la comunidad de Amara.org
01:40:16
Subtítulos realizados por la comunidad de Amara.org
01:40:19
Subtítulos realizados por la comunidad de Amara.org
01:40:22
Subtítulos realizados por la comunidad de Amara.org
01:40:25
Subtítulos realizados por la comunidad de Amara.org
01:40:28
Subtítulos realizados por la comunidad de Amara.org
01:40:31
Subtítulos realizados por la comunidad de Amara.org
01:40:34
Subtítulos realizados por la comunidad de Amara.org
01:41:04
Subtítulos realizados por la comunidad de Amara.org
01:41:34
Subtítulos realizados por la comunidad de Amara.org
01:42:04
Subtítulos realizados por la comunidad de Amara.org
01:42:34
Subtítulos realizados por la comunidad de Amara.org
01:43:04
Subtítulos realizados por la comunidad de Amara.org
01:43:34
Subtítulos realizados por la comunidad de Amara.org
01:44:04
Subtítulos realizados por la comunidad de Amara.org
01:44:34
Subtítulos realizados por la comunidad de Amara.org
01:45:04
Subtítulos realizados por la comunidad de Amara.org
01:45:34
Subtítulos realizados por la comunidad de Amara.org
01:46:04
Subtítulos realizados por la comunidad de Amara.org
01:46:34
Subtítulos realizados por la comunidad de Amara.org
01:47:04
Subtítulos realizados por la comunidad de Amara.org
01:47:34
Subtítulos realizados por la comunidad de Amara.org
01:48:04
Subtítulos realizados por la comunidad de Amara.org
01:48:34
Subtítulos realizados por la comunidad de Amara.org
01:49:04
Subtítulos realizados por la comunidad de Amara.org
01:49:34
Subtítulos realizados por la comunidad de Amara.org
01:50:04
Subtítulos realizados por la comunidad de Amara.org
01:50:34
Subtítulos realizados por la comunidad de Amara.org
01:51:04
Subtítulos realizados por la comunidad de Amara.org
01:51:34
Subtítulos realizados por la comunidad de Amara.org
01:52:04
Subtítulos realizados por la comunidad de Amara.org
01:52:34
Subtítulos realizados por la comunidad de Amara.org
01:53:04
Subtítulos realizados por la comunidad de Amara.org
01:53:34
Subtítulos realizados por la comunidad de Amara.org
01:54:04
Subtítulos realizados por la comunidad de Amara.org
01:54:34
Subtítulos realizados por la comunidad de Amara.org
01:55:04
Subtítulos realizados por la comunidad de Amara.org
01:55:34
Subtítulos realizados por la comunidad de Amara.org
01:56:04
No es el último ejercicio, pero yo creo que sí que con este nos vamos a tirar un buen rato.
01:56:35
Bueno, os cuento. Este es un problema típico que nos vamos a enfrentar a él en cuanto empezamos a jugar con cosas de IoT.
01:56:39
Sucede... Bueno, primero quiero hacer una pequeña encuesta manozada. ¿Podéis dejar la mano, Pilar y Juan Manuel, por favor?
01:56:53
Vale. Entonces quería preguntaros, de los que estáis aquí, ¿cuántos os habéis pegado con APIs de acceso a información de IoT, a cosas en la nube?
01:57:02
Además, ¿cuántos habéis hecho alguna interacción con algún API que vaya con interfaz REST, que vaya con un JSON?
01:57:15
Vale, Julio. ¿Y alguien más? Vale. Bueno, pues los demás a lo mejor no entendéis muy bien para qué viene todo esto, pero os aseguro que es una cosa que tarde o temprano os vais a enfrentar a ello.
01:57:24
Y es lo siguiente. Muchas veces supongamos que tenemos en nuestra casa como diferentes cacharros, incluso, que hemos enseñado a nosotros diferentes dispositivos, un SP32, que hace una tarea, que publica su información, por ejemplo, con un JSON, mandándolo por MQTT, que es lo que vamos a hacer el miércoles.
01:57:47
Y resulta que, para una versión superior del SP32, que ahora tiene más sensores o tiene más información, o decidimos colocarla de otra manera, manda esa información de otra manera diferente.
01:58:07
Esto lo podemos hacer nosotros, o bien encontrarnos con que el fabricante ha decidido cambiar el formato de sus mensajes porque le parecía mejor de otra manera.
01:58:18
De forma que nos encontramos con dispositivos antiguos que mandan la información de una manera, dispositivos nuevos que la mandan de otra.
01:58:26
Entonces, esto lo que nos va a ocasionar es que si queremos ser capaces de leer tanto los mensajes que mandaban los dispositivos antiguos como los que mandan los nuevos, tendremos que ser capaces de aunarlos, de hacer que ambos formatos coincidan.
01:58:34
Entonces, eso es lo que os propongo en el siguiente ejercicio.
01:58:50
Lo que tenemos es esto. Tenemos una serie de dispositivos que mandan su información. En este caso es un timbre inalámbrico.
01:58:56
Y esta es la información que manda el timbre inalámbrico.
01:59:09
Esta es la información que manda el timbre inalámbrico. Indica cuál es la red en la que está conectada, cuál es la calidad de la conexión, la potencia, cuál es su gateway, cuál es el identificador de su propia MAC, qué modelo, qué formato es el que está utilizando para mandar esta información.
01:59:18
Y luego, como parte de data, aquí manda otro objeto que dice qué es lo que se está enviando, en este caso un ding dong, que sería como el me han presionado la tecla. Indica si el checksum está correcto o no y la longitud del mensaje, que sería ding dong.
01:59:36
Y luego, aparte, tenemos que es de tipo doorbell y que tiene habilitadas las flags 5C. Estas están inventadas, no significan nada, pero podrían significar, yo que sé, el estado de la batería o lo que sea.
01:59:54
Entonces, esta es la información que manda un determinado timbre inalámbrico. Sin embargo, nos encontramos con que hemos comprado otro timbre inalámbrico de la misma fábrica, del mismo fabricante, perdón.
02:00:09
Pero ahora han decidido reordenar de una forma un poco más sensata esa información y ahora nos encontramos con que está ordenada así. Tenemos, por un lado, modelo, dispositivo, formato.
02:00:23
Y luego, dentro de conectividad, tenemos todo lo que tiene que ver con conectividad agrupado. El payload está por otro lado y el metadata a partir de información alternativa o que no es tan relevante como el anterior.
02:00:35
Entonces, el objetivo de esta práctica es conseguir, primero, generar con dos inyects un mensaje del tipo 1 y un mensaje del tipo 2. Y luego, de alguna manera, tenéis que ser capaces de determinar...
02:00:47
Bueno, lo que vamos a hacer es pasar los mensajes de tipo 2, van a pasar íntegros, van a aparecer directamente en el puerto de dibujo. Pero los que sean de versión 1 tenemos que realizar mediante nodos de change, los que consideremos, o diferentes reglas dentro de un nodo de change, para que se cambien y que correspondan con los mensajes del tipo 2.
02:01:07
Es decir, hagamos el índice que hagamos, al final, en el nodo de decoración, tiene que aparecer el mismo formato moderno de estos mensajes.
02:01:31
No sé si me explico. Es decir, mediante todas las operaciones que vimos el otro día del nodo change, ir cambiando y añadiendo campos, creando otras cosas nuevas, etc.
02:01:41
El que quiera hacerlo con un nodo función, también puede hacerlo.
02:01:55
Vale, pues nada, adelante. Este nos va a llevar un ratito.
02:02:03
¿Dudas al respecto?
02:02:09
Pues, adelante.
02:02:13
Jorge, el JSON que sale ahí no va dentro de payload, sino que payload es una propiedad más.
02:02:25
Sí, eso es.
02:02:37
Bueno, en ambos casos. Primero no tiene payload. Digamos que tendría estas propiedades. Y en el de versión 2 sí que tendría un payload.
02:02:39
El resto son también propiedades de MSG. O sea, todo sería MSG.model, MSG.device, MSG.payload.
02:02:57
¿Hay que poner las propiedades una a una a mano? ¿No hay manera de meter un JSON directamente en el mensaje ninja?
02:03:09
Sí.
02:03:21
Un copia-pega, ¿no?
02:03:23
Sí, lo copias de ahí.
02:03:25
Pero lo tengo que copiar dentro de una propiedad de payload, topic o lo que sea.
02:03:27
Ah, espérate.
02:03:34
O sea, aquí cuando añado algo no me da la opción de...
02:03:39
No se puede dejar vacío.
02:03:44
Eso, no se puede dejar vacío.
02:03:46
Sí. En este caso, si te quieres ahorrar tener que crear estas propiedades una a una, lo que puedes hacer es, con un bloque de función, generar el mensaje.
02:03:48
Y ese bloque de función es triggereado mediante un ninja que le mande un timestamp o lo que sea.
02:04:00
Ah, vale, vale.
02:04:07
Pero entonces, ¿no lo ponemos dentro del payload a todo este JSON?
02:04:11
No, no, no. Esto va a pelo. Es decir, MSG.network es todo esto. MSG.rssi es todo esto.
02:04:17
O sea, la forma de hacerlo, si queremos hacerlo de forma gráfica...
02:04:25
A ver, esperad, que encuentro mi node de red.
02:04:29
La forma que tenemos que hacerlo es...
02:04:33
Bueno, por cierto...
02:04:36
Un segundito, que si no luego esto se me va a olvidar.
02:04:38
Este es el FTPio3.
02:04:40
Y este que estamos haciendo es el 5.
02:04:44
Es el 4.
02:04:47
Si lo quiero hacer de forma gráfica, no tengo más remedio que venir aquí, eliminar estos que no me encajan.
02:04:50
Y aquí ir añadiendo uno a uno.
02:04:56
Por ejemplo, network.msg.network.
02:04:58
Este sería el pv1.
02:05:02
Es igual a...
02:05:04
MSG.rssi igual a 42 numérico.
02:05:06
Y así con todos los demás campos.
02:05:13
¿Vale?
02:05:16
Entonces, si yo quiero hacer esto de forma gráfica, no tengo más remedio que venir aquí, eliminar estos que no me encajan.
02:05:17
Y aquí ir añadiendo uno a uno.
02:05:23
Por ejemplo, network.msg.network.
02:05:25
Este sería el pv1.
02:05:28
Es igual a...
02:05:30
Pues todo esto.
02:05:32
Con todos los demás campos.
02:05:34
De forma que, a la hora de pintarlo...
02:05:36
Aparecería así.
02:05:45
Es decir, el network, el rssi y el resto de los elementos al mismo nivel que msg.id.
02:05:47
No habría payload.
02:05:52
¿Vale?
02:05:54
La otra opción para el que no le apetezca hacer esto, que entiendo que es un poco tostón.
02:05:55
Pues nos venimos aquí, creamos un modo de función.
02:06:00
A ese modo de función le iniciamos con un timestamp que puede ser directamente un nada.
02:06:03
Mandar una cosa vacía.
02:06:15
Y entonces aquí directamente creamos el mensaje.
02:06:17
Y nuestro msg puede ser igual a...
02:06:20
¿A qué?
02:06:24
Pues a todo esto.
02:06:25
Cuidado al copiar, porque nos copiará también lo de sin dormir junto a la información.
02:06:28
¿Y si esto está bien?
02:06:46
Inyecto...
02:06:48
No, no le gusta.
02:06:49
Me lo he metido de la pata.
02:06:53
Tiene una llave al final.
02:06:57
Ah, correcto.
02:07:01
Vale, vale, me la he cargado.
02:07:02
Y la llave de data es hasta length.
02:07:04
No, tampoco le gusta.
02:07:15
Hay algo más.
02:07:16
Dice que en la línea 14 hay algo que no le gusta.
02:07:18
Ah, correcto.
02:07:21
Ahora sí.
02:07:27
Entonces ahora cuando inyecto esto...
02:07:28
Ahora ya sí que obtengo todo el elemento que quería.
02:07:30
Y esto me ahorra tener que ir haciendo uno a uno todos los elementos en un inyecto.
02:07:34
Así que como queráis.
02:07:41
Yo evidentemente os recomiendo...
02:07:43
O yo haría esta segunda forma.
02:07:45
Porque acabamos mucho antes.
02:07:53
¿Vale?
02:07:57
Ah.
02:08:28
Ah.
02:08:41
Perdona, Jorge.
02:08:58
¿Puedes volver a representar la función que has hecho?
02:08:59
Gracias.
02:09:02
Sí, claro.
02:09:03
Esto.
02:09:07
Esta, ¿no?
02:09:08
Gracias.
02:09:13
No sé si tengo activado...
02:09:15
Ah, vale.
02:09:19
Ah, vale.
02:09:20
Ah, vale.
02:09:21
Ah, vale.
02:09:22
Ah, vale.
02:09:23
No sé si tengo activado...
02:09:24
Sí, sí, tengo activado el micro.
02:09:28
Vale.
02:09:29
Gracias.
02:10:24
Gracias.
02:10:25
Gracias.
02:10:54
Gracias.
02:11:24
Buenas tardes, señoras y señores.
02:11:54
Buenas tardes, señoras y señores.
02:12:18
Si no sabéis por dónde cogerlo, yo empezaría con la decisión de ¿tengo que modificar
02:12:47
el JSON o ya es versión V2?
02:13:08
A partir de ahí ya empezamos a crear algo del flujo, que veamos algo en la salida,
02:13:10
en un mensaje de dibujo.
02:13:17
¿Puedo quitar ya esta pantalla si os veo las caras?
02:13:19
Jorge, ¿has sugerido que lo hagamos con una función o con un change?
02:13:52
Yo creo que es más fácil hacerlo con un change, que da un bloque bastante gordo,
02:14:19
pero es menos lioso, me parece a mí.
02:14:26
Bueno, gracias.
02:14:28
Muchas gracias.
02:14:29
Muchas gracias.
02:14:59
Muchas gracias.
02:15:15
Muchas gracias.
02:15:35
Bueno, en realidad, pensándolo bien, a mí yo creo que me resultaría más fácil hacerlo
02:15:59
con un bloque función que con un nodo change, pero bueno, en principio es más fácil haciendo
02:16:26
arrastrando cositas y haciéndolo de forma gráfica.
02:16:36
Bueno, muchas gracias.
02:18:06
Muchas gracias.
02:18:32
Muchas gracias.
02:19:02
Muchas gracias.
02:19:32
Muchas gracias.
02:20:02
Muchas gracias.
02:20:32
Muchas gracias.
02:21:02
Muchas gracias.
02:21:32
Muchas gracias.
02:22:02
Muchas gracias.
02:22:32
No se te oye, Jorge.
02:23:02
Vale, pues entonces tampoco habéis escuchado mi pregunta.
02:23:27
Sí, preguntaba que si todo el mundo ha conseguido ya solucionar la parte de diferenciar entre
02:23:31
los mensajes que forman parte de la versión 1 del JSON y los que son de J2.
02:23:39
¿Todavía no?
02:23:47
Vale.
02:23:49
Si os parece, corregimos, hacemos esa pequeña entrega parcial, por así decirlo, para diferenciar
02:23:50
entre unos mensajes y otros y a partir de ahí nos será más fácil decidir sobre qué
02:23:55
mensajes aplicamos este cambio para conseguir que ambos estén en formato V2.
02:24:00
Vale, entonces, como decía, que no tenía el micro abierto, aquí tenía, por cierto,
02:24:06
gracias, Marcos, aquí tenía el mensaje formateado con la versión 1 y aquí tenía el mensaje
02:24:14
formateado con la versión 2, que es mucho más rápido que hacerlo con los injects añadiendo
02:24:22
todas estas propiedades.
02:24:26
Entonces, ¿de qué forma puedo hacer yo?
02:24:28
O sea, yo lo primero que tengo que hacer, si quiero convertir todos los mensajes en
02:24:30
versión 2, lo primero que tengo que hacer es, evidentemente, determinar cuáles son
02:24:34
los que son de versión 1 y de versión 2.
02:24:40
Entonces, ¿qué estructura que conocemos nos permite consultar o dividir el flujo en
02:24:43
dos caminos?
02:24:49
Switch.
02:24:52
Correcto.
02:24:53
Pues yo metería aquí un switch y voy a meter ambos mensajes, tanto los que son de versión
02:24:55
1 o de versión 2, a un switch.
02:25:00
¿Por qué hacemos esto?
02:25:02
Bueno, porque estamos simulando como que a nosotros nos va a llegar, por ejemplo,
02:25:04
mensajes por MQTT y nos llegarán desde un único flujo.
02:25:08
Nos llegarán desde una única fuente.
02:25:11
Entonces, a mí me llegan los mensajes desde una única fuente.
02:25:15
Yo tengo que ser capaz de determinar cuáles hay que modificar para convertir a la otra
02:25:17
versión y cuáles tienen que pasar directos.
02:25:22
Entonces, ¿qué pregunta podemos hacer aquí para determinar si, o sea, aquí vamos a sacar
02:25:25
dos caminos.
02:25:32
El camino de arriba, que será el que sea el que pase directo, por así decirlo, y el
02:25:33
camino de abajo, que es el que serán los mensajes de versión 1, que son los que tendremos
02:25:37
que modificar, adaptar, para que encajen con el formato de la versión 2.
02:25:41
Entonces, ¿qué podemos evaluar?
02:25:46
¿Alguien lo tiene rejoto ya esta parte?
02:25:49
Sí.
02:25:55
¿Qué pregunta podríamos hacernos?
02:25:57
En el switch, si el msg.format es igual a v1 o a v2.
02:26:00
Fijaos, yo aquí tengo todavía el debug de la vez anterior que imprimí con algo, y entonces
02:26:06
yo puedo coger este path, puedo coger esta ruta, y aquí directamente puedo preguntarme
02:26:12
que si msg.format es que.
02:26:19
Pues aquí es algo textual.
02:26:23
Puedo preguntar que si es v2.
02:26:27
Si es v2, que vaya directo.
02:26:30
En cualquier otro caso, que vaya por el camino de abajo.
02:26:35
Y vamos a comprobar si esto funciona.
02:26:39
Vale, inyectamos un par de msg.v1, un par de msg.v2, y ahora al pasar por encima de ellos
02:26:47
me tiene que decir cuál es el nodo de debug que ha generado el dicho msg.
02:26:53
Estos dos han salido por abajo, y estos dos han salido por arriba.
02:26:59
De forma que los que salen por arriba son formato versión 2, y los que salen por abajo
02:27:05
son los que no son formato versión 2.
02:27:13
Aquí, en realidad para hacerlo bien del todo, pues podríamos hacer esto, y luego aquí
02:27:16
el otherwise, que sería nuestro else.
02:27:24
De forma que, esperad, vamos a hacerlo al revés, vamos a ordenar.
02:27:27
Los de 1 saldrán por arriba, los 2 salen por abajo, y los que no son ni 1 ni 2
02:27:30
los sacamos a un msg de error, que por lo tanto vamos a dejar vacío.
02:27:36
Ahora ya, dentro de los que son v1 tendremos que hacer ciertas modificaciones
02:27:43
para que nuestro mensaje salga.
02:27:55
Es más, una vez terminadas esas modificaciones podremos tener un solo bloque de salida
02:27:57
que será el msg, que simularía el nodo que almacena esa información en la base de datos
02:28:02
o el que la procesa, o el que evalúa, lo que sea.
02:28:07
¿Bien con esta primera parte del ejercicio?
02:28:12
Pues a partir de aquí ya es cuestión de ir viendo qué formato tiene la versión 1,
02:28:21
qué formato tiene la versión 2, y con las distintas opciones que nos permitía el nodo change
02:28:28
ir cambiando cosas.
02:28:34
Jorge, el orden dentro del JSON da igual, ¿no?
02:28:43
Nos da igual, sí. De hecho, hay una de las propiedades que va a ser complicado mantener su orden.
02:28:50
Entonces, como lo que importa es qué está dentro de qué y qué contiene cada propiedad,
02:28:56
nos da igual efectivamente el orden.
02:29:02
Vale, vale. En principio el JSON, el orden daría igual.
02:29:05
Totalmente igual, sí.
02:29:09
Vale, gracias.
02:29:11
Jorge.
02:29:14
Mira, trabajando con el flujo función, he movido propiedades de entrada de la versión 1
02:29:16
a donde tienen que estar localizadas en la versión 2,
02:29:24
y luego después he hecho un delete de la entrada de la versión 1.
02:29:27
¿Se pueden hacer las dos cosas de una tacada?
02:29:32
¿Con función o con change?
02:29:37
¿Con función? Sí, con change. También he hecho alguna prueba y he visto que está la opción move,
02:29:39
pero claro, con función creo que no existe, no sé, confírmamelo.
02:29:44
Y lo he tenido que hacer en dos pasos.
02:29:49
A ver, enséñame tu código y te digo si se puede...
02:29:53
hasta donde yo sé simplificar.
02:29:59
No sé si lo ves.
02:30:05
No, todavía no está compartido.
02:30:06
Espera, a ver.
02:30:08
¿Me ves ahora?
02:30:24
Está en ello. Vale, perfecto.
02:30:26
Pues mira, aquí tengo...
02:30:30
Bueno, todavía no he metido la opción esta, entonces lo he hecho así.
02:30:32
Espera, se ha quedado...
02:30:36
He creado pues...
02:30:39
Es que no veo nada. Me estoy viendo bebiendo agua todavía.
02:30:41
¿Los demás cómo lo veis? ¿Veis el flujo o estáis viendo...
02:30:52
No, no se ve. Se ve bebiendo agua.
02:30:57
Estoy bebiendo agua, ¿no?
02:31:00
Se ha quedado colgado.
02:31:01
Sí, te vas a enterar de agua.
02:31:03
¿Dejo de compartir y comparto de nuevo?
02:31:07
Sí, por favor.
02:31:09
Ahora. Vale.
02:31:24
Pues mira, este es el código que tengo en la función.
02:31:27
Entonces, por ejemplo, he creado aquí el objeto vacío connectivity.
02:31:30
He movido una de las propiedades de entrada.
02:31:34
Bueno, lo he hecho dentro del payload.
02:31:36
Lo he metido en...
02:31:39
Según tiene que estar colocado en versión 2
02:31:40
y luego esta propiedad que me venía de entrada
02:31:42
la he borrado con delete.
02:31:44
Entonces, mi pregunta era si estas dos instrucciones
02:31:46
se pueden unificar en una, quizás, o hay que hacerlo así.
02:31:49
Como, por ejemplo, con el nodo change que te permite la opción move
02:31:53
y ya directamente, claro, te borra el origen
02:31:57
y te lo deja guardado en el destino.
02:31:59
Que yo sepa, no se puede hacer...
02:32:03
No hay un move.
02:32:11
Lo que sí, quizás yo lo resolvería
02:32:12
en caso de hacerlo programáticamente con Javascript.
02:32:15
Quizás yo lo que haría es crearme un msg2, por así decirlo.
02:32:19
Y en ese msg2 ir copiando y moviendo
02:32:24
cosas del msg original.
02:32:27
Y luego hacerlo con el tool del msg2, ¿no?
02:32:29
Exactamente.
02:32:31
Y entonces, te evitas tener que borrar cosas del msg1.
02:32:32
Simplemente coges las que necesites y devuelves el msg2.
02:32:35
Bien, bien. Sí, sí. Entendido.
02:32:39
Vale, pues lo pruebo así este ratito.
02:32:41
Vale, gracias.
02:32:43
Vale, gracias.
02:32:46
Vale, pues libero ya la pantalla.
02:32:47
Vale.
02:32:57
Justo iba a silenciar yo. Supongo que ha sido Juanra.
02:33:15
Sí, he sido yo.
02:33:18
Vale.
02:33:20
Vale.
02:33:27
Vale.
02:33:57
Subtítulos por la comunidad de Amara.org
02:34:27
Subtítulos por la comunidad de Amara.org
02:34:57
Subtítulos por la comunidad de Amara.org
02:35:27
Subtítulos por la comunidad de Amara.org
02:35:57
Subtítulos por la comunidad de Amara.org
02:36:27
Subtítulos por la comunidad de Amara.org
02:36:57
Subtítulos por la comunidad de Amara.org
02:37:28
Si os vais encontrando con dificultades, podéis ir preguntando.
02:37:48
Prefiero eso a que os quedéis ahí bloqueados sin hacer avances.
02:37:53
Yo ahora estoy ocioso totalmente.
02:38:00
Subtítulos por la comunidad de Amara.org
02:38:22
Subtítulos por la comunidad de Amara.org
02:38:52
Subtítulos por la comunidad de Amara.org
02:39:22
Subtítulos por la comunidad de Amara.org
02:39:52
Subtítulos por la comunidad de Amara.org
02:40:22
Subtítulos por la comunidad de Amara.org
02:40:52
Subtítulos por la comunidad de Amara.org
02:41:22
Subtítulos por la comunidad de Amara.org
02:41:52
Subtítulos por la comunidad de Amara.org
02:42:22
¿Quién me quiere echar una mano?
02:42:53
¿Hay alguien que tenga migradas ciertas propiedades de una versión a otra?
02:42:56
¿Que nos quiera ayudar?
02:43:01
Vamos a empezar.
02:43:14
Voy a generar primero un mensaje de JSON-V1.
02:43:16
Y así lo tengo de referencia.
02:43:23
Y voy a generar otro de JSON-V2.
02:43:25
Y así tengo también la información.
02:43:28
¿Cómo podemos empezar?
02:43:31
He cogido directamente un nodo Change.
02:43:37
Y por defecto lo que me parece es que establezca algo en Payload.
02:43:41
Esto lo vamos a dejar para un poquito más adelante.
02:43:47
Porque sí que es verdad que Payload aparece aquí como Ding Dong.
02:43:49
Lo podemos hacer ahora.
02:43:55
¿Esta es la versión 2 o es la 1?
02:44:02
Vamos a presentarle cómo lo tenía refuerzado.
02:44:06
Lo primero que vemos es que los mensajes de versión 2
02:44:08
tienen un objeto.
02:44:13
Tienen el connectivity que no estaba creado.
02:44:17
Entonces vamos a crearlo aquí.
02:44:20
Y le vamos a decir que esto es un JSON.
02:44:25
Porque dentro de connectivity habrá que meter ciertos elementos.
02:44:28
Y el JSON lo vamos a tener vacío.
02:44:32
Entonces ahora vamos a ir metiendo diferentes cosas dentro de connectivity.
02:44:39
Entonces dentro de connectivity...
02:44:45
A ver...
02:44:53
Espera, no. Lo vamos a hacer al revés.
02:44:57
Vamos a decirle que dentro de...
02:45:00
Que me mueva lo que me venga en msg.network.
02:45:03
Que sería esta ruta de aquí.
02:45:10
Que me la mueva a esta ruta de aquí.
02:45:12
Con lo cual todo lo que venga como msg.network
02:45:18
ahora va a formar parte de msg.connectivity.network.
02:45:22
Y vamos a ir haciendo lo mismo con el resto de propiedades que forman parte de network.
02:45:27
¿Qué más cosas van en network? El RSSI antes estaba aquí.
02:45:32
Entonces copio esta ruta.
02:45:35
Y ahora la voy a pegar en esta ruta.
02:45:38
Y esto es un move.
02:45:41
Y vamos a hacer lo mismo con el powerdbm.
02:45:46
Que antes... De hecho este ha cambiado...
02:45:50
El powerlevel. Ha cambiado su nombre.
02:45:57
Antes se llamaba powerlevel. Lo voy a coger de aquí.
02:45:59
Y ahora está dentro de connectivity en connectivity.powerdbm.
02:46:04
Y vamos a hacer lo mismo con el gateway.
02:46:12
El gateway antes formaba parte, colgaba de la red directamente.
02:46:14
Lo movemos y ahora forma parte de connectivity.
02:46:18
Cogemos la ruta, la pegamos.
02:46:22
Y ahora vamos a ver si esto nos ha solucionado algo.
02:46:24
Vamos a hacer un deploy.
02:46:32
Y voy a dejar estos dos como referencia.
02:46:35
Este es el mensaje de versión 1.
02:46:37
Este es el mensaje de versión 2.
02:46:39
Y el que va a salir ahora va a ser un mensaje de versión 1
02:46:41
que ha sido cambiado parcialmente por este nodo de change.
02:46:44
Por favor si algo no queda claro de lo que voy haciendo
02:46:48
me decís. Por lo único que hemos hecho ha sido
02:46:51
crear este objeto, el connectivity, vacío.
02:46:54
Porque más adelante le he querido meter todas las propiedades
02:46:57
que se heredan de los mensajes de versión 1.
02:47:00
Vamos a añadir, vamos a inyectar un mensaje de versión 1.
02:47:03
Y esto será una especie de mezcla entre v1 y v2.
02:47:08
Por ejemplo, tenemos que aquí en mensaje de v1
02:47:13
A ver si podemos colapsar este...
02:47:19
Jorge, ¿es necesario crearlo?
02:47:21
Porque yo no lo he creado y me lo ha hecho...
02:47:24
Entiendo que bien.
02:47:27
En Javascript sí. Y aquí entiendo que también.
02:47:31
A ver, déjame que lo borre.
02:47:35
Tampoco lo he creado y se lo ha tragado.
02:47:37
A ver.
02:47:39
Vamos a comparar. Como tenemos aquí el que acabo de generar
02:47:41
Voy a despegar. Voy a inyectar uno de versión 1.
02:47:44
Y connectivity, pues sí.
02:47:50
Sí, sí. Vale.
02:47:52
Pues sí, se lo traga.
02:47:54
Quizá estaba puesto porque cuando lo hacemos textualmente,
02:47:56
cuando lo hacemos programando en Javascript
02:48:01
yo no puedo crear una propiedad sobre un objeto que todavía no existe.
02:48:03
Pero aquí parece que sí, que él es muy listo.
02:48:07
Y dice, vale, estás moviendo esto adentro de un objeto
02:48:10
pues cojo y me lo creo.
02:48:13
Entonces, por ahora parece que va bien.
02:48:18
Es decir, hemos creado el objeto connectivity
02:48:20
y dentro hemos metido cuatro cosas que antes estaban colgando de la raíz.
02:48:22
¿Qué más cosas podemos migrar mediante esta estrategia?
02:48:27
Vamos a volver a generar...
02:48:32
Vamos a borrar.
02:48:34
Generamos el dv1.
02:48:36
Perdón.
02:48:38
Generamos el dv1 con lo que me queda
02:48:41
y generamos el dv2.
02:48:43
Vale, entonces connectivity parece que ya lo tenemos.
02:48:47
Vamos a crear el metadata.
02:48:49
¿Me ayudáis con este?
02:48:51
Sí, ¿no? ¿Vale?
02:49:03
Venga.
02:49:06
Pues entonces, vamos a hacerlo.
02:49:08
Vamos a mover
02:49:10
el tipo
02:49:12
que venía con la v1
02:49:14
lo vamos a mover a metadata.
02:49:18
Aquí, como acabamos de ver, que no es necesario
02:49:20
crear el objeto metadata
02:49:22
para luego crear las propiedades
02:49:24
pues lo hacemos tal cual.
02:49:26
Vale, ya tenemos la primera propiedad de metadata.
02:49:28
Vale, ahora
02:49:30
el checksum ok
02:49:32
¿De dónde lo obtenemos?
02:49:35
Aquí. Estaba en data.
02:49:39
Entonces movemos
02:49:43
de data.checksum ok
02:49:45
lo movemos
02:49:47
a esta otra ruta.
02:49:49
¿Veis? Aquí es fundamental
02:49:51
utilizar
02:49:53
la herramienta esta de copiar rutas.
02:49:55
De generar un mensaje y otro en la parte de debug.
02:49:57
Y luego cogiendo,
02:49:59
cortando o copiando y pegando las rutas
02:50:01
se hace todo mucho más fácil.
02:50:03
Vale, y vamos a mover también
02:50:06
la longitud
02:50:08
que antes venía marcada dentro de data.
02:50:10
La copiamos.
02:50:12
Espera, te escucho muy muy bajito.
02:50:16
Digo, aparte de copiar
02:50:18
el path
02:50:20
también podríamos escribir
02:50:22
el msg.type o el msg.metadata.type
02:50:24
¿no?
02:50:26
Eso sería equivalente a copiar el path.
02:50:28
¿Aquí? ¿Escribir directamente?
02:50:30
Sí.
02:50:32
Ah, pero
02:50:34
escribir dorbel.
02:50:36
Por ejemplo, donde estás
02:50:38
poniendo un move, en lugar de
02:50:40
coger el path,
02:50:42
escribir el msg.data.length.
02:50:44
Sí, sí, claro.
02:50:46
Pero que es mucho más rollo.
02:50:48
Ah, bueno, vale.
02:50:50
Se lo dices por...
02:50:52
Yo puedo escribir directamente aquí
02:50:54
puedo escribir data.length.
02:50:56
Vale, eso es lo que me refiero.
02:50:58
Sí, sí, pero claro,
02:51:00
teniendo aquí la información
02:51:02
es más fácil que evite
02:51:04
errores copiando de aquí directamente
02:51:06
que ya sé que es un objeto que está bien formado
02:51:08
que escribiéndolo
02:51:10
a mano.
02:51:12
Vale, entonces
02:51:14
con esto parece que ya tenemos generada
02:51:16
toda la parte de los metadatos.
02:51:18
Tenemos metadatos, el tipo,
02:51:20
el checksum y la longitud.
02:51:22
Vale, pues
02:51:24
una vez más lo que voy a hacer va a ser
02:51:26
borrar otra vez aquí
02:51:28
despliego, genero
02:51:30
un objeto del de referencia
02:51:32
el de tipo
02:51:34
2
02:51:36
y voy a generar el que llevo hecho por ahora.
02:51:38
Vale, entonces
02:51:44
¿en qué cosas se diferencian?
02:51:46
Bueno, pues metadata ya está, connectivity
02:51:48
ya está, y aquí tengo
02:51:50
que device, model,
02:51:52
format, data
02:51:54
y flags están ahí colgando
02:51:56
pues vamos a ver cada una de ellas
02:51:58
cómo están
02:52:00
o cómo deberían estar en el otro sitio.
02:52:04
Entonces, por ejemplo
02:52:06
una fácil. ¿Alguien me quiere ayudar con alguna de ellas?
02:52:08
Quizás se pueden copiar directamente, ¿no?
02:52:20
Menos la de flags, que la de flags
02:52:22
habría que eliminarla.
02:52:24
Bueno, vamos a empezar eliminando flags.
02:52:26
¿Cómo lo harías?
02:52:28
Lo mismo, añadiendo
02:52:36
una línea con delete
02:52:38
msg.flags
02:52:40
Vale, yo como prefiero
02:52:42
no liarla, vamos a coger
02:52:44
aquí
02:52:46
y copiar la ruta.
02:52:48
Vale, con lo cual esto
02:52:51
despegamos, borramos
02:52:53
este
02:52:55
¿por qué no me deja borrar este?
02:52:57
Bueno, no me deja borrarlo.
02:53:02
Bueno.
02:53:06
Vamos a regenerar el 1
02:53:08
y ahora vemos que este
02:53:10
ya no tiene flags. ¿Vale? ¿Qué más cambios
02:53:12
harían?
02:53:14
Hay que eliminar también
02:53:16
el data, porque a mí
02:53:18
aunque está vacío, no tiene datos,
02:53:20
me queda ahí.
02:53:22
Pero...
02:53:24
Bueno, hay que eliminarlo, pero
02:53:26
no hemos trabajado todavía con el Ding Dong, ¿no?
02:53:28
El Ding Dong...
02:53:30
No, es que tú tienes la foto
02:53:32
tu cámara encima justo de...
02:53:34
Ah, perdón, perdón, perdón.
02:53:36
Me muevo.
02:53:38
Sí, el Ding Dong
02:53:44
habría que llevárselo de
02:53:46
data.message
02:53:48
de data.message
02:53:58
a message.payload
02:54:00
Correcto.
02:54:02
Y ahora sí, probablemente, sí que se nos
02:54:04
quede colgando ese data. Vamos a comprobarlo.
02:54:06
Es que a mí lo que me parecía era el data
02:54:08
que me parecía vacío.
02:54:10
Efectivamente, aquí tenemos un data empty
02:54:12
en el payload, así que parece el Ding Dong.
02:54:14
Siguiente línea, ¿qué hacemos?
02:54:16
Es un delete del
02:54:18
message.data
02:54:20
Este es fácil de ponerlo.
02:54:22
Los pegamos,
02:54:24
borramos, inyectamos.
02:54:26
Y ahora ya quedan pocas cosas, ¿verdad?
02:54:30
¿El device tiene que ir ahí?
02:54:32
Vamos a ver la referencia.
02:54:38
Jorge, una cosa, si tú
02:54:40
borras
02:54:42
meses.data
02:54:44
estás cargando
02:54:46
tanto el data.meses como
02:54:48
data.checksum o data.length, ¿no?
02:54:50
A ver, ¿no los tenía migrados ya esos?
02:54:54
Sí, sí,
02:54:56
estaban migrados ya.
02:54:58
Ah, ya los has emigrado antes.
02:55:00
Claro, aquí los tengo, mira. Este data.checksum
02:55:02
está movido
02:55:04
a metadata.checksum, ¿ok?
02:55:06
Data.length
02:55:08
Estaban migrados a metadata.length
02:55:10
Sí, sí, cuando lo he hecho ya hemos visto
02:55:12
que estaba vacío, que no quedaba nada.
02:55:14
Vale, gracias.
02:55:16
Y ahora nos queda...
02:55:18
Vale, parece que model se mantiene.
02:55:20
Device se
02:55:22
mantiene, está en la misma dirección.
02:55:24
Payload ya lo tenemos.
02:55:26
Connectivity está correcto. Falta un pequeño matiz.
02:55:28
¿Qué nos falta?
02:55:30
Para rematar.
02:55:32
¿Format al final lo has mantenido?
02:55:34
Sí, ahí se queda.
02:55:36
No he hecho nada al respecto.
02:55:38
Format yo lo que he hecho es
02:55:40
lo he puesto v2, pero
02:55:42
directamente.
02:55:44
He hecho un set.
02:55:46
Lo podemos hacer con un set o
02:55:48
también podemos hacer un búsqueda
02:55:50
y reemplaza.
02:55:52
Vale, pues a mí eso es
02:55:54
lo único que me falta.
02:55:56
Está bien, porque en realidad, fíjate que
02:55:58
no hace falta hacer ese búsqueda y reemplaza
02:56:00
porque como este switch
02:56:02
ya nos saca por aquí
02:56:04
cuando la versión sea v1
02:56:06
en realidad ya sabemos que va a haber ahí un
02:56:08
v1, con lo cual, tal y como
02:56:10
lo tienes hecho tú, está perfecto.
02:56:12
Si aquí nos venimos a
02:56:14
Format, copiamos
02:56:16
y ponemos
02:56:18
directamente v2
02:56:20
Esto ya estaría
02:56:24
terminado. A mí me parecen bastante reglas
02:56:26
igual que a ti, o sea que...
02:56:28
¿Vale? ¿Qué es lo que
02:56:30
pasa? Que no van a quedar exactamente
02:56:32
igual, porque el orden en el que hemos
02:56:34
generado uno y otro
02:56:36
son diferentes. Aquí aparece, por ejemplo,
02:56:38
primer device y luego model. Aquí model
02:56:40
y luego device. Luego format,
02:56:42
connectivity sí que está bien, pero
02:56:44
a ver, lo de dentro también está en orden.
02:56:46
Luego viene payload y payload de aquí
02:56:48
es para el último. Pero en realidad esto, como
02:56:50
decía antes, no está igual.
02:56:52
No importa el orden de los elementos
02:56:54
dentro de un JSON,
02:56:56
sino que lo que importa es las jerarquías
02:56:58
y que esté todo como
02:57:00
corresponde.
02:57:02
Jorge. Sí.
02:57:04
Yo lo he hecho con
02:57:06
set en vez de move.
02:57:08
Con set
02:57:10
en vez de move y te funciona.
02:57:12
Y funciona.
02:57:14
Y bueno, lo he puesto en el orden
02:57:16
idéntico.
02:57:18
Lo único que te va a pasar...
02:57:20
Cambiar la versión.
02:57:22
Claro.
02:57:24
Lo único que te va a pasar es que luego...
02:57:26
Bueno, en realidad
02:57:28
da igual porque como aquí borramos data...
02:57:30
A ver. Yo no
02:57:32
lo utilizo. Yo como lo saco por set
02:57:34
no necesito eliminar.
02:57:36
Yo cojo los datos
02:57:38
del...
02:57:40
Sí, lo que comento es que a lo mejor
02:57:42
con este ejercicio no pasa,
02:57:44
pero si tú haces un set, estableces
02:57:46
por ejemplo con RSSI, si haces un
02:57:48
set, aquí se establecería
02:57:50
el RSSI, pero no se borraría
02:57:52
del otro modelo. Entonces te puede quedar
02:57:54
un RSSI colgando que no corresponda.
02:57:56
No entiendo.
02:57:58
Yo he cogido el valor
02:58:02
del RSSI anterior
02:58:04
del abort.
02:58:06
Y lo he...
02:58:08
Y he generado un cotasón. Vendría a ser
02:58:10
como generar un cotasón nuevo.
02:58:12
Espera, déjame que te enseñe
02:58:14
a lo que me refiero.
02:58:16
En este primer
02:58:18
debug estoy mostrando
02:58:20
cómo venía el objeto.
02:58:22
Entonces, por ejemplo, aquí vemos
02:58:24
que el type dorbel
02:58:26
este colgaba directamente
02:58:28
de MSG.
02:58:30
Si yo mi regla es
02:58:32
que dentro de
02:58:34
metadata establezco que el type
02:58:36
es lo mismo que el
02:58:38
MSG.dorbel, aquí
02:58:40
se me va a crear. Es decir, voy a tener
02:58:42
un metadata.type que es igual a dorbel.
02:58:44
Pero voy a tener
02:58:46
también un type dorbel
02:58:48
a nivel de la rama principal.
02:58:50
Entonces lo tengo
02:58:52
que eliminar.
02:58:54
Exactamente.
02:58:56
Un move es
02:58:58
lo mismo que un set más un delete.
02:59:00
Vale.
02:59:02
Bueno, he estado viendo
02:59:04
que tú también has utilizado un delete.
02:59:06
Sí, pero porque no
02:59:08
tenía más remedio. Porque fíjate, el docelete
02:59:10
es lo que he utilizado cuando...
02:59:12
Por ejemplo, aquí con el data.
02:59:14
Porque una vez que
02:59:16
yo he movido mensaje, checksumOK
02:59:18
y longitud, esto
02:59:20
se me queda colgando.
02:59:22
No tiene información. Ese sí que lo tengo que borrar.
02:59:24
Pero con el type, por ejemplo,
02:59:28
si estableces
02:59:30
el metadata.type
02:59:32
Sí, metadata.type
02:59:34
aquí, luego éste
02:59:36
se queda igualmente. Con lo cual tendrás dos types.
02:59:38
Tendrás dorbel dos veces.
02:59:40
Pero si yo lo que muestro
02:59:44
en el debug, solamente
02:59:46
los datos que yo quiero, nada más.
02:59:48
Los que me lleguen
02:59:50
me dan igual. Yo muestro
02:59:52
o saco por salir
02:59:54
a los datos que yo quiero.
02:59:56
No los que me llegan.
02:59:58
Espera, déjame que lo...
03:00:02
Te muestro.
03:00:04
Te muestro lo que he hecho.
03:00:06
Sí. Vale.
03:00:08
Comparto.
03:00:10
A ver.
03:00:12
Bien.
03:00:14
Y ahora como muestro...
03:00:16
Me preguntaba Pilar
03:00:18
que si es necesario crearlo.
03:00:20
¿A qué te referías? No sé.
03:00:22
Al objeto.
03:00:24
¿No? A la primera parte.
03:00:26
Al objeto vacío.
03:00:28
Vale. Hemos visto que no.
03:00:30
Yo pensaba que sí, porque en Javascript sí que es necesario.
03:00:32
Sí, Darío, disculpa.
03:00:34
Puedes continuar compartiendo.
03:00:36
Sí, espera.
03:00:38
No sé cómo
03:00:40
mostrar la máquina virtual.
03:00:42
Aquí.
03:00:44
No sé si la estás viendo.
03:00:48
No.
03:00:50
No se ha elegido la ventana posiblemente.
03:00:52
A ver.
03:00:54
¿Y cómo elijo la ventana?
03:00:56
En el propio Teams.
03:00:58
Abajo te tiene que aparecer
03:01:00
un desplegable.
03:01:02
En el que deberías seleccionar algo.
03:01:04
Y ahora arriba en el navegador.
03:01:06
Te tiene que dar a elegir
03:01:08
qué ventana o pantalla completa quieres compartir.
03:01:10
Ventana. Aquí.
03:01:12
Ahora.
03:01:14
Ahí está.
03:01:16
Ahí estás viendo.
03:01:18
Vale.
03:01:20
Yo aquí en este
03:01:22
yo tomo
03:01:26
en...
03:01:28
Saco en salida
03:01:30
el modelo
03:01:32
y lo leo de ahí.
03:01:34
Ah, vale, eso es lo que has hecho.
03:01:36
Sí, ya te entiendo.
03:01:38
Claro, porque tú has creado un objeto dentro de MSG
03:01:40
y luego en el debug le dices
03:01:42
salida, MSG.salida.
03:01:44
Es el objeto
03:01:46
que yo he creado.
03:01:48
Sí.
03:01:50
Sí, es otra forma de resolver.
03:01:52
Sí, me parece correcto.
03:01:54
Está bien.
03:01:56
No te entendía.
03:01:58
Es la misma solución que le propuse
03:02:00
al compañero que antes me decía
03:02:02
vale, entonces yo hago un montón de
03:02:04
establezco y luego borro.
03:02:06
Y le dije, pues, ¿por qué no creas un objeto
03:02:08
nuevo en el cual
03:02:10
MSG2, por ejemplo, en el cual vas estableciendo las propiedades?
03:02:12
Y luego solo el resultado
03:02:14
de esas funciones es sacar solo
03:02:16
hacer un return de MSG2.
03:02:18
Es lo mismo, lo que tú has hecho.
03:02:20
Con lo cual está bien.
03:02:22
Pero una vez más
03:02:24
lo que comento siempre, si funciona
03:02:26
es que está bien.
03:02:28
Se podría hacer más gigante, más rápido, más bonito
03:02:30
más no sé qué, pero si funciona es que está bien.
03:02:32
Vale.
03:02:34
Pues, ¿alguna duda
03:02:36
con respecto a lo que
03:02:38
hemos hecho hoy? Esto probablemente
03:02:40
con esta parte nos toca
03:02:42
pegarnos más adelante lo que queda del curso
03:02:44
porque muchas veces nos llegarán cosas
03:02:46
en lugares en los que no queremos
03:02:48
de JSON y habrá que cambiarlo
03:02:50
de lugar o de sitio, habrá que adaptar
03:02:52
formatos de una cosa a la otra para que
03:02:54
todos los mensajes lleguen unificados
03:02:56
a quien lo pueda procesar o a quien lo meta en base de datos
03:02:58
o a quien lo grafique
03:03:00
o a lo que sea. Es decir, entiendo que
03:03:02
por ahora a lo mejor esta práctica no tenga
03:03:04
mucho sentido para la mayoría
03:03:06
pero créedme que esta parte se utiliza
03:03:08
bastante cuando empecemos
03:03:10
a jugar con diferentes sensuales, con diferentes cacharrillos
03:03:12
que cada uno nos da sus datos
03:03:14
de una forma diferente.
03:03:16
¿Vale?
03:03:20
¿Habéis puesto el código
03:03:22
de salida? Os lo vuelvo a...
03:03:24
Vale.
03:03:28
Pues nada, si no tenéis ninguna
03:03:30
consulta adicional
03:03:32
lo dejamos...
03:03:34
Me faltan tres firmas
03:03:36
para salir
03:03:38
Darío, Modesto y
03:03:40
Javier.
03:03:42
Darío lo tenía entretenido yo.
03:03:44
Sí, estoy por aquí.
03:03:46
Vale, vale, vale. Para que no vayáis
03:03:48
que luego me toca a mí andar corregiendo.
03:03:50
Ya sé que estáis todos
03:03:52
pero bueno.
03:03:54
Muy bien.
03:03:56
Pues nada, muchas gracias.
03:03:58
Hasta el miércoles.
03:04:00
Hasta el miércoles.
03:04:02
Juan Ramón que Javier.
03:04:04
Javier Moreno o el otro, porque yo creo que he firmado.
03:04:06
Javier Ueda, soy yo.
03:04:08
Bueno, pues entonces hasta
03:04:10
el próximo día.
03:04:12
Aunque bueno, yo te escrito un mensaje, Juan Ramón, que el próximo día
03:04:14
no puedo estar, o por lo menos de inicio.
03:04:16
- Idioma/s:
- Autor/es:
- CTIF MADRID ESTE
- Subido por:
- Tic ctif madrideste
- Licencia:
- Todos los derechos reservados
- Visualizaciones:
- 5
- Fecha:
- 5 de mayo de 2023 - 10:14
- Visibilidad:
- Clave
- Centro:
- C.TER.INN.Y FORM CTIF MADRID-ESTE
- Duración:
- 3h′ 04′ 19″
- Relación de aspecto:
- 1.78:1
- Resolución:
- 1920x1080 píxeles
- Tamaño:
- 1.30