/api/… are answered by the simulated ESP32.F4 = from diagnostics to heater). Grey: the echo the firmware discards. Green: the Webasto's answer (4F, command | 0x80). The last byte is the XOR of all the previous ones.| No. | Wire | From | To |
|---|---|---|---|
| 1 | brown | van's brown (ground) | TJA1020 board, terminal GND (12V/LIN side) |
| 2 | black | van's black (W-Bus) | TJA1020 board, terminal LIN |
| 3 | red | van's red (+12 V) | TJA1020 board, terminal 12V |
| 4 | red | van's red (spliced from ③) | LM2596, IN+ |
| 5 | brown | van's brown (spliced from ①) | LM2596, IN− |
| 6 | orange | LM2596 OUT+ (5.0 V) | ESP32, pin 5V |
| 7 | grey | LM2596 OUT− | ESP32, pin GND (any) |
| 8 | green | TJA1020 board, terminal TX | ESP32, pin IO16 (RX2) |
| 9 | blue | TJA1020 board, terminal RX | ESP32, pin IO17 (TX2) |
| 10 | violet | TJA1020 board, terminal SLP | ESP32, pin 3V3 |
| 11 | grey | TJA1020 board, terminal GND (TX/RX side) | ESP32, pin GND (another one, or the same) |
| — | yellow | van's yellow | not used: insulate it with tape |
| — | — | TJA1020 board, terminal INH | not connected |
| Optional: display and thermometer (dashed box in the diagram). All four go to the same I2C bus: each wire joins the ESP32 pin with the display's and the thermometer's. | |||
| 12 | pink | ESP32, pin 3V3 (the other one) | Display VCC and thermometer VIN |
| 13 | grey | ESP32, pin GND (or splice from ⑦) | Display GND and thermometer GND |
| 14 | teal | ESP32, pin IO4 (SDA) | Display SDA and thermometer SDA |
| 15 | gold | ESP32, pin IO5 (SCL) | Display SCL and thermometer SCL |
| 16 | magenta | ESP32, pin IO7 | “Heat” button: one leg |
| 17 | grey | “Heat” button: the other leg | Ground: splice of ⑬ (or a GND pin) |
| Optional: Winsen ZE07-CO carbon monoxide sensor (electrochemical, the kind that gives ppm over serial; an MQ-7 will not do). If CO rises, the board switches the Webasto off, sends a Telegram alert and blocks starting. It does not replace a certified CO detector with its own alarm: fit one too. | |||
| 18 | orange | Splice of ⑥ (5 V from the LM2596) | CO sensor, VIN (5 V) |
| 19 | grey | Splice of ⑬ (ground) | CO sensor, GND |
| 20 | lime | CO sensor, TXD | ESP32, pin IO15 |
status and errores) confirms it without switching anything on: if the Webasto answers with its temperature and voltage, go ahead; if you only get the echo and “sin respuesta” (no answer) with the wiring already checked, yours may not be a W-Bus unit.status in the console.A second ESP32 (any, the classic or an S3) can pretend to be the Webasto on the W-Bus: it starts, ignites, regulates, runs on after switching off and reports faults like a real one (the same model as the simulator above, checked against libwbus). That way all of WTTC can be tested on the bench, without diesel or a van. Its USB console triggers faults (no fuel, flame going out, no power, loose wire, low battery) and speeds up time. The sketch, instructions and test list: herramientas/webasto_falsa.
pines <rx> <tx>; for wiring through the bus (B), eco no. Both are saved.Easiest: this site’s serial console (Chrome or Edge on a computer): connects both boards at once, knows which is which, colours every line and saves it as .txt or .md. Nothing to install.
Both boards (WTTC and the fake Webasto) report everything they do over their USB. To see it on Windows, with PuTTY:
ayuda (fake Webasto) or info (WTTC) and Enter.Opening the port restarts the board: that is normal. Only one program can use the port at a time: close the Arduino Serial Monitor or the installer window first. With both boards on the same computer, each has its own COM: open two PuTTY windows. On Linux or Mac: screen /dev/ttyUSB0 115200 (quit: Ctrl+A, then K).
WTTC/ with WTTC.ino and web.h · 164 KB · 21/10/2026
⬇ WTTC-firmware.zipTodas 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.
Mientras la versión empiece por 0, es una versión de prueba: compila y funciona en el simulador, pero aún no se
ha comprobado con una Webasto real. La 1.0.0 llegará cuando alguien lo haya probado montado en un vehículo.
Versión de prueba (sin probar con una Webasto real).
Versión de prueba (sin probar con una Webasto real).
Versión de prueba (sin probar con una Webasto real).
Versión de prueba (sin probar con una Webasto real).
Versión de prueba (sin probar con una Webasto real).
Versión de prueba. Es la 0.3.12 (abajo) con su firmware: la Release 0.3.12 salió solo con la app, porque el análisis
estático paró la compilación por unos formatos de texto de la Webasto falsa.
Versión de prueba (sin probar con una Webasto real).
log 0–log 3 (guardado) y la orden resumen.Versión de prueba (sin probar con una Webasto real).
eco no para la conexión por el bus, pines 16 17) y se quedan guardados.Versión de prueba. Es la 0.3.9 (abajo) con el firmware ya compilando: la Release 0.3.9 salió solo con la app, porque el
firmware de ese commit no compiló (el generador de prototipos del IDE tropezaba con las variables nuevas del sensor de CO).
Versión de prueba (sin probar con una Webasto real ni con el sensor de CO).
- 30 ppm durante 2 min: aviso por Telegram para ventilar.
- Alarma (300 ppm dos lecturas seguidas, 100 ppm 30 s o 50 ppm 3 min): apaga la Webasto, corta el termostato y lo aplazado, avisa por Telegram, lo pone en la pantalla y el LED parpadea en rojo y azul. No deja encender, ni a mano, hasta 5 min seguidos por debajo de 20 ppm.
- Si el sensor que tenía deja de mandar datos, avisa y los encendidos sin nadie delante (programas, «Salgo a las…», termostato) no se hacen; a mano, sí. En Configuración, «Ya no tengo sensor de CO» si se ha quitado a propósito.
- Se ve en la web de la placa, en la app y en el chequeo de la Webasto. En las estadísticas, el encendido sale como «Monóxido (CO) alto».
- No sustituye a un detector de CO homologado con su propia alarma: si la placa falla, este sensor no sirve de nada.
Versión de prueba (sin probar con una Webasto real).
chequeo en la consola y check en la app. Si está calentando, se hace al apagarse.borrar averias): borra la memoria de averías de la Webasto, que es lo que la desbloquea tras varios fallos seguidos. Solo con la calefacción parada.Versión de prueba (sin probar con una Webasto real).
Versión de prueba (sin probar con una Webasto real).
Versión de prueba (sin probar con una Webasto real).
herramientas/webasto_falsa): un segundo ESP32 que hace de Webasto en el W-Bus para probar WTTC en la mesa, con consola para provocar averías (sin gasoil, llama que se apaga, sin corriente, cable suelto, batería baja) y el tiempo acelerado. Su modelo se prueba en GitHub junto al código de WTTC que arma y comprueba las tramas, y se ha contrastado con libwbus: encender solo desde apagada, la orden se mantiene hasta apagarse del todo y sin renovación en 20 s apunta la avería 0x92. El simulador de la web usa ahora las mismas reglas.Versión de prueba (sin probar con una Webasto real).
.elf de la Release) señaló la puesta en hora por internet: se arrancaba al principio del arranque y, como tras un reinicio el reloj conserva la hora, su primera consulta coincidía con la de las órdenes remotas y la pila de red abortaba. Por eso la 0.3.3 se colgó al instalarse y la placa volvió sola a la 0.3.2. Ahora la hora por internet se arranca cuando la Wi-Fi tiene dirección, con la función de la pila de red pensada para ello, y ninguna conexión automática (órdenes, estadísticas, actualizaciones, Telegram, registro) empieza hasta que la Wi-Fi lleve 20 s conectada.Versión de prueba (sin probar con una Webasto real).
Versión de prueba (sin probar con una Webasto real).
Versión de prueba (sin probar con una Webasto real).
Versión de prueba (sin probar con una Webasto real). Solo núcleo ESP32 3.x de Arduino: quien compile desde el código con el 2.x tiene que actualizarlo (Gestor de placas → esp32 de Espressif → 3.x); el instalador web y las actualizaciones no cambian.
Control de errores
Depuración
Botón y pantalla
Pruebas automáticas (en cada compilación, en GitHub)
logica.h) y se prueban con muchos casos (también millis() dando la vuelta), con los detectores de errores de memoria de GCC..github/ con propietario (CODEOWNERS).Versión de prueba (sin probar con una Webasto real).
Versión de prueba (sin probar con una Webasto real).
coredump qué tarea falló y por qué direcciones del programa iba, y lo apunta en el registro. Cada Release lleva ahora el .elf del firmware, y herramientas/descifrar_cuelgue.py traduce esas direcciones a nombres de función.Versión de prueba (sin probar con una Webasto real).
Versión de prueba (sin probar con una Webasto real).
info lo vuelve a sacar, y al unirse a la red con internet se escribe su dirección. Solo lo ve quien tiene la placa enchufada por USB; es también la forma de recuperar una clave olvidada.Versión de prueba (sin probar con una Webasto real).
- Consejos para ti sacados de tus datos: cuánto antes encender según el frío, si conviene «calentar hasta», cuánto gastas con y sin termostato, avisos de batería y de humedad, programas que te ahorrarían encenderla a mano, averías que se repiten y el gasto del mes con su previsión.
- Comparación con el periodo anterior, récords, calendario de uso con rachas, mapa de día y hora, cuánto tarda en calentar, coste y litros por hora por mes, termostato (objetivos que más usas y tiempo hasta llegar), humedad, agua del motor y batería por separado.
- Comparación con la media de las demás placas (cuando envíen al menos 3) y descarga de todo en CSV para Excel.
- Agrupa por día, semana o mes según el rango, con fechas concretas, y se instala como app.
Versión de prueba (sin probar con una Webasto real).
wttc / wttc), y con los de fábrica obliga a cambiarlos antes de dejar hacer nada. La sesión dura 30 días en ese navegador (hasta que la placa se reinicie); 5 intentos fallidos, 5 minutos de espera. Por la Wi-Fi propia de la placa no hace falta: ya se puso su clave. Se cambian en Configuración (web y app).- Código de instalación al azar, creado una vez y para siempre (Configuración → Mis estadísticas). Al cambiar de placa se escribe en la nueva el de la vieja y se siguen las mismas estadísticas.
- «Enviar las estadísticas de esta placa» (apagado de fábrica): la placa las envía si tiene internet; si no, la app al conectarse.
- https://wttc.favala.es/mi.php: con el código, gráficas de horas y gasoil por mes, encendidos por día, a qué hora y qué día enciende, quién la enciende, por qué se apaga, temperatura dentro, agua y batería, duración, averías y los últimos encendidos; coste estimado con el precio del gasoil que elijas. Sin el código no se puede ver nada, y se pueden borrar los datos desde la misma página.
- «Enviar el código por Telegram»: llega solo en un mensaje, para copiarlo.
Versión de prueba (sin probar con una Webasto real).
Versión de prueba (sin probar con una Webasto real).
wttc.local responden siempre. Gasta algo más con la furgo parada (≈ 40–60 mA, 1–1,5 Ah al día): si va a estar parada días, mejor «Solo mientras calienta» en Configuración. Las placas en las que ya se eligió un modo lo conservan.Versión de prueba (sin probar con una Webasto real). La 0.2.12 fue la primera actualización sin cable hecha en una placa real (subiendo el .ota desde su web).
Versión de prueba (sin probar con una Webasto real).
Versión de prueba (sin probar con una Webasto real).
Versión de prueba (sin probar con una Webasto real).
Versión de prueba (sin probar con una Webasto real).
Versión de prueba (sin probar con una Webasto real). La primera grabada en una placa real: el instalador desde el navegador funciona.
Versión de prueba (sin probar con una Webasto real). Cambio de licencia.
Versión de prueba (sin probar con una Webasto real).
Versión de prueba (sin probar con una Webasto real).
Versión de prueba (sin probar con una Webasto real).
Versión de prueba (sin probar con una Webasto real).
herramientas/generar_fuentes.py, sin librerías), barra del tiempo que queda y franja de aviso. Solo se mandan las filas que cambian. Se elige en Configuración → Tipo de pantalla; las de 128×64 siguen valiendo.Versión de prueba (sin probar con una Webasto real).
Versión de prueba (sin probar con una Webasto real). Arreglo de la web de la placa.
Versión de prueba (sin probar con una Webasto real). Pantalla, termómetro y termostato. Solo ESP32-S3.
Versión de prueba (sin probar con una Webasto real). Primera que se puede instalar sin cable desde la 0.1.5.
.ota) y el paquete para instalar desde el navegador.Versión de prueba (sin probar con una Webasto real). Actualizaciones sin cable. Esta versión hay que grabarla una
vez por USB (trae una tabla de particiones nueva); a partir de ella, las siguientes se instalan desde la app o la web.
.ota de una Release desde la web de la placa (Configuración → Actualizar firmware).partitions.csv, Arduino la usa sola). La configuración y el PIN no se pierden al cambiarla.Versión de prueba (sin probar con una Webasto real). Mejoras de seguridad.
calefaccion, que es pública), su web solo deja elegir una nueva: no admite órdenes ni enseña el PIN de Bluetooth. No se puede volver a poner la de fábrica.Versión de prueba (sin probar con una Webasto real).
/en/) y alemán (/de/), simulador incluido.Versión de prueba (sin probar con una Webasto real).
Versión de prueba (sin probar con una Webasto real).
Primera versión pública como WTTC. Versión de prueba: aún sin probar con una Webasto real.
web.h y muestra la fecha completa en la cabecera.arduino-cli en Linux y Windows) y de uso (móvil Android, iPhone y radio de coche), descargas y versiones.
Versión inicial (no publicada) (como Webastot5.ino): solo Wi-Fi y web, encendido y apagado, programas semanales, temperatura, tensión, llama, potencia, averías y consola serie.
All published versions: github.com/matatunos/wttc/releases
| Part | Model used | What for |
|---|---|---|
| Vehicle and heater | VW T5 with factory-fitted Webasto Thermo Top C coolant auxiliary heater (VW part no. 7H0 010 398 J), driven over the W-Bus by the original timer | What is controlled. The ESP32 replaces the timer and plugs into its connector |
| Microcontroller | ESP32-S3 DevKitC-1 N16R8 (16 MB flash; best on a screw-terminal base, which does not come loose with vibration) — since version 0.2.0, the only one supported | Wi-Fi, web page, schedules, notifications and the W-Bus protocol on its UART2 (IO16/IO17) |
| W-Bus transceiver | UART ↔ LIN/K-Line module with TJA1020 (the one used is by Gutol: screw terminals 12V/GND/LIN/INH and TX/RX/SLP/GND, no VCC pin) | Adapts the ESP32's 3.3 V TTL to the single-wire 12 V bus. Any module with a TJA1020 or equivalent will do (TJA1021, MCP2003, L9637D) |
| Optional: display | 1.5" SSD1327 I2C OLED (128×128, 16 greys; the recommended one) or a 128×64 one: 1.3" (SH1106) or 0.96" (SSD1306). Address 0x3C or 0x3D | Inside temperature, status, coolant, battery and what happens next. The type is chosen in Settings |
| Optional: thermometer | SHT31 or AHT20 I2C module (temperature and humidity) | Inside temperature: “heat up to X °C”, a better departure time and condensation at a glance |
| Optional: “heat” button | Any push button (normally open), between IO7 and GND | Switch on (30 min, or whatever you choose in Settings) or off without the phone, like the heat key of the original timer. Hold it for half a second |
| Power supply | LM2596 step-down regulator (module with potentiometer), set to 5.0 V | Takes the ESP32's 5 V from the connector's permanent +12 V |
| Wiring | Female dupont wires for the ESP32, 0.5 mm² wire for the 12 V side, splices or terminal blocks and tape or heat-shrink | Connections as per the diagram and the wire list above |
| Tools | Multimeter, small screwdriver, PC with USB (Linux or Windows) | Identifying the connector's wires, adjusting the LM2596, flashing the ESP32 and the first test over the console |
winget install ArduinoSA.IDE.stable; on Linux, the AppImage (make it executable).https://espressif.github.io/arduino-esp32/package_esp32_index.jsonWTTC/ with WTTC.ino and web.h (the IDE requires the folder to be named like the .ino). Open WTTC.ino.WTTC/ folder brings its own partition table, with two slots for wireless updates, and Arduino uses it by itself); and under Port the ESP32's one (COMx on Windows, /dev/ttyUSB0 on Linux).info shows it again). Type status for the first test.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 # inside the folder that contains WTTC/ # ESP32-S3 FQBN=esp32:esp32:esp32s3:FlashSize=16M,PSRAM=opi,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
/dev/ttyUSB0: sudo usermod -aG dialout $USER and log out. On Ubuntu, if the port appears and disappears, uninstall brltty.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 # inside the folder that contains WTTC\ # ESP32-S3 $FQBN = "esp32:esp32:esp32s3:FlashSize=16M,PSRAM=opi,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
COM3 with the port shown by arduino-cli board list (or in Device Manager → Ports (COM & LPT)). After installing with winget, open a new PowerShell so it finds arduino-cli.calefaccion: the first time, the web page asks you to change it before letting you use it) and open http://192.168.4.1 in Safari..ota file of the latest version from that same section.| Mode (Settings) | When the Wi-Fi is on | Approx. draw when parked |
|---|---|---|
| Always on (default) | All the time | ≈ 40–60 mA (1–1.5 Ah/day) |
| Only while heating (best when parked for days) | While heating and 10 min after | ≈ 15–25 mA with Bluetooth only |
| Only on request | When you ask for it from the app (15 min) and a few minutes to send notifications | ≈ 15–25 mA |
/newbot and follow the steps: it gives you your bot's token.https://api.telegram.org/bot<TOKEN>/getUpdates; it is the number in "chat":{"id":…}.forget), and change the PIN.calefaccion): until you choose another one, the board's web page will not let you use it or show the PIN, and the app asks you for it when connecting. The Telegram token is never shown after saving it.| Action | Frame | Webasto's answer |
|---|
1. Scope. WTTC (the “project”) comprises the firmware for ESP32 and ESP32-S3, the Android app, this website and its simulator, the diagrams, the documentation and the related services (anonymous statistics and updates). It is a personal, non-profit project of its author (matatunos, the copyright holder under the licence), made available to the public free of charge. It is not a commercial product: it is not sold, has no technical or customer support and has not passed any type approval, certification or conformity testing.
2. No warranty. The project is provided “as is” and “as available”, under the GPL v3 (or later) licence, without warranty of any kind, express or implied, including without limitation warranties of operation, merchantability, fitness for a particular purpose, freedom from errors, compatibility with a given vehicle or heater, and continuity of the services. While its version number starts with 0 it is a test version: it compiles and has been checked in the simulator, but it has not been tried installed with a real Webasto heater.
3. Accuracy of information. The documentation (wire colours and functions, connections, power consumption, fault codes, diesel estimates and any other technical data) is based on public sources and on assumptions that have not been checked on every vehicle. It may contain errors or omissions and does not replace the manufacturer's manual, the vehicle's wiring diagram or a professional's judgement. Check it yourself before connecting anything.
4. Exclusion of liability. To the maximum extent permitted by applicable law, the author shall not be liable for any damage or loss, direct or indirect, incidental or consequential, of any kind —including, among others, personal injury, carbon monoxide poisoning, fire, damage to the heater, the vehicle, its battery or its electrical system, loss of warranty or insurance cover, fines, immobilisation of the vehicle, loss of data, loss of profit or repair costs— arising out of or in connection with downloading, installing, using, being unable to use, modifying or distributing the project, errors in its software or documentation, or the interruption or failure of third-party services it depends on (such as GitHub or Telegram).
5. User's responsibility. Anyone who installs or uses the project does so of their own choice, under their sole responsibility, and assumes all risks. In particular, they are responsible for:
6. Software generated with artificial intelligence. All of the project's code and content has been generated with Claude, an artificial intelligence model by Anthropic, following the author's instructions. It may contain errors that have not been detected. Anthropic is not part of the project and is not responsible for it.
7. Trademarks. Webasto, Thermo Top, Volkswagen, Climatronic, Espressif, ESP32, Arduino, Android, Telegram and GitHub are trademarks or names of their respective owners. The project has no relationship with them and is not approved or sponsored by them; their names are used only to indicate which equipment and services it is compatible or works with.
8. Limits of this exclusion. Nothing above excludes or limits liability where the law does not allow it, such as liability for wilful misconduct or gross negligence. If any part of this text is held void or unenforceable, the rest remains valid.
9. Acceptance and governing law. Downloading, installing or using any part of the project means you have read and accepted this disclaimer of liability and the GPL v3 licence; if you do not agree, do not use it. Matters not covered here are governed by Spanish law. In case of discrepancy between language versions, the Spanish version prevails.
This text supplements, without replacing it, the warranty and liability disclaimer of the GPL v3 licence (sections 15 and 16) (LICENSE file in the repository).
WTTC · free software (GPL v3) on GitHub · code and content generated entirely with Claude (Anthropic) · personal project unrelated to Webasto or Volkswagen.