ESPHome 2025.12.0 - December 2025
Release Overview

Full list of changes

New Features

New Components

Breaking Changes

- [core] Deprecate unsafe const char
* APIs in mark_failed() and status_set_error(), add LogString* overloads esphome#12021 by @bdraco (breaking-change) - [wifi_info] Use callbacks instead of polling esphome#10748 by @kbx81 (breaking-change)
- [esp32_ble_client] Replace std::string with char[18] for BLE address storage esphome#12070 by @bdraco (breaking-change)
- [prometheus] Avoid generating unused light color metrics to reduce memory usage on ESP8266 esphome#9530 by @pgolawsk (breaking-change)
- [text_sensor] Avoid duplicate string storage when no filters configured esphome#12205 by @bdraco (breaking-change)
- [micronova] Set update_interval on entities instead on hub esphome#12226 by @edenhaus (breaking-change)
- [micronova] Set the write bit automatically esphome#12318 by @edenhaus (breaking-change)
- [i2c] Fix port logic with ESP-IDF esphome#12063 by @arno1801 (breaking-change)
- [micronova] Remove MicroNovaFunctions esphome#12363 by @edenhaus (breaking-change)
- [micronova] Require memory location and address for custom entities esphome#12371 by @edenhaus (breaking-change)
All changes

- [wifi] Pass ManualIP by const reference to reduce stack usage esphome#11858 by @bdraco
- [esp32_ble] Use stack allocation for MAC formatting in dump_config esphome#11860 by @bdraco
- [wifi] Use stack allocation for BSSID formatting in logging esphome#11859 by @bdraco
- [nrf52] add settings for dcdc converter esphome#11841 by @tomaszduda23 (new-feature)
- [font] Store data in flash only esphome#11926 by @clydebarrow
- [binary_sensor] Modernize to C++17 nested namespaces and remove redundant qualifications esphome#11929 by @bdraco
- Add tests for sensor timeout filters esphome#11923 by @bdraco
- [lvgl] Migrate lv_font creation into Font class and optimize esphome#11915 by @clydebarrow
- [cover] Modernize to C++17 nested namespaces esphome#11935 by @bdraco
- [config] !extend / !remove support for LVGL-style configs esphome#11534 by @jpeletier (new-feature)
- [number] Modernize to C++17 nested namespaces esphome#11945 by @bdraco
- [wifi] Skip redundant setter calls for default values esphome#11943 by @bdraco
- [dashboard_import] Store package import URL in .rodata instead of RAM esphome#11951 by @bdraco
- [ld24xx] Use stack allocation for MAC and version formatting esphome#11961 by @bdraco
- [bme68x] Print error when no sensors are configured esphome#11976 by @swoboda1337
- [wifi, captive_portal, web_server, wifi_info] Use stack allocation for MAC address formatting esphome#11963 by @bdraco
- [light] Modernize namespace declarations to C++17 syntax esphome#11986 by @bdraco
- [ld24xx] Modernize namespace declarations to C++17 syntax esphome#11988 by @bdraco
- [api] Fix format warnings in dump esphome#11999 by @swoboda1337
- [socket] Fix IPv6 address parsing for BSD sockets esphome#11996 by @dwmw2
- [stts22h] Add support for STTS22H temperature sensor esphome#11778 by @B48D81EFCC (new-component) (new-feature) (new-platform)
- Document XFLIP handling in ST7701S esphome#12014 by @jpeletier
- [select] Modernize namespace declarations to C++17 syntax esphome#12007 by @bdraco
- [mdns] Modernize to C++17 nested namespace syntax esphome#11983 by @bdraco
- [lock] Modernize to C++17 nested namespaces esphome#11982 by @bdraco
- [core] Document threading model rationale in ThreadModel enum esphome#11979 by @bdraco
- [nrf52,i2c] fix review comment esphome#11931 by @tomaszduda23
- [core] Optimize DelayAction for no-argument case using if constexpr esphome#11913 by @bdraco
- [hc8] Add support for HC8 CO2 sensor esphome#11872 by @omartijn (new-component) (new-feature) (new-platform)
- [climate_ir] Add optional humidity sensor esphome#9805 by @damib (new-feature)
- [tests] Fix mipi_spi test board esphome#12031 by @ximex
- [mcp3204] differential mode support esphome#7436 by @markodraca (new-feature)
- [bm8563] Add bm8563 component esphome#11616 by @abmantis (new-component) (new-feature) (new-platform)
- [api] Rename
USE_API_SERVICES to USE_API_USER_DEFINED_ACTIONS esphome#12029 by @jesserockz - [core] Fix error on invalid id extend/remove esphome#12064 by @jpeletier
- [ci] Fix filename esphome#12065 by @swoboda1337
- [ci] Fix test grouping esphome#12067 by @swoboda1337
- [mipi_dsi] add guition JC4880P443 display esphome#12068 by @23900 (new-feature)
- [logger] Reduce UART overhead on ESP32/ESP8266 and fix buffer truncation esphome#11927 by @bdraco
- [api] Reduce heap allocations in DeviceInfoResponse esphome#11952 by @bdraco
- [web_server_base] Replace shared_ptr with unique_ptr for AsyncWebServer esphome#11984 by @bdraco
- [ethernet] Conditionally compile manual_ip to save 24 bytes RAM esphome#11832 by @bdraco
- [light] Dynamically disable loop when idle to reduce CPU overhead esphome#11881 by @bdraco
- [api] Use stack buffer for MAC address in Noise handshake esphome#12072 by @bdraco
- [wifi] ap_active condition esphome#11852 by @AzonInc (new-feature)
- [esp32] Use the IDF I2C implementation on Arduino esphome#12076 by @swoboda1337
- [thermopro_ble] Add thermopro ble support esphome#11835 by @sittner (new-component) (new-feature) (new-platform)
- [prometheus] Add event and text base components metrics esphome#10240 by @jzucker2 (new-feature)
- [api] Connected Condition - state_subscription_only flag esphome#11906 by @AzonInc (new-feature)
- [api] Optimize APINoiseContext memory usage by removing shared_ptr overhead esphome#11981 by @bdraco
- [api] Remove redundant socket pointer from APIFrameHelper esphome#11985 by @bdraco
- [wifi] Add runtime power saving mode control esphome#11478 by @kahrendt
- [logger] Eliminate strlen overhead on LibreTiny esphome#11938 by @bdraco
- [wifi] Use ESP-IDF IP formatting macros directly to eliminate heap allocations esphome#12078 by @bdraco
- [prometheus] Use current_option() instead of deprecated .state for select entities esphome#12079 by @bdraco
- [core] Deprecate unsafe const char
* APIs in mark_failed() and status_set_error(), add LogString* overloads esphome#12021 by @bdraco (breaking-change) - [bluetooth_proxy] Fix crash due to null pointer esphome#12084 by @kbx81
- [wifi_info] Use callbacks instead of polling esphome#10748 by @kbx81 (breaking-change)
- [ble_client] Write static BLE data directly from flash without allocation esphome#11826 by @bdraco
- [template.alarm_control_panel] Replace std::map with FixedVector for heap and flash savings esphome#11893 by @bdraco
- Add more lvgl arc update parameters esphome#12066 by @bdm310 (new-feature)
- [esp8266] Use C++17 nested namespaces and constexpr esphome#12096 by @bdraco
- [api] Use const char
* pointers for light effects to eliminate heap allocations esphome#12090 by @bdraco - [core] Reduce flash size by combining set_name() and set_object_id() calls esphome#11941 by @bdraco
- [web_server] Consolidate turn_on/turn_off handlers to eliminate duplicate lambdas esphome#12094 by @bdraco
- [esp32_ble] Optimize name storage to reduce RAM and eliminate heap allocations esphome#12071 by @bdraco
- [ltr390] Simplify mode tracking with bitmask instead of vector/function esphome#12093 by @bdraco
- [sht4x] Read and store a serial number of SHT4x sensors esphome#12089 by @namezys
- Add developer-breaking-change labelling esphome#12095 by @jesserockz
- [core] Replace seq<>/gens<> with std::index_sequence for code clarity esphome#11921 by @bdraco
- [core] Deduplicate identical stateless lambdas to reduce flash usage esphome#11918 by @bdraco
- [esp32_ble_client] Replace std::string with char[18] for BLE address storage esphome#12070 by @bdraco (breaking-change)
- [lvgl] Fix lambda return types for coord and font validators esphome#12113 by @bdraco
- [lvgl] Add missing obj scroll properties esphome#11901 by @clydebarrow (new-feature)
- [lvgl] Automatically pad rows and columns esphome#11879 by @clydebarrow (new-feature)
- Revert “[core] Deduplicate identical stateless lambdas to reduce flash usage” esphome#12117 by @bdraco
- [packages] Fix package schema validation esphome#12116 by @jpeletier
- [prometheus] Avoid generating unused light color metrics to reduce memory usage on ESP8266 esphome#9530 by @pgolawsk (breaking-change)
- make thermostat humidification_action public esphome#12132 by @jonoberheide
- [core] Fix for missing arguments to shared_lambda esphome#12115 by @clydebarrow
- [lvgl] Add option to sync updates with display esphome#11896 by @clydebarrow (new-feature)
- [lvgl] Allow setting text directly on a button esphome#11964 by @clydebarrow (new-feature)
- [epaper_spi] Add SSD1677 and Waveshare 4.26 esphome#11887 by @clydebarrow (new-feature)
- [inkplate] Ignore strapping pin warnings on default pins esphome#12110 by @jesserockz
- [esp32] Improve IDF component support esphome#12127 by @swoboda1337 (new-feature)
- [logger] Replace std::function callbacks with LogListener interface esphome#12153 by @bdraco
- [light] Replace sparse enum switch with linear search to save 156 bytes RAM esphome#12140 by @bdraco
- [wifi] Save 112 bytes BSS on ESP8266 by calling SDK directly for BSSID esphome#12137 by @bdraco
- [esp32_ble_tracker] Replace scanner state callback with listener interface esphome#12156 by @bdraco
- [wifi] Replace std::function callbacks with listener interfaces esphome#12155 by @bdraco
- [api] Eliminate rx_buf heap churn and release buffers after initial sync esphome#12133 by @bdraco
- [tests] Remote packages with substitutions esphome#12145 by @jpeletier
- [packages] Restore remote shorthand vars and !remove in early package contents validation esphome#12158 by @jpeletier
- [sensor] Replace timeout filter scheduler with loop-based implementation esphome#11922 by @bdraco
- [logger] Conditionally compile log level change listener esphome#12168 by @bdraco
- [ble_client] Convert to C++17 namespace style esphome#12176 by @bdraco
- [number] Reduce NumberCall size by 4 bytes on 32-bit platforms esphome#12178 by @bdraco
- [light] Store log_percent parameter strings in flash on ESP8266 esphome#12174 by @bdraco
- [mipi_spi] add guition JC4827W543 C/R esphome#12034 by @jpeletier (new-feature)
- Add MEASUREMENT_ANGLE to SensorStateClass esphome#12085 by @jakubcermak (new-feature)
- [ade7953_base] Add missing CODEOWNERS esphome#12181 by @dlitz
- [climate] Use C++17 nested namespace syntax esphome#12194 by @bdraco
- [esp32_can] Add P4 support esphome#12201 by @swoboda1337
- [openthread] Add C5 support esphome#12200 by @swoboda1337
- [mdns] Bump mDNS component to 1.9.1 esphome#12207 by @HeMan
- [lock] Refactor trigger classes to template and add integration tests esphome#12193 by @bdraco
- [web_server] Replace routing table with if-else chain to save 116 bytes RAM esphome#12139 by @bdraco
- [psram] Add C5 support esphome#12215 by @swoboda1337 (new-feature)
- [uart] Add
wake_loop_on_rx flag for low latency processing esphome#12172 by @kbx81 - [wifi_info] Fix compilation error when using only mac_address sensor, add tests esphome#12222 by @kbx81
- [uart] Convert to C++17 namespace style esphome#12220 by @kbx81
- [core] Fix status_momentary API misuse and optimize parameter type esphome#12216 by @bdraco
- [micronova] Convert to C++17 namespace style esphome#12229 by @edenhaus
- [remote_transmitter, remote_receiver] Add RP2040 support esphome#12048 by @j-be (new-feature)
- [uart] Automatically enable the socket wake infrastructure when RX wake requested esphome#12221 by @kbx81
- [zwave_proxy] Use new socket wake infrastructure to reduce latency, convert to C++17 namespace style esphome#12135 by @kbx81
- [helpers] Fix unit tests following #12135 esphome#12237 by @kbx81
- [datetime] Convert to C++17 nested namespace style esphome#12235 by @bdraco
- [button] Convert to C++17 nested namespace style esphome#12233 by @bdraco
- [mqtt] Enable support for the RTL87XX platform esphome#7697 by @popovec
- [esp8266] Allow IN&OUT pin config for ESP8266 esphome#12238 by @DjordjeMandic
- [esp32] Place FreeRTOS functions in flash by default (prep for IDF 6.0) esphome#12182 by @bdraco (new-feature)
- [cover] Store cover state strings in flash on ESP8266 esphome#12196 by @bdraco
- [ota] Use ESP-IDF OTA backend for all ESP32 builds esphome#12244 by @swoboda1337
- [esp32] Place ring buffer functions in flash by default (prep for IDF 6.0) esphome#12184 by @bdraco (new-feature)
- [text_sensor] Avoid duplicate string storage when no filters configured esphome#12205 by @bdraco (breaking-change)
- [core] Filter noisy platformio log messages esphome#12218 by @swoboda1337
- [lock] Store lock state strings in flash on ESP8266 esphome#12163 by @bdraco
- [esp32_camera] Replace std::function callbacks with CameraListener interface esphome#12165 by @bdraco
- [light] Use listener pattern for state callbacks with lazy allocation esphome#12166 by @bdraco
- [core] Add RAM strings and symbols analysis to analyze-memory command esphome#12161 by @bdraco
- [web_server] Store update state strings in flash on ESP8266 esphome#12204 by @bdraco
- [valve] Store valve state strings in flash on ESP8266 esphome#12202 by @bdraco
- [web_server_idf] Fix SSE multi-line message formatting esphome#12247 by @bdraco
- [text_sensor] Add deprecation warning for raw_state member access esphome#12246 by @bdraco
- [wifi] Fix ap_active condition esphome#12227 by @AzonInc
- [core] Add PROGMEM macros and move web_server JSON keys to flash esphome#12214 by @bdraco
- [tests] Allow substitution tests to run independently for debugging esphome#12224 by @jpeletier
- [gree]
turbo, light, health, xfan switches for supported models esphome#12160 by @nagyrobi (new-feature) (new-platform) - [cc1101] Add new cc1101 component esphome#11849 by @lygris (new-component) (new-feature)
- [text_sensor] Fix spurious raw_state deprecation warnings esphome#12262 by @bdraco
- [tests] Add testing of command line substitutions esphome#12210 by @jpeletier
- [core] Improve CORE.data documentation with dataclass pattern esphome#12170 by @bdraco
- [cst816] Fix CST826 & CST836 esphome#12260 by @jsmarion
- [wifi, wifi_info] Add a WiFi power mode text sensor esphome#11480 by @kahrendt (new-feature)
- [esp32] Sort variants in situ esphome#10410 by @ximex
- [lvgl] fix hello_world passing invalid parameter to parse_yaml esphome#12274 by @jpeletier
- [tests] Bump esp32_hosted in the test code esphome#12289 by @swoboda1337
- [CI] Update renamed action repo esphome#12290 by @jesserockz
- [api] Use loop-based reboot timeout check to avoid scheduler heap churn esphome#12291 by @bdraco
- [remote_receiver] buffer usage fix and idle optimizations esphome#9999 by @Citizen07
- Update readme logo esphome#12294 by @jesserockz
- [esp32] Change imports to use esp32 only, not .const esphome#12243 by @jesserockz
- [remote_receiver] Fix Zephyr clang tidy esphome#12299 by @swoboda1337
- [api] Simplify MessageCreator to trivially copyable type esphome#12295 by @bdraco
- [esp32] Add support for ESP32-C61 variant esphome#12285 by @swoboda1337
- [light] Fix schedule_show not enabling loop for idle addressable lights esphome#12302 by @bdraco
- [sps30] Add idle mode functionality esphome#12255 by @c0mputerguru (new-feature)
- [hub75] HUB75 display component esphome#11153 by @stuartparmenter (new-component) (new-feature) (new-platform)
- [mipi_spi] Add M5CORE2 model that extends the ILI9341 driver chip esphome#12301 by @lboue (new-feature)
- [esp32] Add missing variant support esphome#12305 by @swoboda1337
- [cc1101] Use Hz and cv.frequency instead of kHz esphome#12313 by @swoboda1337
- [image] Add USE_IMAGE in defines.h esphome#12317 by @clydebarrow
- [ci-custom] Fix after switch from string to path esphome#12314 by @clydebarrow
- [api] Device defined action responses esphome#12136 by @jesserockz (new-feature)
- [text_sensor] Reduce filter memory usage using const char
* esphome#12334 by @bdraco - [nextion] Use 16-bit id for pics esphome#12330 by @edwardtfn
- [text] Add component tests with pattern coverage esphome#12345 by @bdraco
- [esp8266] Allow use of recvfrom for esphome sockets esphome#12342 by @elupus
- [template] Use C++17 nested namespace syntax esphome#12346 by @bdraco
- [text] Store pattern as const char
* to reduce memory usage esphome#12335 by @bdraco - [micronova] Set update_interval on entities instead on hub esphome#12226 by @edenhaus (breaking-change)
- [micronova] Move STOVE_STATES to text sensor file as it’s used only there esphome#12349 by @edenhaus
- [micronova] Add FINAL_VALIDATE_SCHEMA to validate uart esphome#12350 by @edenhaus
- [core] Move Color::gradient to cpp to avoid duplicate code esphome#12348 by @bdraco
- [wifi_signal] Update signal strength immediately on WiFi connect/disconnect esphome#12347 by @bdraco
- [wifi_signal] Add ifdef guards for clang-tidy compatibility esphome#12362 by @bdraco
- Add seeed_xiao_esp32c6 board definition esphome#12307 by @berikv (new-feature)
- [micronova] Set the write bit automatically esphome#12318 by @edenhaus (breaking-change)
- [hlw8032] Single-phase metering IC esphome#7241 by @rici4kubicek (new-component) (new-feature) (new-platform)
- [hub75] fix id conflict esphome#12365 by @arno1801
- [usb_cdc_acm] New component esphome#11687 by @kbx81 (new-component) (new-feature)
- [pca9685] Allow to disable the phase balancer for PCA9685 esphome#9792 by @jonau (new-feature)
- [core] Use StringRef for get_comment and get_compilation_time to avoid allocations esphome#12219 by @bdraco
- [select] Add zero-copy support for API select commands esphome#12329 by @bdraco
- [micronova] Make stove switch entity independent esphome#12355 by @edenhaus
- [i2c] Fix port logic with ESP-IDF esphome#12063 by @arno1801 (breaking-change)
- Update URLs esphome#12369 by @smarthome-10
- [micronova] Remove MicroNovaFunctions esphome#12363 by @edenhaus (breaking-change)
- [sx1509] Change setup priority from HARDWARE to IO esphome#12373 by @mirko
- [psram] Fix boot failure with 120MHz Octal flash esphome#12377 by @clydebarrow
- [pio] Rationalise library definitions in platformio.ini esphome#12374 by @clydebarrow
- [scheduler] Avoid std::string allocation in RetryArgs esphome#12311 by @bdraco
- [mdns] Reduce RAM usage by eliminating MAC address heap allocation esphome#12073 by @bdraco
- [core] Add PR template instruction to AI instructions esphome#12375 by @swoboda1337
- [api] Store device info strings in flash on ESP8266 esphome#12173 by @bdraco
- [packages] Add more information and deprecation deadline for “single package” includes esphome#12280 by @jpeletier
- [api] Use StringRef for ActionResponse error message to avoid copy esphome#12240 by @bdraco
- [api] Store Home Assistant state subscriptions in flash instead of heap esphome#12008 by @bdraco
- [wifi] Fix LibreTiny spurious disconnect events aborting connections esphome#12357 by @bdraco
- [api] Reduce heap usage for Home Assistant service call string storage esphome#12151 by @bdraco
- [micronova] Require memory location and address for custom entities esphome#12371 by @edenhaus (breaking-change)
- [epaper_spi] Set reasonable default update interval esphome#12331 by @clydebarrow
- [mipi_rgb] Add Waveshare 3.16 esphome#12309 by @clydebarrow (new-feature)
- [ci] Allow memory impact target branch build to fail without blocking CI esphome#12381 by @bdraco
- [ci] Isolate usb_cdc_acm in component tests due to tinyusb/usb_host conflict esphome#12392 by @bdraco
- [micronova] Fix test UART package key to match directory name esphome#12391 by @bdraco
- [tests] Fix clang-tidy warnings in custom_api_device_component fixture esphome#12390 by @bdraco
- [core] Packages refactor and conditional package inclusion (package refactor part 1) esphome#11605 by @jpeletier (new-feature)
All Changelogs

BETA