Tengo una unidad de aire acondicionado por conductos de Mitsubishi instalada en el techo. Sin acceso remoto, sin programación horaria, sin forma de pedirle que enfríe antes de llegar a casa. Mitsubishi ofrece MELCloud — su servicio en la nube — pero requiere un adaptador WiFi propietario que cuesta alrededor de 100€, depende de que sus servidores funcionen, y te expone solo lo que ellos deciden. Quería algo diferente.
No quería un sistema de domótica completo. Sin Home Assistant, sin coordinador Zigbee, sin servidor siempre encendido. Solo el aire acondicionado, un ESP8266, y control suficiente para gestionarlo cómodamente desde el móvil — en casa y fuera de ella.
Las unidades interiores de Mitsubishi tienen un pequeño conector JST de 5 pines en la placa de control llamado CN105. Lleva 5V, GND y un UART serie a 2400 baudios con paridad par. El protocolo es propietario y no está documentado por Mitsubishi, pero la comunidad lo descifró hace años. La librería Arduino HeatPump de SwiCago lo implementa de forma limpia y se ha convertido en el punto de partida estándar para proyectos de este tipo.
La parte de hardware es sencilla: un NodeMCU ESP-12E/F, un shifter de nivel bidireccional (el lado del AC funciona a 5V, el ESP a 3.3V), y un metro de cable UTP para llegar desde la placa de control de la unidad hasta donde montes el ESP. El NodeMCU se alimenta desde su propio cargador USB — no desde el AC — para evitar problemas de masa.
Un detalle importante: las líneas TX y RX se cruzan intencionadamente. El TX del AC se conecta al RX del ESP y viceversa. Es correcto, no un error.
Se utiliza cable UTP específicamente porque cada señal viaja trenzada con su propio hilo de masa de retorno — esto reduce el ruido electromagnético en una línea serie de baja velocidad que recorre un metro dentro o cerca de un equipo que genera bastante interferencia.
El conector CN105 en sí merece una mención aparte. Es un JST PA 2.0mm de 5 pines — (aloja un PAP-05V-S), no el componente más fácil de encontrar. En mi caso al PAP-05V-S que compré tuve que hacerle un pequeño trabajo de ajuste mecánico para que encajara correctamente. Si lo replicáis, reservad algo de tiempo para esa parte. Todo lo demás — NodeMCU, shifter, cable UTP — es genérico y barato, y probablemente ya esté en un cajón de componentes de otros proyectos. El coste total del hardware es de unos €10-15 de forma orientativa, aunque puede ser menor si se aprovechan componentes de chatarra electrónica.
Existen buenos proyectos construidos sobre la librería de SwiCago — componentes para ESPHome, integraciones con Home Assistant, forks de Tasmota... Si ya tienes una plataforma de domótica en marcha, esa es la respuesta correcta. Pero yo no la tengo, y montarla solo para controlar un aire acondicionado me parecía comprar una furgoneta para llevar una mochila.
Lo que necesitaba era más simple: un dispositivo autónomo con interfaz web accesible desde cualquier navegador en la red local, MQTT para acceso remoto y registro, y una programación que funcionara de forma autónoma aunque el móvil o el servidor estuviera apagado.
El ESP8266 ejecuta un firmware propio, construido usando la librería de SwiCago entre otras, que sirve la interfaz web comprimida directamente desde PROGMEM — sin tarjeta SD, sin acceso al sistema de archivos para el HTML. Esta fue una decisión deliberada tras comprobar que servir páginas desde LittleFS fragmentaba el heap del ESP8266 de forma importante en sus limitados 80KB de RAM. Mover todo a PROGMEM llevó el heap libre de unos 9KB a un estable 22KB.
La interfaz web cubre todo: encendido, modo, temperatura objetivo, velocidad del ventilador y un gestor de temporizadores. El mando físico de pared sigue funcionando con normalidad — el ESP convive con él sin interferencias. MQTT gestiona los mismos controles de forma remota, además de publicar el estado — temperatura ambiente, frecuencia del compresor, estado de funcionamiento — con flags de retain para que el broker siempre tenga el estado actual o el ultimo conocido. La actualización de firmware por OTA también está disponible desde la propia interfaz.
Un detalle de diseño que requirió reflexión: el puerto serie del ESP8266 es síncrono y bloqueante. El ciclo de sincronización de la librería HeatPump no puede coexistir con el servidor web y el loop MQTT en un bucle principal naïve. La solución fue un `loopCallback` — el procesamiento HTTP y MQTT ocurre dentro del ciclo de sync de la librería en lugar de en paralelo, eliminando problemas de reentrada sin necesidad de hilos ni interrupciones.
La parte más interesante del firmware es el scheduler personalizado. Tres tipos de perfiles:
Tipo A — basado en hora, se activa automáticamente en los horarios configurados en los días de la semana seleccionados
Tipo B — temporizador inmediato con duración, arranca ahora y funciona durante N minutos
Tipo C — cuenta atrás de apagado, se activa manualmente
Los tres soportan secuencias de rampa independientes para temperatura y ventilador. La temperatura se define como una secuencia de deltas acumulados sobre la temperatura inicial — por ejemplo +1, +1, +2 sube la consigna 1°C, luego otro grado, luego dos más, con el intervalo configurado entre cada paso. El ventilador se define como una secuencia de valores absolutos — AUTO, 1, 2, 3 — de forma independiente a la temperatura.
Los temporizadores funcionan de forma autónoma y fiable sin ninguna intervención desde el móvil, incluso si el ESP se reinicia — los perfiles tipo A se reanudan automáticamente si el arranque ocurre dentro de su ventana horaria.
Además de la interfaz web, el firmware expone una API HTTP JSON completa que permite integración con cualquier herramienta o script. A través de ella es posible consultar el estado completo del dispositivo y del AC, enviar comandos de control, gestionar los perfiles de temporizadores — crear, modificar, eliminar y activar — exportar la configuración, y acceder a métricas de rendimiento del sistema.
Para el acceso remoto, MQTT es el protocolo adecuado — ligero, funciona a través de NAT sin reenvío de puertos, y cuenta con un buen ecosistema de brokers gratuitos. Para un único dispositivo de aficionado hay varias opciones con tier gratuito y soporte TLS: HiveMQ Cloud, EMQX Cloud, Adafruit IO, CloudMQTT, entre otros.
Desde fuera de casa, la misma conexión MQTT que el ESP usa para publicar es también por donde llegan los comandos — sin VPN, sin DNS dinámico, sin reenvío de puertos.
El topic de estado publica temperatura ambiente y frecuencia del compresor con un intervalo mínimo configurable para evitar saturar el broker durante el comportamiento normal del compresor inverter. Sin este límite, la frecuencia del compresor — que varía continuamente en una unidad inverter — generaría un mensaje nuevo cada pocos segundos.
Las rutas de los topics son configurables en la página de configuración.
Una de las integraciones más útiles en el día a día es un Shortcut de iOS que gestiona el AC directamente desde el Centro de Control del iPhone.
El shortcut detecta automáticamente a qué red WiFi está conectado el teléfono: si coincide con la red de casa, usa el API web directamente — más rápido y sin latencia de broker; si está fuera, usa MQTT. En ambos casos la experiencia es idéntica para el usuario.
La cabecera del menú muestra en tiempo real el estado del AC — encendido, modo, temperatura consigna, temperatura ambiente, estado del compresor y frecuencia — antes de tocar ningún botón. Desde ahí se puede cambiar el estado, el modo, la temperatura y el ventilador, o abrir directamente la interfaz web para acceso completo. El propio menú informa de los ajustes modificados justo encima de la opción para enviar los ajustes al AC.
Toda la configuración — WiFi, MQTT, NTP, topics y parámetros de comportamiento — se gestiona desde una página web embebida en el propio dispositivo. No hay ficheros de configuración que editar manualmente ni necesidad de reflashear para cambiar parámetros.
En el primer arranque, o cuando el dispositivo no puede conectar a ninguna red WiFi conocida, el ESP8266 entra automáticamente en modo portal cautivo.
Genera una red WiFi abierta llamada MITSUBISHI-AC-CONFIG y redirige cualquier petición HTTP a una página de configuración donde se introducen el SSID, la contraseña y el hostname del dispositivo.
Si en 20 segundos no consigue conectar a la red configurada, vuelve a abrir el portal.
Si el portal permanece sin actividad durante 5 minutos, el ESP reinicia e intenta de nuevo la conexión — útil cuando se cambia primero la configuración en el dispositivo y luego en el router, ya que el ESP seguirá reintentando hasta encontrar la nueva red. Toda la configuración MQTT y los perfiles de temporizadores se conservan intactos durante este proceso.
Para forzar el portal cautivo manualmente — por ejemplo para cambiar de red — se puede pulsar el botón FLASH del NodeMCU durante el arranque, lo que borra las credenciales WiFi guardadas.
Diagrama 3: Flujo del portal cautivo WiFi
Las actualizaciones de firmware se realizan sin necesidad de cable ni acceso físico al dispositivo. Desde el panel principal se accede al modo OTA, que reinicia el ESP en un estado mínimo — solo WiFi activo, sin CN105 ni MQTT — para maximizar la memoria disponible durante la subida. Una vez en ese modo, la interfaz web permite seleccionar el fichero .bin compilado y subirlo directamente desde el navegador.
Si la actualización no cabe en el espacio libre del sketch — visible en la página de métricas — el proceso se cancela antes de sobrescribir nada. Si el dispositivo se queda sin respuesta durante una actualización fallida, un ciclo de corriente limpia el flag OTA de la memoria RTC y el ESP arranca en modo normal con el firmware anterior intacto.
Diagrama 4: Flujo del modo OTA
El sistema lleva funcionando desde su creación, unos dos meses, sin incidencias reseñables. Los únicos reinicios han sido los necesarios durante el desarrollo y las actualizaciones de firmware. El uptime máximo registrado hasta la fecha es de 20 días, ya que sigo aplicando mejoras al proyecto,. El heap libre es estable en torno a 22KB y la fragmentación por debajo del 3%. En un ESP8266 con 80KB de RAM total y con toda la funcionalidad que se le exige, estos números son el resultado de decisiones de diseño muy pensadas y no de suerte.
El coste total del hardware es de unos 10-15€ de forma orientativa, aunque puede ser menor si se aprovechan componentes de chatarra electrónica heredados de otros proyectos. La pieza más difícil de acertar es el conector CN105, no por que no se venda, sino porque parece no ser estándar y la variedad de conectores parecidos es elevada y no siempre con especificaciones detalladas.
Para quien tenga una unidad Mitsubishi y no tenga interés en montar una plataforma domótica completa, este es un punto medio razonable entre el mando de pared original y un sistema de automatización del hogar. Sin suscripción cloud, sin adaptador propietario, sin depender de los servidores de Mitsubishi.
El proyecto está en un estado muy avanzado pero el código fuente no está disponible por el momento. Quiero asegurar la estabilidad a largo plazo y pulir algunos detalles antes de tomar esa decisión.
En función del feedback recibido y del tiempo disponible, valoraré publicarlo en el futuro.