Tarjeta de monitorización de sueño

Hoy vamos a crear una tarjeta de monitorización de sueño en Home Assistant, para observar nuestro nivel de descanso y mejorarlo.

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)
Tarjeta sueño

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
Tarjeta sueño

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! 🙂
sorteo
Send this to a friend