🚨 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
- adopt new signature of MqttSubscribeParser.OnMessageCallback
- Upgrade ESP32Async/ESPAsyncWebServer from 3.6.2 to 3.7.0
- Upgrade ESP32Async/ESPAsyncWebServer from 3.7.0 to 3.7.3
- Upgrade ESP32Async/ESPAsyncWebServer from 3.7.3 to 3.7.4
- Upgrade olikraus/U8g2 from 2.36.2 to 2.36.4
- Upgrade olikraus/U8g2 from 2.36.4 to 2.36.5
- Update bblanchon/ArduinoJson from 7.3.0 to 7.3.1
- Change datatype for led pins from int8_t to gpio_num_t
- Change datatype for nrf24 pins from int8_t to gpio_num_t
- Change datatype for cmt pins from int8_t to gpio_num_t
- Change datatype for w5500 pins from int8_t to gpio_num_t
- Change datatype for eth pins from int to gpio_num_t
- Change datatype for display pins from uint8_t to gpio_num_t
- "victron" pins: switch to gpio_num_t
- "battery" pins: switch to gpio_num_t
- "huawei" pins: switch to gpio_num_t
- "powermeter" pins: switch to gpio_num_t
- Make pinmapping variable const
- Move all display related initialization inside the display class
- Improvement: restructure powermeter providers
- Move SpiManager registration into PinMapping class
- Improvement: use timestamp from Victron framehandler for data transfer to battery stats
- restructure implementation of battery interfaces
- restructure battery's HASS integration
- clean up JK BMS HA auto-discovery device name
- battery HASS: move voltage and current sensors to base class
- SBS battery: use Batteries::Stats::setCurrent
- DPL: verbose log day vs. night time
- move info about inverter output metering to inverter dump
- DataPointContainer::add() shall update existing data
- make DataPointContainer thread-safe using a mutex
- Improvement: use DataPointContainer in power meters
- Simplify code for sunset calculation
- Simplify code for CommandQueue
- Simplify code of weekday calculation
- Less calculation in locked code area
- Simplify Display Graphic code
- Added device profile for Olimex ESP32-POE and CMT2300A module
- Reduce nested code by one level
- Call getLocalTime() only once to prevent a delay of 10ms if no time is available
- Improvement: DPL: improve handling without overscaling
- bump mikepenz/release-changelog-builder-action from 4 to 5
- Bump mikepenz/release-changelog-builder-action to 5.3.0
- Simplify code in radio classes
- DPL: correct a typo in unconditional solar passthrough
- DPL: make isEligible() return a boolean
- append warning to web console rather than replacing a line
- Updated all languages to latest status
- switch back to localtime_r()
- Initialize the dnsserver object in the constructor
- add Waveshare ESP32-S3-ETH device profile
- PowerLimiterOverscalingInverter: remove unused variable
- feat(WebApi_prometheus.cpp): dynamically adjust the initial response buffer size
- Slight optimization in bug report template
- Use the right format string on a lot of locations
- Make setLed method compatible with Arduino Framework 3
- Use correct signature for getMaxResendCount
- Remove not required parameters from MqttSubscribeParser
- Improvement: split battery config into individual configs
- Give reconnect more time
- Merge upstream tag 'v25.4.2'
- Merge upstream tag 'v25.4.4'
- Merge upstream tag 'v25.4.10'
- CPU temperature: make boolean value human-readable in serial log
- remove .vscode folder
- git ignore everything in .vscode/
- Apply automatic code formatting