Releases: hoylabs/OpenDTU-OnBattery
Release list
2026.07.23
🚀 Features
Add all known Victron products (based on VictronConnect App)
- Feature: add SmartShunt 300A/50mV IP65 to list of known VE.Direct devices (#2569)
- Feature: add SmartSolar 250/60 rev3 and 250/70 rev3 to list of known VE.Direct devices (#2604)
- Feature: update and add all known products from VictronConnect
🐛 Fixes
Zendure
- Bugfix: Zendure: Accept non-static message ids (#2575)
- Bugfix: Zendure: Increase allowed length of appkey to 16 characters (#2593)
- Bugfix: Zendure: Fix stale-data false positives by making timeout configurable per provider (#2552)
🛠 Under the hood
- build(deps): bump mikepenz/release-changelog-builder-action (#2544)
- build(deps): bump actions/checkout from 6 to 7 (#2606)
- build(deps): bump mikepenz/release-changelog-builder-action (#2609)
- build(deps): bump actions/cache from 5 to 6 (#2615)
- build(deps): bump schneegans/dynamic-badges-action from 1.8.0 to 1.9.0 (#2637)
- build(deps): bump actions/setup-node from 6 to 7 (#2644)
- build(deps): bump actions/setup-python from 5 to 7 (#2649)
2026.05.18
⚡ Breaking Changes
🚀 Features
- Feature: VeDirect: Enable battery voltage remote sensing (#2460)
- Feature: DPL: make standby configurable for battery-powered inverters
Victron - Limit battery charge current
- Feature: Victron Solarcharger: set battery charge-current-limit (#1658)
- Feature: Battery: MQTT charge current limit (#2525)
Zendure
- Zendure: Feature: Added support for official Zendure API
- Zendure: Feature: Added Battery Protection Mode to prevent discharging packs below configured min SOC
- Zendure: Keep battery at 100% for configured time during charge through to allow balancing
PSRAM
- add build env option 'generic_esp32s3_usb_octal_psram' (#1758)
- add build env 'generic_esp32s3_usb_quad_psram' (#2515)
- publish PSRAM stats via MQTT + HA auto-discovery (#2522)
🐛 Fixes
- Fix: Websocket: Battery livedata can not be refreshed when read-only is disabled
- Fix: Powermeter API: Do not leak sensitive data to unauthorized API clients (#2452)
🌎 Web Application
🛠 Under the hood
- DPL: Refactor state machine to determine battery and dc bus usage (#2340)
- build(deps): bump mikepenz/release-changelog-builder-action (#2463)
- build(deps): bump actions/github-script from 8 to 9
- build(deps): bump softprops/action-gh-release from 2 to 3
- Update trusted suppliers list for OpenDTU Fusion
- increased chunksize to prevent warings during build
- Prepare Release 2026.05.18
2026.03.31
Upstream
This release includes upstream OpenDTU v26.3.30.
🚀 Features
- Feature: Victron VM-3P75CT: Reduce minimum poll interval to 100ms (#2410)
- Add support for HMS-2000D-4T inverters with serial prefix 0x1166
🐛 Fixes
- Fix: Zendure: Adjust bypass handling during fullcharge (#2342)
- Fix: Websockets did not work on latest iOS versions
- Fix: full solar passthrough configuration fault (#2299)
- Fix: WebSocket endpoints missing setAuthType for digest authentication
- Fix: WebSocket endpoints missing setAuthType for digest authentication
- fix URL in greek language pack
- Fix: Compile webapp script
- Fix: Missing webapi requesthandler casts
🌎 Web Application
- webapp: Update dependencies
- webapp: Prevent compile errors on newer tsc
- webapp: Update dependencies
- webapp: Update dependencies
- webapp: Update dependencies
- webapp: Update dependencies
- webapp: Change build config to match current vue pre-definitions
- webapp: NTP admin did not receive proper headers
- webapp: add app.js.gz
- webapp: Use WebSocketService for Battery, SolarCharger and GridCharger
- webapp: Add response error handling to getTimezoneList()
- webapp: cleanup properly when unmounted in BatteryView, GridChargerView, SolarChargerView
- webapp: Add response error handling to getTimezoneList()
- webapp: add app.js.gz
🛠 Under the hood
- Allow log level configuration for async websockets and async tcp stack
- Updated discord link to delegate user directly into the right channel
- ESP32Async/ESPAsyncWebServer @ 3.9.2
- Merge branch 'pr2905' into dev
- Upgrade ESP32Async/ESPAsyncWebServer from 3.9.2 to 3.9.3
- Upgrade espMqttClient from 1.7.0 to 1.7.2
- Upgrade olikraus/U8g2 from 2.36.12 to 2.36.15
- Update pl.lang.json
- Merge branch 'pr2961' into dev
- Merge branch 'pr2953' into dev
- Added Serial Prefix to readme
- Upgrade ESP32Async/ESPAsyncWebServer from 3.9.3 to 3.9.6
- Upgrade olikraus/U8g2 from 2.36.15 to 2.36.17
- Rework NTP handling
- Upgrade ESP32Async/ESPAsyncWebServer from 3.9.6 to 3.10.0
- build(deps): bump actions/download-artifact from 5 to 7
- build(deps): bump actions/cache from 4 to 5
- build(deps): bump dessant/lock-threads from 5 to 6
- build(deps): bump actions/checkout from 5 to 6
- build(deps): bump mikepenz/release-changelog-builder-action
- build(deps): bump actions/upload-artifact from 4 to 7
- build(deps): bump mikepenz/release-changelog-builder-action
- build(deps): bump actions/download-artifact from 7 to 8
- Upgrade ESP32Async/ESPAsyncWebServer from 3.10.0 to 3.10.3
- Upgrade bblanchon/ArduinoJson from 7.4.2 to 7.4.3
- Upgrade olikraus/U8g2 from 2.36.17 to 2.36.18
- Upgrade nrf24/RF24 from 1.4.11 to 1.5.0
- Upgrade arkhipenko/TaskScheduler from 3.8.5 to 4.0.4
- Upgrade actions/checkout from v5 to v6
- Upgrade actions/setup-node from v4 to v6
- Upgrade node to 24 in github actions
- Upgrade actions/setup-python from v5 to v6
- Upgrade actions/stale from v9 to v10
- Upgrade dessant/lock-threads from v5 to v6
- Upgrade actions/cache from v5 to v6
- Upgrade actions/upload-artifact from v4 to v7
- Upgrade mikepenz/release-changelog-builder-action from v5 to v6
- Upgrade actions/download-artifact from v4 to v8
- Updated copyright information
- Adjusted copyright information
- Merge tag 'v26.3.28' into AndreasBoehm/merge-upstream-v26.3.28
- WebApi Limit: Enforce that limit must be > 0
- Remove user specific tokens from release workflow
- [Add all required permissions to release workflow](https://git...
2025.10.11
Upstream
This release includes upstream OpenDTU v25.9.11.
🚀 Features
🛠 Under the hood
2025.09.16
Upstream
This release includes upstream OpenDTU v25.9.11.
⚡ Breaking Changes
🚀 Features
- Feature: Allow setting of permanent power limit on new firmware versions for HMS inverters
- Feature: DPL: make standby configurable for smart-buffer-powered inverters
- Feature: Display: Show battery SoC (alternating with power meter) (#2122)
- Feature: R48xx: increase upper power limit to 4000W
- SolarCharger: MQTT: accept negative values for output_current and output_power (#2183)
Zendure
🐛 Fixes
- DPL: reduce/increase limits of solar and smart-buffer inverters based on current AC power
- Fix: DPL: Overscaling not able to reduce power
- Fix: DPL: really ignore hysteresis when inverter should be shutdown
- Fix: DPL: inverters disconnected from the grid are non-eligible
- Fix: enforce configured discharge limit even without BMS
- Fix: remove duplicated square brackets from VE.Direct log messages
- Fix: make logging more leightweight using large shared buffer
- Fix: R48xx: treat configured limits as output limits
- Fix: make logging more leightweight using large shared buffer
- Fix: Dont allow HA base topic without trailing slash
- Fix: Corrected typo in string
- Fix: typo in logging tag of PinMappingClass
🌎 Web Application
- webapp: translate logging modules in admin view
- webapp: fix: return log level for more than 5 modules
- webapp: apply solarized-dark colors to web console
- webapp: Update dependencies
- webapp: Update dependencies
- webapp: Update node dependency
- webapp: Update dependencies
- webapp: Updated to latest sass version
- webapp: Simplify eventlog display
- webapp: Simplify line class detection in console view
- webapp: Make compiler happy
- webapp: Make compiler happy
- webapp: Doublecheck upload files bounds
- webapp: Use correct method scope
- webapp: Doublecheck for undefined behavior
- webapp: Fix lint error
- webapp: Make compiler happy
- webapp: Update dependencies
- webapp: Comment bootstrap workaround
- webapp: Simplify authentication code
- webapp: Configure additional compression
- webapp: Add file type validation for OTA firmware uploads
- webapp: Restore OTA firmware uploads functionality
- webapp: Fix exception on file upload select
- webapp: Minify json configs before upload
- webapp: Remove unused variable
- webapp: add app.js.gz
- webapp: fix yarn errors after lint upgrade
- webapp: update node version to 24 in prettier workflow
- webapp: Fix for code scanning alert no. 24: Incomplete string escaping or encoding
- webapp: revert firmware filename check in WebApi
🛠 Under the hood
- Add serial number prefix 114a to HMS_2CH
- Improvement: add firmware compatibility to README
- Recommend firmware version 1.1.12
- Indicate persistent limit with firmware version 2.0.4 are working
- Add Yarn Prettier badge to readme
- Merge branch 'pr2713' into dev
- Merge branch 'pr2675' into dev
- update discord link to point to expected channel
- language packs: fix links to github to point to downstream project
- R48xx: refactor auto power control for readability
- update discord link to point to expected channel
- Remove comment which doesn't make sense at this posistion
- Use pre-defined literals in webapi
- Improvement: Battery: unify charge current limit handling across providers
- Added hint for breaking change
- [Add GitHub Copilot instructions and environment setup workflow](https://github.com/ho...
2025.06.11
🚨 Partition Layout Change
Coming from firmware version 2024.06.03 or older *1), you cannot upgrade to this release (or any future release) by performing an over-the-air (OTA) update using the web interface! Read and follow the upgrade instructions, where additional information is available as well.
If you upgraded to version 2024.08.18 or newer already *2), you should be good to perform an OTA update using the web interface (unless you are using the generic_esp32_4mb_no_ota firmware variant).
*1) Technically: If you are still using the "old" partition layout where the sketch size is only 1,920 kB. See Info -> System in the web UI to know your current sketch size.
*2) Only when upgraded using the respective .factory.bin image over a wired connection to the ESP32, such that the partition layout was actually updated alongside the firmware.
Upstream
This release includes upstream OpenDTU v25.5.10.
⚡ Breaking Changes
🚀 Features
Huawei R48xx PSU
- Feature: R48xx: process board properties into web UI and MQTT
- Feature: R48xx: show input frequency in web UI
- Feature: R48xx: support turning on/off via CAN
- Feature: R48xx: support for fan control
- Feature: R48xx: support for input limit command
- Feature: R48xx: read max current multiplier from device
- Feature: R48xx: process device's row and slot number
- Feature: R48xx: use shutoff over CAN
- Feature: R48xx: introduce concept of reachability
- Feature: R48xx: auto-update rectifier with settings
- Feature: R48xx: add power control modal to web UI
Improved Logging
- Feature: Rewrite virutal console to support new line break and colored highlighting
- Feature: Redirect all ESP log output to the MessageOutput handler
- Feature: Allow setting the log level for the different modules at runtime
Zendure
- Feature: ZendureBattery - added support for AB2000S
- Feature: ZendureBattery - added config switch for buzzer and refined some translations
- Feature: Zendure: add 'read-only' and 'only-once' control modes
🐛 Fixes
- Fix: Victron power meter: skip unexpected Modbus UDP answers
- Fix: motivate browsers to reload web app resources
- Fix: DPL: always re-compute and save full solar-passthrough state
- Fix possible race condition when enabling Admin Mode AP
- Fix: When enabling admin mode, the search for the STA was automatically disabled
- Fix: Prevent unpredicted behavior on overflows of millis()
- Fix: Allow negative reactive power for inverters..
- Fix: Prevent crash when performing a lot of inverter edits
- Fix vector reservation for logging modules
- Fix: DPL: Ignore assumed solar inverter power when not producing
- Fix: get only the first VE.Direct off reason as readable text
- Fix: typo in logging tag of PinMappingClass
- Fix: R48xx: bring back efficiency unit to web UI and log
- Fix: R48xx: publish input frequency
- Fix: webapp: grid charger: scroll to top after saving
- Fix: R48xx: allow disabling auto-power mode
- Fix: JBD BMS: fix logic that caused to always print "unexpected state"
- Fix: increase HTTP+JSON power meter stack size
- Fix: increate HTTP power meter stack sizes
- Fix: R48xx: increase stack size to prevent crashes
Zendure
- Fix: ZendureBattery - corrected wrong product id for Hyper2000 and added secondary id
- Fix: ZendureBattery - fixed bypass mode feedback
- Fix: ZendureBattery - corrected product id for AOI 2400 (thanks @traxanos)
- Fix: ZendureBattery - corrected typo in Ace1500 (was named as Ace2000)
- Fix: ZendureBattery - fixed extraction of current bypass state
- Fix: ZendureBattery - send SoC levels only once and removed trailing coma
- Fix: ZendureBattery: Fixed serial for AIO integrated battery (use ABB3 instead of R04Y, as this belongs to the controller) and updated product name
- Fix: ZendureBattery: Only use log messages if device is known to be compatible and fixed some typos
🌎 Web Application
- webapp: German locale: improvements and typo fixes
- webapp: German locale: be informal
- webapp: fix broken reference in locales
- webapp: Allow scrolling in horizontal direction in console window
- webapp: optimize syslog settings
- webapp: Extend language packs for syslog messages
- webapp: Update dependencies
- webapp: Add hint text for the core log level
- webapp: Make css for home view only available for home view
- [webapp: Add addi...
2025.04.17
🚨 Partition Layout Change
Coming from firmware version 2024.06.03 or older *1), you cannot upgrade to this release (or any future release) by performing an over-the-air (OTA) update using the web interface! Read and follow the upgrade instructions, where additional information is available as well.
If you upgraded to version 2024.08.18 or newer already *2), you should be good to perform an OTA update using the web interface (unless you are using the generic_esp32_4mb_no_ota firmware variant).
*1) Technically: If you are still using the "old" partition layout where the sketch size is only 1,920 kB. See Info -> System in the web UI to know your current sketch size.
*2) Only when upgraded using the respective .factory.bin image over a wired connection to the ESP32, such that the partition layout was actually updated alongside the firmware.
Upstream
This release includes upstream OpenDTU v25.4.10.
🐰🐣 Features
- Feature: Support Zendure Solarflow Battery with local MQTT
- Feature: add current to MQTT battery provider
- Feature: support Victron VM-3P75CT Power Meter
- Feature: chunk webconsole messages in websocket
- Feature: 3-phase SDM: read SDM_TOTAL_POWER
- Feature: DPL: respect immediate charging request
- Feature: add SmartShunt 300A/50mV to list of known VE.Direct devices
- Feature: Added polish language pack (thanks to @AdamWitek77)
🐛 Fixes
DPL
- Fix: use current AC for smart buffer reduction
- Fix: ignore non-eligible inverters in all calculcations
- Fix: add smart buffer output to total DPL output
- Fix: cannot un-govern solar-powered inverters
- Fix: do not retry limit commands
- Fix: make getDischargeCurrentLimit() readable and return expected value
- Fix: prevent underflow in solar charger output calculation
- Fix: Prevent underflows in getMaxIncreaseWatts() methods
- Fix: solar-powered inverters are non-eligible at nighttime
- Fix: ignore stats of non-eligible inverters
- Fix: do not rely on unreachable inverters for voltage reading
- Fix: skip non-eligible inverters in unconditional solar passthrough
- Fix: ignore hysteresis when inverter should be shutdown
- Fix: dynamic threshold for solar inverters
- Fix: Solar inverter should report its minimal power when started in the morning
- Fix: don't assume max increase for solar inverter w/o overscaling
- Fix: force restart of battery and smart-buffer powered inverters
VE.Direct Solar Charger
- Fix: unused state of operation, missing unit, unused std::optional
- Fix: VeDirectFrameHandler: Reject non-ASCII characters
- Fix: use _logId as key to prevent phantom device stats from persisting
- Fix: ignore stale stats
- Fix: prioritize VE.Direct network power
- Fix: account negative output power of VE.Direct charge controllers
Logging
- Fix: web console: prevent concurrent websockets
- Fix: webconsole websocket heap consumption issue
- Fix: flush Serial after each line
- Fix: en-/disable DTU verbose logging w/o restart
Other
- Fix: disable temperature readings for ESP32-S3
- Fix: handle MQTT message fragmentation
- Fix: Disable SPI3_HOST with ESP32-S2 for SpiManager
- Fix: empty data point container shall return 0 for getLastUpdate()
- Fix: DTU serial change not possible
- Fix: scroll to top when battery config is saved
- Fix: MQTT battery SoC precision calculation
- Fix: bump ESPAsyncWebServer to v3.7.6
🌎 Web Application
- webapp: show relevant requirements for solar powered inverters
- webapp: beautify controls on web console view
- webapp: remove (more) colons from forms
- webapp: use same appearance for all dataAge displays
- webapp: introduce and use DataAgeDisplay component
- webapp: use pluralization of data age UI component
- webapp: remove obsolete DataAge language tokens
- webapp: Update dependencies
- webapp: Update dependencies
- webapp: Update dependencies
- webapp: Update dependencies
- webapp: Update dependencies
- webapp: Update dependencies
🛠 Under the hood
2025.02.10
🚨 Partition Layout Change
Coming from firmware version 2024.06.03 or older *1), you cannot upgrade to this release (or any future release) by performing an over-the-air (OTA) update using the web interface! Read and follow the upgrade instructions, where additional information is available as well.
If you upgraded to version 2024.08.18 or newer already *2), you should be good to perform an OTA update using the web interface (unless you are using the generic_esp32_4mb_no_ota firmware variant).
*1) Technically: If you are still using the "old" partition layout where the sketch size is only 1,920 kB. See Info -> System in the web UI to know your current sketch size.
*2) Only when upgraded using the respective .factory.bin image over a wired connection to the ESP32, such that the partition layout was actually updated alongside the firmware.
Upstream
This release includes upstream OpenDTU v25.2.3.
🚀 Features
- Add support for smart buffer batteries (e.g. Marstek B2500, Anker Solix, Zendure, etc.)
- Feature: Add prefix 1420 to HMS-4 channel inverters
🐛 Fixes
- fix: Make sure limit values are consistent and not above 100%
- Fix: R48xx: only interlock against battery-powered inverters
- Fix: DPL mode 2 for smart-buffer-powered inverters
🌎 Web Application
- webapp: set overscaling threshold default value
- webapp: hide overscaling thresh. for inv with PDL
- webapp: explain "Use battery at night.." (#1615)
🛠 Under the hood
- Use new name for ESPAsyncWebServer
- Move network reconfiguration to main loop to prevent crashes
- Merge branch 'pr2513'
- Added greek language pack
- Harmonise all language packs
- Upgrade ESP32Async/ESPAsyncWebServer from 3.6.0 to 3.6.2
- README: add endorsement for Fusion hardware
- Update espressif32 from 6.9.0 to 6.10.0
- Improvement: handle stale issues and prs
- Manually applied latest changes in PR #2509
- Merge upstream tag 'v25.2.3'
- add "State of Operation", "Float voltage" and "Absorption Voltage" to solar charger (#1576)
- Improvement: DPL: encapsulate SolarPassThrough check
- Improvement: DPL unconditional-passthrough method name
- Prepare Release 2025.02.10
2025.01.23
🚨 Partition Layout Change
Coming from firmware version 2024.06.03 or older *1), you cannot upgrade to this release (or any future release) by performing an over-the-air (OTA) update using the web interface! Read and follow the upgrade instructions, where additional information is available as well.
If you upgraded to version 2024.08.18 or newer already *2), you should be good to perform an OTA update using the web interface (unless you are using the generic_esp32_4mb_no_ota firmware variant).
*1) Technically: If you are still using the "old" partition layout where the sketch size is only 1,920 kB. See Info -> System in the web UI to know your current sketch size.
*2) Only when upgraded using the respective .factory.bin image over a wired connection to the ESP32, such that the partition layout was actually updated alongside the firmware.
Upstream
This release includes upstream OpenDTU v25.1.14.
🚀 Features
- Add support for solar charger data from MQTT broker
- Feature: Add support for HERF-600 inverters
- Feature: Added support for HMS-450 inverters which begin with 1400
- Feature: show mqtt battery live view card
- Feature: show hint if device profile missing or not selected
- Feature: New handling of command queue
- Feature: Set Limit transfer only to "OK" if the queue does not contain any more commands
- Feature: Show inverter status and current power in overview (if multiple inverters are available)
- Feature: Detect if inverter supports 'Power Distribution Logic'
- Feature: Huawei grid charger: update values when submitting parameters
🐛 Fixes
- DPL Fixes
- Revert changes to limit calculation for solar-powered inverters
- Allow management of DPL-governed inverters while DPL is off
- Fix: start nighttime discharge cycle only once per night
- Fix: Huawei grid charger efficiency value
- Fix: Huawei grid charger with MCP2515: avoid missing out on CAN messages
- Fix: Huawei grid charger: known last value ends transaction
- Fix: Remove temperature readings for ESP32-S2 modules
- Fix: Auto reboot was not triggered on pin mapping change
- Fix: Wifi.begin was called with wrong parameters
- Fix: Uptime overflow after ~50 days
- Fix: need to skip BOM also when migrating config
- Fix: Hint regarding required device profile is shown for profiles which don't need a device profile
- Fix: 'create release badge' action and show it (#1545)
- Fix: millis() rollover in smart shunt loop()
- Fix: align mqtt publish interval in webapp and API
- Fix: Really always execute the generate of the factory.bin file
🌎 Web Application
- Show totals in blue and producing inverters in green
- Fix: live card header bg matches upstream colors
- webapp: fix typo in "IgnoreSoc" label
- webapp: fix line break for reload button
- webapp: avoid undefined serial for InputSerial
- webapp: improve styling of hints on home view
- webapp: Update dependencies
- webapp: Update dependencies
- webapp: Update dependencies
- webapp: Update dependencies
- webapp: Update dependencies
🛠 Under the hood
- Fix: lint errors
- Fix: replace helgeerbe with hoylabs in tmpl URLs
- Make function getClientId const
- Organize includes
- Remove not required string generation
- Use correct variable to set AUTO_GIT_BRANCH
- change markdown table to github style
- Update table with supported inverters in library README.md
- add Sum of DC Power
- Disable queue debugging
- Remove extra semikolon
- Update bblanchon/ArduinoJson from 7.2.0 to 7.2.1
- Update bblanchon/ArduinoJson from 7.2.1 to 7.3.0
- Upgrade ESPAsyncWebServer from 3.3.22 to 3.3.23
- Upgrade ESPAsyncWebServer from 3.3.23 to 3.4.0
- Upgrade ESPAsyncWebServer from 3.4.0 to 3.4.1
- Upgrade ESPAsyncWebServer from 3.4.1 to 3.4.2
- Upgrade ESPAsyncWebServer from 3.4.2 to 3.6.0
- [Update nrf24/RF24 from 1.4.10 to 1.4.11](220cfbf7aed09...
2025.01.10
🚨 Partition Layout Change
Coming from firmware version 2024.06.03 or older *1), you cannot upgrade to this release (or any future release) by performing an over-the-air (OTA) update using the web interface! Read and follow the upgrade instructions, where additional information is available as well.
If you upgraded to version 2024.08.18 or newer already *2), you should be good to perform an OTA update using the web interface (unless you are using the generic_esp32_4mb_no_ota firmware variant).
*1) Technically: If you are still using the "old" partition layout where the sketch size is only 1,920 kB. See Info -> System in the web UI to know your current sketch size.
*2) Only when upgraded using the respective .factory.bin image over a wired connection to the ESP32, such that the partition layout was actually updated alongside the firmware.
Upstream
This release includes upstream OpenDTU v24.11.7.
⚡ Breaking Changes
- BREAKING CHANGE: remove default scaling/compensation for unused inputs
- BREAKING CHANGE: huawei grid charger with MCP2515 requires IRQ pin
🚀 Features
- Support for Huawei AC charger using the CAN Transceiver on OpenDTU Fusion CAN/Iso shield.
- Feature: huawei grid charger: support serial CAN controller (Conflicts with CAN-based battery providers!)
- Support for HMS-1600/-1800/-2000 inverters with firmware 01.01.12
- Mitigate overscaling issues when used with "solar-passthrough batteries".
- Feature: show hint if device profile missing or not selected
- Feature: webapp: show hardware UART allocations
- Feature: hide inverter totals if no inverters configured
- Feature: webapp: warn about small lower power limits
- Feature: auto-detect SoC precision for MQTT Battery provider
- Feature: include MPPT power in debug log
- Feature: sub-second DTU poll interval resolution
🐛 Fixes
- Fix: wait for inverter stats before doing full solar-passthrough
- Fix: use battery when in full solar-passthrough
- Fix: need to skip BOM also when migrating config
- Fix: rename solar-passthrough losses to conduction losses
- Fix: DPL: proactively set known limit on inverters
- Fix: Huawei AC charger sends signed values
- Fix: webapp: DPL: config hint only for governed inverters
- Fix: wrong usage of 'isSunsetAvailable'
- Prevent solar powered inverters from getting stuck at low limits
- Setups without a solarcharger interface configured will not try to do full-solar-passthrough
- Fix: huawei grid charger: prevent deadlock on mutex
🌎 Web Application
- webapp: avoid undefined serial for InputSerial
- webapp: DPL: clean up obsolete language tokens
- webapp: DPL: use new terminology "governed" inverters
- webapp: show OpenDTU-OnBattery-specific config version
- webapp: improve styling of hints on home view
- webapp: allow to reduce MQTT publish interval down to 1 second
- webapp: add "-OnBattery" in "NotReady" language token
- webapp: fix warning message about pin mapping profile name length
- webapp: define pin mapping interface for Huawei and PowerMeter
- webapp: add proxy for /huaweilivedata location
- webapp: show precise data age for inverters
🛠 Under the hood
- DPL: beautify log by considering plural for amount of inverters
- DPL: optimize verbose logging output
- config.json: remove skipping BOM a second time
- introduce and use ConfigurationClass::migrateOnBattery()
- DPL: cache load-corrected voltage
- github actions: switch to ubuntu-24.04
- power meter serial SDM: whitespace/style cleanup
- delete .DS_Store
- match file "COPYING" to OpenDTU-OnBattery
- huawei grid charger: split controller and CAN driver
- huawei grid charger: make MCP2515 driver private to controller
- huawei grid charger: whitespace cleanup
- huawei grid charger: clean up #defines
- huawei grid charger: web API: remove unreachable code
- huawei grid charger: start HW interface abstraction
- [huawei grid charger: prepare to accept tx and rx pin config](h...