ESPHome 2025.11.0 - November 2025

Release Overview

ESPHome 2025.11.0 is a performance and reliability-focused release that makes your devices faster, more reliable, and more capable than ever before. WiFi connectivity gets a complete overhaul with intelligent mesh network handling, dramatically faster connection times, and enhanced security controls. Memory optimizations free up 2-31KB of RAM and 10KB+ of flash, giving even resource-constrained devices room to grow. A new infrastructure change slashes event processing latency by 600-1,300x—making BLE Proxy GATT operations rival local Bluetooth adapters, even over the network.

WiFi improvements address the most common connectivity pain points: devices no longer get stuck on failed access points in mesh networks, hidden network connections are 2-6 seconds faster, and the new min_auth_mode option provides security controls with WPA2 defaults. The redesigned connection strategy with intelligent AP selection and reliable reconnection logic delivers the rock-solid WiFi performance users expect.

Ultra-low latency event processing transforms responsiveness across BLE, USB, MQTT, ESP-NOW, and wake word detection—reducing latency from 0-16ms to just ~12 microseconds. Voice assistants respond faster to wake words, BLE devices pair quicker, and MQTT automations trigger with sub-millisecond precision. This zero-configuration optimization automatically benefits all affected components on ESP32 platforms.

Memory optimizations touch nearly every core component—WiFi scan management, select options, lights, climate controls, sensors, and the action framework. Sensor filter optimizations deliver the most dramatic gains, with sliding window filters saving up to 25KB of RAM on configurations that previously struggled with memory constraints. These improvements enable more complex configurations on the same hardware.

New hardware support expands ESPHome’s reach with 7 new components including the HDC2010 sensor, MCP3221 ADC, HLK-FM22X face recognition module, BH1900NUX sensor, RX8130 RTC, and TinyUSB foundation support for ESP32-S2/S3. Platform enhancements bring I2C and BLE logging to nRF52, while ESP32 gains hosted BLE for chips without native Bluetooth and ESP-NOW transport capabilities.

Enhanced WiFi Security and Reliability

Dramatically Improved WiFi Reliability and Connection Times (#11805)

A major step forward in WiFi reliability addresses critical connectivity issues in mesh networks and multi-AP environments. Previously, devices would get stuck repeatedly trying the strongest signal even when that access point was rejecting connections—a bug introduced in 2025.8.2 that made the priority-based failover system ineffective.

The redesigned connection strategy delivers measurable improvements:

  • Intelligent AP selection: Connection failure history now takes precedence over signal strength, enabling automatic failover to working access points instead of getting stuck on failed BSSIDs
  • Faster initial connections: Explicit hidden network probing phase with smart skipping of visible networks reduces connection time by 2-6 seconds
  • Reliable reconnections: Two-attempt BSSID filtering eliminates false positives from normal WiFi stack transitions
  • Natural mesh handling: Simplified architecture removes 150+ lines of complex BSSID cycling logic—the priority degradation system now naturally handles mesh networks through scan-based retry cycles
  • Clearer diagnostics: State machine-based retry phases with improved logging make connection issues easier to troubleshoot
  • Memory efficiency: Automatic priority reset when all BSSIDs fail equally (saves up to 96 bytes)

This release restores and improves upon the reliable failover behavior users expect in multi-AP deployments, while reducing connection latency and memory overhead.

Configurable Minimum Authentication Mode (#11814)

Added min_auth_mode configuration option to control WiFi authentication security:

  • Secure default: WPA2 minimum authentication mode protects against downgrade attacks
  • Explicit security control: Choose between WPA, WPA2, or WPA3 (ESP32 only)
  • Backward compatibility: Can be lowered to WPA for legacy routers
wifi:
  ssid: "MyNetwork"
  password: "password123"
  min_auth_mode: WPA2  # Recommended for security

Memory Optimizations for Resource-Constrained Devices

ESPHome 2025.11.0 delivers substantial memory improvements across the entire framework, with measured savings ranging from 2-7KB of RAM on typical devices and up to 31KB of RAM on sensor-heavy configurations. Flash savings reach 10KB+ on ESP32/ESP8266 platforms.

Sensor Filter Optimizations:

  • Sliding window filters (#11282) - Saves 22-25KB RAM on large batch windows, 90% on sliding windows, 1,748 bytes flash on ESP8266. Prevents OOM crashes on ESP32 devices with multiple sensors
  • Filter value lists (#11407) - Saves 444 bytes flash on ESP8266, 18-52% faster execution
  • Calibration/OR filters (#11437) - Saves 464 bytes flash, 48 bytes RAM on ESP8266

Component Optimizations:

  • WiFi component (#11205) - Saves 440-1,192 bytes RAM depending on network density
  • Select component (#11514) - Saves 270-2,800 bytes per select depending on option count
  • Light component (#11348) - Saves 1,756 bytes flash on ESP8266, ~108 bytes RAM per 6 lights
  • Climate component (#11466, #11621) - Saves ~440 bytes RAM per climate entity
  • Fan component (#11483, #11632) - Saves ~24 bytes per fan
  • Event component (#11463, #11767) - Saves 1,248 bytes flash
  • Global Controller Registry (#11772) - Saves 388-6,148 bytes RAM depending on entity count
  • Action framework (#11704) - Saves 356 bytes flash, eliminates RAM allocations in automations
  • Script component (#11308) - Saves 1,592 bytes flash on ESP32
  • ESP32-IDF (#10930, #11441) - Saves ~10KB combined (1.3KB + 8.7KB)
  • Network component (#11707) - Saves 32-72 bytes per network component
  • Light effects (#11487) - Saves 24-32 bytes per effect
  • WiFi priority (#11830) - Saves 3 bytes per network entry plus up to 96 bytes from auto-recovery

Note on Breaking Changes: These optimizations required API changes for external component developers. See Breaking Changes section for migration details. Standard YAML configurations remain fully compatible but custom code in lambdas may require updates.

Ultra-Low Latency Event Processing

Thread-Safe Loop Wake Mechanism (#11681)

A new infrastructure change eliminates event processing delays across multiple components. Previously, events from background tasks (BLE, USB, MQTT, ESP-NOW, wake word detection) would queue and wait up to 16ms for the next select() timeout before processing. The new wake_loop_threadsafe() mechanism uses a UDP loopback socket to immediately wake the main event loop when events arrive.

Latency Improvements:

  • Before: 0-16ms average ~8ms
  • After: ~12 microseconds
  • Speedup: 600-1,300x faster event processing

Components with Ultra-Low Latency:

  • BLE operations (#11663) - Bluetooth Proxy, BLE Client GATT operations, HomeKit pairing
  • USB Host (#11683) - USB event processing over 1000x faster
  • MQTT (#11695) - ESP32 only (ESP8266 already runs in main loop)
  • ESP-NOW (#11696) - Packet reception and transmission completion
  • Micro Wake Word (#11698) - Near-instant automation responses, all triggers fire within same millisecond

Real-World Impact:

  • BLE Proxy GATT operations now rival or exceed BlueZ local adapters in Home Assistant, even when operating over the network
  • Faster wake word detection response for voice assistants
  • Improved BLE connection and pairing times
  • Reduced MQTT automation trigger latency
  • Faster USB event handling (e.g., Z-Wave PoE proxies)

This optimization requires no configuration changes and automatically benefits all affected components on ESP32 platforms.

High-Performance Networking for Media Streaming

Automatic Network Performance Tuning (#11812)

Introduced centralized high-performance networking system where components request optimized settings through network.require_high_performance_networking():

  • PSRAM-aware configuration: Aggressive settings (512KB TCP windows) when PSRAM guaranteed, conservative (65KB windows) otherwise
  • WiFi optimization: Automatically applies optimized WiFi driver settings when high-performance mode enabled
  • Automatic enablement: Speaker media player automatically enables high-performance networking (fixes streaming stuttering issues)
  • User control: New network.enable_high_performance option to explicitly enable/disable

This optimization is critical for ESP32-S3 devices running voice assistants and media streaming, eliminating audio stuttering caused by insufficient WiFi buffer sizes.

PSRAM Configuration Options (#11411)

Added ignore_not_found option (default true) to allow disabling CONFIG_SPIRAM_IGNORE_NOTFOUND. When set to false on devices with guaranteed PSRAM, enables WiFi driver to configure larger buffers for optimal streaming performance. Also improves boot reliability by managing heap allocations before PSRAM initialization.

New Hardware Support

7 New Sensor/Device Components:

Extended Hardware Support:

  • GP8403 DAC now supports GP8413 (15-bit) model (#7726) with higher precision
  • Toshiba climate supports RAS-2819T air conditioner (#9490) with two-packet IR protocol
  • Dallas temperature sensors support index-based addressing (#11346) for devices without programmable addresses
  • SX126x LoRa module pins now support GPIO port expanders (#11782) for SeeedStudio SenseCAP Indicator
  • Mopeka Standard Check sensors support alternate ID 0x44 (#10907)

Platform & Feature Expansions:

  • nRF52 platform - I2C support (#8150), BLE NUS logging (#9846, #9861), GPIO voltage control (#9858), GPIO input by switching to polling mode (#11664), and Seeed XIAO BLE board improvements (#10698)
  • ESP-NOW transport - Added ESP-NOW as a transport platform for packet_transport component (#11025)
  • IR Remote protocols - Dyson AM07 fan support (#10163), Symphony protocol (#10777), Toshiba RAS-2819T AC (#9490)

ESP32 Platform Enhancements

ESP-IDF 5.5.1 and Arduino 3.3.2 (#9839)

Major framework updates bring the latest ESP-IDF 5.5.1 and Arduino 3.3.2 to ESPHome:

  • ESP-IDF 5.5.1: Latest features and bug fixes from Espressif
  • Arduino 3.3.2: Updated Arduino framework with improved stability
  • Memory improvements: Significant RAM gains (+3.1-3.3MB free RAM)
  • Platform version: Updated to 55.03.31-1

These updates are automatically applied when using the default framework versions.

Hosted BLE Support (#11167)

ESP32 P4 and other chips without integrated Bluetooth now support BLE through external controllers using ESP-Hosted API. Enables Bluetooth Proxy functionality on previously unsupported ESP32 variants.

Hosted OTA Support (#11562)

Firmware updates for ESP32 co-processors are now supported via ESP-Hosted API, enabling OTA functionality for hosted configurations.

Brownout Protection (#11306)

ESP-IDF builds now automatically reduce PHY TX power during brownout conditions to prevent boot loops. This feature was previously only available in Arduino framework builds. Can be disabled if needed through sdkconfig options.

Configurable Main Loop Stack Size (#10564)

ESP32 ESP-IDF configurations can now tune the main loop stack size for complex setups:

esp32:
  framework:
    type: esp-idf
    advanced:
      main_loop_stack_size: 16384  # Increase for deeply nested components

Framework Source Options (#11125)

ESP32 framework configuration now accepts additional PlatformIO source schemes beyond HTTP, including symlink://, git://, and other repository protocols for local development.

OpenThread Improvements

Over-The-Air Updates (#11095)

OpenThread devices (ESP32-H2) now support OTA updates via esphome run. The mDNS address is automatically populated as the device’s default address, eliminating the need to manually specify --device <address>.

Sleepy End Device Support (#11374)

Added poll_period configuration for MTD (Minimal Thread Device) mode, enabling Sleep End Device (SED) behavior for battery-powered Thread devices:

openthread:
  device_type: MTD
  poll_period: 40s  # Radio turns off between polls

nRF52 Platform Expansion

The nRF52 (Zephyr) platform received extensive new functionality:

  • I2C Support (#8150) - Full I2C bus support for sensors and peripherals
  • BLE Logging (#9846, #9861) - Log viewing via esphome logs --device BLE or MAC address
  • GPIO High Voltage Mode (#9858) - Adjustable voltage levels for USB-powered operation
  • Xiao BLE Bootloader Fix (#10698) - Corrected default bootloader, fixed upload, added runtime mismatch detection

LVGL Display Enhancements

Simplified Layout System (#10149)

LVGL widgets now support shorthand layout methods for easier configuration:

lvgl:
  widgets:
    - container:
        layout: vertical  # Simple flex layout
        widgets:
          - label:
              text: "Item 1"
          - label:
              text: "Item 2"

    - container:
        layout: 3x2  # Simple grid layout

New container widget provides styling-free base with 100% default dimensions. Added stretch option for flex layouts and substantial speedup of config validation.

Rendering Triggers and NaN Substitution (#11628, #11712)

Added on_draw_start and on_draw_end triggers for coordinating e-paper display updates. Text formatting now supports NaN substitution for graceful handling of unavailable sensor values:

lvgl:
  widgets:
    - label:
        text:
          format: "%.1f°C"
          args: [id(temp_sensor)]
          if_nan: "--.-°C"  # Show when sensor unavailable

Display Component Improvements

E-Paper SPI Refactoring (#11540)

Major improvements to e-paper displays:

  • Faster transfers: Larger data blocks for Spectra displays
  • Optimized state machine: Code-based sequence instead of linear queue saves memory
  • Board-specific configs: Pre-configured pin mappings (Seeed-reTerminal-E1002)
  • Improved timing: Internal delay handling instead of loop disabling
  • Fixed busy pin logic (#11349): Corrected active-low detection

Component Idle Detection (#11651)

New component.is_idle condition and is_idle() method for automations that need to wait for displays to finish updating before proceeding:

lvgl:
  on_draw_end:
    - component.update: epaper_display
    - wait_until:
        component.is_idle: epaper_display  # Wait for display ready
    - lvgl.resume:

Configuration and Developer Tools

Advanced Substitution Features (#11203)

The !extend and !remove tags now support substitutions and Jinja templates:

substitutions:
  COMPONENT_TO_REMOVE: component3

packages:
  base:
    - id: !remove ${COMPONENT_TO_REMOVE}  # Conditional removal

Memory Analysis Command (#11395)

New esphome analyze-memory <config.yaml> command provides detailed memory usage breakdown by component:

  • Compiles configuration (fast relink if cached)
  • Analyzes memory usage by component and external components
  • Displays comprehensive memory report
  • Helps identify optimization opportunities

Component-Specific Enhancements

Sensors

  • Dallas temperature sensors support index-based addressing (#11346) for devices without programmable addresses
  • INA2xx reset control (#10787): Preserve counters through ESP resets with reset_on_boot: false
  • XGZP68xx oversampling (#10306): Configurable oversampling up to 32768x for improved accuracy

Improved Improv WiFi Provisioning (#10757)

ESP32 Improv now supports next_url with template substitutions for post-provisioning redirection:

esp32_improv:
  next_url: "https://example.com/setup?device={{device_name}}&ip={{ip_address}}"

Sensor Heartbeat Filter Options (#10993)

Heartbeat filter adds optimistic mode to forward new values immediately while still repeating periodically:

sensor:
  - platform: template
    filters:
      - heartbeat:
          period: 100ms
          optimistic: true  # Forward immediately + repeat

ESP-NOW Packet Transport (#11025)

ESP-NOW now available as transport platform for packet_transport component, enabling direct ESP32-to-ESP32 wireless sensor data transmission.

Remote Transmitter Non-Blocking Mode (#11524)

Remote transmitter operations no longer block the main loop by default, preventing “took a long time for an operation” warnings during long IR transmissions.

HTTP Request Trigger Variables (#11464)

HTTP request actions now pass trigger variables correctly into on_response and on_error triggers.

Breaking Changes

User-Facing Breaking Changes

WiFi & Network

  • WiFi: WiFi and Ethernet components no longer block other components’ setup until connected. Components with setup priority > WIFI (802.3) now initialize immediately, even if network is disconnected. #9823

  • WiFi min_auth_mode: ESP8266 default will change from WPA to WPA2 in 2026.6.0. Users with WPA-only routers must explicitly set min_auth_mode: WPA before then. #11814

  • WiFi priority: The priority configuration option now only accepts integers (-128 to 127) instead of floats. Change priority: 5.5 to priority: 5. #11830

  • .local addresses: .local addresses now require mDNS to be enabled for DNS resolution. Previously attempted DNS resolution could add 10+ second delays. #11508

  • Network high performance: Speaker media player now always enables high performance networking mode (previously only with codec support). Users can override with enable_high_performance under the network component if needed. #11812

ESP32 Platform

  • ESP32 brownout protection: ESP-IDF now reduces PHY TX power during brownout to prevent boot loops. Can be disabled with sdkconfig_options: CONFIG_ESP_PHY_REDUCE_TX_POWER: n if needed. #11306

  • ESP32-S3 PSRAM: PSRAM mode is now required when multiple PSRAM modes are available (ESP32-S3 only). Users must explicitly choose PSRAM mode in configuration. #11470

Component Behavior Changes

  • Script max_runs: Queued scripts now default to max_runs: 5 (allowing 1 running + 4 queued instances) instead of unlimited to prevent crashes from unbounded memory growth. Set max_runs explicitly if you need more capacity. #11308

  • Remote transmitter: Remote transmitter now defaults to non-blocking mode to prevent long blocking operations (>30ms). #11524

  • Fan preset modes: Fan preset modes now preserve the order defined in YAML instead of being sorted alphabetically. The order in Home Assistant will match your YAML configuration order. #11483

  • Select state: The public state member has been deprecated and will be removed in 2026.5.0. Use current_option() method instead. Deprecation warnings will be shown during compilation. #11623

Component-Specific Changes

  • HM3301: AQI calculation updated to EPA 2024 standard. Values will change compared to the old 2012 formula. #9442

  • GDK101: Firmware version is now reported as a string instead of a float division result. #11029

  • Uponor Smatrix: The address property of the uponor_smatrix component was removed. Device addresses are now 32-bit instead of separate 16-bit system and device addresses. Update configurations by prepending the previous system address to individual device addresses. #11066

  • Pipsolar: Fixed typo warnung_low_pv_energy renamed to warning_low_pv_energy. Update YAML configurations. #10291

  • E-Paper SPI: Busy pin logic corrected to match datasheet (active low). Some e-paper displays may behave differently. #11349

  • nRF52 bootloader: Default bootloader changed for xiao_ble and adafruit_itsybitsy_nrf52840 boards. Warning shown if generic Adafruit bootloader is used. #10698

  • HTTP request triggers: Changed from multiple on_response/on_error triggers to a single trigger that receives variables. Update automation configurations to use the new variable-based trigger format. #11464

YAML Lambda Changes

Users who access component members directly in YAML lambdas may need updates:

  • Select: Change id(my_select).state to id(my_select).current_option() (deprecated, will be removed in 2026.5.0). #11623

  • Fan: Change id(my_fan).preset_mode to id(my_fan).get_preset_mode(). #11632

  • Event: Change id(my_event).last_event_type to id(my_event).get_last_event_type(). #11767

Breaking Changes for Developers

The following changes affect external component developers. Standard YAML configurations are generally not affected.

Core Framework Changes

  • Action/Trigger Framework: All action/trigger/condition method signatures changed to use const references (const Ts&... x) instead of pass-by-value (Ts... x). See the Action Framework Performance Optimization blog post for migration details. #11704

  • Controller API: Controllers now use global registry pattern. Method signatures changed to remove unused state parameters (e.g., on_sensor_update(sensor::Sensor *obj) instead of on_sensor_update(sensor::Sensor *obj, float state)). External controller implementations extremely rare. #11772

  • EntityBase::hash_base(): Removed deprecated virtual method (deprecated since June 2022). Remove hash_base() overrides from external components. #11783

  • hexencode(): Removed function deprecated since 2022.1. Use alternative encoding methods. #11383

  • Schema constants: Removed deprecated schema constants from core. Update external components to use current schema helpers. #11591

Component-Specific API Changes

Climate

See the Climate Entity Class: FiniteSetMask and Flash Storage Optimizations blog post for migration details.

  • Custom modes storage: Changed from std::set<std::string> to FiniteSetMask for supported modes, and from std::vector<std::string> to std::vector<const char *> for custom fan modes and presets. #11466, #11621

  • Member access: Climate device members (custom_fan_mode_, custom_preset_) are now private. Use protected setter methods (set_custom_fan_mode_(), set_custom_preset_()) in derived classes. #11621

  • Deprecated methods: Removed methods deprecated in 1.20 (July 2021). #11388

Light

See the Light Entity Class: Memory Optimizations blog post for migration details.

  • Color modes: Replaced std::set<ColorMode> with ColorModeMask bitmask class. #11348

  • Effect names: Changed from std::string to const char * for effect names. #11487

  • Deprecated methods: Removed methods deprecated in 2021.8.0. #11389

Fan

See the Fan Entity Class: Preset Mode Flash Storage and Order Preservation blog post for migration details.

  • Preset modes: Changed from std::set<std::string> to std::vector<const char *>. The .preset_mode public member has been removed - use get_preset_mode() for reading and set_preset_mode_() for writing in derived classes. #11483, #11632

  • Deprecated code: Removed code deprecated in 2022.2. #11392

Select

See the Select Entity Class: Index-Based Operations and Flash Storage blog post for migration details.

  • Options storage: Changed from std::vector<std::string> to FixedVector<const char *>. #11514

  • State member: Public state member deprecated (will be removed in 2026.5.0). Use current_option() method instead. #11623

  • Index-based operations: Added optional control(size_t index) override for more efficient implementations. #11623

Event

See the Event Entity Class: Memory Optimizations blog post for migration details.

  • Event types storage: Changed from FixedVector<std::string> to FixedVector<const char *>. The last_event_type field is now private - use get_last_event_type() getter instead. #11463, #11767

Network Components

  • WiFi scan results: External components that access WiFi scan results after connection must call wifi.request_wifi_scan_results() in their to_code() function to prevent cleanup. #11205

  • use_address: Changed from const std::string & to const char * in WiFi, Ethernet, and OpenThread components. Update external components calling get_use_address() or set_use_address(). #11707

Other Components

  • Cover: Removed methods deprecated in 2021.9. Update to current cover API. #11391

  • Nextion: Removed methods deprecated in 1.20 (July 2021). Update to current nextion API. #11393

ESP32-Specific Changes

  • ESP-IDF advanced options: New options to disable libc locks in IRAM and VFS features. External components using these features must call helper functions to register needs. #10930, #11441

Migration Resources

For detailed migration guides and examples, see the ESPHome developer documentation.

The 2025.11 release blog posts include comprehensive migration examples for common use cases.

Full list of changes

New Features

New Components

New Platforms

Breaking Changes

Beta Changes

All changes

All Changelogs