Files
homelab/open3e/vitocal-can
claude-botandClaude Opus 5.5 3116f252c8
ci/woodpecker/pr/ci-scripts-test Pipeline was successful
feat(open3e): poll heating curves and flow setpoints of HK2/HK3
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>
2026-11-11 10:10:13 +01:00
..

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

Files

  • settings.json: apply with PUT /api/settings. No password: the MQTT password is pushed by mqtt-account-controller.
  • points.json: apply with PUT /api/points. 124 UDS datapoints (30 s, fixed topics matching the Home Assistant packages), including the 29 One Base ZigBee slots on 0x6c3 (topics onebase_<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).

  1. POST /api/ota with open3e-gateway.bin.
  2. Wait for pendingVerify: false in /api/status (60 s).
  3. POST /api/storage with storage.bin. This wipes points.json, so apply points.json again afterwards.

Only one UDS client on the bus: never load points.json while heating-can on edge-1 is running.