Con la introducción de la carga rápida sin duda ha sido una de las grandes mejoras y a la vez un gran lío y confusión a la hora de cargar tu equipo.
Ya que si bien es una mejora, resulta que hay diversos tipos de carga rápida, y no, no son iguales, así el conector sea el mismo y uses otro cargador de carga rápida, no significa que lo cargara en forma rápida. Incluso siendo del mismo fabricante, ya que también se manejan diferentes tipos de potencia.
La carga convensional es de 5V1A que refleja la tensión medida en Volt (V) y la corriente medida en Amperes (A) el resultado de multiplicar estos valores es la potencia que equivale a 5W.
Así que la carga rápida se considera a partir de los 2A o su equivalente a 10W o superior, ya que déjame aclarar que la carga rápida no solo consiste en aumentar el Amperaje, si no también se puede aumentar el voltaje donde la multiplicación de estos valores dan como resultado un aumento de potencia W.
Conforme avanzó el tiempo los fabricantes de teléfonos desarrollaron sus propios sistemas y/o protocolos de carga rápida ya sea por ofrecer un mejor sistema o por evitar pagar los costos de licencia ya que Quick Charge es una marca registrada de Qualcomm.
Y esto dio como resultado una disminución en la eficiencia al cargar tu equipo si empleas un cargador diferente al que te vende la marca de tu equipo, pero esto no significa que no se cargue tu equipo, si no que no lo hará con la misma rapidez, haciendo que pierda sentido la carga rápida.
Qualcomm Quick Charge
Seguramente ya habrás visto este logotipo, cómo mencione anteriormente Qualcomm Quick Charge es una marca registrada de Qualcomm, misma que fabrica los procesadores Sanpdragon que incorporan muchos teléfonos en especial gama media y gama alta.
El sistema de Quick Charge de Qualcomm es quizás es el más popular y extendido debido a que dicha características viene incorporada desde el procesador, te dejo la lista de procesadores que incorporan dicha característica, y a su vez Qualcomm Quick Charge ha ido evolucionando surgiendo varias versiones, cada una compatible con la anterior
Otros tipos de carga rápida
Si Qualcomm implemento su carga rápida en sus procesadores Snapdragon, entonce tambien hizo lo mismo MediaTek con sus procesadores, quien es el segundo fabricante más importante procesadores en dispositivos mobiles, sin embargo sus procesadores son más frecuentes en equipos de gama baja y gama media, y al mismo tiempo algunas marcas de equipos mobiles hicieron lo mismo
Este punto es importante por que hay muchos usuarios que han usado un cargador de carga rápida diferente al que viene de fabrica y/o diferente a la marca, y la carga es más lenta, y no significa que no sea carga rápida, si no que la carga no se realiza a la máxima capacidad para la que esta hecha el dispositivo.
Marca
Tecnología
Samsung
AFC (Adaptive Fast Charging)
Huawei
SCP (Super Charge Protocol) MAX 40W anteriormente FCP Fast Charging Prontocol Max 18W
Motorola
Turbo Power o Turbo Charger
OnePlus
Wrap Charge, antes VOOC 2.0 licenciado a OnePlus como Dash Charge
OPPO
VOOC (Voltage Open Loop Multi-step Constant-Current Charging) y Super VOOC
En el caso de OPPO ha licenciado su tecnología VOOC y SUPER VOOC bajo otro nombre a otras marcas como OnePlus y otras marcas que se ven más en China.
Los fabricantes, Apple y sus trampas
Hasta el momento no habíamos hablado de Apple, sin embargo también cuenta con su propio sistema de carga rápida, aunque a diferencia de los demás, Apple ha sido más conservador con respecto a la potencia de este, y esto quizás a que sus productos no se sumaron a la tendencia de usar baterías con gran capacidad, probablemente a que estén más optimizados en el uso de la misma.
Pero hay algo en lo que Apple coincide con otros fabricantes, y es el hecho de incorporar cargadores de convencionales sin carga rápida o de menor capacidad a la que puede soportar, pero esta diferencia es muy notable en el caso de los Iphone de Apple, ya que sus equipos vienen con un cargador de 5V1A que equivale a 5W, a excepción de su ultimo lanzamiento en su versión más cara el Iphone 11 Pro Max que incorpora un cargador de 18W
En el caso de Samsung con su último lanzamiento del Galaxy Note 10 Plus incluye un cargador de 25W, sin embargo puede soportar carga de hasta 45W
Por lo cual si quieres aprovechar la carga rápida en su máxima capacidad deberás adquirir el cargador por separado.
La importancia del cable
Para que se pueda llevar a cabo la carga rápida se requieren de tres elementos:
Un cargador con soporte para carga rápida compatible con el equipo a utilizar.
Un dispositivo con soporte para carga rápida.
Cable con soporte para carga rápida
A menudo un elemento no tomado en cuenta es el cable, y es tan importante como los demás, tal es el punto que si no usas el adecuado simplemente no funcionara la carga rápida.
para poder usar el cable adecuado debes conocer la potencia de en Watts(W) o Amepres(A) que soporta tu equipo, siendo los Amperes una medida usada al inicio de la carga rápida en el caso de carga 2A y 2.4A, y recientemente se mide más en Watts(W) debido a que la carga rápida dejo de ser un flujo constante de corriente y se volvió un factor variable que combina Voltaje(V) y Amperaje(A).
Las medidas comúnmente empleada en cables es Amperes(A), pero también ya muchos fabricantes especifican su capacidad en Wats(W), hasta el momento los cables de mayor capacidad son los de 5A y 100W, aquí es muy importante emplear cables de calidad, ya que por ejemplo con el uso de cables tipo C, estos suelen incorporar una resistencia de 56K Omhs que asegura no sobrealimentar el equipo.
Hay cables usan resistencias menores a los 56K, lo que representa un riesgo para tu equipo, he vistos cables con valor menor y mucho menor a 1 USD, entonces por esos precios no podemos esperar la mínima calidad ni seguridad.
Hay un caso muy conocido de un Ingeniero de Google Benson Leung que daño su Chromebook Pixel de $1,499 USD al cargar su celular Nexus 6P en el equipo.
Cable lightning
En el caso de Apple con su cable lighthing es un poco más sencillo debido a que solo cuenta con un sistema de carga rápida, que es de 18W, aun que claro en la mayoría de los casos se debe adquirir por separado. Pero Apple incorpora un chip en sus cables para verificar que sean legítimos, y ademas de ello ha abierto la puerta a otros fabricantes mediante su programa MFI (Made for iPhone/iPod/iPad) a fabricar accesorios para sus equipos, esto ha sido algo muy bueno, ya que hay fabricantes que tienen mejor calidad en sus cables que los de Apple
Así que si vas usas cables para iPhone/iPad deben ser los originales que venden en sus tiendas o deben estar certificados bajo MFI, cuando un accesorio no cuenta con esta certificación podrás ver en la pantalla de un dispositivo un mensaje indicándolo
Hay muchos lugares tanto por Internet como en lugares físicos donde venden accesorios iguales a los de Apple, mismo empaque, mismo diseño, todo igual. Sin embargo es importante que tomes en cuenta que Apple no vende mediante terceros, solo lo hace de manera oficial en su página, en sus tiendas oficiales, o distribuidores autorizados, en cuyo caso son pocos, ya que si bien hay muchas tiendas reconocidas que venden sus equipos, muchas de ellas no venden sus accesorios al menos no a un precio accesible, más caros que en la tienda de Apple.
Por si fuera poco todos los estándares mencionados anteriormente, algunos fabricantes de accesorios como cargadores y power banks introdujeron también sus estándares alternativos para carga rápida, por ejemplo Anker usa Power IQ, Tronsmart emplea VoltIQ, Aukey usa AiPower. entre otros, es posible que el desarrollar su propio estándar sea un parte de una estrategia para pagar no pagar licencia a Qualcomm, sin embargo existen, y son opción más dentro de las posibilidades para cargar tu dispositivo
USB C y PD (Power Delivery)
con el uso del puerto tipo C se surge el estandar Power Delivery publicado por USB-IF el cual pretende ser el nuevo estándar para carga rápida el cual a diferencia de los demás no tiene costos de licencia, uno de los puntos fuertes de este estándar es que puede modular la tensión y corriente en proceso de carga para adaptarse al dispositivo que esta cargando.
En su versión PD 3.0 tiene soporte para carga de 100W, dicho estándar ha sido adoptado el Pixel de Google, de hecho el Quick Charge de Qualcomm su versión 4+ se basa en dicho estándar. Por lo cual es muy probable que se vuelva en el nuevo estándar de carga rápida para todos los dispositivos
Resumen
Para poder elegir el cargador ideal para tu equipo debes conocer la capacidad de carga del mismo y siempre buscar uno que sea compatible con el protocolo de la marca, y no accesoriamente debe ser de la misma marca del equipo, hay otros fabricantes que también te ofrecen calidad, arriba te dejamos la lista de marcas y sus estándares de carga rápida, así como que el cable empleado soporte la capacidad de carga del cargador y dispositivo, recuerda emplear elementos de calidad.
También es posibles emplear cargadores con un estándar diferente al que emplea tu equipo, y seguirá siendo carga rápida, pero con un menor rendimiento al estándar que emplea la marca.
Las entidades en dialogflow es una forma de identificar o agrupar un segmento de datos junto con sus sinónimos dentro de un contexto especifico, las entidades son usadas para guardar segmentos de información especifica proveniente de las entradas del usuario.
Las entidades pueden representar información acercada de punto en particular, como la talla de un productos, los sabores de alguna bebida, las categorías de un producto servicio, los ingredientes de una alimento, las características de un celular, etc. Como podemos ver, son pequeños fragmentos de información acerca de algo.
Las entidades nos permite administrar y manejar la información del usuario de una manera más fácil y entendible.
Supongamos que usamos nuestro bot para nuestra tienda de ropa, podemos crear una entidad por cada categoría de ropa, o en ropa muy particular, una entidad por cada prenda. Ahora supongamos el caso de una pizzeria, puede ser útil una entidad por ingredientes, tipos de masa, tamaño, bebidas, y acompañamientos.
Ejemplo practico
Para entenderlo de forma practica vamos a crear un ejemplo de una agencia de autos, donde contamos con tres tipos de autos; Hatchback, Sendan y SUV. Nuestro bot podrá atender dos tipos de peticiones;
Indicar los autos que se venden.
Mostrar imágenes del vehículo deseado
Y los complementaremos con el uso de Webhook y Rich Messages(Mensajes enriquecido) como ya lo hemos visto en otro post para brindar una respuesta más visual y ver como se van complementando lo que hemos aprendido hasta el momento.
Pero como encajarían las entidades dentro de este ejemplo; pues bien, sería al momento de solicitar que nos muestre la imagen, la manera en que nos podemos referir a un mismo tipo de auto puede ser diferente, por ejemplo un auto Hatchback podemos referirnos ya sea por Hatchback, hb, cinco puertas, entre otros, así como también podemos usar el modelo para referirnos a dicho vehículo.
Vamos a ver un diagrama para entender un poco mejor el ejemplo que llevaremos a practica.
Una vez que la solicitud llegue a nuestro backend ejecutándose en node mediante el webhook de dialogflow este responderá con un mensaje enriquecido al agente brindado un respuesta más visual.
Datos de ejemplo
Para nuestro ejemplo de una agencia de autos, emplearemos tres vehículos de la marca Mazda, que son el Mazda 3, el Mazda 6 y la CX5 también de Mazda.
Cada uno de estos autos representa una categoría especifica; Hatchback, Sedan y SUV y se puede referir a cada uno de ellos de más de una forma; por ejemplo podemos preguntar por la SUV o por el modelo CX5 y ambos se refieren al mismo vehículo para nosotros.
Crear agente
Antes que nada sera necesario crear un agente en dialogflow o bien usar uno existente, asegúrate de configurarlo en idioma español, en mi caso se olvido, y lo deje en ingles, pero para este ejemplo no hubo alguna repercusión
Entidades
En esta ocación vamos comenzar a crear la Entidad antes de los Intentos, esto por fines prácticos, pero no es necesario seguir este orden.
Vamos al menú de dialogflow para crear nuestra entidad
Y creamos una entidad llamada tipo_auto
Agregamos tres entradas Hatchback, SUV, Sedan y vamos a definir los diferentes sinónimos que podemos usar para referirnos a ellos, aquí he usado los que he considerado, pero te puedes sentir con la libertad de usar otros que consideres más adecuados.
Aquí también podemos considerar algunos errores de dedo que pueda llegar a cometer el usuario y de esta forma poder brindar la respuesta correcta.
Intentos
Ahora es momento de crear los intentos que empleara nuestro agente para entender las peticiones del usuario y brindar una respuesta acorde a ello. Cuando se creo el agente, de forma automática se crearon dos intentos llamados Default Fallback Intent y Default Welcome Intent, nosotros los dejaremos tal cual están, comenzamos creando el primer intento que se llamara preguntar_autos el cual se encargara de brindar información acerca de los vehículos que se manejan en nuestro ejemplo.
Como pueden ver he elegido algunas frases de entrenamiento para nuestro agente que pregunta de manera genera que tipo de autos manejamos o vendemos.
En este intento que acabamos de crear no fijaremos ninguna respuesta, ya que en nuestro backend se encargara de brindar la respuesta adecuada, y solo nos dirigimos al final del Intento y habilitamos el Fullfilment.
Vamos a dejar al final la programación del backend en node y crearemos otro intento que llamaremos solicitar_imagenes, la intención de este intento sera
como pueden apreciar en la imagen usamos frases de entrenamiento para dicho propósito de mostrar la fotos del vehículo deseado, aquí es donde asignaremos la entidad creada dentro de un parámetro, para ello seleccionamos la palabra auto y se desplegara un menú emergente donde le asignaremos el tipo de dato @tipo_auto
Si no ves el tipo de dato, puedes escribirlo en el campo de filtrado
Haremos esta asignación en cada frase de entrenamiento de este intento, y de forma automática el tipo de dato @tipo_auto se agregara a la sección de Action and parameters, en donde definiremos que es un parámetro obligatorio
Para ello marcamos la casilla de Required y definimos la entrada Prompts para indicar un mensaje en caso de que no sea especificado este parámetro
En el caso de este intento también debemos habilitar el webhook para que sea nuestro backend el que responda a la petición del usuario.
Antes de continuar con la programación, también debemos habilitar el agente de dialogflow la opción de fullfilment, en donde indicamos la url pública de nuestro backend.
La url nos la proporciona el sfotware Ngrok que nos permite obtener una url pública y redirigir el trafico hacia nuestro equipo de una manera fácil y rápida; para ello solo basta con correr el comando ngrok http 3000 en tu consola CMD donde 3000 representa el puerto que escucha tu aplicación, puede ser cualquier otro, solo que este disponible y usar el mismo al correr el comando que el que escucha tu aplicación.
Debes usar la url que comienza con https, ya que dialogflow solo permite direcciones que utilicen el puerto seguro 443 que emplea el https, y a esta url agregar la ruta "/entidades"
Backend
Para el caso de nuestro backend como ya lo hemos hecho anteriormente en otro post emplearemos node con el framework Express para nuestra aplicación web, también haremos uso de mensajes enriquecidos de dialogflow que también hemos visto con anterioridad
Debido a que dialogflow usa la misma url para el backed, tenemos que identificar por cada petición recibida a que intento corresponde, y para ello es necesario revisar los parámetros de la solicitud revida de la siguiente manera
req.body.queryResult.intent.displayName;
Simplemente usaremos alguna condición para verificar que intento es, y procesar la información acorde a ello, recuerda que el nombre debe estar escrito de manera exacta al que asignaste al intento que intentas verificar.
Otro punto importen es obtener la variable @tipo_auto que creamos a partir de una entidad, ello lo podemos realizar de la siguiente forma
req.body.queryResult.parameters.tipo_auto;
Una vez dicho esto, y visto previamente el uso de node como backend para dialogflow y el uso de mensajes enriquecidos, un punto muy importante es que para el caso de imágenes, la imagen como tal debes estar una url pública empleando el protocolo https, y debe terminar en .jpg o .png; existen algunos servicios para el alojamiento de imágenes, pero en general solo te da una url sin exención del archivo y suelen emplear un visor; por lo que dicho mecanismo no sirve para los fines que empleamos en este mecanismo.
Dicho lo anterior el código quedaría de la siguiente manera
Puedes correr el programa con la instrucción node app.js donde app.js es nombre del archivo que contiene el código
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
function ImageCarousel(imageUri, accessibilityText){
this.imageUri = imageUri;
this.accessibilityText = accessibilityText;
}
function mensajeQuickReplies(){
this.quickReplies = {
title : '',
quickReplies : []
}
}
function mensajeCard(){
this.card = {
title : '',
subtitle : '',
imageUri : '',
buttons : []
}
}
function Buttons(text, posback){
this.text = text;
this.postback = posback;
}
function Button(title, uri){
this.title = title;
this.openUriAction = {
uri: uri
}
}
function mensajeSimpleResponse(){
this.simpleResponses = {
simpleResponses : []
}
}
function SimpleResponses(textToSpeech, ssml, displayText){
this.textToSpeech = textToSpeech;
this.ssml = ssml;
this.displayText = displayText;
}
function mensajeBasicCard(){
this.platform = 'ACTIONS_ON_GOOGLE';
this.basicCard = {
title : '',
subtitle : '',
formattedText : '',
image : {},
buttons : []
};
}
function mensajeSuggestions(){
this.platform = 'ACTIONS_ON_GOOGLE';
this.suggestions = {
suggestions : []
};
}
function suggestion(title){
this.title = title;
}
function mensajelinkOutSuggestion(destinationName, uri){
this.platform = 'ACTIONS_ON_GOOGLE';
this.linkOutSuggestion = {
destinationName : destinationName,
uri : uri
};
}
function mensajelistSelect(title){
this.platform = 'ACTIONS_ON_GOOGLE';
this.listSelect = {
title : title,
items : []
};
}
function item(info, title, description, image){
this.info = info;
this.title = title;
this.description = description;
this.image = image;
}
function SelectItemInfo(key, synonyms){
this.key = key,
this.synonyms = synonyms
}
function mensajecarouselSelect(){
this.platform = 'ACTIONS_ON_GOOGLE';
this.carouselSelect = {
items : []
};
}
app.post('/entidades', function(req, res){
var intento = req.body.queryResult.intent.displayName;
var respuesta = new respuestaMensaje();
if(intento == 'preguntar_autos'){
var tarjetaBasica = new mensajeBasicCard();
tarjetaBasica.basicCard.title = 'Mazda';
tarjetaBasica.basicCard.subtitle = 'Zoom-Zoom';
tarjetaBasica.basicCard.formattedText = 'Contamos con autos Sedan, Hatchback y SUVs, haz clic en los enlaces para concer más información';
tarjetaBasica.basicCard.image = new Image('http://media-dmg.assets-cdk.com/websites/content/198485f8a46a4dd7869f8df3e2355050_c1x0-1598x686.jpg', '').image;
'Exterior', new ImageCarousel('https://www.mazda.mx/siteassets/mazda-mx/mycos-2019/mazda-3-hatchback/galeria/mazda-3-hatchback-galeria-01.jpg', 'Exterior'))
'Calaberas', new ImageCarousel('https://www.mazda.mx/siteassets/mazda-mx/mycos-2019/mazda-3-hatchback/galeria/mazda-3-hatchback-galeria-03.jpg', 'Calaberas'))
'Lateral', new ImageCarousel('https://www.mazda.mx/siteassets/mazda-mx/mycos-2019/mazda-3-hatchback/galeria/mazda-3-hatchback-galeria-09.jpg', 'Lateral'))
'Interior', new ImageCarousel('https://www.mazda.mx/siteassets/mazda-mx/mycos-2019/mazda-3-hatchback/galeria/mazda-3-hatchback-galeria-02.jpg', 'Interiores'))
Vamos a probar el resultado del primer intento preguntar_autos
Recuerda cambiar de Default Response a Actions on google para poder ver correctamente la respuesta, que se muestra en un mensaje enriquecido.
Ahora probemos con el intento solicitar_imagenes y veamos el resultado
Lo interesante aquí es que al emplear entidades podemos referirnos a una misma cosa con los diferentes sinónimos que se suelen emplear para hacer referencia a ello, vamos a pedir que nos muestre el mismo vehículo, pero usando otra palabra.
Hemos pedido que nos muestre la cx5 y obtenemos la misma información que pedir que nos muestre la suv, ya que para nuestro ejemplo representa el mismo vehículo.
Si nosotros no empleáramos las entidades tendríamos que repetir todas las frases de entrenamiento con su posibles sinónimos y esto a su vez dentro de cada intento donde queremos emplear dicha información.
Espero les sea de utilidad este post, y les ayude en su proyecto e ideas.
Mensajes enriquecidos (Rich Messages) con DialogFlow
Ya hemos visto una introducción a dialogflow y si no lo has hecho te sugiero revisarlo, ya que emplearemos el mismo ejemplo, pero ahora vamos a ver como enriquecer las respuestas que brinda nuestro bot con algo más visual.
Para entrar en contexto acerca de lo que hablamos, recordemos cual fue el resultado obtenido en la introducción a dialogflow.
Tipos de mensajes enriquecidos
Dialogflow cuenta con varios tipos de mensajes enriquecidos, pero no todos son compatibles para lo que podemos llamas respuestas simples, existen mensajes que solo funcionan acciones de google (ACTIONS ON GOOGLE) que permiten una mayor interacción con el usuario, las acciones de google son aquellas que con son empleadas con el asistente de google, aquel que podemos invocar la frase "Ok google" en nuestro teléfono android.
Vamos a ver la lista de mensajes enriquecidos de dialogflow y cuales funcionan solo con las acciones de google.
Tipo de mensaje
ACTIONS ON GOOGLE
text
No
image
No
quickReplies
No
card
No
payload
Si
simpleResponses
No
basicCard
Si
suggestions
Si
linkOutSuggestion
Si
listSelect
Si
carouselSelect
Si
Para más información acerca de los tipos de mensaje enriquecidos de dialogflow; consultar mensajes dialogflow
Para poder ejemplificar los mensajes enriquecidos en dialogflow pensaba mostrar información general de la ciudad que deseáramos, alguna imagen y quizás algunos links a la información, sin embargo me resulto difícil encontrar una API gratis que me pudiera proporcionar dicha información (Un resumen y alguna imagen), y no por que exista una API que brinde dicha información, si no porque su información era limitada y no se encontraban todas las ciudades, soló las más populares o de algunas zonas del planeta, lo que las volvía poco practicas para nuestro objetivo.
pero quiero mencionar que dentro de mi búsqueda encontré la API de Google Places la cual se e hizo muy interesante, si bien dicha API cuenta con una versión de prueba mediante un crédito de $300, pero requiere habilitar la facturación mediante una tarjeta de crédito, si bien ,no se realiza ningún cargo a menos de que se agote el crédito, esto puede resultar un inconveniente para algunos, y por ello mismo la he descartado.
Entonces la dinámica para nuestro agente sera enumerar los diferente tipos de mensajes, y pedir al bot que no muestre un ejemplo del mensaje en base a su numeración
Creando un Intento (Intent)
Vamos a utilizar el mismo agente creado en nuestro ejemplo anterior y vamos a crear un intento y lo llamaremos mensajee_intent y agregaremos las siguientes frases de entrenamiento (Training phrases)
Ejemplo numero
Dame el ejemplo numero
Muéstrame el ejemplo numero
Guardamos cambios, agregaremos un parámetro llamado opcion de tipo @sys.number que nos indique el número de ejemplo que queremos ver y sera obligatorio (Riquiered)
Posteriormente seleccionamos la palabra numero y le asignamos el parámetro opcion en cada una de las frases de entrenamiento,para que de esta manera podamos acceder a el desde nuestro servicio en node
Como estamos usando el ejemplo anterior donde ya esta configurado el webhoook por lo que omitiré dicha parte, y solo les recordare que de deben habilitar el webhook en intento (Intent), y pasaremos directamente al código que debe correr en node.
Con el fin de facilitar las cosas vamos a declarar un variables por cada tipo de mensaje con su estructura básica, empezando por la respuesta principal que envía nuestra aplicación a nuestro agente en dialogflow
function respuestaMensaje(){
this.fulfillmentText = '';
this.fulfillmentMessages = [];
}
y una vez agregados los tipos de mensajes obtendríamos el siguiente código
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
El siguiente paso es identificar el ejemplo solicitado en nuestro servicio en node y construir el ejemplo solicitado y responder a nuestro agente. para ello nuestro programa empleara un switch que evalué las opciones y responda según sea el caso, veamos el siguiente código terminado para ver el funcionamiento.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Para probar el código recuerden correr el comando node app.js y tener en ejecución al aplicación de ngrok con el comando ngrok http 3000 recuerda que de ser necesario debes actualizar la url pública en el webhook del agente para que funcione correctamente.
si tienes duda en este ejemplo puedes ver la compilación y ejecución del código del ejemplo anterior
Si hemos hecho todo bien hasta este momento, deberíamos obtener resultados como los siguientes.
Ejemplo 1 (Text)
Ejemplo 3 (QuickReplies)
Ejemplo 4(Card)
En el caso de los mensajes enriquecidos que deban ser establecidos como ACTIONS_ON_GOOGLE debemos cambiar como nuestro agente nos muestra la respuesta default como en la siguiente imagen
De tal forma que obtendríamos un ejemplo como el siguiente
Como pueden ver los mensajes enriquecido en dialogflow abren una nueva posibilidad para el desarrollo de nuestros bot(s) ya que nos permiten una mayor interacción con el usuario, ya que podemos mostrarle opciones y esperar una respuesta generando una verdadera interacción. sin duda la profundización de este tema para otro post, donde podamos pedir que elija entre varias opciones y en base a su respuesta poder continuar con el proceso para lo que este diseña el bot.
También quiero terminar recordandoles que la información de diagnostico (DIAGNOSTIC INFO) es muy útil para encontrar problemas cuando empleamos webhook en nuestro agente.
Por ejemplo la siguiente pantalla nos muestra que la ejecución del webhook fue correcta
En el caso de que hubiese un problema con nuestro servicio en node, la comunicación entre nuestro agente y el servicio que estamos corriendo o algún otro error, nos mostraría un error en esta parte.
Ademas de ello podemos evaluar el mensaje que recibe nuestro agente en la pestaña de FULFILLMENT RESPONSE donde podremos ver el mensaje y si esta bien estructurado y la información que contiene
En este ejemplo solo he empleado dos tipos de respuestas, Default y ACTIONS_ON_GOOGLE para indicar la plataforma de destino donde se empleara la respuesta, la cual puede ser una de las siguiente:
PLATFORM_UNSPECIFIED
FACEBOOK
SLACK
TELEGRAM
KIK
SKYPE
LINE
VIBER
ACTIONS_ON_GOOGLE
GOOGLE_HANGOUTS
De tal manera que podemos enviar un mensaje enriquecido dependiendo de la plataforma donde este implementado nuestro bot.
Vamos a ver una introducción a dialogflow creando un bot para consultar el clima.
Quizás algunos ya conocen o han oído hablar de dialogflow, un servicio basado en la de nube desarrollado por Google que nos permite crear bot's de una manera rápida y sin necesidad de tener conocimientos avanzados en múltiples áreas.
La utilidad de un bot son varias, ya que podemos delegar las tareas repetitivas, predictivas y de poco valor para un proceso, por ejemplo, tomar un pedido, brindar información de horarios, agendar una cita, consulta de saldo, consultar el clima, etc.
Es aquí donde entra DialogFlow que nos permite llevar dicha tarea a cabo con relativa facilidad e implementarla en múltiples medios, pero no entrare en mucha teoría, y seré practico.
Bot para el clima
Vamos a DialoFlow console previo registro, así que si no lo has hecho, te invito a realizarlo.
Lo primero que vamos a realizar es crear un nuevo agente, en donde un agente es modulo de procesamiento de lenguaje natural (NLU), o dicho de otra forma, es la forma de agrupar un proyecto
En el menú del lado izquierdo desplegamos el menú y seleccionamos crear nuevo agente (Create new agent).
Posteriormente le asignamos un nombre y seleccionamos el idioma español, ya que es con que trabajara nuestro bot.
Intents
Una vez que hemos creado nuestro bot, vamos a ver los intentos (Intents), donde representa un dialogo en un conversación dentro de un ámbito especifico. normalmente un agente tiene varios Intentos que equivalen a probables respuestas para el usuario. y en base al dialogo del usuario, el agente intentara asignar el Intento adecuado.
Al crear nuestro agente, de manera automática nos creara dos Intentos, uno de bienvenida (Deafult Welcome Intent), y otro incomprensión (Default Fallback Intent), por ahora los dejaremos ya que nos serán de utilidad.
Veamos que tenemos hasta ahora, y como podemos ir probando el funcionamiento de nuestro bot.
En la parte superior derecha se encuentra una entrada "Try it now" en donde podemos escribir algo, y esperar la respuesta del agente basado en su configuración, y debajo de este nos mostrar información acerca de como interpreto la entrada del usuario.
Por ahora no podemos esperar mucho, más que algún saludo corto, el cual se encuentra predenterinado en el Intent Default Welcome Intent.
Ahora vamos a crear nuestro primer Intent, colocando en la sección de Intents, y seleccionemos Create Intent
Asignamos un nombre, y dejamos lo demás tal como esta, y guardamos cambios para poder continuar
El siguiente paso es entrenar nuestro agente con el Intent que acabamos de crear para que pueda entender como intentara el usuario expresar su petición, por lo cual debemos pensar de cuantas formas posibles el usuario nos pedirá información del clima, teniendo en cuenta que el objetivo para nuestro caso es proporcionar solo la temperatura y el condición del clima en general.
Algunas frases que puede emplear el usuario pueden ser las siguientes
¿Cómo esta el clima?
¿Cuál es el clima?
Como pueden darse cuenta, falta un elemento importante, que es lugar de donde queremos conocer el clima, por lo que necesitamos conocer el lugar, y en este caso lo manejaremos por ciudad. podemos agregar la siguientes frase de entrenamiento.
¿cuál es el clima enciudad?
¿Que ta tal el clima en ciudad?
Cómo va en el clima en ciudad?
Como ya se abran dado cuenta surge una variable, que es ciudad, la cual puede variar de solicitud en solicitud por cada usuario, y no solo eso, si no que esta debe ser real, y estar escrita correctamente.
Para manejar dicha situación nos apoyaremos de los parámetros que emplea nuestro Intent, y para ello vamos a la sección Action and Parameters donde vamos a crear un parámetro llamado Ciudad.
Llamaremos a este parámetro Ciudad, y en la sección de ENTITY seleccionaremos @sys.geo-city recuerda escribir el signo arroba para que despliegue la lista de opciones, también marcaremos la casilla REQUIRED, para indicar que el usuario debe indicar este parámetro para pode continuar.
Al indicar que este parámetro es requerido, en la sección de PROMPTS nos pedirá que definamos una frase que le indique al usuario que falta este parámetro.
Tendremos que hacer click en el mensaje Define prompts, donde escribiremos las frase(s) que le indicaran al usuario la necesidad de dicho parámetro.
Una vez hecho esto, nos aseguramos de guardar los cambios, recuerda que cada que se guarda un cambio, se mostrar un mensaje del lado inferior derecho indicando que se ha inicio el entrenamiento del agente con los nuevo cambios, esto no tardaría más de un par de segundos.
Con esto que acabamos de agregar, cada vez que el usuario pregunte por el clima, sin especificar la ciudad de interés, el agente nos preguntara cual la ciudad donde queremos conocer el clima; como lo muestra la siguiente imagen.
Una vez llegado a este punto, es necesario indicar dentro de las frase de entrenamiento, cual es texto que corresponde al parámetro deseado, para ello vamos a seleccionar la frase de interés dentro de nuestras frase de entrenamiento y aparecerá un menú emergente donde podemos especificar el tipo de dato y/o parámetro que representa.
En nuestro caso asignaremos en cada frase de entrenamiento del intento la palabra ciudad, el parámetro Ciudad de tipo @sys.geo-city
Hay un punto importante, es que cuando creamos nuestro parámetro y los asignamos a la(s) frases, podemos ver que se asina un nombre de variable, en nuestro caso $Ciudad es cual es muy útil, ya que podremos acceder a dicho valor a través de su nombre, ya sea dentro del mismo Intento e incluso dentro de otros.
Antes de poder probar el Intento de nuestro Agente, vamos a guardar los cambios, y agregar una respuesta a solicitud del usuario, hasta aquí sera una respuesta fija, para demostrar el resultado de lo que hemos construido hasta el momento.
Para ello, dentro del mismo intento, vamos a la sección de Responses y seleccionamos ADD RESPONSE
La frase que emplearemos es "La temperatura en $Ciudad es de 28°C"
Como se pueden dar cuenta aparece la variable $Ciudad, la cual sera sustituida por el parámetro que representa dicha variable, y mejor aún, ya que le hemos indicado al agente que es un tipo de dato City, el agente nos dará el nombre correcto.
Ya que es posible que el usuario escriba el nombre con o sin tilde, o una abreviación,el agente podrá reconocerlo y proporcionarnos el nombre correcto.
Guardamos cambios y vamos a comprobar el trabajo realizado, para ello vamos del lado izquierdo en parte de Try now, en mi caso escribiré Cual es el clima de Irapuato, uso el ejemplo de mi ciudad, pero puedes escribir cualquiera.
Y obtendremos la respuesta que le hemos indicado
Podemos ver que adicional a la respuesta a la solicitud del usuario, nos muestra en Intento que realizo la tarea, así como el parámetro extraído de la petición.
funcionara de igual manera si solicitamos el clima sin especificar la ciudad, el agente nos preguntara por la ciudad, y unas vez que sea indicada, nos brindara la respuesta que ya hemos configurado.
Consulta del clima real de las ciudades
Hasta ahora solo habíamos hechos peticiones al agente de cualquier ciudad valida, y obteníamos siempre una respuesta fija, previamente establecida por nosotros. Pero esto no es lo que buscamos de nuestro bot. por lo que que es momento de que se vuelva dinámico, y nos devuelva el clima real.
Para poder lograr nuestro objetivo es necesario emplear el servicio de un tercero, en este caso un servicio para consultar el clima mediante alguna API, para ello hay múltiples opciones que ofrecen dicho servicio. Donde he evaluado el servicio de openweathermap donde tuve problemas con los resultados, debido a que estos se tornaban imprecisos, quizás debido a que hay muchas ciudades comparten el mismo nombre.
Por ello decidí emplear el servicio de accuweather, donde puedo limitar los resultado a un país de manera fácil, así evitar inconvenientes en los resultados.
Accuweather al igual que muchos servicios ofrecen un versión gratis, pero limitada, es nuestro caso, esta restringido a 50 solicitudes por día, pero es más que suficiente para nuestro ejemplo.
Para poder continuar es necesario registrarnos e iniciar sesión en la plataforma, no daré ejemplo de ello, ya que es igual que el registro de cualquier otro servicio.
Ya estando registrado, debemos ir a la sección MY APPS, y crear una nueva APP que es la forma de Accuweather de gestionar los accesos a su API. Nos pedirá información del uso que le daremos, en ese punto pueden llenarla libremente.
Una vez hecho esto, consultamos al APP que acabamos de crear, donde nos mostrara el API Key necesario para poder consumir su API.
Webhook y Node.js
A este punto nuestro proyecto se vuelve más interesante, ya que es donde comienza a volver dinámico, debido a que podrá consultar el clima real de las ciudades gracias al servicio de clima en el que nos registramos.
Y para poder llevarlo acaba haremos uso de Webhooks y un servio web basado en Node.js, que bien puede ser cualquier otro entorno de desarrollo, tal como Phyton, pero que para nuestro ejemplo he decidido usar el primero debido a su relativa facilidad.
Un Webhook es manera comunicar y/o transmitir información mediante una solicitud POST. para ello Dialogflow requiere de una url publica(Internet) que maneje del puerto 443 (HTTPS). pero como no todos disponemos un servidor con una dirección pública, vamos a requerir de otro servicio que nos permita crear un túnel desde una dirección pública hacia nuestra computadora(localhost) donde tendremos nuestro servicio web recibiendo las peticiones de Dialogflow.
Para lograr crear este túnel utilizaremos el servicio de ngrok el cual nos permite crear dicho túnel de manera muy simple y sin complicaciones, y solo basta con registrarnos y descargar el ejecutable que nos proporciona.
Para entender mejor todo lo que acabamos de mencionar, vamos a ver el siguiente diagrama.
Como se puede apreciar en la imagen, el usuario realizar la petición a dialogflow, este la procesa y realiza una petición POST hacía la dirección pública que nos proporciona ngrok, quien a su vez la redirige hacia nuestro equipo localhost a través de un puerto valido que le especifiquemos y para poder atender acabo dicha solicitud consulta un servicio de clima, en nuestro caso accuweather y posterior a ello devuelve una respuesta al agente de dialogflow.
Hasta este momento ya tenemos configurado nuestro agente en dialogflow, ya contamos con nuestra cuenta en ngrok, también contamos con nuestra cuenta en accuweather, y solo nos falta montar nuestro servicio web con Node.js
Para ello nos vamos a apoyar de una editor de código muy bueno para esta tarea, Visual Studio Code el cual puedes descargar su última versión desde su página oficial completamente gratis, y por supuesto también sera necesario descargar e instalar nodejs, les recomiendo la versión LTS.
Es posible que después de instalar este software sea necesario reiniciar el equipo. Tampoco daré un ejemeplo de ello ya que es como muchos instaladores, siguiente, siguiente.
Vamos a comenzar abriendo Visual Studio Code y seleccionar una carpeta que sera donde desarrollaremos nuestro proyecto
Creamos la carpeta "bot_clima" donde sera nuestro directorio de trabajo
Ahora abrimos una terminal
y escribimos la siguiente linea
"npm init -y"
Esto no permitirá configurara nuestro proyecto.
Ahora necesitamos instalar un marco de trabajo para realizar nuestro desarrollo web, y emplearemos Node.js, existen muchos otros tanto para node, como para otros entornos de desarrollo, nosotros emplearemos Express.js para ello vamos a correr la siguiente linear para instalarlo en nuestro proyecto
npm install express --save
Debemos tener algo parecido como la siguiente imagen
vamos a agregar un archivo llamado app.js, basta con hacer clic en nuevo archivo o clic derecho sobre el directorio de trabajo.
vamos a agregar el siguiente código a nuestro archivo app.js
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Como puede ver es sumamente sencillo, solo incluimos Express, un método que atienda la peticiones post en la raíz de nuestra aplicación, y finalmente corremos nuestro servicio en el puerto 3000, puede ser cualquier puerto valido disponible en tu equipo.
Compilar código
Antes de continuar es muy importante probar que lo llevamos hasta el momento funcione correctamente, y para ello vamos a escribir en la consola de nuestro proyecto la siguiente linea.
node app.js
con esto estamos ejecutando nuestra aplicación, si no hay ningún problema o error, deberíamos ver algo así.
Ya vimos que nuestro proyecto se encuentra corriendo correctamente, pero también es necesario saber que nos responde nuestra aplicación, para ello hay que consultar en nuestro navegador la dirección localhost:3000, y nos mostrara lo siguiente.
Y nos marca error, esto debido a que nuestra aplicación responde a un método de tipo POST, y cuando realizamos una petición a través del navegador, realiza una petición GET, en nuestro caso lo dejaremos como esta, ya que el webhook del agente de dialogflow lo realiza mediante un método POST.
Si queremos ver como ser muestra en el navegador solo cambia en el código la palabra POST por GET o agrega una copia del método de tipo GET
Si bien es funcional, no resulta muy practico, para ello podemos disponer de una herramienta llamada Postman, la cual nos permite hacer peticiones de diferentes tipos.
Vamos a comprobar el resultado que nos da nuestra aplicación, mediante este software, solo escribimos nuestra dirección y el puerto con el que trabajamos indicando que es una petición POST
Como podemos ver, hemos obtenido el resultado que hemos programado, y podemos visualizarlo gracias este Software.
Lo que vamos hacer a continuación es que nuestra aplicación responda con una sencilla frase, al agente de dialogflow, para vamos a recurrir al software que previamente descargamos ngrok para crear un túnel de Internet hacia nuestro equipo (localhost), por comodidad voy hacerlo desde el mismo Visual Studio Code, pero puedes hacer de manera desde la consola de tu sistema operativo, por ejemplo el CMD de Windows.
Por default nos abre una terminal de power shell, así que vamos a teclear la palabra CMD, para emplear una consola de Windows.
Por comodidad he copiado el archivo "ngrok.exe" a la carpeta del proyecto, pero pueden tenerlo en cual quier ubicación, pero tendrán que escribir la ruta de acceso completa, o bien agregarlo al PATH.
para la primera vez que ejecutamos dicho software, hay que seguir la indicaciones de la documentación de ngrok
Posterior a ello, no sera necesario, y para crear el túnel corremos el siguiente comando
ngrok http 3000
El único inconveniente en manejar este comando desde Visual Studio Code es que no se puede detener la ejecución, lo cual se realiza con el atajo "Ctrl + C", por lo que es necesario cerrar la terminal y volver a ejecutar el comando
Hay que tener en cuenta que nuestro proyecto debe estar corriendo en node, y puedes cambiarte fácilmente de consola, simplemente seleccionándola del lado izquierdo del botón "+" .
para correr nuestra aplicación escribimos el siguiente comando
node app.js
Ahora, vamos a copiar la url completa, la que empieza con "https" hasta la terminación ".io"
Y vamos a la sección del Fulfillment en dialogflow y habilitar el webhook, y en la parte de la URL, copiamos la dirección que nos da ngrok.
Cabe mencionar, que la URL que nos proporciona ngrok cambia, cada vez que lo ejecutamos, de tal manera que cada que pierdas conexión, apagues tu equipo, o cierres la terminal, tendrás que actualizar dicho valor en el webhook de tu agente.
Y también debemos habilitar el webhook en el Intent deseado y para ello seleccionamos ENABLE FULFILLMENT que se encuentra dentro del Intento.
Y una vez habilitado seleccionamos Enable webhook call for this intent
Seguramente habrán notado, que agregue a la URL la terminación "/clima" esto con el fin de mostrar que no es necesario tener nuestro servicio en raíz, y por cual también sera necesario modificar el código para agregar es terminación.
Si quisiéramos probar nuestro agente, no obtendríamos ninguna respuesta, puesto que si bien, el agente enviara un petición hacia la URL que hemos especificado, no hemos programado como es que nuestro servicio debe procesar dicha información y, mucho menos como responderla.
Para llevarlo a cabo dicha tarea debemos poder interpretar la petición de nuestro agente y para poder llevar a cabo dicha tarea, vamos hacer un parse a la petición recibida a formato JSON para poder manejarla con facilidad, vamos emplear la API o librería; como prefieran llamarla de body-parser
Primero vamos a instalarlo con el siguiente comando desde de la consola de Visual Studio Code
npm install body-parser
Ahora vamos a agregar dicha librería a nuestro proyecto e indicar que debe hacer un parse a JSON al cuerpo de las peticiones que reciba.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Con esto nuestro agente podrá obtener respuesta desde el servicio que se encuentra corriendo en node desde nuestro equipo, pero antes hay indicarle que debe responder, veamos el siguiente código
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Recuerden guardar cambios y volver a correr su código.
Y hagamos una prueba desde nuestro agente, y debemos obtener la siguiente respuesta.
Como puede apreciar en el código hemos respondido con un objeto JSON a la solicitud de nuestro agente.
Y se preguntaran donde esta el parámetro, pues vamos a ver como podemos utilizarlo.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
También para facilitar la cosas más adelante, hemos creado un objeto tipo con formato JSON que utilizaremos más adelante para responde la petición del agente
varrespuestaWebhook = {
fulfillmentText:''
};
Vamos a probar los nuevos cambios realizados, consultando nuevamente el clima de la ciudad, ver como webhook responde con el parámetro recibo.
Hasta aquí todo bien, pero ya que tenemos todo lo necesario, ya podemos consultar el servicio de accuweather donde previamente nos registramos y obtuvimos nuestra app key, pero antes vamos a ver cual sera el diagrama de funcionamiento para entender mejor como sera el funcionamiento.
Como puede ver en el diagrama de flujo anterior, primero es necesario buscar la ciudad por su nombre para poder obtener su id, y ya con dicho id podemos buscar el clima de la ciudad especificada. esto se debe a que la forma en la que trabaja la API de accuweather es base al id de la ciudad, quizás esto se deba a que hay muchas ciudad que comparten nombre, pero esta es solo una conjetura propia.
Hay que tener en cuenta que al buscar por ciudad, y en caso de existir más de una con el mismo nombre, la API de accuweather nos devolverá todas ellas, sin embargo en este ejemplo siempre tomaremos la primera ciudad, para hacer comprensible este ejemplo, así que hay una oportunidad de mejora.
Para llevar acabo dichas consultas, de ciudad y climas necesitamos la URL de la API para llevar a cabo dicha tarea, en el caso de la búsqueda de la ciudad, emplearemos la siguiente
Donde la palabra mx es remplazada por el código de país a donde se limitara las búsqueda, en mi caso México(MX) para conocer su código de país deben consultar la siguiente dirección
Una vez que tenemos el código de la ciudad buscada, necesitamos buscar el clima de la ciudad en base al id obtenido, para ello empleamos la siguiente URL, donde 232870 es el id de mi ciudad en plataforma de accuweather
y casi para terminar, para llevar acabo dichas consultas necesitamos instalar el modulo request para node que es una versión simplificada para realizar solicitudes HTTP. para ello corremos el siguiente comando en la consola de Visual Studio Code
npm install request
no se olviden de guardar cambios y volver a ejecutar su código con node con simple comando node app.js
y nuestro código final quedaría de la siguiente manera
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Hay muchas mejoras que se pueden realizar a este código, pero como es solamente una introducción a dialogflow, no quise extender más el código.
Cabe señalar que una validación importante que no he agregado es cuando se alcanza el limite de peticiones hechas a la plataforma de accuweather, que son 50 en el plan gratis
Ahora probemos con otro ciudad
Como podemos comprobar hemos logrado nuestro objetivo consultar el clima mediante un bot, hay que recordad en el caso de las tildes los más probable es que tengamos problemas, ya que en la plataforma de accuweather no están registrados con ella, así que aquí otra gran oportunidad de mejora para quien quiera profundizar en el tema.
Dialogflow cuenta con una herramienta de diagnostico muy útil cuando estamos desarrollando bot's
y la podemos encontrar en la parte de pruebas
y nos puede mostrar información del webhook, su respuesta y estatus