¿Cuántas veces se te apagó la luz del escritorio mientras leías un PDF sin moverte? Le pasa a cualquiera que haya probado un sensor de movimiento PIR para automatizar su espacio de trabajo: el sensor solo ve cuerpos que se desplazan, y una persona concentrada frente al teclado, para él, no existe. Con el teletrabajo instalado en muchas casas chilenas, el problema se repite con la calefacción: o queda encendida en una pieza vacía, o la prendes tarde y pasas la primera hora con frío.

Este tutorial resuelve eso con un sensor de presencia por radar de ondas milimétricas (mmWave) integrado en Home Assistant. Vas a armar cuatro automatizaciones para el escritorio (luz según presencia y oscuridad, calefacción que sube cuando te sientas, alerta para ventilar cuando el aire se pone pesado y un botón de "no molestar") más un contador de horas frente al computador. Lo vas a poder montar por dos caminos: con un sensor comercial Zigbee, el ThirdReality Smart Presence Sensor R3, que es el que usó el autor del artículo original, o con una versión hecha por ti con un radar LD2410 y un ESP32 corriendo ESPHome, que funciona en tu red local sin depender de un fabricante.

Por qué un radar y no un PIR

Para entender por qué este proyecto funciona, conviene mirar cómo "ve" cada sensor.

Un PIR (sensor infrarrojo pasivo) tiene un elemento piroeléctrico doble detrás de una lente de Fresnel. Cuando una fuente de calor, como tu cuerpo, cruza de una zona de la lente a otra, los dos elementos reciben distinta radiación y aparece una diferencia de voltaje. La clave está en la palabra cruza: si te quedas quieto, la radiación se equilibra, la señal desaparece y a los pocos segundos el sensor declara la pieza vacía. Por eso un PIR funciona perfecto en un pasillo y fatal en un escritorio.

Un sensor de presencia mmWave funciona al revés: emite una señal de radio y analiza el eco. Los radares de este tipo (FMCW, de onda continua modulada en frecuencia) miden la distancia al objeto y detectan cambios muy pequeños en esa distancia, del orden de milímetros. Respirar, mover los dedos sobre el teclado o ajustar la postura alcanza para mantener la detección. La frecuencia importa: el R3 trabaja en 60 GHz y el LD2410 en 24 GHz. A mayor frecuencia, longitud de onda más corta y mejor resolución para los micromovimientos; a cambio, el haz se atenúa más rápido y atraviesa peor los obstáculos.

En la prueba del artículo original, el R3 mantuvo a una persona sentada escribiendo como "presente" durante 26 minutos seguidos sin una sola caída, con la sensibilidad de fábrica (nivel 3). Esa estabilidad es lo que permite construir todo lo demás.

ThirdReality Smart Presence Sensor R3 visto de frente: carcasa blanca con tapa translúcida de la luz, sobre piso de madera

Las dos rutas del proyecto

Ruta A: ThirdReality R3 (Zigbee) Ruta B: LD2410 + ESP32 (ESPHome)
Radar 60 GHz 24 GHz
Conexión Zigbee, necesita coordinador WiFi, API nativa de ESPHome
Extras incluidos Luz RGB, sensor de luz (lux), sensor TVOC Lo que tú agregues (por ejemplo un BH1750 para lux)
Alimentación USB-C USB al ESP32, que entrega 5 V al radar
Armado Enchufar y emparejar Soldar o cablear cuatro conexiones y cargar un YAML
Ventaja principal Todo en una caja, también refuerza la red Zigbee Barato, local y modificable

Las automatizaciones de Home Assistant son las mismas en las dos rutas: lo único que cambia es de dónde sale la entidad de ocupación. El texto sigue el montaje del original con el R3, y en cada punto donde la ruta B difiere, lo vas a ver indicado.

Qué hay dentro del R3

ThirdReality metió cuatro funciones en un gabinete compacto alimentado por USB-C, que además trabaja como router dentro de la red Zigbee:

Función Lo que recibe Home Assistant Para qué se usa aquí
Radar de presencia 60 GHz Ocupación sí/no, sensibilidad 1 a 6 (equivale a alcance de 1 a 6 m) Luz, calefacción, tiempo de trabajo
Luz RGB Color, temperatura de color de 2000 a 6500 K, brillo Luz de escritorio, rojo de "no molestar", confirmaciones
Sensor de luz Iluminancia en lux Encender la luz solo si está oscuro
Sensor TVOC Compuestos orgánicos volátiles totales en ppb, con umbral de alarma Alerta de ventilación

Un sensor de presencia a batería sería mala idea en un escritorio: el radar consume de forma continua y en el puesto de trabajo siempre hay un puerto USB a mano. El autor midió en el enchufe 0,8 W con la luz apagada y 1,4 W con la luz encendida, incluyendo el cargador, lo que equivale a entre siete y doce kWh al año.

Lo que necesitas

Ruta A (como el original):

  • El sensor ThirdReality Smart Presence Sensor R3.
  • Opcional: el botón Zigbee ThirdReality para la tecla de concentración. Sin él, la luz, la calefacción y la alerta de ventilación funcionan igual; el botón es la parte de comodidad.
  • Un coordinador Zigbee conectado a Home Assistant, por ejemplo un dongle USB tipo SONOFF ZBDongle-E.
  • Un cable USB-C y un espacio libre en el escritorio con vista a la silla.

Ruta B (hazlo tú):

  • Una placa ESP32 DevKit (cualquier ESP32 con dos pines libres para UART sirve).
  • Un sensor radar mmWave LD2410 (la versión B o C trae pines de 2,54 mm, más fáciles de cablear).
  • Opcional: un sensor de luz BH1750 por I2C para reemplazar el sensor de lux del R3.
  • Cables dupont hembra hembra y un cargador USB de 5 V.

Para las dos rutas:

  • Un servidor con Home Assistant (una Raspberry Pi 4 o 5 es la opción más común).
  • Para la automatización de calefacción, un equipo que aparezca en Home Assistant como entidad de clima (climate.*) con temperatura objetivo. En el original es un termostato de radiador Homematic IP controlado a través de Better Thermostat, pero cualquier modelo con temperatura objetivo funciona igual. En la sección para Chile vas a ver cómo adaptarlo a las estufas que se usan acá.

Ruta A: emparejar el R3 con Home Assistant

Al recibir corriente por USB, el R3 entra directo en modo de emparejamiento. En Home Assistant abre Ajustes → Dispositivos y servicios → Zigbee Home Automation → Añadir dispositivo y el sensor aparece en pocos segundos. Si no lo logras en tres minutos, mantén presionado el botón Reset del equipo por más de cinco segundos: vuelve a valores de fábrica y arranca otra vez en modo de emparejamiento. Con Zigbee2MQTT es lo mismo usando Permit join; tanto el R3 como el botón están en su lista de dispositivos compatibles.

Un detalle que confunde a mucha gente: antes de emparejarlo, el R3 se comporta como luz nocturna. Con presencia enciende su luz solo, y el color indica la calidad del aire. Después de emparejarlo, la presencia deja de encender la luz y las decisiones pasan a tus automatizaciones. Es intencional, y es la razón por la que la luz queda apagada justo después de integrarlo.

Página del dispositivo R3 en Home Assistant con ocupación, iluminancia, VOC totales, el contador de tiempo de hoy y las cuatro automatizaciones vinculadas

Ruta B: el LD2410 con ESP32 y ESPHome

Si prefieres no depender de un equipo comercial, el LD2410 de Hi Link es un radar de 24 GHz que entrega por UART si hay alguien, si ese alguien se mueve o está quieto, y a qué distancia. ESPHome trae un componente oficial para él, así que no hace falta programar en C++.

Conexiones

El LD2410 se alimenta con 5 V, pero sus pines de datos trabajan a 3,3 V, así que se conecta directo al ESP32 sin adaptador de niveles:

LD2410 ESP32 DevKit
VCC 5V (VIN)
GND GND
TX GPIO16 (RX2)
RX GPIO17 (TX2)

Si agregas el BH1750, va al bus I2C: SDA a GPIO21, SCL a GPIO22, VCC a 3V3 y GND a GND.

Se usa el UART2 (GPIO16 y GPIO17) para dejar el UART0 libre para los logs por USB. Fíjate en que TX del radar va a RX del ESP32 y al revés: es el error más común, y el síntoma es que ESPHome compila y arranca, pero las entidades del radar nunca cambian de estado.

Configuración de ESPHome

Este YAML crea el dispositivo escritorio-presencia con la ocupación, los indicadores de objetivo en movimiento y quieto, la distancia de detección y la iluminancia del BH1750. Las credenciales van en tu archivo secrets.yaml de ESPHome. Si no usas el BH1750, borra el bloque i2c: y la entrada bh1750 de sensor:.

YAML
esphome:
  name: escritorio-presencia
  friendly_name: Escritorio presencia

esp32:
  board: esp32dev
  framework:
    type: arduino

logger:

api:
  encryption:
    key: !secret api_key

ota:
  - platform: esphome
    password: !secret ota_password

wifi:
  ssid: !secret wifi_ssid
  password: !secret wifi_password

uart:
  id: uart_ld2410
  tx_pin: GPIO17
  rx_pin: GPIO16
  baud_rate: 256000
  parity: NONE
  stop_bits: 1

ld2410:
  uart_id: uart_ld2410

i2c:
  sda: GPIO21
  scl: GPIO22

binary_sensor:
  - platform: ld2410
    has_target:
      name: "Ocupación"
    has_moving_target:
      name: "Objetivo en movimiento"
    has_still_target:
      name: "Objetivo quieto"

sensor:
  - platform: ld2410
    detection_distance:
      name: "Distancia de detección"
  - platform: bh1750
    name: "Iluminancia"
    address: 0x23
    update_interval: 10s

Detalles que conviene saber:

  • 256000 baudios es la velocidad de fábrica del LD2410. Si alguna vez la cambiaste con la aplicación del fabricante, ajusta baud_rate.
  • El radar divide su alcance en compuertas (gates) de 0,75 m, y cada una tiene su propio umbral de energía para movimiento y para quietud. ESPHome puede exponer esos umbrales como entidades number; si el sensor "ve" el pasillo detrás de la puerta, sube el umbral de las compuertas lejanas en vez de bajar la sensibilidad general.
  • El LD2410 original trae pines de 1,27 mm, que no calzan con los cables dupont comunes. Las versiones B y C usan 2,54 mm y además se pueden configurar por Bluetooth con la aplicación HLKRadarTool.

Que las automatizaciones del original funcionen sin tocarlas

Las automatizaciones de abajo usan las entidades del R3 del autor, con nombres en alemán. Con ESPHome, tu ocupación va a llamarse algo como binary_sensor.escritorio_presencia_ocupacion (revisa la página del dispositivo para ver el nombre exacto). Tienes dos caminos:

  1. Reemplazar el entity_id en cada automatización.
  2. Renombrar la entidad en Home Assistant (Ajustes → Entidades → la entidad → ID de entidad) para que coincida con la del original. Así puedes pegar el YAML tal cual.

Esta tabla te sirve en las dos rutas para saber qué es cada entidad:

Entidad del original Qué es
binary_sensor.schreibtisch_sensor_belegung Ocupación del escritorio
sensor.schreibtisch_sensor_beleuchtungsstarke Iluminancia en lux
sensor.schreibtisch_sensor_gesamt_vocs VOC totales en ppb (solo R3)
light.schreibtisch_sensor Luz RGB del R3 o tu lámpara de escritorio
input_boolean.schreibtisch_fokus Ayudante "modo concentración"
input_boolean.schreibtisch_automatik_pause Ayudante "pausa de la automatización"
input_number.schreibtisch_lueftungsschwelle Ayudante con el umbral de ventilación
climate.heizung_buro_philipp Calefacción de la oficina
notify.mobile_app_dein_handy Notificación a tu celular (app de Home Assistant)

Dónde poner el sensor y cuánto alcance darle

El R3 va sobre la mesa y detecta hacia adelante, así que su frente debe apuntar a la silla. El fabricante recomienda alejarlo de objetos metálicos y no poner dos radares enfrentados (lo mismo vale para el LD2410: dos radares que se miran se interfieren). En el R3, la sensibilidad de 1 a 6 no es un ajuste fino: es el alcance en metros, y el nivel 3 de fábrica equivale a tres metros. Para un escritorio donde el sensor queda a un metro de la silla alcanza con nivel 3 o 4 (el autor usa 4). Si no quieres que detecte también el pasillo con la puerta abierta, baja el nivel en vez de subirlo.

El nivel se cambia con el botón Level del equipo o directamente en Home Assistant, en el campo de sensibilidad del sensor de presencia.

Parte trasera del ThirdReality R3 con los botones Level, para el alcance, y Reset

El botón Level ajusta el alcance; Reset, con una pulsación corta, activa o desactiva la alarma roja de aire, y con una pulsación larga restablece el equipo.

Los campos de configuración del R3

Home Assistant crea, además de los tres sensores y la luz, una tarjeta de configuración completa. Casi todo se puede dejar como viene; lo único que de verdad hay que tocar es la sensibilidad:

Campo Significado Recomendación
Sensibilidad del sensor de presencia (1 a 6) Alcance del radar en metros 3 a 4 en un escritorio
Retardo de ocupado a libre (s) Cuánto sigue informando "ocupado" tras la última detección 0: el tiempo de espera lo manejan las automatizaciones
Retardo de libre a ocupado (s) Cuánto tiempo debe haber alguien antes de informar "ocupado" 0
Umbral de aire (ppb) Desde este valor de TVOC la luz parpadea en rojo; rango de 3000 a 50000 49999; si no, parpadea todas las tardes (ver la alerta de ventilación)
Brillo y temperatura de color al encender Estado de la luz cuando recibe "encender" sin parámetros Da lo mismo: las automatizaciones envían brillo y color
Comportamiento al volver la energía Estado de la luz después de un corte "Valor anterior" (fábrica) sirve; "apagado" si quieres que quede oscura
Calibrar sensor TVOC Inicia la calibración del sensor de aire Solo con valores claramente erróneos

Tarjeta de configuración del R3 en Home Assistant con la sensibilidad del sensor de presencia, el umbral de aire, los retardos y la calibración del TVOC

Los tres ayudantes

Para controlar todo necesitas tres ayudantes (Ajustes → Dispositivos y servicios → Ayudantes → Crear ayudante):

  • Dos de tipo interruptor (toggle): schreibtisch_fokus, para el "no molestar", y schreibtisch_automatik_pause, que suspende toda la automatización, por ejemplo cuando en una videollamada quieres que la luz quede encendida diga lo que diga el sensor.
  • Uno de tipo número: schreibtisch_lueftungsschwelle, de 500 a 20000, en pasos de 100 y con unidad ppb, para la alerta de ventilación.

Mientras la pausa está activa, la rama "libre" tampoco apaga nada. Es a propósito, y por eso hay una automatización extra que quita la pausa todas las mañanas a las siete: un disparador de hora y una acción input_boolean.turn_off. Así una pausa olvidada no queda para siempre.

Automatización 1: luz del escritorio según presencia

La luz del R3 hace de lámpara de escritorio: blanco cálido al 40 % cuando hay alguien sentado y hay menos de 20 lux, y apagada cuando pasan cinco minutos sin nadie. Si tienes una lámpara real integrada en Home Assistant, solo cambia la entidad de luz. En la ruta B, esa lámpara es justamente lo que vas a controlar, ya que el LD2410 no trae luz propia.

La automatización tiene tres disparadores para que también reaccione si oscurece cuando ya estás sentado:

YAML
alias: "Schreibtisch: Licht bei Anwesenheit"
mode: single
triggers:
  - id: anwesend
    trigger: state
    entity_id: binary_sensor.schreibtisch_sensor_belegung
    to: "on"
  - id: dunkel
    trigger: numeric_state
    entity_id: sensor.schreibtisch_sensor_beleuchtungsstarke
    below: 20
  - id: frei
    trigger: state
    entity_id: binary_sensor.schreibtisch_sensor_belegung
    to: "off"
    for:
      minutes: 5
conditions:
  - condition: state
    entity_id: input_boolean.schreibtisch_automatik_pause
    state: "off"
actions:
  - choose:
      - conditions:
          - condition: trigger
            id:
              - anwesend
              - dunkel
          - condition: state
            entity_id: input_boolean.schreibtisch_fokus
            state: "off"
          - condition: state
            entity_id: binary_sensor.schreibtisch_sensor_belegung
            state: "on"
          - condition: or
            conditions:
              - condition: numeric_state
                entity_id: sensor.schreibtisch_sensor_beleuchtungsstarke
                below: 20
              - condition: state
                entity_id: light.schreibtisch_sensor
                state: "on"
        sequence:
          - action: light.turn_on
            target:
              entity_id: light.schreibtisch_sensor
            data:
              brightness_pct: 40
              color_temp_kelvin: 3000
      - conditions:
          - condition: trigger
            id: frei
        sequence:
          - action: light.turn_off
            target:
              entity_id: light.schreibtisch_sensor
          - action: input_boolean.turn_off
            target:
              entity_id: input_boolean.schreibtisch_fokus

Dos detalles de diseño que vale la pena entender:

  • La condición "menos de 20 lux o la luz ya encendida" evita un bucle clásico: la propia luz sube la lectura del sensor por encima del umbral y la automatización se bloquearía sola. Con la ruta B y un BH1750, ubica el sensor de luz de modo que no reciba de lleno la lámpara, por la misma razón.
  • Al dejar el puesto, la rama "libre" también apaga el modo concentración, para que la luz roja no quede encendida protegiendo a alguien que ya no está.

Automatización de luz del escritorio por presencia en el editor de Home Assistant, con tres disparadores y dos opciones

Automatización 2: calefacción a 22 grados cuando te sientas

Es la parte de la que más se espera en invierno. El termostato de la oficina queda fijo en 18 grados. Si alguien pasa tres minutos sentado, Home Assistant sube la temperatura objetivo a 22 grados; si el puesto queda vacío 30 minutos, vuelve al modo eco. Los tres minutos evitan que entrar un momento a buscar algo encienda la calefacción, y los 30 minutos cubren la pausa del café.

En el original, el termostato Homematic está detrás de Better Thermostat; la automatización solo cambia el modo preestablecido y la temperatura objetivo, y el regulador hace el resto. El autor armó todo en septiembre (fines de verano en Alemania) con la calefacción apagada, así que los 30 minutos de espera todavía no estaban probados en temporada de frío.

YAML
alias: "Schreibtisch: Heizung bei Anwesenheit"
mode: single
triggers:
  - id: anwesend
    trigger: state
    entity_id: binary_sensor.schreibtisch_sensor_belegung
    to: "on"
    for:
      minutes: 3
  - id: frei
    trigger: state
    entity_id: binary_sensor.schreibtisch_sensor_belegung
    to: "off"
    for:
      minutes: 30
conditions:
  - condition: state
    entity_id: input_boolean.schreibtisch_automatik_pause
    state: "off"
  - condition: state
    entity_id: climate.heizung_buro_philipp
    state: heat
actions:
  - choose:
      - conditions:
          - condition: trigger
            id: anwesend
        sequence:
          - action: climate.set_preset_mode
            target:
              entity_id: climate.heizung_buro_philipp
            data:
              preset_mode: none
          - action: climate.set_temperature
            target:
              entity_id: climate.heizung_buro_philipp
            data:
              temperature: 22
      - conditions:
          - condition: trigger
            id: frei
        sequence:
          - action: climate.set_preset_mode
            target:
              entity_id: climate.heizung_buro_philipp
            data:
              preset_mode: eco

Automatización de calefacción por presencia en el editor de Home Assistant, con los disparadores de 3 minutos ocupado y 30 minutos libre

La condición sobre el modo de calefacción (state: heat) hace que la automatización no haga nada en verano mientras el termostato está en "apagado". Si tu equipo no tiene el modo eco, cambia la última acción por un climate.set_temperature con 18 grados. Lo que el sensor no puede hacer, por definición, es precalentar antes de que llegues: para eso sigue siendo mejor un horario o el calendario.

Better Thermostat de la oficina en Home Assistant, con el campo Eco en 18 grados

Automatización 3: alerta de ventilación por calidad del aire (solo R3)

El sensor TVOC del R3 mide compuestos orgánicos volátiles: desde lo que exhalamos hasta productos de limpieza o el pegamento de un mueble nuevo, y entrega un valor total en ppb. ThirdReality lo divide en cuatro niveles: bueno hasta 2000 ppb, ventilar hasta 4000, advertencia hasta 6000 y peligro sobre eso. Desde el valor del campo "umbral de aire", la luz del R3 parpadea en rojo por su cuenta, algo que se desactiva con una pulsación corta del botón Reset.

Antes de automatizar sobre ese número, conviene saber qué mide de verdad. El autor dejó el R3 dos días junto a un Airthings View Plus, que mide VOC, CO₂ y material particulado:

Situación TVOC R3 VOC Airthings CO₂ Airthings PM2,5 Airthings
Living vacío, de día 250 a 400 ppb 60 a 160 ppb 570 ppm 2 a 9 µg/m³
De noche, una persona, ventana cerrada 5.000 a 10.000 ppb, subiendo hasta la mañana 450 a 930 ppb, bajando desde las 20:00 700 → 1.100 ppm, subiendo hasta la mañana 2 a 5 µg/m³
Aspirando 20 minutos 520 → 885 ppb 76 → 104 ppb Sin cambio 9 → 230 µg/m³

La curva del R3 sigue a la del CO₂, no a la de VOC del Airthings: las dos suben cuando hay alguien en la pieza y se quedan arriba toda la noche. La explicación está en el tipo de sensor. Un sensor de óxido metálico (MOX) tiene una capa calefaccionada cuya resistencia cambia cuando gases reductores (hidrógeno, etanol, acetona y otros compuestos que exhalamos y emanamos) reaccionan en su superficie. En una pieza cerrada esos gases se acumulan al mismo ritmo que el CO₂. El Airthings, en cambio, aplica una corrección de línea base que va bajando un valor alto sostenido durante horas, y de ahí la caída desde las 20:00. El R3 tampoco ve el polvo: al aspirar reaccionó al aire caliente del motor, no a las partículas.

En resumen: el TVOC del R3 es un indicador útil de aire viciado, casi como un sensor de CO₂, pero el número en sí y los cuatro niveles del fabricante no sirven como referencia. Con una persona en la pieza, de noche marca entre diez y veinte veces el valor del día, y la luz parpadearía en rojo desde 6000 ppb todas las tardes; por eso el autor subió el umbral de aire a 49999.

La automatización, entonces, no usa un número fijo sino el ayudante de umbral, y solo avisa si hay alguien sentado y es de día. La alerta se levanta cuando el valor pasa 20 minutos bajo el umbral:

YAML
alias: "Schreibtisch: Lüftungsalarm"
mode: single
triggers:
  - id: dick
    trigger: numeric_state
    entity_id: sensor.schreibtisch_sensor_gesamt_vocs
    above: input_number.schreibtisch_lueftungsschwelle
    for:
      minutes: 10
  - id: gut
    trigger: numeric_state
    entity_id: sensor.schreibtisch_sensor_gesamt_vocs
    below: input_number.schreibtisch_lueftungsschwelle
    for:
      minutes: 20
conditions:
  - condition: state
    entity_id: binary_sensor.schreibtisch_sensor_belegung
    state: "on"
  - condition: time
    after: "07:00:00"
    before: "22:00:00"
actions:
  - choose:
      - conditions:
          - condition: trigger
            id: dick
        sequence:
          - action: notify.mobile_app_dein_handy
            data:
              title: "Schreibtisch: lüften"
              message: >-
                {{ states('sensor.schreibtisch_sensor_gesamt_vocs') }} ppb TVOC,
                seit 10 Minuten über deiner Schwelle von
                {{ states('input_number.schreibtisch_lueftungsschwelle') }} ppb.
      - conditions:
          - condition: trigger
            id: gut
        sequence:
          - action: notify.mobile_app_dein_handy
            data:
              title: "Schreibtisch: Luft wieder gut"
              message: "TVOC seit 20 Minuten unter der Schwelle."

Gráfico de historial de Home Assistant de 24 horas: presencia, TVOC del ThirdReality R3 y VOC del Airthings View Plus en ppb, y abajo PM2,5 en µg/m³ con el peak de la aspiradora

En el gráfico, el R3 (turquesa) sube a 10.000 ppb desde las 19:30 con una persona en la pieza y se queda ahí hasta la mañana, mientras el VOC del Airthings (naranjo) se ve plano en esa escala. Abajo aparece el peak de PM2,5 de la aspiradora a las 11:10, y arriba la presencia, que marca "libre" toda la noche porque el sensor no apuntaba al sillón.

Cómo elegir tu umbral: después de una semana, mira en el historial dónde queda el valor tras una mañana en el escritorio con la ventana cerrada y fija el ayudante bastante más arriba, por ejemplo en una vez y media ese valor. En el living del autor serían unos 8000 ppb; en una oficina más chica el número va a ser otro. Si después de ventilar el valor no baja claramente en media hora, la causa no eres tú sino algo en la pieza, como pintura fresca o productos de limpieza.

En la ruta B no hay sensor TVOC, así que esta automatización no aplica tal cual. En "Variantes y mejoras" tienes la alternativa.

Automatización 4: el botón de concentración

El botón Zigbee de ThirdReality reconoce tres gestos: pulsación corta, doble y larga. En ZHA llegan como evento zha_event con los comandos single, double y hold. La dirección Zigbee del botón aparece en su página de dispositivo y reemplaza, en el YAML de abajo, la dirección del botón del autor. En Zigbee2MQTT las pulsaciones llegan en el atributo action; los valores exactos están en la página del botón en Zigbee2MQTT.

Lo que hace cada gesto:

  • Corta: activa el modo concentración y la luz se pone roja: "no molestar" para cualquiera que pase por la oficina.
  • Corta otra vez: desactiva el modo concentración y vuelve la luz de escritorio.
  • Doble: activa o desactiva la pausa de la automatización. La luz confirma durante un segundo y medio en verde ("pausa activada") o en rojo ("pausa desactivada") y luego vuelve al estado anterior.
  • Larga: luz de lectura, 100 % blanco neutro, y modo concentración apagado.

Botón Zigbee Smart Button de ThirdReality, con su tecla redonda y la caja al lado

YAML
alias: "Schreibtisch: Taste"
mode: queued
triggers:
  - id: kurz
    trigger: event
    event_type: zha_event
    event_data:
      device_ieee: "ff:ff:b4:0e:06:09:af:06"
      command: single
  - id: doppelt
    trigger: event
    event_type: zha_event
    event_data:
      device_ieee: "ff:ff:b4:0e:06:09:af:06"
      command: double
  - id: lang
    trigger: event
    event_type: zha_event
    event_data:
      device_ieee: "ff:ff:b4:0e:06:09:af:06"
      command: hold
actions:
  - choose:
      # kurz, Fokus war aus: Fokus an, Licht rot
      - conditions:
          - condition: trigger
            id: kurz
          - condition: state
            entity_id: input_boolean.schreibtisch_fokus
            state: "off"
        sequence:
          - action: input_boolean.turn_on
            target:
              entity_id: input_boolean.schreibtisch_fokus
          - action: light.turn_on
            target:
              entity_id: light.schreibtisch_sensor
            data:
              brightness_pct: 60
              rgb_color: [255, 0, 0]
      # kurz, Fokus war an: Fokus aus, zurück zum Schreibtischlicht
      - conditions:
          - condition: trigger
            id: kurz
          - condition: state
            entity_id: input_boolean.schreibtisch_fokus
            state: "on"
        sequence:
          - action: input_boolean.turn_off
            target:
              entity_id: input_boolean.schreibtisch_fokus
          - action: light.turn_on
            target:
              entity_id: light.schreibtisch_sensor
            data:
              brightness_pct: 40
              color_temp_kelvin: 3000
      # doppelt: Automatik-Pause umschalten, kurz quittieren, Licht wiederherstellen
      - conditions:
          - condition: trigger
            id: doppelt
        sequence:
          - action: scene.create
            data:
              scene_id: schreibtisch_licht_vorher
              snapshot_entities:
                - light.schreibtisch_sensor
          - action: input_boolean.toggle
            target:
              entity_id: input_boolean.schreibtisch_automatik_pause
          - if:
              - condition: state
                entity_id: input_boolean.schreibtisch_automatik_pause
                state: "on"
            then:
              - action: light.turn_on
                target:
                  entity_id: light.schreibtisch_sensor
                data:
                  brightness_pct: 100
                  rgb_color: [0, 255, 0]
            else:
              - action: light.turn_on
                target:
                  entity_id: light.schreibtisch_sensor
                data:
                  brightness_pct: 100
                  rgb_color: [255, 0, 0]
          - delay:
              seconds: 1.5
          - action: scene.turn_on
            target:
              entity_id: scene.schreibtisch_licht_vorher
      # lang: Leselicht, Fokus aus
      - conditions:
          - condition: trigger
            id: lang
        sequence:
          - action: input_boolean.turn_off
            target:
              entity_id: input_boolean.schreibtisch_fokus
          - action: light.turn_on
            target:
              entity_id: light.schreibtisch_sensor
            data:
              brightness_pct: 100
              color_temp_kelvin: 4000

La confirmación del doble clic usa scene.create: Home Assistant guarda una foto del estado de la luz, parpadea en el color y scene.turn_on restaura el estado anterior, ya sea que la luz estuviera apagada, en blanco cálido o en rojo. El modo queued hace que pulsaciones rápidas seguidas se procesen una tras otra sin interrumpirse. En el botón del autor cada clic llegó como exactamente un evento; si no necesitas el doble clic, desactívalo en la tarjeta del dispositivo ("desactivar doble clic") y el botón reacciona al instante en cada pulsación.

Automatización del botón Zigbee en el editor de Home Assistant, con tres disparadores zha_event y cuatro opciones

¿Haces la ruta B y no tienes botón Zigbee? Los mismos interruptores (schreibtisch_fokus y schreibtisch_automatik_pause) se manejan desde el panel de Home Assistant o desde el celular.

Panel y tiempo de trabajo

Un ayudante de tipo estadísticas del historial (history stats) convierte la ocupación en un número: entidad de ocupación, estado "on", tipo "tiempo", inicio {{ today_at() }} y fin {{ now() }}. El autor lo llamó "Escritorio hoy", y la primera tarde marcó 2 horas y 56 minutos.

En un panel pequeño se pueden juntar la presencia, el modo concentración, la pausa, la luz con control de brillo, el TVOC con su tendencia, la calefacción con su temperatura objetivo y un historial de 24 horas.

Panel del escritorio en Home Assistant con presencia, tiempo de hoy en el puesto, modo concentración, pausa automática, calidad del aire, calefacción e historial

Lo que mostró el montaje en el uso diario

  • La reacción es inmediata: entre la pulsación del botón y la luz roja, el registro (trace) mostró un cuarto de segundo.
  • El radar retiene la ocupación mientras haya alguien dentro de su campo. Para la luz y la calefacción, esa inercia es justo lo que se busca.
  • El campo de detección es un cono hacia adelante, no una visión en 360°. En el living, junto al Airthings y sin apuntar al sillón, el R3 no vio a una persona en toda la tarde, aunque sus sensores de aire sí la registraron. En el borde del alcance, la ocupación parpadea en tramos de cinco a diez segundos en vez de quedarse estable. El sensor va con el frente hacia la silla, no en cualquier rincón del estante.
  • Una persona durmiendo también está "presente" para un radar. Si piensas usarlo como luz nocturna junto a la cama, un PIR es mejor opción.
  • Cambiar la sensibilidad reinicia el sensor. En el modelo hermano de 24 GHz del mismo fabricante, el R2, la ocupación pasó de inmediato a "apagado" y tardó uno a dos minutos en volver a informar; si pruebas niveles, espera después de cada cambio. Además, en el R2 los metros declarados resultaron optimistas: el nivel 4 no alcanzó para detectar a una persona sentada a tres metros, y con el nivel 5 sí. Para el R3 en un escritorio no importa, porque está a un metro de la silla.
  • El R3 es router Zigbee: refuerza la red para equipos a batería cercanos. Por lo mismo, necesita corriente permanente; si lo desenchufas, los equipos que se enrutaban por él pierden la conexión un momento hasta encontrar otro camino.

Errores comunes y cómo resolverlos

  • La luz se apaga aunque estás sentado: revisa hacia dónde apunta el sensor; si estás en el borde del alcance, sube un nivel. Con el LD2410, mira la entidad de distancia de detección para ver a cuántos metros te ubica.
  • La luz nunca se enciende: revisa que el ayudante de pausa esté en "off" y que el valor de lux realmente baje de 20 cuando oscurece. Si el sensor de luz recibe la luz de la pantalla, puede no bajar nunca de ese valor.
  • El LD2410 no entrega datos: casi siempre son TX y RX cruzados al revés, o una velocidad distinta de 256000. Revisa también que reciba 5 V y no 3,3 V.
  • El sensor detecta a alguien en el pasillo: baja el alcance (R3) o sube el umbral de las compuertas más lejanas (LD2410).

Variantes y mejoras

  • Medir CO₂ real en vez de TVOC: si el TVOC del R3 termina siguiendo al CO₂, ¿por qué no medir CO₂ directamente? Un sensor NDIR como el SCD40 o el SCD41 por I2C, agregado al mismo ESP32 de la ruta B, entrega ppm reales. Ahí sí puedes usar umbrales con sentido (sobre 1000 ppm, ventilar) y la automatización 3 funciona cambiando solo la entidad del sensor y el ayudante de umbral.
  • Recordatorio de pausa activa: con la misma ocupación puedes avisarte cuando llevas mucho rato sentado. Este disparador se activa cuando la ocupación lleva 50 minutos seguidos en "on" (si te levantas, el conteo vuelve a cero):
YAML
alias: "Escritorio: pausa activa"
mode: single
triggers:
  - trigger: state
    entity_id: binary_sensor.schreibtisch_sensor_belegung
    to: "on"
    for:
      minutes: 50
conditions:
  - condition: state
    entity_id: input_boolean.schreibtisch_automatik_pause
    state: "off"
actions:
  - action: notify.mobile_app_dein_handy
    data:
      title: "Escritorio: pausa"
      message: "Llevas 50 minutos sentado. Levántate y estira las piernas."
  • Pantalla en el mismo ESP32: una pantalla OLED SSD1306 por I2C, en el mismo bus que el BH1750, puede mostrar las horas de trabajo del día o el estado de concentración, leyendo las entidades de Home Assistant desde ESPHome con la plataforma homeassistant.

Personalización para Chile

La calefacción. El original controla un radiador con válvula termostática, algo poco común en las casas chilenas. Acá lo habitual es una estufa eléctrica, un aire acondicionado split con bomba de calor o una estufa a parafina o a gas. Las opciones para que la automatización 2 te sirva:

  • Aire acondicionado split: si tu equipo se integra a Home Assistant (por WiFi o con un emisor infrarrojo), ya aparece como entidad climate con temperatura objetivo y modo eco o similar, y la automatización funciona cambiando solo el entity_id.
  • Estufa eléctrica en un enchufe inteligente: el ayudante termostato genérico (generic thermostat) de Home Assistant combina el enchufe con un sensor de temperatura y crea una entidad climate que la automatización puede usar sin cambios.
  • Estufas a gas o a parafina: no las automatices. Encender a distancia un equipo de combustión es un riesgo de incendio y de monóxido de carbono. Úsalas con una persona presente y una ventilación adecuada.

Los componentes. El R3 y el botón Zigbee no se venden en Chile por ahora, y por eso la ruta B tiene sentido acá. En MechatronicStore encuentras lo necesario para armarla:

  • Placa ESP32 DevKit: el cerebro de la ruta B; corre ESPHome y se conecta por WiFi a Home Assistant.
  • Sensor radar mmWave LD2410: el reemplazo del radar del R3, con detección de personas quietas hasta unos 6 m.
  • Sensor de luz BH1750: reemplaza el sensor de lux del R3 para la automatización de luz.
  • Cables dupont hembra hembra y un cargador USB de 5 V con su cable, para alimentar el ESP32 y el radar.
  • Raspberry Pi 4 o 5: si todavía no tienes un servidor para Home Assistant.
  • Módulo coordinador Zigbee USB: si vas por la ruta A o quieres sumar otros sensores Zigbee a tu casa.
  • Sensor de calidad de aire por I2C: para recuperar la alerta de ventilación en la ruta B (ver "Variantes y mejoras").

Si en el tutorial original usan el ThirdReality R3, el LD2410 con un ESP32 cumple la misma función de presencia; la luz RGB la reemplaza cualquier lámpara integrada a Home Assistant.

Recursos

Versión chilena con componentes en stock local.