<?xml version="1.0" encoding="UTF-8" ?> <?xml-stylesheet type="text/xsl" href="rss.xsl"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/"> <channel> <title>ESPHome Developer Documentation</title><link>https://developers.esphome.io/</link><atom:link href="https://developers.esphome.io/feed_rss_updated.xml" rel="self" type="application/rss+xml" /> <managingEditor>ESPHome</managingEditor><docs>https://github.com/esphome/developers.esphome.io/</docs><language>en</language> <pubDate>Wed, 06 May 2026 04:04:05 -0000</pubDate> <lastBuildDate>Wed, 06 May 2026 04:04:05 -0000</lastBuildDate> <ttl>1440</ttl> <generator>MkDocs RSS plugin - v1.19.0</generator> <image> <url>None</url> <title>ESPHome Developer Documentation</title> <link>https://developers.esphome.io/</link> </image> <item> <title>TemplatableFn: 4-Byte Templatable Storage for Trivially Copyable Types</title> <author>J. Nick Koston</author> <description>&lt;h1&gt;TemplatableFn: 4-Byte Templatable Storage for Trivially Copyable Types&lt;/h1&gt; &lt;p&gt;The &lt;code&gt;TEMPLATABLE_VALUE&lt;/code&gt; macro now uses &lt;code&gt;TemplatableFn&lt;/code&gt; (4 bytes) instead of &lt;code&gt;TemplatableValue&lt;/code&gt; (8 bytes) for trivially copyable types like &lt;code&gt;float&lt;/code&gt;, &lt;code&gt;uint32_t&lt;/code&gt;, &lt;code&gt;bool&lt;/code&gt;, and enums. External components that call macro-generated setters with raw C++ constants instead of going through &lt;code&gt;cg.templatable()&lt;/code&gt; will fail to compile.&lt;/p&gt; &lt;p&gt;This is a &lt;strong&gt;breaking change&lt;/strong&gt; for external components in &lt;strong&gt;ESPHome 2026.4.0 and later&lt;/strong&gt;.&lt;/p&gt;</description> <link>https://developers.esphome.io/blog/2026/04/09/templatablefn-4-byte-templatable-storage-for-trivially-copyable-types/</link> <pubDate>Sun, 19 Apr 2026 19:12:23 +0000</pubDate> <source url="https://developers.esphome.io/feed_rss_updated.xml">ESPHome Developer Documentation</source><guid isPermaLink="true">https://developers.esphome.io/blog/2026/04/09/templatablefn-4-byte-templatable-storage-for-trivially-copyable-types/</guid> </item> <item> <title>Climate and Fan Custom Mode Vectors Moved to Entity</title> <author>J. Nick Koston</author> <description>&lt;h1&gt;Climate and Fan Custom Mode Vectors Moved to Entity&lt;/h1&gt; &lt;p&gt;Custom mode vectors (&lt;code&gt;custom_fan_modes&lt;/code&gt;, &lt;code&gt;custom_presets&lt;/code&gt; for climate; &lt;code&gt;preset_modes&lt;/code&gt; for fan) are now stored on the entity base class instead of being rebuilt inside traits on every call. The old &lt;code&gt;ClimateTraits&lt;/code&gt; and &lt;code&gt;FanTraits&lt;/code&gt; setter methods are deprecated.&lt;/p&gt; &lt;p&gt;This is a &lt;strong&gt;breaking change&lt;/strong&gt; for external components in &lt;strong&gt;ESPHome 2026.4.0 and later&lt;/strong&gt;.&lt;/p&gt;</description> <link>https://developers.esphome.io/blog/2026/04/09/climate-and-fan-custom-mode-vectors-moved-to-entity/</link> <pubDate>Sun, 19 Apr 2026 19:11:27 +0000</pubDate> <source url="https://developers.esphome.io/feed_rss_updated.xml">ESPHome Developer Documentation</source><guid isPermaLink="true">https://developers.esphome.io/blog/2026/04/09/climate-and-fan-custom-mode-vectors-moved-to-entity/</guid> </item> <item> <title>wake_loop Moved from Socket Component into Core</title> <author>J. Nick Koston</author> <description>&lt;h1&gt;wake_loop Moved from Socket Component into Core&lt;/h1&gt; &lt;p&gt;&lt;code&gt;wake_loop_threadsafe()&lt;/code&gt; and related wake primitives have moved from the socket component into core. The &lt;code&gt;require_wake_loop_threadsafe()&lt;/code&gt; opt-in is deprecated (now a no-op) — wake works unconditionally on all platforms.&lt;/p&gt; &lt;p&gt;This is a &lt;strong&gt;breaking change&lt;/strong&gt; for external components in &lt;strong&gt;ESPHome 2026.4.0 and later&lt;/strong&gt;.&lt;/p&gt;</description> <link>https://developers.esphome.io/blog/2026/04/09/wake_loop-moved-from-socket-component-into-core/</link> <pubDate>Thu, 09 Apr 2026 23:24:44 +0000</pubDate> <source url="https://developers.esphome.io/feed_rss_updated.xml">ESPHome Developer Documentation</source><guid isPermaLink="true">https://developers.esphome.io/blog/2026/04/09/wake_loop-moved-from-socket-component-into-core/</guid> </item> <item> <title>BLE Event Handler Dispatch Devirtualized</title> <author>J. Nick Koston</author> <description>&lt;h1&gt;BLE Event Handler Dispatch Devirtualized&lt;/h1&gt; &lt;p&gt;Virtual handler interfaces (&lt;code&gt;GAPEventHandler&lt;/code&gt;, &lt;code&gt;GAPScanEventHandler&lt;/code&gt;, &lt;code&gt;GATTcEventHandler&lt;/code&gt;, &lt;code&gt;GATTsEventHandler&lt;/code&gt;, &lt;code&gt;BLEStatusEventHandler&lt;/code&gt;) have been replaced with callback-based dispatch. External components that inherit from these interfaces must update their registration approach.&lt;/p&gt; &lt;p&gt;This is a &lt;strong&gt;developer breaking change&lt;/strong&gt; for external components in &lt;strong&gt;ESPHome 2026.4.0 and later&lt;/strong&gt;.&lt;/p&gt;</description> <link>https://developers.esphome.io/blog/2026/04/09/ble-event-handler-dispatch-devirtualized/</link> <pubDate>Thu, 09 Apr 2026 23:19:12 +0000</pubDate> <source url="https://developers.esphome.io/feed_rss_updated.xml">ESPHome Developer Documentation</source><guid isPermaLink="true">https://developers.esphome.io/blog/2026/04/09/ble-event-handler-dispatch-devirtualized/</guid> </item> <item> <title>Modbus Helper Functions Moved to modbus::helpers</title> <author>J. Nick Koston</author> <description>&lt;h1&gt;Modbus Helper Functions Moved to modbus::helpers&lt;/h1&gt; &lt;p&gt;Shared helper functions and types have been moved from &lt;code&gt;modbus_controller&lt;/code&gt; to &lt;code&gt;modbus::helpers&lt;/code&gt; to enable reuse by other modbus-based components. Deprecated shims keep the old names working until &lt;strong&gt;ESPHome 2026.10.0&lt;/strong&gt;.&lt;/p&gt; &lt;p&gt;This is a &lt;strong&gt;developer breaking change&lt;/strong&gt; for external components in &lt;strong&gt;ESPHome 2026.4.0 and later&lt;/strong&gt;.&lt;/p&gt;</description> <link>https://developers.esphome.io/blog/2026/04/09/modbus-helper-functions-moved-to-modbushelpers/</link> <pubDate>Thu, 09 Apr 2026 23:17:23 +0000</pubDate> <source url="https://developers.esphome.io/feed_rss_updated.xml">ESPHome Developer Documentation</source><guid isPermaLink="true">https://developers.esphome.io/blog/2026/04/09/modbus-helper-functions-moved-to-modbushelpers/</guid> </item> <item> <title>Trigger Trampolines Eliminated with build_callback_automation</title> <author>J. Nick Koston</author> <description>&lt;h1&gt;Trigger Trampolines Eliminated with build_callback_automation&lt;/h1&gt; &lt;p&gt;Common entity trigger classes have been replaced with lightweight forwarder structs that fit inline in the callback system. The new &lt;code&gt;build_callback_automation()&lt;/code&gt; API eliminates per-trigger object allocations. Several entity callback signatures have also changed to pass state as an argument.&lt;/p&gt; &lt;p&gt;This is a &lt;strong&gt;breaking change&lt;/strong&gt; for external components in &lt;strong&gt;ESPHome 2026.4.0 and later&lt;/strong&gt;.&lt;/p&gt;</description> <link>https://developers.esphome.io/blog/2026/04/09/trigger-trampolines-eliminated-with-build_callback_automation/</link> <pubDate>Thu, 09 Apr 2026 23:16:35 +0000</pubDate> <source url="https://developers.esphome.io/feed_rss_updated.xml">ESPHome Developer Documentation</source><guid isPermaLink="true">https://developers.esphome.io/blog/2026/04/09/trigger-trampolines-eliminated-with-build_callback_automation/</guid> </item> <item> <title>Sensor .raw_state Deprecated in Favor of get_raw_state()</title> <author>J. Nick Koston</author> <description>&lt;h1&gt;Sensor .raw_state Deprecated in Favor of get_raw_state()&lt;/h1&gt; &lt;p&gt;Direct access to the sensor &lt;code&gt;.raw_state&lt;/code&gt; member is now deprecated. Use &lt;code&gt;get_raw_state()&lt;/code&gt; instead. The &lt;code&gt;.raw_state&lt;/code&gt; member will be removed in &lt;strong&gt;ESPHome 2026.10.0&lt;/strong&gt;.&lt;/p&gt; &lt;p&gt;This is a &lt;strong&gt;breaking change&lt;/strong&gt; for external components in &lt;strong&gt;ESPHome 2026.4.0 and later&lt;/strong&gt;.&lt;/p&gt;</description> <link>https://developers.esphome.io/blog/2026/04/09/sensor-raw_state-deprecated-in-favor-of-get_raw_state/</link> <pubDate>Thu, 09 Apr 2026 23:13:12 +0000</pubDate> <source url="https://developers.esphome.io/feed_rss_updated.xml">ESPHome Developer Documentation</source><guid isPermaLink="true">https://developers.esphome.io/blog/2026/04/09/sensor-raw_state-deprecated-in-favor-of-get_raw_state/</guid> </item> <item> <title>FlushResult Renamed to UARTFlushResult</title> <author>J. Nick Koston</author> <description>&lt;h1&gt;FlushResult Renamed to UARTFlushResult&lt;/h1&gt; &lt;p&gt;The &lt;code&gt;FlushResult&lt;/code&gt; enum introduced in ESPHome 2026.3.0 has been renamed to &lt;code&gt;UARTFlushResult&lt;/code&gt; with prefixed enum values to follow ESPHome&#39;s naming conventions and avoid macro collisions.&lt;/p&gt; &lt;p&gt;This is a &lt;strong&gt;breaking change&lt;/strong&gt; for external components in &lt;strong&gt;ESPHome 2026.4.0 and later&lt;/strong&gt;.&lt;/p&gt;</description> <link>https://developers.esphome.io/blog/2026/04/09/flushresult-renamed-to-uartflushresult/</link> <pubDate>Thu, 09 Apr 2026 22:14:54 +0000</pubDate> <source url="https://developers.esphome.io/feed_rss_updated.xml">ESPHome Developer Documentation</source><guid isPermaLink="true">https://developers.esphome.io/blog/2026/04/09/flushresult-renamed-to-uartflushresult/</guid> </item> <item> <title>CallbackManager: std::function Replaced with Lightweight Callback</title> <author>J. Nick Koston</author> <description>&lt;h1&gt;CallbackManager: std::function Replaced with Lightweight Callback&lt;/h1&gt; &lt;p&gt;&lt;code&gt;CallbackManager&lt;/code&gt; and &lt;code&gt;LazyCallbackManager&lt;/code&gt; now use a lightweight 8-byte &lt;code&gt;Callback&lt;/code&gt; struct instead of &lt;code&gt;std::function&lt;/code&gt; (16 bytes). External components that define their own callback registration methods using &lt;code&gt;std::function&lt;/code&gt; should update to templates for optimal performance.&lt;/p&gt; &lt;p&gt;This is a &lt;strong&gt;breaking change&lt;/strong&gt; for external components in &lt;strong&gt;ESPHome 2026.4.0 and later&lt;/strong&gt;.&lt;/p&gt;</description> <link>https://developers.esphome.io/blog/2026/04/09/callbackmanager-stdfunction-replaced-with-lightweight-callback/</link> <pubDate>Thu, 09 Apr 2026 22:08:33 +0000</pubDate> <source url="https://developers.esphome.io/feed_rss_updated.xml">ESPHome Developer Documentation</source><guid isPermaLink="true">https://developers.esphome.io/blog/2026/04/09/callbackmanager-stdfunction-replaced-with-lightweight-callback/</guid> </item> <item> <title>call_loop(), mark_failed(), and call_dump_config() Are No Longer Virtual</title> <author>J. Nick Koston</author> <description>&lt;h1&gt;call_loop(), mark_failed(), and call_dump_config() Are No Longer Virtual&lt;/h1&gt; &lt;p&gt;&lt;code&gt;Component::call_loop()&lt;/code&gt;, &lt;code&gt;Component::mark_failed()&lt;/code&gt;, and &lt;code&gt;Component::call_dump_config()&lt;/code&gt; are no longer virtual methods. External components that override any of these methods must remove them entirely and move logic to &lt;code&gt;loop()&lt;/code&gt; or &lt;code&gt;dump_config()&lt;/code&gt;. This saves 800+ bytes of flash globally from vtable elimination.&lt;/p&gt; &lt;p&gt;This is a &lt;strong&gt;breaking change&lt;/strong&gt; for external components in &lt;strong&gt;ESPHome 2026.3.0 and later&lt;/strong&gt;.&lt;/p&gt;</description> <link>https://developers.esphome.io/blog/2026/03/12/call_loop-mark_failed-and-call_dump_config-are-no-longer-virtual/</link> <pubDate>Fri, 27 Mar 2026 18:18:45 +0000</pubDate> <source url="https://developers.esphome.io/feed_rss_updated.xml">ESPHome Developer Documentation</source><guid isPermaLink="true">https://developers.esphome.io/blog/2026/03/12/call_loop-mark_failed-and-call_dump_config-are-no-longer-virtual/</guid> </item> <item> <title>UART flush() Now Returns FlushResult</title> <author>J. Nick Koston</author> <description>&lt;h1&gt;UART flush() Now Returns FlushResult&lt;/h1&gt; &lt;p&gt;The &lt;code&gt;UARTComponent::flush()&lt;/code&gt; method return type has changed from &lt;code&gt;void&lt;/code&gt; to &lt;code&gt;FlushResult&lt;/code&gt;. External components that subclass &lt;code&gt;UARTComponent&lt;/code&gt; and override &lt;code&gt;flush()&lt;/code&gt; must update their override to return a &lt;code&gt;FlushResult&lt;/code&gt; value.&lt;/p&gt; &lt;p&gt;This is a &lt;strong&gt;breaking change&lt;/strong&gt; for external components in &lt;strong&gt;ESPHome 2026.3.0 and later&lt;/strong&gt;.&lt;/p&gt;</description> <link>https://developers.esphome.io/blog/2026/03/12/uart-flush-now-returns-flushresult/</link> <pubDate>Fri, 27 Mar 2026 18:18:35 +0000</pubDate> <source url="https://developers.esphome.io/feed_rss_updated.xml">ESPHome Developer Documentation</source><guid isPermaLink="true">https://developers.esphome.io/blog/2026/03/12/uart-flush-now-returns-flushresult/</guid> </item> <item> <title>register_action Now Requires Explicit synchronous= Parameter</title> <author>J. Nick Koston</author> <description>&lt;h1&gt;register_action Now Requires Explicit synchronous= Parameter&lt;/h1&gt; &lt;p&gt;All &lt;code&gt;register_action()&lt;/code&gt; calls now require an explicit &lt;code&gt;synchronous=True&lt;/code&gt; or &lt;code&gt;synchronous=False&lt;/code&gt; parameter. This enables the StringRef optimization for synchronous actions (zero-copy string argument passing) while ensuring asynchronous actions safely use owning &lt;code&gt;std::string&lt;/code&gt; to prevent dangling references. Existing external components will continue to work but will see a warning at config time until updated.&lt;/p&gt; &lt;p&gt;This is a &lt;strong&gt;breaking change&lt;/strong&gt; for external components in &lt;strong&gt;ESPHome 2026.3.0 and later&lt;/strong&gt;.&lt;/p&gt;</description> <link>https://developers.esphome.io/blog/2026/03/12/register_action-now-requires-explicit-synchronous-parameter/</link> <pubDate>Fri, 27 Mar 2026 18:18:25 +0000</pubDate> <source url="https://developers.esphome.io/feed_rss_updated.xml">ESPHome Developer Documentation</source><guid isPermaLink="true">https://developers.esphome.io/blog/2026/03/12/register_action-now-requires-explicit-synchronous-parameter/</guid> </item> <item> <title>Socket Abstraction Layer Devirtualized</title> <author>J. Nick Koston</author> <description>&lt;h1&gt;Socket Abstraction Layer Devirtualized&lt;/h1&gt; &lt;p&gt;The &lt;code&gt;socket::Socket&lt;/code&gt; and &lt;code&gt;socket::ListenSocket&lt;/code&gt; types have been changed from virtual base classes to concrete type aliases. Listen sockets now use the &lt;code&gt;ListenSocket&lt;/code&gt; type instead of &lt;code&gt;Socket&lt;/code&gt;. These changes save 1,020–3,228 bytes of flash across platforms by eliminating virtual dispatch overhead.&lt;/p&gt; &lt;p&gt;This is a &lt;strong&gt;breaking change&lt;/strong&gt; for external components in &lt;strong&gt;ESPHome 2026.3.0 and later&lt;/strong&gt;.&lt;/p&gt;</description> <link>https://developers.esphome.io/blog/2026/03/12/socket-abstraction-layer-devirtualized/</link> <pubDate>Fri, 27 Mar 2026 18:18:12 +0000</pubDate> <source url="https://developers.esphome.io/feed_rss_updated.xml">ESPHome Developer Documentation</source><guid isPermaLink="true">https://developers.esphome.io/blog/2026/03/12/socket-abstraction-layer-devirtualized/</guid> </item> <item> <title>get_loop_priority() Now Conditionally Compiled with USE_LOOP_PRIORITY</title> <author>J. Nick Koston</author> <description>&lt;h1&gt;get_loop_priority() Now Conditionally Compiled with USE_LOOP_PRIORITY&lt;/h1&gt; &lt;p&gt;The &lt;code&gt;get_loop_priority()&lt;/code&gt; virtual method on &lt;code&gt;Component&lt;/code&gt; is now only available when &lt;code&gt;USE_LOOP_PRIORITY&lt;/code&gt; is defined. This define is only set on RP2040, the only platform where loop priority has an effect. External components that override &lt;code&gt;get_loop_priority()&lt;/code&gt; must guard the override with &lt;code&gt;#ifdef USE_LOOP_PRIORITY&lt;/code&gt;.&lt;/p&gt; &lt;p&gt;This is a &lt;strong&gt;breaking change&lt;/strong&gt; for external components in &lt;strong&gt;ESPHome 2026.3.0 and later&lt;/strong&gt;.&lt;/p&gt;</description> <link>https://developers.esphome.io/blog/2026/03/12/get_loop_priority-now-conditionally-compiled-with-use_loop_priority/</link> <pubDate>Fri, 27 Mar 2026 18:17:58 +0000</pubDate> <source url="https://developers.esphome.io/feed_rss_updated.xml">ESPHome Developer Documentation</source><guid isPermaLink="true">https://developers.esphome.io/blog/2026/03/12/get_loop_priority-now-conditionally-compiled-with-use_loop_priority/</guid> </item> <item> <title>http_request API Modernization: Vector-Based Headers</title> <author>J. Nick Koston</author> <description>&lt;h1&gt;http_request API Modernization: Vector-Based Headers&lt;/h1&gt; &lt;p&gt;The &lt;code&gt;http_request&lt;/code&gt; component&#39;s C++ API has been updated to use &lt;code&gt;std::vector&lt;/code&gt; instead of &lt;code&gt;std::map&lt;/code&gt;, &lt;code&gt;std::list&lt;/code&gt;, and &lt;code&gt;std::set&lt;/code&gt; for header handling. The &lt;code&gt;get_response_headers()&lt;/code&gt; method (returning the full headers map) has been removed — use &lt;code&gt;get_response_header(name)&lt;/code&gt; instead. Deprecated overloads using the old container types are provided until 2027.1.0.&lt;/p&gt; &lt;p&gt;This is a &lt;strong&gt;breaking change&lt;/strong&gt; for external components in &lt;strong&gt;ESPHome 2026.3.0 and later&lt;/strong&gt;.&lt;/p&gt;</description> <link>https://developers.esphome.io/blog/2026/03/12/http_request-api-modernization-vector-based-headers/</link> <pubDate>Fri, 27 Mar 2026 18:17:39 +0000</pubDate> <source url="https://developers.esphome.io/feed_rss_updated.xml">ESPHome Developer Documentation</source><guid isPermaLink="true">https://developers.esphome.io/blog/2026/03/12/http_request-api-modernization-vector-based-headers/</guid> </item> <item> <title>RP2040 Framework Update: Pico-SDK 2.0 and GCC 14</title> <author>J. Nick Koston</author> <description>&lt;h1&gt;RP2040 Framework Update: Pico-SDK 2.0 and GCC 14&lt;/h1&gt; &lt;p&gt;The RP2040 platform has been updated to arduino-pico 5.5.0 (from 3.9.4), pico-sdk 2.1.0 (from 1.5.1), and GCC 14 (from GCC 12). Several hardware register names, API functions, and macros have changed. External components targeting RP2040 may need updates.&lt;/p&gt; &lt;p&gt;This is a &lt;strong&gt;breaking change&lt;/strong&gt; for external components in &lt;strong&gt;ESPHome 2026.3.0 and later&lt;/strong&gt;.&lt;/p&gt;</description> <link>https://developers.esphome.io/blog/2026/03/12/rp2040-framework-update-pico-sdk-20-and-gcc-14/</link> <pubDate>Fri, 27 Mar 2026 18:17:22 +0000</pubDate> <source url="https://developers.esphome.io/feed_rss_updated.xml">ESPHome Developer Documentation</source><guid isPermaLink="true">https://developers.esphome.io/blog/2026/03/12/rp2040-framework-update-pico-sdk-20-and-gcc-14/</guid> </item> <item> <title>Application Name and Friendly Name Now Return StringRef</title> <author>J. Nick Koston</author> <description>&lt;h1&gt;Application Name and Friendly Name Now Return StringRef&lt;/h1&gt; &lt;p&gt;&lt;code&gt;App.get_name()&lt;/code&gt; and &lt;code&gt;App.get_friendly_name()&lt;/code&gt; now return &lt;code&gt;const StringRef &amp;amp;&lt;/code&gt; instead of &lt;code&gt;const std::string &amp;amp;&lt;/code&gt;. Most code compiles unchanged because &lt;code&gt;StringRef&lt;/code&gt; provides &lt;code&gt;.c_str()&lt;/code&gt;, &lt;code&gt;.size()&lt;/code&gt;, &lt;code&gt;.empty()&lt;/code&gt;, and implicit conversion to &lt;code&gt;std::string&lt;/code&gt;. However, binding the result to &lt;code&gt;const std::string &amp;amp;&lt;/code&gt; silently creates a heap-allocated temporary — update these references to &lt;code&gt;const auto &amp;amp;&lt;/code&gt; to avoid the allocation.&lt;/p&gt; &lt;p&gt;This is a &lt;strong&gt;breaking change&lt;/strong&gt; for external components in &lt;strong&gt;ESPHome 2026.3.0 and later&lt;/strong&gt;.&lt;/p&gt;</description> <link>https://developers.esphome.io/blog/2026/03/12/application-name-and-friendly-name-now-return-stringref/</link> <pubDate>Fri, 27 Mar 2026 18:17:09 +0000</pubDate> <source url="https://developers.esphome.io/feed_rss_updated.xml">ESPHome Developer Documentation</source><guid isPermaLink="true">https://developers.esphome.io/blog/2026/03/12/application-name-and-friendly-name-now-return-stringref/</guid> </item> <item> <title>Icon and Device Class Getter Migration</title> <author>J. Nick Koston</author> <description>&lt;h1&gt;Icon and Device Class Getter Migration&lt;/h1&gt; &lt;p&gt;The &lt;code&gt;get_icon_ref()&lt;/code&gt;, &lt;code&gt;get_icon()&lt;/code&gt;, &lt;code&gt;get_device_class_ref()&lt;/code&gt;, and &lt;code&gt;get_device_class()&lt;/code&gt; methods are deprecated on &lt;strong&gt;all platforms&lt;/strong&gt; and replaced by new buffer-based APIs &lt;code&gt;get_icon_to()&lt;/code&gt; and &lt;code&gt;get_device_class_to()&lt;/code&gt;. On ESP8266, the old methods produce a &lt;code&gt;static_assert&lt;/code&gt; error because the underlying strings have been moved to PROGMEM and cannot be accessed through normal C string pointers. On other platforms, the old methods continue to work but emit deprecation warnings and will be removed in 2026.9.0.&lt;/p&gt; &lt;p&gt;This is a &lt;strong&gt;breaking change&lt;/strong&gt; for external components in &lt;strong&gt;ESPHome 2026.3.0 and later&lt;/strong&gt;.&lt;/p&gt;</description> <link>https://developers.esphome.io/blog/2026/03/12/icon-and-device-class-getter-migration/</link> <pubDate>Fri, 27 Mar 2026 18:16:58 +0000</pubDate> <source url="https://developers.esphome.io/feed_rss_updated.xml">ESPHome Developer Documentation</source><guid isPermaLink="true">https://developers.esphome.io/blog/2026/03/12/icon-and-device-class-getter-migration/</guid> </item> <item> <title>LogListener Virtual Interface Replaced with LogCallback</title> <author>J. Nick Koston</author> <description>&lt;h1&gt;LogListener Virtual Interface Replaced with LogCallback&lt;/h1&gt; &lt;p&gt;The &lt;code&gt;logger::LogListener&lt;/code&gt; abstract class has been removed. Components that receive log messages must now register a callback with &lt;code&gt;logger::global_logger-&amp;gt;add_log_callback(instance, callback)&lt;/code&gt; instead of inheriting from &lt;code&gt;LogListener&lt;/code&gt; and calling &lt;code&gt;add_log_listener()&lt;/code&gt;.&lt;/p&gt; &lt;p&gt;This is a &lt;strong&gt;breaking change&lt;/strong&gt; for external components in &lt;strong&gt;ESPHome 2026.3.0 and later&lt;/strong&gt;.&lt;/p&gt;</description> <link>https://developers.esphome.io/blog/2026/03/12/loglistener-virtual-interface-replaced-with-logcallback/</link> <pubDate>Fri, 27 Mar 2026 18:16:47 +0000</pubDate> <source url="https://developers.esphome.io/feed_rss_updated.xml">ESPHome Developer Documentation</source><guid isPermaLink="true">https://developers.esphome.io/blog/2026/03/12/loglistener-virtual-interface-replaced-with-logcallback/</guid> </item> <item> <title>ESP32: Unused Built-in IDF Components Excluded by Default</title> <author>J. Nick Koston</author> <description>&lt;h1&gt;ESP32: Unused Built-in IDF Components Excluded by Default&lt;/h1&gt; &lt;p&gt;ESP32 builds now exclude unused built-in IDF components by default to reduce compile time. This applies to &lt;strong&gt;both ESP-IDF and Arduino framework&lt;/strong&gt; builds, since both use the ESP-IDF build system underneath. External components that use excluded IDF APIs (e.g., &lt;code&gt;esp_vfs_fat.h&lt;/code&gt;, &lt;code&gt;esp_http_client.h&lt;/code&gt;, &lt;code&gt;esp_eth.h&lt;/code&gt;) must explicitly re-enable them via &lt;code&gt;include_builtin_idf_component()&lt;/code&gt;.&lt;/p&gt; &lt;p&gt;This is a &lt;strong&gt;breaking change&lt;/strong&gt; for external components in &lt;strong&gt;ESPHome 2026.2.0 and later&lt;/strong&gt;.&lt;/p&gt;</description> <link>https://developers.esphome.io/blog/2026/02/20/esp32-unused-built-in-idf-components-excluded-by-default/</link> <pubDate>Sun, 22 Feb 2026 23:50:39 +0000</pubDate> <source url="https://developers.esphome.io/feed_rss_updated.xml">ESPHome Developer Documentation</source><guid isPermaLink="true">https://developers.esphome.io/blog/2026/02/20/esp32-unused-built-in-idf-components-excluded-by-default/</guid> </item> </channel> </rss>