Sistema de presencia total en Home Assistant

Sistema de presencia total en Home Assistant

¿Por qué conformarte con sensores físicos pudiendo establecer un sistema de presencia total en Home Assistant?

Vamos a elevar el concepto de sistema de presencia a un nuevo nivel en función de distintos factores que te van a permitir establecer automatizaciones con una precisión óptima. Además, vamos a adaptarlo completamente a tus preferencias, tus hábitos y tus dispositivos.

Principios básicos

Antes de empezar quiero explicarte cómo vamos a construir este sistema de presencia total en Home Assistant.

  • Por un lado vamos a crear una serie de niveles anidados, conteniendo cada uno de ellos a los siguientes. Un ejemplo sería que [TiTo] está en casa (nivel 1), se encuentra en el [estudio] (nivel 2), tiene el [ordenador encendido] (nivel 3) y está [escuchando música] (nivel 4). Entendida la idea puedes crear u ordenar los niveles como tú quieras.
  • Para cada usuario va a existir un sensor que, dependiendo de la combinación de los distintos niveles, va a tomar un valor. El ejemplo del apartado anterior podría resumirse en que «sensor.presencia_tito» = «escuchando musica».
  • El valor de este sensor lo vamos a utilizar con fines prácticos en nuestras automatizaciones, pero también vamos a crear una tarjeta en el panel de control que muestre esta situación mediante una imagen. Para visualizar correctamente esta tarjeta necesitas instalar a través de HACS las tarjetas de Card Mod y Mushroom Cards.
  • Para cada usuario vamos a crear una carpeta dentro de la ruta ‘config/www/person’. En su carpeta correspondiente iremos guardando una imagen con el mismo nombre que el estado correspondiente, y formato .jpg (por ejemplo ‘config/www/person/tito/musica.jpg’).
  • Puedes utilizar fotos o el tipo de imágenes que quieras. En mi caso voy a utilizar la plataforma Bing para generar imágenes al estilo Pixar, como podrás observar a lo largo de la guía.

¿Hay alguien en casa?

Determinar si algún usuario está en casa

El nivel básico para crear un sistema de presencia total en Home Assistant es saber si hay o no alguien en casa. Aunque resulte algo elemental esto puede servir para cosas tran prácticas como:

  • Controlar el clima cuando estás en casa, o apagar la calefacción y aire acondicionado cuando te vas.
  • Emitir notificaciones de audio por tus altavoces sólo cuando estás en casa.
  • Activar tu sistema de seguridad cuando no hay nadie en casa.

Para determinar si hay alguien en casa vamos a utilizar los ‘device tracker’, que permiten hacer el seguimiento de ciertos dispositivos. Para ello el único requisito es que cada miembro de tu hogar tenga un usuario asignado en HA (generando la entidad ‘person’ correspondiente) y, al menos, un sensor ‘device tracker’ asociado.

Hecho esto crea un sensor del tipo «Grupo» que agrupe todas las entidades del tipo ‘person’ de los usuarios del hogar en tu fichero ‘groups.yaml’. Por ejemplo:

familia:
  name: "Familia"
  entities:
    - person.USUARIO1
    - person.USUARIO2

Esto creará la entidad ‘group.familia’ que tendrá el valor «home» siempre que al menos uno de los miembros del grupo esté en casa. De lo contrario tomará el valor «not_home». Esta es la entidad y los valores con los que debes jugar para crear este tipo de automatizaciones.

Identificar qué usuarios están en casa

Completado el nivel anterior vamos a empezar a construir el sensor de presencia de cada usuario con el mismo fin que acabamos de comentar, pero a un nivel personalizado. Por ejemplo:

  • Encender la calefacción a la temperatura que le gusta al usuario 1 cuando llegue a casa.
  • Enviar una notificación con la previsión del tiempo al usuario 2 cuando salga de casa.
  • Avisar al resto de usuarios del hogar cuando la mascota no esté en casa.

Para ello pega el siguiente código para cada uno de los usuarios en tu fichero ‘sensors.yaml’:

- platform: template
  sensors:
    presencia_USUARIO1:
      friendly_name: "USUARIO1"
      value_template: >
        {% if states('person.USUARIO1') == "home" %}casa ## EL USUARIO ESTÁ EN CASA
        {% else %}fuera ## EL USUARIO ESTÁ FUERA
        {% endif %} 
      icon_template: mdi:user

A su vez, ya puedes crear la tarjeta personal en tu panel de control. Es una tarjeta muy sencilla, con una imagen de fondo dinámica que va a variar en función del valor del sensor de presencia del usuario.

type: custom:mushroom-template-card
card_mod:
  style: >
    ha-card {
      background: url('/local/person/USUARIO/{{ states('sensor.presencia_USUARIO') }}.jpg');
      background-position: center;
      background-size: cover;
      height: 180px!important;
      }

En mi caso voy a crear dos tarjetas (correspondientes a dos usuarios diferentes) para jugar con imágenes que encajen, como ya hemos hecho anteriormente por ejemplo con las tarjetas de ocupación.

Detección de presencia

Aunque la detección por usuario me parece lo más práctico en la mayoría de las situaciones, en nuestro sistema de presencia total en Home Assistant no puede faltar la clásica detección de presencia. Esta puede ser un buen complemento en algunos casos:

  • Generar automatizaciones en zonas en las que identificar al usuario no es la prioridad, sino adecuar el ambiente (por ejemplo, en el baño).
  • Generar automatizaciones que también puedan ser disparadas por invitados (por ejemplo, encender las luces en una escalera).
  • Detectar presencia cuando ninguno de los usuarios está en casa para crear tu sistema de alarma casero.

En este caso vamos a hacer uso de sensores de presencia (como el Sonoff SNZB-06P o el LD2410C), ya que son baratos y funcionan muy bien.

*Algún precio puede haber cambiado desde la ultima revision

Sistema de presencia dentro de casa

En qué habitación está cada usuario

Si en el apartado anterior hemos determinado si el usuario está en casa, ahora vamos a bajar un nivel y detectar en qué habitación se encuentra. Esto va a potenciar mucho nuestro sistema de presencia total en Home Assistant, ya que es de gran utilidad para:

  • Crear automatizaciones cuando un usuario entra o sale de una habitación (como encender y apagar las luces).
  • Ajustar los parámetros de los dispositivos a las preferencias del usuario que está en la habitación (como la temperatura del aire acondicionado o el volumen de la televisión).
  • Dirigir nuestras automatizaciones únicamente a las habitaciones donde hay alguien (como emisión de notificaciones).

Aunque podríamos detectar la presencia en una habitación mediante detectores de movimiento o de personas, estos no nos aportan información sobre qué persona esta dentro. Es por ello que vamos a utilizar Bermuda, un sistema de detección basado en dispositivos bluetooth. En esta entrada te explico en detalle cómo crearlo aprovechando tus dispositivos con placas ESP32.

ESP32
GENERICO

ESP32

5,0

Placa microcontroladora ideal para proyectos DIY. Conecta tus sensores vía WiFi y Bluetooth, funcionando totalmente en local y con integración nativa en Home Assistant mediante ESPHome.Placa microcontroladora ideal para proyectos DIY. Conecta tus sensores vía WiFi ...

ESP32-S3 N16R8
GENERICO

ESP32-S3 N16R8

5,0

Placa microcontroladora ideal para proyectos DIY. Con WiFi y Bluetooth, funciona en local y se integra fácilmente en Home Assistant mediante ESPHome. Potente, versátil y compatible con Arduino.Placa microcontroladora ideal para proyectos DIY. Con WiFi y Bluetooth, funciona...

*Algún precio puede haber cambiado desde la ultima revision

Una vez que lo tenemos instalado y funcionando, vamos a incluir un nuevo nivel en el sensor de presencia del usuario. Este nivel lógicamente va a estar contenido dentro de la situación en la que el usuario está en casa. Lo haremos, por ejemplo, de la siguiente manera:

- platform: template
  sensors:
    presencia_USUARIO1:
      friendly_name: "USUARIO1"
      value_template: >
        {% if states('person.USUARIO1') == "home" %}
          {% if states('sensor.DISPOSITIVO_BT1') == "estudio" %}estudio ## EL USUARIO ESTÁ EN EL ESTUDIO
          {% elif states('sensor.DISPOSITIVO_BT1') == "cocina" %}cocina ## EL USUARIO ESTÁ EN LA COCINA
          {% else %}casa
          {% endif %} 
        {% else %}fuera
        {% endif %} 
      icon_template: mdi:user

Analiza el código y observa lo siguiente:

  • La habitación en la que se encuentra el «USUARIO1» se determina en función de dónde se encuentra el «DISPOSITIVO_BT1» (por ejemplo, su dispositivo móvil o su reloj).
  • Si el valor no corresponde a ninguna habitación (porque el dispositivo esté apagado, o lejos de estas habitaciones) se informa de forma genérica que está en «casa».

Qué está haciendo cada usuario

Hay veces que saber qué está haciendo un usuario es más importante que saber dónde está, y podemos utilizar esta información para afinar nuestras automatizaciones. Por ejemplo:

  • No emitir notificaciones de audio cuando un usuario está estudiando o trabajando.
  • Pausar tu robot aspirador cuando un usuario está hablando por teléfono.
  • Bajar el volumen de todos los dispositivos multimedia cuando un usuario está durmiendo.

Además tienes muchas formas de determinar qué está haciendo un usuario, pero aquí te dejo algunas ideas que puedes aplicar:

  • En función de los sensores de tu dispositivo móvil

Si tienes instalada la aplicación de Home Assistant en tu dispositivo móvil hay un montón de sensores que puedes activar para darle información a HA. Por ejemplo, el sensor Sensores de teléfono > Estado del teléfono indicará cuando estás en medio de una llamada.

También puedes utilizar otro tipo de sensores que estén relacionados con tus hábitos. Por ejemplo, si mientras duermes cargas tu dispositivo con cable, pero cuando trabajas lo haces mediante carga inalámbrica, puedes utilizar el sensor Sensores de batería > Tipo de cargador para detectar estas activades.

  • En función de las aplicaciones que estés utilizando

Hay aplicaciones como Sleep as Android que tienen una integración directa con Home Assistant (en este caso para identificar cuando estás durmiendo, e información relacionada).

En todo caso, puedes detectar el uso de cualquier aplicación utilizando el sensor Última aplicación utilizada. Por ejemplo, puedes determinar que te encuentras en una reunión de trabajo si estás utilizando Skype, o relajado escuchando música con Spotify.

  • En función de los dispositivos que estás utilizando

Dependiendo de los hábitos de cada persona, el uso de ciertos dispositivos puede terminar una actividad en sí misma. Por ejemplo, en mi caso tengo unos pequeños auriculares bluetooth que sólo utilizo para salir a correr.

También puedes utilizar integraciones genéricas como la de Nmap para detectar cualquier dispositivo que se conecte a tu red local (cómo una consola) o integraciones específicas (como la de tu ordenador).

Teniendo claro qué actividades quieres identificar, vamos a alimentar el sensor personal del usuario correspondiente. Quiero que te fijes en la jerarquía que he aplicado. He incorporado las actividades en el grupo correspondiente (dentro o fuera de casa), con prioridad sobre la ubicación por habitaciones. Por ejemplo, de esta forma, si estoy en una llamada, quiero esto se tenga en cuenta, independientemente de en qué habitación esté.

- platform: template
  sensors:
    presencia_USUARIO1:
      friendly_name: "USUARIO1"
      value_template: >
        {% if states('person.USUARIO1') == "home" %}
          {% if states('sensor.TELEFONO_phone_state') == "offhook" %}llamada ## EL USUARIO ESTÁ EN UNA LLAMADA
          {% elif states('sensor.auriculares_sony') == "on" %}auricularesbt ## EL USUARIO ESTÁ ESCUCHANDO MÚSICA 
          {% else %}
            {% if states('sensor.DISPOSITIVO_BT1') == "estudio" %}estudio
            {% elif states('sensor.DISPOSITIVO_BT1') == "cocina" %}cocina
            {% else %}casa
            {% endif %} 
          {% endif %} 
        {% else %}
          {% if states('sensor.auriculares_tozo') == "on" %}running ## EL USUARIO ESTÁ CORRIENDO
          {% else %}fuera
          {% endif %} 
        {% endif %} 
      icon_template: mdi:user

Sistema de presencia fuera de casa

Puede que esto se salga del concepto tradicional de «sistema de presencia», pero si lo piensas bien puedes hacer que Home Assistant te facilite la vida también cuando no estás en casa.

Lo único que necesitas es tener acceso desde fuera de casa y tener instalada la aplicación de Home Assistant en tu dispositivo móvil.

Dónde ha ido el usuario

En el último apartado veíamos cómo puedes detectar una actividad cuando activas uno de tus dispositivos (por ejemplo, un reloj deportivo) o utilizas una aplicación (por ejemplo, Strava). Esto también es aplicable cuando estás fuera de casa.

Sin embargo, puedes obtener mucha información simplemente por la ubicación del usuario y utilizarla en cosas tan prácticas como:

  • Enviar una notificación automática al grupo familiar de Telegram cuando se te ha hecho tarde en el trabajo.
  • Enviar una notificación al resto de usuarios a través de la aplicación cuando estás haciendo la compra, por si quieren añadir algo a la lista de la compra.
  • Contabilizar en tu ‘personal trainer’ cuando has ido al gimnasio o a la piscina.

Para beneficiarnos de estas automatizaciones lo único que tenemos que hacer es configurar las zonas geográficas correspondientes tal y como te explico en esta entrada, y activar en tu teléfono los Sensores de ubicación.

A parti de ahí, de nuevo vamos a alimentar el sensor personal del usuario correspondiente. Fíjate que esta vez he incorporado las zonas dentro de las actividades que pasan fuera de casa.

- platform: template
  sensors:
    presencia_USUARIO1:
      friendly_name: "USUARIO1"
      value_template: >
        {% if states('person.USUARIO1') == "home" %}
          {% if states('sensor.TELEFONO_phone_state') == "offhook" %}llamada
          {% elif states('sensor.auriculares_sony') == "on" %}auricularesbt
          {% else %}
            {% if states('sensor.DISPOSITIVO_BT1') == "estudio" %}estudio
            {% elif states('sensor.DISPOSITIVO_BT1') == "cocina" %}cocina
            {% else %}casa
            {% endif %} 
          {% endif %} 
        {% else %}
          {% if states('sensor.auriculares_tozo') == "on" %}running
          {% elif "person.USUARIO1" in state_attr('zone.rocodromo','persons') %}rocodromo ## USUARIO EN ZONA 1
          {% elif "person.USUARIO1" in state_attr('zone.piscina','persons') %}piscina ## USUARIO EN ZONA 2
          {% elif "person.USUARIO1" in state_attr('zone.supermercado','persons') %}compra ## USUARIO EN ZONA 3
          {% else %}fuera
          {% endif %} 
        {% endif %} 
      icon_template: mdi:user

Usuario al volante

Podemos considerar que conducir es una situación especial, ya que es una actividad que requiere nuestra atención y limita nuestra capacidad para hacer otras cosas. Precisamente por ello, Home Assistant puede aportarnos alguna funcionalidad sin que nos despistemos, como por ejemplo:

Para detectar si estamos conduciendo basta con utilizar los sensores de nuestro dispositivo móvil (el de ‘bluetooth’ para Android o el de ‘activity’ para iPhone). En esta entrada te explico en detalle cómo configurarlo.

Hecho esto, vamos a añadir el «modo conducción» como una nueva situación de la siguiente forma:

- platform: template
  sensors:
    presencia_USUARIO1:
      friendly_name: "USUARIO1"
      value_template: >
        {% if states('person.USUARIO1') == "home" %}
          {% if states('sensor.TELEFONO_phone_state') == "offhook" %}llamada
          {% elif states('sensor.auriculares_sony') == "on" %}auricularesbt
          {% else %}
            {% if states('sensor.DISPOSITIVO_BT1') == "estudio" %}estudio
            {% elif states('sensor.DISPOSITIVO_BT1') == "cocina" %}cocina
            {% else %}casa
            {% endif %} 
          {% endif %} 
        {% elif states('sensor.coche_USUARIO1') == "on" %}conduciendo ## MODO CONDUCCIÓN DEL USUARIO
        {% else %}
          {% if states('sensor.auriculares_tozo') == "on" %}running
          {% elif "person.USUARIO1" in state_attr('zone.rocodromo','persons') %}rocodromo
          {% elif "person.USUARIO1" in state_attr('zone.piscina','persons') %}piscina
          {% elif "person.USUARIO1" in state_attr('zone.supermercado','persons') %}compra
          {% else %}fuera
          {% endif %} 
        {% endif %} 
      icon_template: mdi:user

Analiza el código y observa lo siguiente:

  • NO he incluido el modo conducción dentro de las actividades generales que pasan fuera de casa. Esto lo hacemos porque queremos que se priorice por encima de cualquier otra situación (por ejemplo, si pasamos en coche por el gimnasio, queremos que entienda que vamos conduciendo y que no estamos dentro).