🔥 WTTC · Webasto Thermo Top C over Bluetooth and Wi-Fi

Replaces the original timer of the Thermo Top C auxiliary heater with an ESP32 that speaks its W-Bus protocol, and controls it from an Android app over Bluetooth or from the browser over Wi-Fi. Open source: github.com/matatunos/wttc.
Below is the simulator: on the left, the firmware's web page as is; on the right, a virtual Webasto that answers its frames. You can speed up time and cause faults.
All of WTTC's code and content (firmware, app, server, this website and its documentation) is generated entirely with Claude (Anthropic). Further down are the downloads, the wiring and the user guide. How many people use it? Public statistics (in Spanish). Have a board? My statistics (in Spanish). Is your Webasto showing a fault? Thermo Top C fault codes. Going to build it? Install the firmware from the browser, no Arduino IDE needed. No wires or modules? There is a board you can order ready-made (untested design).
⚠️ First of all: this is a personal project, not a product. WTTC controls a heater that burns diesel inside your vehicle, and it is provided as is, without any warranty and as a test version. If you decide to build it, you do so entirely at your own risk. Read the disclaimer of liability before touching a single wire.
WTTC · 192.168.4.1
Web page served by the ESP32 (verbatim copy from the firmware).
Its calls to /api/… are answered by the simulated ESP32.
--:--:--simulated time

Webasto Thermo Top C (virtual)

--°engine coolant
Off
Power
0 W
Battery
--
Current
--
Active command
—

Board: display, LED and thermometer

Board LED
Inside (real)
--
Set inside to
The display is drawn pixel by pixel as on the board (the 128×128 greyscale SSD1327, or the 128×64 one if you choose it in Settings; same fonts and same texts). In automatic mode it stays on while the web page on the left is open, just like the real board with its web page open. When you remove a part, the board treats it as disconnected after a few seconds and whatever depends on it disappears from the web page; when you plug it back in, it is detected within half a minute.

Tests and PDF report

Outside °C Inside at start °C Up to Duration Battery V
“Run the test” switches on with those values and jumps the simulated time to the end at once (a few seconds); then it downloads a PDF with charts of temperatures, starts, power, diesel and battery, the table of starts and the board log. “Record what I do” logs what happens while you use the simulator (at any speed) until you finish it. The heat model is approximate.

Telegram (simulated)

What would reach your phone. Nothing is really sent from the simulator.

Cause faults

Outside temperature 5 °C Resting battery 12.6 V

W-Bus traffic · 2400 baud 8E1

Blue: what the ESP32 sends (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.

Serial console (115200)

It is the same console you will use for the first test, with the ESP32 connected to your laptop over USB. Its commands and messages are in Spanish.

Wiring diagram (for building it)

Controller connector(van side, with the controller removed) brownblackredyellow⚠ The Webasto has no power (fuse) TJA1020 board (Gutol)screw terminals on both sides GNDGND LINRX INHSLP 12VTX TJA1020 47µF INH: not connected LM2596 regulator IN− IN+ OUT+ OUT− 470 100µF screw:5.0 V ESP32-S3 DevKitC-1 N16R8 (44 pins)drawn lying down: antenna on the left, USB on the right ESP32-S3-WROOM-1N16R8 · 16 MB BOOTRST UARTUSB GND TX RX IO1 IO2 IO42 IO41 IO40 IO39 IO38 IO37 IO36 IO35 IO0 IO45 IO48 IO47 IO21 IO20 IO19 GND GND 3V3 3V3 RST IO4 IO5 IO6 IO7 IO15 IO16 IO17 IO18 IO8 IO3 IO46 IO9 IO10 IO11 IO12 IO13 IO14 5V GND 5 4 1 2 3 yellow: insulate with tape, not used W-Bus loose 7 6 10 SLP floating: ⑩ is missing 11 98 98⑧ and ⑨ swapped Optional: display and thermometer (I2C bus), “heat” button and CO sensordashed wires: the build works without them 12 13 14 15 21,4° GND VCC SCL SDA I2C OLED display (SSD1327 1.5") VIN GND SCL SDA SHT31 or AHT20 thermometer 16 17 “heat” button (push button) 20 18 19 VIN GND TXD ZE07-CO CO sensorTXD → IO15 · VIN to 5 V
Boards may come with the terminals in other places: go by what is printed next to each terminal or pin, not by its position in the drawing. The drawing shows the ESP32-S3 DevKitC-1: all the pins WTTC uses are on the same side. Screw-terminal bases have them labelled (the 5 V one sometimes says “5Vin”). Since version 0.2.0 only the ESP32-S3 is supported. What is inside the dashed box (display and thermometer, wires ⑫–⑮; “heat” button, ⑯–⑰, and CO sensor, ⑱–⑳) is optional: the build works without it. The colours of wires ⑥–⑪ are a suggestion (dupont wires). Those of the van's connector are unconfirmed: measure them with a multimeter.

Wire list

No.WireFromTo
1brownvan's brown (ground)TJA1020 board, terminal GND (12V/LIN side)
2blackvan's black (W-Bus)TJA1020 board, terminal LIN
3redvan's red (+12 V)TJA1020 board, terminal 12V
4redvan's red (spliced from ③)LM2596, IN+
5brownvan's brown (spliced from ①)LM2596, IN−
6orangeLM2596 OUT+ (5.0 V)ESP32, pin 5V
7greyLM2596 OUT−ESP32, pin GND (any)
8greenTJA1020 board, terminal TXESP32, pin IO16 (RX2)
9blueTJA1020 board, terminal RXESP32, pin IO17 (TX2)
10violetTJA1020 board, terminal SLPESP32, pin 3V3
11greyTJA1020 board, terminal GND (TX/RX side)ESP32, pin GND (another one, or the same)
—yellowvan's yellownot used: insulate it with tape
——TJA1020 board, terminal INHnot 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.
12pinkESP32, pin 3V3 (the other one)Display VCC and thermometer VIN
13greyESP32, pin GND (or splice from ⑦)Display GND and thermometer GND
14tealESP32, pin IO4 (SDA)Display SDA and thermometer SDA
15goldESP32, pin IO5 (SCL)Display SCL and thermometer SCL
16magentaESP32, pin IO7“Heat” button: one leg
17grey“Heat” button: the other legGround: 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.
18orangeSplice of ⑥ (5 V from the LM2596)CO sensor, VIN (5 V)
19greySplice of ⑬ (ground)CO sensor, GND
20limeCO sensor, TXDESP32, pin IO15

Steps, in order

  1. First of all, check that your heater speaks W-Bus. The one in VW T5s with the factory timer (part no. 7H0 010 398 J) does, and someone has already switched it on with an ESP, but it is also said that some older Thermo Top C units use another protocol. The first test below (only 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.
  2. Measure the controller connector with a multimeter, with the Webasto connected: one wire gives a constant +12 V (the “red”), another has continuity to the chassis (the “brown”) and the idle W-Bus reads almost the same as the battery (the “black”). If the colours do not match, what you measure wins, not the drawing.
  3. Adjust the LM2596 before connecting anything to it: fit only wires ④ and ⑤, measure between OUT+ and OUT− and turn the gold screw until it reads 5.0 V. If you go too high, the ESP32 burns out.
  4. Disconnect, and wire the TJA1020 board: ① ② ③ on the 12V/LIN side terminal (INH empty) and ⑧ ⑨ ⑩ ⑪ on the other side.
  5. Finally, ⑥ and ⑦ to the ESP32. For the first test leave them off: power the ESP32 over USB from your laptop (on the ESP32-S3, through the USB port marked UART or COM) and type status in the console.
  6. If the console does not even show the echo, swap ⑧ and ⑨ (it often happens with the TX/RX labels on these boards). If there is an echo but “sin respuesta” (no answer), check ② and the ground.
  7. Optional, once the basics work: the OLED display and the thermometer (SHT31 or AHT20) with ⑫–⑮, and the “heat” button with ⑯–⑰ (any push button; set it up in Settings). The board detects them by itself at boot (or 30 s after plugging them in). Keep the thermometer a hand's width away from the board and the regulator, which get warm. Without a thermometer everything works the same, except “heat up to X °C”.
  8. Optional: CO sensor (Winsen ZE07-CO) with ⑱–⑳: 5 V from the regulator, ground and its TXD to IO15 (its RXD and other pins stay free). Its output is 3.3 V: it goes straight to the ESP32. The board detects it as soon as it sends data, and its first 3 minutes do not count (it is warming up). Place it inside, at head height where you sleep and away from the cooker; not next to the hot-air outlet. If it ever stops sending data, schedules will not start on their own until it is back (or until you choose «I no longer have a CO sensor» in Settings). Also fit a certified CO detector (EN 50291) with its own alarm: if the board fails, this sensor is useless.
Download the wiring diagram as PDF drawing, wire list and steps, to print and take to the van

Testing without a van: a fake Webasto

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.

A) Direct, without transceivers (the easiest) First remove the TJA1020 board from WTTC (or disconnect its TX and RX) · echo on (default) Fake ESP32 (any: classic or S3) TX · IO17 RX · IO16 GND USB to the PC: console 115200 WTTC · ESP32-S3 without the TJA1020 board IO16 (listens) IO17 (sends) GND 1 2 3 ① what the fake Webasto answers · ② what WTTC sends · ③ common ground all at 3.3 V: nothing else is needed (the fake Webasto returns the bus echo) Power: each ESP32 from its own USB (computer or charger). Do not join their 5 V: the ground ③ is enough. B) Over the real bus, with a second TJA1020 Also tests the transceiver and the W-Bus wire · TX and RX as in WTTC (the module TX terminal goes to the ESP32 RX) · in its console: eco no Fake ESP32 IO16 (RX) IO17 (TX) 3V3 GND TJA1020 TX RX SLP GND LIN 12V GND WTTC TJA1020 LIN 12V GND WTTC as in the van W-Bus (LIN to LIN) 12 V supply(+ and −) Power: both ESP32 from their USB. The 12 V supply only feeds the TJA1020s (the bus). WTTC can also take 5 V from its LM2596 on that supply, as in the van (and then without its USB). In both cases: the fake Webasto is driven from its USB console (faults, battery, temperature, faster time)
Easiest: install it from the browser (Chrome or Edge, classic ESP32 or S3). It can also be flashed with the Arduino IDE (esp32 core 3.x), like WTTC. If your ESP32 does not have IO16 and IO17 free, change them in its console with pines <rx> <tx>; for wiring through the bus (B), eco no. Both are saved.

Seeing the log over USB (serial console)

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:

  1. Plug the board into the computer over USB (on the ESP32-S3, the USB port marked UART or COM).
  2. In Device Manager → Ports (COM & LPT) check its number (e.g. COM5; usually called CP210x, CH340/CH343 or “USB Serial”). If it is missing, install its driver (CP210x or CH343).
  3. In PuTTY, Session: Connection type Serial, Serial line COM5 (yours) and Speed 115200.
  4. Connection → Serial: Flow control None.
  5. Terminal: Local echo and Local line editing set to Force on (you see what you type and it is sent on Enter).
  6. To save it to a file (and send it if something fails): Session → Logging → “All session output” and pick the file.
  7. Back in Session, give it a name (“Fake Webasto”, “WTTC”) and click Save; then Open. Type 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).

Downloads · version 0.3.18

Firmware for the ESP32 Folder WTTC/ with WTTC.ino and web.h · 164 KB · 21/10/2026 ⬇ WTTC-firmware.zip
Android app (APK) Android 8 or later · phone, tablet or car radio · no board yet? try demo mode ⬇ WTTC.apk
Wireless update (.ota) For the board's web page (Settings → Update firmware), if it cannot download it by itself. Signed: only the official one is installed · 1.618 KB ⬇ WTTC-0.3.18-s3.ota
Source code Firmware, app and this documentation · free software, GPL v3 licence GitHub ↗
Versions and changes (in Spanish)

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.

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.

Version 0.3.18 · 2026-10-18 · Release on GitHub ↗

Versión de prueba (sin probar con una Webasto real).

  • Programas para dormir dentro: con temperatura, hasta 12 horas. Por ejemplo «mantener 20 °C de 22:00 a 7:00, de lunes a viernes» (temporada de esquí). Dentro de esa ventana hace de termostato como siempre: enciende si hace frío, apaga al llegar y vuelve a encender al enfriarse, con encendidos de 60 minutos como mucho.
  • Las ventanas de más de 4 horas («noche») exigen el sensor de CO y batería, sin elección: solo se guardan con el sensor de CO montado y mandando datos y con la batería mínima en 12,0 V o más (para que por la mañana arranque el motor). Mientras haya alguno, la batería mínima no se puede bajar de 12,0 V. Si llega la hora y el sensor no está mandando datos, no empieza; si deja de mandar datos durante la noche, apaga la calefacción y avisa.
  • La Webasto falsa ya no enseña en su registro un «último mantenimiento hace 3,3 s» congelado durante el postbarrido (parecía que WTTC seguía mandándolo): dice que apagándose ya no hace falta.

Version 0.3.17 · 2026-10-17 · Release on GitHub ↗

Versión de prueba (sin probar con una Webasto real).

  • Prohibido que los programas se pisen. Antes solo se avisaba; ahora no se pueden guardar (ni desde la web, ni desde la app, ni por Bluetooth: la placa lo comprueba siempre). Cada programa ocupa su rato: uno normal, de su hora a su final; uno con «hora de salida», los 90 minutos antes de la salida (lo más pronto que puede encender). Entre el final de uno y el principio del siguiente tiene que haber al menos 5 minutos (el postbarrido de la Webasto y margen), también cruzando la medianoche (domingo por la noche y lunes de madrugada, por ejemplo). La web y la app marcan en rojo los dos que chocan.
  • «Salgo a las…» tampoco puede pisar un programa, ni un programa la salida que ya esté puesta.
  • Programas guardados con versiones anteriores que se pisen: al arrancar, la placa desactiva el segundo de cada pareja y lo apunta en el registro («Programa de las 16:15 desactivado: se pisaba con el de las 16:05»).

Version 0.3.16 · 2026-10-17 · Release on GitHub ↗

Versión de prueba (sin probar con una Webasto real).

  • Un programa que llega con la calefacción ya encendida queda apuntado («Programa de las 16:15: ya estaba calentando, no hace nada»). No se apaga ni se alarga lo que está en marcha, igual que antes, pero antes no dejaba rastro y parecía que no había funcionado.
  • «Saltar la próxima» se cumple también si en ese momento ya calentaba: esa vez ya pasó, así que se quita la marca. Antes se quedaba puesta y se saltaba el programa del día siguiente.
  • Varios programas a la misma hora: si uno se salta (por «saltar la próxima» o por «solo si hace frío»), los demás se siguen mirando.

Version 0.3.15 · 2026-10-17 · Release on GitHub ↗

Versión de prueba (sin probar con una Webasto real).

  • «Guardar programas» se bloquea mientras guarda: varias pulsaciones seguidas lo guardaban varias veces (visto en una prueba en la mesa).
  • En la web: consola serie (wttc.favala.es/consola.php) para ver por USB las dos placas a la vez, con colores, y guardarlo en .txt o .md.

Version 0.3.14 · 2026-10-17 · Release on GitHub ↗

Versión de prueba (sin probar con una Webasto real).

  • La consola por USB funciona con PuTTY (y con screen o cualquier terminal), en WTTC y en la Webasto falsa: las letras se juntan hasta el Enter. Antes solo iba bien el Monitor serie de Arduino, que manda la línea entera; PuTTY manda cada tecla y la orden llegaba a trozos.
  • En la web, cómo ver el registro por USB con PuTTY (instalar.php y la sección «Probar sin furgoneta»): qué COM, velocidad, ajustes y cómo guardarlo en un fichero.

Version 0.3.13 · 2026-10-17 · Release on GitHub ↗

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.

Version 0.3.12 · 2026-10-17 · Release on GitHub ↗

Versión de prueba (sin probar con una Webasto real).

  • La Webasto falsa cuenta todo lo que pasa por su consola USB: cada orden de WTTC y su respuesta, traducidas (encender, mantenimiento con el tiempo desde el anterior, sensores con sus valores, averías…); cada cambio de estado de la caldera y por qué (bujía caliente, ¡llama!, agua a 85 °C, fin del postbarrido…); las averías al guardarse; las órdenes que ignora y por qué; avisos si WTTC no renueva la orden, si llegan tramas malas o si en 30 s no llega nada (con lo que hay que revisar). Con hora en cada línea, nivel de detalle log 0–log 3 (guardado) y la orden resumen.
  • Los dibujos de conexión de la Webasto falsa dicen cómo se alimenta cada placa: cada ESP32 por su USB; la fuente de 12 V, solo para el bus.
  • El firmware de la placa no cambia (solo el número de versión).

Version 0.3.11 · 2026-10-17 · Release on GitHub ↗

Versión de prueba (sin probar con una Webasto real).

  • La Webasto falsa se instala desde el navegador: en wttc.favala.es/instalar.php hay un segundo botón, «Instalar la Webasto falsa», para el otro ESP32 (el clásico o un S3) que hace de caldera en la mesa. El eco del bus y los pines del W-Bus ya no hay que tocarlos en el código: se cambian en su consola (eco no para la conexión por el bus, pines 16 17) y se quedan guardados.
  • El instalador graba siempre la versión que anuncia. La página decía una versión, pero el botón cogía el manifiesto común en el momento de pulsar: si entre medias salía otra, instalaba esa. Ahora cada versión tiene su manifiesto.
  • El firmware de la placa no cambia (solo el número de versión).

Version 0.3.10 · 2026-10-17 · Release on GitHub ↗

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).

Version 0.3.9 · 2026-10-17 · Release on GitHub ↗

Versión de prueba (sin probar con una Webasto real ni con el sensor de CO).

  • Sensor de monóxido de carbono opcional (Winsen ZE07-CO, electroquímico): 5 V del regulador, masa y su TXD a IO15; la placa lo detecta sola, como el termómetro. Sus 3 primeros minutos no cuentan (se calienta).

- 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.

  • Esquema de conexiones en PDF (botón en la sección «Montaje» de wttc.favala.es, en español, inglés y alemán): dibujo, lista de cables y pasos, para imprimirlo. El esquema incluye el sensor de CO (cables ⑱–⑳).

Version 0.3.8 · 2026-10-16 · Release on GitHub ↗

Versión de prueba (sin probar con una Webasto real).

  • Chequeo de la Webasto al conectar la placa, con el informe por Telegram. A los 20 s de arrancar, la placa le pregunta a la Webasto y comprueba: que el W-Bus contesta (si no, dice si el fallo parece de la placa o del cable, o de la Webasto o su fusible), qué calefactor es y su fecha de fabricación, la batería, la temperatura del agua, la resistencia de la bujía, que no haya llama estando apagada, horas de uso y arranques, y las averías guardadas con su nombre en español, inglés o alemán (y para las primeras, a qué tensión y temperatura pasaron). Termina con un veredicto (bien, revisar, mal) y consejos: si está bloqueada, cómo desbloquearla; si tuvo fallos de arranque, qué mirar; y, tras mucho tiempo parada, cómo hacer el primer encendido. Si la Webasto no contesta en 20 min, avisa igual. Nunca hace pruebas de componentes (bomba, bujía, ventilador) por su cuenta.
  • A mano cuando quieras: botón «Chequeo de la Webasto» en Diagnóstico (también lo manda por Telegram), orden chequeo en la consola y check en la app. Si está calentando, se hace al apagarse.
  • Borrar averías (Diagnóstico, con confirmación; consola 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.
  • Los avisos de Telegram admiten textos más largos (el informe del chequeo).

Version 0.3.7 · 2026-10-10 · Release on GitHub ↗

Versión de prueba (sin probar con una Webasto real).

  • La app tiene modo claro y sigue el modo noche del sistema. Nuevo ajuste «Tema de la app»: automático (de fábrica), siempre oscuro o siempre claro. En automático cambia sola cuando el móvil, o la radio Android del coche, pasa a modo noche (muchas radios lo hacen al encender las luces). Si en ese momento hay programas sin guardar, espera a que se guarden. Los colores son los de la web de la placa, que ya seguía el modo del sistema.
  • El firmware no cambia (solo el número de versión).

Version 0.3.6 · 2026-10-10 · Release on GitHub ↗

Versión de prueba (sin probar con una Webasto real).

  • La hora de salida aprende de tu furgoneta. Con termómetro dentro y «hasta X °C», cada encendido apunta cuánto tardó en llegar. Tras 3 encendidos así, la placa calcula a cuántos °C por minuto se calienta tu furgoneta (la mediana de los 10 últimos) y enciende con esa antelación, más un 15 % y 5 min de margen (entre 10 y 90 min). Hasta entonces, o sin termómetro, usa la fórmula de siempre. La web dice cuánto ha aprendido y el registro, cada vez que lo usa.
  • «Solo si hace frío» en cada programa: encender solo si dentro hay menos de X °C (sin termómetro, el agua del motor). Sin dato, enciende igual. Si se lo salta, lo apunta en el registro.
  • Saltar la próxima vez un programa, sin desactivarlo, y pausar los programas hasta un día (vacaciones): vuelven solos. «Salgo a las…» suelta funciona aunque estén en pausa.
  • Más cómodo de editar: plantillas al añadir (laborables saliendo a las 7:30, fin de semana, noche hasta 18 °C), botón «Duplicar» y aviso si dos programas activos se pisan el mismo día.
  • En la web de la placa y en la app. Una app anterior sigue funcionando con la placa nueva, y al guardar programas no borra la condición de frío de los que no cambia.

Version 0.3.5 · 2026-10-10 · Release on GitHub ↗

Versión de prueba (sin probar con una Webasto real).

  • No se manda encender durante el postbarrido. Tras apagarse, la Webasto sigue unos 2 min soplando para enfriarse e ignora una orden de encender (así lo hace libwbus, la referencia del protocolo W-Bus). WTTC la mandaba igual, creía que calentaba y, al acabar el postbarrido, avisaba de una avería que no era. Ahora, a mano (web, app, botón, consola) contesta «La Webasto está terminando de apagarse: prueba en N s»; los programas y «Salgo a las…» esperan solos y encienden al terminar.
  • Webasto falsa (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.

Version 0.3.4 · 2026-10-10 · Release on GitHub ↗

Versión de prueba (sin probar con una Webasto real).

  • Arregla un cuelgue al arrancar tras un reinicio pedido (actualización, orden «reiniciar», cambio de ajustes). El informe de cuelgues de una placa real (traducido con el .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.
  • Incluye lo de la 0.3.3 (conexiones seguras en la PSRAM), que no llegó a funcionar en esa placa por este cuelgue.

Version 0.3.3 · 2026-10-10 · Release on GitHub ↗

Versión de prueba (sin probar con una Webasto real).

  • Las conexiones seguras usan la PSRAM (8 MB, casi sin usar) en vez de la memoria interna. Una placa real no pudo descargar una actualización con 40 KB libres porque el mayor bloque seguido era de 13 KB (cada conexión pide bloques de unos 16 KB). Si no hay PSRAM, se usa la interna como antes.
  • El registro enviado incluye el mayor bloque libre de la memoria interna, la PSRAM libre y si las conexiones van en ella (se ve en «Mis estadísticas»).

Version 0.3.2 · 2026-10-10 · Release on GitHub ↗

Versión de prueba (sin probar con una Webasto real).

  • Conexiones a internet de una en una. El registro de una placa real (enviado con una orden remota) mostró que, al arrancar, la memoria libre bajaba a 24 KB: coincidían varias conexiones seguras (buscar actualización, órdenes remotas, estadísticas, Telegram) y cada una necesita unos 35–45 KB. Con poca memoria, las conexiones pueden fallar y la placa colgarse. Ahora esperan su turno, y las automáticas ni se lanzan mientras otra está conectada.
  • El registro enviado y la captura del W-Bus conservan los saltos de línea (antes llegaban en una sola línea).

Version 0.3.1 · 2026-10-10 · Release on GitHub ↗

Versión de prueba (sin probar con una Webasto real).

  • Órdenes remotas (Configuración, web y app: «Permitir órdenes remotas», apagado de fábrica). Para cuidar la placa de lejos, en cualquier Wi-Fi con internet: cada 2 minutos pregunta al servidor del proyecto si hay una orden para ella (solo salen conexiones: sin VPN ni abrir puertos). Las órdenes van firmadas con la clave de las actualizaciones, y la placa comprueba la firma, que son para su código de instalación, que no las ha hecho ya y que no han caducado (15 min). Lista cerrada: actualizar, buscar actualizaciones, enviar el registro, reiniciar (nunca calentando) y el modo diagnóstico. Nunca enciende ni apaga la calefacción. Tras cada orden, la placa manda su registro (también después de reiniciar) para ver cómo fue.
  • Pruebas automáticas también de las órdenes (formato, firma de otra placa, repetidas, caducadas, desconocidas).

Version 0.3.0 · 2026-10-10 · Release on GitHub ↗

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

  • Si la placa se reinicia calentando (cuelgue, vigilante, orden), al arrancar apaga la Webasto, lo apunta, avisa por Telegram y lo dice en la pantalla. Antes arrancaba creyendo que estaba apagada y perdía el control hasta que se acababa el tiempo.
  • Vigilante del bucle principal: si el programa se queda atascado 30 s, la placa se reinicia sola, con el motivo y el informe de dónde estaba atascada en el registro.
  • Se comprueba todo lo que puede fallar y se apunta en el registro en vez de seguir a ciegas: la memoria de ajustes (abrirla y si se llena), las tareas de Telegram, estadísticas, actualización y envío del registro, la Wi-Fi propia y wttc.local, y la memoria para pasar el registro antiguo. Las tramas del W-Bus se arman y comprueban con límites (una orden demasiado larga ya no puede escribir fuera de su sitio), y mientras espera la respuesta la placa cede el procesador.
  • Avisos de salud: poca memoria libre (menos de 30 KB) o una tarea que va justa de pila quedan en el registro.
  • Certificado del servidor: las actualizaciones, las estadísticas y el registro solo hablan con el servidor del proyecto (Let's Encrypt o ZeroSSL). Antes no se comprobaba (la firma ya impedía instalar algo falso, pero el anuncio de versión sí se podía falsear en una red ajena).

Depuración

  • Enviar el registro (Diagnóstico, en modo diagnóstico; web y app): manda el registro, las últimas tramas del W-Bus y los datos de salud al servidor del proyecto con el código de instalación. Se ven en https://wttc.favala.es/mi.php con ese código.
  • Captura del W-Bus: las 40 últimas tramas, con su momento (web y app).
  • En Diagnóstico también la memoria de ajustes libre y la pila que les sobra a las tareas.

Botón y pantalla

  • Botón «calentar» opcional (un pulsador entre IO7 y GND): con la calefacción apagada la enciende 30 min (o lo que elijas, o «hasta X °C» con termómetro); encendida, la apaga. Hay que mantenerlo medio segundo, y si se queda pulsado (cable en corto) se ignora. Cuenta en las estadísticas como «Botón».
  • Mensajes en la pantalla: lo que acaba de hacer el botón, «La Webasto no responde», «Actualizando 40 %», «Instalando actualización» y «Reinicio calentando: apagada».

Pruebas automáticas (en cada compilación, en GitHub)

  • La lógica del termostato, las tramas del W-Bus, las versiones, el código de instalación y la antelación de la salida van aparte (logica.h) y se prueban con muchos casos (también millis() dando la vuelta), con los detectores de errores de memoria de GCC.
  • Análisis estático con cppcheck: el código queda limpio y cualquier aviso nuevo para la compilación.
  • Las acciones de GitHub, fijadas a versiones exactas; .github/ con propietario (CODEOWNERS).

Version 0.2.21 · 2026-10-09 · Release on GitHub ↗

Versión de prueba (sin probar con una Webasto real).

  • Lo mismo que la 0.2.20, que se quedó sin la actualización firmada en su Release por un fallo al publicarla (la etiqueta acabó en un commit posterior). Ahora la Release se etiqueta siempre en el commit que se ha compilado.
  • La web y la app solo anuncian una versión nueva cuando su actualización ya se puede descargar: antes, durante unos minutos tras publicarla, la placa la veía, empezaba y luego decía que aún no estaba publicada.

Version 0.2.20 · 2026-10-09 · Release on GitHub ↗

Versión de prueba (sin probar con una Webasto real).

  • La Wi-Fi propia se oculta estando en casa. La Wi-Fi propia y la red con internet comparten la única radio del ESP32: con las dos a la vez, la propia cambia de canal y va a trompicones mientras se busca la otra (la «Wi-Fi que se apaga sola» después de un rato). Ahora, con 2 minutos estable en la red con internet y nadie conectado a la propia, la placa la apaga (se entra por wttc.local o por Bluetooth), y la vuelve a encender sola tras 1 minuto sin esa red. Los 10 primeros minutos tras arrancar sigue siempre visible. Se puede desactivar en Configuración (web y app): «Ocultarla cuando esté conectada a la red con internet».
  • La red con internet se busca con calma: si no está, cada 20 s los primeros 5 minutos y luego cada 5 minutos, en vez de sin parar (que estorbaba a la Wi-Fi propia lejos de casa).
  • Registro permanente: se guarda en la flash (40 líneas) y sobrevive a reinicios, cuelgues y cortes de corriente; lo que no dio tiempo a guardar justo antes de un cuelgue se recupera de la memoria que aguanta los reinicios. Una línea de puntos separa lo de antes de cada arranque.
  • Informe del cuelgue: si la placa se cuelga, al volver a arrancar lee de su partición 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.
  • Modo diagnóstico (Configuración, apagado de fábrica): enseña en Diagnóstico el registro, las tramas del W-Bus, cuánto lleva encendida, el motivo del arranque y la memoria, y manda por Telegram el informe del cuelgue. Apagado, Diagnóstico deja solo lo útil para cualquiera (leer averías, gasoil a cero). El registro y el informe se guardan siempre.
  • Por qué arrancó la placa: el registro apunta en cada arranque el motivo (se enchufó, reinicio pedido, se colgó, la reinició el vigilante, le bajó la tensión, botón RST). Si se colgó o le faltó tensión, avisa por Telegram. En Diagnóstico se ve cuánto lleva encendida, el motivo del último arranque y la memoria libre (ahora y la más baja), y también en el resumen de la consola.

Version 0.2.19 · 2026-10-09 · Release on GitHub ↗

Versión de prueba (sin probar con una Webasto real).

  • Los arranques fallidos también cuentan en «Mis estadísticas». Cuando la Webasto no contesta por el W-Bus al intentar encenderla («No se pudo encender…»), la placa lo apunta como un intento con su hora, quién lo pidió y la temperatura y batería de ese momento. En https://wttc.favala.es/mi.php sale aparte (no baja las medias de duración y gasoil), en «Por qué se apaga» y en la tabla como «No respondió (W-Bus)», y con un consejo de qué revisar si se repite.
  • Mientras se actualiza no se puede tocar nada. La web de la placa y la app tapan toda la pantalla con el progreso («Descargando… 40 %», «Instalando…», «Reiniciando con la versión nueva…») hasta que la placa vuelve. Además, la placa rechaza las órdenes mientras instala (salvo apagar y consultar), por si alguien las manda igualmente.

Version 0.2.18 · 2026-10-09 · Release on GitHub ↗

Versión de prueba (sin probar con una Webasto real).

  • Resumen de arranque en la consola (USB, 115200 baudios): versión, Bluetooth y su PIN, Wi-Fi propia y su clave, modo de la Wi-Fi, red con internet y su dirección, usuario y clave de la web desde otra red, Telegram, código de «Mis estadísticas» con su enlace, piezas detectadas y actualizaciones. Avisa de lo que sigue con los valores de fábrica. La orden 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.
  • El simulador de la web hace lo mismo.

Version 0.2.17 · 2026-10-09 · Release on GitHub ↗

Versión de prueba (sin probar con una Webasto real).

  • Más datos de cada encendido para «Mis estadísticas»: humedad dentro al empezar y al acabar, objetivo del termostato y minutos hasta llegar, agua del motor y batería al empezar, y potencia media. Los encendidos que ya tenía apuntados la placa se conservan (pasan solos al formato nuevo).
  • Mis estadísticas (https://wttc.favala.es/mi.php), mucho más completa:

- 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.

  • La app invita una vez a activar «Mis estadísticas» de cada placa (dos botones iguales; se puede cambiar cuando se quiera).

Version 0.2.16 · 2026-10-09 · Release on GitHub ↗

Versión de prueba (sin probar con una Webasto real).

  • Login en la web de la placa desde otra red. Si la placa está unida a otra red (casa, camping, el móvil como punto de acceso…), antes cualquiera en esa red podía abrir su web y manejar la calefacción. Ahora pide usuario y clave (de fábrica, 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).
  • Mis estadísticas. La placa apunta cada encendido: hora, duración, gasoil, temperatura dentro al empezar y al acabar, máxima del agua, batería mínima, quién la encendió, por qué se apagó y la avería, si la hubo (los 48 últimos, en su memoria).

- 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.

Version 0.2.15 · 2026-10-09 · Release on GitHub ↗

Versión de prueba (sin probar con una Webasto real).

  • Actualizaciones automáticas (Configuración, en la web de la placa y en la app): «No buscar», «Buscar y avisar» (por defecto) o «Buscar e instalar sola». Con la placa unida a una red con internet, busca a los 2 minutos de arrancar y luego una vez al día. Si hay versión nueva, la web y la app lo avisan con un botón para actualizar (y Telegram, si está configurado); con «instalar sola» se instala sin preguntar, nunca calentando ni con el termostato en marcha. Antes solo buscaba con Telegram configurado, y solo avisaba por ahí.
  • «Más tarde» aparca el aviso, no lo descarta: el de firmware nuevo vuelve a salir cuando la placa se reinicia (o al volver a abrir la app), y el de app nueva, la próxima vez que se abre la app.

Version 0.2.14 · 2026-10-09 · Release on GitHub ↗

Versión de prueba (sin probar con una Webasto real).

  • La Wi-Fi de la placa viene siempre encendida por defecto (antes, solo mientras calentaba y 10 minutos después): la web de la placa y 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.

Version 0.2.13 · 2026-10-09 · Release on GitHub ↗

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).

  • «Buscar actualizaciones» ya no se queda sin memoria: la tarea que busca y descarga no liberaba su conexión segura al terminar (unos 40 KB por búsqueda); tras un par de intentos la descarga fallaba con «Error al grabar la actualización» y luego ni empezaba.
  • Se usa la PSRAM de la placa (8 MB en la N16R8, «OPI PSRAM» al compilar): más margen para las conexiones seguras con Bluetooth y Wi-Fi a la vez.
  • Los errores al buscar o grabar dicen cuánto se ha descargado y cuánta memoria queda.
  • Las actualizaciones se descargan de wttc.favala.es (copia exacta de la Release, firmada igual) en vez de directamente de GitHub, cuyas descargas redirigen a otro servidor. Esto ya vale también para las placas con versiones anteriores.
  • En la web pública, la actualización (.ota) se puede descargar desde «Descargas», para subirla a mano desde la web de la placa.
  • App en pantallas anchas (tablets, radios de coche, televisores como el Fire TV): dos columnas, con el estado y el botón a la izquierda y los programas y la configuración a la derecha, en vez de una columna estrecha en el centro. Se recoloca al girar la pantalla.

Version 0.2.12 · 2026-10-07 · Release on GitHub ↗

Versión de prueba (sin probar con una Webasto real).

  • Buscar actualizaciones y Telegram con el portal cautivo: desde la 0.2.9 la placa, aun unida a la red, decía «no tiene internet». Mientras sale a internet, ahora deja un momento en pausa el servidor de nombres del portal.
  • Si aun así no llega al servidor, el error dice por qué: código, a qué dirección le lleva el nombre, qué servidor de nombres usa y cuál es su router.

Version 0.2.11 · 2026-10-07 · Release on GitHub ↗

Versión de prueba (sin probar con una Webasto real).

App

  • Avisa cuando hay una versión nueva de la app: al abrirla (una vez al día como mucho) mira cuál es la última y, si ya está publicada, enseña sus novedades con un botón para descargar el WTTC.apk, que se instala encima conservando el emparejamiento y los ajustes. «Más tarde» no vuelve a avisar de esa versión. En «Ajustes de la app» se puede buscar a mano o desactivar el aviso. Solo lee la versión en wttc.favala.es; no envía nada.

Version 0.2.10 · 2026-10-07 · Release on GitHub ↗

Versión de prueba (sin probar con una Webasto real).

  • La web de la placa funciona dentro de la ventanita del portal cautivo: los avisos y las preguntas («¿Actualizar ahora?», «Guardado», errores) salen ahora en un recuadro de la propia página. Esa ventanita (Android, iPhone) no muestra los del navegador, y botones como «Buscar actualizaciones» parecían no hacer nada.
  • Barra de progreso al actualizar, en la web de la placa (también al subir el fichero .ota) y en la app.
  • Si algo falla en la página, sale un aviso con el error en vez de quedarse callada.
  • «Buscar actualizaciones» avisa de que puede tardar hasta un minuto, y si la placa no consigue unirse a la red con internet lo dice enseguida y con el nombre de la red, en vez de esperar 40 segundos y decir «sin internet».

Version 0.2.9 · 2026-10-07 · Release on GitHub ↗

Versión de prueba (sin probar con una Webasto real).

  • Portal cautivo en la Wi-Fi de la placa: al conectarse a la red «WTTC», el móvil (Android, iPhone) o el ordenador abre solo la web de la placa, como en la Wi-Fi de un hotel; ya no hace falta escribir 192.168.4.1. Cualquier dirección que se escriba en esa red lleva también a la placa. En el iPhone, si se cierra esa ventana con «Cancelar» se desconecta de la red: hay que elegir «Usar sin internet».

Version 0.2.8 · 2026-10-07 · Release on GitHub ↗

Versión de prueba (sin probar con una Webasto real). La primera grabada en una placa real: el instalador desde el navegador funciona.

  • Buscar redes Wi-Fi al configurar la red con internet, en la web de la placa y en la app: la placa busca las cercanas y las enseña por orden de señal (con candado si llevan clave); al tocar una se rellena su nombre. Si la Wi-Fi estaba apagada por ahorro, la enciende unos minutos para buscar.

Version 0.2.7 · 2026-10-06 · Release on GitHub ↗

Versión de prueba (sin probar con una Webasto real). Cambio de licencia.

  • WTTC pasa a ser software libre con licencia GPL v3 o posterior (antes, MIT). Se puede usar, modificar y distribuir, pero quien distribuya una versión, modificada o no, tiene que hacerlo con la misma licencia y dar su código fuente: así el proyecto y sus derivados siguen siendo libres. Las versiones hasta la 0.2.6 siguen teniendo la licencia MIT con la que se publicaron.

Version 0.2.6 · 2026-10-06 · Release on GitHub ↗

Versión de prueba (sin probar con una Webasto real).

  • Termostato: el agua cuenta como caliente (mínimo de 5 min por encendido) desde 30 °C, no desde 50 °C. Con pausas largas (fuera templado) el agua bajaba de 50 °C entre ciclos, volvía el mínimo de 15 min y se pasaba del objetivo. En el simulador, «hasta 20 °C» durante 4 h queda entre 18 y 20 °C con cualquier temperatura de fuera (de −10 a 15 °C).

Version 0.2.5 · 2026-10-06 · Release on GitHub ↗

Versión de prueba (sin probar con una Webasto real).

  • Termostato más fino: el mínimo de 15 min por encendido queda solo para cuando arranca con el agua fría. Si el agua ya está caliente (50 °C o más, lo normal en los ciclos del termostato), el mínimo es de 5 min y apaga al llegar. Antes, con «hasta 25 °C», cada ciclo se pasaba hasta unos 27 °C; ahora se queda entre 23,5 y 25 °C y gasta menos.
  • Simulador: a velocidad ×10 o ×60 la pantalla ya no se apaga y enciende sola (la web del simulador consulta en tiempo real, no en tiempo simulado).

Version 0.2.4 · 2026-10-06 · Release on GitHub ↗

Versión de prueba (sin probar con una Webasto real).

  • El gasoil del mes y el total se mandan con dos decimales, como el del encendido: redondeados a uno, el total podía salir menor que el encendido (0,24 l frente a 0,2 l).
  • «Gasoil a cero» pone a cero también el encendido en marcha: antes, pulsado mientras calentaba, el gasoil de ese encendido podía salir mayor que el del mes y el total.

Version 0.2.3 · 2026-10-06 · Release on GitHub ↗

Versión de prueba (sin probar con una Webasto real).

  • Pantalla SSD1327 de 1,5" (128×128, 16 grises): por I2C con los mismos cuatro cables, con letras suavizadas (DejaVu Sans, generadas con 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.
  • Simulador: dibuja la SSD1327 en grises (la que lleva por defecto) igual que la placa.

Version 0.2.2 · 2026-10-06 · Release on GitHub ↗

Versión de prueba (sin probar con una Webasto real).

  • El botón BOOT enciende la pantalla un minuto en cualquier modo, también con la pantalla «apagada» en Configuración (que pasa a ser «solo con el botón»). Antes, en ese modo, no había forma de verla.
  • Simulador: avisa de que la pantalla está desactivada o de que se está detectando (la placa busca piezas nuevas cada 30 s).

Version 0.2.1 · 2026-10-06 · Release on GitHub ↗

Versión de prueba (sin probar con una Webasto real). Arreglo de la web de la placa.

Web de la placa

  • La lista de programas volvía a salir: desde la traducción a tres idiomas (0.1.x) no se dibujaba, y el estado salía como una sola letra («a» en vez de «Calentando»). La app no estaba afectada.
  • La fila de «Salgo a las» se ve entera en el móvil.
  • La compilación en GitHub prueba ahora la web de la placa en los tres idiomas antes de publicar nada.

Simulador (wttc.favala.es)

  • Pantalla OLED dibujada píxel a píxel como en la placa, LED de estado y botón BOOT.
  • Pantalla y termómetro se pueden conectar y quitar, y la temperatura de dentro se puede poner a mano.

Version 0.2.0 · 2026-10-06 · Release on GitHub ↗

Versión de prueba (sin probar con una Webasto real). Pantalla, termómetro y termostato. Solo ESP32-S3.

Placas

  • Solo ESP32-S3 (DevKitC-1 N16R8). El ESP32 clásico deja de estar soportado: el firmware ya no compila para él y no hay actualización para esa placa. La 0.1.6 sigue disponible para quien lo tenga.

Opcional: pantalla, termómetro y LED

  • Pantalla OLED I2C de 128×64 (1,3" SH1106 o 0,96" SSD1306): temperatura de dentro, estado, agua, batería y lo siguiente que va a pasar. Se enciende con la calefacción, con el móvil conectado o con el botón BOOT, y se apaga al minuto (o siempre encendida, o nunca).
  • Termómetro de dentro (SHT31 o AHT20, en el mismo bus que la pantalla): temperatura y humedad en la app, la web y la pantalla. Con corrección por si mide de más.
  • LED RGB de la placa con el estado: naranja calentando, verde ya caliente, rojo si la Webasto no responde o se apagó sola, azul con la app conectada. Brillo ajustable o apagado.
  • Todo se detecta solo; sin ello, la placa funciona igual que antes.

Calefacción

  • Calentar hasta una temperatura (solo con el termómetro; de 5 a 25 °C): se enciende, se apaga al llegar y vuelve a encender si se enfría, dentro de un tiempo máximo de hasta 4 h. Cada encendido dura como mínimo 15 min (las Webasto no llevan bien los arranques cortos). Si dentro no sube medio grado en 25 min y aún no llega (mucho frío fuera, termómetro mal puesto), se apaga y avisa en vez de gastar en balde.
  • Hora de salida: «salgo a las 8:00» y la placa decide cuánto antes encender según el frío que haga (de 15 min a 1 h). Suelta o como tipo de programa, con o sin temperatura objetivo.
  • Batería vigilada mientras calienta: si baja medio voltio por debajo de la mínima, se apaga para que luego arranque el motor.
  • Aviso de «ya está caliente» por Telegram cuando el agua llega a la temperatura elegida.

App

  • Temperatura y humedad de dentro, «Hasta X °C», «Salgo a las…» y las opciones nuevas de los programas (hora de salida, temperatura objetivo). Lo que depende de una pieza opcional solo aparece si la placa la tiene.
  • Acceso rápido: botón «Webasto» en los ajustes rápidos de Android y widget para la pantalla de inicio. Se conectan a la placa y encienden (con la duración elegida en la app) o apagan si ya está encendida.
  • Notificación de «ya está caliente» con la app abierta.

Version 0.1.6 · 2026-10-05 · Release on GitHub ↗

Versión de prueba (sin probar con una Webasto real). Primera que se puede instalar sin cable desde la 0.1.5.

Placas

  • ESP32-S3 (DevKitC-1 N16R8, 16 MB) como placa de referencia; el ESP32 DevKitC sigue valiendo. Cada una tiene su propio programa y su propia actualización sin cable; la placa descarga la suya.
  • Con los núcleos 3.x, el Bluetooth del ESP32-S3 usa la pila NimBLE: emparejar, contar y borrar emparejamientos funciona igual.

Instalación

  • Instalar desde el navegador (wttc.favala.es/instalar.php): con Chrome o Edge, pinchar la placa por USB y pulsar «Instalar». Sin Arduino IDE. Reinstalar así no borra la configuración ni el PIN.
  • Las Releases llevan ya la actualización firmada de cada placa (.ota) y el paquete para instalar desde el navegador.

Version 0.1.5 · 2026-10-05 · Release on GitHub ↗

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.

Firmware

  • Buscar actualizaciones: con la placa unida a una red con internet, busca la versión nueva, enseña sus novedades y, si se acepta, la descarga, la instala y se reinicia sola.
  • También se puede subir el fichero .ota de una Release desde la web de la placa (Configuración → Actualizar firmware).
  • Las actualizaciones van firmadas: solo se instalan las oficiales, nunca una versión más antigua ni mientras calienta. Si la nueva no aguanta un minuto funcionando, la placa vuelve sola a la anterior.
  • Con Telegram configurado, avisa una vez al día como mucho cuando hay versión nueva, con sus novedades.
  • Tabla de particiones propia (partitions.csv, Arduino la usa sola). La configuración y el PIN no se pierden al cambiarla.

App Android

  • Buscar actualizaciones en Configuración: consulta la última versión, enseña las novedades y la placa hace el resto.

Version 0.1.4 · 2026-10-05 · Release on GitHub ↗

Versión de prueba (sin probar con una Webasto real). Mejoras de seguridad.

Firmware

  • Primer uso: mientras la Wi-Fi de la placa tenga la clave de fábrica (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.
  • La web de la placa rechaza órdenes enviadas desde otras webs abiertas en el móvil.
  • Los avisos de Telegram comprueban el certificado del servidor: en una red ajena nadie puede hacerse pasar por Telegram y leer el token del bot.

App Android

  • Si la placa sigue con la clave de fábrica de la Wi-Fi, la app la pide al conectar.
  • La duración de cada programa ya no sale cortada.

Version 0.1.3 · 2026-10-05 · Release on GitHub ↗

Versión de prueba (sin probar con una Webasto real).

Idiomas

  • Firmware: habla español, inglés o alemán en el registro, los avisos de Telegram, los mensajes y su web. Se elige en Configuración; la app le pone el del móvil al conectar. La consola serie sigue en español.
  • App Android: en inglés, español y alemán según el idioma del móvil (inglés si no es ninguno de los tres). En Android 13 o posterior se puede elegir en los ajustes de la app. Los números van con la coma o el punto de ese idioma.
  • Web: wttc.favala.es también en inglés (/en/) y alemán (/de/), simulador incluido.

Version 0.1.2 · 2026-10-04 · Release on GitHub ↗

Versión de prueba (sin probar con una Webasto real).

App Android

  • Bluetooth: una respuesta de la placa que llega tarde ya no da por terminada la orden siguiente.
  • Bluetooth: buscar placas dos veces seguidas ya no corta la segunda búsqueda antes de tiempo.
  • Estadísticas: ya no se pierden los contadores sumados mientras se envía el informe del día.

Version 0.1.1 · 2026-10-04 · Release on GitHub ↗

Versión de prueba (sin probar con una Webasto real).

App Android

  • Modo demostración: ahora carga los programas y la configuración de ejemplo.
  • Los números salen siempre con coma decimal, aunque el móvil esté en otro idioma.

Version 0.1.0 · 2026-10-04 · Release on GitHub ↗

Primera versión pública como WTTC. Versión de prueba: aún sin probar con una Webasto real.

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»).
  • Modo demostración («Probar sin placa»): una placa simulada dentro de la app, para probarla sin nada montado.

Web y proyecto

  • Web pública https://wttc.favala.es: simulador del firmware, esquema de montaje, guías de instalación (Arduino IDE y

arduino-cli en Linux y Windows) y de uso (móvil Android, iPhone y radio de coche), descargas y versiones.

  • Estadísticas públicas y agregadas en https://wttc.favala.es/estadisticas.php (sin IP).
  • Compilación automática del firmware y de la app en GitHub Actions, Releases firmadas y capturas del README.
  • Todo el código y el contenido están generados íntegramente con Claude (Anthropic) y van comentados en abundancia.

Version 0.0.1 · 2026-09-30

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

Every firmware change is compiled automatically on GitHub with the ESP32 core 3.3.12, and the app is published in Releases. Test version (0.x): it has not been tried on a real Webasto yet. 1.0 will come when someone has tried it installed; if you build it, tell us how it went by opening an issue on GitHub.

Hardware used

PartModel usedWhat for
Vehicle and heaterVW 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 timerWhat is controlled. The ESP32 replaces the timer and plugs into its connector
MicrocontrollerESP32-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 supportedWi-Fi, web page, schedules, notifications and the W-Bus protocol on its UART2 (IO16/IO17)
W-Bus transceiverUART ↔ 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: display1.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 0x3DInside temperature, status, coolant, battery and what happens next. The type is chosen in Settings
Optional: thermometerSHT31 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” buttonAny push button (normally open), between IO7 and GNDSwitch 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 supplyLM2596 step-down regulator (module with potentiometer), set to 5.0 VTakes the ESP32's 5 V from the connector's permanent +12 V
WiringFemale dupont wires for the ESP32, 0.5 mm² wire for the 12 V side, splices or terminal blocks and tape or heat-shrinkConnections as per the diagram and the wire list above
ToolsMultimeter, 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
Optional: a switch on the ESP32's +12 V if the vehicle will stand still for weeks (see “Power consumption” below) and a 1 A slow-blow inline fuse. The +12 V of the control connector is permanent (with the ignition off), which is what is needed; its factory fuse varies (Webasto kits usually have a small one, often 1 A; on a factory-fitted T5 it comes from the vehicle fuse box and depends on the year), so fit the 1 A one even if there is a bigger one already: it protects the board's thin wires. The board draws about 0.1–0.2 A at 12 V (a little more in short bursts when transmitting); the W-Bus only carries data. You do not need VCDS to use it, but it is handy to read and clear faults on module 18 (auxiliary heater).

Flashing the firmware: what you need

  • The easiest way: install it from the browser (Chrome or Edge, one click, none of what follows). What is below is for doing it with Arduino IDE.
  • Arduino IDE 2 (the easiest) or arduino-cli (terminal only).
  • The Espressif ESP32 core (“esp32 by Espressif Systems”), version 2.x or 3.x. The IDE downloads it itself: several hundred MB.
  • Board ESP32S3 Dev Module with the partition scheme Huge APP (3MB No OTA/1MB SPIFFS): with Bluetooth and Wi-Fi the program does not fit in the default partition.
  • A USB data cable: many charging cables carry no data and the PC does not see the board.
  • USB-serial driver: the ESP32-S3 has two USB ports; use the one marked UART or COM, which has a CH343 or CP2102 (the other is the chip's own USB). On Linux it works without installing anything; on Windows 10/11 it usually installs itself and, if no COM port shows up, install Silicon Labs' “CP210x VCP driver”.
  • No extra libraries: Bluetooth, Wi-Fi, web server and Preferences come with the ESP32 core.

With Arduino IDE 2 (Linux and Windows)

  1. Install the IDE from arduino.cc/en/software. On Windows use the .exe installer or winget install ArduinoSA.IDE.stable; on Linux, the AppImage (make it executable).
  2. File → Preferences → “Additional boards manager URLs”, add:
    https://espressif.github.io/arduino-esp32/package_esp32_index.json
  3. Tools → Board → Boards Manager, search for “esp32” and install esp32 by Espressif Systems, version 3.x (2.x no longer works: if you have it, update it right there).
  4. Unzip the archive: you get the folder WTTC/ with WTTC.ino and web.h (the IDE requires the folder to be named like the .ino). Open WTTC.ino.
  5. Tools → Board → esp32 → ESP32S3 Dev Module and Flash Size → 16MB; PSRAM → OPI PSRAM; Tools → Partition Scheme → Huge APP (3MB No OTA/1MB SPIFFS) (only for the size limit: the 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).
  6. Press Upload (the arrow). If it hangs at “Connecting……”, hold the board's BOOT button until it starts writing.
  7. Tools → Serial Monitor at 115200 baud: it shows a summary with the version, the Bluetooth PIN, the board's Wi-Fi and its password, and the web user and password (write them down; info shows it again). Type status for the first test.

With arduino-cli on 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

# 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
If you get “Permission denied” on /dev/ttyUSB0: sudo usermod -aG dialout $USER and log out. On Ubuntu, if the port appears and disappears, uninstall brltty.

With arduino-cli on 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

# 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
Replace 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.

How to use it

📱 Android phone or tablet (app, over Bluetooth)

  1. Download WTTC.apk on the phone and open it. Android will ask for permission to “install unknown apps” from the browser: allow it for this installation.
  2. Open WTTC and accept the nearby devices (Bluetooth) and notifications permissions.
  3. Tap Find board, choose your WTTC and enter its 6-digit PIN (shown on the serial monitor at boot and on the board's web page, Settings section).
  4. Done: from then on the app connects by itself when the board is in range (10–20 m through the bodywork) and sets its clock.
  5. If the heater switches itself off while the app is open, Android shows a notification with the reason and its fault codes.
  6. No board yet? Try without a board opens demo mode: a simulated board to see how the app works.
  7. Updating the firmware: Settings → Check for updates. If there is a new version, it shows what's new and, if you accept, the board downloads it, installs it and restarts by itself (it must be joined to a network with internet). With Telegram set up, the board also tells you when one comes out.

🍏 iPhone (web page, over Wi-Fi)

  1. There is no iPhone app: you use the board's web page, the same one you see in the simulator.
  2. Settings → Wi-Fi → network WTTC (factory password 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.
  3. Share → Add to Home Screen: it behaves like any other app.
  4. To have the board's network available when you need it, set the Wi-Fi to “Always on” or “Only while heating” (see power consumption). In “Only on request” it is only there for 10 minutes after booting.
  5. If you set the board to join the iPhone's hotspot, it also answers at http://wttc.local without changing networks.
  6. To update: Settings → Check for updates (with the board joined to a network with internet), or upload the .ota file of the latest version from that same section.

🚐 The vehicle's Android radio

  1. First check that its Bluetooth works for apps: install nRF Connect (Play Store, free) on the radio and tap Scan. If BLE devices show up, the WTTC app will work.
  2. Install the APK: download it from the radio's browser or copy it to a USB stick and open it with its file manager.
  3. Pair as on the phone. The screen adapts to the radio (centred column, large buttons).
  4. If nRF Connect sees nothing, the radio's Bluetooth is a separate module, only for calls and music. Use the web page: connect the radio to the WTTC Wi-Fi network and open http://192.168.4.1. Meanwhile the radio will have no internet over Wi-Fi.

Power consumption and Wi-Fi modes

Mode (Settings)When the Wi-Fi is onApprox. 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 requestWhen you ask for it from the app (15 min) and a few minutes to send notifications≈ 15–25 mA
Estimated figures at 12 V, LM2596 included; measure yours with a multimeter in series. In every mode the Wi-Fi is on for 10 minutes after booting, as a fallback if your phone is not paired. The processor runs at 80 MHz to use less power.

Telegram notifications (optional)

  1. In Telegram, talk to @BotFather, send /newbot and follow the steps: it gives you your bot's token.
  2. Open the chat with your new bot and tap Start (otherwise the bot cannot write to you).
  3. Your chat ID: write something to your bot and open https://api.telegram.org/bot<TOKEN>/getUpdates; it is the number in "chat":{"id":…}.
  4. In the app or the board's web page → Settings: token, chat ID and a network with internet (for example, the phone's hotspot). Save and tap Test Telegram.
  5. It notifies when switching on, when switching off, if it switches itself off (with its faults), if it stops answering and if a schedule does not start because of a low battery.

Security

Frames used by the firmware

ActionFrameWebasto's answer
Frame with checksum
—

What is simulated

  • Diesel: estimated from the power reported by the Webasto (≈ 0.62 l/h at 5 kW, according to its data sheet); the board keeps the current run, the last one, the month and the total. It is an estimate (±20%), not a tank measurement.
  • Not simulated: Bluetooth (the Android app) and switching the Wi-Fi off to save power: here the phone's web page always reaches the board.
  • True to the code: the web page, the API and the console are the firmware's: retries, echo, wake-up pulse after 10 s of silence, keep-alive every 5 s, sensors every 8 s, schedules, battery cut-off < 12.0 V and a clock that is lost on restart.
  • True to the protocol: frame format and the answers for sensors (0x50/05) and faults (0x56/01) according to libwbus.
  • Approximate: the start-up and after-run times, the regulation thresholds (full load up to 75 °C, part load up to 85 °C, resumes at 70 °C), how the circuit warms up, and that the Webasto switches off after 20 s without keep-alive (libwbus figure, not checked on yours).
  • Real state: the firmware looks at the keep-alive answer (01 = the Webasto no longer has the command) and at the flame: “Starting”, “Heating”, “Paused” (no flame with the coolant at ≥ 65 °C) or “No answer”. If it switches itself off (try “no diesel”), the web page says so with its faults and it notifies over Telegram. That the Thermo Top C answers 01 to the keep-alive comes from libwbus: if yours does not, the flame remains as a fallback (5 min without flame with cold coolant).

Disclaimer of liability

WTTC · free software (GPL v3) on GitHub · code and content generated entirely with Claude (Anthropic) · personal project unrelated to Webasto or Volkswagen.