Tarjeta de control del tiempo

Tarjeta de control del tiempo

Si quieres saber a qué te dedicas en tu vida, hoy te enseño a crear una tarjeta de control del tiempo para tener esta información.

¿Por qué controlar el tiempo dedicado?

La verdad, se me ocurren muchas situaciones en mi vida en las que he querido tener este dato, o al menos me habría venido bien tenerlo. Tener una tarjeta de control del tiempo puede ayudarte, por ejemplo a:

  • Construir hábitos saludables y marcarte objetivos. Por ejemplo, puedes establecer una meta de 3 horas de deporte a la semana y recibir una notificación de felicitación cuando lo cumplas.
  • Limitar ciertas actividades. Tener este dato puede ser revelador, por ejemplo, si eres de las personas que tiende a pasar más horas de lo aconsejable trabajando, o quieres controlar el tiempo que tus hijos dedican a la consola.
  • Tener una perspectiva general de tu tiempo. En periodos en los que te sientes, por ejemplo, cansado o estresado puede ayudarte mucho analizar el tiempo que pasas fuera de casa o descansando.

Requisitos previos

Para crear estar tarjeta de control del tiempo necesitas:

Sensores de control del tiempo

Lo primero que necesitamos para nuestra tarjeta de control del tiempo es contar con los sensores que nos proporcionen la información correspondiente.

Como te decía, en mi caso utilizo nuestro Sistema de Presencia Total, por lo que ya tengo un sensor que registra lo que estoy haciendo en cada momento (con el nivel de detalle que yo le quiera dar). No obstante, también puedes utilizar sensores más sencillos con el mismo propósito (por ejemplo, un enchufe inteligente conectado a la consola para saber si está encendida o apagada).

Sea como sea, tienes que crear un ayudante de tipo «Estadísticas históricas» para cada una de las categorías que quieras controlar. Por ejemplo, en mi caso he creado los siguientes ayudantes:

  • Trabajando. Este ayudante recoge las horas que paso trabajando, en función de si mi laptop está encendido o no. Si trabajas fuera de casa, puedes medirlo en función de si te encuentras dentro de la zona geográfica de tu centro de trabajo. También puedes crear un sensor template, que sume ambos!
  • Deporte. Este ayudante agrega las horas que paso haciendo deporte. En mi caso lo hago combinando cuando me encuentro dentro de ciertas áreas geográficas (como el rocódromo, la piscina, el gimnasio…) o cuando estoy conectado a mis auriculares de correr (independientemente de donde esté).
  • En casa. Siendo el descanso una parte clave de la salud, me gusta saber cuando tiempo paso en casa (además de ser el sitio donde pasamos tiempo en familia). Esto es muy fácil de medir, usando cualquiera de tus ‘device tracker’.
  • Fuera de casa. Como despejarse y tener ocio es importante, también registro el tiempo que paso fuera de casa. Este es fácil de medir, por oposición al anterior.

De esta forma he generado los siguientes sensores que reportan la distribución de las horas de la última semana (teniendo en cuenta que puedes haber dedicado tiempo a actividades que encajen en otras categorías).

Además, aprovechando toda esta información, voy a crear un sensor personalizado que me proporcione información cualitativa en función de mis pereferencias:

  • Si paso más de 40 horas trabajando, toma el valor de «workaholic».
  • Si hago menos de 3 horas de deporte a la semana, toma el valor de «sedentario».
  • Si paso fuera de casa menos de 10 horas, toma el valor de «ermitaño».

Para ello simplemente he creado el siguiente código en mi fichero ‘sensors.yaml’:

- platform: template
  sensors:
    presencia_tito_tiempo:
      friendly_name: "TiTo (tiempo)"
      value_template: >
        {% if states('sensor.presencia_tito_trabajando') | float > 40 %}
          workaholic
        {% elif states('sensor.presencia_tito_deporte') | float < 3 %}
          sedentario
        {% elif states('sensor.presencia_tito_fuera') | float < 10 %}
          ermitaño
        {% else %}
          saludable
        {% endif %}
      icon_template: mdi:user

Tarjeta de control del tiempo

Ahora que tenemos preparada la información necesaria, vamos a crear nuestra tarjeta de control del tiempo. En mi caso voy a utilizar un gráfico de tipo ‘donut’ usando la tarjeta ApexCharts Card y en el centro del mismo, una imagen estilo Pixar que represente el estado del último sensor que he creado en el apartado anterior. De esta forma tendré la información cuantitiva y un ‘feedback’ visual de un rápido vistazo.

A continuación te dejo el código completo de la tarjeta del ejemplo:

type: vertical-stack
cards:
  - type: custom:bubble-card
    card_type: pop-up
    hash: "#presencia_tito"
    name: Tiempo dedicado
    icon: mdi:timelapse
    button_type: name
    modules:
      - default
  - type: custom:apexcharts-card
    apex_config:
      chart:
        height: 400
      legend:
        show: false
      dataLabels:
        formatter: |
          EVAL:function(value) {
            return value.toFixed(0) + " %";
          }
    chart_type: donut
    header:
      show: true
      show_states: false
      colorize_states: true
    stacked: true
    card_mod:
      style: |
        ha-card {
          border: 0px;
          box-shadow: none;
        }
    series:
      - entity: sensor.presencia_tito_casa
        color: cornflowerblue
        name: Descanso
        show:
          legend_value: false
          datalabels: percent
      - entity: sensor.presencia_tito_deporte
        color: crimson
        name: Deporte
        show:
          legend_value: false
          datalabels: percent
      - entity: sensor.presencia_tito_fuera
        color: orange
        name: Ocio
        show:
          legend_value: false
          datalabels: percent
      - entity: sensor.presencia_tito_trabajando
        color: yellowgreen
        name: Trabajo
        show:
          legend_value: false
          datalabels: percent
  - type: custom:mushroom-template-card
    icon: mdi:home
    layout: vertical
    secondary: ""
    primary: ""
    picture: /local/person/tito/{{states('sensor.presencia_tito_tiempo') }}.jpeg
    card_mod:
      style: |
        ha-card {
          background: transparent;
          border: 0px;
          box-shadow: none;
          --icon-size: 195px;
          margin-top: -288px;
        }
  - type: custom:bubble-card
    card_type: separator
    name: Última semana
    icon: mdi:timer-sand-complete
    modules:
      - default
    sub_button:
      - entity: sensor.presencia_tito_tiempo
        show_state: true
        show_name: false
        show_icon: false
        state_background: false
        show_background: false
    card_mod:
      style: |
        ha-card {
          margin-top: -10px!important;
          margin-bottom: 10px!important;
        }
  - type: custom:bar-card
    positions:
      name: inside
    card_mod:
      style: |-
        ha-card { 
          --primary-text-color: white;
          background: transparent;
          box-shadow: none;
          margin-top: -20px;
          border: 0px;
        }
        bar-card-name {
          margin-left: 20px;
        }
        bar-card-currentbar {
          border-radius: 10px !important;
        }
        bar-card-backgroundbar {
          border-radius: 10px !important;
          opacity: 0.7
        }
        bar-card-value {
          margin-right: 12px;
          font-size: 11px;
          text-shadow: 1px 1px #0005;
          opacity: .5
        }
    entities:
      - entity: sensor.presencia_tito_trabajando
        icon: mdi:egg
        name: Trabajo
        decimal: 0
        positions:
          icon: inside
        color: yellowgreen
        max: 40
        unit_of_measurement: Horas
      - entity: sensor.presencia_tito_deporte
        icon: mdi:run-fast
        name: Deporte
        decimal: 0
        positions:
          icon: inside
        color: crimson
        max: 3
        unit_of_measurement: Horas
      - entity: sensor.presencia_tito_fuera
        icon: mdi:glass-mug-variant
        name: Ocio
        decimal: 0
        positions:
          icon: inside
        color: orange
        max: 10
        unit_of_measurement: Horas