Dynamic Entities en Alexa

Aprende a utilizar Dynamic Entities para darle una mayor personalización a tus skills.

Javi Mora Díaz
Sonara
5 min readJun 4, 2020

--

Hoy os quiero hablar sobre otra forma de darle una mayor personalización a vuestra Skill de Alexa. La mayoría de vosotros si habéis desarrollado skills sabéis lo que son los Custom Slots, dentro de Alexa disponemos de muchos tipos de slots predefinidos, estos slots son variables dentro de una frase, por ejemplo:

Dime si va a llover mañana

Esta variable un desarrollador de Alexa lo ve así

Dime si va a llover {{tiempo}}

Tiempo sería un slot de tipo de tipo fecha, en concreto Amazon.DATE. Hay un gran número de slots predefinidos que podéis consultar en la guía oficial. Pero, ¿Qué ocurre si no existe el tipo de slot que necesito?.

Caso práctico

Para poder explicaros los custom slots os pondré un caso práctico, hace mucho tiempo desarrollé una Skill muy sencilla con la única finalidad de aprender, se llama Teléfono de interés.

Esta Skill es muy simple, le preguntas un teléfono que sea de interés, policía, bomberos, etc. y te lo dice. Para identificar la petición fue necesario crear un custom slot para los posibles teléfonos que pedirían los usuarios. Os pongo un ejemplo de frase:

Dame el número de los bomberos

En nuestro caso la variable es bomberos por lo que nos creamos una custom slot:

Dame el número de los {{phone_slot}}

En phone_slot tendremos todos los teléfonos que podrá ofrecer la Skill.

  • Policía Local Barcelona
  • Protección Civil
  • Guardia Civil
  • Bomberos
  • etc…

Al inicio esta Skill fue mas o menos bien recibida, pero no la volví a actualizar y ofrece el mismo contenido que el primer día. ¿Qué ocurre? que cada vez hay más usuarios de Alexa, usuarios que viven en distintas zonas de España. Una persona que vive en Huelva no necesita el teléfono de la Generalitat, necesitará el teléfono de la Junta de Andalucía.

En este caso podéis pensar, ¿qué importa si tenemos el número de la Generalitat y el de la Junta de Andalucía? pues la verdad es que no importa, pero ¿qué pasa si el teléfono de bomberos en tu ciudad es uno y en la mía es otra? un ejemplo claro es el teléfono del COVID-19 que en cada zona tenía su propio número de teléfono.

Para estos casos existen las Dynamic Entities, vamos a modificar la Skill para obtener la dirección del usuario y de esta manera poder ofrecer información válida para su región, es decir, para un usuario de Huelva cargaremos los slots correspondientes a su provincia, al igual que para un usuario de Madrid, Barcelona, etc.

Obtener dirección del usuario

Lo primero es obtener la información del usuario, para eso lo primero que debemos hacer es irnos a PERMISSIONS y seleccionar la casilla de Country/Region & Postal Code Only para nuestro ejemplo únicamente necesitaremos el código postal, aunque podríamos hacerlo con la ciudad, region, etc, e incluso geolocalizando el dispositivo como os expliqué en un post anterior Localización con Alexa. Dado que no todos los dispositivos disponen de GPS usaremos la información del usuario.

Otra opción es a través del manifest (Skill.json) si estáis usando ask-cli, añadiendo el siguiente permiso.

"permissions": [
{
"name":"alexa:devices:all:address:country_and_postal_code:read"
}
],

Ahora debemos obtener la dirección en nuestra lambda, en nuestro caso queremos cargar las Dynamic Entities nada mas iniciar la Skill, por lo que debemos obtener la dirección en el LaunchRequestHandler que se ejecuta nada más iniciarla.

Para obtener la dirección del dispositivo que invoca la Skill lo primero es modificar nuestro builder:

hemos añadido en la línea 9 la opción withApiClient, que nos permitirá hacer llamadas a la API de Alexa desde nuestra Skill.

Debemos asegurarnos que tenemos configurada la dirección en el dispositivo que vamos a usar así como los permisos aceptados para nuestra Skill. Si lo tenemos todo listo solo nos queda obtener la dirección:

Cada vez que iniciemos la Skill obtendremos la dirección del usuario con la siguiente estructura:

{
addressLine1”: “Calle Alexa 123”,
addressLine2”: null,
addressLine3”: null,
city”: “L’Hospitalet de Llobregat”,
stateOrRegion”: “Barcelona”,
districtOrCounty”: null,
countryCode”: “ES”,
postalCode”: “12345”
}

Para nosotros es relevante el campo stateOrRegion de esta manera podemos distinguir perfectamente los teléfonos entre regiones.

Replace Dynamic Entities

Ahora que podemos situar a la persona que invoca la Skill, cargaremos las Dynamic Entities con los teléfonos de su región. En este caso haremos el ejemplo del Covid. Una persona que llama desde Barcelona deberá llamar al 061, mientras una persona que llama desde Huelva llamará desde el 900 400 061 ó el 955 545 060.

Para identificarlos, los slots serán idénticos pero modificaremos su ID de forma que podamos diferenciarlos uno de otro, de cara al usuario no influirá ya que lo invocará de la misma forma, pero obtendrá un resultado u otro dependiendo de dónde esté.

El ID de una de las entidades es CVB mientras que el otro es CVH, pero podremos invocarlos de la misma forma. Ahora simplemente basta con que podamos diferenciar según los ID que hemos creado y podremos usar las Dynamic Entities en nuestra Skill.

Un ejemplo sería:

if(slotID === 'CVB') {
phone = "061";
} else if(slotID === 'CVH') {
phone = "900 400 061";
}

Las Dynamic Entities persisten durante al menos 30 minutos, mas de lo que dura la sesión, por lo que una buena práctica sería “limpiar” las Dynamic Entities antes de cerrar la sesión con la siguiente:

“directives”: [
{
“type”: “Dialog.UpdateDynamicEntities”,
“updateBehavior”: “CLEAR
}
]

En nuestro caso no sería necesario ya que no es común que la persona cambie su dirección física, pero sí es una buena práctica recomendable.

--

--