Hoy vamos a crear una tarjeta de monitorización de sueño en Home Assistant, para observar nuestro nivel de descanso y mejorarlo.
Índice
Descripción de la tarjeta
La tarjeta de monitorización de sueño se compone de dos partes diferenciadas. La primera, este pequeño ‘widget’ que te muestra la siguiente información:
- Tiempo total de sueño de la última noche
- Distribución de las distintas fases del sueño de la última noche (gráfico y porcentaje)
- Calidad del sueño (de 1 a 4 estrellas)
Si pulsas sobre alguno de los datos de este ‘widget’ se despliega un pop-up con la siguiente información detallada:
- Tiempo en horas y minutos en cada fase del sueño, y descripción de la misma
- Gráfico con la evolución de la última semana de los distintos valores
Requisitos previos
Para poder crear esta tarjeta de monitorización de sueño necesitas tener sensores que indiquen el tiempo de sueño y de cada fase del mismo.
Lo ideal es que tengas algún reloj inteligente o pulsera de actividad para medirlo con mayor precisión. Dependiendo del modelo que tengas puede que tenga integración directa con HA, o que tengas que utilizar alguna otra (como Google Fit) a modo de «pasarela».
Además hay aplicaciones como Sleep as Android que permiten medirlo directamente con tu dispositivo móvil o a través de relojes y pulseras de muchas marcas. Además tiene integración con Home Assistant y envía mucha información relacionada con el sueño que puedes utilizar en tus automatizaciones (por ejemplo, apagar la tele cuando te quedes dormido).
Como curiosidad, personalmente utilizo un Garmin Forerunner 45s que, aunque registra las fases del sueño, esta información no llega a través de su integración con HA, Garmin no tiene integración con Google Fit y mi reloj no está soportado en Sleep as Android. Sin embargo, con Health Sync he podido llevar los datos de la app de Garmin a Google Fit, y de esta a Home Assistant. Siempre hay una manera :)
También necesitas instalar a través de HACS las tarjetas de Stack in Card, Card Mod, Bar Card, Mushroom Cards, Bubble Card y Mini Graph Card.
Homogeneización de sensores
Ya hemos visto que hay muchas formas de conseguir la información relativa a tu descanso, pero para poder crear la tarjeta necesitamos que esta sea homogénea. En particular necesitamos contar con la siguiente información:
- Porcentaje y tiempo de sueño REM. El cerebro está más activo y se centra en recuerdos y problemas complejos. En esta fase es cuando se sueña. La respiración puede volverse más irregular.
- Porcentaje y tiempo de sueño ligero. El cuerpo se va preparando para el sueño profundo y el cerebro almacena hechos simples en la memoria. Es habitual que una persona se pase más de la mitad del tiempo de sueño en esta fase.
- Porcentaje y tiempo de sueño profundo. El cuerpo empieza a reparar músculos, depurar el cerebro y reforzar el sistema inmunitario.
- Tiempo de sueño total
Construcción de los sensores
En mi caso la información procede de Google Fit, que me proporciona los siguientes sensores:
- ‘sensor.sleep’ = tiempo total de sueño (en segundos)
- ‘sensor.deep_sleep’ = tiempo de sueño profundo (en segundos)
- ‘sensor.rem_sleep’ = tiempo de sueño REM (en segundos)
- ‘sensor.light_sleep’ = tiempo de sueño ligero (en segundos)
A partir de ellos voy a crear los tres sensores que necesitamos, mencionados en el apartado anterior, pegando el siguiente código en el fichero ‘sensors.yaml’:
- platform: template sensors: deep_sleep_USUARIO: friendly_name: "Tiempo de sueño profundo (USUARIO)" icon_template: mdi:power-sleep unit_of_measurement: "%" value_template: > {{ ((states('sensor.deep_sleep') | int) / (states('sensor.sleep') | int)) | round (2) * 100 }} attribute_templates: time: > {% set sueno = states('sensor.deep_sleep') | int / 60%} {% if (sueno | int // 60) > 0 %}{{ sueno | int // 60}} h{% endif %} {{ sueno | int % 60}} min graph: > {{ ((states('sensor.deep_sleep') | int) / (states('sensor.sleep') | int)) | round (2) * 100 }} - platform: template sensors: light_sleep_USUARIO: friendly_name: "Tiempo de sueño ligero (USUARIO)" icon_template: mdi:power-sleep unit_of_measurement: "%" value_template: > {{ ((states('sensor.light_sleep') | int) / (states('sensor.sleep') | int)) | round (2) * 100 }} attribute_templates: time: > {% set sueno = states('sensor.light_sleep') | int / 60%} {% if (sueno | int // 60) > 0 %}{{ sueno | int // 60}} h{% endif %} {{ sueno | int % 60}} min graph: > {{ ((states('sensor.light_sleep') | int) / (states('sensor.sleep') | int)) | round (2) * 100 + ((states('sensor.deep_sleep') | int) / (states('sensor.sleep') | int)) | round (2) * 100 }} - platform: template sensors: rem_sleep_USUARIO: friendly_name: "Tiempo de sueño REM (USUARIO)" icon_template: mdi:power-sleep unit_of_measurement: "%" value_template: > {{ ((states('sensor.rem_sleep') | int) / (states('sensor.sleep') | int)) | round (2) * 100 }} attribute_templates: time: > {% set sueno = states('sensor.rem_sleep') | int / 60%} {% if (sueno | int // 60) > 0 %}{{ sueno | int // 60}} h{% endif %} {{ sueno | int % 60}} min
Si analizas el código observarás que cada uno de los sensores tiene como valor el porcentaje que la fase correspondiente representa sobre el tiempo total de sueño. Además tiene como atributo el tiempo que ha durado cada fase (en horas y minutos), y un atributo adicional que sirve para construir el gráfico de la tarjeta.
Construcción de la tarjeta
Una vez que ya tenemos los sensores mostrando la información que queremos sólo tienes que crear una nueva tarjeta en tu panel de control y pegar el siguiente código, reemplazando tu nombre. También tendrás que ajustar la ruta de la imagen de fondo (que puedes cambiar o descargar la mía desde mi colección de “Personal Trainer”).
type: vertical-stack cards: - type: custom:stack-in-card card_mod: style: | ha-card { background: linear-gradient(150deg,rgba(42, 66, 105, 0.8), rgba(6, 14, 56, 0.8) ), url('/local/images/night.jpg'); background-position: center; background-size: cover; } cards: - type: custom:bar-card card_mod: style: |- ha-card { border: 0px; } bar-card-currentbar { border-radius: 50px !important; } bar-card-backgroundbar { background: #08f570; border-radius: 50px !important; opacity: 1 } entities: - entity: sensor.light_sleep_USUARIO attribute: graph color: dodgerblue height: 40px positions: icon: 'off' value: 'off' name: 'off' - type: custom:bar-card card_mod: style: |- ha-card { margin-top: -72px; margin-left: -1px; border: 0px; } bar-card-currentbar { border-radius: 50px !important; } bar-card-backgroundbar { opacity: 0 } entities: - entity: sensor.deep_sleep_USUARIO attribute: graph color: rebeccapurple height: 40px positions: icon: 'off' value: 'off' name: 'off' - type: custom:mushroom-chips-card card_mod: style: | ha-card { margin-top: -54px; margin-left: 16px; --primary-text-color: white; } chips: - type: template icon: mdi:power-sleep icon_color: white tap_action: action: navigate navigation_path: '#sleep_USUARIO' content: > {% set sueno = states('sensor.sleep') | int / 60%} {% if sueno == 0 %} Sin información {% else %} {% if (sueno | int // 60) > 0 %} {{ sueno | int // 60}} horas y {% endif %} {{ sueno | int % 60}} minutos {% endif %} card_mod: style: | ha-card { border: 0px; background: transparent!important; box-shadow: none!important; } - type: custom:mushroom-chips-card ## AQUI COMIENZAN LAS REGLAS PARA MEDIR LA CALIDAD DEL SUEÑO alignment: end card_mod: style: | ha-card { margin-top: -55px; margin-right: 20px; --chip-box-shadow: 0px; --chip-spacing: 0px !important; --chip-padding: 0px !important; } chips: - type: template icon: mdi:star icon_color: yellow tap_action: action: navigate navigation_path: '#sleep_USUARIO' card_mod: style: | ha-card { border: 0px; {% set sueno = states('sensor.sleep') | int / 60%} {% if (sueno | int // 60) < 7 %} display: none !important; {% endif %} background-color: transparent !important; } - type: template icon: mdi:star icon_color: yellow tap_action: action: navigate navigation_path: '#sleep_USUARIO' card_mod: style: | ha-card { border: 0px; {% set sueno = states('sensor.sleep') | int / 60%} {% if (sueno | int // 60) < 8 %} display: none !important; {% endif %} background-color: transparent !important; } - type: template icon: mdi:star icon_color: yellow tap_action: action: navigate navigation_path: '#sleep_USUARIO' card_mod: style: | ha-card { border: 0px; {% set sueno = states('sensor.deep_sleep') | int / 60%} {% if (sueno | int // 60) < 1 %} display: none !important; {% endif %} background-color: transparent !important; } - type: template icon: mdi:star icon_color: yellow tap_action: action: navigate navigation_path: '#sleep_USUARIO' card_mod: style: | ha-card { border: 0px; {% set sueno = states('sensor.deep_sleep') | int / 60%} {% if (sueno | int // 60) < 2 %} display: none !important; {% endif %} background-color: transparent !important; } ## AQUÍ ACABAN LAS REGLAS PARA MEDIR LA CALIDAD DEL SUEÑO - type: custom:mushroom-chips-card card_mod: style: | ha-card { margin-top: -15px; border: 0px !important; --chip-box-shadow: 0px; --chip-spacing: 0px; --chip-padding: 5px; --primary-text-color: white; } chips: - type: template content: | 🟣 S. Profundo ({{ states('sensor.deep_sleep_USUARIO') | int }}%) card_mod: style: | ha-card { background: transparent!important; box-shadow: none!important; border: 0px; } tap_action: action: navigate navigation_path: '#sleep_USUARIO' - type: template content: | 🔵 S. Ligero ({{ states('sensor.light_sleep_USUARIO') | int }}%) card_mod: style: | ha-card { background: transparent!important; box-shadow: none!important; border: 0px; } tap_action: action: navigate navigation_path: '#sleep_USUARIO' - type: template content: | 🟢 Fase REM ({{ states('sensor.rem_sleep_USUARIO') | int }}%) card_mod: style: | ha-card { background: transparent!important; box-shadow: none!important; border: 0px; } tap_action: action: navigate navigation_path: '#sleep_USUARIO' alignment: center - type: vertical-stack cards: - type: custom:bubble-card card_type: pop-up hash: '#sleep_USUARIO' name: Descanso icon: mdi:sleep - type: custom:bubble-card card_type: separator icon: mdi:power-sleep name: Esta noche - type: entities card_mod: style: | ha-card { background: transparent; box-shadow: none; margin-top: -30px; margin-bottom: -20px; margin-left: -16px; border: 0px; } entities: - type: attribute entity: sensor.rem_sleep_USUARIO attribute: time name: Sueño REM icon: mdi:chat-sleep card_mod: style: | :host { --paper-item-icon-color: #08f570; } - type: custom:mushroom-template-card primary: '' secondary: >- El cerebro está más activo y se centra en recuerdos y problemas complejos. En esta fase es cuando se sueña. icon: '' multiline_secondary: true tap_action: action: none card_mod: style: | ha-card { box-shadow: none; background: transparent; border: 0px; margin-top: -20px; --card-secondary-font-size: 11px; } - type: entities card_mod: style: | ha-card { background: transparent; box-shadow: none; margin-top: -30px; margin-bottom: -20px; margin-left: -16px; border: 0px; } entities: - type: attribute entity: sensor.light_sleep_USUARIO attribute: time name: Sueño ligero icon: mdi:bed card_mod: style: | :host { --paper-item-icon-color: dodgerblue; } - type: custom:mushroom-template-card primary: '' secondary: >- El cuerpo se va preparando para el sueño profundo y el cerebro almacena hechos simples en la memoria. icon: '' multiline_secondary: true tap_action: action: none card_mod: style: | ha-card { box-shadow: none; background: transparent; border: 0px; margin-top: -20px; --card-secondary-font-size: 11px; } - type: entities card_mod: style: | ha-card { background: transparent; box-shadow: none; margin-top: -30px; margin-bottom: -20px; margin-left: -16px; border: 0px; } entities: - type: attribute entity: sensor.deep_sleep_USUARIO attribute: time name: Sueño profundo icon: mdi:restore card_mod: style: | :host { --paper-item-icon-color: #ae54d0; } - type: custom:mushroom-template-card primary: '' secondary: >- El cuerpo empieza a reparar músculos, depurar el cerebro y reforzar el sistema inmunitario. icon: '' multiline_secondary: true tap_action: action: none card_mod: style: | ha-card { box-shadow: none; background: transparent; border: 0px; margin-top: -20px; --card-secondary-font-size: 11px; } - type: custom:bubble-card card_type: separator icon: mdi:calendar-week name: Última semana card_mod: style: | ha-card { margin-top: 0px; } - type: custom:mini-graph-card hours_to_show: 168 height: 200 show: name: false icon: false state: false points: false labels: false legend: false entities: - entity: sensor.sleep color: orange - entity: sensor.light_sleep color: dodgerblue - entity: sensor.rem_sleep color: '#08f570' - entity: sensor.deep_sleep color: rebeccapurple card_mod: style: | ha-card { background: transparent; box-shadow: none; margin-top: -30px; border: 0px; } - type: custom:mushroom-chips-card card_mod: style: | ha-card { margin-top: -15px; border: 0px !important; --chip-box-shadow: 0px; --chip-spacing: 5px; --chip-padding: 5px; } alignment: center chips: - type: template tap_action: action: none icon: '' content: 🟨 Total card_mod: style: | ha-card { background: transparent!important; box-shadow: none!important; border: 0px; } - type: template tap_action: action: none icon: '' content: 🟪 Sueño profundo card_mod: style: | ha-card { background: transparent!important; box-shadow: none!important; border: 0px; } - type: template tap_action: action: none icon: '' content: 🟦 Sueño ligero card_mod: style: | ha-card { background: transparent!important; box-shadow: none!important; border: 0px; } - type: template tap_action: action: none icon: '' content: 🟩 Fase REM card_mod: style: | ha-card { background: transparent!important; box-shadow: none!important; border: 0px; }
Por cierto! La medición de la calidad del sueño por defecto aplica las siguientes reglas (aunque las puedes personalizar como quieras en la parte del código que te he indicado).
- 1 estrella si el tiempo total de sueño es > 7 horas
- 1 estrella si el tiempo total de sueño es > 8 horas
- 1 estrella si el tiempo de sueño profundo es > 1 hora
- 1 estrella si el tiempo de sueño profundo es > 2 horas
Ideas de automatización
Aunque puedes utilizar la tarjeta como una mera fuente de consulta, se me ocurren varias ideas que puedes aprovechar para mejorar la calidad de tu sueño. Por ejemplo:
- Si a través de tu reloj o pulsera de actividad, o de Sleep as Android, puedes detectar cuando te quedas dormido puedes desencadenar automatizaciones como apagar las luces o la televisión, o emitir una notificación a la Smart TV encendida para que bajen el volumen.
- Si una noche has dormido poco, programa una notificación para que Home Assistant te recomiende una siesta recuperadora después de comer.
- Si tomas mucho café y te cuesta dormir, pon un enchufe inteligente con medición de consumo en la cafetera para que te recuerde que tomarte un descafeinado cuando hayas dormido poco.
- También puedes programar una serie de automatizaciones para comprobar que el ambiente es perfecto para irte a dormir (bajar las persianas, reducir la temperatura de la habitación, comprobar que las ventanas están cerradas para evitar ruidos…).
¿Dudas?¿necesitas ayuda? entra aquí
Y si te ha gustado, compártelo! 🙂