diff --git a/open3e/vitocal-can/README.md b/open3e/vitocal-can/README.md new file mode 100644 index 00000000..7e2cedcd --- /dev/null +++ b/open3e/vitocal-can/README.md @@ -0,0 +1,56 @@ +# vitocal-can + +Waveshare ESP32-S3-RS485-CAN running unmodified boonkerz/open3e-esp32 +(upstream CI artifact `site-dev`), 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`. 120 UDS datapoints (30 s, + fixed topics matching the Home Assistant packages), including the 29 One + Base ZigBee slots on 0x6c3 (topics `onebase__`), 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 + +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. diff --git a/open3e/vitocal-can/points.json b/open3e/vitocal-can/points.json new file mode 100644 index 00000000..2d6d57ea --- /dev/null +++ b/open3e/vitocal-can/points.json @@ -0,0 +1 @@ +[{"ecu":1664,"did":259,"interval":30,"topic":"vitocal_0259_InfoDtcList"},{"ecu":1664,"did":260,"interval":30,"topic":"vitocal_0260_InfoDtcHistory"},{"ecu":1664,"did":268,"interval":30,"topic":"vitocal_0268_FlowTemperatureSensor"},{"ecu":1664,"did":269,"interval":30,"topic":"vitocal_0269_ReturnTemperatureSensor"},{"ecu":1664,"did":271,"interval":30,"topic":"vitocal_0271_DomesticHotWaterSensor"},{"ecu":1664,"did":274,"interval":30,"topic":"vitocal_0274_OutsideTemperatureSensor"},{"ecu":1664,"did":286,"interval":30,"topic":"vitocal_0286_MixerTwoCircuitFlowTemperatureSensor"},{"ecu":1664,"did":288,"interval":30,"topic":"vitocal_0288_MixerThreeCircuitFlowTemperatureSensor"},{"ecu":1664,"did":318,"interval":30,"topic":"vitocal_0318_WaterPressureSensor"},{"ecu":1664,"did":321,"interval":30,"topic":"vitocal_0321_CompressorInletTemperatureSensor"},{"ecu":1664,"did":324,"interval":30,"topic":"vitocal_0324_CompressorOutletTemperatureSensor"},{"ecu":1664,"did":335,"interval":30,"topic":"vitocal_0335_MixerTwoCircuitRoomTemperatureSensor"},{"ecu":1664,"did":336,"interval":30,"topic":"vitocal_0336_MixerThreeCircuitRoomTemperatureSensor"},{"ecu":1664,"did":396,"interval":30,"topic":"vitocal_0396_DomesticHotWaterTemperatureSetpoint"},{"ecu":1664,"did":402,"interval":30,"topic":"vitocal_0402_MixerTwoCircuitPump"},{"ecu":1664,"did":403,"interval":30,"topic":"vitocal_0403_MixerThreeCircuitPump"},{"ecu":1664,"did":476,"interval":30,"topic":"vitocal_0476_MixerTwoCircuitThreeWayValvePositionPercent"},{"ecu":1664,"did":477,"interval":30,"topic":"vitocal_0477_MixerThreeCircuitThreeWayValvePositionPercent"},{"ecu":1664,"did":543,"interval":30,"topic":"vitocal_0543_SmartGridReadyConsolidator"},{"ecu":1664,"did":548,"interval":30,"topic":"vitocal_0548_EnergyConsumptionCentralHeating"},{"ecu":1664,"did":565,"interval":30,"topic":"vitocal_0565_EnergyConsumptionDomesticHotWater"},{"ecu":1664,"did":1007,"interval":30,"topic":"vitocal_1007_CurrentQuickMode"},{"ecu":1664,"did":1043,"interval":30,"topic":"vitocal_1043_AllengraSensor"},{"ecu":1664,"did":1190,"interval":30,"topic":"vitocal_1190_ThermalPower"},{"ecu":1664,"did":1211,"interval":30,"topic":"vitocal_1211_GeneratedCentralHeatingOutput"},{"ecu":1664,"did":1391,"interval":30,"topic":"vitocal_1391_GeneratedDomesticHotWaterOutput"},{"ecu":1664,"did":1416,"interval":30,"topic":"vitocal_1416_MixerTwoCircuitOperationState"},{"ecu":1664,"did":1417,"interval":30,"topic":"vitocal_1417_MixerThreeCircuitOperationState"},{"ecu":1664,"did":2320,"interval":30,"topic":"vitocal_2320_DomesticHotWaterStatus"},{"ecu":1664,"did":2346,"interval":30,"topic":"vitocal_2346_CompressorSpeedPercent"},{"ecu":1664,"did":2350,"interval":30,"topic":"vitocal_2350_EnergyManagmentSystemResultingControlState"},{"ecu":1664,"did":2351,"interval":30,"topic":"vitocal_2351_HeatPumpCompressor"},{"ecu":1664,"did":2352,"interval":30,"topic":"vitocal_2352_AdditionalElectricHeater"},{"ecu":1664,"did":2369,"interval":30,"topic":"vitocal_2369_HeatPumpCompressorStatistical"},{"ecu":1664,"did":2370,"interval":30,"topic":"vitocal_2370_AdditionalElectricHeaterStatistical"},{"ecu":1664,"did":2486,"interval":30,"topic":"vitocal_2486_CurrentElectricalPowerConsumptionRefrigerantCircuit"},{"ecu":1664,"did":2487,"interval":30,"topic":"vitocal_2487_CurrentElectricalPowerConsumptionElectricHeater"},{"ecu":1664,"did":2488,"interval":30,"topic":"vitocal_2488_CurrentElectricalPowerConsumptionSystem"},{"ecu":1664,"did":2543,"interval":30,"topic":"vitocal_2543_SmartGridTemperatureOffsets"},{"ecu":1664,"did":2560,"interval":30,"topic":"vitocal_2560_SmartGridFeatureSelection"},{"ecu":1664,"did":2622,"interval":30,"topic":"vitocal_2622_SeasonalCoefficientOfPerformanceHeating"},{"ecu":1664,"did":2624,"interval":30,"topic":"vitocal_2624_SeasonalCoefficientOfPerformanceDomesticHotWater"},{"ecu":1664,"did":2625,"interval":30,"topic":"vitocal_2625_SeasonalCoefficientOfPerformanceHeatingAndDomesticHotWater"},{"ecu":1664,"did":2735,"interval":30,"topic":"vitocal_2735_FourThreeWayValveValveCurrentPosition"},{"ecu":1664,"did":3016,"interval":30,"topic":"vitocal_3016_HeatingBufferTemperatureSensor"},{"ecu":1697,"did":266,"interval":30,"topic":"vx3_0266_ErrorDtcHistory"},{"ecu":1697,"did":378,"interval":30,"topic":"vx3_0378_PointOfCommonCouplingPhaseOne"},{"ecu":1697,"did":379,"interval":30,"topic":"vx3_0379_PointOfCommonCouplingPhaseTwo"},{"ecu":1697,"did":380,"interval":30,"topic":"vx3_0380_PointOfCommonCouplingPhaseThree"},{"ecu":1697,"did":535,"interval":30,"topic":"vx3_0535_ObjectElectricalEnergyStatistical"},{"ecu":1697,"did":1603,"interval":30,"topic":"vx3_1603_PointOfCommonCouplingPower"},{"ecu":1697,"did":1664,"interval":30,"topic":"vx3_1664_ElectricalEnergyStorageStateOfCharge"},{"ecu":1697,"did":1690,"interval":30,"topic":"vx3_1690_ElectricalEnergySystemPhotovoltaicStatus"},{"ecu":1697,"did":1801,"interval":30,"topic":"vx3_1801_ElectricalEnergyStorageEnergyTransferStatistic"},{"ecu":1697,"did":1802,"interval":30,"topic":"vx3_1802_EnergyProductionPhotovoltaic"},{"ecu":1697,"did":1810,"interval":30,"topic":"vx3_1810_ElectricalEnergyInverterPowerAc"},{"ecu":1697,"did":1828,"interval":30,"topic":"vx3_1828_InverterElectricalEnergyStorageCurrentMaximumlChargePower"},{"ecu":1697,"did":1830,"interval":30,"topic":"vx3_1830_InverterElectricalEnergyStorageCurrentMaximumlDishargePower"},{"ecu":1697,"did":1577,"interval":30,"topic":"vx3_1577_ElectricalEnergyStorageModuleOneOperatingData"},{"ecu":1697,"did":1578,"interval":30,"topic":"vx3_1578_ElectricalEnergyStorageModuleTwoOperatingData"},{"ecu":1697,"did":1579,"interval":30,"topic":"vx3_1579_ElectricalEnergyStorageModuleThreeOperatingData"},{"ecu":1697,"did":1580,"interval":30,"topic":"vx3_1580_ElectricalEnergyStorageModuleFourOperatingData"},{"ecu":1697,"did":1581,"interval":30,"topic":"vx3_1581_ElectricalEnergyStorageModuleFiveOperatingData"},{"ecu":1697,"did":1582,"interval":30,"topic":"vx3_1582_ElectricalEnergyStorageModuleSixOperatingData"},{"ecu":1697,"did":1834,"interval":30,"topic":"vx3_1834_ElectricalEnergyStorageStateOfEnergy"},{"ecu":1697,"did":1836,"interval":30,"topic":"vx3_1836_ElectricalEnergyStorageCurrentPower"},{"ecu":1697,"did":2214,"interval":30,"topic":"vx3_2214_BackupBoxConfiguration"},{"ecu":1697,"did":2240,"interval":30,"topic":"vx3_2240_BatteryTemperatureSensor"},{"ecu":1697,"did":3085,"interval":30,"topic":"vx3_3085_ElectricalEnergyStorageModuleOneInformation"},{"ecu":1697,"did":3086,"interval":30,"topic":"vx3_3086_ElectricalEnergyStorageModuleTwoInformation"},{"ecu":1697,"did":3087,"interval":30,"topic":"vx3_3087_ElectricalEnergyStorageModuleThreeInformation"},{"ecu":1697,"did":3088,"interval":30,"topic":"vx3_3088_ElectricalEnergyStorageModuleFourInformation"},{"ecu":1697,"did":3089,"interval":30,"topic":"vx3_3089_ElectricalEnergyStorageModuleFiveInformation"},{"ecu":1697,"did":3090,"interval":30,"topic":"vx3_3090_ElectricalEnergyStorageModuleSixInformation"},{"ecu":1676,"did":320,"interval":30,"topic":"vcmu_0320_PrimaryHeatExchangerLiquidTemperatureSensor"},{"ecu":1676,"did":322,"interval":30,"topic":"vcmu_0322_CompressorInletPressureSensor"},{"ecu":1676,"did":325,"interval":30,"topic":"vcmu_0325_CompressorOutletPressureSensor"},{"ecu":1676,"did":355,"interval":30,"topic":"vcmu_0355_SecondaryHeatExchangerLiquidTemperatureSensor"},{"ecu":1676,"did":389,"interval":30,"topic":"vcmu_0389_ElectronicExpansionValveOneCurrentPositionPercent"},{"ecu":1676,"did":391,"interval":30,"topic":"vcmu_0391_ElectronicExpansionValveTwoCurrentPositionPercent"},{"ecu":1676,"did":1772,"interval":30,"topic":"vcmu_1772_CompressorOilTemperatureSensor"},{"ecu":1676,"did":1773,"interval":30,"topic":"vcmu_1773_RefrigerantCircuitFourWayValve"},{"ecu":1676,"did":1775,"interval":30,"topic":"vcmu_1775_PrimaryCircuitFanOne"},{"ecu":1676,"did":1776,"interval":30,"topic":"vcmu_1776_PrimaryCircuitFanTwo"},{"ecu":1676,"did":2256,"interval":30,"topic":"vcmu_2256_DesiredThermalEnergyDefrost"},{"ecu":1676,"did":2259,"interval":30,"topic":"vcmu_2259_RefrigerationCircuitStatus"},{"ecu":1676,"did":2333,"interval":30,"topic":"vcmu_2333_EconomizerLiquidTemperatureSensor"},{"ecu":1676,"did":2334,"interval":30,"topic":"vcmu_2334_EvaporatorVaporTemperatureSensor"},{"ecu":1676,"did":2569,"interval":30,"topic":"vcmu_2569_CompressorSpeedRps"},{"ecu":1676,"did":2571,"interval":30,"topic":"vcmu_2571_CompressorSuctionSuperheat"},{"ecu":1664,"did":2791,"interval":30,"topic":"vitocal_2791_CentralHeatingPumpStatus"},{"type":"em380","canId":592,"enabled":true,"interval":10,"topic":"e380_0592_GridActivePower"},{"type":"em380","canId":594,"enabled":true,"interval":10,"topic":"e380_0594_GridReactivePower"},{"type":"em380","canId":596,"enabled":true,"interval":10,"topic":"e380_0596_GridCurrent"},{"type":"em380","canId":598,"enabled":true,"interval":10,"topic":"e380_0598_GridVoltage"},{"type":"em380","canId":600,"enabled":true,"interval":10,"topic":"e380_0600_GridEnergy"},{"type":"em380","canId":602,"enabled":true,"interval":10,"topic":"e380_0602_GridPower"},{"type":"em380","canId":604,"enabled":true,"interval":10,"topic":"e380_0604_GridEnergy"},{"ecu":1731,"did":2086,"interval":30,"topic":"onebase_2086_ZigBeeOneDeviceCurrentValues"},{"ecu":1731,"did":2089,"interval":30,"topic":"onebase_2089_ZigBeeTwoDeviceCurrentValues"},{"ecu":1731,"did":2092,"interval":30,"topic":"onebase_2092_ZigBeeThreeDeviceCurrentValues"},{"ecu":1731,"did":2095,"interval":30,"topic":"onebase_2095_ZigBeeFourDeviceCurrentValues"},{"ecu":1731,"did":2098,"interval":30,"topic":"onebase_2098_ZigBeeFiveDeviceCurrentValues"},{"ecu":1731,"did":2101,"interval":30,"topic":"onebase_2101_ZigBeeSixDeviceCurrentValues"},{"ecu":1731,"did":2104,"interval":30,"topic":"onebase_2104_ZigBeeSevenDeviceCurrentValues"},{"ecu":1731,"did":2107,"interval":30,"topic":"onebase_2107_ZigBeeEightDeviceCurrentValues"},{"ecu":1731,"did":2110,"interval":30,"topic":"onebase_2110_ZigBeeNineDeviceCurrentValues"},{"ecu":1731,"did":2113,"interval":30,"topic":"onebase_2113_ZigBeeTenDeviceCurrentValues"},{"ecu":1731,"did":2116,"interval":30,"topic":"onebase_2116_ZigBeeElevenDeviceCurrentValues"},{"ecu":1731,"did":2119,"interval":30,"topic":"onebase_2119_ZigBeeTwelveDeviceCurrentValues"},{"ecu":1731,"did":2122,"interval":30,"topic":"onebase_2122_ZigBeeThirteenDeviceCurrentValues"},{"ecu":1731,"did":2125,"interval":30,"topic":"onebase_2125_ZigBeeFourteenDeviceCurrentValues"},{"ecu":1731,"did":2128,"interval":30,"topic":"onebase_2128_ZigBeeFifteenDeviceCurrentValues"},{"ecu":1731,"did":2131,"interval":30,"topic":"onebase_2131_ZigBeeSixteenDeviceCurrentValues"},{"ecu":1731,"did":2134,"interval":30,"topic":"onebase_2134_ZigBeeSeventeenDeviceCurrentValues"},{"ecu":1731,"did":2137,"interval":30,"topic":"onebase_2137_ZigBeeEighteenDeviceCurrentValues"},{"ecu":1731,"did":2140,"interval":30,"topic":"onebase_2140_ZigBeeNineteenDeviceCurrentValues"},{"ecu":1731,"did":2143,"interval":30,"topic":"onebase_2143_ZigBeeTwentyDeviceCurrentValues"},{"ecu":1731,"did":2262,"interval":30,"topic":"onebase_2262_ZigBeeTwentyOneDeviceCurrentValues"},{"ecu":1731,"did":2265,"interval":30,"topic":"onebase_2265_ZigBeeTwentyTwoDeviceCurrentValues"},{"ecu":1731,"did":2268,"interval":30,"topic":"onebase_2268_ZigBeeTwentyThreeDeviceCurrentValues"},{"ecu":1731,"did":2271,"interval":30,"topic":"onebase_2271_ZigBeeTwentyFourDeviceCurrentValues"},{"ecu":1731,"did":2274,"interval":30,"topic":"onebase_2274_ZigBeeTwentyFiveDeviceCurrentValues"},{"ecu":1731,"did":2277,"interval":30,"topic":"onebase_2277_ZigBeeTwentySixDeviceCurrentValues"},{"ecu":1731,"did":2280,"interval":30,"topic":"onebase_2280_ZigBeeTwentySevenDeviceCurrentValues"},{"ecu":1731,"did":2283,"interval":30,"topic":"onebase_2283_ZigBeeTwentyEightDeviceCurrentValues"},{"ecu":1731,"did":2286,"interval":30,"topic":"onebase_2286_ZigBeeTwentyNineDeviceCurrentValues"}] diff --git a/open3e/vitocal-can/settings.json b/open3e/vitocal-can/settings.json new file mode 100644 index 00000000..789034df --- /dev/null +++ b/open3e/vitocal-can/settings.json @@ -0,0 +1,21 @@ +{ + "mqtt": { + "enabled": true, + "host": "mqtt.renner.uno", + "port": 1883, + "user": "vitocal-can", + "baseTopic": "open3e", + "format": "onebase_{didNumber:04d}_{didName}", + "cmndTopic": "open3e/cmnd", + "haDiscovery": false, + "haPrefix": "homeassistant" + }, + "system": { + "writeEnabled": true, + "rawWriteEnabled": false, + "em380Enabled": true, + "collectEnabled": false, + "rawCanIds": "", + "tz": "CET-1CEST,M3.5.0,M10.5.0/3" + } +}