Skill Alexa Transporte Bilbao

This article can be read in english here

Esta skill de alexa es accessible en https://www.amazon.es/dp/B09PHW45PS

El objetivo de esta skill es tener información sobre los siguientes transportes públicos de Bilbao y su area alrededor. Actualmente soporta las líneas 1 2 y 3 de Metro Bilbao, asi como la linea del txorierri de euskotren.

La interacción con el usuario está basada en comandos de voz en castellano:

alexa pidele a transporte bilbao los siguientes metros de matiko a algorta

Yi tienes un alexa echo show o dispositivo similar, con pantalla, puedes obtener la información de forma gráfica

Python endpoint

Su arquitectura es muy simple, en este caso, por el momento, no soporta guardar nuestros recorridos favoritos por lo que solamente está basado en 2 contenedores docker. Un contenedor nginx y un contenedor Python que corren en el VPS. Son el bloque verde de este diagrama, el bloque azul es común a muchos otros diagramas y su explicación se puede ver aqui.

La receta de docker compose se puede ver aqui, conviene recalcar el uso del volumen para compartir zona horaria entre el host y el contenedor, ya que es critico para llamar a las APIs con la hora correcta:

version: '3'
services:
    flaskapp_metro:
        build:
            context: ./
            dockerfile: Dockerfile_flask
        image: flask:0.0.1
        container_name: flaskapp_metro
        volumes:
            - "/home/ubuntu/dockers/metro_alexa/data/scripts:/code/"
            - /etc/localtime:/etc/localtime:ro
        environment:
            - FLASK_APP=/code/metrobot_alexa.py
        command: python /code/metrobot_alexa.py
        networks:
            - alexa_metro
    nginx_metro:
        image: nginx
        depends_on:
          - flaskapp_metro
        container_name: nginx_metro
        networks:
          - proxy_nginx-proxy
          - alexa_metro
        environment:
            - VIRTUAL_HOST=metro.davidestebanmunoz.com
            - LETSENCRYPT_HOST=metro.davidestebanmunoz.com
        volumes:
            - "/home/ubuntu/dockers/metro_alexa/data/nginx/etc_nginx:/etc/nginx"
networks:
    alexa_metro:
    proxy_nginx-proxy:
        external: true 

El dockerfile utilizado para construir la imagen flask es este:

FROM python:3.8-slim
ENV LANG en_US.UTF-8
ENV LANGUAGE en_US:en
ENV LC_ALL en_US.UTF-8

RUN apt-get update && apt-get upgrade -y
RUN apt install -y gcc libssl-dev
RUN pip install https://github.com/botmakerdvd/flask-ask/archive/refs/heads/master.zip
RUN apt remove -y gcc libssl-dev
RUN apt autoremove -y

Tal y como se observa, se utiliza la libreria flask-ask. He «forkeado» esta libreria en mi repositorio, porque he necesitado cambiar su comportamiento y devolver una respuesta con código 400 (Bad request) cuando las peticiones no han sido firmadas por Alexa. Esto ha sido un requisito obligatorio para poder publicar esta skill en la tienda de skills de Alexa.

El contenedor Nginx principal (el que aparece en el bloque azul) será el responsable de manejar las claves privadas y certificados relacionados con el HTTPs por lo que no nos tenemos que preocupar de ello. Por ello el fichero de configuración de Nginx es muy simple:

server {
  listen 80;
  server_name metro.davidestebanmunoz.com;
  location / {
  proxy_pass http://flaskapp_metro:5001;
  proxy_set_header Host "localhost";
  } }

metro.davidestebanmunoz es un registro tipo A en el DNS.

Alexa skill

Esta skill tiene un intent con 3 slots. «transporte» que por ahora puede ser «metro/s» o «tren/es» y «origen» y «destino» que son las estaciones.

Las estaciones han sido codificadas para que toda la información necesaria (tipo de transporte, línea, y código para las APIs externas) se pueda extraer del valor de la estación y de esa manera no necesitar ninguna base de datos externa. Asimismo, utilizando sinonimos se resuelve la problemática de la pronunciación en castellano de las estaciones con topónimo en euskera.

Finalmente, el endpoint de la skill se configura para que llame a https://metro.davidestebanmunoz.com

  • Tipo: Skill Alexa
  • Ubicación: Docker en VPS
  • Lenguajes y tecnologías usados: Python, flask, Alexa, DNS
  • Github repo: no

Sé el primero en comentar

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *