¿Cuántas veces el extractor del baño quedó prendido toda la tarde porque nadie apagó el control remoto? ¿O peor: justo cuando lo necesitabas, la pila estaba muerta y el espejo terminó empañado? Ese fue exactamente el punto de partida de Achim Pieters (Studio Pieters) tras renovar su baño. En este tutorial vas a aprender a transformar ese extractor tonto en un sistema autónomo que decide solo cuándo ventilar, se controla desde tu iPhone con Apple HomeKit y sigue funcionando aunque se caiga el WiFi. La gracia: no tocamos los 230V de la instalación ni intervenimos el motor. Reutilizamos el control remoto original y lo manejamos con una placa ESP32 C3.
Al terminar vas a tener claro cómo leer humedad con un sensor SHT30 por I2C, cómo simular pulsaciones de botones de forma segura con salidas en open drain, y por qué una buena lógica de histéresis es la diferencia entre un baño seco y un relé que castañetea cada 30 segundos.

Qué vamos a construir
Los objetivos del proyecto son concretos y vale la pena tenerlos a la vista antes de empezar:
- Integrar el extractor del baño a Apple HomeKit con cumplimiento HAP real.
- Control automático basado en humedad, con detección de ducha.
- Mantener el control manual disponible desde la app Casa.
- Que todo funcione 100% offline, sin depender de la nube.
- No intervenir directamente la instalación eléctrica de 230V.
En resumen: hacer la ventilación inteligente, confiable y que se resuelva sola.
El primer intento que NO funcionó: clonar la señal RF
La unidad de ventilación usa un control remoto por radiofrecuencia en 868 MHz. La idea inicial era la más limpia: clonar la señal con un módulo CC1101 (868 MHz, SPI) conectado al ESP32. El plan tenía tres pasos: capturar la transmisión, decodificar el payload y reproducirlo desde el microcontrolador.

Después de varias noches analizando formas de onda, modulación y estructura de paquetes, la conclusión fue clara: el protocolo está cifrado. Los ataques de replay no funcionaban porque había códigos rotativos (rolling codes) o criptografía de por medio. Ese camino quedó cerrado. Lección de ingeniería número uno: los protocolos RF modernos suelen venir asegurados, así que planifica un plan B desde el principio.
El hack pragmático que SÍ funciona
Si no se puede emular la radio, se ataca el problema desde el otro lado: en vez de imitar la señal, simulamos las pulsaciones físicas de los botones en el control remoto original. Se abre la placa del remoto y se cablea así:
- 3.3V del ESP32 alimenta el remoto.
- GND compartido entre ambas placas.
- Cada línea de botón va a un GPIO del ESP32.
- Las salidas del ESP32 se configuran en open drain.
- Un pulso corto en estado bajo (active low) simula que alguien aprieta el botón.

En la práctica, el ESP32 aprieta los botones del control de forma electrónica. No es elegante, pero es extremadamente confiable. Y como el remoto ya resuelve el emparejamiento y la comunicación segura con el motor, estamos reutilizando hardware certificado de fábrica. A veces ingeniería significa entregar algo que funciona, no perseguir la perfección.
La razón técnica por la que usamos open drain es importante: una salida en open drain solo puede llevar la línea a tierra (estado bajo) o dejarla en alta impedancia, nunca fuerza un voltaje alto. Así el ESP32 jamás inyecta sus 3.3V sobre la electrónica del remoto, solo cierra el contacto del botón a GND igual que tu dedo. Es la forma segura de interactuar con una placa ajena sin arriesgar daños.
El cerebro: ESP32 C3 y sensor SHT30
El controlador se arma alrededor de una placa ESP32 C3 (la versión Super Mini es perfecta por su tamaño) más un sensor de temperatura y humedad SHT3X. El ESP32 corre toda la lógica de forma local. HomeKit es opcional, solo para monitoreo y control manual. Si el WiFi falla, el sistema sigue trabajando de manera autónoma.

La arquitectura completa incluye:
- ESP32 C3 como controlador principal.
- Sensor SHT3X de temperatura y humedad por I2C.
- Stack HomeKit compatible con HAP.
- Lifecycle Manager (LCM) para actualizaciones OTA.
- Un botón físico de hardware.
- Un LED de identificación.
El SHT30 es un sensor digital I2C de buena precisión (alrededor de ±0.2°C en temperatura y ±2% en humedad relativa), lo que lo hace ideal para detectar el salto brusco de humedad de una ducha sin falsos positivos.

La lógica de ventilación: como un controlador profesional
Esto no es un simple "si humedad mayor a X, prende". La lógica está diseñada para comportarse como un controlador de ventilación profesional, con histéresis y tiempos mínimos.
El ventilador se activa cuando se cumple cualquiera de estas condiciones:
- Humedad sobre 65%.
- Se detecta un salto rápido de humedad (detección de ducha).
- Temperatura sobre 26°C (boost opcional).
El ventilador se detiene solo cuando se cumplen ambas condiciones a la vez:
- Humedad bajo 60% (histéresis).
- Pasó el tiempo mínimo de funcionamiento (15 minutos).
Esta combinación evita el encendido y apagado rápido, el castañeteo del relé, la sub ventilación y la formación de moho. Además, el sistema aprende la humedad base cuando está en reposo, así sabe distinguir una ducha de la humedad normal del ambiente.
Velocidades del ventilador
El remoto original ofrece tres velocidades, que el ESP32 selecciona enviando pulsos en estado bajo a la placa del control:
| Modo | Salida |
|---|---|
| LOW | 30% |
| MID | 60% |
| HIGH | 100% |
Control manual desde HomeKit
Desde la app Casa de tu iPhone puedes prender o apagar el ventilador y elegir la velocidad. Cuando tomas el control manual, el modo automático se desactiva temporalmente, y después de 20 minutos el sistema vuelve solo al modo automático de forma segura. Eso resuelve el clásico problema del "ventilador que quedó prendido para siempre".

Procesamiento del sensor: lecturas estables
Para evitar ruido y lecturas inestables, el firmware aplica varias técnicas:
- Suavizado EMA (media móvil exponencial, con alfa 0.2).
- Seguimiento de la humedad base.
- Detección de subida relativa.
- Reporte basado en deltas (solo informa cambios significativos).
Gracias a esto, la detección de ducha es precisa sin disparos falsos cuando alguien solo se lava las manos.
Notificaciones seguras para HomeKit (HAP)
HomeKit es sensible al exceso de actualizaciones. Para que el sistema sea estable y de grado producción, el firmware se autolimita:
- Notifica temperatura solo si el cambio supera 0.2°C.
- Notifica humedad solo si el cambio supera 0.5%.
- Respeta un intervalo mínimo entre notificaciones.
- Aplica límites de eventos por minuto.
- En modo "spike" permite actualizaciones temporalmente más rápidas.
Esto previene congestión TCP, throttling de iOS, inestabilidad durante el OTA y desconexiones aleatorias de HomeKit. Los sistemas embebidos serios necesitan estas barandas.
Lifecycle Manager: OTA y botón de hardware
Usando el Lifecycle Manager del ecosistema Studio Pieters (esp32-lcm) se obtiene actualización OTA, gestión del botón físico, aprovisionamiento WiFi y reconexión automática. El botón de hardware cumple tres funciones según el tipo de pulsación:
| Acción | Resultado |
|---|---|
| Pulsación simple | Actualización OTA |
| Doble pulsación | Reset del emparejamiento HomeKit |
| Pulsación larga | Reset de fábrica |
Esquema de conexiones
Este es el cableado de referencia del proyecto. Todos los GPIO de control del ventilador se configuran en open drain para simular las pulsaciones de botón de forma segura:
| Función | Pin del ESP32 C3 |
|---|---|
| LED de identificación | GPIO 8 |
| Botón de hardware | GPIO 3 |
| Ventilador LOW/MID/HIGH | GPIO configurable |
| I2C SCL | GPIO 7 |
| I2C SDA | GPIO 6 |
| Dirección SHT3X | 0x44 (I2C) |
Resultado: cómo se comporta al encender
Una vez grabado el firmware, la secuencia es esta: el equipo arranca, el WiFi se conecta (o entra en modo de aprovisionamiento), el sensor se inicializa, el modo automático queda activo y el ventilador empieza a responder de forma inteligente a la humedad. El control manual funciona desde la app Casa y las actualizaciones OTA quedan disponibles. No más control remoto olvidado, no más pilas muertas, no más condensación. Solo automatización silenciosa.
Lo potente es que sigue siendo autónomo aunque el WiFi esté caído, HomeKit no responda o no haya internet. El baño se mantiene seco igual.
Variantes y mejoras
Algunas ideas para llevar este proyecto más allá de lo que muestra el original:
- Registro de datos: conecta un módulo microSD por SPI y guarda un histórico de humedad y temperatura. Con eso puedes graficar cuántas duchas hubo por día o detectar problemas de ventilación estructural en el baño.
- Detección de presencia: suma un sensor PIR para diferenciar entre humedad ambiente y alguien efectivamente usando el baño, y así afinar todavía más el arranque del extractor.
- Alertas de moho preventivas: con la humedad ya monitoreada, puedes crear una automatización en HomeKit que te avise al iPhone si la humedad base del baño sube de forma sostenida durante varios días, señal típica de filtración o ventilación insuficiente.
- Pantalla local: agrega un OLED SSD1306 por el mismo bus I2C (comparte SCL y SDA con el SHT3X) para mostrar humedad y velocidad actual sin sacar el celular.
Personalización para Chile
En Chile puedes conseguir las piezas centrales en MechatronicStore:
- Placa de Desarrollo ESP32 C3 Super Mini (SKU GS3-10): alrededor de $9.900 CLP. Es exactamente el microcontrolador que usa el proyecto, con WiFi, Bluetooth y tamaño mínimo para esconderlo detrás del extractor.
- Sonda Impermeable Metálica SHT30 (SKU G-073): alrededor de $29.990 CLP. Trae el mismo chip SHT30 por I2C que pide el tutorial (pines VIN, GND, SCL, SDA). Su encapsulado metálico la hace más robusta a la humedad permanente de un baño que un breakout pelado, así que para este uso es una mejora sobre la versión original.
Dos componentes del proyecto no los vende la tienda y conviene saberlo: el módulo CC1101 de 868 MHz (que de todos modos fue el intento fallido, así que no es necesario para la versión que funciona) y el control remoto original del extractor, que es propietario de tu unidad de ventilación y se reutiliza tal cual. El botón físico y el LED de identificación son componentes básicos genéricos que puedes resolver con cualquier pulsador y LED que tengas a mano.
Recursos
- Tutorial original (inglés): esp32 HomeKit Bathroom Ventilation Controller, por Achim Pieters en Studio Pieters.
- Lifecycle Manager para ESP32: esp32 Lifecycle Manager (LCM)
Versión chilena inspirada en el proyecto de Studio Pieters, con componentes en stock local en MechatronicStore.



