Changelog
Breaking Changes 🚨
- 15d06c8 Huawei SmartLogger: remove battery (BC) (#35658)
- 18da91b Huawei: move curtailment to separate devices (BC) (#32451)
- 6f05b23 Optimizer: leave home battery its planned charge when vehicle follows pv surplus (BC) (#35841)
- 8467e10 Volvo Connected: OAuth2 migration (BC) (#35845)
New Features 💫
- 31e8781 Add Mennekes Amtron 4Business 600 (Modbus TCP) (#35427)
- b08a93b Add Mennekes Amtron 4Business 600 (OCPP) (#35426)
- 40a0b15 Add OCI labels to Dockerfile (#35695)
- 63851ad Add Rheidon PC200 Pro (OCPP) (#35511)
- 9f0d5a4 Charger (FoxESS EVC): add mDNS discovery hint (#35891)
- 7a0dd41 Charger (Weidmüller): add MAC discovery hint (#35892)
- 7643087 Config UI: add nested device support (enables SG Ready relays, merged tariff) (#35407)
- 835225b Deye: add SUN-EVSE11K01/22K01 charger (#34202)
- a56206d EEBus: add Buderus and Bosch OHPCF heat pumps (#35936)
- 957a8e3 Energyflow: add "Others" row for unmetered home consumption (#35513)
- b51025e HEMS: add FNN template for Modbus I/O modules (#35580)
- 00bf334 HEMS: add FNN templates for Shelly i3 and i4 (#35842)
- f22b054 Home Assistant: add notification icon and color (#35332)
- e780fe7 HomeAssistant charger: add identify (#35572)
- 86acc79 Loadpoint: add energy counted after charge stop to session (#35559)
- 9404d82 Meter (FoxESS H3 Smart): add holdcharge battery mode (#35398)
- d75e4bc Optimizer: add socToWh helper (#35553)
- 38e1891 SAJ H2: add discovery hint (#35900)
- 943b17f SMA Hybrid: add battery charge energy (#35567)
- cf61975 Schrack i-CHARGE CION: add RFID identification (#35921)
- ad1ccf4 Sofar G3: add holdcharge battery mode (#35303)
- 6f3ae09 SofarSolar G3: add slave option to disable battery control (#35647)
- 7d274c7 Spotový Radar: add Slovakia (OKTE, EUR) (#35751)
- 40cc59c Tariff: add Localvolts (AU) (#35035)
- 5a78163 Tariffs: Add strømligning.dk tariff API template definition (#35767)
- 2a1ef94 Tariffs: add Primeo NetzDynamisch (#35883)
- 898c4f6 Tariffs: add Spotový Radar (CZ price forecast) (#35467)
- 12ce81c UI: add missing config.devices.extMeter translation (#35748)
Other Changes ☀️
- 7b0f3b7 ABL eMH: warn if charging release by group master is required (#35860)
- 96a578c AGENTS.md: template docs are generated by CI (#35882)
- d19524b Battery: warn if only one power limit is configured (#35675)
- 91fa61d CI PR labeler: restrict to existing labels (#35623)
- e1a5891 Cardata: keep newer stream data and age the REST refresh by message time (#35219)
- bb7be58 Cardata: read stream from local MQTT broker (optional) (#35211)
- ed48310 Cardata: use shared mqtt preset and stream source (#35233)
- 2294b9d Charging plan: lock strategy to cheapest while optimizer controls loadpoint (#35557)
- e56c5dc Circuit: reserve offered current for loadpoint during phase switch (#34847)
- 1c125cd CodeQL: align init and analyze action versions (#35674)
- 38ae402 Config UI: assign charging points and heaters to circuits inline (#35127)
- 0880587 Config/Energyflow: sort consumers alphabetically (#35433)
- 3aeb327 Config: require admin password for all script plugin sources (#35423)
- 12bdb04 DaheimLaden: accept raw-ASCII station id from replacement comm modules (#35440)
- 5498ea2 EEBus: support single-phase chargers and dynamic phase limits (#35133)
- b3f2bf5 EEBus: update spine-go and ship-go to current upstream dev (#35831)
- bcea759 EM2Go: integrate charge power for session energy (#35759)
- 8a4edf5 EU Data Act: prefer current battery_state_report.soc key for soc (#35293)
- 8e77086 EU Data Act: prefer current mileage.value key for odometer (#35294)
- e2656e3 EU Data Act: surface persistent update errors (#35186)
- 5b1b033 EU Data Act: template-defined soc key preference, Cupra prefers battery_level_HV (#35686)
- 4b61f45 EU Data Act: wait for Retry-After cooldown on rate limit (#35582)
- 77b3a5f Easee: reset stale session energy on plug-in (#35826)
- 223c48c EcoFlow Stream: detect leader among multiple serials (#35334)
- e7cb5ff Energy: keep hidden small flows in Sankey node totals (#35787)
- 23c4aae Energy: visual improvements, axis alignment (#35282)
- 8789a0e FoxESS H3-Pro/Smart: don't overwrite Off-Grid (EPS) min SoC (#35628)
- 2f371eb FoxESS H3: drop charge mode (#35937)
- 2b5cafe FoxESS H3: hold via max discharge current instead of remote active power (#35639)
- f8d768f Genesis EU: sign OneApp/CCI auth calls with X-Fingerprint (#35652)
- 927ed3c Heating: demand predictor selector in loadpoint settings (#34342)
- 9027d8a Hoymiles OpenDTU: support basic auth (#35739)
- 2f30291 Huawei EMMA: always use modbus id 0 (#35930)
- 7ef3f3a Huawei SUN2000 Inverter: reduce default timeout (#35687)
- 811d77b Huawei SmartLogger: always use modbus id 0 (#35939)
- 8d3b434 Issue agent: cc device contributors on device issues (#35849)
- 1dbf07a Kia/Hyundai EU: send current Android Chrome User-Agent on OneApp login (#35324)
- 9890c9f Kostal Piko MP Plus: cache measurements request (#35404)
- 2e68d8a LG ESS: don't report feed-in energy as grid import (#35926)
- 20bb178 Link docs in the UI language for all translated locales (#35596)
- b51e0fc Loadpoint: adopt charger phases while disabled (#35383)
- aa8fc88 Loadpoint: drop solar share grid allowance while battery discharges below prioritySoc (#35064)
- 75493e6 Loadpoint: estimate remaining charge for plan goal while plan slot is active (#35266)
- f49c757 Loadpoint: keep min current on a full circuit when measuring below the offer (#35245)
- 6e5fac6 Loadpoint: keep welcome charge when switching phases on connect (#35222)
- e6092b3 Loadpoint: refresh session energy on shutdown (#35591)
- 3939abf Loadpoint: reset SoC estimator for new sessions (#35764)
- a7200ca Loadpoint: switch phases of a disabled charger only when enabling (#35189)
- 70ff31c Loadpoint: switch phases with unknown phase state in circuit fast charging (#35361)
- 7e99742 Loadpoint: update immediately on charger status change (#35697)
- 84a06ff MQTT: bound startup cleanup duration (#35310)
- 5141256 MQTT: fail listen on refused subscription (#35235)
- f08d11e Meter (FoxESS H3): leave off-grid min SoC untouched (#35823)
- d741395 Meter (Huawei EMMA): document Modbus TCP requirements and battery control (#34182)
- 15792e6 Modbus: release shared connection for every registration (#35581)
- 519404a OCPP forwarder: read meterInterval under its mutex (#35555)
- 42f3125 OCPP forwarder: stop re-dial loop and back off on instant upstream drop (#34772)
- 6229dc7 OCPP forwarder: track idTag and transaction of relayed transactions (#35244)
- d63afec OCPP: fall back to key-based GetConfiguration on failure (#35207)
- e2f0762 OCPP: ignore zero energy register after non-zero total (#35853)
- 98ac23b OCPP: skip BootNotification wait when trigger is rejected (#35401)
- a0e76ee Onboarding: block tariff checklist items for legacy tariff configuration (#35265)
- 071e072 Onboarding: don't open wizard on partial state after restart (#35380)
- 5c0653b Onboarding: move skip to site step, password is mandatory (#35275)
- 682dc2b Optimizer: apply battery suggestion while a vehicle modelled as fixed demand charges (#35306)
- e224050 Optimizer: combine SoC projections into one chart (#35444)
- d003442 Optimizer: consider all vehicle plan goals within horizon (#35552)
- 2a17616 Optimizer: continue 100% soc plan while vehicle connected (#35854)
- 47a3d38 Optimizer: don't floor vehicle end of horizon value at export price (#35827)
- 8991e7c Optimizer: don't toggle phases inside 1p/3p gap (#35825)
- dfb4849 Optimizer: don't treat planner slot as deadline critical (#35648)
- 2997876 Optimizer: don't treat pv battery charging as grid charging (#35428)
- d217b8b Optimizer: estimate vehicle state from charged energy without soc (#35366)
- f43c1d4 Optimizer: group runtime state on site (#35928)
- 78ab829 Optimizer: hide explain for self-hosted optimizer (#35220)
- a09e85c Optimizer: hold battery for later higher-priced discharge (#35174)
- 8b51eca Optimizer: include HEMS consumption limit in grid import limit (#35323)
- 2dbdab0 Optimizer: include circuit max current in grid import limit (#35321)
- fbe38cb Optimizer: model planner schedule as fixed demand in battery-only mode (#35924)
- 2d74ae9 Optimizer: re-run on triggers during a running update (#35644)
- ebc7c50 Optimizer: relay external battery mode (#35234)
- d28954c Optimizer: send sponsor token to hosted optimizer only (#35238)
- 766668e Optimizer: skip run when solar forecast is unavailable (#35726)
- 6938363 Optimizer: split site_optimizer.go by responsibility (#35932)
- c4d4571 Optimizer: suggest the battery mode control applies (#35402)
- 010f4c1 Plugin (SunSpec): support integer points in float setter (#35646)
- 186e3a1 RCT: restore internal soc strategy when none saved (#35851)
- 151b39d Revert "Cardata: use shared mqtt preset and stream source" (#35279)
- 406c077 Revert "Templates: use evcc MQTT broker if mqtt host is empty" (#35280)
- e05d5bf Shelly Top AC: handle charger_insert work state (#35345)
- 03010d6 Site: keep last battery soc when one of several reads fails (#35302)
- e23a776 Site: on startup update charging loadpoints first (#35530)
- 6f1611f Site: remove duplicated BatteryGridDischargeActive publish (#35554)
- c1a0711 SlimmeLezer Luxembourg/V2: read import as energy and export as returnenergy (#35493)
- 83939b5 Solax: drop grid energy (not phase-balanced) (#35707)
- 6099281 Sponsor: renew hardware token in-process (#33816)
- 9bd918a Streamlined weather-model selection in Open-Meteo integrations (#35701)
- 755af53 SunSpec: retry device detection (#35649)
- eb8c8a7 Sungrow-hybrid: remove grid values not accessible via dongle (#35277)
- 18ad321 Tariff (Energinet): include current quarter-hour (#35396)
- 12a658a Tariff (Home Assistant): support sub-hourly solar forecast slots (#35342)
- a544c41 Tariff (Home Assistant): zero-fill missing solar forecast slots (#35571)
- 54456bf Tariff (fixed): don't overlap rates for zone boundaries in skipped DST hour (#35329)
- b273246 Tariff (fixed): keep zones on wall clock time on DST change days (#35319)
- d16de19 Tariff: update Energy Price Forecast API key links (#35565)
- 7a01471 Tariff: wait for retry interval after failed creation (#35320)
- 92bc6cd Tariffs: retry on HTTP 429 (#35898)
- 42e7b74 Templates: clarify battery max (dis)charge power help (#35548)
- 105da0e Templates: drop stale case-duplicate keys matching a param's spelling (#35873)
- 746ac28 Templates: render list param examples in unit tests (#35848)
- 1b3288c Templates: use evcc MQTT broker if mqtt host is empty (#35231)
- d419a5c Tesla BLE: treat sleeping vehicle as asleep, not as error (#35740)
- e692956 Tesla: fall back to vehicle_data without location when scope is missing (#35225)
- 572515a Tesla: treat proxy-wrapped complete/is_charging as charge enable success (#35470)
- 58d2f79 Tests: limit log lines in issue test to stay below URL limit (#35704)
- e1d1570 Tests: set sponsor subject under lock (#35925)
- d983b91 UI: ignore safe-area insets when embedded in an iframe (#35448)
- 04403e2 UI: improve startup and offline behavior (#35657)
- 4b02df4 UI: render markdown with marked instead of snarkdown (#35295)
- 65ef944 UI: revert intra-word underscore handling in markdown renderer (#35272)
- c395609 UI: use vehicle limits for charging phase indicators (#35692)
- d125891 Use grid helpers for current/power conversion (#35328)
- eab93a6 VW EU Data Act: bound each poll to 10s while catching up (#35594)
- e9e9187 Vaillant: unescape HTML entities in login form action (#35110)
- dfca71a Vehicle (EU Data Act): template-defined target soc keys (#35829)
- a72bb3c Vehicle: retry creating unavailable vehicle (#35534)
- 1755dc8 Victron VRM: convert hourly solar energy to power at the timestamp (#35240)
- 7a4bf99 Victron VRM: fetch solar forecast for up to 7 days (#35710)
- d1b62c2 Volvo Connected: support legacy dc- client ids until 2027-01-31 (#35865)
- c795038 Weishaupt: don't refresh power setpoint while disabled (#35703)
- 5077155 White-label: custom app icon and brand name in PWA manifest (#35551)
- de0f669 shortrfc3339: emit a quoted UTC timestamp from MarshalJSON (#35722)
- da4bb9e sonnenBatterie: hold via backup buffer to keep pv charging (#35880)
- 12169b7 sonnenBatterie: repeat charge setpoint while charging (#35391)
Bug Fixes 🐞
- 3fed3e2 OCPP: fix fractional currents for go-e/Fronius/Kathrein chargers (#35156)
- 3a456cb Config: fix legacy circuits modal docs link (#35422)
- 6575f7a RCT: fix grid charging when battery below min soc (#35312)
- bcd5f76 SMA Hybrid: fix battery power and energy (#35508)
- 182740e Sigenergy: fix grid energy registers (#35878)
- a76e819 Solax G2: fix 32-bit word order (#35590)
- 15f843d Tariff (Octopus DE): fix time-of-use slots shifting after DST change (#35353)
- 0a0a92b Telemetry: fix stuck charge upload on sites with many loadpoints (#35536)
- ddc18d0 Vehicle: fix getmaxcurrent example in user-defined template (#35347)
- 8fa585e Weidmüller: fix factory settings (#35123)
- c69db00 fix(eudataact): support Auth0 Universal Login Page for CUPRA/VW (#35385)