ESPHome 2026.2.0 - February 2026
Release Overview
Section titled “Release Overview”ESPHome 2026.2.0 is a performance and stability release. The focus is on making your devices compile faster, run leaner, and stay reliable over months of uptime.
Faster builds, smaller firmware. ESP32 Arduino builds compile 36% faster and produce 44% less flash and 50% less static RAM. ESP-IDF compiles are ~22% faster. A streamlined certificate bundle saves another 51KB of flash.
More stable, more responsive devices. CPU usage is down across the board: the BLE tracker loop uses ~85% less CPU, MQTT consolidation saves ~6.5% total device CPU, and the scheduler is 25% smaller. Unnecessary memory allocations have been eliminated from dozens of components, and ESP8266 devices recover significant RAM by moving strings to flash.
This release also introduces 3 new components (DLMS smart meter, CH423 I/O expander, SY6970 battery management), adds 7 new display models including ESP32-P4 Waveshare panels, expands the Zigbee platform, and hardens security with constant-time authentication and cryptographic random generation.
Upgrade Checklist
Section titled “Upgrade Checklist”- If you use
bmp581, update your configuration to usebmp581_i2cas the platform - If you use
on_openin cover automations, rename it toon_opened - If you have DSMR
fw_core_versionorfw_module_versionundersensor:, move them totext_sensor: - If you call Arduino library APIs directly in lambdas (e.g.,
Preferences,WiFi), add them toesphome: libraries: - If you connect to HTTPS servers using uncommon CAs, add
use_full_certificate_bundle: trueunderesp32: framework: advanced: - If you use BL0942 sensors, expect readings to change after recalibration to match corrected reference values
ESP32 Build Size and Compile Time Optimizations
Section titled “ESP32 Build Size and Compile Time Optimizations”ESP32 builds are faster and produce smaller firmware in this release, meaning shorter compile times and more room on your devices.
| Improvement | Savings | Details |
|---|---|---|
| Arduino selective compilation (#13623) | 36% faster builds, 44% less flash, 50% less static RAM | Unused Arduino libraries are no longer compiled or linked |
| ESP-IDF component exclusion (#13610, #13664) | ~22% faster ESP-IDF compiles | Unused ESP-IDF components are excluded at build time instead of compiled and discarded by the linker |
| Streamlined certificate bundle (#13574) | ~51KB flash saved | Default switched to Common CAs (~99% of websites); full bundle available via config |
| Skip precompiled Arduino libs (#13775) | ~40% faster first build, ~2GB disk saved | Stub replaces the ~270MB precompiled library download that isn’t needed when building from source |
| sdkconfig defaults (#13611) | Additional flash savings | Unused ESP-IDF features (debug stubs, PKCS#7, FAT) disabled by default |
Arduino numbers measured on an ESP32 Arduino build comparing before and after this release. ESP-IDF compile time measured across multiple optimization PRs. Actual savings depend on your configuration.
How it works: ESPHome now only compiles the parts of Arduino and ESP-IDF that your configuration actually uses. Built-in components automatically re-enable the libraries they need, so most users get these savings with zero configuration changes.
Who benefits most? Everyone on ESP32. If your firmware was close to flash limits, this may free enough space to add more components. If you were waiting on long compiles, expect noticeably faster builds. Users on ESP-IDF see the ~22% compile time improvement automatically. Arduino users see all three improvements.
External components that call cg.add_library() in their code generation work automatically. If you use external components or lambdas that rely on Arduino libraries without declaring them, you can add them to esphome: libraries:. See Breaking Changes for details.
Runtime Memory and Performance
Section titled “Runtime Memory and Performance”Your devices should be more responsive and more stable after this update. Across all platforms, we’ve reduced CPU usage, freed up RAM, and eliminated sources of memory fragmentation that can cause crashes after weeks or months of uptime.
ESP8266 RAM Recovery
Section titled “ESP8266 RAM Recovery”ESP8266 devices have only 80KB of RAM, so every byte matters. This release moves constant strings and lookup tables from RAM to flash across 19+ components, freeing up heap for actual device operation. Components updated include web_server (#13315), light (#13314), mqtt (#13546), wifi (#13349), debug (#13352), and 13 more via a new flash-based string table pattern (#13659) applied to uart (#13805), sprinkler (#13806), ssd1306 (#13814), and others.
Long-Term Stability
Section titled “Long-Term Stability”Devices that run for months can crash when repeated memory allocations fragment the heap. This release eliminates unnecessary runtime memory allocations across the codebase, including api (#13399), mqtt (#13434), thermostat (#13692), sprinkler (#13705), voice_assistant (#13689), and many others. On ESP8266, format strings are also moved to flash as part of these changes (#13258).
UART Batch Reads
Section titled “UART Batch Reads”16 UART-based components now read all available serial data at once instead of one byte per loop, reducing CPU overhead. Updated components include modbus (#13822), nextion (#13823), tuya (#13827), ld2410 (#13820), dsmr (#13826), and ld2450 (#13818).
CPU and Loop Optimizations
Section titled “CPU and Loop Optimizations”The esp32_ble_tracker loop uses ~85% less CPU thanks to state change tracking (#13337). Components like status (#13342) and globals (#13345) no longer run every loop iteration. The api (#13901) and core loop (#13900) were also tightened up, and mDNS polling was throttled on ESP8266 and RP2040 (#13917).
Scheduler Improvements
Section titled “Scheduler Improvements”The scheduler runs on every device and drives all timers and intervals. This release makes it smaller and more efficient: the core timer code is 25% smaller (#13899), memory allocations were removed from cleanup operations (#13837), and flash usage was reduced (#13214). Timer IDs are now type-safe to prevent collisions between components (#13882), and the set_retry API was deprecated in favor of set_interval/set_timeout (#13845).
MQTT Optimizations
Section titled “MQTT Optimizations”If you use MQTT, your devices will use noticeably less CPU and memory. Previously, every MQTT entity ran its own loop and rebuilt topic strings every iteration, causing thousands of unnecessary memory allocations per minute. This has been consolidated so entities are processed centrally (#13356), saving roughly 6.5% total device CPU with savings scaling with entity count.
Memory allocations were also removed from discovery messages (#13216), publish paths (#13372), topic building (#13434, #13812), and log forwarding (#13809).
Who benefits most? Users running MQTT instead of the native API, especially devices with many entities. The more entities you expose over MQTT, the bigger the improvement. If you’ve noticed high CPU usage or instability on MQTT devices, this update should help.
Security Hardening
Section titled “Security Hardening”Our first internal security audit in 2025.10.0 led to several deprecations, most of which were completed in 2026.1.0. This release started a new review cycle. No issues requiring deprecation were found, but we identified several additional hardening opportunities.
- Constant-time authentication - The dashboard (#13865) and web server (#13868) now use constant-time string comparisons for Basic Auth credential checks, preventing timing-based side-channel attacks
- Cryptographic random generation - The OTA component (#13863) and setup wizard (#13864) now use Python’s
secretsmodule for generating authentication nonces and fallback AP passwords, replacing less secure random sources - Protobuf parsing hardening - The API protobuf parser now guards against overlong varint encodings (#13870)
- Download path validation - The dashboard binary download handler now uses
Path.resolve()andrelative_to()for path validation instead of string replacement (#13867) - Auth header validation - The dashboard gracefully handles malformed Basic Auth headers instead of raising exceptions (#13866)
New Components
Section titled “New Components”DLMS/COSEM Smart Meter
Section titled “DLMS/COSEM Smart Meter”The new dlms_meter component adds support for smart meters using the DLMS/COSEM protocol, commonly used by European energy providers (#8009). The component connects via UART to an M-Bus adapter and supports encrypted communication with configurable decryption keys. Available sensors include voltage, current, and active power per phase, as well as energy totals and timestamps. Multiple provider-specific configurations are supported, including Netz NOE and EVN.
CH423 I/O Expander
Section titled “CH423 I/O Expander”The new ch423 component provides support for the CH423 I/O expander with 24 GPIO pins: 8 bidirectional I/O pins and 16 output-only pins (#13079). Based on the CH422G driver architecture, it communicates over I2C and can be used with standard GPIO binary sensors, switches, and outputs.
SY6970 Battery Management IC
Section titled “SY6970 Battery Management IC”The new sy6970 component supports the SY6970 battery management IC, commonly found in devices like the LilyGo T-Display S3 Pro (#13311). It provides:
- Voltage sensors - VBUS, battery, and system voltage monitoring
- Current sensors - Charge and precharge current measurement
- Binary sensors - Charging status, VBUS connection, and charge completion
- Text sensors - Bus status, charge status, and NTC temperature status
- Configurable charging - Set charge voltage, current limits, and enable/disable charging
Expanded Display Support
Section titled “Expanded Display Support”This release adds support for 7 new display models across multiple display platforms, with a particular focus on ESP32-P4 displays.
MIPI DSI displays:
- Waveshare ESP32-P4-WIFI6-TOUCH-LCD-7B - 7” touchscreen for the ESP32-P4 (#13608)
- Waveshare ESP32-P4-WIFI6-TOUCH-LCD-3.4C - 800x800 circular display (#13840)
- Waveshare ESP32-P4-WIFI6-TOUCH-LCD-4C - 720x720 circular display (#13840)
- Guition JC8012P4A1 - An affordable display panel (#13241)
- M5Stack Tab5 V2 - Updated revision using the ST7123 integrated display-touch driver (#12074)
MIPI SPI displays:
- ESP32-2432S028 variants - Added support for ILI9342, ILI9342A, and ST7789V driver chip variants of the popular Sunton board (#13340)
HUB75 LED matrix:
- Huidu HD-WF1 - Added pin configuration for the WF1 version of the Huidu board (#13341)
E-Paper:
- Waveshare 1.54-G - 4-color e-paper display based on the JD79660 controller (#13758)
Zigbee and nRF52 Platform Enhancements
Section titled “Zigbee and nRF52 Platform Enhancements”The Zigbee integration on nRF52 receives several important improvements in this release.
- Time synchronization - Zigbee end devices can now synchronize their clocks from the Zigbee coordinator, enabling time-based automations on battery-powered devices (#12236)
- Number component support - ESPHome number entities can now be exposed over Zigbee, expanding the set of entity types available for Zigbee-connected devices (#13581)
- Custom vendor OUI - Configure the IEEE 802.15.4 Vendor Organizationally Unique Identifier to replace Nordic Semiconductor’s default company ID with your own, or use a random address during development (#13580)
- Thread-safe task log buffer - A new
TaskLogBufferimplementation for nRF52/Zephyr using Zephyr’s nativempsc_pbufenables reliable multi-threaded logging, matching the capabilities already available on ESP32, Host, and LibreTiny (#13862)
LibreTiny Platform Update
Section titled “LibreTiny Platform Update”LibreTiny has been updated from v1.10.x to v1.12.1 (#13512, #13851), bringing new board support (WBR3, generic RTL8720CM, CR3L), a refactored Serial library with dynamic RX/TX pin changes, static IP support for Realtek AMB WiFi, improved OTA for Realtek AMBZ2, Beken BDK 3.0.78 support, and several WiFi stability fixes including watchdog resets during connection attempts on BK72xx.
Cover Component: Operation-Based Triggers and Conditions
Section titled “Cover Component: Operation-Based Triggers and Conditions”The cover component gains new triggers that fire based on movement state, making cover automations much more natural to write (#13471).
New triggers:
on_opening- Fires when the cover starts openingon_closing- Fires when the cover starts closingon_idle- Fires when the cover stops moving
New conditions:
cover.is_open- Check if a cover is fully opencover.is_closed- Check if a cover is fully closed
The existing on_open trigger has been renamed to on_opened (the old name is deprecated until 2026.8.0). Additionally, on_opened and on_closed now only fire on transitions to the fully open/closed state, fixing unintended repeated trigger firing that occurred on every state update.
New Sensor Features and Hardware Support
Section titled “New Sensor Features and Hardware Support”New hardware support:
- Plantower PMS1003, PMS3003, PMS9003M - Three additional particle sensor models are now supported by the pmsx003 component (#13640)
- Resol DeltaSol BS/2 - The vbus component now supports this solar controller with temperature, pump speed, heat quantity, and error sensors (#13762)
- BMP581 I2C/SPI split - The BMP581 pressure sensor has been split into
bmp581_baseandbmp581_i2ccomponents, preparing the way for future SPI support. Existing users will need to update their platform frombmp581tobmp581_i2c(#12485)
Sensor filter improvements:
max_deltafilter - A new filter that rejects measurement differences exceeding a configurable threshold, effectively removing outliers from sensor readings (#12605)
Debug component:
min_freeheap sensor - Reports the minimum free heap size since boot for ESP32 and LibreTiny platforms, useful for detecting memory high-water-mark usage (#13231)fragmentationsensor - Now available on ESP32 in addition to ESP8266 (#13231)
Additional Component Enhancements
Section titled “Additional Component Enhancements”- HTTP request custom CA certificates - ESP32 devices can now use
ca_certificate_pathto specify a PEM file for SSL verification, enabling HTTPS connections to servers with self-signed or custom CA certificates (#13552) - BTHome encrypted beacons - The bthome_mithermometer component now supports decrypting encrypted BTHome beacons from PVVX firmware using a bindkey, preventing spoofing with fake data over the air (#13428)
- Ethernet
on_connect/on_disconnecttriggers - The ethernet component now supports connection triggers, matching the functionality already available for WiFi (#13677) - HeatpumpIR ESP-IDF support - The heatpumpir component now works with the ESP-IDF framework, not just Arduino (#13042)
- Select condition - A new
select.iscondition allows checking the value of a select entity in automations (#13267) - MQTT cover JSON state payload - Covers can now publish position, tilt, and state as a single JSON payload on one topic, reducing MQTT message volume (#12639)
- Key collector text sensor - The key_collector component now supports a text sensor platform and accepts multiple key input sources (#13617)
- Template water heater improvements - Added
target_temperaturelambda (#13661) and On/Off and Away mode support (#13839) - Nextion configurable timeouts - The
startup_override_msandmax_queue_ageconstants are now configurable via YAML, allowing users to tune timing for their specific displays (#11098) - Voice assistant timer optimization - Timer storage switched from
unordered_maptovector, eliminating per-tick heap allocation and string copies for the hot path that runs every second (#13857)
Looking Ahead
Section titled “Looking Ahead”This release continues the work that began in 2025.10.0 and accelerated in 2026.1.0: making ESPHome leaner and more reliable on every platform. Fewer heap allocations, smaller firmware, and lower CPU usage all contribute to devices that stay stable for months and years. That focus on memory discipline and long-term stability will continue in future releases as we extend these improvements to more components and platforms.
On the documentation side, esphome.io has migrated from Hugo to Starlight, bringing faster page loads, improved search, and a modern documentation framework that will make it easier to maintain and contribute to the docs going forward.
Breaking Changes
Section titled “Breaking Changes”Most users can update without any configuration changes. The items below are grouped by whether you need to take action.
Action required (if you use these components)
Section titled “Action required (if you use these components)”-
BMP581: Update your platform from
bmp581tobmp581_i2c. The component has been split to prepare for future SPI support. #12485 -
Cover triggers: Rename
on_opentoon_openedin your cover automations (the old name is deprecated until 2026.8.0). Additionally,on_openedandon_closednow only fire on transitions to the fully open/closed state, not on every state update. Automations that relied on repeated firing will need to be adjusted. #13471 -
DSMR: Move
fw_core_versionandfw_module_versionfromsensor:totext_sensor:. The meter returns version strings (e.g.,(ER11)), not numbers. #13780 -
Arduino library APIs in lambdas: If you directly call Arduino library APIs in lambdas (e.g.,
Preferences,WiFi,Wire), add them to your config. ESPHome’s built-in components handle this automatically, so this only affects custom lambda code. #13623esphome:libraries:- Preferences # Add any Arduino libraries you use directly -
Voice Assistant timers: If you use lambdas that iterate timers with map pair semantics (
.second), update them to accessTimerfields directly. See the PR description for before/after examples. #13857
Most users unaffected
Section titled “Most users unaffected”These changes improve correctness or save resources. They only require action if you depend on the previous behavior.
-
ESP32 certificate bundle: The default TLS bundle now includes only Common CAs (~99% of websites), saving ~51KB of flash. If you connect to HTTPS services using uncommon CAs, add
use_full_certificate_bundle: trueunderesp32: framework: advanced:. #13574 -
BL0942: Calibration reference values have been corrected to match datasheet formulas. Sensor readings will change. Users with custom calibration may need to re-calibrate. #12867
-
Sensor clamp filter: The
clampfilter now handles infinity and NaN instead of passing them through. #13457 -
Water Heater: On/Off and Away state control now requires both Home Assistant 2026.3.0 and ESPHome 2026.2.0. #13892
Breaking Changes for Developers
Section titled “Breaking Changes for Developers”- ESP32 Arduino selective compilation: Arduino libraries are now disabled by default. External components that use Arduino libraries must call
cg.add_library("LibraryName", None)in theirto_code()to enable them. #13623 - Voice Assistant
get_timers()return type:get_timers()now returnsconst std::vector<Timer> &instead ofconst std::unordered_map<std::string, Timer> &. Code using map pair semantics (.second) must be updated to iterateTimerdirectly. Theon_timer_tickautomation arg type is nowconst std::vector<Timer> &. #13857 - Cover
on_openrenamed toon_opened: TheCoverOpenTriggernow tracks transitions instead of firing on every state update. The oldon_openname is deprecated until 2026.8.0. #13471 - Water Heater API:
WATER_HEATER_COMMAND_HAS_STATEis deprecated in favor ofWATER_HEATER_COMMAND_HAS_ON_STATEandWATER_HEATER_COMMAND_HAS_AWAY_STATEfor granular on/off and away control. #13892
For detailed migration guides and API documentation, see the ESPHome Developers Documentation.
Full list of changes
Section titled “Full list of changes”The lists below are grouped by tag and may contain duplicates across sections.
New Features
Section titled “New Features”- [debug] Add min_free heap sensor for ESP32 and LibreTiny, add fragmentation for ESP32 esphome#13231 by @bdraco (new-feature)
- [mipi_dsi] add JC8012P4A1 esphome#13241 by @remcom (new-feature)
- [select] Add condition for testing select option esphome#13267 by @clydebarrow (new-feature)
- [mipi_spi] Add variants of ESP32-2432S028 displays esphome#13340 by @clydebarrow (new-feature)
- [sensor] Enhance delta filter with a max value esphome#12605 by @polyfloyd (new-feature)
- [heatpumpir] Add ESP-IDF support, bump to 1.0.40 esphome#13042 by @swoboda1337 (new-feature)
- [nextion] Add configurable startup and queue timeout constants esphome#11098 by @edwardtfn (new-feature)
- [mipi_dsi] Add M5Stack Tab5 (Rev2/V2) DriverChip esphome#12074 by @miniskipper (new-feature)
- [bthome_mithermometer] add encrypted beacon support esphome#13428 by @nagyrobi (new-feature)
- [sensor] Clamp filter handles non-finite values better esphome#13457 by @clydebarrow (new-feature) (breaking-change)
- [sy6970] Implement support for the sy6970 BMS component esphome#13311 by @linkedupbits (new-component) (new-feature) (new-platform)
- [http_request] Add custom CA certificate support for ESP32 esphome#13552 by @swoboda1337 (new-feature)
- [hub75] Add Huidu HD-WF1 board configuration esphome#13341 by @sehraf (new-feature)
- [nrf52,zigbee] Time synchronization esphome#12236 by @tomaszduda23 (new-feature) (new-platform)
- [nrf52,zigbee] Address change esphome#13580 by @tomaszduda23 (new-feature)
- [esp32] Add advanced sdkconfig options to reduce build time and binary size esphome#13611 by @bdraco (new-feature)
- [nrf52,zigbee] Support for number component esphome#13581 by @tomaszduda23 (new-feature)
- [esp32] Reduce compile time by excluding unused IDF components esphome#13610 by @bdraco (new-feature)
- [ch423] Add CH423 I/O expander component esphome#13079 by @dwmw2 (new-component) (new-feature)
- [pmsx003] support device-types
PMS1003,PMS3003,PMS9003Mesphome#13640 by @ximex (new-feature) - [dlms_meter] Add dlms smart meter component esphome#8009 by @SimonFischer04 (new-component) (new-feature) (new-platform)
- [ethernet] Add on_connect and on_disconnect triggers esphome#13677 by @rogerfachini (new-feature)
- Add WAVESHARE-ESP32-P4-WIFI6-TOUCH-LCD-7B mipi_dsi driver esphome#13608 by @agillis (new-feature)
- [key_collector] Add text sensor and allow multiple callbacks esphome#13617 by @clydebarrow (new-feature) (new-platform)
- [cover] Add operation-based triggers and fix repeated trigger firing esphome#13471 by @Copilot (new-feature) (breaking-change)
- [vbus] Add DeltaSol BS/2 support with sensors and binary sensors esphome#13762 by @Bercek71 (new-feature)
- Add target_temperature to the template water heater esphome#13661 by @tronikos (new-feature)
- [epaper_spi] Add Waveshare 1.54-G esphome#13758 by @schdro (new-feature)
- [mipi_dsi] Add WAVESHARE-ESP32-P4-WIFI6-TOUCH-LCD 3.4C and 4C esphome#13840 by @gtjoseph (new-feature)
- [ld2450] add on_data callback esphome#13601 by @ccutrer (new-feature)
- [water_heater] Add On/Off and Away mode support to template platform esphome#13839 by @tronikos (new-feature)
- [logger] Add nRF52 task log buffer and unify TaskLogBuffer interface esphome#13862 by @tomaszduda23 (new-feature)
- [mqtt.cover] Add option to publish states as JSON payload esphome#12639 by @heythisisnate (new-feature)
New Components
Section titled “New Components”- [bmp581] Split into
bmp581_baseandbmp581_i2cesphome#12485 by @danielkent-net (new-component) (breaking-change) (new-platform) - [sy6970] Implement support for the sy6970 BMS component esphome#13311 by @linkedupbits (new-component) (new-feature) (new-platform)
- [ch423] Add CH423 I/O expander component esphome#13079 by @dwmw2 (new-component) (new-feature)
- [dlms_meter] Add dlms smart meter component esphome#8009 by @SimonFischer04 (new-component) (new-feature) (new-platform)
New Platforms
Section titled “New Platforms”- [bmp581] Split into
bmp581_baseandbmp581_i2cesphome#12485 by @danielkent-net (new-component) (breaking-change) (new-platform) - [sy6970] Implement support for the sy6970 BMS component esphome#13311 by @linkedupbits (new-component) (new-feature) (new-platform)
- [nrf52,zigbee] Time synchronization esphome#12236 by @tomaszduda23 (new-feature) (new-platform)
- [dlms_meter] Add dlms smart meter component esphome#8009 by @SimonFischer04 (new-component) (new-feature) (new-platform)
- [key_collector] Add text sensor and allow multiple callbacks esphome#13617 by @clydebarrow (new-feature) (new-platform)
Breaking Changes
Section titled “Breaking Changes”- [sensor] Clamp filter handles non-finite values better esphome#13457 by @clydebarrow (new-feature) (breaking-change)
- [bmp581] Split into
bmp581_baseandbmp581_i2cesphome#12485 by @danielkent-net (new-component) (breaking-change) (new-platform) - [esp32] Default to CMN certificate bundle, saving ~51KB flash esphome#13574 by @bdraco (breaking-change)
- [cover] Add operation-based triggers and fix repeated trigger firing esphome#13471 by @Copilot (new-feature) (breaking-change)
- [esp32] Reduce Arduino build size by 44% and build time by 36% esphome#13623 by @bdraco (breaking-change)
- [dsmr] Fix issue with parsing lines like
1-0:0.2.0((ER11))esphome#13780 by @PolarGoose (breaking-change) - [voice_assistant] Replace timer unordered_map with vector to eliminate per-tick heap allocation esphome#13857 by @bdraco (breaking-change)
- [api] Deprecate WATER_HEATER_COMMAND_HAS_STATE esphome#13892 by @tronikos (breaking-change)
- [bl0942] Update reference values esphome#12867 by @DjordjeMandic (breaking-change)
Beta Changes
Section titled “Beta Changes”- [schema-gen] fix Windows: ensure UTF-8 encoding when reading component files esphome#13952 by @glmnet
- [uart] Remove redundant mutex, fix flush race, conditional event queue esphome#13955 by @bdraco
- [api] Extract cold code from APIServer::loop() hot path esphome#13902 by @bdraco
- [pulse_meter] Fix early edge detection esphome#12360 by @LucasCZE
- [alarm_control_panel] Fix flaky integration test race condition esphome#13964 by @swoboda1337
- [docker] Suppress git detached HEAD advice esphome#13962 by @swoboda1337
- [api] Fix ESP8266 noise API handshake deadlock and prompt socket cleanup esphome#13972 by @bdraco
All changes
Section titled “All changes”- [lvgl] Use stack buffer for event code formatting, document justified str_sprintf usage esphome#13220 by @bdraco
- [web_server] Remove unused button_state_json_generator esphome#13235 by @bdraco
- [analyze_memory] Fix ELF section mapping for RTL87xx and LN882X platforms esphome#13213 by @bdraco
- [helpers] Add base85 support esphome#13254 by @kbx81
- [analyze_memory] Add nRF52/Zephyr platform support for memory analysis esphome#13249 by @bdraco
- [core] Add buf_append_printf helper for safe buffer formatting esphome#13258 by @bdraco
- [infrared, remote_base] Optimize IR transmit path for
web_serverbase85 data esphome#13238 by @kbx81 - [debug] Add min_free heap sensor for ESP32 and LibreTiny, add fragmentation for ESP32 esphome#13231 by @bdraco (new-feature)
- [core] Add —device hint when DNS resolution fails esphome#13240 by @bdraco
- [helpers] Support
base64urlencoding esphome#13264 by @kbx81 - [mipi_dsi] add JC8012P4A1 esphome#13241 by @remcom (new-feature)
- [mqtt] Replace sprintf with snprintf for friendly name hash esphome#13262 by @bdraco
- Add Claude Code PR workflow skill esphome#13271 by @swoboda1337
- [select] Add condition for testing select option esphome#13267 by @clydebarrow (new-feature)
- [remote_base] Replace unsafe sprintf with buf_append_printf; fix buffer overflow esphome#13257 by @bdraco
- [helpers] Add
base64_decode_int32_vectorfunction esphome#13289 by @kbx81 - [infrared, remote_base] Replace
base85withbase64urlfor web server infrared transmissions esphome#13265 by @kbx81 - [helpers] Remove
base85functions esphome#13266 by @kbx81 - [web_server] Skip defer on ESP8266 where callbacks already run in main loop esphome#13261 by @bdraco
- [core][opentherm] Add format_bin_to(), soft-deprecate format_bin() esphome#13232 by @bdraco
- [infrared][web_server] Implement initial
web_serversupport esphome#13202 by @kbx81 - [light] Store color mode JSON strings in flash on ESP8266 esphome#13314 by @bdraco
- [web_server] Use ESPHOME_F for canHandle domain checks to reduce ESP8266 RAM esphome#13315 by @bdraco
- [udp] Store addresses in flash instead of heap esphome#13330 by @bdraco
- [pipsolar] Store command strings in flash esphome#13336 by @bdraco
- [sun] Store text sensor format string in flash esphome#13335 by @bdraco
- [template] Store text initial_value in flash and avoid heap allocation in setup esphome#13332 by @bdraco
- [wireguard] Store configuration strings in flash instead of heap esphome#13331 by @bdraco
- [template] Store alarm control panel codes in flash instead of heap esphome#13329 by @bdraco
- [core] Add fnv1_hash_extend() string overloads, use in atm90e32 esphome#13326 by @bdraco
- [weikai] Replace bitset to_string with format_bin_to esphome#13297 by @bdraco
- [modbus_controller] Use stack buffers instead of heap-allocating string helpers esphome#13221 by @bdraco
- [core] Add str_endswith_ignore_case to avoid heap allocation in audio file type detection esphome#13313 by @bdraco
- [status] Convert to PollingComponent to reduce CPU usage esphome#13342 by @bdraco
- [socket] Eliminate heap allocations in set_sockaddr() esphome#13228 by @bdraco
- [uart] Replace unsafe sprintf with buf_append_printf in debugger esphome#13288 by @bdraco
- [rc522_spi] Replace unsafe sprintf with buf_append_printf esphome#13291 by @bdraco
- [tuya] Replace unsafe sprintf with snprintf in light color formatting esphome#13292 by @bdraco
- [wiegand] Replace heap-allocating to_string with stack buffers esphome#13294 by @bdraco
- [nextion] Replace to_string with stack buffer and fix unsafe sprintf esphome#13295 by @bdraco
- [sml] Use stack buffers instead of str_sprintf esphome#13222 by @bdraco
- [syslog] Use buf_append_printf for ESP8266 flash optimization esphome#13286 by @bdraco
- [ccs811] Use buf_append_printf for buffer safety and ESP8266 flash optimization esphome#13300 by @bdraco
- [esp8266] Use direct SDK calls instead of Arduino ESP class wrappers esphome#13353 by @bdraco
- [tuya] Use buf_append_printf for ESP8266 flash optimization esphome#13287 by @bdraco
- [uptime] Use buf_append_printf for ESP8266 flash optimization esphome#13282 by @bdraco
- [gpio] Use buf_append_printf in dump_summary for ESP8266 flash optimization esphome#13283 by @bdraco
- [esp32_hosted] Use stack buffer instead of str_sprintf for version string esphome#13226 by @bdraco
- [core][mqtt] Add str_sanitize_to(), soft-deprecate str_sanitize() esphome#13233 by @bdraco
- [homeassistant] Use buf_append_printf for ESP8266 flash optimization esphome#13284 by @bdraco
- [web_server] Simplify datetime formatting with buf_append_printf esphome#13281 by @bdraco
- [daikin_arc] Fix undefined behavior in sprintf calls esphome#13279 by @bdraco
- [tormatic] Use stack buffers instead of str_sprintf in debug methods esphome#13225 by @bdraco
- [zephyr] Avoid heap allocation in preferences key formatting esphome#13215 by @bdraco
- [cse7766] Use stack buffer for verbose debug logging esphome#13217 by @bdraco
- [ezo] Replace str_sprintf with stack-based formatting esphome#13218 by @bdraco
- [dfrobot_sen0395] Reduce heap allocations in command building esphome#13219 by @bdraco
- [toshiba] Replace to_string with stack buffer in debug logging esphome#13296 by @bdraco
- [gdk101] Use stack buffer to eliminate heap allocation for firmware version esphome#13224 by @bdraco
- [scheduler] Replace resize() with erase() to save ~ 436 bytes flash esphome#13214 by @bdraco
- [select][fan] Use StringRef for on_value/on_preset_set triggers to avoid heap allocation esphome#13324 by @bdraco
- [dfrobot_sen0395][pipsolar][sim800l][wl_134] Replace sprintf with snprintf/buf_append_printf esphome#13301 by @bdraco
- [template][event] Use StringRef for set_action and on_event triggers esphome#13328 by @bdraco
- [api] Use MAX_STATE_LEN constant for Home Assistant state buffer esphome#13278 by @bdraco
- [anova] Replace sprintf with bounds-checked alternatives esphome#13303 by @bdraco
- [mipi_spi] Add variants of ESP32-2432S028 displays esphome#13340 by @clydebarrow (new-feature)
- [dsmr] Avoid std::string allocation for decryption key esphome#13375 by @bdraco
- [voice_assistant] Deprecate Timer::to_string() in favor of heap-free to_str() esphome#13377 by @bdraco
- [network] Deprecate IPAddress::str() in favor of heap-free str_to() esphome#13378 by @bdraco
- [sprinkler] Eliminate std::string heap allocations esphome#13379 by @bdraco
- [sprinkler] Disable loops when idle to reduce CPU overhead esphome#13381 by @bdraco
- [esp32_ble] Deprecate ESPBTUUID::to_string() in favor of heap-free to_str() esphome#13376 by @bdraco
- [mqtt] Remove unnecessary defer in ESP8266 on_message callback esphome#13373 by @bdraco
- [shtcx] Use LogString for type to_string to save RAM on ESP8266 esphome#13370 by @bdraco
- [mqtt] Reduce heap allocations in publish path esphome#13372 by @bdraco
- [am43][lightwaverf][rf_bridge][spi_led_strip] Replace sprintf with safe alternatives esphome#13302 by @bdraco
- [ezo_pmp] Replace sprintf with bounds-checked snprintf esphome#13304 by @bdraco
- [debug] Use shared buf_append_printf helper from core esphome#13260 by @bdraco
- [statsd] Use direct appends and stack buffer instead of str_sprintf esphome#13223 by @bdraco
- [lock] Extract set_state_ helper to reduce code duplication esphome#13359 by @bdraco
- [cs5460a] Remove unnecessary empty loop override esphome#13357 by @bdraco
- [mqtt] Eliminate per-entity loop overhead and heap churn esphome#13356 by @bdraco
- [mapping] Use stack buffers for numeric key error logging esphome#13299 by @bdraco
- [helpers] Allow reading capacity of FixedVector esphome#13391 by @clydebarrow
- [sensor] Enhance delta filter with a max value esphome#12605 by @polyfloyd (new-feature)
- [datetime] Add const char * overloads for string parsing to avoid heap allocation esphome#13363 by @bdraco
- [wifi] ESP8266: Use direct SDK calls to reduce flash and heap allocation esphome#13349 by @bdraco
- [debug] ESP8266: Eliminate heap allocations from Arduino String functions esphome#13352 by @bdraco
- [api] Use stack buffers for noise handshake messages esphome#13399 by @bdraco
- [esp32_ble_tracker] Optimize loop with state change tracking for ~85% CPU reduction esphome#13337 by @bdraco
- [core] Eliminate global constructor overhead for component vectors esphome#13386 by @bdraco
- [cc1101] Add on_packet listener callback code (packet_transport) esphome#13344 by @jvanderneutstulen
- [json] Use ESP-IDF component registry for ArduinoJson on ESP32 esphome#13280 by @swoboda1337
- [esp32] Add support for native ESP-IDF builds esphome#13272 by @swoboda1337
- [core] Simplify LazyCallbackManager memory management esphome#13387 by @bdraco
- [esp32] [libretiny] Use stack buffer for preference comparison esphome#13398 by @bdraco
- [mdns] Use stack buffer for txt records on ESP32 esphome#13401 by @bdraco
- [logger] Use raw pointer for task log buffer to match tx_buffer pattern esphome#13402 by @bdraco
- [libretiny] Disable unused LWIP statistics to save RAM and flash esphome#13404 by @bdraco
- [web_server_idf] Use direct member for ListEntitiesIterator instead of unique_ptr esphome#13405 by @bdraco
- [ci] Block sprintf/vsprintf usage, suggest snprintf alternatives esphome#13305 by @bdraco
- [core] Avoid heap allocation in str_equals_case_insensitive with string literals esphome#13312 by @bdraco
- [audio] Bump esp-audio-libs to 2.0.3 esphome#13346 by @kahrendt
- [hc8, mhz19] Moving constant CONF_WARMUP_TIME to const.py esphome#13392 by @maikeljkwak
- [zephyr] Small build fixes for the logger/gpio subsystems esphome#13242 by @dawret
- [adc] Fix indent esphome#11933 by @tomaszduda23
- [heatpumpir] Add ESP-IDF support, bump to 1.0.40 esphome#13042 by @swoboda1337 (new-feature)
- [debug] Print reg0 value from config if mismatched on nrf52 esphome#11867 by @tomaszduda23
- Expose sockaddr to string formatter esphome#12351 by @elupus
- [esp32] Bump Arduino to 3.3.6, platform to 55.03.36 esphome#13438 by @swoboda1337
- [nextion] Add configurable startup and queue timeout constants esphome#11098 by @edwardtfn (new-feature)
- [mqtt] Use stack buffers for discovery message formatting esphome#13216 by @bdraco
- [mqtt] Reduce heap allocations in hot paths esphome#13362 by @bdraco
- [esp8266] Use SmallBufferWithHeapFallback in preferences esphome#13397 by @bdraco
- [alarm_control_panel] Reduce heap allocations in arm/disarm methods esphome#13358 by @bdraco
- [mipi_dsi] Add M5Stack Tab5 (Rev2/V2) DriverChip esphome#12074 by @miniskipper (new-feature)
- [bthome_mithermometer] add encrypted beacon support esphome#13428 by @nagyrobi (new-feature)
- [heatpumpir] Fix ambiguous millis() call with HeatpumpIR library esphome#13458 by @swoboda1337
- [sensor] Clamp filter handles non-finite values better esphome#13457 by @clydebarrow (new-feature) (breaking-change)
- [atm90e32] Fix dump_summary deprecation warning and remove stored cs_summary_ esphome#13465 by @bdraco
- [bmp581] Split into
bmp581_baseandbmp581_i2cesphome#12485 by @danielkent-net (new-component) (breaking-change) (new-platform) - [sensirion_common] Fix incorrect Big Endian conversion esphome#13492 by @mikelawrence
- [sen5x] Fix missing this-> on class members and member functions esphome#13497 by @mikelawrence
- [sensirion_common] Use SmallBufferWithHeapFallback helper esphome#13496 by @bdraco
- [thermostat] make comparisons consistent with documentation esphome#13499 by @meiser79
- [sen5x] Fix mangled serial number esphome#13491 by @mikelawrence
- [sen5x] Eliminate product name string esphome#13489 by @mikelawrence
- [sy6970] Implement support for the sy6970 BMS component esphome#13311 by @linkedupbits (new-component) (new-feature) (new-platform)
- [water_heater] Remove Component inheritance from base class esphome#13510 by @dhoeben
- [http_request] Add custom CA certificate support for ESP32 esphome#13552 by @swoboda1337 (new-feature)
- Add additional text_sensor filter tests esphome#13479 by @bdraco
- [http_request] Use stack allocation for MD5 buffer in OTA esphome#13550 by @bdraco
- [core] Add PROGMEM string comparison helpers and use in cover/valve/helpers esphome#13545 by @bdraco
- [libretiny] Bump to 1.11.0 esphome#13512 by @bdraco
- [mhz19] Refactor detection range logging to use LogString esphome#13541 by @bdraco
- [uln2003] Refactor step mode logging to use LogString esphome#13543 by @bdraco
- [light] Use member array instead of heap allocation in AddressableLightWrapper esphome#13503 by @bdraco
- [tm1638] Use member array instead of heap allocation for display buffer esphome#13504 by @bdraco
- [sml] Use constexpr std::array for START_SEQ constant esphome#13506 by @bdraco
- [mqtt] Use stack buffers for publish_state() topic building esphome#13434 by @bdraco
- [ci] Soft-deprecate str_sprintf/str_snprintf to prevent hidden heap allocations esphome#13227 by @bdraco
- [rp2040] Use SmallBufferWithHeapFallback for preferences esphome#13501 by @bdraco
- [wifi] Avoid heap allocation when building AP SSID esphome#13474 by @bdraco
- [core] Encapsulate entity preference creation to prepare for hash migration esphome#13505 by @bdraco
- [mqtt] Store command comparison strings in flash on ESP8266 esphome#13546 by @bdraco
- [factory_reset] Store reset reason comparison strings in flash on ESP8266 esphome#13547 by @bdraco
- [web_server_base] Update ESPAsyncWebServer to 3.9.5 esphome#13467 by @bdraco
- [nfc] Use StaticVector for NFC UID storage to eliminate heap allocation esphome#13507 by @bdraco
- [esp32] Eliminate dead exception class code via linker wraps esphome#13564 by @bdraco
- [libretiny] Regenerate boards for v1.11.0 esphome#13539 by @bdraco
- [hub75] Update esp-hub75 to 0.3.2 esphome#13572 by @stuartparmenter
- [web_server_idf] Replace heap-allocated url() with stack-based url_to() esphome#13407 by @bdraco
- [nextion] Fix alternative code path for
dump_device_infoesphome#13566 by @edwardtfn - [web_server] Add RP2040 platform support esphome#13576 by @bdraco
- [text_sensor] Use in-place mutation for filters to reduce heap allocations esphome#13475 by @bdraco
- [esp32] Default to CMN certificate bundle, saving ~51KB flash esphome#13574 by @bdraco (breaking-change)
- [nrf52] Move toolchain to platform esphome#13498 by @tomaszduda23
- [core] Add LOG_ENTITY_ICON/DEVICE_CLASS/UNIT_OF_MEASUREMENT macros esphome#13578 by @bdraco
- [hub75] Add Huidu HD-WF1 board configuration esphome#13341 by @sehraf (new-feature)
- [esp32] Add pin definitions for adafruit_feather_esp32s3_reversetft esphome#13273 by @dschafer
- [wifi] Filter scan results to only store matching networks esphome#13409 by @bdraco
- [nrf52,zigbee] Time synchronization esphome#12236 by @tomaszduda23 (new-feature) (new-platform)
- [runtime_stats] Eliminate heap churn by using stack-allocated buffer for sorting esphome#13586 by @bdraco
- [nrf52,zigbee] Address change esphome#13580 by @tomaszduda23 (new-feature)
- [globals] Convert restoring globals to PollingComponent to reduce CPU usage esphome#13345 by @bdraco
- [workflows] Refactor auto-label-pr script into modular JS esphome#13582 by @clydebarrow
- [waveshare_epaper] Add deprecation message esphome#13583 by @clydebarrow
- [workflows] Add deprecation check esphome#13584 by @clydebarrow
- [tx20] Eliminate heap allocations in wind sensor esphome#13298 by @bdraco
- [es8156] Add
bits_per_samplevalidation, comment code esphome#13612 by @kbx81 - [mdns] Do not broadcast registration when using openthread component esphome#13592 by @rwrozelle
- [esp32] Add advanced sdkconfig options to reduce build time and binary size esphome#13611 by @bdraco (new-feature)
- [const] Move
CONF_AUDIO_DACesphome#13614 by @kbx81 - [nrf52,zigbee] Support for number component esphome#13581 by @tomaszduda23 (new-feature)
- [esp32] Reduce compile time by excluding unused IDF components esphome#13610 by @bdraco (new-feature)
- [ch423] Add CH423 I/O expander component esphome#13079 by @dwmw2 (new-component) (new-feature)
- [logger] Fix USB Serial JTAG VFS linker errors when using UART on IDF esphome#13628 by @bdraco
- [pmsx003] Improvements esphome#13626 by @ximex
- [core] ESP32 chip revision text esphome#13647 by @shvmm
- [web_server_base] Update ESPAsyncWebServer to 3.9.6 esphome#13639 by @bdraco
- [mqtt] Restore ESP8266 on_message defer to prevent stack overflow esphome#13648 by @bdraco
- [pmsx003] support device-types
PMS1003,PMS3003,PMS9003Mesphome#13640 by @ximex (new-feature) - [core] Simplify generation of Lambda during
to_code()esphome#13533 by @clydebarrow - [esp32] Disable unused per-tag log filtering, saving ~536 bytes RAM esphome#13662 by @bdraco
- [dlms_meter] Add dlms smart meter component esphome#8009 by @SimonFischer04 (new-component) (new-feature) (new-platform)
- [thermostat] Avoid heap allocation for triggers esphome#13692 by @bdraco
- [sx127x] Avoid heap allocation for packet trigger esphome#13698 by @bdraco
- [sx126x] Avoid heap allocation for packet trigger esphome#13699 by @bdraco
- [current_based] Avoid heap allocation for cover triggers esphome#13700 by @bdraco
- [api] Avoid heap allocation for homeassistant action triggers esphome#13695 by @bdraco
- [endstop] Avoid heap allocation for cover triggers esphome#13702 by @bdraco
- [template] Avoid heap allocation for valve triggers esphome#13697 by @bdraco
- [template] Avoid heap allocation for cover triggers esphome#13696 by @bdraco
- [template] Avoid heap allocation for number set trigger esphome#13694 by @bdraco
- [template.switch] Avoid heap allocation for triggers esphome#13691 by @bdraco
- [http_request] Avoid heap allocation for triggers esphome#13690 by @bdraco
- [bang_bang] Avoid heap allocation for climate triggers esphome#13701 by @bdraco
- [api] Avoid heap allocation for client connected/disconnected triggers esphome#13688 by @bdraco
- [voice_assistant] Avoid heap allocation for triggers esphome#13689 by @bdraco
- [sprinkler] Avoid heap allocation for triggers esphome#13705 by @bdraco
- [thermostat] Remove dead null checks for triggers esphome#13706 by @bdraco
- [template.lock] Avoid heap allocation for triggers esphome#13704 by @bdraco
- [feedback] Avoid heap allocation for cover triggers esphome#13693 by @bdraco
- [speaker.media_player] Avoid heap allocation for triggers esphome#13707 by @bdraco
- [time_based] Avoid heap allocation for cover triggers esphome#13703 by @bdraco
- [remote_transmitter] Avoid heap allocation for triggers esphome#13708 by @bdraco
- [template.datetime] Avoid heap allocation for triggers esphome#13710 by @bdraco
- [light] Avoid heap allocation for AutomationLightEffect trigger esphome#13713 by @bdraco
- [cc1101] Avoid heap allocation for trigger esphome#13715 by @bdraco
- [micro_wake_word] Avoid heap allocation for trigger esphome#13714 by @bdraco
- [template.text] Avoid heap allocation for trigger esphome#13711 by @bdraco
- [template.water_heater] Avoid heap allocation for trigger esphome#13712 by @bdraco
- [template.output] Avoid heap allocation for triggers esphome#13709 by @bdraco
- [ethernet] Add on_connect and on_disconnect triggers esphome#13677 by @rogerfachini (new-feature)
- [api] Align water_heater_command with standard entity command pattern esphome#13655 by @bdraco
- [time] Use lazy callback for time sync to save 8 bytes esphome#13652 by @bdraco
- [analyze-memory] Add top 30 largest symbols to report esphome#13673 by @bdraco
- [esp32_hosted] Replace sscanf with strtol for version parsing esphome#13658 by @bdraco
- [wizard] Use API encryption key instead of deprecated password esphome#13634 by @swoboda1337
- [sx126x] fix maximal payload_length esphome#13723 by @jktjkt
- [logger] Use vsnprintf_P directly for ESP8266 flash format strings esphome#13716 by @bdraco
- [esp32] Exclude additional unused IDF components (driver, dac, mcpwm, twai, openthread, ulp) esphome#13664 by @bdraco
- [preferences] Use static storage for singletons and flash buffer esphome#13727 by @bdraco
- [wifi] Conditionally compile on_connect/on_disconnect triggers esphome#13684 by @bdraco
- [water_heater] Store mode strings in flash and avoid heap allocation in set_mode esphome#13728 by @bdraco
- [media_player] Store command strings in flash and avoid heap allocation in set_command esphome#13731 by @bdraco
- [opentherm] Fix ESP-IDF build by re-enabling legacy driver component esphome#13732 by @bdraco
- [speaker.media_player]: Add verbose error message for puremagic parsing esphome#13725 by @rogerfachini
- Add WAVESHARE-ESP32-P4-WIFI6-TOUCH-LCD-7B mipi_dsi driver esphome#13608 by @agillis (new-feature)
- [lock] Store state strings in flash and avoid heap allocation in set_state esphome#13729 by @bdraco
- [key_collector] Add text sensor and allow multiple callbacks esphome#13617 by @clydebarrow (new-feature) (new-platform)
- [template] Add additional tests for template select esphome#13741 by @bdraco
- [dlms_meter] Rename test UART package key to match directory name esphome#13743 by @bdraco
- [template] Split TemplateSelect into TemplateSelectWithSetAction to save RAM esphome#13685 by @bdraco
- [mqtt] Stop sending deprecated color_mode and brightness in light discovery (fixes #13666) esphome#13667 by @tomers
- [api] Eliminate intermediate buffers in protobuf dump helpers esphome#13742 by @bdraco
- [pulse_counter][hlw8012] Fix ESP-IDF build by re-enabling legacy driver component esphome#13747 by @bdraco
- [web_server_idf] Add const char* overloads for getParam/hasParam to avoid temporary string allocations esphome#13746 by @bdraco
- [mqtt] Refactor state publishing with dedicated enum-to-string helpers esphome#13544 by @bdraco
- [adc] Add ESP32-C2 support for curve fitting calibration esphome#13749 by @swoboda1337
- [rtttl] Fix dotted note parsing order to match RTTTL spec esphome#13722 by @swoboda1337
- [adc] Fix ESP32-C2 ADC calibration to use line fitting esphome#13756 by @swoboda1337
- [pylontech] Refactor parser to support new firmware version and SysError esphome#12300 by @functionpointer
- [components] Remove redundant setup priority overrides that duplicate default esphome#13745 by @bdraco
- [cover] Add operation-based triggers and fix repeated trigger firing esphome#13471 by @Copilot (new-feature) (breaking-change)
- [esp32] Restore develop branch for dev platform version, bump platformio esphome#13759 by @swoboda1337
- [nrf52,zigbee] update warnings esphome#13761 by @tomaszduda23
- [epaper_spi] Validate BUSY pin as input instead of output esphome#13764 by @schdro
- Fix bare hostname ping fallback in dashboard esphome#13760 by @bdraco
- [logger] Refactor to reduce code duplication and flash size esphome#13750 by @bdraco
- [web_server] Fix ESP8266 watchdog panic by deferring actions to main loop esphome#13765 by @bdraco
- [web_server] Add some more missing ESPHOME_F macros esphome#13748 by @bdraco
- [esp32] Reduce Arduino build size by 44% and build time by 36% esphome#13623 by @bdraco (breaking-change)
- [esp32] Skip downloading precompiled Arduino libs esphome#13775 by @swoboda1337
- [esp32] Remove specific claims from framework migration message esphome#13777 by @swoboda1337
- [epaper_spi] Refactor initialise for future use esphome#13774 by @schdro
- [ci] Block new scanf() usage to prevent ~9.8KB flash bloat esphome#13657 by @bdraco
- [api] Remove is_single parameter and fix batch buffer preparation esphome#13773 by @bdraco
- [vbus] Add DeltaSol BS/2 support with sensors and binary sensors esphome#13762 by @Bercek71 (new-feature)
- [esp32] Use underscores in arduino_libs_stub folder name esphome#13785 by @swoboda1337
- [rdm6300] Add ID-20LA compatibility by skipping CR/LF bytes esphome#13779 by @swoboda1337
- [const] Move some constants to common esphome#13788 by @clydebarrow
- [esp32_ble_beacon] Fix BLE compilation on ESP-Hosted platforms esphome#13787 by @RAR
- [core] Add PROGMEM_STRING_TABLE macro for flash-optimized string lookups esphome#13659 by @bdraco
- [http_request] Fix chunked transfer encoding on Arduino platforms esphome#13790 by @bdraco
- [wifi] Defer ESP8266 WiFi listener callbacks from system context to main loop esphome#13789 by @bdraco
- [gpio] Convert interrupt_type_to_string to PROGMEM_STRING_TABLE esphome#13795 by @bdraco
- [core] Convert entity string lookups to PROGMEM_STRING_TABLE esphome#13794 by @bdraco
- [update] Move update_state_to_string to update component and convert to PROGMEM_STRING_TABLE esphome#13796 by @bdraco
- [light] Convert color_mode_to_human to PROGMEM_STRING_TABLE using to_bit() esphome#13797 by @bdraco
- [analyze-memory] Trace CSWTCH switch table symbols to source components esphome#13798 by @bdraco
- [wifi] Avoid jump tables in LOG_STR switch statements to save ESP8266 RAM esphome#13799 by @bdraco
- [light] Move CSWTCH lookup table to PROGMEM in get_suitable_color_modes_mask_ esphome#13801 by @bdraco
- [dsmr] Fix issue with parsing lines like
1-0:0.2.0((ER11))esphome#13780 by @PolarGoose (breaking-change) - [core] Add missing requests dependency to requirements.txt esphome#13803 by @swoboda1337
- [template] Convert alarm sensor type to PROGMEM_STRING_TABLE and narrow enum to uint8_t esphome#13804 by @bdraco
- [mqtt] Move switch string tables to PROGMEM_STRING_TABLE esphome#13802 by @bdraco
- Add target_temperature to the template water heater esphome#13661 by @tronikos (new-feature)
- [epaper_spi] Add Waveshare 1.54-G esphome#13758 by @schdro (new-feature)
- [epaper_spi] Declare leaf classes final esphome#13776 by @schdro
- [udp] Eliminate per-loop heap allocation using std::span esphome#13838 by @bdraco
- [api] Elide empty message construction in protobuf dispatch esphome#13871 by @bdraco
- [web_server_idf] Remove unused host() method esphome#13869 by @bdraco
- [dashboard] Use resolve/relative_to for download path validation esphome#13867 by @bdraco
- [wizard] Use secrets module for fallback AP password generation esphome#13864 by @bdraco
- [analyze-memory] Attribute CSWTCH symbols from SDK archives esphome#13850 by @bdraco
- [mqtt] Use stack buffer for discovery topic to avoid heap allocation esphome#13812 by @bdraco
- [mqtt] Return friendly_name_() by const reference to avoid string copies esphome#13810 by @bdraco
- [lps22] Replace set_retry with set_interval to avoid heap allocation esphome#13841 by @bdraco
- [api] Guard varint parsing against overlong encodings esphome#13870 by @bdraco
- [water_heater] Add state masking to distinguish explicit commands from no-change esphome#13879 by @tronikos
- [web_server_idf] Use C++17 nested namespace style esphome#13856 by @bdraco
- [e131] Remove unnecessary heap allocation from packet receive loop esphome#13852 by @bdraco
- [analyze-memory] Attribute third-party library symbols via nm scanning esphome#13878 by @bdraco
- [ota] Use secrets module for OTA authentication cnonce esphome#13863 by @bdraco
- [dashboard] Use constant-time comparison for username check esphome#13865 by @bdraco
- [scheduler] Eliminate heap allocation in full_cleanup_removed_items_ esphome#13837 by @bdraco
- [ms8607] Replace set_retry with set_timeout chain to avoid heap allocation esphome#13842 by @bdraco
- [speaker] Replace set_retry with set_interval to avoid heap allocation esphome#13843 by @bdraco
- [dashboard] Handle malformed Basic Auth headers gracefully esphome#13866 by @bdraco
- [esp32_hosted] Replace set_retry with set_interval to avoid heap allocation esphome#13844 by @bdraco
- [api] Collapse APIServerConnection intermediary layer esphome#13872 by @bdraco
- [mixer] Refactor for stability and to support Sendspin esphome#12253 by @kahrendt
- [web_server_base] Fix RP2040 compilation when Crypto-no-arduino is present esphome#13887 by @bdraco
- [api] Merge auth check into base read_message, eliminate APIServerConnection esphome#13873 by @bdraco
- [core] Deprecate set_retry, cancel_retry, and RetryResult esphome#13845 by @bdraco
- [cse7766] Batch UART reads to reduce loop overhead esphome#13817 by @bdraco
- [ld2450] Batch UART reads to reduce loop overhead esphome#13818 by @bdraco
- [ld2412] Batch UART reads to reduce loop overhead esphome#13819 by @bdraco
- [modbus] Use stack buffer instead of heap vector in send() esphome#13853 by @bdraco
- [ld2410] Batch UART reads to reduce loop overhead esphome#13820 by @bdraco
- [pipsolar] Batch UART reads to reduce per-loop overhead esphome#13829 by @bdraco
- [rd03d] Batch UART reads to reduce per-loop overhead esphome#13830 by @bdraco
- [rf_bridge] Batch UART reads to reduce per-loop overhead esphome#13831 by @bdraco
- [dfplayer] Batch UART reads to reduce per-loop overhead esphome#13832 by @bdraco
- [tuya] Batch UART reads to reduce per-loop overhead esphome#13827 by @bdraco
- [seeed_mr24hpc1/mr60fda2/mr60bha2] Batch UART reads to reduce per-loop overhead esphome#13825 by @bdraco
- [nextion] Batch UART reads to reduce loop overhead esphome#13823 by @bdraco
- [modbus] Batch UART reads to reduce loop overhead esphome#13822 by @bdraco
- [i2c] Replace switch with if-else to avoid CSWTCH table in RAM esphome#13815 by @bdraco
- [ci] Block new std::to_string() usage, suggest snprintf alternatives esphome#13369 by @bdraco
- [api] Skip class generation for empty SOURCE_CLIENT protobuf messages esphome#13880 by @bdraco
- [mipi_rgb] Allow use on P4 esphome#13740 by @clydebarrow
- [voice_assistant] Replace timer unordered_map with vector to eliminate per-tick heap allocation esphome#13857 by @bdraco (breaking-change)
- Add get_away and get_on in WaterHeaterCall and deprecate get_state esphome#13891 by @tronikos
- [nrf52,zigee] print reporting status esphome#13890 by @tomaszduda23
- [uart] Change available() return type from int to size_t esphome#13893 by @swoboda1337
- [mipi_dsi] Add WAVESHARE-ESP32-P4-WIFI6-TOUCH-LCD 3.4C and 4C esphome#13840 by @gtjoseph (new-feature)
- [scheduler] Make core timer ID collisions impossible with type-safe internal IDs esphome#13882 by @bdraco
- [uart] Convert parity_to_str to PROGMEM_STRING_TABLE esphome#13805 by @bdraco
- [logger] Resolve thread name once and pass through logging chain esphome#13836 by @bdraco
- [pylontech] Batch UART reads to reduce loop overhead esphome#13824 by @bdraco
- [hlk_fm22x] Replace per-cycle vector allocation with member buffer esphome#13859 by @bdraco
- [dlms_meter] Batch UART reads to reduce per-loop overhead esphome#13828 by @bdraco
- [ld2420] Batch UART reads to reduce loop overhead esphome#13821 by @bdraco
- [dsmr] Batch UART reads to reduce per-loop overhead esphome#13826 by @bdraco
- [uart] Fix available() return type to size_t across components esphome#13898 by @swoboda1337
- [ld2450] add on_data callback esphome#13601 by @ccutrer (new-feature)
- [api] Deprecate WATER_HEATER_COMMAND_HAS_STATE esphome#13892 by @tronikos (breaking-change)
- [water_heater] Add On/Off and Away mode support to template platform esphome#13839 by @tronikos (new-feature)
- [http_request] Fix IDF chunked response completion detection esphome#13886 by @bdraco
- [resampler] Refactor for stability and to support Sendspin esphome#12254 by @kahrendt
- [pulse_counter] Migrate from legacy PCNT API to new ESP-IDF 5.x API esphome#13904 by @swoboda1337
- [esp32_hosted] Bump esp_wifi_remote and esp_hosted versions esphome#13911 by @swoboda1337
- [esp32_rmt_led_strip, remote_receiver, pulse_counter] Replace hardcoded clock frequencies with runtime queries esphome#13908 by @swoboda1337
- [ci] Pin ESP-IDF version for Arduino framework builds esphome#13909 by @swoboda1337
- [api] Remove duplicate peername storage to save RAM esphome#13540 by @bdraco
- [ssd1306_base] Move switch tables to PROGMEM with lookup tables esphome#13814 by @bdraco
- [http_request] Reduce heap allocations in update check by parsing JSON directly from buffer esphome#13588 by @bdraco
- [bmp3xx_base/bmp581_base] Convert oversampling and IIR filter strings to PROGMEM_STRING_TABLE esphome#13808 by @bdraco
- [mqtt] Avoid heap allocation in on_log by using const char* publish overload esphome#13809 by @bdraco
- [rtttl] Convert state_to_string to PROGMEM_STRING_TABLE esphome#13807 by @bdraco
- [debug] Move ESP8266 switch tables to flash with PROGMEM_STRING_TABLE esphome#13813 by @bdraco
- [sprinkler] Convert state and request origin strings to PROGMEM_STRING_TABLE esphome#13806 by @bdraco
- [mqtt] Add zero-allocation topic getters to MQTT_COMPONENT_CUSTOM_TOPIC macro esphome#13811 by @bdraco
- [web_server_idf] Reduce heap allocations by using stack buffers esphome#13549 by @bdraco
- [libretiny] Update LibreTiny to v1.12.1 esphome#13851 by @bdraco
- [esp32] Fix ESP32-P4 test: replace stale esp_hosted component ref esphome#13920 by @swoboda1337
- [esp32] Upgrade uv to 0.10.1 and increase HTTP retries esphome#13918 by @swoboda1337
- [mdns] Throttle MDNS.update() polling on ESP8266 and RP2040 esphome#13917 by @bdraco
- [rtttl] Code Improvements esphome#13653 by @ximex
- [esp32_ble] Extract state transitions from ESP32BLE::loop() hot path esphome#13903 by @bdraco
- [api] Extract cold code from APIConnection::loop() hot path esphome#13901 by @bdraco
- [core] Extract dump_config from Application::loop() hot path esphome#13900 by @bdraco
- [scheduler] Reduce set_timer_common_ hot path size by 25% esphome#13899 by @bdraco
- [api] Fix compiler format warnings esphome#13931 by @schdro
- [web_server] Remove unnecessary packed attribute from DeferredEvent esphome#13932 by @bdraco
- [esp8266][rp2040] Eliminate heap fallback in preference save/load esphome#13928 by @bdraco
- [logger] Add nRF52 task log buffer and unify TaskLogBuffer interface esphome#13862 by @tomaszduda23 (new-feature)
- [light] Eliminate redundant clamp in LightCall::validate_() esphome#13923 by @bdraco
- [bl0942] Update reference values esphome#12867 by @DjordjeMandic (breaking-change)
- [web_server_idf] Use constant-time comparison for Basic Auth esphome#13868 by @bdraco
- [api] Split process_batch_ to reduce stack on single-message hot path esphome#13907 by @bdraco
- [mqtt.cover] Add option to publish states as JSON payload esphome#12639 by @heythisisnate (new-feature)
- [preferences] Replace per-element erase with clear() in sync() esphome#13934 by @bdraco
- [openthread] Fix warning on old C89 implicit field zero init esphome#13935 by @schdro
- [socket] Devirtualize Socket::ready() and implement working ready() for LWIP raw TCP esphome#13913 by @bdraco
- [api] Fix debug asserts in production code, encode_bool bug, and reduce flash overhead esphome#13936 by @bdraco
- [nrf52,zigbee] count sleep time of zigbee thread esphome#13933 by @tomaszduda23
- [wifi] Add CompactString to reduce WiFi scan heap fragmentation esphome#13472 by @bdraco
- [web_server_idf] Revert multipart upload buffer back to heap to fix httpd stack overflow esphome#13941 by @bdraco
- [web_server_idf] Remove std::string temporaries from multipart header parsing esphome#13940 by @bdraco
- [esp32] Bump Arduino to 3.3.7, platform to 55.03.37 esphome#13943 by @swoboda1337
- Allow Python 3.14 esphome#13945 by @swoboda1337
- [wifi] Allow fast_connect without preconfigured networks esphome#13946 by @QRPp
- [ethernet] Add per-PHY compile guards to eliminate unused PHY drivers esphome#13947 by @bdraco
- Bump resvg-py from 0.2.5 to 0.2.6 esphome#13211 by @dependabot[bot]
- Bump ruff from 0.14.11 to 0.14.12 esphome#13244 by @dependabot[bot]
- Bump actions/cache from 5.0.1 to 5.0.2 esphome#13276 by @dependabot[bot]
- Bump actions/cache from 5.0.1 to 5.0.2 in /.github/actions/restore-python esphome#13277 by @dependabot[bot]
- Bump ruff from 0.14.12 to 0.14.13 esphome#13275 by @dependabot[bot]
- Bump setuptools from 80.9.0 to 80.10.1 esphome#13429 by @dependabot[bot]
- Bump peter-evans/create-pull-request from 8.0.0 to 8.1.0 esphome#13430 by @dependabot[bot]
- Bump actions/checkout from 6.0.1 to 6.0.2 esphome#13452 by @dependabot[bot]
- Bump actions/setup-python from 6.1.0 to 6.2.0 esphome#13454 by @dependabot[bot]
- Bump actions/setup-python from 6.1.0 to 6.2.0 in /.github/actions/restore-python esphome#13453 by @dependabot[bot]
- Update wheel requirement from <0.46,>=0.43 to >=0.43,<0.47 esphome#13451 by @dependabot[bot]
- Bump ruff from 0.14.13 to 0.14.14 esphome#13487 by @dependabot[bot]
- Bump github/codeql-action from 4.31.10 to 4.31.11 esphome#13488 by @dependabot[bot]
- Bump github/codeql-action from 4.31.11 to 4.32.0 esphome#13559 by @dependabot[bot]
- Bump setuptools from 80.10.1 to 80.10.2 esphome#13558 by @dependabot[bot]
- Bump aioesphomeapi from 43.13.0 to 43.14.0 esphome#13557 by @dependabot[bot]
- Bump docker/login-action from 3.6.0 to 3.7.0 in the docker-actions group esphome#13606 by @dependabot[bot]
- Bump actions/cache from 5.0.2 to 5.0.3 esphome#13621 by @dependabot[bot]
- Bump actions/cache from 5.0.2 to 5.0.3 in /.github/actions/restore-python esphome#13622 by @dependabot[bot]
- Bump github/codeql-action from 4.32.0 to 4.32.1 esphome#13726 by @dependabot[bot]
- Bump ruff from 0.14.14 to 0.15.0 esphome#13752 by @dependabot[bot]
- Bump github/codeql-action from 4.32.1 to 4.32.2 esphome#13781 by @dependabot[bot]
- Bump setuptools from 80.10.2 to 82.0.0 esphome#13897 by @dependabot[bot]
- Bump aioesphomeapi from 43.14.0 to 44.0.0 esphome#13906 by @dependabot[bot]
- Bump esphome-dashboard from 20260110.0 to 20260210.0 esphome#13905 by @dependabot[bot]
- Bump docker/build-push-action from 6.18.0 to 6.19.1 in /.github/actions/build-image esphome#13937 by @dependabot[bot]