ESPHome 2026.3.0 - March 2026
Release Overview
Section titled “Release Overview”ESPHome 2026.3.0 is a performance-focused release with deep optimizations across the entire stack. The main loop is up to 99x faster on socket polling, light gamma correction is 8-10x faster, API protobuf encoding is 6-12x faster, and millis() is 2.5x faster, all reducing CPU overhead and improving responsiveness, especially on single-core chips and Bluetooth proxy devices. Flash savings of 11-20KB+ are achieved through printf wrapping, scanf removal, timezone refactoring, and aggressive devirtualization.
Alongside the performance work, a redesigned media player architecture with pluggable sources, playlists, and Ogg Opus support ships together with RP2040/RP2350 reaching first-class platform support — pico-sdk 2.0, 143+ board definitions, BLE foundations, crash diagnostics, and captive portal. A long-standing LWIP use-after-free bug that caused heap corruption crashes on ESP8266 (and RP2040) has been fixed — both platforms now pass stress testing. An 86-fix codebase correctness sweep from @swoboda1337 addresses buffer overflows, millis() overflow bugs, uninitialized variables, and logic errors across 100+ components. ESP32 gains an automatic crash handler that captures backtraces across reboots and reports them over the API — no serial cable needed. ESP32-P4 and ESP32-C5 gain expanded hardware support, nRF52 gets BLE OTA, and new components include SEN6x, HDC302x, dew point, and serial proxy.
Upgrade Checklist
Section titled “Upgrade Checklist”- If you use
openthermwith theopentherm_versionconfig key, rename it toopentherm_version_controller - If you use
speakermedia player and stream audio via hardcoded URLs (not through Home Assistant), setcodec_support_enabled: allto keep all codecs available - If you have an ESP32-P4 engineering sample (pre-rev3), add
engineering_sample: trueto youresp32:config - If you use
sgp30sensors, plan for up to 12 hours of recalibration after update as stored baselines will be invalidated by a serial number fix - If you use
nextionTFT uploads over slow networks, settft_upload_http_timeoutto a higher value (default changed from 15s to 4.5s) - If you use
timecomponent and have lambdas calling::mktime(),::strftime(),setenv("TZ", ...), ortzset()directly, update them to use ESPHome’sESPTimeAPI
Main Loop Performance Overhaul
Section titled “Main Loop Performance Overhaul”This release delivers a major performance overhaul to the core event loop, reducing CPU overhead and improving responsiveness across all platforms.
Socket Polling: Up to 99x Faster on ESP32
The lwip_select() system call has been replaced with direct LwIP socket reads and FreeRTOS task notifications on ESP32 (#14249). The old select() call cost ~133 us per loop iteration due to internal locking overhead. The new pre-sleep scan costs just ~1.3 us (99x faster), the active poll path costs ~7.5 us (17x faster), and the wake mechanism dropped from ~130 us to ~1.8 us (72x faster), freeing ~1.55% of total CPU time. On single-core chips (ESP32-C3, C6, H2), this directly improves BLE scan responsiveness by eliminating mutex contention with the WiFi/BLE stacks. The optimization was also extended to all LibreTiny platforms (bk72xx, rtl87xx, ln882x) (#14254), where real-world testing showed WiFi connection times dropping from up to 60s to under 30s.
Instant ISR Wake
GPIO binary sensors and touch sensors now wake the main loop immediately from interrupts instead of waiting up to ~16ms for the select timeout (#14383). UART wake-on-RX was also redesigned — replacing a FreeRTOS task + event queue (~3.9KB heap per UART) with a direct ISR callback at essentially zero cost (#14382). With the new near-zero-cost mechanism, wake-on-RX is now enabled by default on all ESP32 UARTs (#14391), and ESP8266 gained ISR wake support for GPIO binary sensors (#14392).
Native 64-bit Time and Faster millis()
A new millis_64() HAL function provides 64-bit uptime across all platforms, replacing the Scheduler’s rollover tracking (#14339). On ESP32, this reads esp_timer_get_time() directly (26 bytes, lock-free) instead of the 193-byte rollover reconstruction path. RP2040 uses time_us_64() from the hardware timer (#14356), and Host uses clock_gettime(CLOCK_MONOTONIC) (#14340). ESP8266 and LibreTiny use a lightweight software rollover tracker. Components like uptime and web_server now call millis_64() directly from hal.h instead of going through App.scheduler.
The millis() function itself — called once per component per loop iteration — was also optimized with a Euclidean decomposition that eliminates the __udivdi3 software 64-bit division routine, achieving 2-2.5x speedup on every call (#14409).
Loop Call Overhead
The main loop now calls component->loop() directly instead of going through call() → call_loop_() → loop(), eliminating 2 unnecessary function frames per component per iteration (#14451). On a device with 120 looping components, that’s 240 function frames removed per loop cycle. Trivial component state accessors (get_component_state(), is_failed(), etc.) were moved to inline header definitions, eliminating function call overhead for what amounts to single-byte loads (#14425). The is_high_frequency() check, called every loop iteration, was also inlined (#14423).
Cached Connection Checks
WiFi is_connected() now caches connection state as a simple bool field, eliminating expensive SDK calls on every invocation (#14463). The network::is_connected() and EthernetComponent::is_connected() functions were moved to headers as inline (#14464). OpenThread connection state is now updated via callback instead of polling with a mutex lock on every loop (#14484). The API server’s is_connected() was split into an inline fast path for the common no-arg case and an out-of-line path for state subscription checks, important for the BLE proxy hot path (#14574).
RP2040/RP2350: First-Class Platform Support
Section titled “RP2040/RP2350: First-Class Platform Support”The RP2040/RP2350 platform takes a major step toward first-class support in this release. The arduino-pico framework jumps from 3.9.4 to 5.5.0, bringing pico-sdk 2.0 and the GCC 14 toolchain (#14328). RP2350 (Pico 2 W) is now verified on real hardware with WiFi, debug sensors, and OTA all working, and the platform gains the same reliability, tooling, and developer experience that ESP32 users expect.
What the framework update brings:
- RP2350 hardware verified - Pico 2 W tested with WiFi, debug sensors, and OTA all working (429KB free heap)
- 143+ board definitions (up from 3) auto-generated from the arduino-pico repository, including all RP2350 variants (#14528)
- WiFi reliability fixes - Proper CYW43 link status detection, non-blocking WiFi join, and correct disconnect cleanup
New Capabilities:
- BLE foundation - New rp2040_ble component initializes BTstack on Pico W/Pico 2 W boards, laying the groundwork for BLE scanning and Bluetooth proxy support with only ~17KB overhead (#14603)
- BOOTSEL upload via picotool -
esphome uploadnow detects RP2040 devices in BOOTSEL mode, uploads with real-time progress, and automatically starts log output after reboot (#14483) - HardFault crash handler - A new crash handler captures register state and stack backtrace when a HardFault occurs, stores it across reboot via watchdog scratch registers, and logs it on next boot (#14685). The CLI’s serial log viewer auto-decodes addresses using
addr2line. Works on both RP2040 and RP2350. - Socket wake support - The fast select optimization was ported to RP2040, enabling efficient socket polling without
lwip_select()overhead (#14498) - WiFi AP and captive portal - WiFi AP mode and AP+STA fallback now work reliably on RP2040/RP2350, with 7 WiFi fixes in arduino-pico 5.5.1 (#14500). The captive portal component was also enabled for the platform (#14505)
Reliability:
- LWIP PCB use-after-free fixed - A long-standing bug where
tcp_close()left the PCB alive during the TCP close handshake, allowing LWIPrecv/errcallbacks to fire with dangling pointers after the socket object was destroyed, has been fixed (#14706). This causedumm_malloc_coreheap corruption crashes that have plagued ESP8266 reliability for years, and also affected RP2040. Both platforms now pass the 500-iteration rapid connect/disconnect stress test with 4 concurrent clients. - TCP race condition fixed - A critical race between lwip IRQ callbacks and the main loop on Pico W was identified and fixed, preventing heap corruption under concurrent API connections (#14679)
- Accept-in-IRQ heap corruption fixed - Socket accept callbacks on RP2040 no longer allocate memory in IRQ context, eliminating crashes under rapid connect/disconnect stress testing (#14687)
Flash and Performance:
- 9.2KB flash savings from printf stub optimization (#14622)
- Native
millis_64()using the hardware timer, eliminating software rollover tracking (#14356) - Faster
millis()via optimized 64-bit division, 2-2.5x faster on every call (#14409)
Note: The framework update is a breaking change for external components using old pico-sdk APIs (e.g., padsbank0_hw renamed to pads_bank0_hw, SerialPIO::NOPIN is now just NOPIN).
LibreTiny Platform Improvements
Section titled “LibreTiny Platform Improvements”The LibreTiny platforms (BK72xx, RTL87xx, LN882x) received a significant reliability and performance overhaul this release.
lwIP Memory Tuning (~26KB freed on BK72xx):
The SDK-default lwIP buffer sizes were tuned for WiFi Alliance throughput certification, not IoT devices. TCP_SND_BUF at 10xMSS (14.6KB per chunk) caused OOM on BK7231N when ESPAsyncWebServer allocated response buffers. Switching to system heap allocation (MEM_LIBC_MALLOC=1, MEMP_MEM_MALLOC=1) and right-sizing buffers freed ~26.5KB on BK7231N and ~20.2KB on RTL87xx (#14186). This also fixes OTA slowness on BK72xx caused by dedicated heap fragmentation during MSS-sized pbuf allocations. Socket counts are now auto-calculated from component registrations instead of hardcoded.
BK72xx Loop Stalls Fixed:
The BK72xx main task ran at FreeRTOS priority 3, below all WiFi (4-5) and LwIP (4) tasks, causing ~100ms loop stalls whenever WiFi background processing ran. Raising the priority to 6 (matching RTL87xx’s effective priority) dropped loop times from ~110ms to ~14ms (#14420).
Other Improvements:
- BK72xx -Os optimization - ESPHome source code now compiles with
-Oson BK72xx while the SDK stays at-O1, improving flash usage without triggering SDK bugs (#14322) - Fast select optimization - The ESP32 socket polling optimization was ported to all LibreTiny platforms, with real-world WiFi connection times dropping from up to 60s to under 30s (#14254)
- Direct SDK SSID retrieval - WiFi SSID queries now call vendor SDK functions directly instead of going through Arduino’s
String-allocatingWiFi.SSID()(#14349)
nRF52 Platform Improvements
Section titled “nRF52 Platform Improvements”The nRF52 platform gains critical OTA and debugging capabilities, thanks to @tomaszduda23.
BLE and Serial OTA:
- The new zephyr_mcumgr component enables over-the-air updates via BLE or serial using the MCUmgr protocol (#11932). This is a major step forward for nRF52 devices which previously lacked wireless update support.
Crash Debugging:
- Early boot debug messages are now available on nRF52, including boot reason logging and last crash PC/LR values stored in a no-init buffer (#11685). The logger waits up to 10 seconds for the CDC port to open, ensuring no early logs are lost.
BLE NUS UART:
- The
ble_nuscomponent now supports bidirectional UART communication over Bluetooth, compatible with tools like ble-serial (#14320).
Scheduler Performance
Section titled “Scheduler Performance”The scheduler drives all timers, intervals, and deferred callbacks on every device. This release includes 7 targeted optimizations:
- Defer queue lock halving - Lock acquisitions reduced from 2N+1 to N+1 for N deferred items, with the lock skipped entirely when the queue is empty (the common case) (#14107)
- Relaxed memory ordering - Atomic reads under the scheduler lock now use relaxed ordering since the lock already provides the necessary memory barrier (#14140)
- Atomic bool fix - GCC on Xtensa generated indirect function calls for
std::atomic<bool>::load()instead of inlining it. Switching tostd::atomic<uint8_t>eliminated 5 indirect calls on the hot path, saving 30 bytes (#14626) - Raw pointer lifecycle management - Replaced
unique_ptr<SchedulerItem>with explicit lifecycle management, eliminating 608 bytes of STL template instantiations (__adjust_heap,_M_realloc_append, etc.) and adding debug leak detection (#14620) - De-templated helpers - Consolidated scheduler helper functions to reduce code duplication (#14164)
- Rvalue std::function - Scheduler callbacks are now passed by rvalue reference, avoiding unnecessary copies (#14260)
- millis_64 extracted - The 32-bit rollover tracking code was moved out of the Scheduler into its own module, removing the dependency on
App.schedulerbeing initialized and allowingdefer()items to skip themillis_64()call entirely (#14360)
API and Protobuf Performance
Section titled “API and Protobuf Performance”The native API communication layer received over 20 targeted optimizations this release, particularly benefiting Bluetooth proxy devices where protobuf encoding is the dominant CPU cost.
Encoding Pipeline:
- Direct buffer writes - Protobuf encoding now writes through raw pointers to pre-sized buffers instead of
push_back(), achieving 6-12x faster encoding in benchmarks (#14018) - Protobuf devirtualization -
encode()andcalculate_size()are resolved at compile time instead of through virtual dispatch, achieving 2x fastercalculate_size()on sensor state messages and 2.5x less CPU time in the API component (#14449) - Single-pass BLE advertisement encoding - Eliminates 24 redundant
calculate_size()calls per BLE proxy flush, reducing encode time by 28% (#14575) - Zero-fill elimination - A custom
APIBufferreplacesstd::vector<uint8_t>for protobuf buffers, skipping unnecessary zero-initialization before every message encode, reducing API component CPU time by 43% on BLE proxy devices (#14593) - Force proto fields - BLE advertisement fields known to be non-default skip zero checks, saving 13% on
calculate_size()for BLE batches (#14610)
Parsing and Dispatch:
- Varint 32/64-bit split - Varint parsing uses fast 32-bit arithmetic for the common case (1-4 byte values), with 64-bit only when BLE fields require it, 25-50% faster on common paths (#14039)
- Varint fast paths inlined - Protobuf varint parsing and encoding hot paths were inlined for zero function-call overhead in tight loops (#14607, #14638)
- Frame helper devirtualization - When only one API protocol is configured (plaintext-only or noise-only), virtual dispatch is eliminated for all frame operations (#14468)
- Noise data path optimized - Redundant state machine checks eliminated from every packet read/write in the noise protocol path (#14629)
- Keepalive ping outlined - The keepalive/disconnect cold path was extracted from
APIConnection::loop(), reducing the hot loop body by 30% (374 to 263 bytes on Xtensa) since this code only fires once per minute (#14374)
Encryption:
- ChaCha20-Poly1305 optimized for embedded - ESPHome-maintained patches to libsodium replace unaligned byte loads with aligned 32-bit loads in the poly1305 and chacha20 implementations (#14632). On Xtensa, each unaligned
LOAD32_LEdecomposed into 4 byte-load instructions plus shifts; the patched path uses direct aligned loads. Every encrypted API packet benefits: 8-32% faster across all platforms (32% on ESP32, 24% on ESP32-S3, 21% on ESP32-C3, 12% on RTL87xx, 10% on ESP8266/BK72xx, 8% on RP2040, measured with 1KB packets).
Network Layer:
- Socket layer overhaul - The entire socket abstraction was devirtualized, converting the virtual base class to concrete per-platform types (
BSDSocketImpl,LwIPSocketImpl,LWIPRawImpl) with zero virtual methods (#14398). The compiler now fully inlines hot-path socket methods (read,write,writev,ready) directly into API frame helpers and OTA chunk handlers, eliminating vtable loads on every packet. Saves ~3KB flash on ESP32. Socket pointer caching (#14408) further inlined the entireready()chain to ~30 bytes with zero function calls. - Handshake timeout - 15-second timeout for completing API handshakes prevents connection slot exhaustion from stale half-open connections (#14050)
- Inlined send buffer fast path - The
try_to_clear_buffer()check on everysend_buffer()call is now inlined, avoiding a function call when the TX buffer is already clear (#14630)
BLE Event Processing:
- BLE event hot path optimized - Eliminated redundant operations in the ESP32 BLE event processing loop, including short-circuiting dropped-count checks (4 instructions instead of ~25 in the common case) and removing redundant event release calls (#14627)
Light Optimizations
Section titled “Light Optimizations”Runtime powf() calls in light gamma correction have been replaced with pre-computed PROGMEM lookup tables generated at compile time (#14123). A 5-channel RGBWW light transition frame dropped from 349 us to 36 us on ESP32 (8-10x faster) and from 456 us to 58 us on ESP8266. Addressable lights also save 512 bytes of heap per instance - the RAM gamma tables are eliminated entirely. The powf math library (~2.3KB flash) is no longer pulled into the binary for lights.
Light color interpolation now uses a lightweight lerp_fast instead of std::lerp (#14238), and static effect names are resolved to integer indices at code generation time instead of runtime string matching, saving 632 bytes on ESP8266 (#14265).
The powf elimination extends beyond lights - a new pow10_int() helper replaces powf(10, exp) in sensor filters and accuracy normalization, achieving up to 22x faster computation on ESP8266 and saving 3.1KB flash (#14114).
Logger Optimizations
Section titled “Logger Optimizations”The logger received 7 targeted optimizations recovering wasted RAM and reducing per-log-call overhead:
- UART heap waste eliminated - Removed the unused FreeRTOS event queue and oversized RX buffer from
uart_driver_install()on ESP32, recovering ~595 bytes of heap (#14168) - TX buffer compile-time sized - The transmit buffer is now an inline array instead of a separate heap allocation, consolidating two allocations into one (#14205)
- Loop disable fix - The logger’s no-op
loop()was running ~114x/s on all ESP32-S2/S3/C3/C5/C6/H2/P4 variants due to a wrong preprocessor guard (USE_LOGGER_USB_CDCinstead ofUSE_LOGGER_UART_SELECTION_USB_CDC) (#14158) - LogListener devirtualized - Replaced the
LogListenerabstract class with a lightweightLogCallbackstruct (function pointer + instance pointer), eliminating vtable overhead from every class that implemented it (#14084) - Logger and trigger marked final - Enables the compiler to devirtualize calls to
loop(),dump_config(), andget_setup_priority()(#14291) - Faster line number formatting - Replaced division-based formatting with subtraction loops, 1.8x faster on ESP8266 (no hardware divider) and 1.44x faster on ESP32-C3 (#14219)
- Hot path optimized - Eliminated null-check and call frame indirection from every log call, with early log detection in debug builds (#14538)
Memory and Flash Optimizations
Section titled “Memory and Flash Optimizations”Several significant optimizations reduce firmware size and RAM usage across all platforms.
Timezone Overhaul (~9.5KB flash on ESP32, ~2% RAM on ESP8266):
The entire libc timezone infrastructure has been replaced with a lightweight 32-byte struct parser (#13635). Previously, ESPHome pulled in libc’s scanf family (~9.8KB), environment variable infrastructure, and double-stored timezone data just to parse a string it already knew. The new implementation also provides consistent cross-platform timezone behavior with 126 unit tests, eliminating differences between newlib versions on different chips. Lambdas using ::mktime() or setenv("TZ", ...) directly may need to be updated.
| Platform | Flash Savings | RAM Savings |
|---|---|---|
| ESP32-IDF | ~9.5KB | 136 bytes |
| ESP8266 | ~4.1KB | ~850 bytes |
| LibreTiny | ~4.7KB | 148 bytes |
| RP2040 | ~3.7KB | 148 bytes |
printf/scanf Wrapping:
- ESP32 printf wrapping saves ~11KB flash -
printf(),vprintf(), andfprintf()are wrapped with lightweight stubs that redirect throughvsnprintf(), eliminating newlib’s_vfprintf_rdead code (#14362) - ESP8266 scanf removal saves ~8KB flash - The forced
-u _scanf_floatlinker flag has been removed, garbage-collecting the entire unusedscanffamily (#13678) - ESP8266 printf stubs save ~1.6KB flash (#14621)
- RP2040 printf stubs save ~9.2KB flash (#14622)
JSON Serialization Without Heap Allocation:
JSON serialization for web_server, MQTT, and API responses now uses a stack-first SerializationBuffer that handles 99.9% of payloads (up to 640 bytes) without any heap allocation (#13625). Previously, every JSON response built a std::string on the heap. The new buffer falls back to heap only for unusually large payloads (40+ select options, extreme climate presets). User service string arguments also switched from std::string to StringRef (#13974).
Preferences Heap Churn Eliminated:
Most preference saves (switches, fans, covers, numbers, rotary encoders) now use a small inline buffer instead of heap-allocating for every save operation (#13259). A union-based SmallInlineBuffer<8> stores data inline when 8 bytes or smaller, eliminating heap fragmentation from repeated preference writes on long-running devices.
Entity String Packing:
Entity string properties (device_class, unit_of_measurement, icon) were packed into PROGMEM-indexed uint8_t fields stored in struct padding bytes, replacing per-entity const char* pointers (#14171). This saves 8-12 bytes per entity with zero extra memory cost since the indices fit in alignment padding. Measured: +3,084 bytes free heap on ESP32-S3 (large config), +369 bytes on ESP8266. Application name and friendly_name were also converted from std::string to StringRef, saving 416-2,508 bytes flash and +308 bytes free heap on ESP8266 (#14532).
ESP8266 PROGMEM Optimizations:
- Icon strings moved to flash - Saves ~27 bytes per unique icon (~1KB for a config with 40 icons) (#14437)
- Device class strings moved to flash - Same treatment applied to device class strings, with deduplicated handling across MQTT and API (#14443)
- Static strings auto-wrapped in PROGMEM via
TemplatableValue(#13885) - Entity setup calls consolidated -
set_name+set_entity_stringsmerged into a singleconfigure_entity_()call, saving 124 bytes flash on a ~30 entity config (#14444) - IRAM freed - Removed unnecessary
IRAM_ATTRfromyield(),delay(),feed_wdt(), andarch_feed_wdt(), freeing ~22 bytes IRAM on ESP8266 (#14063)
ESP-IDF 5.5.3:
ESP-IDF has been bumped to 5.5.3 (#14122), fixing long-standing BLE bugs from 5.5.1 and 5.5.2 where Bluetooth would stop working on ESP32 devices. Users who experienced BLE connectivity drops or Bluetooth proxy failures should see these resolved. A follow-up bump to 5.5.3.1 (#14147) fixed a Bluedroid compile error, allowing the workaround that unconditionally enabled GATTS to be reverted.
Framework and Core Optimizations:
- Component devirtualization -
call_loop(),mark_failed(), andcall_dump_config()are now non-virtual, saving ~800+ bytes of flash from vtable elimination (#14083, #14355) - Compile-time loop detection - Components that don’t override
loop()are now detected at compile time and excluded from the loop list, eliminating runtime vtable probing (#14405) - Conditional filter compilation - Sensor, text sensor, and binary sensor filter infrastructure is now compiled out entirely when no filters are configured, saving flash and RAM (#14213, #14214, #14215)
- FLAC CRC validation disabled - Skipping internal CRC checks during FLAC decoding improves throughput by 15-20% (#14108)
- Codebase-wide constexpr migration - Over 20 PRs converted
static consttoconstexpracross core, API, BLE, NFC, MQTT, and display components, moving constants to flash and enabling compiler optimizations (#14071, #14127, #14129, and others) esphome::optionalreplaced withstd::optional- Eliminates a custom implementation in favor of the C++17 standard (#14368)
ESP32 Crash Handler
Section titled “ESP32 Crash Handler”A new crash handler for ESP32 devices using the ESP-IDF framework automatically captures backtraces when a crash occurs, stores them in .noinit memory (survives software reset), and logs the data on next boot (#14709). Crash data appears in esphome logs over the API — no serial cable needed — and in the Home Assistant log viewer when “Subscribe to logs” is enabled. The CLI automatically decodes addresses inline using addr2line.
The handler works on both Xtensa (ESP32, S2, S3) and RISC-V (C3, C6, H2, C2) architectures, capturing up to 16 backtrace frames with human-readable exception reasons. On RISC-V, stack-scanned entries are validated and labeled to distinguish from register-sourced frames. Memory cost is minimal: +92 bytes RAM, +1,092 bytes flash. No configuration needed — it’s automatically enabled for all ESP-IDF devices.
ESP32-P4 and ESP32-C5 Improvements
Section titled “ESP32-P4 and ESP32-C5 Improvements”ESP32-P4:
- Touch pad support - The
esp32_touchcomponent has been migrated to ESP-IDF v5.5’s unified touch sensor driver, adding ESP32-P4 as a supported variant with 14 touch channels (GPIO 2-15) (#14033) - Production silicon default - The default board now targets rev3+ production chips instead of engineering samples. Users with pre-rev3 dev kits should set
engineering_sample: true(#14139) - Execute from PSRAM - Code execution from PSRAM is now enabled for P4, expanding available instruction memory (#14329)
- LDO channels 1 & 2 - The
esp_ldocomponent now supports internal LDO channels with an explicitallow_internal_channelguard, useful for boards like the Waveshare ESP32-P4 where these channels power external peripherals (#14177)
ESP32-C5:
- Dual-band WiFi configuration - New
band_modeoption for selecting 2.4GHz, 5GHz, or auto band selection on the ESP32-C5’s dual-band radio, thanks to @swoboda1337 (#14148)
New Sensor Components
Section titled “New Sensor Components”This release adds support for several new sensor families.
SEN6x Environmental Sensor Node:
The new sen6x component supports Sensirion’s entire SEN6x product family (SEN62, SEN63C, SEN65, SEN66, SEN68, SEN69C) with up to 7 measurement channels: PM1.0/2.5/4.0/10, temperature, humidity, NOx, VOC, CO2, and formaldehyde (#12553). Each sensor variant automatically exposes only its available channels.
HDC302x Temperature & Humidity:
The new hdc302x component adds support for Texas Instruments’ high-precision HDC3020/3021/3022 sensors, including the IP67-rated HDC3022 with permanent PTFE dust and water protection (#10160).
Dew Point Calculator:
The new dew_point component calculates the dew point from any existing temperature and humidity sensors, without requiring additional hardware (#14441).
Serial Proxy (Experimental)
Section titled “Serial Proxy (Experimental)”The new serial_proxy component proxies UART communication to Home Assistant API clients over the network (#13944). This experimental component enables remote access to serial devices connected to ESPHome nodes, similar to how zwave_proxy bridges Z-Wave modems. Configure a UART bus and expose it as a named serial port with a specified type (TTL, RS232, RS485).
Display Support Expansion
Section titled “Display Support Expansion”Several new display models are now supported out of the box:
- Waveshare DSI touch panels - 5 new MIPI DSI models from 3.4” to 10.1” with touch support (#14023)
- Waveshare 7.5” 4-color e-Paper (H) - 800x480 display with black/white/yellow/red colors (#13991)
- WeAct 3-color e-paper - 2.13”, 2.9”, and 4.2” SSD1683-based displays with red/black/white (#13894)
- Waveshare 1.83” v2 - MIPI SPI panel with updated init sequence for the Rev2 PCB (#13680)
- Camera sensors without JPEG - The
esp32_cameracomponent now supports sensors like the GC0308 (m5stack AtomS3R-CAM) that output RGB565 instead of JPEG, with automatic software JPEG conversion (#9496) - 8-bit BMP support - The
runtime_imagecomponent now supports decoding 8-bit BMP images in addition to existing formats (#10733)
Codebase Correctness Sweep
Section titled “Codebase Correctness Sweep”@swoboda1337 contributed 86 bugfix PRs this release in a systematic audit of the codebase, fixing issues that had silently accumulated across 100+ components. The fixes span several categories:
- Buffer overflows and bounds checks (16 PRs) - Fixed out-of-bounds reads and writes in components including ld2410, ld2420, remote_receiver, fingerprint_grow, pn532, NFC, shelly_dimmer, and multiple display drivers (#14297, #14458, #14459, #14493, #14511, and others)
- millis() overflow bugs (11 PRs) - Fixed timeout and duration checks that would break after ~49 days of uptime in bl0942, shelly_dimmer, lcd_base, light transitions, BLE presence, pn532, mcp2515, nextion, and others (#14285, #14292, #14474, and others)
- Uninitialized variables (5 PRs) - Added default initializers to member variables across deep_sleep, remote_transmitter, sim800l, sen5x, and many other components (#14556, #14636, #14659)
- Logic and copy-paste bugs (9 PRs) - Fixed wrong operators, masks, and duplicated code in dfplayer, ads1115, alpha3, mpu6886, sht4x, and others (#14491, #14492, #14644)
- Unsigned integer underflows (multiple PRs) - Fixed wrap-around bugs in esp32_improv, rf_bridge, display, pipsolar, and addressable light effects (#14466, #14546)
- Division by zero guards - Added checks in tsl2561, bl0942, graph, combination sensor, and others (#14634)
- Malformed external input hardening - Added bounds checks for BLE advertisements, Nextion responses, Modbus frames, and UART-based sensors to prevent crashes from unexpected data (#14643, #14651)
New Media Player Architecture (speaker_source)
Section titled “New Media Player Architecture (speaker_source)”The media player has been redesigned around a modular source-based architecture to support the upcoming Sendspin multi-room audio protocol, thanks to @kahrendt. The new speaker_source media player replaces the monolithic speaker media player with a flexible orchestrator that routes audio from pluggable media_source components.
Key Features:
- Pluggable media sources - Audio can come from embedded audio_file files, HTTP streams, or future sources like Sendspin, each as a separate component
- Dual pipeline support - Separate media and announcement pipelines with independent speakers, formats, and sources, allowing announcements to play alongside music
- Full playlist management - Enqueue, next/previous track navigation, repeat (off/one/all), and shuffle with Fisher-Yates algorithm
- Volume persistence - Volume and mute state are saved across reboots with configurable min/max/increment
- Ogg Opus codec support - The new microOpus library enables decoding Opus audio streams, completing the codec lineup alongside FLAC and MP3 (#13967)
- Smarter codec builds - The
codec_support_enabledoption now defaults toneeded, building only the codecs your configuration actually requires instead of all three (users streaming arbitrary URLs should setcodec_support_enabled: all) - Expanded media player commands - New
next,previous,repeat_all,shuffle,unshuffle,group_join, andclear_playlistactions (#12258)
The audio_file component lets you embed audio files (local or from URLs) directly into firmware for instant playback without network access. Files are decoded directly from flash, saving two buffer copies compared to the previous approach.
Other Notable Features
Section titled “Other Notable Features”!extend/!removeon all list components - A long-awaited feature:!extendand!removenow work on any list-based config entry (likeexternal_components) even when the component schema doesn’t declare anidfield, thanks to @swoboda1337 (#14682)- BLE connection parameters API - Bluetooth proxies can now adjust connection intervals on connected BLE devices, allowing integrations like yalexs-ble to switch from fast intervals (~7.5ms) to slow ones (~1000ms) after connection, significantly reducing battery drain on “Always Connected” devices like Yale/August locks (#14577)
- Safe mode explicit boot success - New
safe_mode.mark_boot_okaction lets you explicitly notify safe mode that a boot is successful, solving the issue for deep sleep devices that boot and sleep within the safe mode timeout window (#14306) - CC1101 runtime configuration - New actions to change frequency, modulation type, symbol rate, filter bandwidth, and other CC1101 radio settings on the fly (#14141)
- ESP32 BLE authentication - Configurable
min_key_size,max_key_size, andauth_req_modefor BLE security (#7138) - Speaker media player on/off - Media players now support explicit on/off power control (#9295)
- Integration sensor set action - New
setmethod to publish and save a specific value to an integration sensor (#13316) - LPS22DF pressure sensor - Support for the DF variant of the LPS22 pressure sensor family (#14397)
- OpenThread TX power - Configurable transmit power for OpenThread radios (#14200)
- HTTP request TLS buffer - Configurable TLS buffer size on ESP8266, required for modern web servers that send 16KB TLS records (#14009)
- UART debug prefix - New
debug_prefixoption to distinguish multiple UARTs in log output (#14525) - UART flush result - The
flush()method now returns a result indicating success/timeout, with configurable timeout via YAML (#14608) - Version text sensor
hide_hash- Option to restore the pre-2026.1 version string format without the git hash (#14251) - GT911 interrupt via IO expander - Touch interrupt line can now be routed through an IO expander (#14358)
- ESP32 hosted SDIO clock - Configurable SDIO clock frequency for
esp32_hostedWiFi (#14319) - Nextion configurable HTTP parameters - New options for TFT upload timeout, follow redirects, and useragent (#14234)
- UART mock integration tests - New integration test infrastructure enables automated testing of serial protocol components. The LD24xx family (LD2410, LD2412, LD2420, LD2450) and Modbus received comprehensive tests along with bug fixes (#14377, #14448, #14471, #14611, #14395)
Thank You, Contributors
Section titled “Thank You, Contributors”This release includes 480 pull requests from over 50 contributors. A huge thank you to everyone who made 2026.3.0 possible:
- @swoboda1337 - 101 PRs including an 86-fix correctness sweep across 100+ components, ESP32-C5 dual-band WiFi, and the
!extend/!removeconfig enhancement - @kahrendt - 20 PRs building the new media player architecture, Ogg Opus codec support, audio file component, and speaker pipeline infrastructure
- @tomaszduda23 - 11 PRs bringing the nRF52 platform forward with BLE OTA (zephyr_mcumgr), crash debugging, and USB CDC support
- @schdro - 8 PRs improving the OpenThread stack with TX power configuration, connection caching, and build optimizations
- @kbx81 - 8 PRs including the new serial proxy component, mixer speaker debounce, and UART flush improvements
- @ximex - 7 PRs with code quality improvements across rtttl, ESP32 pin validation, and time handling
- @clydebarrow - 6 PRs including the ESP32-P4 PSRAM execution, const cleanup, and USB UART fixes
- @rwrozelle - 4 PRs improving OpenThread with connection state caching and code quality
- @p1ngb4ck - 3 PRs adding UART debug prefix, ESP LDO channel support, and USB UART chip detection
- @diorcety - 3 PRs with cross-compiler compatibility and ESP-IDF build fixes
- @exciton - 2 PRs creating the Modbus integration test infrastructure and fixing timing bugs
- @pgolawsk - 2 PRs adding WeAct 3-color e-paper support and safe_mode improvements
- @edwardtfn - 2 PRs improving Nextion TFT upload error handling and configurable HTTP parameters
- @AndreKR - 2 PRs improving ESP8266 TLS logging and configurable buffer sizes
- @mikelawrence - 2 PRs refactoring Sensirion sensor library shared code
- @CFlix - 2 PRs including the new dew point sensor component
- @Rapsssito - 2 PRs for MQTT precision and BLE server testing
- @mebner86 - the new SEN6x sensor component
- @joshuasing - the new HDC302x sensor component
- @mcassaniti - explicit boot success marking for safe mode
- @rwagoner - climate preset, fan mode, and humidity support for web server
Also thank you to @ademuri, @anunayk, @bharvey88, @ccutrer, @corneliusludmann, @deirdreobyrne, @edenhaus, @Gnuspice, @gtjoseph, @jamesmyatt, @jesserockz, @JiriPrchal, @jpeletier, @LinoSchmidt, @lwratten, @lyubomirtraykov, @mahumpula, @mback2k, @melak, @nagyrobi, @netixx, @oarcher, @PedanticAvenger, @puddly, @RAR, @rsre, @sredman, @sxtfov, @Szpadel, @tuct, @tvogel, and @whitty for their contributions, and to everyone who reported issues, tested pre-releases, and helped in the community.
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)”- OpenTherm: The deprecated
opentherm_versionconfig option has been removed. Useopentherm_version_controllerinstead #14103 - ESP32-P4: The default board now targets production rev3+ silicon instead of engineering samples. If you have a pre-rev3 ESP32-P4 dev kit, add
engineering_sample: trueto youresp32:config #14139 - Speaker Media Player: The
codec_support_enabledoption now defaults toneededinstead of building all codecs. If you stream audio via hardcoded URLs (not through Home Assistant), setcodec_support_enabled: allto restore the previous behavior #13967 - SGP30: Fixed serial number truncation from 48-bit to 24-bit. This changes the preference hash, so existing stored baselines will no longer be found. Plan for up to 12 hours of recalibration #14478
- Time: If you have lambdas calling
::mktime(),::strftime(),setenv("TZ", ...), ortzset()directly, update them to use ESPHome’sESPTimeAPI. Most users are unaffected, and::localtime()continues to work #13635
Most users unaffected
Section titled “Most users unaffected”- RP2040: The arduino-pico framework has been updated from 3.9.4 to 5.5.0 (pico-sdk 2.0, GCC 14). Most user configs are unaffected, but external components targeting RP2040 may need updates #14328
- ESP8266/RP2040:
printf/vprintf/fprintfare now wrapped with lightweight stubs to save flash. External components that need full FILE*-based printf can setenable_full_printf: trueunder their platform config #14621, #14622 - Nextion: The TFT upload HTTP timeout default changed from 15s to 4.5s to prevent watchdog resets. Users with slow connections can increase it via the new
tft_upload_http_timeoutoption #14234 - OpenThread: The log level is now statically set based on the
esp32.framework.log_levelsetting instead of being dynamic #14456 - Micronova: A command queue has been added for read and write requests. Write requests are now prioritized, and read requests are deduplicated. This fixes silently ignored write requests and incomplete sensor updates #12268
- Time: The libc timezone infrastructure has been replaced with a lightweight custom parser, saving ~9.5KB flash on ESP32 and ~2% RAM on ESP8266. The
dump_config()output now shows human-readable timezone info (e.g.,UTC-6:00 (DST UTC-5:00)) instead of raw POSIX strings #13635 - Icons (ESP8266): Icon strings are now stored in PROGMEM (flash), with a maximum length of 63 characters. All standard
mdi:*icons are well under this limit #14437 - Device Classes (ESP8266): Device class strings are similarly moved to PROGMEM #14443
Undocumented API Changes
Section titled “Undocumented API Changes”These are changes to unstable, undocumented C++ APIs that may affect users who write lambdas or maintain external components. These APIs are not documented on esphome.io and are not part of the public API — they may change at any time without notice. Only APIs documented on esphome.io are considered stable. If you depend on these internals, you do so at your own risk. We list them here as a courtesy.
- EntityBase:
set_name(),set_icon(),set_device_class(),set_unit_of_measurement(),set_internal(),set_disabled_by_default(), andset_entity_category()have been removed and packed into the existingconfigure_entity_()call.set_device()is renamed toset_device_()and made protected. These were codegen-only setters — calling them at runtime was unsafe and could silently corrupt state or crash the device (undefined behavior). #14564, #14171, #14437, #14443 - Time: The libc functions
localtime()andlocaltime_r()are overridden on embedded platforms to use ESPHome’s custom timezone implementation. Thesetenv("TZ", ...)/tzset()path is no longer used internally. See the breaking changes section above for lambda migration guidance. #13635 - API ProtoMessage:
encode()andcalculate_size()are no longer virtual.ProtoSizeclass converted from accumulator-object API to pure static methods. Lambdas callingcalculate_size()should now call it directly on the message (returnsuint32_tinstead of populating aProtoSizeobject). #14449// BeforeProtoSize s;msg.calculate_size(s);uint32_t size = s.get_size();// Afteruint32_t size = msg.calculate_size(); - APIServer:
is_connected(bool state_subscription_only)overload removed. Useis_connected()(no args, inlined) for the common path, oris_connected_with_state_subscription()for the rare state-subscription-only check. #14574 - OTA: The
OTABackendabstract base class has been removed. Useautofor local variables frommake_ota_backend(), andota::OTABackendPtrfor member variables. Includeota_backend_factory.hinstead ofota_backend.h. #14473 - OpenThread: The OT console (
CONFIG_OPENTHREAD_CONSOLE_ENABLE) and OT diagnostics (CONFIG_OPENTHREAD_DIAG) are now disabled by default, saving up to ~22KB flash. Custom lambdas using the OT console or diagnostics C API will need to re-enable these via sdkconfig. #14390, #14399 - ByteBuffer:
put_uint24(value, offset)was writing 4 bytes instead of 3, corrupting the adjacent byte. Lambdas relying on the old (buggy) behavior may see different results. #14555
Breaking Changes for Developers
Section titled “Breaking Changes for Developers”Devirtualization
Section titled “Devirtualization”Several core virtual interfaces have been replaced with compile-time dispatch for performance. External components that override or depend on the virtual dispatch may need updates:
- Component:
call_loop(),mark_failed(), andcall_dump_config()devirtualized #14083, #14355 - Logger:
LogListenervirtual interface replaced withLogCallbackstruct #14084 - Socket: Socket abstraction layer devirtualized #14398
- OTA backend:
OTABackendabstract base class removed. Useota::OTABackendPtrtype alias andautoformake_ota_backend()return #14473 - Protobuf API:
encode()andcalculate_size()are now non-virtual onProtoMessage.ProtoSizeconverted to static methods.send_message()is now templated and deducesMESSAGE_TYPE#14449
Entity API changes
Section titled “Entity API changes”- Entity icon/device class API:
get_icon_ref(),get_icon(),get_device_class_ref(), andget_device_class()deprecated on non-ESP8266,static_asserterror on ESP8266. Useget_icon_to(std::span<char, MAX_ICON_LENGTH>)andget_device_class_to(std::span<char, MAX_DEVICE_CLASS_LENGTH>)instead #14437, #14443 - EntityBase setters:
set_name(),set_icon(),set_device_class(),set_unit_of_measurement(),set_internal(),set_disabled_by_default(),set_entity_category()removed (now packed intoconfigure_entity_()).set_device()renamed toset_device_()and made protected #14564, #14171, #14437, #14443 - Entity string properties: Packed into PROGMEM-indexed
uint8_tfields #14171
Type and container changes
Section titled “Type and container changes”- esphome::optional: Replaced with
std::optional#14368 - Application name/friendly_name: Changed from
std::stringtoStringRef#14532 - http_request headers:
std::mapandstd::listreplaced withstd::vector#14024, #14027 - SerializationBuffer: New stack-first JSON serialization buffer #13625
Removed deprecated APIs
Section titled “Removed deprecated APIs”- i2c: Deprecated
stopparameter overloads andreadv/writevmethods removed #14106 - ESP32 IDF components: Deprecated
add_idf_component()parameters removed #14105
Platform and component changes
Section titled “Platform and component changes”- RP2040 framework: arduino-pico 3.9.4 → 5.5.0 with pico-sdk 2.0. Key API renames:
padsbank0_hw→pads_bank0_hw,SerialPIO::NOPIN→NOPIN#14328 - UART flush(): Return type changed from
voidtoFlushResult. External components overridingflush()must update their signature #14608 - runtime_image:
ImageFormatenum moved fromesphome::online_imagetoesphome::runtime_image.OnlineImageconstructor signature changed #10212 - Modbus:
rx_full_thresholdsentinel added toUARTComponent; timeout calculation changed for non-hardware UARTs. External modbus components may need update #14614
Registration and build changes
Section titled “Registration and build changes”- register_component: Now protected, runtime checks removed #14371
- register_action: Now requires explicit
synchronous=parameter #14606 - build_info_data.h: Moved out of
application.hto fix incremental rebuilds #14230 - get_loop_priority: Conditionally compiled with
USE_LOOP_PRIORITY#14210
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”- [mipi_spi] Add Waveshare 1.83 v2 panel esphome#13680 by @schdro (new-feature)
- [epaper_spi] Add WeAct 3-color e-paper display support esphome#13894 by @pgolawsk (new-feature)
- [epaper_spi] Add Waveshare 7.5in e-Paper (H) esphome#13991 by @corneliusludmann (new-feature)
- [media_player] Add more commands to support Sendspin esphome#12258 by @kahrendt (new-feature)
- [audio, speaker] Add support for decoding Ogg Opus files esphome#13967 by @kahrendt (new-feature) (breaking-change)
- [esp32_camera] Add support for sensors without JPEG support esphome#9496 by @mback2k (new-feature)
- [esp32] Add engineering_sample option for ESP32-P4 esphome#14139 by @swoboda1337 (new-feature) (breaking-change)
- [wifi] Add band_mode configuration for ESP32-C5 dual-band WiFi esphome#14148 by @swoboda1337 (new-feature)
- [nrf52,logger] Early debug esphome#11685 by @tomaszduda23 (new-feature)
- [cc1101] actions to change general and tuner settings esphome#14141 by @sxtfov (new-feature)
- [hdc302x] Add new component esphome#10160 by @joshuasing (new-component) (new-feature) (new-platform)
- [version] text sensor add option
hide_hashto restore the pre-2026.1 behavior esphome#14251 by @nagyrobi (new-feature) - [esp_ldo] Add channels 1&2 support with additional option to enable it, add source voltage bypass/pass-through esphome#14177 by @p1ngb4ck (new-feature)
- [mipi_dsi] Add more Waveshare panels and comments esphome#14023 by @gtjoseph (new-feature)
- [esp32_touch] Migrate to new unified touch sensor driver (esp_driver_touch_sens) esphome#14033 by @swoboda1337 (new-feature)
- [esp32_ble] allow setting of min/max key_size and auth_req_mode esphome#7138 by @whitty (new-feature)
- [esp32_hosted] Add configurable SDIO clock frequency esphome#14319 by @deirdreobyrne (new-feature)
- [safe_mode] Add feature to explicitly mark a boot as successful esphome#14306 by @mcassaniti (new-feature)
- [esp32] Enable
execute_from_psramfor P4 esphome#14329 by @clydebarrow (new-feature) - [sen6x] Add SEN6x sensor support esphome#12553 by @mebner86 (new-component) (new-feature) (new-platform)
- [gt911] Support for interrupt line via IO Expander (resubmit) esphome#14358 by @PedanticAvenger (new-feature)
- [media_source] Add new Media Source platform component esphome#14417 by @kahrendt (new-component) (new-feature)
- [lps22] Add support for the LPS22DF variant esphome#14397 by @melak (new-feature)
- [openthread] Add tx power option esphome#14200 by @schdro (new-feature)
- [speaker] Add off on capability to media player esphome#9295 by @rwrozelle (new-feature)
- [integration] Add set method to publish and save sensor value esphome#13316 by @JiriPrchal (new-feature)
- [openthread] static log level code quality improvement esphome#14456 by @rwrozelle (new-feature) (breaking-change)
- [audio_file] New component for embedding files into firmware esphome#14434 by @kahrendt (new-component) (new-feature)
- [audio_file] Add media source platform esphome#14436 by @kahrendt (new-feature)
- [ble_nus] Add uart support esphome#14320 by @tomaszduda23 (new-feature)
- [rp2040] Fix Pico W LED pin and auto-generate board definitions for arduino-pico 5.5.x esphome#14528 by @bdraco (new-feature)
- [http_request] Make TLS buffer configurable on ESP8266 esphome#14009 by @AndreKR (new-feature)
- [uart][usb_uart] Add debug_prefix option to distinguish multiple defined uarts in log esphome#14525 by @p1ngb4ck (new-feature)
- [uart] Return
flushresult, expose timeout via config esphome#14608 by @kbx81 (new-feature) - [usb_uart] Return
flushresult, expose timeout via config esphome#14616 by @kbx81 (new-feature) - [nrf52, ota] ble and serial OTA based on mcumgr esphome#11932 by @tomaszduda23 (new-component) (new-feature) (new-platform)
- [serial_proxy] New component esphome#13944 by @kbx81 (new-component) (new-feature)
- [nextion] Add configurable HTTP parameters for TFT upload esphome#14234 by @edwardtfn (new-feature) (breaking-change)
- [rp2040] Use picotool for BOOTSEL upload and improve upload UX esphome#14483 by @bdraco (new-feature)
- [rp2040_ble] Add BLE component for RP2040/RP2350 esphome#14603 by @bdraco (new-component) (new-feature)
- [runtime_image] Add support for 8bit BMPs and fix existing issues esphome#10733 by @mahumpula (new-feature)
- [speaker_source] Add new media player esphome#14649 by @kahrendt (new-component) (new-feature) (new-platform)
- [dew_point] Add dew_point sensor component esphome#14441 by @CFlix (new-component) (new-feature) (new-platform)
- [speaker_source] Add playlist management esphome#14652 by @kahrendt (new-feature)
- [speaker_source] Add shuffle support esphome#14653 by @kahrendt (new-feature)
- [speaker_source] Add announcement pipeline esphome#14654 by @kahrendt (new-feature)
- [esp32] Add crash handler to capture and report backtrace across reboots esphome#14709 by @bdraco (new-feature)
New Components
Section titled “New Components”- [runtime_image, online_image] Create runtime_image component to decode images esphome#10212 by @kahrendt (new-component)
- [hdc302x] Add new component esphome#10160 by @joshuasing (new-component) (new-feature) (new-platform)
- [sen6x] Add SEN6x sensor support esphome#12553 by @mebner86 (new-component) (new-feature) (new-platform)
- [media_source] Add new Media Source platform component esphome#14417 by @kahrendt (new-component) (new-feature)
- [audio_file] New component for embedding files into firmware esphome#14434 by @kahrendt (new-component) (new-feature)
- [nrf52, ota] ble and serial OTA based on mcumgr esphome#11932 by @tomaszduda23 (new-component) (new-feature) (new-platform)
- [serial_proxy] New component esphome#13944 by @kbx81 (new-component) (new-feature)
- [rp2040_ble] Add BLE component for RP2040/RP2350 esphome#14603 by @bdraco (new-component) (new-feature)
- [speaker_source] Add new media player esphome#14649 by @kahrendt (new-component) (new-feature) (new-platform)
- [dew_point] Add dew_point sensor component esphome#14441 by @CFlix (new-component) (new-feature) (new-platform)
New Platforms
Section titled “New Platforms”- [hdc302x] Add new component esphome#10160 by @joshuasing (new-component) (new-feature) (new-platform)
- [sen6x] Add SEN6x sensor support esphome#12553 by @mebner86 (new-component) (new-feature) (new-platform)
- [nrf52, ota] ble and serial OTA based on mcumgr esphome#11932 by @tomaszduda23 (new-component) (new-feature) (new-platform)
- [nrf52] allow to update OTA via cmd esphome#12344 by @tomaszduda23 (new-platform)
- [speaker_source] Add new media player esphome#14649 by @kahrendt (new-component) (new-feature) (new-platform)
- [dew_point] Add dew_point sensor component esphome#14441 by @CFlix (new-component) (new-feature) (new-platform)
Breaking Changes
Section titled “Breaking Changes”- [audio, speaker] Add support for decoding Ogg Opus files esphome#13967 by @kahrendt (new-feature) (breaking-change)
- [opentherm] Remove deprecated opentherm_version config option esphome#14103 by @swoboda1337 (breaking-change)
- [esp32] Add engineering_sample option for ESP32-P4 esphome#14139 by @swoboda1337 (new-feature) (breaking-change)
- [time] Eliminate libc timezone bloat (~9.5KB flash ESP32, ~2% RAM on ESP8266) esphome#13635 by @bdraco (breaking-change)
- [rp2040] Update arduino-pico framework from 3.9.4 to 5.5.0 esphome#14328 by @bdraco (breaking-change)
- [sgp30] Fix serial number truncation from 48-bit to 24-bit esphome#14478 by @swoboda1337 (breaking-change)
- [openthread] static log level code quality improvement esphome#14456 by @rwrozelle (new-feature) (breaking-change)
- [core] Move entity icon strings to PROGMEM on ESP8266 esphome#14437 by @bdraco (breaking-change)
- [core] Move device class strings to PROGMEM on ESP8266 esphome#14443 by @bdraco (breaking-change)
- [rp2040] Wrap printf/vprintf/fprintf to eliminate _vfprintf_r (~9.2 KB flash) esphome#14622 by @bdraco (breaking-change)
- [esp8266] Wrap printf/vprintf/fprintf to eliminate _vfiprintf_r (~1.6 KB flash) esphome#14621 by @bdraco (breaking-change)
- [nextion] Add configurable HTTP parameters for TFT upload esphome#14234 by @edwardtfn (new-feature) (breaking-change)
- [micronova] Add command queue esphome#12268 by @edenhaus (breaking-change)
All changes
Section titled “All changes”- [mipi_spi] Add Waveshare 1.83 v2 panel esphome#13680 by @schdro (new-feature)
- [web_server] Guard icon JSON field with USE_ENTITY_ICON esphome#13948 by @bdraco
- [analyze_memory] Fix mDNS packet buffer miscategorized as wifi_config esphome#13949 by @bdraco
- [web_server] Switch from getParam to arg API to eliminate heap allocations esphome#13942 by @bdraco
- [wifi] Deprecate wifi_ssid() in favor of wifi_ssid_to() esphome#13958 by @bdraco
- [helpers] Add heap warnings to format_hex_pretty, deprecate ethernet/web_server std::string APIs esphome#13959 by @bdraco
- [web_server] Flatten deq_push_back_with_dedup_ to inline vector realloc esphome#13968 by @bdraco
- [core] Flatten single-callsite vector realloc functions esphome#13970 by @bdraco
- [usb_host] Extract cold path from loop(), replace std::string with buffer API esphome#13957 by @bdraco
- [runtime_image, online_image] Create runtime_image component to decode images esphome#10212 by @kahrendt (new-component)
- [core] Make LOG_ENTITY_ICON a no-op when icons are compiled out esphome#13973 by @bdraco
- [nfc] Replace constant std::vector with static constexpr std::array esphome#13978 by @bdraco
- [http_request] Improve TLS logging on ESP8266 esphome#13985 by @AndreKR
- [epaper_spi] Add WeAct 3-color e-paper display support esphome#13894 by @pgolawsk (new-feature)
- [audio] Support reallocating non-empty AudioTransferBuffer esphome#13979 by @kahrendt
- [epaper_spi] Add Waveshare 7.5in e-Paper (H) esphome#13991 by @corneliusludmann (new-feature)
- [runtime_image] Remove stored RAMAllocator member esphome#13998 by @bdraco
- [online_image] Remove stored RAMAllocator member from DownloadBuffer esphome#13999 by @bdraco
- [camera, camera_encoder] Remove stored RAMAllocator member esphome#13997 by @bdraco
- [json, core] Remove stored RAMAllocator, make constructors constexpr esphome#14000 by @bdraco
- [api] Remove unused reserve from APIServer constructor esphome#14017 by @bdraco
- [display] Make COLOR_OFF and COLOR_ON inline constexpr esphome#14044 by @bdraco
- [core] Make setup_priority and component state constants constexpr esphome#14041 by @bdraco
- [pca9685] Make mode constants inline constexpr esphome#14042 by @bdraco
- [tlc59208f] Make mode constants inline constexpr esphome#14043 by @bdraco
- [core] Remove dead global_state variable esphome#14060 by @bdraco
- [core] Remove unnecessary IRAM_ATTR from yield(), delay(), feed_wdt(), and arch_feed_wdt() esphome#14063 by @bdraco
- [api] Add handshake timeout to prevent connection slot exhaustion esphome#14050 by @bdraco
- [http_request] Replace heavy STL containers with std::vector for headers esphome#14024 by @bdraco
- [core] Shrink Application::dump_config_at_ from size_t to uint16_t esphome#14053 by @bdraco
- [core] Conditionally compile setup_priority override infrastructure esphome#14057 by @bdraco
- [mqtt] Use constexpr for compile-time constants esphome#14075 by @bdraco
- [web_server] Move climate static traits to DETAIL_ALL only esphome#14066 by @bdraco
- [bluetooth_proxy][esp32_ble_client][esp32_ble_server] Use constexpr for compile-time constants esphome#14073 by @bdraco
- [api] Use constexpr for compile-time constant esphome#14072 by @bdraco
- [packet_transport] Use constexpr for compile-time constants esphome#14074 by @bdraco
- [remote_base] Use constexpr for compile-time constants esphome#14076 by @bdraco
- [core] Use constexpr for compile-time constants esphome#14071 by @bdraco
- [http_request] Replace std::map with std::vector in action template esphome#14026 by @bdraco
- [nfc] Use constexpr for compile-time constants esphome#14077 by @bdraco
- [pn7160] Use constexpr for compile-time constants esphome#14078 by @bdraco
- [bluetooth_proxy] Use constexpr for remaining compile-time constants esphome#14080 by @bdraco
- [audio] Add support for sinking via an arbitrary callback esphome#14035 by @kahrendt
- [media_player] Add more commands to support Sendspin esphome#12258 by @kahrendt (new-feature)
- [mdns] add Sendspin advertisement support esphome#14013 by @kahrendt
- [audio, speaker] Add support for decoding Ogg Opus files esphome#13967 by @kahrendt (new-feature) (breaking-change)
- [esp32_camera] Add support for sensors without JPEG support esphome#9496 by @mback2k (new-feature)
- [esp32_ble_server] add test for lambda characteristic esphome#14091 by @Rapsssito
- [socket] Log error when UDP socket requested on LWIP TCP-only platforms esphome#14089 by @bdraco
- [logger] Replace LogListener virtual interface with LogCallback struct esphome#14084 by @bdraco
- [core] Devirtualize call_loop() and mark_failed() in Component esphome#14083 by @bdraco
- [cse7761] Use constexpr for compile-time constants esphome#14081 by @bdraco
- [ci] Update lint message to recommend constexpr over static const esphome#14099 by @bdraco
- [e131] Replace std::map with std::vector for universe tracking esphome#14087 by @bdraco
- [web_server] Reduce set_json_id flash and stack usage esphome#14029 by @bdraco
- [core] Optimize WarnIfComponentBlockingGuard::finish() hot path esphome#14040 by @bdraco
- [audio] Support decoding audio directly from flash esphome#14098 by @kahrendt
- [opentherm] Remove deprecated opentherm_version config option esphome#14103 by @swoboda1337 (breaking-change)
- [esp32] Remove deprecated add_idf_component() parameters and IDF component refresh option esphome#14105 by @swoboda1337
- [i2c] Remove deprecated stop parameter overloads and readv/writev methods esphome#14106 by @swoboda1337
- [audio] Disable FLAC CRC validation to improve decoding effeciancy esphome#14108 by @kahrendt
- [json] Add SerializationBuffer for stack-first JSON serialization esphome#13625 by @bdraco
- [core] Use constexpr for PROGMEM arrays esphome#14127 by @bdraco
- [esp8266][web_server] Use constexpr for PROGMEM arrays in codegen esphome#14128 by @bdraco
- [core] Use constexpr for hand-written PROGMEM arrays in C++ esphome#14129 by @bdraco
- [e131] Drain all queued packets per loop iteration esphome#14133 by @bdraco
- [esp32] Bump ESP-IDF to 5.5.3 esphome#14122 by @swoboda1337
- [esp32] Bump ESP-IDF to 5.5.3.1, revert GATTS workaround esphome#14147 by @bdraco
- [esp32] Add engineering_sample option for ESP32-P4 esphome#14139 by @swoboda1337 (new-feature) (breaking-change)
- [wifi] Add band_mode configuration for ESP32-C5 dual-band WiFi esphome#14148 by @swoboda1337 (new-feature)
- [e131] Remove dead LWIP TCP code path from loop() esphome#14155 by @swoboda1337
- [safe_mode] Extract RTC_KEY constant for shared use esphome#14121 by @pgolawsk
- [nrf52,logger] Early debug esphome#11685 by @tomaszduda23 (new-feature)
- [logger] Fix loop disable optimization using wrong preprocessor guard esphome#14158 by @bdraco
- [core] Deduplicate base64 encode/decode logic esphome#14143 by @bdraco
- [usb_host] Implement disable_loop/enable_loop pattern for USB components esphome#14163 by @bdraco
- [api] Warn when clients connect with outdated API version esphome#14145 by @bdraco
- [api,ota,captive_portal] Fix fd leaks and clean up socket_ip_loop_monitored setup paths esphome#14167 by @bdraco
- [uptime] Use scheduler millis_64() for rollover-safe uptime tracking esphome#14170 by @bdraco
- [logger] Reduce UART driver heap waste on ESP32 esphome#14168 by @bdraco
- [api] Write protobuf encode output to pre-sized buffer directly esphome#14018 by @bdraco
- [mqtt] add missing precision in HA autodiscovery esphome#14010 by @Rapsssito
- [cc1101] actions to change general and tuner settings esphome#14141 by @sxtfov (new-feature)
- [epaper_spi] Fix color mapping for weact esphome#14134 by @clydebarrow
- [nrf52] print line number after crash in logs esphome#14165 by @tomaszduda23
- [ci] Suggest StringRef instead of std::string_view esphome#14183 by @bdraco
- [scheduler] Reduce lock acquisitions in process_defer_queue_ esphome#14107 by @bdraco
- [scheduler] Use relaxed memory ordering for atomic reads under lock esphome#14140 by @bdraco
- [scheduler] De-template and consolidate scheduler helper functions esphome#14164 by @bdraco
- [platformio] Add exponential backoff and session reset to download retries esphome#14191 by @bdraco
- [nextion] Add error log for failed HTTP status during TFT upload esphome#14190 by @edwardtfn
- [web_server_base] Remove unnecessary Component inheritance and modernize esphome#14204 by @bdraco
- [core] Conditionally compile get_loop_priority with USE_LOOP_PRIORITY esphome#14210 by @bdraco
- [http_request] Replace
std::list<Header>withstd::vectorinperform()chain esphome#14027 by @bdraco - [logger] Make tx_buffer_ compile-time sized esphome#14205 by @bdraco
- [libretiny] Tune oversized lwIP defaults for ESPHome esphome#14186 by @bdraco
- [core] Move CONF_OUTPUT_POWER into const.py esphome#14201 by @schdro
- [binary_sensor] Conditionally compile filter infrastructure esphome#14215 by @bdraco
- [sensor] Conditionally compile filter infrastructure esphome#14214 by @bdraco
- [text_sensor] Conditionally compile filter infrastructure esphome#14213 by @bdraco
- [openthread_info] Optimize: Devirtualize/unify esphome#14208 by @schdro
- [openthread] Add Thread version DEBUG trace esphome#14196 by @schdro
- [openthread] Refactor to optimize and match code rules esphome#14156 by @schdro
- [logger] Use subtraction-based line number formatting to avoid division esphome#14219 by @bdraco
- [core] Fix multiline log continuations without leading whitespace esphome#14217 by @swoboda1337
- [hdc302x] Add new component esphome#10160 by @joshuasing (new-component) (new-feature) (new-platform)
- [core] Avoid expensive modulo in LockFreeQueue for non-power-of-2 sizes esphome#14221 by @bdraco
- [remote_transmitter/remote_receiver] Rename _esp32.cpp to _rmt.cpp esphome#14226 by @swoboda1337
- [http_request] Retry update check on startup until network is ready esphome#14228 by @swoboda1337
- [esp32,core] Move CONF_ENABLE_OTA_ROLLBACK to core esphome#14231 by @tomaszduda23
- [nrf52,logger] generate crash magic in python esphome#14173 by @tomaszduda23
- [nfc] Fix logging tag for nfc helpers esphome#14235 by @jamesmyatt
- [core] Add pow10_int helper, replace powf in normalize_accuracy and sensor filters esphome#14114 by @bdraco
- [core] Move build_info_data.h out of application.h to fix incremental rebuilds esphome#14230 by @swoboda1337
- [version] Use C++17 nested namespace syntax esphome#14240 by @bdraco
- [switch] Use C++17 nested namespace syntax esphome#14241 by @bdraco
- [text] Use C++17 nested namespace syntax esphome#14242 by @bdraco
- [text_sensor] Use C++17 nested namespace syntax esphome#14243 by @bdraco
- [usb_host] Use C++17 nested namespace syntax esphome#14244 by @bdraco
- [i2c] Use C++17 nested namespace syntax esphome#14245 by @bdraco
- [ethernet] Use C++17 nested namespace syntax esphome#14246 by @bdraco
- [cse7766] Use C++17 nested namespace syntax esphome#14247 by @bdraco
- [network] Use C++17 nested namespace syntax esphome#14248 by @bdraco
- [esp32] Improve ESP32-P4 engineering sample warning message esphome#14252 by @swoboda1337
- [version] text sensor add option
hide_hashto restore the pre-2026.1 behavior esphome#14251 by @nagyrobi (new-feature) - [core] Prevent inlining of mark_matching_items_removed_locked_ on Thumb-1 esphome#14256 by @bdraco
- [esp32_ble_server] add max_clients option for multi-client support esphome#14239 by @RAR
- [web_server_idf] Pass std::function by rvalue reference esphome#14262 by @bdraco
- [api] Pass std::function by rvalue reference in state subscriptions esphome#14261 by @bdraco
- [core] Pass std::function by rvalue reference in scheduler esphome#14260 by @bdraco
- [core] Use custom deleter for SchedulerItem unique_ptr to prevent destructor inlining esphome#14258 by @bdraco
- [dlms_meter/kamstrup_kmp] Replace powf with pow10_int esphome#14125 by @bdraco
- [light] Add additional light effect test cases esphome#14266 by @bdraco
- [light] Replace std::lerp with lightweight lerp_fast in LightColorValues::lerp esphome#14238 by @bdraco
- [sensirion_common] Move sen5x’s sensirion_convert_to_string_in_place() function to sensirion_common esphome#14269 by @mikelawrence
- [config] Improve dimensions validation and fix online_image resize aspect ratio esphome#14274 by @swoboda1337
- [web_server] Fix uptime display overflow after ~24.8 days esphome#13739 by @bdraco
- Update webserver local assets to 20260225-155043 esphome#14275 by @esphomebot
- [ac_dimmer] Use a shared ESP32 GPTimer for multiple dimmers esphome#13523 by @Szpadel
- [core] more accurate check for leap year and valid day_of_month esphome#14197 by @ximex
- [api] Split ProtoVarInt::parse into 32-bit and 64-bit phases esphome#14039 by @bdraco
- [lcd_base] Fix millis() truncation to uint8_t esphome#14289 by @swoboda1337
- [shelly_dimmer] Fix millis overflow in ACK timeout check esphome#14288 by @swoboda1337
- [bl0942] Fix millis overflow in packet timeout check esphome#14285 by @swoboda1337
- [light] Fix millis overflow in transition progress and flash timing esphome#14292 by @swoboda1337
- [ble_presence] Fix millis overflow in presence timeout check esphome#14293 by @swoboda1337
- [lightwaverf] Fix millis overflow in send timeout check esphome#14294 by @swoboda1337
- [pn532] Replace millis zero sentinel with optional esphome#14295 by @swoboda1337
- [ld2420] Fix buffer overflows in command response parsing esphome#14297 by @swoboda1337
- [gp8403] Fix enum size mismatch in voltage register write esphome#14296 by @swoboda1337
- [mcp2515] Fix millis overflow in set_mode_ timeout esphome#14298 by @swoboda1337
- [wled] Fix millis overflow in blank timeout esphome#14300 by @swoboda1337
- [logger] Mark Logger and LoggerMessageTrigger as final esphome#14291 by @bdraco
- [mdns] Mark MDNSComponent as final esphome#14290 by @bdraco
- [ota] Mark OTA backend and component leaf classes as final esphome#14287 by @bdraco
- [api] Mark ListEntitiesIterator and InitialStateIterator as final esphome#14284 by @bdraco
- [web_server] Mark classes as final esphome#14283 by @bdraco
- [safe_mode] Mark SafeModeComponent and SafeModeTrigger as final esphome#14282 by @bdraco
- [core] ESP32: massively reduce main loop socket polling overhead by replacing select() esphome#14249 by @bdraco
- [ci] Add undocumented C++ API change checkbox and auto-label esphome#14317 by @bdraco
- Add socket compile tests for libretiny platforms esphome#14314 by @bdraco
- [core] Use placement new for global Application instance esphome#14052 by @bdraco
- [wifi] Use memcpy-based insertion sort for scan results esphome#13960 by @bdraco
- [libretiny] Use -Os optimization for ESPHome source on BK72xx (SDK remains at -O1) esphome#14322 by @bdraco
- [libretiny] Use C++17 nested namespace syntax esphome#14325 by @bdraco
- [esp_ldo] Add channels 1&2 support with additional option to enable it, add source voltage bypass/pass-through esphome#14177 by @p1ngb4ck (new-feature)
- [api] Add DEFROSTING to ClimateAction esphome#13976 by @lyubomirtraykov
- Update webserver local assets to 20260226-220330 esphome#14330 by @esphomebot
- [mipi_dsi] Add more Waveshare panels and comments esphome#14023 by @gtjoseph (new-feature)
- [time] Eliminate libc timezone bloat (~9.5KB flash ESP32, ~2% RAM on ESP8266) esphome#13635 by @bdraco (breaking-change)
- [web_server_idf] Prefer make_unique_for_overwrite for noninit recv buffer esphome#14279 by @bdraco
- [rp2040] Update arduino-pico framework from 3.9.4 to 5.5.0 esphome#14328 by @bdraco (breaking-change)
- [esp8266] Remove forced scanf linkage to save ~8KB flash esphome#13678 by @bdraco
- [usb_uart] Performance, correctness and reliability improvements esphome#14333 by @kbx81
- [esp32_touch] Migrate to new unified touch sensor driver (esp_driver_touch_sens) esphome#14033 by @swoboda1337 (new-feature)
- [esp32_ble] allow setting of min/max key_size and auth_req_mode esphome#7138 by @whitty (new-feature)
- [core] Extend fast select optimization to LibreTiny platforms esphome#14254 by @bdraco
- [audio] Bump microOpus to v0.3.4 esphome#14346 by @kahrendt
- [mdns] Update espressif/mdns to v1.10.0 esphome#14338 by @bdraco
- [esp32_hosted] Add configurable SDIO clock frequency esphome#14319 by @deirdreobyrne (new-feature)
- [core] Add millis_64() HAL function with native ESP32 implementation esphome#14339 by @bdraco
- [wifi] Remove stale TODO comment for ESP8266 callback deferral esphome#14347 by @bdraco
- [wifi] Use direct SDK APIs for LibreTiny SSID retrieval esphome#14349 by @bdraco
- [safe_mode] Add feature to explicitly mark a boot as successful esphome#14306 by @mcassaniti (new-feature)
- [ci] Skip memory impact target branch build when tests don’t exist esphome#14316 by @bdraco
- [wifi] Add LibreTiny component test configs esphome#14351 by @bdraco
- [core] Fix Application asm label for Mach-O using USER_LABEL_PREFIX esphome#14334 by @bdraco
- [host] Use native clock_gettime for millis_64() esphome#14340 by @bdraco
- [color] Use integer math in Color::gradient to reduce code size esphome#14354 by @bdraco
- [esp32] Enable
execute_from_psramfor P4 esphome#14329 by @clydebarrow (new-feature) - [zephyr] Use native k_uptime_get() for millis_64() esphome#14350 by @bdraco
- [component] Devirtualize call_dump_config esphome#14355 by @bdraco
- [ci] Add PR title format check esphome#14345 by @swoboda1337
- [rp2040] Use native time_us_64() for millis_64() esphome#14356 by @bdraco
- [sht3xd] Allow sensors that don’t support serial number read esphome#14224 by @lwratten
- [sen6x] Add SEN6x sensor support esphome#12553 by @mebner86 (new-component) (new-feature) (new-platform)
- [ci] Fix C++ unit tests missing time component dependency esphome#14364 by @bdraco
- [gps] Fix codegen deadlock when automations reference sibling sensors esphome#14365 by @swoboda1337
- [web_server] Add climate preset, fan mode, and humidity support esphome#14061 by @rwagoner
- [sen6x] Fix test sensor ID collisions with sen5x esphome#14367 by @bdraco
- [esp32] Wrap printf/vprintf/fprintf to eliminate _vfprintf_r (~11 KB flash) esphome#14362 by @bdraco
- [gt911] Support for interrupt line via IO Expander (resubmit) esphome#14358 by @PedanticAvenger (new-feature)
- [core] Make register_component protected, remove runtime checks esphome#14371 by @bdraco
- [api] Outline keepalive ping logic from APIConnection::loop() esphome#14374 by @bdraco
- [core] Inline set_component_state_ and use it in Application esphome#14369 by @bdraco
- [core] Move CONF_STOP_BITS, CONF_DATA_BITS, CONF_PARITY to const.py esphome#14379 by @bdraco
- [ld2410][ld2412] Fix signed char causing incorrect distance values esphome#14380 by @bdraco
- [uart] Replace wake-on-RX task+queue with direct ISR callback esphome#14382 by @bdraco
- [ci] Fix TypeError in ci-custom.py when POST lint checks fail esphome#14378 by @bdraco
- [ld2450] Use atan2f for angle calculation esphome#14388 by @bdraco
- [ld2450] Use integer dedup for direction text sensor updates esphome#14386 by @bdraco
- [ld2450] Single-pass zone target counting esphome#14387 by @bdraco
- [core] Extract set_status_flag_ helper to deduplicate status_set methods esphome#14384 by @bdraco
- [uart] Enable wake-on-RX by default on ESP32 esphome#14391 by @bdraco
- [api] Use StringRef for user service string arguments esphome#13974 by @bdraco
- [preferences] Reduce heap churn with small inline buffer optimization esphome#13259 by @bdraco
- [time,api] Send pre-parsed timezone struct over protobuf esphome#14233 by @bdraco
- [rtttl] improve comments Part 2 esphome#13971 by @ximex
- [openthread] Disable default enabled OT diag code esphome#14399 by @schdro
- [api] Remove virtual destructor from ProtoMessage esphome#14393 by @bdraco
- [ld2410] Add UART mock integration test for LD2410 component esphome#14377 by @bdraco
- [core] Wake main loop from ISR in enable_loop_soon_any_context() esphome#14383 by @bdraco
- [openthread] Disable default enabled OT console build esphome#14390 by @schdro
- Create integration tests for modbus esphome#14395 by @exciton
- Use cached files on network errors in external_files esphome#14055 by @Copilot
- [core] Move millis_64 rollover tracking out of Scheduler esphome#14360 by @bdraco
- [core] Auto-wrap static strings in PROGMEM on ESP8266 via TemplatableValue esphome#13885 by @bdraco
- [light] Replace powf gamma with pre-computed lookup tables (LUT) esphome#14123 by @bdraco
- [web_server] Avoid temporary std::string allocations in request parameter parsing esphome#14366 by @bdraco
- [core] Deduplicate ControllerRegistry notify dispatch loop esphome#14394 by @bdraco
- [light] Resolve effect names to indices at codegen time esphome#14265 by @bdraco
- [socket] Devirtualize socket abstraction layer esphome#14398 by @bdraco
- [core] Compile-time detection of loop() overrides esphome#14405 by @bdraco
- [mcp23016] Fix register access to use 16-bit paired transactions esphome#13676 by @netixx
- [socket] Fix pre-existing bugs found during socket devirtualization review esphome#14404 by @bdraco
- [core] Fix compile-time loop() detection for multiple inheritance esphome#14411 by @bdraco
- [core] Add ESP8266 support to wake_loop_any_context() esphome#14392 by @bdraco
- [core] Eliminate __udivdi3 in millis() on ESP32 and RP2040 esphome#14409 by @bdraco
- [const] Move CONF_WATCHDOG esphome#14415 by @LinoSchmidt
- [tests] Fix flaky log assertion race in oversized payload tests esphome#14414 by @bdraco
- [ci] Skip PR title check for dependabot PRs esphome#14418 by @swoboda1337
- [media_source] Add new Media Source platform component esphome#14417 by @kahrendt (new-component) (new-feature)
- [lps22] Add support for the LPS22DF variant esphome#14397 by @melak (new-feature)
- [ld2450] Clear all related sensors when a target is not being tracked esphome#13602 by @ccutrer
- [core] Inline HighFrequencyLoopRequester::is_high_frequency() esphome#14423 by @bdraco
- [openthread] Add tx power option esphome#14200 by @schdro (new-feature)
- [const][uart][usb_uart][weikai][core] Move constants to components/const esphome#14430 by @clydebarrow
- [speaker] Add off on capability to media player esphome#9295 by @rwrozelle (new-feature)
- [socket] Cache lwip_sock pointers and inline ready() chain esphome#14408 by @bdraco
- [core] Pack entity string properties into PROGMEM-indexed uint8_t fields esphome#14171 by @bdraco
- [ci] Add lint check to prevent powf in core and base entity platforms esphome#14126 by @bdraco
- [bk72xx] Fix ~100ms loop stalls by raising main task priority esphome#14420 by @bdraco
- [core] Inline trivial Component state accessors esphome#14425 by @bdraco
- [ci] Add code-owner-approved label workflow esphome#14421 by @bdraco
- [usb_uart] Don’t claim interrupt interface for ch34x esphome#14431 by @clydebarrow
- [rtttl] add new codeowner esphome#14440 by @ximex
- [tests] Fix integration test race condition in PlatformIO cache init esphome#14435 by @swoboda1337
- [globals] Fix handling of string booleans in yaml esphome#14447 by @jesserockz
- [core] add a StaticTask helper to manage task lifecycles esphome#14446 by @kahrendt
- [core] Replace custom esphome::optional with std::optional esphome#14368 by @bdraco
- [media_source] Clarify threading contract esphome#14433 by @kahrendt
- [core] improve help text for —device option, mention
OTAesphome#14445 by @tvogel - [integration] Add set method to publish and save sensor value esphome#13316 by @JiriPrchal (new-feature)
- [runtime_stats] Use micros() for accurate per-component timing esphome#14452 by @bdraco
- [core] Call loop() directly in main loop, bypass call() indirection esphome#14451 by @bdraco
- [ld2412] Add integration tests with mock UART esphome#14448 by @bdraco
- [sx127x] Fix preamble MSB register always written as zero esphome#14457 by @swoboda1337
- [remote_base][remote_receiver] Fix OOB access in pronto comparison and RMT buffer allocation esphome#14459 by @swoboda1337
- [pn7160][pn7150][pn532] Fix tag purge skipping, NDEF bounds check, and NDEF length byte order esphome#14460 by @swoboda1337
- [fingerprint_grow] Fix OOB write and uint16 overflow esphome#14462 by @swoboda1337
- [ld2420] Fix buffer overflows in simple mode, energy mode, and calibration esphome#14458 by @swoboda1337
- [mixer][resampler][speaker] Use core static task manager esphome#14454 by @kahrendt
- [inkplate][ezo_pmp][ezo][packet_transport] Fix use-after-free bugs esphome#14467 by @swoboda1337
- [esp32_improv][rf_bridge][esp32_ble_server][display][lvgl][pipsolar] Fix unsigned integer underflows esphome#14466 by @swoboda1337
- [ci] Add missing issues: write permission to codeowner approval workflow esphome#14477 by @bdraco
- [ds2484] Fix read64() using uint8_t accumulator instead of uint64_t esphome#14479 by @swoboda1337
- [sgp30] Fix serial number truncation from 48-bit to 24-bit esphome#14478 by @swoboda1337 (breaking-change)
- [zwave_proxy] Fix uint8_t overflow for buffer index and frame end esphome#14480 by @swoboda1337
- [ai] Add docs note about keeping component index pages in sync esphome#14465 by @bharvey88
- [tests] Fix flaky uart_mock integration tests esphome#14476 by @bdraco
- [ci] Fix codeowner approval label workflow for fork PRs esphome#14490 by @bdraco
- [packet_transport] Minimise heap allocations esphome#14482 by @clydebarrow
- [openthread] Cache is_connected() for cheap inline access esphome#14484 by @rwrozelle
- [network] Inline network::is_connected() and ethernet is_connected() esphome#14464 by @bdraco
- [api] Devirtualize frame helper calls when protocol is fixed at compile time esphome#14468 by @bdraco
- [dfrobot_sen0395][sx1509] Fix structural bugs esphome#14494 by @swoboda1337
- [veml7700] Fix initial settling timeout using raw enum instead of milliseconds esphome#14487 by @swoboda1337
- [ssd1322][ssd1325][ssd1327] Fix nibble mask bug in grayscale draw_pixel esphome#14496 by @swoboda1337
- [sht4x][grove_tb6612fng] Fix logic bugs esphome#14497 by @swoboda1337
- [openthread] static log level code quality improvement esphome#14456 by @rwrozelle (new-feature) (breaking-change)
- [dfplayer][ufire_ise][ufire_ec][qmp6988][atm90e26] Fix wrong operators and masks esphome#14491 by @swoboda1337
- [pn532_spi] Fix preamble check logic and OOB access when full_len is zero esphome#14486 by @swoboda1337
- [ota] Devirtualize OTA backend calls esphome#14473 by @bdraco
- [GPS] fix component Python declaration to match C++ implementation esphome#14519 by @oarcher
- [sim800l][tormatic][tx20] Fix OOB access, div-by-zero, and off-by-one esphome#14512 by @swoboda1337
- [rc522][sml][kamstrup_kmp] Fix buffer bounds checks esphome#14515 by @swoboda1337
- [haier][bedjet][vbus][lightwaverf] Fix buffer overflow bugs esphome#14493 by @swoboda1337
- [alpha3][mpu6886][emc2101] Fix copy-paste bugs esphome#14492 by @swoboda1337
- [usb_cdc_acm][scd4x][pulse_counter][mopeka_std_check][ruuvi_ble] Fix assorted one-liner bugs esphome#14495 by @swoboda1337
- [audio_file] New component for embedding files into firmware esphome#14434 by @kahrendt (new-component) (new-feature)
- [wled][lcd_base][touchscreen][ee895] Fix off-by-one, buffer overrun, empty deref, and uninitialized pointers esphome#14513 by @swoboda1337
- [nfc] Fix off-by-one in NDEF message parsing esphome#14485 by @swoboda1337
- [wifi] Cache is_connected() for cheap inline access esphome#14463 by @bdraco
- [xiaomi_ble][pvvx_mithermometer][atc_mithermometer] Add BLE service data bounds checks esphome#14514 by @swoboda1337
- [modbus] Fix timing bugs and better adhere to spec esphome#8032 by @exciton
- [usb_uart][nextion][feedback][whirlpool][packet_transport][he60r][hc8][runtime_stats] Fix millis() wrapping bugs esphome#14474 by @swoboda1337
- [cse7761][ads1115][tmp1075][matrix_keypad][seeed_mr60bha2] Fix assorted bugs esphome#14518 by @swoboda1337
- [audio] Extract detect_audio_file_type helper esphome#14507 by @kahrendt
- [rp2040] Update arduino-pico to 5.5.1 and fix WiFi AP fallback esphome#14500 by @bdraco
- [st7735][st7789v][st7920] Fix display buffer overflows and dead code esphome#14511 by @swoboda1337
- [uart] init tx_pin, rx_pin, flow control, rx_buffer_size esphome#14524 by @tomaszduda23
- [openthread][ethernet][wifi] Add IPv6 address array bounds assert esphome#14488 by @swoboda1337
- [audio_file] Add media source platform esphome#14436 by @kahrendt (new-feature)
- [ethernet] add get_eth_handle() function esphome#14527 by @Gnuspice
- [host] Add null checks for getenv and fopen in preferences esphome#14531 by @swoboda1337
- [bluetooth_proxy] Add null checks for api_connection esphome#14536 by @swoboda1337
- [ble_nus] Add uart support esphome#14320 by @tomaszduda23 (new-feature)
- [sx127x][sx126x][max6956] Fix null deref, unterminated string, and pin bounds check esphome#14529 by @swoboda1337
- [mipi_dsi][e131] Fix semaphore cast, missing return, and light count overread esphome#14530 by @swoboda1337
- [esp32] Fix wrong variable usage in P4 pin validation error msg esphome#14539 by @ximex
- [esp32] Fix ESP32-S3 pin validation error message esphome#14540 by @ximex
- [nrf52] prepare for usb cdc esphome#14174 by @tomaszduda23
- [core] Move entity icon strings to PROGMEM on ESP8266 esphome#14437 by @bdraco (breaking-change)
- [core] Replace Application name/friendly_name std::string with StringRef esphome#14532 by @bdraco
- [rp2040] Fix Pico W LED pin and auto-generate board definitions for arduino-pico 5.5.x esphome#14528 by @bdraco (new-feature)
- [hlk_fm22x] Fix oversized response rejection breaking GET_ALL_FACE_IDS esphome#14506 by @bdraco
- [ci] Use pull_request_target for codeowner approved label workflow esphome#14561 by @bdraco
- [sgp4x] Fix undefined behavior from mutating entity config at runtime esphome#14562 by @bdraco
- [rtttl] Add AudioStreamInfo and set volume esphome#14439 by @ximex
- [core] Move device class strings to PROGMEM on ESP8266 esphome#14443 by @bdraco (breaking-change)
- [tm1638][rp2040_pio_led_strip][atm90e32] Fix bounds checks and off-by-one esphome#14559 by @swoboda1337
- [api] Devirtualize protobuf encode/calculate_size esphome#14449 by @bdraco
- [multiple] Add default initializers to uninitialized member variables esphome#14556 by @swoboda1337
- [esp32_ble_server][espnow][time] Fix logic bugs esphome#14553 by @swoboda1337
- [multiple] Fix cast/operator precedence bugs esphome#14560 by @swoboda1337
- [noblex] Fix IR receive losing decoded bytes between calls esphome#14533 by @swoboda1337
- [light] Fix unsigned underflow in addressable scan effect esphome#14546 by @swoboda1337
- [pid][nextion][pn532_i2c][pipsolar] Fix copy-paste and logic bugs esphome#14551 by @swoboda1337
- [esp32_ble_server][weikai][ade7880] Fix copy-paste bugs esphome#14552 by @swoboda1337
- [multiple] Fix assorted medium-severity bugs esphome#14555 by @swoboda1337
- [bmp581_base][bl0906] Fix 24-bit sign extension bugs esphome#14558 by @swoboda1337
- [shelly_dimmer][lvgl][seeed_mr60fda2][packet_transport] Fix buffer bounds checks esphome#14534 by @swoboda1337
- [ltr501][pvvx_mithermometer][smt100] Convert static locals to instance members esphome#14569 by @swoboda1337
- [iaqcore][scd30][sen21231][beken_spi_led_strip] Fix uninitialized variables and missing error checks esphome#14568 by @swoboda1337
- [lightwaverf] Fix ISR safety issues esphome#14563 by @swoboda1337
- [mipi_rgb] Fix byte order and dirty bounds in fill() esphome#14537 by @swoboda1337
- [http_request] Make TLS buffer configurable on ESP8266 esphome#14009 by @AndreKR (new-feature)
- [climate][haier][template][core] Relocate CONF_CURRENT_TEMPERATURE to general const file esphome#14503 by @rsre
- [api] Sync api.proto from aioesphomeapi esphome#14579 by @bdraco
- [openthread] move esp functions into correct file esphome#14588 by @rwrozelle
- [nrf52][zephyr] support for multi on rate callbacks esphome#14557 by @tomaszduda23
- [uart] Add error message when initializing UART with unsupported configuration esphome#13229 by @sredman
- [uart] Fully enable raw mode with host serial esphome#14573 by @puddly
- [captive_portal] Enable support for RP2040 esphome#14505 by @bdraco
- [bluetooth_proxy] Add BLE connection parameters API esphome#14577 by @bdraco
- [core] Merge set_name + set_entity_strings into configure_entity_ esphome#14444 by @bdraco
- [api] Single-pass protobuf encode for BLE proxy advertisements esphome#14575 by @bdraco
- [api] Inline APIServer::is_connected() for common no-arg path esphome#14574 by @bdraco
- [core] Inline status_clear_warning/error fast path esphome#14571 by @bdraco
- [component] Fix components for compatibility with stricter compilers esphome#14545 by @diorcety
- [uart][usb_uart] Add debug_prefix option to distinguish multiple defined uarts in log esphome#14525 by @p1ngb4ck (new-feature)
- [ci] Add RP2350 to PR template test environment esphome#14599 by @bdraco
- [ld2420] Add integration tests with mock UART esphome#14471 by @bdraco
- [i2s_audio] Include legacy driver IDF component when use_legacy is set esphome#14613 by @bdraco
- [api] Fix value-initialization of DeviceInfoResponse esphome#14615 by @bdraco
- [vbus][rf_bridge][sensirion_common] Add buffer size guards esphome#14597 by @swoboda1337
- [api] Add force proto field option to skip zero checks on hot path esphome#14610 by @bdraco
- [uart] Return
flushresult, expose timeout via config esphome#14608 by @kbx81 (new-feature) - [usb_uart] Return
flushresult, expose timeout via config esphome#14616 by @kbx81 (new-feature) - [nrf52, ota] ble and serial OTA based on mcumgr esphome#11932 by @tomaszduda23 (new-component) (new-feature) (new-platform)
- [api] Inline varint and encode_varint_raw fast paths for hot loop performance esphome#14607 by @bdraco
- [nrf52] allow to update OTA via cmd esphome#12344 by @tomaszduda23 (new-platform)
- [serial_proxy] New component esphome#13944 by @kbx81 (new-component) (new-feature)
- [usb_uart] ch34x chip-type & port-count enumeration esphome#14544 by @p1ngb4ck
- [ethernet] Fix commit 3f700bac1cebf7eb6ff3b20a87d8c8af5cb9fc41 esphome#14618 by @diorcety
- [ble_nus] make ble_nus timeout shorter than watchdog esphome#14619 by @tomaszduda23
- [ci] Add medium-pr label for PRs with ≤100 lines changed esphome#14628 by @bdraco
- [mixer_speaker] Add task debounce esphome#14581 by @kbx81
- [i2s_audio] Fix mono sample swap and block 8-bit mono on ESP32 esphome#14516 by @swoboda1337
- [esp32_ble] Optimize BLE event hot path performance esphome#14627 by @bdraco
- [scheduler] Use
std::atomic<uint8_t>instead ofstd::atomic<bool>for remove flag esphome#14626 by @bdraco - [api] Inline fast path of try_to_clear_buffer esphome#14630 by @bdraco
- [core] Skip zero-initialization of StaticVector data array esphome#14592 by @bdraco
- [esp32_ble] Inline ble_addr_to_uint64 to eliminate call overhead esphome#14591 by @bdraco
- [modbus] Fix timeout for non-hardware UARTs (e.g., USB UART) esphome#14614 by @bdraco
- [rp2040] Wrap printf/vprintf/fprintf to eliminate _vfprintf_r (~9.2 KB flash) esphome#14622 by @bdraco (breaking-change)
- [esp8266] Wrap printf/vprintf/fprintf to eliminate _vfiprintf_r (~1.6 KB flash) esphome#14621 by @bdraco (breaking-change)
- [ld2450] Add integration tests with mock UART esphome#14611 by @bdraco
- [api] Bump noise-c to 0.1.11 esphome#14632 by @bdraco
- [const] Move CONF_ENABLE_FULL_PRINTF to const.py esphome#14633 by @bdraco
- [core] Pack entity flags into configure_entity_() and protect setters esphome#14564 by @bdraco
- [socket] Add socket wake support for RP2040 esphome#14498 by @bdraco
- [api] Skip state_action_() call in noise data path esphome#14629 by @bdraco
- [nextion] Add configurable HTTP parameters for TFT upload esphome#14234 by @edwardtfn (new-feature) (breaking-change)
- [multiple] Add default initializers to uninitialized member variables esphome#14636 by @swoboda1337
- [multiple] Add array bounds checks esphome#14635 by @swoboda1337
- [ci] Match symbols with changed signatures in memory impact analysis esphome#14600 by @bdraco
- [ci-custom] Directions on constant hoisting esphome#14637 by @clydebarrow
- [multiple] Add division by zero guards esphome#14634 by @swoboda1337
- [multiple] Fix undefined behavior across components esphome#14639 by @swoboda1337
- [runtime_image][st7701s] Fix BMP decoder and LCD init bugs esphome#14663 by @swoboda1337
- [api][at581x][vl53l0x] Fix bounds check issues in 3 components esphome#14660 by @swoboda1337
- [hmc5883l][mmc5603][honeywellabp2][xgzp68xx][max9611] Fix uninitialized members esphome#14659 by @swoboda1337
- [wifi][captive_portal][heatpumpir][es8388] Fix wrong behavior in 4 components esphome#14657 by @swoboda1337
- [multiple] Remove unnecessary heap allocations in 4 components esphome#14656 by @swoboda1337
- [multiple] Fix crashes from malformed external input (batch 2) esphome#14651 by @swoboda1337
- [multiple] Fix wrong behavior in 5 components esphome#14647 by @swoboda1337
- [multiple] Fix minor bugs in 8 components esphome#14650 by @swoboda1337
- [demo] Fix alarm control panel auth bypass when code is omitted esphome#14645 by @swoboda1337
- [ble_scanner] Escape special characters in JSON output esphome#14664 by @swoboda1337
- [multiple] Fix wrong behavior in sensor calculations and drivers esphome#14644 by @swoboda1337
- [api][serial_proxy] Fix dangling pointer esphome#14640 by @kbx81
- [canbus] Fix multiple MCP component bugs esphome#14461 by @swoboda1337
- [multiple] Fix reliability issues in 5 components esphome#14655 by @swoboda1337
- [ci] Make codeowner label update non-fatal for fork PRs esphome#14668 by @bdraco
- [ci] Skip YAML anchor keys in integration fixture component extraction esphome#14670 by @bdraco
- [multiple] Fix crashes from malformed external input esphome#14643 by @swoboda1337
- [sen6x] fix memory leak issue esphome#14623 by @tuct
- [cpptests] support testing platform components esphome#13075 by @jpeletier
- [serial_proxy] Reduce loop() overhead by disabling when idle and splitting read path esphome#14673 by @bdraco
- [bl0940] Fix reset_calibration() declaration missing from header esphome#14676 by @anunayk
- [core] ESP-IDF compilation fixes esphome#14541 by @diorcety
- [rp2040] Use picotool for BOOTSEL upload and improve upload UX esphome#14483 by @bdraco (new-feature)
- [api] Inline ProtoVarInt::parse fast path and return consumed in struct esphome#14638 by @bdraco
- [api] Replace
std::vector<uint8_t>with APIBuffer to skip zero-fill esphome#14593 by @bdraco - [scheduler] Replace unique_ptr with raw pointers, add leak detection esphome#14620 by @bdraco
- [core] Require explicit synchronous= for register_action esphome#14606 by @bdraco
- [log] Detect early log calls before logger init and optimize hot path esphome#14538 by @bdraco
- [rp2040_ble] Add BLE component for RP2040/RP2350 esphome#14603 by @bdraco (new-component) (new-feature)
- [esp32_hosted] Bump esp_wifi_remote and esp_hosted versions esphome#14680 by @swoboda1337
- [runtime_image] Add support for 8bit BMPs and fix existing issues esphome#10733 by @mahumpula (new-feature)
- [speaker_source] Add new media player esphome#14649 by @kahrendt (new-component) (new-feature) (new-platform)
- [config] Allow !extend/!remove on components without id in schema esphome#14682 by @swoboda1337
- [core] Warn on crystal frequency mismatch during serial upload esphome#14582 by @bdraco
- [dew_point] Add dew_point sensor component esphome#14441 by @CFlix (new-component) (new-feature) (new-platform)
- [socket] Fix RP2040 TCP race condition between lwip callbacks and main loop esphome#14679 by @bdraco
- [esp32] gpio type improvements esphome#14517 by @ximex
- [bme280] Change communication error message to include “no response” hint. esphome#14686 by @CFlix
- [rp2040] Add HardFault crash handler with backtrace esphome#14685 by @bdraco
- [core] Fix waiting for port indefinitely esphome#14688 by @kbx81
- [logger] Fix UART selection not applied before
pre_setup()esphome#14690 by @kbx81 - Enable the address and behavior sanitizers for C++ component unit tests esphome#13490 by @ademuri
- [socket] Fix RP2040 heap corruption from malloc in lwip accept callback esphome#14687 by @bdraco
- [micronova] Add command queue esphome#12268 by @edenhaus (breaking-change)
- [multiple] Convert static function locals to member variables esphome#14689 by @swoboda1337
- [speaker_source] Add playlist management esphome#14652 by @kahrendt (new-feature)
- [sensirion_common] Use SmallBufferWithHeapFallback helper esphome#14270 by @mikelawrence
- [speaker_source] Add shuffle support esphome#14653 by @kahrendt (new-feature)
- Bump pyupgrade to v3.21.2 for Python 3.14 compatibility esphome#14699 by @swoboda1337
- [dashboard] Use sys.executable for dashboard subprocess commands esphome#14698 by @swoboda1337
- [speaker_source] Add announcement pipeline esphome#14654 by @kahrendt (new-feature)
- [socket] Fix LWIP PCB use-after-free on ESP8266 and RP2040 esphome#14706 by @bdraco
- [esp32] Add crash handler to capture and report backtrace across reboots esphome#14709 by @bdraco (new-feature)
- Bump docker/build-push-action from 6.19.1 to 6.19.2 in /.github/actions/build-image esphome#13965 by @dependabot[bot]
- Bump github/codeql-action from 4.32.2 to 4.32.3 esphome#13981 by @dependabot[bot]
- Bump ruff from 0.15.0 to 0.15.1 esphome#13980 by @dependabot[bot]
- Bump actions/stale from 10.1.1 to 10.2.0 esphome#14036 by @dependabot[bot]
- Bump pillow from 11.3.0 to 12.1.1 esphome#14048 by @dependabot[bot]
- Bump cryptography from 45.0.1 to 46.0.5 esphome#14049 by @dependabot[bot]
- Bump esptool from 5.1.0 to 5.2.0 esphome#14058 by @dependabot[bot]
- Bump github/codeql-action from 4.32.3 to 4.32.4 esphome#14161 by @dependabot[bot]
- Bump pylint from 4.0.4 to 4.0.5 esphome#14160 by @dependabot[bot]
- Bump ruff from 0.15.1 to 0.15.2 esphome#14159 by @dependabot[bot]
- Bump aioesphomeapi from 44.0.0 to 44.1.0 esphome#14232 by @dependabot[bot]
- Bump aioesphomeapi from 44.1.0 to 44.2.0 esphome#14324 by @dependabot[bot]
- Bump ruff from 0.15.2 to 0.15.3 esphome#14323 by @dependabot[bot]
- Bump actions/upload-artifact from 6.0.0 to 7.0.0 esphome#14326 by @dependabot[bot]
- Bump ruff from 0.15.3 to 0.15.4 esphome#14357 by @dependabot[bot]
- Bump actions/download-artifact from 7.0.0 to 8.0.0 esphome#14327 by @dependabot[bot]
- Bump click from 8.1.7 to 8.3.1 esphome#11955 by @dependabot[bot]
- Bump github/codeql-action from 4.32.4 to 4.32.5 esphome#14416 by @dependabot[bot]
- Bump the docker-actions group across 1 directory with 2 updates esphome#14520 by @dependabot[bot]
- Bump github/codeql-action from 4.32.5 to 4.32.6 esphome#14566 by @dependabot[bot]
- Bump docker/build-push-action from 6.19.2 to 7.0.0 in /.github/actions/build-image esphome#14567 by @dependabot[bot]
- Bump ruff from 0.15.4 to 0.15.5 esphome#14565 by @dependabot[bot]
- Bump aioesphomeapi from 44.2.0 to 44.3.1 esphome#14580 by @dependabot[bot]
- Bump aioesphomeapi from 44.3.1 to 44.4.0 esphome#14609 by @dependabot[bot]
- Bump aioesphomeapi from 44.4.0 to 44.5.0 esphome#14617 by @dependabot[bot]
- Bump aioesphomeapi from 44.5.0 to 44.5.1 esphome#14624 by @dependabot[bot]
- Bump setuptools from 82.0.0 to 82.0.1 esphome#14665 by @dependabot[bot]