Alexa -> Homeassistant -> FireTV stick (basic)

¿Quieres compartir algo con la gente sobre tus configuraciones de Alexa? Este es tu lugar
Responder
karasu
Mensajes: 4
Registrado: Vie Dic 14, 2018 7:56 am

Alexa -> Homeassistant -> FireTV stick (basic)

Mensaje por karasu » Lun Dic 17, 2018 1:27 pm

Hola,

He conseguido integrar el firetv stick basic con homeassistant y a su vez con Alexa, mediante una chapuza, que es usar el fire stick en modo debug y enviarle comandos con adb (Android Debug Bridge). La integración Alexa->homeassistant la he hecho con una skill propia (configuré haaska pero no entiendo cómo debo dar órdenes). Lo que hace mi skill es llamar a un script de homeassistant mediante la API REST. La integración homeassistant->firetv es también con REST a un servicio propio hecho con python, que transforma esa url a un comando adb. De momento sólo activo el firetv (es decir, aunque esté apagado o con el salvapantallas se activa) y abro la aplicación (netflix, movistar, prime video, ....)

Total, que puedo decir cosas como : "Alexa, abre netflix con firetv" o bien "Alexa, pregunta a firetv que abra netflix".

Me enciende la tele, activa el firetv y carga la app. :mrgreen:

Creo que es un follón sólo para conseguir esto, pero mira, me empeñé y al final ha funcionado. :lol:

Si interesa, cuando tenga tiempo lo escribo todo.

eduardo
Site Admin
Mensajes: 94
Registrado: Mié Dic 12, 2018 1:09 am

Re: Alexa -> Homeassistant -> FireTV stick (basic)

Mensaje por eduardo » Lun Dic 17, 2018 1:32 pm

Si quieres, se puede hacer tutorial y se publica en la web :)
--
Fundador y miembro activo de la comunidad de domoticaencasa.es ! :D

karasu
Mensajes: 4
Registrado: Vie Dic 14, 2018 7:56 am

Re: Alexa -> Homeassistant -> FireTV stick (basic)

Mensaje por karasu » Lun Dic 17, 2018 5:31 pm

OK! Lo intento :D

Por favor, si lo encuentras interesante modifícalo como quieras y publícalo sin ningún problema (disculpa también las faltas de ortografía).

Para configurar Alexa+HomeAssistant+Firetvstick (tal y como lo he hecho yo, dividiré la explicación en tres partes).

PARTE I - Configurar FireTV Stick

- Debemos activar el modo debug en el Firetv. Atención, esto permite a cualquier usuario de nuestra red controlar nuestro firetv. No activar si estaís en una red pública (por ejemplo, en un hotel).

Debemos ir a configuración->mi firetv->Opciones de desarrollador->ADB Debugging

- En el ordenador/raspberry/nas donde tenemos el home-assistant, deberemos instalar el puente adb. Esto dependerá de la distribución Linux que estemos usando. En debian seria:

Código: Seleccionar todo

sudo apt-get install adb
- Ahora, debemos configurar un servidor REST que hará de puente entre home-assistant y el firetv. Para ello podemos utilizar un script en python3 con la librería flask. Os pongo el código. Fijaros que se debe poner la dirección IP correcta de vuestro FireTV (se puede encontrar en el menú de ajustes del firetv). Aquí como ejemplo he dejado la 192.168.1.3 que se debe cambiar por la vuestra.

El fichero lo guardaremos en la raspberry (u otro dispositivo) donde tengamos nuestro homeassistant. Recordad instalar la librería flask. Por ejemplo, en debian seria:

Código: Seleccionar todo

sudo apt-get install python3-flask
Editamos el fichero:

Código: Seleccionar todo

 sudo nano /usr/local/bin/firetv-rest-server.py
Y el contenido:

Código: Seleccionar todo

#!/usr/bin/python

import subprocess

from flask import Flask

app = Flask(__name__)


def connect_firetv(firetv_ip='192.168.1.3'):
    """ Connect to firetv in debug mode """
    cmd = ['adb', 'connect', firetv_ip]
    subprocess.call(cmd)


def awake_firetv():
    """ Awake firetv """
    cmd = ['adb', 'shell', 'input', 'keyevent']
    
    # KEYCODE_WAKEUP
    subprocess.call(cmd + ['224'])

    # UNLOCK SCREEN
    subprocess.call(cmd + ['82'])


@app.route('/<application>')
def run_app(application):
    """ Run app in firetv basic stick using android debugger """

    apps = {
        'netflix': 'com.netflix.ninja/.MainActivity',
        'prime': 'com.amazon.amazonvideo.livingroom.firetv/com.amazon.ignition.FireOsIgnitionActivity',
        'kodi': 'org.xbmc.kodi/.Splash',
        'movistar': 'com.movistarplus.androidtv/.MainActivity'
    }

    cmd = ['/usr/bin/adb', 'shell', 'am', 'start', '-n']

    myapp = apps.get(application, None)

    if myapp:
        connect_firetv()
        awake_firetv()
        cmd = ['/usr/bin/adb', 'shell', 'am', 'start', '-n', myapp]
        subprocess.call(cmd)
        return "{} opened".format(application)
    else:
        return "Unknown application"
- Para mantener el servidor, podríamos utilizar directamente el servidor de pruebas de flask, pero si queremos darle un toque más profesional, podemos usar gunicorn. Instalamos gunicorn con

Código: Seleccionar todo

sudo apt-get install gunicorn3
Vamos donde hemos guardado el código:

Código: Seleccionar todo

cd /usr/local/bin
Y ya podemos ejecutar nuestro servidor:

Código: Seleccionar todo

gunicorn -w 4 -b 127.0.0.1:4000 firetv_rest_server:app &
Fijaros que sólo permitimos conexiones en local, esto es, de nuestro home-assistant a si mismo. Lo hacemos por el puerto 4000, pero si lo tenéis ocupado podeís seleccionar otro a vuestro gusto.

TEST PARTE 1:

Para comprobar que hasta ahora funciona todo correctamente:

Código: Seleccionar todo

curl -X POST -H "Content-Type: application/json" http://127.0.0.1:4000/netflix
Debería encender netflix en vuestro televisor (éste debe estar encendido).

Alerta, en la primera prueba el firetv os pedirá una confirmación por la tele de que permitís la conexión desde el ordenador de homeassistant. Confirmad seleccionando también el checkbox para que no os la vuelva a pedir.

P.D. Como se puede ver es un pelín complicado. Y todavía quedan dos partes... :(

karasu
Mensajes: 4
Registrado: Vie Dic 14, 2018 7:56 am

Re: Alexa -> Homeassistant -> FireTV stick (basic)

Mensaje por karasu » Lun Dic 17, 2018 6:13 pm

PARTE 2: COMUNICAR HOME-ASSISTANT CON EL SERVIDOR REST PROPIO

Esta parte se debería optimizar, pero mis conocimientos de home-assistant son muy limitados. Crearemos un script por aplicación (estoy convencido que con templates se debería poder hacer todo en un solo script....).

Como tengo un interruptor en la tv, aprovecho a encender la tv y después enviar la orden de abrir la aplicación a nuestro servicio REST

En scripts.yaml:

Código: Seleccionar todo

netflix:
  sequence:
    - service: switch.turn_on
      data:
        entity_id: switch.tv
    - service: rest_command.firetv
      data:
        application: "netflix"

prime:
  sequence:
    - service: switch.turn_on
      data:
        entity_id: switch.tv
    - service: rest_command.firetv
      data:
        application: "prime"

movistar:
  sequence:
    - service: switch.turn_on
      data:
        entity_id: switch.tv
    - service: rest_command.firetv
      data:
        application: "movistar"

Y en configuration.yaml:

Código: Seleccionar todo

rest_command:
  firetv:
    url: "http://127.0.0.1:4000/{{ application }}"
TEST PARTE 2:
Reiniciando nuestro home assistant, deberíamos tener disponibles los nuevos scripts que deberían encender la tv (si la tenemos conectada a un enchufe inteligente) y arrancar la aplicación seleccionada.
Última edición por karasu el Jue Dic 20, 2018 12:47 pm, editado 1 vez en total.

amiguelezg
Mensajes: 6
Registrado: Mar Dic 18, 2018 11:22 pm

Re: Alexa -> Homeassistant -> FireTV stick (basic)

Mensaje por amiguelezg » Mar Dic 18, 2018 11:23 pm

Me llega mañana el FireTV stick ...ya tengo el fin de semana con que entretenerme...a ver si logro seguir el tutorial

karasu
Mensajes: 4
Registrado: Vie Dic 14, 2018 7:56 am

Re: Alexa -> Homeassistant -> FireTV stick (basic)

Mensaje por karasu » Lun Dic 24, 2018 10:39 pm

Saludos,

Por si es de ayuda, he subido los ficheros a github:

https://github.com/karasu/firetv-basic

En cuanto pueda añadiré el tercer paso, de como crear una skill para que Alexa se pueda comunicar con la API REST de homeassistant.

Feliz Navidad!

Responder