🔥 WTTC · Webasto Thermo Top C por Bluetooth y Wi-Fi

Sustituye el temporizador original de la calefacción auxiliar Thermo Top C por un ESP32 que habla su protocolo W-Bus, y la maneja desde una app Android por Bluetooth o desde el navegador por Wi-Fi. Código abierto: github.com/matatunos/wttc.
Debajo, el simulador: a la izquierda, la web del firmware tal cual; a la derecha, una Webasto virtual que responde a sus tramas. Puedes acelerar el tiempo y provocar averías.
Todo el código y el contenido de WTTC (firmware, app, servidor, esta web y su documentación) están generados íntegramente con Claude (Anthropic). Más abajo están las descargas, el montaje y las instrucciones de uso. ¿Cuánta gente lo usa? Estadísticas públicas.
WTTC · 192.168.4.1
Web servida por el ESP32 (copia literal del firmware).
Sus llamadas a /api/… las contesta el ESP32 simulado.
--:--:--tiempo simulado

Webasto Thermo Top C (virtual)

--°agua del motor
Apagada
Potencia
0 W
Batería
--
Consumo
--
Orden activa
—

Telegram (simulado)

Lo que te llegaría al móvil. En el simulador no se envía nada de verdad.

Provocar averías

Temperatura exterior 5 °C Batería en reposo 12,6 V

Tráfico W-Bus · 2400 baudios 8E1

Azul, lo que envía el ESP32 (F4 = de diagnóstico a calefactor). Gris, el eco que el firmware descarta. Verde, la respuesta de la Webasto (4F, comando | 0x80). El último byte es el XOR de todos los anteriores.

Consola serie (115200)

Es la misma consola que usarás en la primera prueba, con el ESP32 conectado al portátil por USB.

Esquema de conexiones (para montar)

Conector del mando(lado furgo, quitando el mando) marrónnegrorojoamarillo ⚠ La Webasto no tiene corriente (fusible) Placa TJA1020 (Gutol)bornas de tornillo a los dos lados GNDGND LINRX INHSLP 12VTX TJA1020 47µF INH: no se conecta Regulador LM2596 IN− IN+ OUT+ OUT− 470 100µF tornillo:5,0 V ESP32 DevKitC (AZDelivery, 38 pines)dibujado tumbado: antena a la izquierda, USB a la derecha ESP-WROOM-32 USB GND IO23 IO22 TX0 RX0 IO21 GND IO19 IO18 IO5 IO17 IO16 IO4 IO0 IO2 IO15 SD1 SD0 CLK 3V3 EN VP VN IO34 IO35 IO32 IO33 IO25 IO26 IO27 IO14 IO12 GND IO13 SD2 SD3 CMD 5V 5 4 1 2 3 amarillo: aislar con cinta, no se usa W-Bus suelto 7 6 10 SLP al aire: falta el ⑩ 11 98 98⑧ y ⑨ cruzados
Las placas pueden venir con las bornas en otro sitio: guíate por lo que pone impreso al lado de cada borna o pin, no por su posición en el dibujo. Los colores de los cables ⑥–⑪ son una sugerencia (cables dupont). Los del conector de la furgo están sin confirmar: mídelos con el polímetro.

Lista de cables

NºCableDesdeHasta
1marrónmarrón de la furgo (masa)Placa TJA1020, borna GND (lado 12V/LIN)
2negronegro de la furgo (W-Bus)Placa TJA1020, borna LIN
3rojorojo de la furgo (+12 V)Placa TJA1020, borna 12V
4rojorojo de la furgo (empalme del ③)LM2596, IN+
5marrónmarrón de la furgo (empalme del ①)LM2596, IN−
6naranjaLM2596 OUT+ (5,0 V)ESP32, pin 5V
7grisLM2596 OUT−ESP32, pin GND (junto a IO13)
8verdePlaca TJA1020, borna TXESP32, pin IO16 (RX2)
9azulPlaca TJA1020, borna RXESP32, pin IO17 (TX2)
10violetaPlaca TJA1020, borna SLPESP32, pin 3V3
11grisPlaca TJA1020, borna GND (lado TX/RX)ESP32, pin GND (junto a IO23)
—amarilloamarillo de la furgono se usa: aíslalo con cinta
——Placa TJA1020, borna INHno se conecta

Pasos, en orden

  1. Mide el conector del mando con el polímetro, con la Webasto conectada: un cable da +12 V fijos (el «rojo»), otro tiene continuidad con el chasis (el «marrón») y el W-Bus en reposo marca casi lo mismo que la batería (el «negro»). Si los colores no coinciden, manda lo que midas, no el dibujo.
  2. Ajusta el LM2596 antes de conectarle nada: pon solo los cables ④ y ⑤, mide entre OUT+ y OUT− y gira el tornillo dorado hasta que marque 5,0 V. Si te pasas, el ESP32 se quema.
  3. Desconecta, y monta la placa TJA1020: ① ② ③ en la borna del lado 12V/LIN (INH vacía) y ⑧ ⑨ ⑩ ⑪ en la del otro lado.
  4. Por último, ⑥ y ⑦ al ESP32. Para la primera prueba no los pongas: alimenta el ESP32 por USB desde el portátil y escribe status en la consola.
  5. Si la consola no muestra ni el eco, intercambia ⑧ y ⑨ (pasa a menudo con la serigrafía TX/RX de estas placas). Si sale eco pero «sin respuesta», revisa ② y la masa.

Descargas · versión 1.1.0

Firmware para el ESP32 Carpeta WTTC/ con WTTC.ino y web.h · 29 KB · 04/10/2026 ⬇ WTTC-firmware.zip
App Android (APK) Android 8 o posterior · móvil, tablet o radio de coche ⬇ WTTC.apk
Código fuente Firmware, app y esta documentación · licencia MIT GitHub ↗
Versiones y cambios

Todas las versiones de WTTC (firmware del ESP32 y app Android van con el mismo número).

Formato: la versión más reciente arriba. Cada versión publicada tiene su Release en GitHub con el APK y el firmware.

Versión 1.1.0 · 2026-10-04 · Release en GitHub ↗

Primera versión pública como WTTC.

Firmware

  • Bluetooth LE como vía principal, con emparejamiento por PIN de 6 cifras (generado al azar en cada placa) y conexión cifrada.
  • Wi-Fi bajo demanda para ahorrar batería: siempre encendida, solo mientras calienta o solo a petición. Tras arrancar, 10 minutos encendida en cualquier modo.
  • Estado real de la Webasto: arrancando, calentando, en pausa (agua caliente) o sin respuesta. Detecta cuando se apaga sola y lee sus averías.
  • Gasoil estimado a partir de la potencia que informa la Webasto: encendido actual, último, mes y total.
  • Avisos por Telegram (bot propio, opcional) al encender, al apagar, si se apaga sola, si deja de responder y si un programa no arranca por batería baja.
  • Configuración desde la web o la app: nombre, PIN, clave de la Wi-Fi, modo de la Wi-Fi, red con internet, Telegram y batería mínima.
  • Duración máxima por encendido: 60 minutos.
  • Procesador a 80 MHz y anuncio Bluetooth espaciado para gastar menos.
  • La web de la placa va en web.h y muestra la fecha completa en la cabecera.
  • Requiere el esquema de partición Huge APP.

App Android

  • Búsqueda y emparejamiento con la placa; se reconecta sola cuando está al alcance.
  • Estado, encendido y apagado, programas, averías, registro, gasoil estimado y configuración de la placa.
  • Avisos del sistema si la calefacción se apaga sola.
  • Estadísticas anónimas opcionales (dos botones iguales en el primer inicio; se cambia en «Ajustes de la app»).

Versión 1.0.0 · 2026-09-30

Versión inicial (como Webastot5.ino): solo Wi-Fi y web, encendido y apagado, programas semanales, temperatura, tensión, llama, potencia, averías y consola serie.

Todas las versiones publicadas: github.com/matatunos/wttc/releases

Cada cambio del firmware se compila automáticamente en GitHub con los núcleos ESP32 2.0.17 y 3.3.12, y la app se publica en Releases. Aún no se ha probado contra una Webasto real: si lo montas, cuéntanos cómo te ha ido abriendo una incidencia en GitHub.

Hardware usado

PiezaModelo usadoPara qué
Vehículo y calefactorVW T5 con calefacción auxiliar de agua Webasto Thermo Top C de fábrica (ref. VW 7H0 010 398 J), mandada por W-Bus desde el temporizador originalLo que se controla. El ESP32 sustituye al temporizador y se enchufa en su conector
MicrocontroladorESP32 DevKitC con módulo ESP-WROOM-32 (AZDelivery, 38 pines, USB con CP2102)Wi-Fi, web, programas, avisos y protocolo W-Bus por su UART2 (IO16/IO17)
Transceptor W-BusMódulo UART ↔ LIN/K-Line con TJA1020 (el usado es de Gutol: bornas de tornillo 12V/GND/LIN/INH y TX/RX/SLP/GND, sin pin VCC)Adapta el TTL de 3,3 V del ESP32 al bus de un hilo a 12 V. Vale cualquier módulo con TJA1020 o equivalente (TJA1021, MCP2003, L9637D)
AlimentaciónRegulador reductor LM2596 (módulo con potenciómetro), ajustado a 5,0 VSaca los 5 V del ESP32 del +12 V permanente del conector
CableadoCables dupont hembra para el ESP32, cable de 0,5 mm² para el lado de 12 V, empalmes o regletas y cinta o termorretráctilConexiones según el esquema y la lista de cables de arriba
HerramientasPolímetro, destornillador pequeño, PC con USB (Linux o Windows)Identificar los cables del conector, ajustar el LM2596, programar el ESP32 y la primera prueba por consola
Opcional: un interruptor en el +12 V del ESP32 si el vehículo va a estar parado semanas (ver «Consumo» más abajo) y un fusible de 1 A en línea si el +12 V del conector no lo lleva. No hace falta VCDS para usarlo, pero sirve para leer y borrar averías del módulo 18 (calefacción auxiliar).

Instalar el firmware: qué necesitas

  • Arduino IDE 2 (lo más sencillo) o arduino-cli (solo terminal).
  • El núcleo ESP32 de Espressif («esp32 by Espressif Systems»), versión 2.x o 3.x. Lo descarga el propio IDE: son varios cientos de MB.
  • Placa ESP32 Dev Module con el esquema de partición Huge APP (3MB No OTA/1MB SPIFFS): con Bluetooth y Wi-Fi el programa no cabe en la partición normal.
  • Un cable USB de datos: muchos cables de cargar no llevan datos y el PC no ve la placa.
  • Driver USB-serie: el ESP32 DevKitC suele llevar un CP2102. En Linux funciona sin instalar nada; en Windows 10/11 suele instalarse solo y, si no aparece puerto COM, instala el «CP210x VCP driver» de Silicon Labs.
  • Ninguna librería aparte: Bluetooth, Wi-Fi, servidor web y Preferences vienen con el núcleo ESP32.

Con Arduino IDE 2 (Linux y Windows)

  1. Instala el IDE desde arduino.cc/en/software. En Windows sirve el instalador .exe o winget install ArduinoSA.IDE.stable; en Linux, el AppImage (dale permiso de ejecución).
  2. Archivo → Preferencias → «URLs adicionales del gestor de placas», añade:
    https://espressif.github.io/arduino-esp32/package_esp32_index.json
  3. Herramientas → Placa → Gestor de placas, busca «esp32» e instala esp32 de Espressif Systems.
  4. Descomprime el zip: queda la carpeta WTTC/ con WTTC.ino y web.h (el IDE exige que la carpeta se llame como el .ino). Abre WTTC.ino.
  5. Herramientas → Placa → esp32 → ESP32 Dev Module; Herramientas → Partition Scheme → Huge APP (3MB No OTA/1MB SPIFFS); y en Puerto el del ESP32 (COMx en Windows, /dev/ttyUSB0 en Linux).
  6. Pulsa Subir (la flecha). Si se queda en «Connecting……», mantén pulsado el botón BOOT de la placa hasta que empiece a escribir.
  7. Herramientas → Monitor serie a 115200 baudios: sale la versión, el nombre y el PIN Bluetooth de tu placa (apúntalo). Escribe status para la primera prueba.

Con arduino-cli en Linux

curl -fsSL https://raw.githubusercontent.com/arduino/arduino-cli/master/install.sh | BINDIR=~/.local/bin sh
arduino-cli config init
arduino-cli config add board_manager.additional_urls \
  https://espressif.github.io/arduino-esp32/package_esp32_index.json
arduino-cli core update-index
arduino-cli core install esp32:esp32

# dentro de la carpeta que contiene WTTC/
FQBN=esp32:esp32:esp32:PartitionScheme=huge_app
arduino-cli compile --fqbn $FQBN WTTC
arduino-cli upload  --fqbn $FQBN -p /dev/ttyUSB0 WTTC
arduino-cli monitor -p /dev/ttyUSB0 -c baudrate=115200
Si da «Permission denied» en /dev/ttyUSB0: sudo usermod -aG dialout $USER y cierra sesión. En Ubuntu, si el puerto aparece y desaparece, desinstala brltty.

Con arduino-cli en Windows (PowerShell)

winget install ArduinoSA.CLI
arduino-cli config init
arduino-cli config add board_manager.additional_urls `
  https://espressif.github.io/arduino-esp32/package_esp32_index.json
arduino-cli core update-index
arduino-cli core install esp32:esp32

# dentro de la carpeta que contiene WTTC\
$FQBN = "esp32:esp32:esp32:PartitionScheme=huge_app"
arduino-cli compile --fqbn $FQBN WTTC
arduino-cli upload  --fqbn $FQBN -p COM3 WTTC
arduino-cli monitor -p COM3 -c baudrate=115200
Cambia COM3 por el puerto que salga en arduino-cli board list (o en el Administrador de dispositivos → Puertos COM). Tras instalar con winget, abre una PowerShell nueva para que encuentre arduino-cli.

Cómo manejarlo

📱 Móvil o tablet Android (app, por Bluetooth)

  1. Descarga WTTC.apk en el móvil y ábrelo. Android pedirá permiso para «instalar apps de origen desconocido» desde el navegador: concédelo para esta instalación.
  2. Abre WTTC y acepta el permiso de dispositivos cercanos (Bluetooth) y el de notificaciones.
  3. Pulsa Buscar placa, elige tu WTTC y escribe su PIN de 6 cifras (sale en el monitor serie al arrancar y en la web de la placa, apartado Configuración).
  4. Listo: a partir de ahí la app se conecta sola cuando la placa está al alcance (10–20 m con la carrocería de por medio) y la pone en hora.
  5. Si la calefacción se apaga sola con la app abierta, Android muestra un aviso con el motivo y sus códigos de avería.

🍏 iPhone (web, por Wi-Fi)

  1. No hay app para iPhone: se usa la web de la placa, que es la misma que ves en el simulador.
  2. Ajustes → Wi-Fi → red WTTC (clave por defecto calefaccion; cámbiala en Configuración) y abre http://192.168.4.1 en Safari.
  3. Compartir → Añadir a pantalla de inicio: queda como una app más.
  4. Para que la red de la placa esté disponible cuando la necesites, deja la Wi-Fi en «Siempre encendida» o «Mientras calienta» (ver consumo). En «Solo a petición» solo está los 10 minutos tras arrancar.
  5. Si configuras la placa para unirse al punto de acceso del iPhone, también responde en http://wttc.local sin cambiar de red.

🚐 Radio Android del vehículo

  1. Primero comprueba que su Bluetooth sirve para apps: instala nRF Connect (Play Store, gratis) en la radio y pulsa Scan. Si aparecen dispositivos BLE, la app WTTC funcionará.
  2. Instala el APK: descárgalo desde el navegador de la radio o cópialo en un pendrive y ábrelo con su gestor de archivos.
  3. Empareja igual que en el móvil. La pantalla se adapta a la radio (columna centrada, botones grandes).
  4. Si nRF Connect no ve nada, el Bluetooth de la radio es un módulo aparte, solo para llamadas y música. Usa la web: conecta la radio a la red Wi-Fi WTTC y abre http://192.168.4.1. Mientras tanto, la radio no tendrá internet por Wi-Fi.

Consumo y modos de la Wi-Fi

Modo (Configuración)Cuándo está la Wi-FiConsumo aprox. aparcado
Siempre encendidaTodo el tiempo≈ 40–60 mA (1–1,5 Ah/día)
Mientras calienta (por defecto)Calentando y 10 min después≈ 15–25 mA solo con Bluetooth
Solo a peticiónCuando la pides desde la app (15 min) y unos minutos para enviar avisos≈ 15–25 mA
Cifras estimadas a 12 V, LM2596 incluido; mide el tuyo con el polímetro en serie. En todos los modos la Wi-Fi está 10 minutos encendida al arrancar, como rescate si no tienes el móvil emparejado. El procesador va a 80 MHz para gastar menos.

Avisos por Telegram (opcional)

  1. En Telegram, habla con @BotFather, envía /newbot y sigue los pasos: te da el token de tu bot.
  2. Abre el chat con tu bot nuevo y pulsa Iniciar (si no, el bot no puede escribirte).
  3. Tu chat ID: escribe algo a tu bot y abre https://api.telegram.org/bot<TOKEN>/getUpdates; es el número de "chat":{"id":…}.
  4. En la app o la web de la placa → Configuración: token, chat ID y una red con internet (por ejemplo, el punto de acceso del móvil). Guarda y pulsa Probar Telegram.
  5. Avisa al encender, al apagar, si se apaga sola (con sus averías), si deja de responder y si un programa no arranca por batería baja.

Seguridad

Tramas que usa el firmware

AcciónTramaRespuesta de la Webasto
Trama con checksum
—

Qué se simula

  • Gasoil: estimado con la potencia que informa la Webasto (≈ 0,62 l/h a 5 kW, según su ficha); la placa lleva el encendido actual, el último, el mes y el total. Es una estimación (±20 %), no una medida del depósito.
  • No se simula: el Bluetooth (la app Android) ni el apagado de la Wi-Fi por ahorro: aquí la web del móvil siempre llega a la placa.
  • Fiel al código: la web, la API y la consola son las del firmware: reintentos, eco, pulso de despertar tras 10 s de silencio, keep-alive cada 5 s, sensores cada 8 s, programas, corte por batería < 12,0 V y reloj que se pierde al reiniciar.
  • Fiel al protocolo: formato de tramas y respuestas de sensores (0x50/05) y averías (0x56/01) según libwbus.
  • Aproximado: los tiempos de arranque y post-barrido, los umbrales de regulación (plena carga hasta 75 °C, parcial hasta 85 °C, reanuda a 70 °C), el calentamiento del circuito y que la Webasto se apague si pasan 20 s sin keep-alive (dato de libwbus, sin comprobar en la tuya).
  • Estado real: el firmware mira la respuesta del keep-alive (01 = la Webasto ya no tiene la orden) y la llama: «Arrancando», «Calentando», «En pausa» (sin llama con el agua a ≥ 65 °C) o «Sin respuesta». Si se apaga sola (prueba «sin gasoil»), lo dice en la web con sus averías y avisa por Telegram. Que la Thermo Top C conteste 01 al keep-alive viene de libwbus: si la tuya no lo hiciera, queda de respaldo la llama (5 min sin llama con el agua fría).

WTTC · código abierto (MIT) en GitHub · código y contenido generados íntegramente con Claude (Anthropic) · proyecto personal sin relación con Webasto ni Volkswagen.