ESPHome 2026.2.0 - February 2026
Read the ESPHome 2026.2.0 release notes on the blog for the release overview, feature highlights, upgrade checklist, and breaking changes.
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)
- [esp32_rmt] Handle ESP32 variants without RMT hardware esphome#14001 by @swoboda1337 (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)
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
- [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
- [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
- [wifi] Fix ESP8266 DHCP state corruption from premature dhcp_renew() esphome#13983 by @bdraco
- [combination] Fix ‘coeffecient’ typo with backward-compatible deprecation esphome#14004 by @swoboda1337
- [fan] Fix preset_mode not restored on boot esphome#14002 by @swoboda1337
- [esp32_rmt] Handle ESP32 variants without RMT hardware esphome#14001 by @swoboda1337 (new-feature)
- [openthread] Fix compiler format warning esphome#14030 by @schdro
- [external_components] Clean up incomplete clone on failed ref fetch esphome#14051 by @swoboda1337
Dependency Changes
Section titled “Dependency Changes”- 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]