ESPHome 2025.9.0 - 17th September 2025
Release Overview
ESPHome 2025.9.0 brings significant enhancements to display technology, camera functionality, and performance optimizations. This release focuses on advanced display capabilities, improved memory efficiency, and enhanced developer tools while maintaining backward compatibility for most use cases.
Key Highlights:
- MIPI RGB Display support for high-performance color displays with dedicated hardware acceleration
- Camera JPEG encoder enabling efficient image compression and streaming capabilities
- Enhanced NRF52 features including DFU (Device Firmware Update) support
- Extensive memory optimizations reducing flash and RAM usage across all platforms
- Improved sensor support with enhanced BL0940 power monitoring capabilities
- Component improvements including restructured Inkplate e-paper display support
MIPI RGB Display Support
ESPHome 2025.9.0 introduces comprehensive support for MIPI RGB displays through the new MIPI RGB Display Driver component.
Key Features:
- Hardware acceleration through dedicated MIPI controllers
- High refresh rates with excellent color reproduction
- Unified configuration supporting multiple display models
- Reduced CPU overhead compared to traditional parallel displays
- Professional display quality for advanced user interfaces
MIPI RGB displays offer superior performance for applications requiring high-quality graphics, smooth animations, and professional-grade user interfaces.
Camera JPEG Encoder
The new Camera Encoder component adds efficient JPEG compression capabilities to ESP32 camera implementations, enabling:
Benefits:
- Reduced bandwidth for image transmission over WiFi
- Lower storage requirements for image capture applications
- Improved streaming performance with compressed image data
- Configurable quality settings to balance size vs. quality
- Hardware acceleration where available on supported platforms
This component is particularly valuable for security cameras, time-lapse photography, and any application requiring efficient image handling.
Enhanced NRF52 Platform
Building on the NRF52 platform introduced in 2025.8.0, this release adds crucial development and deployment features:
New Capabilities:
- DFU (Device Firmware Update) support for over-the-air updates
- Improved debugging tools with enhanced Zephyr integration
These enhancements make NRF52 development more practical for production deployments while maintaining the low-power advantages of Nordic semiconductors.
Memory & Performance Optimizations
ESPHome 2025.9.0 continues the optimization efforts with significant improvements:
Flash Memory Savings:
- Component source strings moved to flash (ESP8266) saving substantial RAM
- GPIO memory optimization reducing usage by up to 50% through bit-packing
- Scheduler improvements with memory pools to reduce heap fragmentation
- String optimizations eliminating unnecessary allocations in core functions
Runtime Improvements:
- Enhanced GPIO expander support with cached operations reducing I2C bus usage
- Optimized sensor logging with compile-time string management
- Better timezone synchronization allowing the timezone to be sent from Home Assistant for devices that are pre-installed with ESPHome
Breaking Changes
ESPHome 2025.9.0 includes several breaking changes that may require configuration updates:
Core Preference Storage Changes
- Device ID consideration: Preference storage now accounts for device_id to prevent conflicts
- Impact: Devices may lose some stored preferences on first boot after upgrade
- Action Required: No configuration changes needed, but stored calibration data may need to be reconfigured
LVGL Spinbox Configuration
- Configuration change:
step
property replaced withselected_digit
for spinbox widgets - Impact: Existing LVGL spinbox configurations will fail validation
- Action Required: Update spinbox configurations to use
selected_digit
instead ofstep
Bluetooth Proxy Connection Defaults
- Default change: Active connections now default to
true
instead offalse
- Impact: Bluetooth proxy will allow active connections by default
- Action Required: Explicitly set
active: false
if you want to maintain previous behavior
API and Memory Optimizations
- String function changes:
state_class_to_string()
now returnsconst char*
instead ofstd::string
- Component storage changes: Component source strings moved to flash memory on ESP8266
- Impact: Custom components using these functions may need updates
- Action Required: Update custom components to handle new return types
Inkplate Component Rename
- Component renamed: Inkplate component has been renamed and grayscale handling improved
- Impact: Existing Inkplate configurations will need component name updates
- Action Required: Update component references in your configuration
Most breaking changes are internal optimizations that shouldn’t affect typical configurations, but custom components and advanced setups may require updates.
Full list of changes
New Features
- [light] Add support for querying effects by index esphome#10195 by @edwardtfn (new-feature)
- [mipi_spi] Add model esphome#10392 by @clydebarrow (new-feature)
- [mapping] Use custom allocator esphome#9972 by @clydebarrow (new-feature)
- Add JPEG encoder support via new camera_encoder component esphome#9459 by @DT-art1 (new-component) (new-feature)
- [nrf52] add dfu esphome#9319 by @tomaszduda23 (new-feature)
- [bluetooth_proxy] Expose configured scanning mode in API responses esphome#10490 by @bdraco (new-feature)
- [wizard] extend the wizard dashboard API to allow upload and empty config options esphome#10203 by @maximmaxim345 (new-feature)
- [mipi_rgb] Unified driver for MIPI RGB displays esphome#9892 by @clydebarrow (new-component) (new-feature) (new-platform)
- [api] Add timezone support to GetTimeResponse for automatic timezone synchronization esphome#10661 by @bdraco (new-feature)
- [bl0940] extend configuration options of bl0940 device esphome#8158 by @dan-s-github (new-feature) (new-platform)
New Components
- Add JPEG encoder support via new camera_encoder component esphome#9459 by @DT-art1 (new-component) (new-feature)
- [mipi_rgb] Unified driver for MIPI RGB displays esphome#9892 by @clydebarrow (new-component) (new-feature) (new-platform)
New Platforms
- [mipi_rgb] Unified driver for MIPI RGB displays esphome#9892 by @clydebarrow (new-component) (new-feature) (new-platform)
- [bl0940] extend configuration options of bl0940 device esphome#8158 by @dan-s-github (new-feature) (new-platform)
Breaking Changes
- [core] Fix preference storage to account for device_id esphome#10333 by @bdraco (breaking-change)
- [lvgl] Replace spinbox step with selected_digit esphome#10349 by @clydebarrow (breaking-change)
- [sensor] Change state_class_to_string() to return const char* to avoid allocations esphome#10533 by @bdraco (breaking-change)
- [bluetooth_proxy] Change default for active connections to true esphome#10546 by @bdraco (breaking-change)
- [core] Store component source strings in flash on ESP8266 (breaking change) esphome#10621 by @bdraco (breaking-change)
- [inkplate] Rename component and fix grayscale esphome#10200 by @JosipKuci (breaking-change)
All changes
- [CI] Fix CI job failures for PRs with >300 changed files esphome#10215 by @bdraco
- [qm6988] Clean up code esphome#10216 by @jesserockz
- [quality] Remove period from audio related Invalid raises esphome#10229 by @jesserockz
- [api] Optimize message buffer allocation and eliminate redundant methods esphome#10231 by @bdraco
- [esp32] Optimize preferences is_changed() by replacing temporary vector with unique_ptr esphome#10246 by @bdraco
- [core] Remove unnecessary FD_SETSIZE check on ESP32 and improve logging esphome#10255 by @bdraco
- [esp8266] Replace std::vector with std::unique_ptr in preferences to save flash esphome#10245 by @bdraco
- [api] Optimize APIFrameHelper virtual methods and mark implementations as final esphome#10278 by @bdraco
- [api] Mark protobuf message classes as final to enable compiler optimizations esphome#10276 by @bdraco
- [api] Mark APIConnection as final for compiler optimizations esphome#10279 by @bdraco
- [api] Optimize protobuf decode loop for better performance and maintainability esphome#10277 by @bdraco
- [CI] Rename and expand needs-docs workflow esphome#10299 by @jesserockz
- [safe_mode] Reduce flash usage by 184 bytes through code optimization esphome#10284 by @bdraco
- [helper] Make crc8 function more flexible to avoid reimplementation in individual components esphome#10201 by @jesserockz
- [api] Avoid object_id string allocations for all entity info messages esphome#10260 by @bdraco
- [mdns] Reduce flash usage and prevent RAM over-allocation in service compilation esphome#10287 by @bdraco
- [quality] Convert remaining
to_code
toasync
esphome#10271 by @jesserockz - [binary_sensor] Convert LOG_BINARY_SENSOR macro to function to reduce flash usage esphome#10294 by @bdraco
- [sensor] Convert LOG_SENSOR macro to function to reduce flash usage esphome#10290 by @bdraco
- [button] Convert LOG_BUTTON macro to function to reduce flash usage esphome#10295 by @bdraco
- [number] Convert LOG_NUMBER macro to function to reduce flash usage esphome#10293 by @bdraco
- [light] Add support for querying effects by index esphome#10195 by @edwardtfn (new-feature)
- [CI] Base
too-big
label on new additions only esphome#10307 by @jesserockz - [web_server] Reduce flash usage by consolidating defer calls in switch and lock handlers esphome#10297 by @bdraco
- [core] Eliminate heap allocation in teardown_components by using StaticVector esphome#10256 by @bdraco
- [libretiny] Optimize preferences is_changed() by replacing temporary vector with unique_ptr esphome#10272 by @bdraco
- [bluetooth_proxy] Mark BluetoothConnection and BluetoothProxy as final for compiler optimizations esphome#10280 by @bdraco
- [CI] Also require tests for
new-features
esphome#10311 by @jesserockz - [homeassistant] Add compilation test for homeassistant.tag_scanned action esphome#10319 by @bdraco
- [core] Add idf-tidy env for esp32-c6 esphome#10270 by @jesserockz
- [opentherm] Rename c++ files for predictable doxygen generation esphome#10314 by @jesserockz
- [ld2420] Rename c++ files for predictable doxygen generation esphome#10315 by @jesserockz
- [nrf52] update toolchain to v0.17.4, support mac esphome#10391 by @tomaszduda23
- [nrf52] fix build in dashboard esphome#10323 by @tomaszduda23
- fix temperature config validation regex esphome#9575 by @ximex
- Update Python to 3.11 in AI instructions esphome#10407 by @ximex
- [mipi_spi] Add model esphome#10392 by @clydebarrow (new-feature)
- improve AI instructions esphome#10416 by @ximex
- [esp32_ble_client] Add missing ESP_GATTC_UNREG_FOR_NOTIFY_EVT logging esphome#10347 by @bdraco
- [core] Fix preference storage to account for device_id esphome#10333 by @bdraco (breaking-change)
- [core] Dont copy platform source files if there are no entities of that type esphome#10436 by @jesserockz
- improve const imports of
esphome.const
esphome#10438 by @ximex - Revert “[core] Dont copy platform source files if there are no entities of that type” esphome#10441 by @clydebarrow
- [api] Fix string lifetime issue in fill_and_encode_entity_info for dynamic object_id esphome#10482 by @bdraco
- [absolute_humidity] Fix typo esphome#10474 by @DAVe3283
- [esp32_ble_tracker] Remove duplicate client promotion logic esphome#10321 by @bdraco
- [bluetooth_proxy] Remove unused ClientState::SEARCHING state esphome#10318 by @bdraco
- [mapping] Use custom allocator esphome#9972 by @clydebarrow (new-feature)
- [lvgl] Replace spinbox step with selected_digit esphome#10349 by @clydebarrow (breaking-change)
- Adjust sen5x to match VOC/NOX datasheet esphome#9894 by @Fmstrat
- [lvgl] Update hello world esphome#10469 by @clydebarrow
- [mipi] Add type to models for better type hinting downstream esphome#10475 by @jesserockz
- Add JPEG encoder support via new camera_encoder component esphome#9459 by @DT-art1 (new-component) (new-feature)
- [sntp] Use callbacks to trigger
on_time_sync
for ESP32 and ESP8266 esphome#10390 by @kaechele - [display] Allow page actions to have auto generated display id esphome#10460 by @jesserockz
- [nrf52] add dfu esphome#9319 by @tomaszduda23 (new-feature)
- [bluetooth_proxy] Expose configured scanning mode in API responses esphome#10490 by @bdraco (new-feature)
- [nrf52] fix missing bootloader esphome#10519 by @tomaszduda23
- [wifi] Guard wifi error cases introduced in IDF5.2 by a version check esphome#10466 by @gnumpi
- [core] Fix timezone offset calculation esphome#10426 by @eyal0
- [core] Replace magic coroutine priority numbers with self-documenting CoroPriority enum esphome#10518 by @bdraco
- [esp32] Remove hardcoding of ulp esphome#10535 by @swoboda1337
- [core] Optimize fnv1_hash to avoid string allocations for static entities esphome#10529 by @bdraco
- [core] Use get_icon_ref() in entity platform logging to avoid string allocations esphome#10530 by @bdraco
- [sensor] Change state_class_to_string() to return const char* to avoid allocations esphome#10533 by @bdraco (breaking-change)
- [host] Fix memory allocation in preferences load() method esphome#10506 by @bdraco
- [core] Use get_device_class_ref() in entity platform logging to avoid string allocations esphome#10531 by @bdraco
- [core] Use get_unit_of_measurement_ref() in entity logging to avoid string allocations esphome#10532 by @bdraco
- [bluetooth_proxy] Change default for active connections to true esphome#10546 by @bdraco (breaking-change)
- [wifi] Check for esp32_hosted on no wifi variants esphome#10528 by @swoboda1337
- [wizard] extend the wizard dashboard API to allow upload and empty config options esphome#10203 by @maximmaxim345 (new-feature)
- [esp8266] Store GPIO initialization arrays in PROGMEM to save RAM esphome#10560 by @bdraco
- [esp8266] Reduce preference memory usage by 40% through field optimization esphome#10557 by @bdraco
- [i2c] Optimize memory usage with stack allocation for small buffers esphome#10565 by @bdraco
- [sps30] Tidy up, optimize esphome#10606 by @kbx81
- [sgp30] Tidy up, optimize esphome#10607 by @kbx81
- [sensirion_common] Tidy up, optimize esphome#10604 by @kbx81
- [esphome] ESP8266: Move OTA error strings to PROGMEM (saves 116 bytes RAM) esphome#10620 by @bdraco
- [logger] Use LogString for UART selection strings (saves 28 bytes RAM on ESP8266) esphome#10615 by @bdraco
- [sensor] ESP8266: Use LogString for state_class_to_string() to save RAM esphome#10617 by @bdraco
- [web_server] ESP8266: Store OTA response strings in PROGMEM (saves 52 bytes RAM) esphome#10616 by @bdraco
- [script] ESP8266: Store log format strings in PROGMEM (saves 240 bytes RAM) esphome#10614 by @bdraco
- [gpio] ESP8266: Store log strings in flash memory esphome#10610 by @bdraco
- [light] ESP8266: Store log strings in flash memory esphome#10611 by @bdraco
- [captive_portal] ESP8266: Move strings to PROGMEM (saves 192 bytes RAM) esphome#10600 by @bdraco
- [mdns] Move constant strings to flash on ESP8266 esphome#10599 by @bdraco
- [api] Store Noise protocol prologue in flash on ESP8266 esphome#10598 by @bdraco
- [esp8266][api] Store error strings in PROGMEM to reduce RAM usage esphome#10568 by @bdraco
- [sen5x] Various optimizing & tidying up esphome#10602 by @kbx81
- [esp8266] Store component warning strings in flash to reduce RAM usage esphome#10623 by @bdraco
- Atm90e32/26 device class fixes esphome#10629 by @davidmonro
- [core] Convert LOG_UPDATE_INTERVAL macro to function to reduce flash usage esphome#10636 by @bdraco
- [core] Skip redundant process_to_add() call when no scheduler items added esphome#10630 by @bdraco
- Fix DNS resolution inconsistency between logs and OTA operations esphome#10595 by @bdraco
- [core] Add memory pool to scheduler to reduce heap fragmentation esphome#10536 by @bdraco
- [esp8266][logger] Store LOG_LEVELS strings in PROGMEM to reduce RAM usage esphome#10569 by @bdraco
- [esphome] Store OTA component log strings in flash on ESP8266 esphome#10570 by @bdraco
- [gpio_expander] Add intelligent pin type selection to CachedGpioExpander template esphome#10577 by @bdraco
- [ota] Fix duplicate include and sort esphome#10643 by @jesserockz
- [pca6416a] Migrate to CachedGpioExpander to reduce I2C bus usage esphome#10587 by @bdraco
- [pca9554] Migrate to CachedGpioExpander to reduce I2C bus usage esphome#10571 by @bdraco
- [pcf8574] Migrate to CachedGpioExpander to reduce I2C bus usage esphome#10573 by @bdraco
- [sx1509] Migrate to CachedGpioExpander to reduce I2C bus usage esphome#10588 by @bdraco
- [mcp23016] Migrate to CachedGpioExpander to reduce I2C bus usage esphome#10581 by @bdraco
- [scheduler] Reduce SchedulerItem memory usage by 7.4% on 32-bit platforms esphome#10553 by @bdraco
- [mipi_rgb] Unified driver for MIPI RGB displays esphome#9892 by @clydebarrow (new-component) (new-feature) (new-platform)
- [api] Store plaintext error message in PROGMEM on ESP8266 esphome#10634 by @bdraco
- [core] Store component source strings in flash on ESP8266 (breaking change) esphome#10621 by @bdraco (breaking-change)
- [esp32] Reduce GPIO memory usage by 50% through bit-packing esphome#10556 by @bdraco
- [core] Fix serial upload regression from DNS resolution PR #10595 esphome#10648 by @bdraco
- Add I2S Audio Port for ESP32-C5/C6/H2 esphome#10414 by @ximex
- [core] Reduce unnecessary nesting in scheduler loop esphome#10644 by @bdraco
- [adc] Fix autorange negative coefficient bug causing incorrect voltage readings esphome#10549 by @edwardtfn
- [nextion] Increase delay before reboot to prevent TFT upload interruption esphome#10402 by @edwardtfn
- Sort codeowners using case-insensitive esphome#10651 by @jesserockz
- [core] Reduce flash usage by refactoring looping component partitioning esphome#10652 by @bdraco
- [core] Refactor insertion sort functions to eliminate code duplication esphome#10653 by @bdraco
- RingBuffer: Make partial writing optional esphome#10302 by @gnumpi
- allow to implement show_logs as external component esphome#10523 by @tomaszduda23
- [nrf52] add more tests esphome#10591 by @tomaszduda23
- [ms5611] remove delay in setup esphome#10658 by @mrtoy-me
- [api] Add timezone support to GetTimeResponse for automatic timezone synchronization esphome#10661 by @bdraco (new-feature)
- Allow both files and directories to be passed to update-all esphome#10575 by @swoboda1337
- [thermostat] General clean-up, optimization, properly support “auto” mode esphome#10561 by @kbx81
- [bl0940] extend configuration options of bl0940 device esphome#8158 by @dan-s-github (new-feature) (new-platform)
- [inkplate] Rename component and fix grayscale esphome#10200 by @JosipKuci (breaking-change)
- Bump ruff from 0.12.8 to 0.12.9 esphome#10239 by @dependabot[bot]
- Bump ruamel-yaml from 0.18.14 to 0.18.15 esphome#10310 by @dependabot[bot]
- Bump codecov/codecov-action from 5.4.3 to 5.5.0 esphome#10336 by @dependabot[bot]
- Bump ruff from 0.12.9 to 0.12.10 esphome#10362 by @dependabot[bot]
- Bump ruff from 0.12.10 to 0.12.11 esphome#10483 by @dependabot[bot]
- Bump esphome-dashboard from 20250814.0 to 20250828.0 esphome#10484 by @dependabot[bot]
- Bump aioesphomeapi from 39.0.0 to 39.0.1 esphome#10491 by @dependabot[bot]
- Bump pypa/gh-action-pypi-publish from 1.12.4 to 1.13.0 in /.github/workflows esphome#10572 by @dependabot[bot]
- Bump pytest from 8.4.1 to 8.4.2 esphome#10579 by @dependabot[bot]
- Bump codecov/codecov-action from 5.5.0 to 5.5.1 esphome#10585 by @dependabot[bot]
- Bump esphome-dashboard from 20250828.0 to 20250904.0 esphome#10580 by @dependabot[bot]
- Bump actions/setup-python from 5.6.0 to 6.0.0 esphome#10584 by @dependabot[bot]
- Bump actions/setup-python from 5.6.0 to 6.0.0 in /.github/actions/restore-python esphome#10586 by @dependabot[bot]
- Bump actions/github-script from 7.0.1 to 8.0.0 esphome#10583 by @dependabot[bot]
- Bump actions/stale from 9.1.0 to 10.0.0 esphome#10582 by @dependabot[bot]
- Bump ruff from 0.12.11 to 0.12.12 esphome#10578 by @dependabot[bot]
- Bump pytest-mock from 3.14.1 to 3.15.0 esphome#10593 by @dependabot[bot]
- Bump aioesphomeapi from 39.0.1 to 40.0.0 esphome#10594 by @dependabot[bot]
- Bump aioesphomeapi from 40.0.0 to 40.0.1 esphome#10596 by @dependabot[bot]
- Bump zeroconf from 0.147.0 to 0.147.2 esphome#10642 by @dependabot[bot]
- Bump pytest-cov from 6.2.1 to 6.3.0 esphome#10640 by @dependabot[bot]
- Bump aioesphomeapi from 40.0.1 to 40.0.2 esphome#10641 by @dependabot[bot]
- Bump pytest-cov from 6.3.0 to 7.0.0 esphome#10660 by @dependabot[bot]
- Bump aioesphomeapi from 40.0.2 to 40.1.0 esphome#10662 by @dependabot[bot]
Past Changelogs
- ESPHome 2025.8.0 - 20th August 2025
- ESPHome 2025.7.0 - 16th July 2025
- ESPHome 2025.6.0 - 18th June 2025
- ESPHome 2025.5.0 - 21st May 2025
- ESPHome 2025.4.0 - 16th April 2025
- ESPHome 2025.3.0 - 19th March 2025
- ESPHome 2025.2.0 - 19th February 2025
- ESPHome 2024.12.0 - 18th December 2024
- ESPHome 2024.11.0 - 20th November 2024
- ESPHome 2024.10.0 - 16th October 2024
- ESPHome 2024.9.0 - 18th September 2024
- ESPHome 2024.8.0 - 21st August 2024
- ESPHome 2024.7.0 - 17th July 2024
- ESPHome 2024.6.0 - 19th June 2024
- ESPHome 2024.5.0 - 15th May 2024
- ESPHome 2024.4.0 - 17th April 2024
- ESPHome 2024.3.0 - 20th March 2024
- ESPHome 2024.2.0 - 21st February 2024
- ESPHome 2023.12.0 - 20th December 2023
- ESPHome 2023.11.0 - 15th November 2023
- ESPHome 2023.10.0 - 18th October 2023
- ESPHome 2023.9.0 - 27th September 2023
- ESPHome 2023.8.0 - 16th August 2023
- ESPHome 2023.7.0 - 19th July 2023
- ESPHome 2023.6.0 - 21st June 2023
- ESPHome 2023.5.0 - 17th May 2023
- ESPHome 2023.4.0 - 19th April 2023
- ESPHome 2023.3.0 - 15th March 2023
- ESPHome 2023.2.0 - 15th February 2023
- ESPHome 2022.12.0 - 14th December 2022
- ESPHome 2022.11.0 - 16th November 2022
- ESPHome 2022.10.0 - 19th October 2022
- ESPHome 2022.9.0 - 21st September 2022
- ESPHome 2022.8.0 - 17th August 2022
- ESPHome 2022.6.0 - 15th June 2022
- ESPHome 2022.5.0 - 18th May 2022
- ESPHome 2022.4.0 - 20th April 2022
- ESPHome 2022.3.0 - 16th March 2022
- ESPHome 2022.2.0 - 16th February 2022
- ESPHome 2022.1.0 - 19th January 2022
- ESPHome 2021.12.0 - 11th December 2021
- ESPHome 2021.11.0 - 17th November 2021
- ESPHome 2021.10.0 - 20th October 2021
- ESPHome 2021.9.0 - 15th September 2021
- ESPHome 2021.8.0 - 18th August 2021
- Changelog - Version 1.20.0 - 21st July 2021
- Changelog - Version 1.19.0 - 16th June 2021
- Changelog - Version 1.18.0 - 19th May 2021
- Changelog - Version 1.17.0 - 4th May 2021
- Changelog - Version 1.16.0 - February 3, 2021
- Changelog - Version 1.15.0 - September 13, 2020
- Changelog - Version 1.14.0 - November 1
- Changelog - Version 1.13.0 - May 30th 2019
- Changelog - Version 1.12.0
- Changelog - Version 1.11.0
- Changelog - Version 1.10.0
- Changelog - Version 1.9.0
- Version 1.8.0
- Version 1.7.0