Control de TV con skill alexa

This article can be read in english here

Hace 4 años me regalaron una «smart» TV de la marca Telefunken como esta

Como uno es inquieto y no sabe tener un dispositivo IOT en casa sin por lo menos abrirle un nmap, haciendo un poquito de “hacking” sobre él, descubrí que era una TV «re nombrada» a partir de una TV Vestel y que utilizaba un Linux como sistema operativo.
Además, descubrí que se podía controlar utilizando esta Android APP:

Este año, me regalaron un dispositivo Alexa Echo Dot por mi cumpleaños e intenté controlar todos los elementos IOT de mi casa mediante la voz.

Utilizando Fiddler(podía haber usado Burp también) como proxy para la app Vestel, y haciendo un poquito de ingenieria inversa, fui capaz de replicar los comandos enviados por la app mediante scripts de Python.

Finalmente, utilizando la librería Flask-Ask para Python, la cual he forkeado aqui , generé una skill privada de Alexa, que me permite controlar mi TV utilizando mi voz.

Codigo Python

El código de esta skill es público y está disponible a través de éste repositorio. Tal y como se puede ver, se lanza en background utilizando un servicio systemd.

Las acciones y los nombres de los canales se han introducido en listas, se pueden observar 3 canales especiales, TDT que configura la TV para ver canales DVB-T , Kodi, que configura la TV para usar como input el HDMI donde está la raspberry conectada , y Satelite, el cual cambia el input de la TV al HDMI donde hay un receptor de DVB-S2.

De igual modo, los códigos de canal y las teclas del mando a distancia, se han introducido en un diccionario.

La ejecución de comandos sobre la TV o el cambio de canal, primero realizan un proceso de descubrimiento, durante el cual, la skill haciendo uso del protocolo SSDP obtiene la IP y puerto de la TV.

Tal y como se ouede observar, hay otro «handler» para «intentluz», esto es debido a que corro este stript en una Raspberry PI que haciendo uso de Hyperion, genera un efecto ambilight con cualquier elemento que se reproduzca a través de la raspberry o del receptor satélite.

Por último remarcar que en la raspberry hay un servicio nginx corriendo que maneja la capa TLS de HTTPs y redirige las peticiones al puerto 5000 donde el framework de flask espera las conexiones.

  server { 
  listen 443 ssl; 
  server_name <DDNS host>; 
  ssl_certificate <Generated public key> ;
  ssl_certificate_key <Generated private key> ;
  ssl_protocols TLSv1.2; ssl_ciphers HIGH:!aNULL:!eNULL:!EXPORT:!CAMELLIA:!DES:!MD5:!PSK:!RC4; 
  ssl_prefer_server_ciphers on; 
  location / { 
	  proxy_pass http://127.0.0.1:5000/; 
	  proxy_http_version 1.1; 
	  proxy_set_header Upgrade $http_upgrade; 
	  proxy_set_header Connection ‘upgrade’; 
	  proxy_set_header Host $host; 
	  proxy_cache_bypass $http_upgrade; 
	  proxy_read_timeout 120s; 
	} 
  }

Skill Alexa

He usado “la tele” como nombre de invocación de la skill porque de esta manera se convierte en un diálogo natural el mandarle comandos a mi TV:

“Alexa dile a la tele que suba el volumen”

He creado 2 intents, uno para controlar el hyperion, y el otro para los comandos de la TV y cambio de canal.

He creado 4 sample utterances y 2 intent slots ( cada 1 con un tipo de slot) para la intent TV. Uno de los slots es para las acciones, y el otro para los canales.

Nota: los «value» de los slot deben coincidir con los elementos en las listas del script de Python. Se pueden usar los sinónimos para hacer coincidir los elementos con las resoluciones de nombre de Alexa.

Una vez que esto está configurado, un elemento crítico es que debemos configurar el Endpoint de la skill para que apunte a nuestro host DDNS. Un par de clave pública / clave privada debe ser generado y el certificado debe ser subido a la consola de alexa.

Dado que no vamos a publicar nuestra skill, claves autogeneradas y autofirmadas son válidas.

Respecto a la privacidad y la protección, si no publicamos nuestra skill Alexa, únicamente nuestros dispositivos podrán acceder a ella.

  • Tipo: Alexa Skill
  • Donde: Raspberry pi 4 B
  • Lenguajes y tecnologías utilizadas: Python, flask, Alexa
  • Github repo: Si

3 Comments

Deja una respuesta

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