points.json gains DID 881/882 (MixerTwo/ThreeCircuitCentralHeatingCurve) and 988/989 (flow temperature target setpoints), 124 UDS points. The device runs the fork build 0.3.0+ea30668, which marks 880-883 writable; README names the fork and the build steps. S28-55. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
vitocal-can
Waveshare ESP32-S3-RS485-CAN running open3e-esp32 from the fork
konairius/open3e-esp32, branch feat/heating-curve-rw (0.3.0+ea30668: upstream
0.3.0 with the heating curves 880-883 writable, S28-55), on Vitocal 250-A socket A
(Klemme 1 = CAN L, Klemme 3 = CAN H, no GND/shield, jumper H1 = NC).
Replaces the heating-can stack on edge-1. YouTrack S28-28.
- mDNS:
vitocal-can.local - DNS (DHCP):
open3e.iot.renner.uno. The firmware sends its compiled-inCONFIG_LWIP_LOCAL_HOSTNAME.
Files
settings.json: apply withPUT /api/settings. No password: the MQTT password is pushed by mqtt-account-controller.points.json: apply withPUT /api/points. 124 UDS datapoints (30 s, fixed topics matching the Home Assistant packages), including the 29 One Base ZigBee slots on 0x6c3 (topicsonebase_<DID:04d>_<didName>), and 7 E380 frames (10 s). Compact JSON with default fields omitted: the API takes request bodies of at most 16384 bytes (MAX_BODY).
One Base ZigBee slots (ECU 0x6c3)
The 29 slots need a firmware with open3e-esp32 PR #20 (codec trees in PSRAM,
merged 2026-11-09, first in 0.2.0+2d9002b; S28-52). Without it a compiled
codec stays in internal RAM for each polled point (allocations < 16 KiB are
internal, CONFIG_SPIRAM_MALLOC_ALWAYSINTERNAL), one slot costs ~8 KB, and 29
slots exhausted internal RAM (internalMin 16 B, crash in task wifi). Do
not load this points.json on an older firmware.
Home Assistant reads health from /api/status and /api/sysinfo (REST
sensors in packages/open3e.yaml).
Measured internal heap (/api/sysinfo, free / min in bytes):
| Loaded | free | min |
|---|---|---|
| 0 points | 161,923 | |
| 46 Vitocal | 115,163 | 73,040 |
| + 29 VX3 | 114,067 | 49,228 |
| + 16 VCMU + 7 E380 | 108,315 | 40,064 |
| + 1 ZigBee slot | 100,295 | 39,828 |
The hostname is part of the Wi-Fi settings: POST /api/wifi
{"ssid":"Renner IoT","hostname":"vitocal-can"}. An omitted pass keeps the
stored one.
Firmware update
Build: in the fork checkout, docker run --rm -v $PWD:/src -w /src espressif/idf:v6.1 with make setup db fixtures test, make storage, then
idf.py set-target esp32s3 build (the last step packs build/storage.bin
from storage_image/, so it must come after make storage).
POST /api/otawithopen3e-gateway.bin.- Wait for
pendingVerify: falsein/api/status(60 s). POST /api/storagewithstorage.bin. This wipespoints.json, so applypoints.jsonagain afterwards.
Only one UDS client on the bus: never load points.json while heating-can
on edge-1 is running.