Este articulo se puede leer en castellano aqui
This alexa skill is accessible at https://www.amazon.es/dp/B09PHW45PS
The objective of this skill is to have next public transports for Bilbao and its surrounding area. Now, it supports lines 1, 2 and 3 of Metro Bilbao .
The interaction with the user is voice based in spanish language:
alexa pidele a transporte bilbao los siguientes metros de matiko a algorta
And if you own a display alexa element such us alexa show , you will get the information also in a graphical card
Python endpoint
Its arquitecture is quite simple, in this case , by the moment it does not support favourite journeys so it is only 2 dockers based, an nginx and a python containers running on the VPS. It is the green block of this diagram, the blue one is common for many other diagrams and its explanation can be seen here
The docker-compose recipe can be seen here, it is interesting the volume used for sharing timezone between host and container, since it is critical for being able to query transport APIs with correct time:
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
The dockerfile used for building flask image is this one:
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
In this case flask-ask library is used. I forked this library into my repository because I needed to change its behaviour and answer with a 400 Bad Request code when requests are not signed by Alexa . This was mandatory in order to be able to publish this skill into Alexa skills store.
Main Nginx container (the one in blue block) will be responsible of handling the HTTPs keys and certificates so we do not need to worry about this and the nginx configuration file is quite simple:
server {
listen 80;
server_name metro.davidestebanmunoz.com;
location / {
proxy_pass http://flaskapp_metro:5001;
proxy_set_header Host "localhost";
} }
metro.davidestebanmunoz is a A type register in DNS.
Alexa skill
This skill has one intent with 3 slots, “transporte” that for now can be “metro/s” and “tren/es” and “origen” and “destino” that are the stations.
The stations are coded so every information (type of transport operator, line and code for external API) can be extracted from value so no other external DB is needed. Also, using synonims, spanish pronunciation of basque toponims is solved.
Finnally the endpoint of the skill is configured to call https://metro.davidestebanmunoz.com
- Type: Alexa Skill
- Where: Docker on VPS
- Languages and technologies used: Python, flask, Alexa, DNS
- Github repo: no
[…] This article can be read in english here […]