El siguiente ejemplo muestra la creación de una aplicación sencilla de Alexa (Skill) con ayuda de ‘Alexa Developer Console’ y ‘AWS Lambda’.

Consola de Desarrollador de Alexa

La ‘Alexa Developer Console’ nos ayuda a crear el denominado ‘Interaction Model’. Este modelo sirve para describir la aplicación deseada y definir las frases y parámetros a los que Alexa debería responder más adelante. La programación de la lógica NO se realiza en la Developer Console, sino en AWS Lambda.

El ‘Interaction Model’ se compone para una aplicación sencilla de la siguiente manera:

InvocationEn los Skills creados manualmente ocurre que primero se debe decir el nombre de la aplicación, p. ej. “Alexa, inicia ’nombre de la aplicación’”. ‘Invocation’ se refiere a ese nombre.
Intents, Samples & SlotsIntents Alexa ofrece determinadas funciones como p. ej. AMAZON.StopIntent. Esta función se invoca cuando el usuario dice “Alexa, Stop”. Además de los Intents existentes, también podemos definir funciones propias que reaccionen a frases específicas que hayamos definido anteriormente. Samples Las frases definidas anteriormente que llevan a una llamada de función se denominan Samples o ‘Sample Utterances’, p. ej. ante la frase “Ich heisse Aaron” se puede invocar una función que luego me salude por mi nombre. Slots Las frases definidas anteriormente son estáticas. Los Slots sirven para reemplazar pasajes dentro de las frases estáticas de forma dinámica, es decir, con un marcador de posición, p. ej. “Ich heiße {name}”.
Slot TypesCada Slot es de un tipo determinado, p. ej. AMAZON.FIRST_NAME, AMAZON.Room, etc.

El ‘Interaction Model’ mencionado arriba puede configurarse en el lado izquierdo:

En el lado derecho hay una casilla de verificación que nos indica en todo momento si ya hemos completado todas las características de la aplicación, p. ej. la creación de un ‘Intent’, etc.

Una vez que el ‘Interaction Model’ esté correctamente completado, los marcadores correspondientes se volverán verdes:

Creación de una aplicación

Creación del Skill

Nombre de la aplicación, idioma y selección de una aplicación ‘Custom’:

La aplicación debe iniciarse con “Alexa, starte begrüße mich”:

A continuación indicamos el nombre de la función que se invocará con ‘begrüße mich’:

Llamo a la función que se implementará más adelante ‘begruesseMich’:

La función deseada se mostrará luego en el lado izquierdo:

Dado que la aplicación primero me preguntará mi nombre y debe reaccionar a una respuesta, en el lado derecho podemos especificar los diferentes tipos de respuesta, d.h. en este caso la aplicación espera estas respuestas.

A continuación, debemos compilar la aplicación:

Antes de configurar la última sección (Endpoints), veamos cómo tiene lugar la comunicación ‘high level’:

AWS Lambda

Lambda es un producto de la familia Amazon Web Services (AWS) y nos ofrece, entre otras cosas, la posibilidad de escribir y ejecutar las funciones deseadas mediante un IDE web. La ejecución se produce mediante un trigger, p. ej. por el Alexa Skill.

Una función Lambda se crea de la siguiente manera:

Tras iniciar Lambda podemos crear una nueva función de la siguiente forma. Como región hay que seleccionar ‘N.Virginia’.

A continuación se pueden definir más detalles de la función, p. ej. el nombre de la función y el lenguaje de programación deseado.

En el siguiente paso indicamos a la función qué la debe invocar. En nuestro caso queremos que Alexa invoque la función (Trigger).

Más abajo podemos, mediante un ID, restringir la invocación a una aplicación concreta. Es decir, solo la aplicación con el ID aquí registrado puede invocar esta función.

El Qualifikations-ID o Skill ID la encontramos dentro de la ‘Alexa Developer Console’:

Además, hay que indicar bajo ‘Default Region’ qué Function, en qué región, es responsable del procesamiento. La ID de ‘Default Region’ la obtenemos en el siguiente lugar:

En el último paso se puede compilar el Skill. Para ello basta con seleccionar ‘Build Model’:

Dentro de Lambda, al seleccionar la función ‘begruesseMich’, obtenemos acceso al IDE web. Gracias a que previamente hemos usado la plantilla ‘‘alexa-skill-kit-sdk-factskill’’, ya se han importado todas las bibliotecas necesarias:

La función se estructura de la siguiente manera:

A continuación, la aplicación puede probarse en línea bajo ‘Test’:

Ejemplo práctico

En este ejemplo quiero pedirle a la plataforma Cumulocity IoT que cambie la temperatura de un dispositivo.

var unirest = require(‘unirest’);

unirest.post(‘http://tenant.cumulocity.com/measurement/measurements/').headers({ ‘Accept’ : ‘application/vnd.com.nsn.cumulocity.measurement+json’, ‘Content-Type’ : ‘application/json’, ‘Authorization’ : ‘Basic WEY………………….FyISEy’ }).send({ “c8y_TemperatureMeasurement”: { “T”: { “value”: 10, “unit”: “C” } }, “time”:“2013-06-22T17:03:14.000+02:00”, “source”: { “id”:“4473883” }, “type”: “c8y_TemperatureMeasurement” }).end(function(response) { console.log(response.body); });

Como se puede ver aquí, quiero utilizar para mi propósito la librería externa ‘Unirest’.

Para usar la biblioteca dentro de AWS Lambda, hay que proceder de la siguiente forma:

  1. Instalar localmente las bibliotecas necesarias
  2. Ajustar el código (index.js)
  3. Empaquetar el código y las libs como *.zip
  4. Subir el archivo *.zip (función). Al subir, se reemplazan la función y todas las bibliotecas existentes. Por lo tanto, también debemos subir las bibliotecas.

La instalación de los paquetes se realiza de la siguiente manera:

  • npm install alexa-sdk
  • npm install unirest

Después de instalar los paquetes npm, las dependencias deseadas se encuentran en la carpeta ’nodes_modules’.

Sin embargo, debido a la importación de las dos bibliotecas externas, el paquete de despliegue es tan grande que ya no se puede usar el IDE, por lo que a partir de ese momento trabajaré con un IDE independiente.

Antes de importar el script y las dependencias a AWS Lambda, probaremos el código localmente una vez.

Como la ejecución local funcionó, podemos comprimir una vez el contenido de la carpeta:

La subida del archivo *.zip la podemos hacer más fácilmente con la AWS-CLI.

Tras instalar la CLI, hay que crear un usuario IAM en la página siguiente de la siguiente forma, véase instrucciones.

Antes de la subida, la AWS CLI debe configurarse con el comando ‘aws configure’:

Ahora podemos empezar la subida de la siguiente manera. Como se puede ver, aquí se indica el nombre de la función (c8y-device-temperature).

aws lambda update-function-code –function-name c8y-device-temperature –zip-file fileb://cumulocity.zip

Ahora se puede ejecutar el código vía Alexa:

index.js Ejemplo.

‘use strict’; const Alexa = require(‘alexa-sdk’); const APP_ID = ‘xxxxxxx’;

const handlers = { ‘LaunchRequest’: function () { this.response.speak(“Gewünschte Temperatur?”).listen(“value”); this.emit(":responseReady"); }, ‘cumulocity’: function () { var temperature = this.event.request.intent.slots.grad.value; this.response.speak(ok ${temperature}); setTemperature(parseInt(temperature,10)); this.emit(":responseReady"); }, };

function setTemperature(temperature) { var unirest = require(‘unirest’);

unirest.post(‘http://xxxxxxx.cumulocity.com/measurement/measurements/').headers({ ‘Accept’ : ‘application/vnd.com.nsn.cumulocity.measurement+json’, ‘Content-Type’ : ‘application/json’, ‘Authorization’ : ‘Basic xxxxxxx’ }).send({ “c8y_TemperatureMeasurement”: { “T”: { “value”: temperature, “unit”: “C” } }, “time”:“2013-06-22T17:03:14.000+02:00”, “source”: { “id”:“5499151” }, “type”: “c8y_TemperatureMeasurement” }).end(function(response) { console.log(response.body); }); }

exports.handler = function (event, context, callback) { const alexa = Alexa.handler(event, context, callback); alexa.APP_ID = APP_ID; alexa.registerHandlers(handlers); alexa.execute(); };