Home Assistant: Domótica fácil

Tras un tiempo probando automatizaciones con IFTTT y Switchur en casa, me he dado cuenta que se me quedaba algo corto, que complicaba mucho el mantenimiento de estados entre ambos sistemas basado en WebHooks en ambos sentidos y que debía haber sistemas mejores. Además, IFTTT ha pasado a un modelo de pago en el que la opción gratuita ofrece un sistema tan capado que no parece muy usable, aunque yo había pasado ya a uno de los planes de pago.

Vista la situación, primero pensé en desarrollarme algo ad-hoc contando con la Raspberry Pi en casa, porque realmente lo que hacía con IFTTT y Switchur era algo bastante sencillo, que se puede implementar fácilmente con un servidor web y una base de datos, pero… me faltaría integrar las acciones con mis elementos de domótica (enchufes, bombillas, cámaras, …), así que me puse a investigar las opciones de software libre ya existentes. Analicé varias de las opciones, y me planteé ir probando una a una y quedarme con la que más me convenciera, pero no me ha hecho falta llegar a eso, la primera opción que probé me ha parecido tan sencilla, completa y usable que cubre todas mis necesidaes con creces. Así que, vamos a hablar sobre la automatización con Home Assistant.

¿Qué es Home Assistant?

Home Assistant es un sistema de Domótica, que te permite controlar los elementos de tu casa (u otros sitios), para crear un hogar inteligente, donde algunas tareas se realizan de forma automática adaptado totalmente a tus necesidades. Los objetivos principales de un sistema domótico son el ahorro energético, el aumento de la seguridad y el comfort. Esto se puede traducir en cosas como: que el sistema detecte cuando no hay nadie en casa y que active el sistema de alarma, que haya dispositivos que se apaguen de forma automática cuando sales de casa (routers WiFi, televisión, …), que se apague el router WiFi cuando te vayas a dormir, que se active la calefacción o aire acondicionado cuando vayas a llegar a casa, que se suban/bajen los toldos de forma automática dependiendo del tiempo que haga, …

Home Assistant

Home Assistant te permite realizar todas estas cosas mediante un desarrollo en Python bajo licencia Apache License 2.0, es decir que tienes disponible el código fuente en el repositorio de GitHub.

Ventajas de Home Assistant

Llevo solamente un par de semanas con Home Assistant, pero sus ventajas son muy evidentes:

  • Es un desarrollo de software libre, con todo lo que ello implica. Por ejemplo, no puede pasar como con IFTTT, que pase de un modelo gratuito a un modelo de pago de un día para otro.
  • Es un aplicativo basado en una instalación local. Es decir, que no depende (si no quieres) de un servicio en la nube. Para los que se preocupen por la privacidad, además tratándose de elementos de tu propia casa, esta es una muy buena opción.
  • La instalación es muy muy sencilla. Hay varias formas de instalarlo, pero si cuentas con una Raspberry Pi por ejemplo, no te llevará más de una hora tenerlo funcionando completamente.
  • Se integra con miles de dispositivos inteligentes: Alexa, Google Assistant, MQTT, Philips HUE, SmartThings, Shelly, Sonos, Z-Wave, … Casi cualquier cosa que necesites, aquí está la lista completa de integraciones.
  • Interfaz web muy actual. La versión web de la aplicación es muy usable, muy moderna y muy completa. Me ha sorprendido muy gratamente lo bien que está hecha y la multitud de personalizaciones que ofrece.
  • Aplicación móvil completa. Si, también tiene aplicación móvil, que te permite revisar el estado de tus automatismos, cambiar configuraciones o recibir notificaciones push.
  • Documentación muy completa. La documentación de Home Assistant es muy completa, puedes encontrar prácticamente todo lo que busques. Si no encuentras algo, la otra fuente de información son los foros.

Desventajas

Aunque para mi sea una opción muy completa actualmente, hay algunos aspectos que quizá supongan una barrera para algunas personas:

  • Necesitas instalarlo en algún equipo. Es decir, no es un servicio basado en la nube, sino que necesitarás algo de hardware para tenerlo instalado y funcionando en 24×7. Esto implica que también deberías actualizarlo de forma frecuente, hacer backups, …
  • Necesitas habilitar accesos y redirecciones de puertos en tu router ADSL/FTTH para poder acceder desde fuera de tu casa, bien con el interfaz web o desde la aplicación móvil
  • Algunas integraciones requiren la edición de ficheros YAML.

Instalación

Para la instalación de Home Assistant, también conocido como Hassio, he utilizado una Raspberry Pi 3B+. También lo puedes instalar en otros dispositivos similares, o como máquina virtual en KVM, HyperV, VMWare WorkStation y VirtualBox.

El problema que presenta la instalación recomendada por Hassio (Home Assistant OS), es que debes cargar una nueva imagen en la tarjeta SD de tu Raspberry Pi, y por tanto eliminar todo lo que tengas ya en ella. Además, esto te deja la Raspberry Pi para que solo la puedas utilizar con Home Assistant, y no es el objetivo de mucha gente. Por eso existe un método alternativo de instalación y ejecución, mediante un contenedor Docker (Home Assistant Container), que realmente es muy sencillo y es el que yo he utilizado. Si ya tienes docker funcionando, es tan sencillo como ejecutar el contenedor:

docker run --init -d --name="home-assistant" -e "TZ=America/New_York" -v /PATH_TO_YOUR_CONFIG:/config --net=host homeassistant/raspberrypi3-homeassistant:stable

Debes sustituir el campo PATH_TO_YOUR_CONFIG por la carpeta local de tu sistema anfitrión donde quieres guarda la configuración, por ejemplo /home/pi/home-assistant. También puedes reemplazar la zona horaria por el lugar donde vivas, en mi caso TZ=Europe/Madrid.

Cuando necesites actuarlizaro, también es muy sencillo:

  1. Descargas la nueva versión del contenedor:
docker pull homeassistant/raspberrypi3-homeassistant

2. Paras el contenedor actual:

docker stop home-assistant 

3. Eliminas el contenedor actual:

docker rm home-assistant

4. Arrancas el nuevo contenedor:

docker run -d --name="home-assistant" -e "TZ=America/New_York" -v /PATH_TO_YOUR_CONFIG:/config --net=host homeassistant/raspberrypi3-homeassistant:stable

Aquí puedes ver las instrucciones completas si tienes otro modelo de hardware, Raspberry Pi u otros.

Configuración

Después de la instalación, podrás acceder al interfaz web desde la IP donde lo hayas instalado y el puerto 8123 por defecto, si no has elegido otro. La URL accesible desde el navegador debería ser algo similar a esto: http://192.168.1.2:8123

¿Por donde empezar? Pues lo primero sería integrar los dispositivos que tienes disponibles, y para ello puedes acceder al apartado de Configuration/Integrations y pulsar sobre el botón +, a partir de ahí te pedirá algunos datos para configurar el servicio que corresponda, estos son algunos de los primeros que he configurado:

Como verás, el interfaz es muy sencillo, muy intuitivo y no deberías tener ningún problema para integrar los dispositivos soportados de forma oficial desde este interfaz. Pero no todos los dispositivos se pueden configurar desde la interfaz, ni todos son oficiales, así que en algunos te tocará editar algunos de los ficheros de configuración de Home Assistant. No te asustes, porque es muy sencillo, te muestro algunos ejemplos de integraciones que he realizado hasta ahora.

Cámara Foscam

Para integrar una cámara de Foscam, muy habituales para videovigilancia casera, que esté conectada a tu red local debes editar el fichero configuration.yaml que se encuentra en tu carpeta de configuración. Al editarlo debes añadir algo como lo siguiente, recuerda que es un fichero YAML y por tanto debes respetar la sintaxis y el tabulado:

camera:
  - platform: foscam
    ip: 192.168.1.X
    username: USUARIO
    password: !secret foscam_password

Tienes que reemplazar la IP por la que tenga tu cámara y el USUARIO por aquel que hayas creado en tu Foscam. Ten en cuenta que para algunas de las integraciones posteriores este usuario debe tener perfil de Administrator, ya que el Operator no tiene permisos suficientes. Después la contraseña la debes introducir en el fichero secrets.yaml que existe en la misma carpeta, con el siguiente contenido:

foscam_password: CONTRASEÑA

Reemplaza CONTRASEÑA por la contraseña del usuario anterior. Una vez hecho esto, reinicia Home Assistant (docker stop home-assistant; docker start home-assistant) y ya tendrás disponible el video en vivo de tu cámara desde el interfaz de Home Assistant.

Cámara Foscam: Motion Detection

Una integración interesante tras tener la cámara integrada, es poder habilitar y deshabilitar el reconocimiento de movimiento de la cámara. Por ejemplo, puedes querer habilitarlo cuando no estás en casa, pero deshabilitarlo mientras estás. Para ello, he creado un switch que utiliza llamadas a la «API» de la cámara para obtener y/o modificar parte de su configuración. Añade esto al mismo fichero configuration.yaml.

switch:
  - platform: command_line
    switches:
      camera_motion_detection:
        command_on: 'curl -k --tlsv1.2 --tls-max 1.2 "https://192.168.1.2:443/cgi-bin/CGIProxy.fcgi?  cmd=setMotionDetectConfig1&isEnable=1&linkage=12&snapInterval=1&triggerInterval=10&schedule0=281474976710655&schedule1=281474976710655&schedule2=281474976710655&schedule3=281474976710655&schedule4=281474976710655&schedule5=281474976710655&schedule6=281474976710655&width1=10000&height1=10000&sensitivity1=2&valid1=1&usr=USUARIO&pwd=CONTRASEÑA"'
        command_off: 'curl -k --tlsv1.2 --tls-max 1.2 "https://192.168.1.2:443/cgi-bin/CGIProxy.fcgi?cmd=setMotionDetectConfig1&isEnable=0&usr=USUARIO&pwd=CONTRASEÑA"'
        command_state: 'curl -k --tlsv1.2 --tls-max 1.2 --silent "https://192.168.1.2:443/cgi-bin/CGIProxy.fcgi?cmd=getMotionDetectConfig1&usr=USUARIO&pwd=CONTRASEÑA" | grep -oP "(?<=isEnable>).*?(?=)"'
        value_template: '{{ value == "1" }}'
        friendly_name: Camara Motion Detection

Como ves, hay tres comandos, uno para habilitar el Motion Detection, otro para deshabilitarlo y el tercero para detectar su configuración actual. Asegúrate de que reemplazas la IP de tú cámara, así como el USUARIO y la CONTRASEÑA. Ten también en cuanta que he tenido que forzar la versión de TLS a la 1.2, porque en caso contrario no podían negociar correctamente la sesión HTTPS.

Cámara Foscam: Push Motion Detection

Además de detectar y/o configurar cuando está habilitado el detector de movimiento, me interesaba poder configurar cuando la cámara envía notificaciones push a la aplicación de móvil de Foscam, hasta que lo termine de integrar todo en Home Assistant. Si te interesa, descubrí cómo hacerlo aunque no estaba muy claro en la propia documentación de Foscam, la clave está uno de los campos (Linkage) de las llamadas setMotionDetectionConfig y getMotionDetectionConfig, añade lo siguiente después del código anterior:

      camera_push_motion_detection:
        # Linkage = 140 implica Push Enable. Bit7=1
        command_on: 'curl -k --tlsv1.2 --tls-max 1.2 "https://192.168.1.2:443/cgi-bin/CGIProxy.fcgi?cmd=setMotionDetectConfig1&isEnable=1&linkage=140&snapInterval=1&triggerInterval=10&schedule0=281474976710655&schedule1=281474976710655&schedule2=281474976710655&schedule3=281474976710655&schedule4=281474976710655&schedule5=281474976710655&schedule6=281474976710655&width1=10000&height1=10000&sensitivity1=2&valid1=1&usr=USUARIO&pwd=CONTRASEÑA"'
        # Linkage = 12 implica Push Disable. Bit7=0
        command_off: 'curl -k --tlsv1.2 --tls-max 1.2 "https://192.168.1.2:443/cgi-bin/CGIProxy.fcgi?cmd=setMotionDetectConfig1&isEnable=1&linkage=12&snapInterval=1&triggerInterval=10&schedule0=281474976710655&schedule1=281474976710655&schedule2=281474976710655&schedule3=281474976710655&schedule4=281474976710655&schedule5=281474976710655&schedule6=281474976710655&width1=10000&height1=10000&sensitivity1=2&valid1=1&usr=USUARIO&pwd=CONTRASEÑA"'
        command_state: 'curl -k --tlsv1.2 --tls-max 1.2 --silent "https://192.168.1.2:443/cgi-bin/CGIProxy.fcgi?cmd=getMotionDetectConfig1&usr=USUARIO&pwd=CONTRASEÑA" | grep "linkage" | sed "s///" | sed "s/<\/linkage>//" | sed "s/12/0/" | sed "s/140/1/" | sed "s/ //g"'
        value_template: '{{ value == "1" }}'
        friendly_name: Camara Push Motion Detection

Cámara Foscam: sensor Motion Detection

Si además, quieres que se genere un evento cuando la cámara detecta movimiento, puedes añadir un sensor que te proporcione esta información. La cámara no tiene mecanismos para poder «avisar» a Hassio, por lo que la única forma que he conseguido integrarlo es mediante Pulling, que se ejecuta cada X segundos, añadiendo lo siguiente a configuration.yaml:

sensor:
  - platform: command_line
    name: "Camera Motion Detected"
    command: 'curl -k --tlsv1.2 --tls-max 1.2 --silent "https://192.168.1.2:443/cgi-bin/CGIProxy.fcgi?cmd=getDevState&usr=USUARIO&pwd=CONTRASEÑA" | grep -oP "(?<=motionDetectAlarm>).*?(?=)"'
value_template: >-
    {%- if value == "0" -%}
      Disabled
    {%- elif value == "1" -%}
      None
    {%- elif value == "2" -%}
      Detected
    {%- endif -%}
    scan_interval: 5

Cuando la cámara detecte movimiento, se generará un evento en este sensor.

Identificar si hay alguien en casa

Verás que hay varias integraciones con dispositivos de posicionamiento (life360, aplicación Home Assistant, …) o de presencia (integrado con tu router, con NMAP, …). De esta forma, podrás saber donde se encuentra cada miembro de tu familia, siempre que lleven un dispositivo móvil con ellos.

Pero, además de poder saber y generar eventos por cada miembro de la familia, hay un evento importante para mi que es saber cuándo hay alguien en casa o no. Es decir, poder integrar el posicionamiento o presencia de todos ellos, y para eso he creado un sensor binario que me indica cuándo estamos alguno de los padres en casa o cuando no estamos:

binary_sensor:
  - platform: template
    sensors:
      papas_en_casa:
        friendly_name: PapasEnCasa
        unique_id: papas_en_casa
        value_template: >
          {{ is_state('group.papas', 'home') }}
        delay_on:
          minutes: 5
        delay_off:
          minutes: 5

Como ves, se basa en un grupo llamado group.papas, en el que he incluido a las personas que me interesa localizar. Cuando el último de ellos sale de casa, este sensor se pone a off, y cuando el primero de ellos entra en casa el sensor se pone a on. La definición del grupo, en el fichero groups.yaml es así:

papas:
  name: Papas
  entities:
    - person.luisa
    - person.pedro

Como ya veréis, podéis hacer esto mismo asociando una Zona a este grupo, pero con eso obtendréis falsos positivos, y eventos de salida y entrada a casa continúos cuando os mováis por una zona cercana. Para evitar esto, en el sensor binario definido anteriormente veréis que definimos dos valores delay_on y delay_off a 5 minutos. Esto significa, que hasta que no se mantenga durante esos 5 minutos el valor del presencia del grupo en la Zona definida (on o off), no cambiará el valor de este sensor.

2 comentarios en «Home Assistant: Domótica fácil»

  1. Muy interesante, pero creo que es muy complicado para el usuario medio.
    Nos tocará morir en una ( o varias) Nube comercial.
    No obstante excelente articulo

    Responder
    • Hola Baly,

      Efectivamente, para el usuario medio que no quiere «complicarse» la vida y simplemente utilizar una opción que funcione, esta no es una alternativa. Lo ideal es una solución existente, y que no necesite ningún conocimiento previo.

      Esta solución es para todo aquel que tenga ganas de cacharrerar, de montarse algunas cosas por su cuenta, y de aprender un poco más sobre Domótica, Raspberry, y algunas cosas similares. Para estos, la alternativa de Home Assistant es una muy buena opción, recomiendo probarla 😉

      Un saludo.

      Responder

Deja un comentario

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.