ESPHome 2025.12.0: API action responses and HUB75 matrix displays

Release Overview
Section titled “Release Overview”ESPHome 2025.12.0 introduces API action responses for bidirectional communication with Home Assistant, conditional package inclusion for dynamic configurations, and HUB75 LED matrix display support. This release delivers significant memory optimizations saving up to 10KB of IRAM on ESP32 devices, eliminates per-packet heap allocations in API connections and socket latency on ESP8266, and adds 8 new components including the CC1101 sub-GHz transceiver and USB CDC-ACM support. LVGL receives multiple usability improvements, and the WiFi component has been refactored for instant callback-based updates across all platforms.
API Action Responses
Section titled “API Action Responses”The Native API now supports actions that send structured responses back to clients like Home Assistant, enabling true bidirectional communication where actions return success/error status and JSON data payloads (esphome#12136).
Key Features:
- Status responses - Report success or failure with optional error messages
- Data responses - Return structured JSON data from actions using ArduinoJson
- Auto-detection - Response mode automatically detected based on
api.respondusage - Three modes -
none(fire and forget),status(success/error only), oroptional/only(with data)
This unlocks new use cases like query-type actions that return device configuration, sensor readings, or diagnostic information directly to Home Assistant.
api: actions: - action: get_sensor_reading variables: sensor_name: string then: - api.respond: data: !lambda |- root["sensor"] = sensor_name; root["value"] = 42.5; root["unit"] = "°C";Conditional Package Inclusion
Section titled “Conditional Package Inclusion”The packages system now supports conditional inclusion, a long-awaited feature that enables dynamic configuration based on substitution variables (esphome#11605).
Key Features:
- Conditional imports - Include packages based on boolean conditions using Jinja2 expressions
- Package merging after substitutions - Packages are now merged after substitution resolution, enabling generated components to merge correctly with manually defined ones
- LVGL extend support - The
!extendand!removedirectives now work with LVGL-style configurations (esphome#11534)
substitutions: network_package: !include network.yaml network_enabled: true
packages: - ${ network_enabled and network_package or {} }This enables creating reusable configuration templates that adapt to different hardware variants or deployment scenarios.
HUB75 LED Matrix Display Support
Section titled “HUB75 LED Matrix Display Support”The new hub75 component brings native support for HUB75 LED matrix panels, enabling large-format LED displays for information dashboards, signage, and creative projects (esphome#11153).
Key Features:
- Multiple ESP32 variants - Supports ESP32 (I2S), ESP32-S3 (LCD CAM + GDMA), and ESP32-P4 (PARLIO)
- Flexible configuration - Configurable panel dimensions, clock speed, and pin assignments
- LVGL compatible - Works seamlessly with LVGL for rich graphical interfaces
- Board presets - Pre-configured settings for popular boards like Apollo Automation M1
CC1101 Sub-1GHz Transceiver
Section titled “CC1101 Sub-1GHz Transceiver”The new cc1101 component adds support for the Texas Instruments CC1101 Sub-1GHz transceiver, enabling 433MHz remote control integration and other sub-GHz wireless applications (esphome#11849).
Key Features:
- 433.92MHz support - Perfect for integrating 433MHz remotes and sensors
- ASK/OOK modulation - Works with common remote control protocols
- Core integration - Designed to work with
remote_receiverandremote_transmittercomponents - Robust initialization - Non-blocking state machine with proper chip reset handling
USB CDC-ACM Support
Section titled “USB CDC-ACM Support”The new usb_cdc_acm component enables USB virtual serial port functionality on ESP32-S2 and ESP32-S3 devices (esphome#11687).
Key Features:
- Multi-interface support - Up to 2 independent CDC-ACM interfaces per device
- Configurable buffers - Adjustable RX/TX ring buffer sizes
- Line state callbacks - Notifications for DTR, RTS, baud rate, and other line coding changes
- Bridge-ready - Designed to connect USB serial interfaces to UART or other serial interfaces
WiFi Info Callback Architecture
Section titled “WiFi Info Callback Architecture”The WiFi component has been refactored from polling-based updates to event-driven callbacks, significantly improving responsiveness (esphome#10748).
Key Features:
- Immediate updates - WiFi info sensors now update instantly when state changes instead of waiting for poll intervals
- Reduced overhead - Eliminates continuous polling in wifi_info sensors
- Platform consistency - All platforms (ESP8266, ESP32, LibreTiny, Pico W) now use the same callback infrastructure
- New power save mode sensor - Reports current WiFi power save mode (esphome#11480)
- AP active condition - New
wifi.ap_activecondition for automation triggers (esphome#11852)
Low Latency UART Processing
Section titled “Low Latency UART Processing”The UART component now supports a wake_loop_on_rx flag that wakes the main loop immediately when data arrives, enabling near-real-time serial processing (esphome#12172).
Key Benefits:
- Z-Wave Proxy performance - Reduces latency by ~10ms for WiFi-connected ZWA-2 devices, building on the USB-connected Ethernet/PoE optimizations from 2025.11.0 (esphome#12135)
- Real-time serial applications - Any component requiring fast response to incoming serial data can now achieve sub-millisecond wake times by enabling this flag in their code
- Automatic infrastructure - The socket wake infrastructure is automatically enabled when any UART requests RX wake
ESP8266 Socket Latency Elimination
Section titled “ESP8266 Socket Latency Elimination”ESP8266 previously had higher network latency than ESP32 and LibreTiny because it used polling for socket data, sleeping up to 16ms before discovering incoming data. This affected every API request and Home Assistant command. The loop now wakes within microseconds of data arriving using ESP8266’s esp_schedule() mechanism, bringing ESP8266 to near parity with ESP32 and LibreTiny. This is automatic for all ESP8266 devices with no configuration needed (esphome#12397).
Memory and IRAM Optimizations
Section titled “Memory and IRAM Optimizations”This release includes substantial memory optimizations, particularly for ESP32 devices using ESP-IDF:
FreeRTOS and Ring Buffer Flash Placement:
- ~8KB IRAM savings - FreeRTOS functions moved to flash by default (esphome#12182)
- ~1.5KB additional IRAM savings - Ring buffer functions moved to flash (esphome#12184)
- Escape hatches - Use
freertos_in_iram: trueorringbuf_in_iram: trueif issues occur
These changes prepare ESPHome for ESP-IDF 6.0 where flash placement becomes the default.
BLE Client Memory Reduction:
- 24-40 bytes per BLE client - Replaced
std::stringwith fixedchar[18]for MAC address storage (esphome#12070)
Text Sensor Optimization:
- 24-32 bytes per text sensor - Eliminated duplicate string storage when no filters configured (esphome#12205)
Dashboard Import Optimization:
- Eliminates URL heap allocation:
- Package import URL is now stored as a pointer to
.rodatainstead of a heap-allocatedstd::string. - On ESP32,
.rodataresides in flash, providing RAM savings. - On ESP8266,
.rodatais in RAM, but this still avoids heap overhead. - (esphome#11951)
- Package import URL is now stored as a pointer to
API Connection Optimizations:
The API connection layer received significant optimizations to reduce heap fragmentation and memory churn:
- Eliminated per-packet heap allocation - Previously every API packet received required a new heap allocation. The receive buffer is now reused across packets, with excess capacity released after initial sync completes. This reduces heap fragmentation on busy devices. For quiet devices, the initial sync memory spike is released rather than held for the lifetime of the connection. (Connections can last for months.) (esphome#12133)
- Zero-copy API commands - Select and light effect commands now process strings directly from protobuf buffer without heap allocation (esphome#12329, esphome#12384)
- Flash storage for device info - Device info strings stored in flash on ESP8266 (esphome#12173)
- Flash storage for state subscriptions - Home Assistant state subscriptions stored in flash instead of heap (esphome#12008)
- Reduced service call storage - Home Assistant service call strings use less heap (esphome#12151)
- APINoiseContext optimization - Removed shared_ptr overhead (esphome#11981)
- Loop-based reboot timeout - Avoids scheduler heap churn (esphome#12291)
Sensor Timeout Filter Optimization:
- Eliminates scheduler heap churn - Timeout filters now use a loop-based implementation instead of scheduler timeouts. This is particularly important for LD2410/LD2420/LD2450 users with many timeout filters, where the old implementation caused ~70 heap operations/second and constant scheduler pool exhaustion when someone was in range of the sensor (esphome#11922)
New Hardware Support
Section titled “New Hardware Support”This release adds support for 8 new components and numerous display models:
New Sensor Components:
- hlw8032 - Single-phase power metering IC (esphome#7241)
- stts22h - High-accuracy temperature sensor (esphome#11778)
- thermopro_ble - ThermoPro BLE temperature/humidity sensors (esphome#11835)
- hc8 - HC8 CO2 sensor (esphome#11872)
New Time Component:
- bm8563 - BM8563 I2C RTC (esphome#11616)
New Display Models:
- Waveshare 4.26” e-paper with SSD1677 controller (esphome#11887)
- Waveshare S3 LCD 3.16” (esphome#12309)
- Guition JC4827W543 480x272 display (esphome#12034)
- Guition JC4880P443 480x800 MIPI DSI display (esphome#12068)
- M5Stack Core2 display (esphome#12301)
Platform Enhancements:
- ESP32-C5 PSRAM support with quad mode and speeds up to 120MHz (esphome#12215)
- Seeed XIAO ESP32-C6 board definition (esphome#12307)
- Remote transmitter/receiver support for RP2040 (esphome#12048)
- nRF52 DC-DC converter settings (esphome#11841)
LVGL Improvements
Section titled “LVGL Improvements”Multiple enhancements improve the LVGL experience:
- Direct button text - Set
text:directly on buttons without nested label widgets (esphome#11964) - Auto row/column padding -
pad_allnow applies to inter-row/column spacing in flex layouts (esphome#11879) - Display sync option - New
update_when_display_idleoption syncs LVGL updates with display refresh (esphome#11896) - Enhanced arc widget - More arc parameters available in update actions (esphome#12066)
- Scroll properties - Added missing scroll-related configuration options (esphome#11901)
Component Enhancements
Section titled “Component Enhancements”Gree Climate:
- New
turbo,light,health, andxfanswitches for supported models (esphome#12160)
Climate IR:
- Optional humidity sensor support (esphome#9805)
SPS30 Particulate Sensor:
- Idle mode functionality to extend sensor life and reduce power consumption (esphome#12255)
PCA9685 PWM:
- Phase balancer option to fix LED flickering during animations (esphome#9792)
Prometheus:
- Event and text component metrics support (esphome#10240)
MCP3204 ADC:
- Differential mode measurement support (esphome#7436)
Developer Features
Section titled “Developer Features”IDF Component Improvements:
- Shorthand syntax for ESP-IDF components like
espressif/esp_hosted^2.6.6(esphome#12127) - YAML can now override component versions defined in code
API Enhancements:
state_subscription_onlyflag for reliable API connection detection without logger false positives (esphome#11906)- New
measurement_anglestate class for angle sensors (esphome#12085)
Breaking Changes
Section titled “Breaking Changes”Component Changes
Section titled “Component Changes”-
Micronova: Multiple configuration changes (esphome#12226, esphome#12318, esphome#12371):
update_intervalmoved from hub to individual entities - remove frommicronova:section and add to each sensor/text_sensormemory_locationnow restricted to read locations (0x00-0x79) - subtract 0x80 from values above 0x79memory_write_locationremoved from number entities (now calculated automatically)- Custom button/sensor entities now require explicit
memory_locationandaddressconfiguration
-
Prometheus: Light color metrics (
light_color_*) are now only generated if the light component supports those color modes. This reduces memory usage on ESP8266 but may affect monitoring setups that expected all metrics regardless of light capabilities. esphome#9530 -
Text Sensor: The public
raw_statemember has been removed. If you access.raw_statedirectly in a lambda, update to use.get_raw_state()instead. esphome#12205
Platform Changes
Section titled “Platform Changes”- I2C on ESP32-C5/C6/P4: Fixed I2C port logic for chips with Low Power (LP) I2C ports. Users with multiple I2C buses on these chips may need to verify their port assignments. esphome#12063
Behavior Changes
Section titled “Behavior Changes”- WiFi Info: Text sensors now use callback-based updates instead of polling. Updates happen immediately when WiFi state changes rather than on fixed intervals. This improves responsiveness but may change timing behavior if your automations depended on the polling interval. esphome#10748
Breaking Changes for Developers
Section titled “Breaking Changes for Developers”-
Component::mark_failed() and status_set_error(): The
const char*overloads are deprecated and will be removed in 2026.6.0. UseLOG_STR()instead:this->mark_failed(LOG_STR("Error message")). This fixes dangling pointer bugs when passing temporary strings. esphome#12021 -
BLEClientBase::address_str(): Return type changed from
const std::string&toconst char*. Remove.c_str()calls:client->address_str()instead ofclient->address_str().c_str(). esphome#12070 -
TextSensor::raw_state: Changed from public member to protected
raw_state_. Useget_raw_state()method instead of direct member access. esphome#12205 -
WiFi component callbacks: New callback architecture with
wifi_connect_state_callback_,ip_state_callback_, andwifi_scan_state_callback_. Automation triggers moved toautomation.h. esphome#10748 -
Micronova:
MicroNovaFunctionsenum removed - value interpretation now determined at compile time. Theget_set_fan_speed_offset()public method removed from sensor entity. esphome#12363
For detailed migration guides and API documentation, see the ESPHome Developers Documentation.
Release 2025.12.1 - December 19
Section titled “Release 2025.12.1 - December 19”- [cc1101] Fix default frequencies esphome#12539 by @anna-oake
- [pm1006] Fix “never” update interval detection esphome#12529 by @jackwilsdon
- [bme68x_bsec2_i2c] Add MULTI_CONF to fix multiple sensors esphome#12535 by @swoboda1337
- [esp32_camera] Fix I2C driver conflict with other components esphome#12533 by @swoboda1337
- [template.alarm_control_panel] Fix compile without binary_sensor esphome#12548 by @swoboda1337
- [esp32_ble, esp32_ble_tracker] Fix crash, error messages when
ble.disablecalled during boot esphome#12560 by @kbx81
Release 2025.12.2 - December 23
Section titled “Release 2025.12.2 - December 23”- [pca9685,sx126x,sx127x] Use frequency/float_range check esphome#12490 by @ximex
- [wifi] Fix for
wifi_infowhen static IP is configured esphome#12576 by @kbx81 - [display_menu_base] Call on_value_ after updating the select esphome#12584 by @ellull
- [hub75] Bump esp-hub75 version to 0.1.7 esphome#12564 by @stuartparmenter
- [syslog] send NIL (”-”) as timestamp if time source is not valid esphome#12588 by @leo-b
- [cc1101] Fix option defaults and move them to YAML esphome#12608 by @anna-oake
- [esp32_camera] Throttle frame logging to reduce overhead and improve throughput esphome#12586 by @bdraco
- [cc1101] Fix packet mode RSSI/LQI esphome#12630 by @swoboda1337
Release 2025.12.3 - December 30
Section titled “Release 2025.12.3 - December 30”- [lvgl] Fix lambdas in canvas actions called from outside LVGL context esphome#12671 by @bdraco
- [core] Fix incremental build failures when adding components on ESP32-Arduino esphome#12745 by @bdraco
Release 2025.12.4 - December 31
Section titled “Release 2025.12.4 - December 31”- [hub75] Add clipping check esphome#12762 by @stuartparmenter
- [wifi] Fix ESP-IDF reporting connected before DHCP completes on reconnect esphome#12755 by @bdraco
- [docker] Add build-essential to fix ruamel.yaml 0.19.0 compilation esphome#12769 by @bdraco
Release 2025.12.5 - January 6
Section titled “Release 2025.12.5 - January 6”- [lvgl] Fix arc background angles esphome#12773 by @clydebarrow
- [sn74hc595]: fix ‘Attempted read from write-only channel’ when using esp-idf framework esphome#12801 by @aanikei
- [wts01] Fix negative values for WTS01 sensor esphome#12835 by @cnrd
- [esp32_ble] Remove requirement for configured network esphome#12891 by @clydebarrow
- [cc1101] Add PLL lock verification and retry support esphome#13006 by @swoboda1337
Release 2025.12.6 - January 13
Section titled “Release 2025.12.6 - January 13”- [espnow] fix channel validation esphome#13057 by @ssieb
- [seeed_mr24hpc1] Add ifdef guards for conditional entity types esphome#13147 by @swoboda1337
- [ltr_als_ps] Remove incorrect device_class from count sensors esphome#13167 by @swoboda1337
- [packet_transport] Fix packet size check to account for round4 padding esphome#13165 by @swoboda1337
- [remote_transmitter] Fix ESP8266 timing by using busy loop esphome#13172 by @swoboda1337
- [esphome] Fix OTA backend abort not being called on error esphome#13182 by @bdraco
Release 2025.12.7 - January 16
Section titled “Release 2025.12.7 - January 16”- [i2s_audio] Bugfix: Buffer overflow in software volume control esphome#13190 by @kahrendt
- [api] Use subtraction for protobuf bounds checking esphome#13306 by @bdraco
Full List of Changes
Section titled “Full List of Changes”For the complete list of every merged pull request in this release, see the full 2025.12.0 changelog.





Comments