{
    "version": "https://jsonfeed.org/version/1",
    "title": "Home Assistant Developer Docs Blog",
    "home_page_url": "https://developers.home-assistant.io/blog",
    "description": "Home Assistant Developer Docs Blog",
    "items": [
        {
            "id": "https://developers.home-assistant.io/blog/2026/07/05/modernizing-modbus",
            "content_html": "<p>Modbus is everywhere in the modern home: solar inverters, energy meters, heat pumps, and all kinds of industrial equipment that has found its way indoors. Home Assistant has long supported these devices through the YAML-based <code>modbus</code> integration, where users hand-write register maps in their configuration. That integration is not going anywhere, and existing setups keep working. But hand-writing register maps puts the burden of understanding a device's protocol on every user, and it does not fit the config-flow, UI-first direction the rest of Home Assistant has taken.</p>\n<p>So we are adding a new way to use Modbus: an integration-based approach, where a device integration owns the device-specific knowledge and the user simply picks their device in the UI, the same as any other integration.</p>\n<h2 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"sharing-a-connection\">Sharing a connection<a href=\"https://developers.home-assistant.io/blog/2026/07/05/modernizing-modbus#sharing-a-connection\" class=\"hash-link\" aria-label=\"Direct link to Sharing a connection\" title=\"Direct link to Sharing a connection\" translate=\"no\">​</a></h2>\n<p>A Modbus connection is a single, exclusive resource: only one party can talk on the bus at a time. A serial (RS-485) bus, or a TCP-to-serial gateway, can carry many devices at once, sometimes from different manufacturers. If two integrations each open their own connection to the same bus, they fight over it, and historically Home Assistant did not support sharing a bus between integrations at all.</p>\n<p>The new <a href=\"https://github.com/home-assistant/core/tree/dev/homeassistant/components/modbus_connection\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"\"><code>modbus_connection</code></a> integration solves this by making a connection something device integrations route through rather than own. The user sets up a connection once in the UI, and <code>modbus_connection</code> keeps it open and manages its lifecycle, including reconnecting after a drop. Device integrations then borrow what they need from that shared connection instead of managing their own. We have revamped the <a class=\"\" href=\"https://developers.home-assistant.io/docs/modbus/introduction\">Modbus developer documentation</a> to cover how that works, with example code.</p>\n<h2 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"a-standalone-library\">A standalone library<a href=\"https://developers.home-assistant.io/blog/2026/07/05/modernizing-modbus#a-standalone-library\" class=\"hash-link\" aria-label=\"Direct link to A standalone library\" title=\"Direct link to A standalone library\" translate=\"no\">​</a></h2>\n<p>The connection abstraction underneath <code>modbus_connection</code> lives in <a href=\"https://home-assistant-libs.github.io/modbus-connection/\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"\"><code>modbus-connection</code></a>, a new library we designed for this purpose and published on PyPI. It is not bound to Home Assistant and can be used standalone in any Python project. It presents a common, backend-neutral interface, so device library authors write against one API regardless of the underlying Modbus implementation, and it ships a device-modelling framework and a <code>pytest</code> plugin to make building and testing a device library straightforward.</p>\n<p>This keeps concerns where they belong. A device library is a normal PyPI package that knows how to talk to a specific device, and a consuming integration in Home Assistant wires that library up to a shared connection and exposes entities. Both can be developed and tested independently.</p>\n<p>For more background, see our <a href=\"https://gist.github.com/balloob/b9fa91ba1a0914a9787f8f6ceb637b83\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"\">research</a>.</p>\n<h2 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"lets-get-building\">Let's get building<a href=\"https://developers.home-assistant.io/blog/2026/07/05/modernizing-modbus#lets-get-building\" class=\"hash-link\" aria-label=\"Direct link to Let's get building\" title=\"Direct link to Let's get building\" translate=\"no\">​</a></h2>\n<p>With these new building blocks in place, it is now possible to turn a collection of YAML configuration for Modbus into manufacturer-specific integrations that people can set up via the UI. If you're (interested in) working on this, stop by the <a href=\"https://discord.com/channels/330944238910963714/1347329854495916044\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"\">#modbus channel on the Home Assistant Discord</a> and we'll be happy to help.</p>\n<p>If you're using an AI agent, you can give it the following prompt:</p>\n<blockquote>\n<p>I want to create a new integration for Home Assistant using the new Modbus Connection integration as documented here: <a href=\"https://developers.home-assistant.io/docs/modbus/introduction\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"\">https://developers.home-assistant.io/docs/modbus/introduction</a></p>\n<p>The YAML we want to turn into a device library can be found here: <em>TODO INSERT LOCATION OF MODBUS YAML!</em></p>\n<p>The deliverables of this task are going to be 3 folders:</p>\n<ul>\n<li class=\"\">\n<p>Start by creating a device library based on the YAML. Follow <a href=\"https://github.com/Tom-Bom-badil/trovis-modbus/\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"\">https://github.com/Tom-Bom-badil/trovis-modbus/</a> as an exact example, including how to use component models, all GitHub Actions, helper scripts and README. This library is meant as a standalone device library and should not mention Home Assistant. Look at the source of modbus_connection to figure out all supported fields.</p>\n</li>\n<li class=\"\">\n<p>Create an integration that can be contributed to Home Assistant core that follows this example: <a href=\"https://github.com/home-assistant/core/tree/trovis557x-integration/homeassistant/components/trovis557x\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"\">https://github.com/home-assistant/core/tree/trovis557x-integration/homeassistant/components/trovis557x</a></p>\n</li>\n<li class=\"\">\n<p>Create a custom integration version where the device library is vendorized so it is ready to be tested by the community via HACS. Follow this template <a href=\"https://github.com/ludeeus/integration_blueprint\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"\">https://github.com/ludeeus/integration_blueprint</a></p>\n</li>\n</ul>\n</blockquote>",
            "url": "https://developers.home-assistant.io/blog/2026/07/05/modernizing-modbus",
            "title": "Modernizing Modbus in Home Assistant",
            "summary": "Modbus is everywhere in the modern home: solar inverters, energy meters, heat pumps, and all kinds of industrial equipment that has found its way indoors. Home Assistant has long supported these devices through the YAML-based modbus integration, where users hand-write register maps in their configuration. That integration is not going anywhere, and existing setups keep working. But hand-writing register maps puts the burden of understanding a device's protocol on every user, and it does not fit the config-flow, UI-first direction the rest of Home Assistant has taken.",
            "date_modified": "2026-07-05T00:00:00.000Z",
            "author": {
                "name": "Paulus Schoutsen",
                "url": "https://github.com/balloob"
            },
            "tags": []
        },
        {
            "id": "https://developers.home-assistant.io/blog/2026/07/03/media-source-search",
            "content_html": "<p>Media sources can now implement search. By adding an <code>async_search_media</code> method to your <code>MediaSource</code>, users can search through your media directly from the media browser.</p>\n<div class=\"language-python codeBlockContainer_Ckt0 theme-code-block\" style=\"--prism-color:#bfc7d5;--prism-background-color:#292d3e\"><div class=\"codeBlockContent_QJqH\"><pre tabindex=\"0\" class=\"prism-code language-python codeBlock_bY9V thin-scrollbar\" style=\"color:#bfc7d5;background-color:#292d3e\"><code class=\"codeBlockLines_e6Vv\"><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token keyword\" style=\"font-style:italic\">from</span><span class=\"token plain\"> homeassistant</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token plain\">components</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token plain\">media_player </span><span class=\"token keyword\" style=\"font-style:italic\">import</span><span class=\"token plain\"> SearchMedia</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"> SearchMediaQuery</span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\" style=\"display:inline-block\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\"></span><span class=\"token keyword\" style=\"font-style:italic\">async</span><span class=\"token plain\"> </span><span class=\"token keyword\" style=\"font-style:italic\">def</span><span class=\"token plain\"> </span><span class=\"token function\" style=\"color:rgb(130, 170, 255)\">async_search_media</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">    self</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"> item</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">:</span><span class=\"token plain\"> MediaSourceItem</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"> query</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">:</span><span class=\"token plain\"> SearchMediaQuery</span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\"></span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token plain\"> </span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">-</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">&gt;</span><span class=\"token plain\"> SearchMedia</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">:</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">    </span><span class=\"token triple-quoted-string string\" style=\"color:rgb(195, 232, 141)\">\"\"\"Search media.\"\"\"</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">    results </span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">=</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">[</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">]</span><span class=\"token plain\">  </span><span class=\"token comment\" style=\"color:rgb(105, 112, 152);font-style:italic\"># list of BrowseMediaSource items</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">    </span><span class=\"token keyword\" style=\"font-style:italic\">return</span><span class=\"token plain\"> SearchMedia</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token plain\">result</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">=</span><span class=\"token plain\">results</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><br></div></code></pre></div></div>\n<p>To tell the media browser which items can be searched, set the <code>can_search</code> flag to <code>True</code> on the <code>BrowseMediaSource</code> items you return while browsing (typically directories). Other integrations can trigger a search through the new <code>media_source.async_search_media</code> helper.</p>\n<p>For more info, see <a class=\"\" href=\"https://developers.home-assistant.io/docs/core/platform/media_source#searching-media\">the updated documentation.</a></p>",
            "url": "https://developers.home-assistant.io/blog/2026/07/03/media-source-search",
            "title": "Media sources can now be searched",
            "summary": "Media sources can now implement search. By adding an asyncsearchmedia method to your MediaSource, users can search through your media directly from the media browser.",
            "date_modified": "2026-07-03T00:00:00.000Z",
            "author": {
                "name": "Josef Zweck",
                "url": "https://github.com/zweckj"
            },
            "tags": []
        },
        {
            "id": "https://developers.home-assistant.io/blog/2026/06/30/async-initialize-triggers-home-assistant-start-deprecated",
            "content_html": "<p>The dedicated <code>home_assistant_start</code> flag of <code>async_initialize_triggers</code> is deprecated and will be removed in Home Assistant Core 2027.8. During the deprecation period the parameter no longer has any effect.</p>\n<p>The flag existed because the <code>homeassistant</code> start trigger was a pseudo trigger: instead of acting like a real trigger, it relied on the caller of the trigger API passing <code>home_assistant_start=True</code> so that <code>async_initialize_triggers</code> would fire the trigger during startup.</p>\n<p>The start trigger has been rewritten to work as a real trigger, so the flag is no longer needed. Callers of <code>async_initialize_triggers</code> should simply stop passing <code>home_assistant_start</code>.</p>\n<p>To make the new implementation possible, the rewrite adds <code>HomeAssistant.async_add_startup_job</code>, which registers a job to be called after all listeners to <code>EVENT_HOMEASSISTANT_START</code> have executed, but before <code>EVENT_HOMEASSISTANT_STARTED</code> is fired. This mirrors the approach already used for the homeassistant shutdown trigger, and avoids adding yet another core state and event to the already complex relationship between core states and events.</p>\n<p>For more details, see <a href=\"https://github.com/home-assistant/core/pull/175160\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"\">core PR 175160</a>.</p>",
            "url": "https://developers.home-assistant.io/blog/2026/06/30/async-initialize-triggers-home-assistant-start-deprecated",
            "title": "Deprecation of the home_assistant_start flag of async_initialize_triggers",
            "summary": "The dedicated homeassistantstart flag of asyncinitializetriggers is deprecated and will be removed in Home Assistant Core 2027.8. During the deprecation period the parameter no longer has any effect.",
            "date_modified": "2026-06-30T00:00:00.000Z",
            "author": {
                "name": "Erik Montnemery",
                "url": "https://github.com/emontnemery"
            },
            "tags": []
        },
        {
            "id": "https://developers.home-assistant.io/blog/2026/06/30/new-unit-enumerators",
            "content_html": "<p>As of Home Assistant Core 2026.7, the following unit constants are deprecated and replaced\nby a corresponding enum:</p>\n<ul>\n<li class=\"\"><code>UnitOfDensity</code> enumerator replaces mass over volume <code>CONCENTRATION_***</code> constants\n(<code>\"g/m³\"</code>, <code>\"mg/m³\"</code>, <code>\"μg/m³\"</code>, <code>\"μg/ft³\"</code>)</li>\n<li class=\"\"><code>UnitOfRatio</code> enumerator replaces unit-less ratio <code>CONCENTRATION_***</code> constants\n(<code>\"ppm\"</code>, <code>\"ppb\"</code>)</li>\n</ul>\n<p><code>CONCENTRATION_PARTS_PER_CUBIC_METER</code> was only used by a single integration and is deprecated\nwithout a replacement unit.</p>\n<p>Please note that the use of <code>PERCENTAGE</code> constant is also deprecated when used as a unit of\nmeasurement, even if the constant itself is not deprecated.</p>",
            "url": "https://developers.home-assistant.io/blog/2026/06/30/new-unit-enumerators",
            "title": "Introducing new unit enumerators",
            "summary": "As of Home Assistant Core 2026.7, the following unit constants are deprecated and replaced",
            "date_modified": "2026-06-30T00:00:00.000Z",
            "author": {
                "name": "epenet",
                "url": "https://github.com/epenet"
            },
            "tags": []
        },
        {
            "id": "https://developers.home-assistant.io/blog/2026/06/23/frontend-component-updates-2026.7",
            "content_html": "<h2 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"component-updates\">Component updates<a href=\"https://developers.home-assistant.io/blog/2026/06/23/frontend-component-updates-2026.7#component-updates\" class=\"hash-link\" aria-label=\"Direct link to Component updates\" title=\"Direct link to Component updates\" translate=\"no\">​</a></h2>\n<h3 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"component-sizes-use-web-awesome-names\">Component sizes use Web Awesome names<a href=\"https://developers.home-assistant.io/blog/2026/06/23/frontend-component-updates-2026.7#component-sizes-use-web-awesome-names\" class=\"hash-link\" aria-label=\"Direct link to Component sizes use Web Awesome names\" title=\"Direct link to Component sizes use Web Awesome names\" translate=\"no\">​</a></h3>\n<p><code>ha-button</code>, <code>ha-button-toggle-group</code>, and <code>ha-slider</code> now use the short Web Awesome size names.</p>\n<p>For <code>ha-button</code>, use:</p>\n<div class=\"language-html codeBlockContainer_Ckt0 theme-code-block\" style=\"--prism-color:#bfc7d5;--prism-background-color:#292d3e\"><div class=\"codeBlockContent_QJqH\"><pre tabindex=\"0\" class=\"prism-code language-html codeBlock_bY9V thin-scrollbar\" style=\"color:#bfc7d5;background-color:#292d3e\"><code class=\"codeBlockLines_e6Vv\"><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token tag punctuation\" style=\"color:rgb(199, 146, 234)\">&lt;</span><span class=\"token tag\" style=\"color:rgb(255, 85, 114)\">ha-button</span><span class=\"token tag\" style=\"color:rgb(255, 85, 114)\"> </span><span class=\"token tag attr-name\" style=\"color:rgb(255, 203, 107)\">size</span><span class=\"token tag attr-value punctuation attr-equals\" style=\"color:rgb(199, 146, 234)\">=</span><span class=\"token tag attr-value punctuation\" style=\"color:rgb(199, 146, 234)\">\"</span><span class=\"token tag attr-value\" style=\"color:rgb(255, 85, 114)\">s</span><span class=\"token tag attr-value punctuation\" style=\"color:rgb(199, 146, 234)\">\"</span><span class=\"token tag punctuation\" style=\"color:rgb(199, 146, 234)\">&gt;</span><span class=\"token plain\">Save</span><span class=\"token tag punctuation\" style=\"color:rgb(199, 146, 234)\">&lt;/</span><span class=\"token tag\" style=\"color:rgb(255, 85, 114)\">ha-button</span><span class=\"token tag punctuation\" style=\"color:rgb(199, 146, 234)\">&gt;</span><br></div></code></pre></div></div>\n<p>Supported values are <code>xs</code>, <code>s</code>, <code>m</code>, <code>l</code>, and <code>xl</code>.</p>\n<p>For <code>ha-button-toggle-group</code>, use <code>s</code> or <code>m</code>:</p>\n<div class=\"language-html codeBlockContainer_Ckt0 theme-code-block\" style=\"--prism-color:#bfc7d5;--prism-background-color:#292d3e\"><div class=\"codeBlockContent_QJqH\"><pre tabindex=\"0\" class=\"prism-code language-html codeBlock_bY9V thin-scrollbar\" style=\"color:#bfc7d5;background-color:#292d3e\"><code class=\"codeBlockLines_e6Vv\"><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token tag punctuation\" style=\"color:rgb(199, 146, 234)\">&lt;</span><span class=\"token tag\" style=\"color:rgb(255, 85, 114)\">ha-button-toggle-group</span><span class=\"token tag\" style=\"color:rgb(255, 85, 114)\"> </span><span class=\"token tag attr-name\" style=\"color:rgb(255, 203, 107)\">size</span><span class=\"token tag attr-value punctuation attr-equals\" style=\"color:rgb(199, 146, 234)\">=</span><span class=\"token tag attr-value punctuation\" style=\"color:rgb(199, 146, 234)\">\"</span><span class=\"token tag attr-value\" style=\"color:rgb(255, 85, 114)\">s</span><span class=\"token tag attr-value punctuation\" style=\"color:rgb(199, 146, 234)\">\"</span><span class=\"token tag\" style=\"color:rgb(255, 85, 114)\"> </span><span class=\"token tag attr-name\" style=\"color:rgb(255, 203, 107)\">.buttons</span><span class=\"token tag attr-value punctuation attr-equals\" style=\"color:rgb(199, 146, 234)\">=</span><span class=\"token tag attr-value\" style=\"color:rgb(255, 85, 114)\">${buttons}</span><span class=\"token tag punctuation\" style=\"color:rgb(199, 146, 234)\">&gt;</span><span class=\"token tag punctuation\" style=\"color:rgb(199, 146, 234)\">&lt;/</span><span class=\"token tag\" style=\"color:rgb(255, 85, 114)\">ha-button-toggle-group</span><span class=\"token tag punctuation\" style=\"color:rgb(199, 146, 234)\">&gt;</span><br></div></code></pre></div></div>\n<p><code>ha-slider</code> uses <code>s</code> or <code>m</code>.</p>\n<p>If your custom card or editor still uses <code>small</code>, <code>medium</code>, or <code>large</code> on these components, migrate them to short values like <code>s</code>, <code>m</code>, or <code>l</code>.</p>\n<h3 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"virtualized-lists\">Virtualized lists<a href=\"https://developers.home-assistant.io/blog/2026/06/23/frontend-component-updates-2026.7#virtualized-lists\" class=\"hash-link\" aria-label=\"Direct link to Virtualized lists\" title=\"Direct link to Virtualized lists\" translate=\"no\">​</a></h3>\n<p>We added two list components for large data sets:</p>\n<ul>\n<li class=\"\"><code>ha-list-virtualized</code></li>\n<li class=\"\"><code>ha-list-selectable-virtualized</code></li>\n</ul>\n<p>Use these when a picker or dialog can render enough rows to affect scrolling or initial render time. The virtualized list renders only the visible rows while keeping the roving-tabindex keyboard navigation from <code>ha-list-base</code>.</p>\n<p>Rows expose accessibility metadata with <code>aria-setsize</code> and <code>aria-posinset</code>, so assistive technologies still get the full list position even though only part of the list is in the DOM.</p>\n<p>For selectable lists, render <code>ha-list-item-option</code> rows.</p>\n<h2 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"context-and-editor-infrastructure\">Context and editor infrastructure<a href=\"https://developers.home-assistant.io/blog/2026/06/23/frontend-component-updates-2026.7#context-and-editor-infrastructure\" class=\"hash-link\" aria-label=\"Direct link to Context and editor infrastructure\" title=\"Direct link to Context and editor infrastructure\" translate=\"no\">​</a></h2>\n<h3 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"dirty-state-tracking\">Dirty state tracking<a href=\"https://developers.home-assistant.io/blog/2026/06/23/frontend-component-updates-2026.7#dirty-state-tracking\" class=\"hash-link\" aria-label=\"Direct link to Dirty state tracking\" title=\"Direct link to Dirty state tracking\" translate=\"no\">​</a></h3>\n<p>Dialogs and editors now have shared dirty-state infrastructure:</p>\n<ul>\n<li class=\"\"><code>DirtyStateProviderMixin</code></li>\n<li class=\"\"><code>dirtyStateContext</code></li>\n<li class=\"\"><code>isDirtyState</code></li>\n<li class=\"\"><code>isEffectiveDirtyState</code></li>\n</ul>\n<p>Use <code>DirtyStateProviderMixin</code> for new dialogs or editors that need to block scrim close, enable Save only after edits, or coordinate dirty state with child components.</p>\n<div class=\"language-ts codeBlockContainer_Ckt0 theme-code-block\" style=\"--prism-color:#bfc7d5;--prism-background-color:#292d3e\"><div class=\"codeBlockContent_QJqH\"><pre tabindex=\"0\" class=\"prism-code language-ts codeBlock_bY9V thin-scrollbar\" style=\"color:#bfc7d5;background-color:#292d3e\"><code class=\"codeBlockLines_e6Vv\"><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token keyword\" style=\"font-style:italic\">class</span><span class=\"token plain\"> </span><span class=\"token class-name\" style=\"color:rgb(255, 203, 107)\">MyDialog</span><span class=\"token plain\"> </span><span class=\"token keyword\" style=\"font-style:italic\">extends</span><span class=\"token plain\"> </span><span class=\"token class-name\" style=\"color:rgb(255, 203, 107)\">DirtyStateProviderMixin</span><span class=\"token class-name operator\" style=\"color:rgb(137, 221, 255)\">&lt;</span><span class=\"token class-name\" style=\"color:rgb(255, 203, 107)\">MyState</span><span class=\"token class-name operator\" style=\"color:rgb(137, 221, 255)\">&gt;</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token plain\">LitElement</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">{</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">  </span><span class=\"token keyword\" style=\"font-style:italic\">public</span><span class=\"token plain\"> </span><span class=\"token function\" style=\"color:rgb(130, 170, 255)\">openDialog</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">{</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">    </span><span class=\"token keyword\" style=\"font-style:italic\">this</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token function\" style=\"color:rgb(130, 170, 255)\">_initDirtyTracking</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">{</span><span class=\"token plain\"> type</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">:</span><span class=\"token plain\"> </span><span class=\"token string\" style=\"color:rgb(195, 232, 141)\">\"shallow\"</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">}</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"> </span><span class=\"token keyword\" style=\"font-style:italic\">this</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token plain\">_state</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">;</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">  </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">}</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\" style=\"display:inline-block\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">  </span><span class=\"token keyword\" style=\"font-style:italic\">private</span><span class=\"token plain\"> </span><span class=\"token function\" style=\"color:rgb(130, 170, 255)\">_stateChanged</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token plain\">state</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">:</span><span class=\"token plain\"> MyState</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">{</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">    </span><span class=\"token keyword\" style=\"font-style:italic\">this</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token function\" style=\"color:rgb(130, 170, 255)\">_updateDirtyState</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token plain\">state</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">;</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">  </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">}</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\"></span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">}</span><br></div></code></pre></div></div>\n<p><code>isDirtyState</code> is the raw comparison and is usually right for enabling Save. <code>isEffectiveDirtyState</code> can ignore equivalent config output, for example when an editor normalizes an explicit default back to the same effective config.</p>\n<h3 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"related-context\">Related context<a href=\"https://developers.home-assistant.io/blog/2026/06/23/frontend-component-updates-2026.7#related-context\" class=\"hash-link\" aria-label=\"Direct link to Related context\" title=\"Direct link to Related context\" translate=\"no\">​</a></h3>\n<p>Pages and editors can now publish related context for nearby pickers:</p>\n<ul>\n<li class=\"\"><code>relatedContext</code></li>\n<li class=\"\"><code>fireRelatedContext</code></li>\n<li class=\"\"><code>fireEntityRelatedContext</code></li>\n</ul>\n<p>When a card editor, badge editor, automation trace page, or similar surface knows the current entity, device, or area, it can provide that context. Entity pickers and add-element searches can then prioritize related entities, devices, and areas.</p>\n<div class=\"language-ts codeBlockContainer_Ckt0 theme-code-block\" style=\"--prism-color:#bfc7d5;--prism-background-color:#292d3e\"><div class=\"codeBlockContent_QJqH\"><pre tabindex=\"0\" class=\"prism-code language-ts codeBlock_bY9V thin-scrollbar\" style=\"color:#bfc7d5;background-color:#292d3e\"><code class=\"codeBlockLines_e6Vv\"><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token function\" style=\"color:rgb(130, 170, 255)\">fireEntityRelatedContext</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token keyword\" style=\"font-style:italic\">this</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"> </span><span class=\"token string\" style=\"color:rgb(195, 232, 141)\">\"light.kitchen\"</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">;</span><br></div></code></pre></div></div>\n<p>Clear the context with <code>undefined</code> when the editor no longer has a related item.</p>\n<h3 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"narrow-viewport-context\">Narrow viewport context<a href=\"https://developers.home-assistant.io/blog/2026/06/23/frontend-component-updates-2026.7#narrow-viewport-context\" class=\"hash-link\" aria-label=\"Direct link to Narrow viewport context\" title=\"Direct link to Narrow viewport context\" translate=\"no\">​</a></h3>\n<p><code>narrowViewportContext</code> exposes whether the main Home Assistant viewport is in the narrow layout.</p>\n<p>Components that only need narrow-layout state can consume this context instead of receiving <code>narrow</code> through several layers of properties.</p>\n<div class=\"language-ts codeBlockContainer_Ckt0 theme-code-block\" style=\"--prism-color:#bfc7d5;--prism-background-color:#292d3e\"><div class=\"codeBlockContent_QJqH\"><pre tabindex=\"0\" class=\"prism-code language-ts codeBlock_bY9V thin-scrollbar\" style=\"color:#bfc7d5;background-color:#292d3e\"><code class=\"codeBlockLines_e6Vv\"><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token decorator at operator\" style=\"color:rgb(137, 221, 255)\">@</span><span class=\"token decorator function\" style=\"color:rgb(130, 170, 255)\">consume</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">{</span><span class=\"token plain\"> context</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">:</span><span class=\"token plain\"> narrowViewportContext</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"> subscribe</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">:</span><span class=\"token plain\"> </span><span class=\"token boolean\" style=\"color:rgb(255, 88, 116)\">true</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">}</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\"></span><span class=\"token keyword\" style=\"font-style:italic\">private</span><span class=\"token plain\"> _narrow</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">!</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">:</span><span class=\"token plain\"> </span><span class=\"token builtin\" style=\"color:rgb(130, 170, 255)\">boolean</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">;</span><br></div></code></pre></div></div>\n<h2 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"lovelace-updates\">Lovelace updates<a href=\"https://developers.home-assistant.io/blog/2026/06/23/frontend-component-updates-2026.7#lovelace-updates\" class=\"hash-link\" aria-label=\"Direct link to Lovelace updates\" title=\"Direct link to Lovelace updates\" translate=\"no\">​</a></h2>\n<h3 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"strategy-regeneration-control\">Strategy regeneration control<a href=\"https://developers.home-assistant.io/blog/2026/06/23/frontend-component-updates-2026.7#strategy-regeneration-control\" class=\"hash-link\" aria-label=\"Direct link to Strategy regeneration control\" title=\"Direct link to Strategy regeneration control\" translate=\"no\">​</a></h3>\n<p>Lovelace strategies can now avoid unnecessary regeneration.</p>\n<p>Strategies may declare <code>registryDependencies</code> to use the default reference-change check for only the registries they depend on:</p>\n<div class=\"language-ts codeBlockContainer_Ckt0 theme-code-block\" style=\"--prism-color:#bfc7d5;--prism-background-color:#292d3e\"><div class=\"codeBlockContent_QJqH\"><pre tabindex=\"0\" class=\"prism-code language-ts codeBlock_bY9V thin-scrollbar\" style=\"color:#bfc7d5;background-color:#292d3e\"><code class=\"codeBlockLines_e6Vv\"><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token keyword\" style=\"font-style:italic\">static</span><span class=\"token plain\"> registryDependencies </span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">=</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">[</span><span class=\"token string\" style=\"color:rgb(195, 232, 141)\">\"entities\"</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"> </span><span class=\"token string\" style=\"color:rgb(195, 232, 141)\">\"areas\"</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">]</span><span class=\"token plain\"> </span><span class=\"token keyword\" style=\"font-style:italic\">as</span><span class=\"token plain\"> </span><span class=\"token keyword\" style=\"font-style:italic\">const</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">;</span><br></div></code></pre></div></div>\n<p>For custom logic, implement <code>shouldRegenerate()</code>:</p>\n<div class=\"language-ts codeBlockContainer_Ckt0 theme-code-block\" style=\"--prism-color:#bfc7d5;--prism-background-color:#292d3e\"><div class=\"codeBlockContent_QJqH\"><pre tabindex=\"0\" class=\"prism-code language-ts codeBlock_bY9V thin-scrollbar\" style=\"color:#bfc7d5;background-color:#292d3e\"><code class=\"codeBlockLines_e6Vv\"><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token keyword\" style=\"font-style:italic\">static</span><span class=\"token plain\"> </span><span class=\"token function\" style=\"color:rgb(130, 170, 255)\">shouldRegenerate</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token plain\">config</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"> oldHomeAssistant</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"> newHomeAssistant</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">{</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">  </span><span class=\"token keyword\" style=\"font-style:italic\">return</span><span class=\"token plain\"> oldHomeAssistant</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token plain\">entities </span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">!==</span><span class=\"token plain\"> newHomeAssistant</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token plain\">entities</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">;</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\"></span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">}</span><br></div></code></pre></div></div>\n<p>If neither is provided, strategies keep the previous default behavior and regenerate on changes to entities, devices, areas, or floors.</p>",
            "url": "https://developers.home-assistant.io/blog/2026/06/23/frontend-component-updates-2026.7",
            "title": "Frontend component updates in 2026.7",
            "summary": "Component updates",
            "date_modified": "2026-06-23T00:00:00.000Z",
            "author": {
                "name": "Jan-Philipp Benecke",
                "url": "https://github.com/jpbede"
            },
            "tags": []
        },
        {
            "id": "https://developers.home-assistant.io/blog/2026/06/15/device-tracker-changes",
            "content_html": "<h2 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"summary\">Summary<a href=\"https://developers.home-assistant.io/blog/2026/06/15/device-tracker-changes#summary\" class=\"hash-link\" aria-label=\"Direct link to Summary\" title=\"Direct link to Summary\" translate=\"no\">​</a></h2>\n<p>There have been multiple recent changes to the device tracker entity model:</p>\n<ul>\n<li class=\"\">The <code>battery_level</code> property has been deprecated</li>\n<li class=\"\">The <code>location_name</code> property of <code>TrackerEntity</code> has been deprecated</li>\n<li class=\"\">A new entity base class <code>BaseScannerEntity</code> has been introduced</li>\n<li class=\"\">Users can associate scanners with other zones than the home zone</li>\n<li class=\"\"><code>TrackerEntity</code> has a new property <code>in_zones</code></li>\n<li class=\"\"><code>BaseScannerEntity</code> and <code>ScannerEntity</code> have a new state attribute <code>in_zones</code></li>\n<li class=\"\">A new capability attribute <code>tracking_type</code> has been introduced</li>\n<li class=\"\">Zones are now calculated by size, then distance to center when calculating the state of <code>TrackerEntity</code></li>\n</ul>\n<h2 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"details\">Details<a href=\"https://developers.home-assistant.io/blog/2026/06/15/device-tracker-changes#details\" class=\"hash-link\" aria-label=\"Direct link to Details\" title=\"Direct link to Details\" translate=\"no\">​</a></h2>\n<h3 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"deprecation-of-battery_level\">Deprecation of <code>battery_level</code><a href=\"https://developers.home-assistant.io/blog/2026/06/15/device-tracker-changes#deprecation-of-battery_level\" class=\"hash-link\" aria-label=\"Direct link to deprecation-of-battery_level\" title=\"Direct link to deprecation-of-battery_level\" translate=\"no\">​</a></h3>\n<p>The <code>battery_level</code> property has been deprecated in all device tracker base classes, and will stop working in Home Assistant Core 2027.7. Integrations should communicate battery level via a battery sensor instead.</p>\n<p>More details can be found in  <a href=\"https://github.com/home-assistant/architecture/discussions/627\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"\">architecture proposal #627</a></p>\n<h3 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"deprecation-of-location_name\">Deprecation of <code>location_name</code><a href=\"https://developers.home-assistant.io/blog/2026/06/15/device-tracker-changes#deprecation-of-location_name\" class=\"hash-link\" aria-label=\"Direct link to deprecation-of-location_name\" title=\"Direct link to deprecation-of-location_name\" translate=\"no\">​</a></h3>\n<p>The <code>location_name</code> property of <code>TrackerEntity</code> has been deprecated, and will stop working in Home Assistant Core 2027.7.</p>\n<p>Integrations with device trackers which do not know or do not want to report the exact coordinates and today use <code>location_name</code> to report the name of a zone should instead report a list of zone entity IDs through the <code>in_zones</code> property.\nDevice trackers which use <code>location_name</code> to give extra context can instead do that via a separate sensor or an extra state attribute.</p>\n<p>More details can be found in  <a href=\"https://github.com/home-assistant/architecture/discussions/1387\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"\">architecture proposal #1387</a></p>\n<h3 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"introduction-of-the-basescannerentity-base-class\">Introduction of the <code>BaseScannerEntity</code> base class<a href=\"https://developers.home-assistant.io/blog/2026/06/15/device-tracker-changes#introduction-of-the-basescannerentity-base-class\" class=\"hash-link\" aria-label=\"Direct link to introduction-of-the-basescannerentity-base-class\" title=\"Direct link to introduction-of-the-basescannerentity-base-class\" translate=\"no\">​</a></h3>\n<p>The <a class=\"\" href=\"https://developers.home-assistant.io/docs/core/entity/device-tracker#basescannerentity\"><code>BaseScannerEntity</code></a> class should be used by integrations which have scanners which do not track connection to a WLAN or other local network, for example scanners which track connection to a BLE beacon.</p>\n<h3 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"users-can-associate-basescannerentity-and-scannerentity-with-any-zone\">Users can associate <code>BaseScannerEntity</code> and <code>ScannerEntity</code> with any zone<a href=\"https://developers.home-assistant.io/blog/2026/06/15/device-tracker-changes#users-can-associate-basescannerentity-and-scannerentity-with-any-zone\" class=\"hash-link\" aria-label=\"Direct link to users-can-associate-basescannerentity-and-scannerentity-with-any-zone\" title=\"Direct link to users-can-associate-basescannerentity-and-scannerentity-with-any-zone\" translate=\"no\">​</a></h3>\n<p><code>BaseScannerEntity</code> and <code>ScannerEntity</code> store the associated zone as an entity registry option. The base class will set the state of the entity to the name of the associated zone when connected, and the <code>in_zones</code> state attribute to all zones which contain the associated zone.</p>\n<p>More details can be found in  <a href=\"https://github.com/home-assistant/architecture/discussions/1389\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"\">architecture proposal #1389</a></p>\n<h3 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"introduction-of-the-in_zones-state-attribute\">Introduction of the <code>in_zones</code> state attribute<a href=\"https://developers.home-assistant.io/blog/2026/06/15/device-tracker-changes#introduction-of-the-in_zones-state-attribute\" class=\"hash-link\" aria-label=\"Direct link to introduction-of-the-in_zones-state-attribute\" title=\"Direct link to introduction-of-the-in_zones-state-attribute\" translate=\"no\">​</a></h3>\n<p>A new state attribute <code>in_zones</code> is present in the state of device tracker entities. The state attribute is automatically calculated by <code>BaseScannerEntity</code> and <code>ScannerEntity</code>. <code>TrackerEntity</code> will derive the <code>in_zones</code> state attribute from the <a href=\"https://developers.home-assistant.io/docs/core/entity/device-tracker#properties-2\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"\"><code>in_zones</code> property</a> if not <code>None</code>, if it is <code>None</code> it will be calculated from the reported location.</p>\n<p>The <code>in_zones</code> state attribute is a list of zone entity IDs sorted by size, with the smallest zone first, then by distance to center.</p>\n<h3 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"introduction-of-the-tracking_type-capability-attribute\">Introduction of the <code>tracking_type</code> capability attribute<a href=\"https://developers.home-assistant.io/blog/2026/06/15/device-tracker-changes#introduction-of-the-tracking_type-capability-attribute\" class=\"hash-link\" aria-label=\"Direct link to introduction-of-the-tracking_type-capability-attribute\" title=\"Direct link to introduction-of-the-tracking_type-capability-attribute\" translate=\"no\">​</a></h3>\n<p>A new capability attribute <code>tracking_type</code> is present in the state of device tracker entities. The state attribute is set to <code>connection</code> by <code>BaseScannerEntity</code> and <code>ScannerEntity</code> and to <code>location</code> by <code>TrackerEntity</code>. Integrations should not override this behavior.</p>",
            "url": "https://developers.home-assistant.io/blog/2026/06/15/device-tracker-changes",
            "title": "Changes to device tracker entity models",
            "summary": "Summary",
            "date_modified": "2026-06-15T00:00:00.000Z",
            "author": {
                "name": "Erik Montnemery",
                "url": "https://github.com/emontnemery"
            },
            "tags": []
        },
        {
            "id": "https://developers.home-assistant.io/blog/2026/05/27/custom-card-suggestions",
            "content_html": "<p>As of Home Assistant 2026.6, custom cards can show up as suggestions in the card picker. When a user selects an entity, custom cards that opt in are listed under a <strong>Community</strong> section, below the built-in suggestions.</p>\n<p>To opt in, add a <code>getEntitySuggestion</code> function to your <code>window.customCards</code> entry. It receives the <code>hass</code> object and the selected entity id, and returns a suggestion (or <code>null</code> if the entity is not supported):</p>\n<div class=\"language-js codeBlockContainer_Ckt0 theme-code-block\" style=\"--prism-color:#bfc7d5;--prism-background-color:#292d3e\"><div class=\"codeBlockContent_QJqH\"><pre tabindex=\"0\" class=\"prism-code language-js codeBlock_bY9V thin-scrollbar\" style=\"color:#bfc7d5;background-color:#292d3e\"><code class=\"codeBlockLines_e6Vv\"><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token dom variable\" style=\"color:rgb(191, 199, 213)\">window</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token property-access\">customCards</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token method function property-access\" style=\"color:rgb(130, 170, 255)\">push</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">{</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">  </span><span class=\"token literal-property property\">type</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">:</span><span class=\"token plain\"> </span><span class=\"token string\" style=\"color:rgb(195, 232, 141)\">\"my-card\"</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">  </span><span class=\"token literal-property property\">name</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">:</span><span class=\"token plain\"> </span><span class=\"token string\" style=\"color:rgb(195, 232, 141)\">\"My Card\"</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">  </span><span class=\"token function-variable function\" style=\"color:rgb(130, 170, 255)\">getEntitySuggestion</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">:</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token parameter\">hass</span><span class=\"token parameter punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token parameter\"> entityId</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token plain\"> </span><span class=\"token arrow operator\" style=\"color:rgb(137, 221, 255)\">=&gt;</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">{</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">    </span><span class=\"token keyword control-flow\" style=\"font-style:italic\">if</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token plain\">entityId</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token method function property-access\" style=\"color:rgb(130, 170, 255)\">split</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token string\" style=\"color:rgb(195, 232, 141)\">\".\"</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">[</span><span class=\"token number\" style=\"color:rgb(247, 140, 108)\">0</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">]</span><span class=\"token plain\"> </span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">!==</span><span class=\"token plain\"> </span><span class=\"token string\" style=\"color:rgb(195, 232, 141)\">\"light\"</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">{</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">      </span><span class=\"token keyword control-flow\" style=\"font-style:italic\">return</span><span class=\"token plain\"> </span><span class=\"token keyword null nil\" style=\"font-style:italic\">null</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">;</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">    </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">}</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">    </span><span class=\"token keyword control-flow\" style=\"font-style:italic\">return</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">{</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">      </span><span class=\"token literal-property property\">config</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">:</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">{</span><span class=\"token plain\"> </span><span class=\"token literal-property property\">type</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">:</span><span class=\"token plain\"> </span><span class=\"token string\" style=\"color:rgb(195, 232, 141)\">\"custom:my-card\"</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"> </span><span class=\"token literal-property property\">entity</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">:</span><span class=\"token plain\"> entityId </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">}</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">    </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">}</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">;</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">  </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">}</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\"></span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">}</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">;</span><br></div></code></pre></div></div>\n<p>You can also return an array of suggestions to offer several variants, each with its own <code>label</code>.</p>\n<p>Only suggest your card when it makes sense for the entity. Check the domain, device class, or supported features with the <code>hass</code> object, and return <code>null</code> otherwise. Suggesting your card for every entity makes the picker noisy.</p>\n<p>See the <a class=\"\" href=\"https://developers.home-assistant.io/docs/frontend/custom-ui/custom-card#suggesting-your-card-for-an-entity\">custom card documentation</a> for the full reference.</p>",
            "url": "https://developers.home-assistant.io/blog/2026/05/27/custom-card-suggestions",
            "title": "Custom card suggestions in the card picker",
            "summary": "As of Home Assistant 2026.6, custom cards can show up as suggestions in the card picker. When a user selects an entity, custom cards that opt in are listed under a Community section, below the built-in suggestions.",
            "date_modified": "2026-05-27T00:00:00.000Z",
            "author": {
                "name": "Paul Bottein",
                "url": "https://github.com/piitaya"
            },
            "tags": []
        },
        {
            "id": "https://developers.home-assistant.io/blog/2026/05/27/frontend-component-updates-2026.6",
            "content_html": "<h2 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"component-updates\">Component updates<a href=\"https://developers.home-assistant.io/blog/2026/05/27/frontend-component-updates-2026.6#component-updates\" class=\"hash-link\" aria-label=\"Direct link to Component updates\" title=\"Direct link to Component updates\" translate=\"no\">​</a></h2>\n<h3 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"ha-radio-updates\">ha-radio updates<a href=\"https://developers.home-assistant.io/blog/2026/05/27/frontend-component-updates-2026.6#ha-radio-updates\" class=\"hash-link\" aria-label=\"Direct link to ha-radio updates\" title=\"Direct link to ha-radio updates\" translate=\"no\">​</a></h3>\n<p><code>ha-radio</code> was removed from our codebase, we use the webawesome based <code>ha-radio-group</code> with <code>ha-radio-option</code> now. No need for a <code>ha-formfield</code> around a <code>ha-radio</code> anymore and you can use the new CSS properties to customize the radio group and options.</p>\n<p>New component specific tokens:</p>\n<div class=\"language-css codeBlockContainer_Ckt0 theme-code-block\" style=\"--prism-color:#bfc7d5;--prism-background-color:#292d3e\"><div class=\"codeBlockContent_QJqH\"><pre tabindex=\"0\" class=\"prism-code language-css codeBlock_bY9V thin-scrollbar\" style=\"color:#bfc7d5;background-color:#292d3e\"><code class=\"codeBlockLines_e6Vv\"><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token variable\" style=\"color:rgb(191, 199, 213)\">--ha-radio-group-required-marker</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\"></span><span class=\"token variable\" style=\"color:rgb(191, 199, 213)\">--ha-radio-group-required-marker-offset</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\" style=\"display:inline-block\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\"></span><span class=\"token variable\" style=\"color:rgb(191, 199, 213)\">--ha-radio-option-active-color</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\"></span><span class=\"token variable\" style=\"color:rgb(191, 199, 213)\">--ha-radio-option-heigh</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\"></span><span class=\"token variable\" style=\"color:rgb(191, 199, 213)\">--ha-radio-option-toggle-size</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\"></span><span class=\"token variable\" style=\"color:rgb(191, 199, 213)\">--ha-radio-option-border-width</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\"></span><span class=\"token variable\" style=\"color:rgb(191, 199, 213)\">--ha-radio-option-border-color</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\"></span><span class=\"token variable\" style=\"color:rgb(191, 199, 213)\">--ha-radio-option-border-color-hover</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\"></span><span class=\"token variable\" style=\"color:rgb(191, 199, 213)\">--ha-radio-option-background-color</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\"></span><span class=\"token variable\" style=\"color:rgb(191, 199, 213)\">--ha-radio-option-background-color-hover</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\"></span><span class=\"token variable\" style=\"color:rgb(191, 199, 213)\">--ha-radio-option-checked-background-color</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\"></span><span class=\"token variable\" style=\"color:rgb(191, 199, 213)\">--ha-radio-option-checked-icon-color</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\"></span><span class=\"token variable\" style=\"color:rgb(191, 199, 213)\">--ha-radio-option-checked-icon-scale</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\"></span><span class=\"token variable\" style=\"color:rgb(191, 199, 213)\">--ha-radio-option-control-margin</span><br></div></code></pre></div></div>\n<h3 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"ha-drawer-updates\">ha-drawer updates<a href=\"https://developers.home-assistant.io/blog/2026/05/27/frontend-component-updates-2026.6#ha-drawer-updates\" class=\"hash-link\" aria-label=\"Direct link to ha-drawer updates\" title=\"Direct link to ha-drawer updates\" translate=\"no\">​</a></h3>\n<p><code>ha-drawer</code> was updated to use the webawesome drawer component. The API is mostly the same it just uses now <code>--ha-sidebar-width</code> instead of <code>--mdc-drawer-width</code></p>\n<h3 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"top-bar\">top bar<a href=\"https://developers.home-assistant.io/blog/2026/05/27/frontend-component-updates-2026.6#top-bar\" class=\"hash-link\" aria-label=\"Direct link to top bar\" title=\"Direct link to top bar\" translate=\"no\">​</a></h3>\n<ul>\n<li class=\"\"><code>ha-top-app-bar</code> was removed entirely.</li>\n<li class=\"\"><code>ha-top-app-bar-fixed</code> was migrated from MWC to plain Lit.</li>\n<li class=\"\"><code>ha-two-pane-top-app-bar-fixed</code> was rewritten to extend the new implementation instead of Material base code.</li>\n<li class=\"\"><code>ha-header-bar</code> was rewritten from a Material top-app-bar styled wrapper to a native Lit component.</li>\n</ul>\n<p>The <code>--ha-top-app-bar-width</code> token replaces <code>--mdc-top-app-bar-width</code>.</p>\n<h2 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"new-decorators\">New decorators<a href=\"https://developers.home-assistant.io/blog/2026/05/27/frontend-component-updates-2026.6#new-decorators\" class=\"hash-link\" aria-label=\"Direct link to New decorators\" title=\"Direct link to New decorators\" translate=\"no\">​</a></h2>\n<h3 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"consumelocalize\">@consumeLocalize<a href=\"https://developers.home-assistant.io/blog/2026/05/27/frontend-component-updates-2026.6#consumelocalize\" class=\"hash-link\" aria-label=\"Direct link to @consumeLocalize\" title=\"Direct link to @consumeLocalize\" translate=\"no\">​</a></h3>\n<p>Following up on the <a class=\"\" href=\"https://developers.home-assistant.io/blog/2026/05/04/frontend-context-groups-decorators\">context entry decorators</a> introduced last release, we added a shortcut for the most common single-field read off <code>internationalizationContext</code>: the <code>localize</code> function.</p>\n<p>Before:</p>\n<div class=\"language-ts codeBlockContainer_Ckt0 theme-code-block\" style=\"--prism-color:#bfc7d5;--prism-background-color:#292d3e\"><div class=\"codeBlockContent_QJqH\"><pre tabindex=\"0\" class=\"prism-code language-ts codeBlock_bY9V thin-scrollbar\" style=\"color:#bfc7d5;background-color:#292d3e\"><code class=\"codeBlockLines_e6Vv\"><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token decorator at operator\" style=\"color:rgb(137, 221, 255)\">@</span><span class=\"token decorator function\" style=\"color:rgb(130, 170, 255)\">state</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\"></span><span class=\"token decorator at operator\" style=\"color:rgb(137, 221, 255)\">@</span><span class=\"token decorator function\" style=\"color:rgb(130, 170, 255)\">consume</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">{</span><span class=\"token plain\"> context</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">:</span><span class=\"token plain\"> internationalizationContext</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"> subscribe</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">:</span><span class=\"token plain\"> </span><span class=\"token boolean\" style=\"color:rgb(255, 88, 116)\">true</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">}</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\"></span><span class=\"token decorator at operator\" style=\"color:rgb(137, 221, 255)\">@</span><span class=\"token decorator function\" style=\"color:rgb(130, 170, 255)\">transform</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">&lt;</span><span class=\"token plain\">HomeAssistantInternationalization</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"> LocalizeFunc</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">&gt;</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">{</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">  </span><span class=\"token function-variable function\" style=\"color:rgb(130, 170, 255)\">transformer</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">:</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">{</span><span class=\"token plain\"> localize </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">}</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token plain\"> </span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">=&gt;</span><span class=\"token plain\"> localize</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\"></span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">}</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\"></span><span class=\"token keyword\" style=\"font-style:italic\">private</span><span class=\"token plain\"> _localize</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">!</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">:</span><span class=\"token plain\"> LocalizeFunc</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">;</span><br></div></code></pre></div></div>\n<p>After:</p>\n<div class=\"language-ts codeBlockContainer_Ckt0 theme-code-block\" style=\"--prism-color:#bfc7d5;--prism-background-color:#292d3e\"><div class=\"codeBlockContent_QJqH\"><pre tabindex=\"0\" class=\"prism-code language-ts codeBlock_bY9V thin-scrollbar\" style=\"color:#bfc7d5;background-color:#292d3e\"><code class=\"codeBlockLines_e6Vv\"><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token decorator at operator\" style=\"color:rgb(137, 221, 255)\">@</span><span class=\"token decorator function\" style=\"color:rgb(130, 170, 255)\">state</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\"></span><span class=\"token decorator at operator\" style=\"color:rgb(137, 221, 255)\">@</span><span class=\"token decorator function\" style=\"color:rgb(130, 170, 255)\">consumeLocalize</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\"></span><span class=\"token keyword\" style=\"font-style:italic\">private</span><span class=\"token plain\"> _localize</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">!</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">:</span><span class=\"token plain\"> LocalizeFunc</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">;</span><br></div></code></pre></div></div>\n<p>Use <code>@consumeLocalize()</code> whenever a component only needs the <code>localize</code> function. For other single-field reads off <code>internationalizationContext</code> (e.g. <code>locale</code>, <code>language</code>), keep using <code>@consume</code> + <code>@transform</code>.</p>",
            "url": "https://developers.home-assistant.io/blog/2026/05/27/frontend-component-updates-2026.6",
            "title": "Frontend component updates in 2026.6",
            "summary": "Component updates",
            "date_modified": "2026-05-27T00:00:00.000Z",
            "author": {
                "name": "Wendelin Peleska",
                "url": "https://github.com/wendevlin"
            },
            "tags": []
        },
        {
            "id": "https://developers.home-assistant.io/blog/2026/05/26/advanced-mode-config-flow-deprecation",
            "content_html": "<h2 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"summary\">Summary<a href=\"https://developers.home-assistant.io/blog/2026/05/26/advanced-mode-config-flow-deprecation#summary\" class=\"hash-link\" aria-label=\"Direct link to Summary\" title=\"Direct link to Summary\" translate=\"no\">​</a></h2>\n<p>User profile <a href=\"https://github.com/OpenHomeFoundation/roadmap/issues/54\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"\">advanced mode is going away</a>, which means integrations can no longer check if advanced mode is enabled or not in data entry flows.</p>\n<p>Integrations authors need to update integrations to use an alternative user friendly way to present additional options in the UI, for example group additional options in a section.</p>\n<h3 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"flowhandlershow_advanced_options\"><code>FlowHandler.show_advanced_options</code><a href=\"https://developers.home-assistant.io/blog/2026/05/26/advanced-mode-config-flow-deprecation#flowhandlershow_advanced_options\" class=\"hash-link\" aria-label=\"Direct link to flowhandlershow_advanced_options\" title=\"Direct link to flowhandlershow_advanced_options\" translate=\"no\">​</a></h3>\n<p>The <code>FlowHandler.show_advanced_options</code> property has been deprecated and will be removed with the release of Home Assistant Core 2027.6. During the deprecation period, <code>FlowHandler.show_advanced_options</code> unconditionally returns <code>True</code> to not make options gated by this flag inaccessible to users.</p>\n<h3 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"flowhandlercontextshow_advanced_options\"><code>FlowHandler.context['show_advanced_options']</code><a href=\"https://developers.home-assistant.io/blog/2026/05/26/advanced-mode-config-flow-deprecation#flowhandlercontextshow_advanced_options\" class=\"hash-link\" aria-label=\"Direct link to flowhandlercontextshow_advanced_options\" title=\"Direct link to flowhandlercontextshow_advanced_options\" translate=\"no\">​</a></h3>\n<p>There is no longer a <code>show_advanced_options</code> key in <code>FlowHandler.context</code>.</p>\n<h2 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"background\">Background<a href=\"https://developers.home-assistant.io/blog/2026/05/26/advanced-mode-config-flow-deprecation#background\" class=\"hash-link\" aria-label=\"Direct link to Background\" title=\"Direct link to Background\" translate=\"no\">​</a></h2>\n<p>The Advanced mode toggle in the user profile is a single binary switch that gates a collection of unrelated features across Home Assistant, from app (add-on) visibility (Terminal &amp; SSH) to configuration options and UI elements, and we've been working on removing it during the past year.</p>\n<p>For a more in-depth explanation, see <a href=\"https://github.com/OpenHomeFoundation/roadmap/issues/54\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"\">roadmap issue #54</a>.</p>",
            "url": "https://developers.home-assistant.io/blog/2026/05/26/advanced-mode-config-flow-deprecation",
            "title": "Deprecation of advanced mode in data entry flow",
            "summary": "Summary",
            "date_modified": "2026-05-26T00:00:00.000Z",
            "author": {
                "name": "Erik Montnemery",
                "url": "https://github.com/emontnemery"
            },
            "tags": []
        },
        {
            "id": "https://developers.home-assistant.io/blog/2026/05/20/browse-media-source-root-class",
            "content_html": "<p>The <code>BrowseMediaSource</code> class in the <code>media_source</code> integration has been tightened up. The <code>domain</code> parameter is now a required <code>str</code> instead of <code>str | None</code>, and the special \"list every media source\" root node has moved to its own class, <code>RootBrowseMediaSource</code>.</p>\n<p>Previously, <code>domain</code> was optional only to represent one edge case: the top-level node returned when browsing <code>media-source://</code> with no specific source selected. That made the type hint misleading for the 99% case — every actual media source has a domain — and added a <code>None</code> branch that consumers had to think about. Splitting the root into its own class removes that branch.</p>\n<h2 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"what-changed\">What changed<a href=\"https://developers.home-assistant.io/blog/2026/05/20/browse-media-source-root-class#what-changed\" class=\"hash-link\" aria-label=\"Direct link to What changed\" title=\"Direct link to What changed\" translate=\"no\">​</a></h2>\n<ul>\n<li class=\"\"><code>BrowseMediaSource.__init__</code> now requires <code>domain: str</code>.</li>\n<li class=\"\">A new <code>RootBrowseMediaSource</code> class represents the root browse node listing all available media sources. It hardcodes <code>domain=None</code> and <code>identifier=None</code> and uses <code>media-source://</code> as its content ID.</li>\n<li class=\"\"><code>media_source.async_browse_media()</code> and <code>MediaSourceItem.async_browse()</code> now return <code>BrowseMediaSource | RootBrowseMediaSource</code>.</li>\n</ul>\n<h2 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"impact-on-custom-integrations\">Impact on custom integrations<a href=\"https://developers.home-assistant.io/blog/2026/05/20/browse-media-source-root-class#impact-on-custom-integrations\" class=\"hash-link\" aria-label=\"Direct link to Impact on custom integrations\" title=\"Direct link to Impact on custom integrations\" translate=\"no\">​</a></h2>\n<p>Most integrations don't need any changes. If you implement a <code>media_source.py</code> platform, you were already passing your own <code>domain</code> to <code>BrowseMediaSource</code> — that keeps working.</p>\n<p>You only need to act if:</p>\n<ul>\n<li class=\"\">\n<p><strong>You pass <code>domain=None</code> to <code>BrowseMediaSource</code>.</strong> This is no longer allowed. Set your integration domain instead.</p>\n</li>\n<li class=\"\">\n<p><strong>You call <code>media_source.async_browse_media()</code> and annotate the result.</strong> Update the type hint to <code>BrowseMediaSource | RootBrowseMediaSource</code>, or narrow with <code>isinstance()</code> before using domain-specific attributes:</p>\n<div class=\"language-python codeBlockContainer_Ckt0 theme-code-block\" style=\"--prism-color:#bfc7d5;--prism-background-color:#292d3e\"><div class=\"codeBlockContent_QJqH\"><pre tabindex=\"0\" class=\"prism-code language-python codeBlock_bY9V thin-scrollbar\" style=\"color:#bfc7d5;background-color:#292d3e\"><code class=\"codeBlockLines_e6Vv\"><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token keyword\" style=\"font-style:italic\">from</span><span class=\"token plain\"> homeassistant</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token plain\">components</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token plain\">media_source </span><span class=\"token keyword\" style=\"font-style:italic\">import</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">    BrowseMediaSource</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">    async_browse_media</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\"></span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\" style=\"display:inline-block\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">result </span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">=</span><span class=\"token plain\"> </span><span class=\"token keyword\" style=\"font-style:italic\">await</span><span class=\"token plain\"> async_browse_media</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token plain\">hass</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"> media_content_id</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\"></span><span class=\"token keyword\" style=\"font-style:italic\">if</span><span class=\"token plain\"> </span><span class=\"token builtin\" style=\"color:rgb(130, 170, 255)\">isinstance</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token plain\">result</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"> BrowseMediaSource</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">:</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">    </span><span class=\"token comment\" style=\"color:rgb(105, 112, 152);font-style:italic\"># result.domain is guaranteed to be a str here</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">    </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><br></div></code></pre></div></div>\n</li>\n</ul>\n<p>See the updated <a class=\"\" href=\"https://developers.home-assistant.io/docs/core/platform/media_source\">media source platform documentation</a> for the full reference.</p>",
            "url": "https://developers.home-assistant.io/blog/2026/05/20/browse-media-source-root-class",
            "title": "BrowseMediaSource: domain is now required",
            "summary": "The BrowseMediaSource class in the media_source integration has been tightened up. The domain parameter is now a required str instead of str | None, and the special \"list every media source\" root node has moved to its own class, RootBrowseMediaSource.",
            "date_modified": "2026-05-20T00:00:00.000Z",
            "author": {
                "name": "Paulus Schoutsen",
                "url": "https://github.com/balloob"
            },
            "tags": []
        },
        {
            "id": "https://developers.home-assistant.io/blog/2026/05/13/condition-script-api-changes",
            "content_html": "<h2 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"summary\">Summary<a href=\"https://developers.home-assistant.io/blog/2026/05/13/condition-script-api-changes#summary\" class=\"hash-link\" aria-label=\"Direct link to Summary\" title=\"Direct link to Summary\" translate=\"no\">​</a></h2>\n<p>The condition and script APIs have been changed.</p>\n<p>Conditions are now instances of condition classes, which are evaluated by calling the <code>async_check</code> method and discarded by calling the <code>async_unload</code> method. Also, conditions may optionally implement an <code>_async_setup</code> or <code>_async_unload</code> method. Note that users of conditions don't need to call the condition's <code>async_setup</code> method.</p>\n<p>During a deprecation period, which ends with the release of Home Assistant Core 2027.1, it's possible to use the condition object as a callable.</p>\n<p>Scripts also have an <code>async_unload</code> method which must be called when the script is no longer needed.</p>\n<h2 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"impact-on-custom-integrations\">Impact on custom integrations<a href=\"https://developers.home-assistant.io/blog/2026/05/13/condition-script-api-changes#impact-on-custom-integrations\" class=\"hash-link\" aria-label=\"Direct link to Impact on custom integrations\" title=\"Direct link to Impact on custom integrations\" translate=\"no\">​</a></h2>\n<h3 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"custom-integrations-which-create-conditions-or-scripts\">Custom integrations which create conditions or scripts<a href=\"https://developers.home-assistant.io/blog/2026/05/13/condition-script-api-changes#custom-integrations-which-create-conditions-or-scripts\" class=\"hash-link\" aria-label=\"Direct link to Custom integrations which create conditions or scripts\" title=\"Direct link to Custom integrations which create conditions or scripts\" translate=\"no\">​</a></h3>\n<p>Custom integrations which create condition objects should evaluate them by calling the <code>async_check</code> method and call the <code>async_unload</code> method when the condition is no longer needed.</p>\n<p>Example:</p>\n<div class=\"language-python codeBlockContainer_Ckt0 theme-code-block\" style=\"--prism-color:#bfc7d5;--prism-background-color:#292d3e\"><div class=\"codeBlockContent_QJqH\"><pre tabindex=\"0\" class=\"prism-code language-python codeBlock_bY9V thin-scrollbar\" style=\"color:#bfc7d5;background-color:#292d3e\"><code class=\"codeBlockLines_e6Vv\"><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token keyword\" style=\"font-style:italic\">from</span><span class=\"token plain\"> homeassistant</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token plain\">helpers</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token plain\">condition </span><span class=\"token keyword\" style=\"font-style:italic\">import</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">    async_condition_from_config</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">    async_validate_condition_config</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\"></span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\" style=\"display:inline-block\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\"></span><span class=\"token comment\" style=\"color:rgb(105, 112, 152);font-style:italic\"># Validate condition config</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">validated_config </span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">=</span><span class=\"token plain\"> </span><span class=\"token keyword\" style=\"font-style:italic\">await</span><span class=\"token plain\"> async_validate_condition_config</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token plain\">hass</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"> config</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\" style=\"display:inline-block\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\"></span><span class=\"token comment\" style=\"color:rgb(105, 112, 152);font-style:italic\"># Create a condition</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">condition </span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">=</span><span class=\"token plain\"> </span><span class=\"token keyword\" style=\"font-style:italic\">await</span><span class=\"token plain\"> async_condition_from_config</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token plain\">hass</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"> validated_config</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\" style=\"display:inline-block\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\"></span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\" style=\"display:inline-block\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\"></span><span class=\"token comment\" style=\"color:rgb(105, 112, 152);font-style:italic\"># Evaluate the condition</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">result </span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">=</span><span class=\"token plain\"> condition</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token plain\">async_check</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\"></span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\" style=\"display:inline-block\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\"></span><span class=\"token comment\" style=\"color:rgb(105, 112, 152);font-style:italic\"># Discard the condition</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">condition</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token plain\">async_unload</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><br></div></code></pre></div></div>\n<p>Custom integrations which create scripts should call the <code>async_unload</code> method when the script is no longer needed.</p>\n<p>Example:</p>\n<div class=\"language-python codeBlockContainer_Ckt0 theme-code-block\" style=\"--prism-color:#bfc7d5;--prism-background-color:#292d3e\"><div class=\"codeBlockContent_QJqH\"><pre tabindex=\"0\" class=\"prism-code language-python codeBlock_bY9V thin-scrollbar\" style=\"color:#bfc7d5;background-color:#292d3e\"><code class=\"codeBlockLines_e6Vv\"><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token keyword\" style=\"font-style:italic\">from</span><span class=\"token plain\"> homeassistant</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token plain\">helpers</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token plain\">script </span><span class=\"token keyword\" style=\"font-style:italic\">import</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">    Script</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">    async_validate_actions_config</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\"></span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\" style=\"display:inline-block\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\"></span><span class=\"token comment\" style=\"color:rgb(105, 112, 152);font-style:italic\"># Validate script config</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">validated_config </span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">=</span><span class=\"token plain\"> </span><span class=\"token keyword\" style=\"font-style:italic\">await</span><span class=\"token plain\"> async_validate_actions_config</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token plain\">hass</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"> config</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\" style=\"display:inline-block\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\"></span><span class=\"token comment\" style=\"color:rgb(105, 112, 152);font-style:italic\"># Create a script</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">script </span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">=</span><span class=\"token plain\"> Script</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token plain\">hass</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"> validated_config</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\" style=\"display:inline-block\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\"></span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\" style=\"display:inline-block\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\"></span><span class=\"token comment\" style=\"color:rgb(105, 112, 152);font-style:italic\"># Execute the script</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">result </span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">=</span><span class=\"token plain\"> </span><span class=\"token keyword\" style=\"font-style:italic\">await</span><span class=\"token plain\"> script</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token plain\">async_run</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\"></span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\" style=\"display:inline-block\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\"></span><span class=\"token comment\" style=\"color:rgb(105, 112, 152);font-style:italic\"># Discard the script</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\"></span><span class=\"token keyword\" style=\"font-style:italic\">await</span><span class=\"token plain\"> script</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token plain\">async_unload</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><br></div></code></pre></div></div>\n<h3 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"custom-integrations-which-provide-a-condition-platform\">Custom integrations which provide a condition platform<a href=\"https://developers.home-assistant.io/blog/2026/05/13/condition-script-api-changes#custom-integrations-which-provide-a-condition-platform\" class=\"hash-link\" aria-label=\"Direct link to Custom integrations which provide a condition platform\" title=\"Direct link to Custom integrations which provide a condition platform\" translate=\"no\">​</a></h3>\n<p>Integrations which provide a condition platform don't need to change, but may implement <code>_async_setup</code> and <code>_async_unload</code> method if the platform needs to perform async initialization or do tear down.</p>\n<p>Example:</p>\n<div class=\"language-python codeBlockContainer_Ckt0 theme-code-block\" style=\"--prism-color:#bfc7d5;--prism-background-color:#292d3e\"><div class=\"codeBlockContent_QJqH\"><pre tabindex=\"0\" class=\"prism-code language-python codeBlock_bY9V thin-scrollbar\" style=\"color:#bfc7d5;background-color:#292d3e\"><code class=\"codeBlockLines_e6Vv\"><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\" style=\"display:inline-block\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\"></span><span class=\"token keyword\" style=\"font-style:italic\">from</span><span class=\"token plain\"> homeassistant</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token plain\">core </span><span class=\"token keyword\" style=\"font-style:italic\">import</span><span class=\"token plain\"> HomeAssistant</span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\"></span><span class=\"token keyword\" style=\"font-style:italic\">from</span><span class=\"token plain\"> homeassistant</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token plain\">helpers</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token plain\">condition </span><span class=\"token keyword\" style=\"font-style:italic\">import</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">    Condition</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">    ConditionCheckParams</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">    ConditionConfig</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\"></span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\"></span><span class=\"token keyword\" style=\"font-style:italic\">from</span><span class=\"token plain\"> homeassistant</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token plain\">helpers</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token plain\">typing </span><span class=\"token keyword\" style=\"font-style:italic\">import</span><span class=\"token plain\"> ConfigType</span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\" style=\"display:inline-block\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\"></span><span class=\"token keyword\" style=\"font-style:italic\">class</span><span class=\"token plain\"> </span><span class=\"token class-name\" style=\"color:rgb(255, 203, 107)\">CustomCondition</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token plain\">Condition</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">:</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">    </span><span class=\"token triple-quoted-string string\" style=\"color:rgb(195, 232, 141)\">\"\"\"A custom condition.\"\"\"</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\" style=\"display:inline-block\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">    </span><span class=\"token decorator annotation punctuation\" style=\"color:rgb(199, 146, 234)\">@classmethod</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">    </span><span class=\"token keyword\" style=\"font-style:italic\">async</span><span class=\"token plain\"> </span><span class=\"token keyword\" style=\"font-style:italic\">def</span><span class=\"token plain\"> </span><span class=\"token function\" style=\"color:rgb(130, 170, 255)\">async_validate_config</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">        cls</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"> hass</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">:</span><span class=\"token plain\"> HomeAssistant</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"> config</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">:</span><span class=\"token plain\"> ConfigType</span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">    </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token plain\"> </span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">-</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">&gt;</span><span class=\"token plain\"> ConfigType</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">:</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">        </span><span class=\"token triple-quoted-string string\" style=\"color:rgb(195, 232, 141)\">\"\"\"Validate config.\"\"\"</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">        </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\" style=\"display:inline-block\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">    </span><span class=\"token keyword\" style=\"font-style:italic\">def</span><span class=\"token plain\"> </span><span class=\"token function\" style=\"color:rgb(130, 170, 255)\">__init__</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token plain\">self</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"> hass</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">:</span><span class=\"token plain\"> HomeAssistant</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"> config</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">:</span><span class=\"token plain\"> ConditionConfig</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token plain\"> </span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">-</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">&gt;</span><span class=\"token plain\"> </span><span class=\"token boolean\" style=\"color:rgb(255, 88, 116)\">None</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">:</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">        </span><span class=\"token triple-quoted-string string\" style=\"color:rgb(195, 232, 141)\">\"\"\"Initialize condition.\"\"\"</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">        </span><span class=\"token builtin\" style=\"color:rgb(130, 170, 255)\">super</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token plain\">__init__</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token plain\">hass</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"> config</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">        </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\" style=\"display:inline-block\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">    </span><span class=\"token keyword\" style=\"font-style:italic\">async</span><span class=\"token plain\"> </span><span class=\"token keyword\" style=\"font-style:italic\">def</span><span class=\"token plain\"> </span><span class=\"token function\" style=\"color:rgb(130, 170, 255)\">_async_setup</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token plain\">self</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token plain\"> </span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">-</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">&gt;</span><span class=\"token plain\"> </span><span class=\"token boolean\" style=\"color:rgb(255, 88, 116)\">None</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">:</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">        </span><span class=\"token triple-quoted-string string\" style=\"color:rgb(195, 232, 141)\">\"\"\"Set up the condition checker.\"\"\"</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">        </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\" style=\"display:inline-block\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">    </span><span class=\"token keyword\" style=\"font-style:italic\">def</span><span class=\"token plain\"> </span><span class=\"token function\" style=\"color:rgb(130, 170, 255)\">_async_unload</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token plain\">self</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token plain\"> </span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">-</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">&gt;</span><span class=\"token plain\"> </span><span class=\"token boolean\" style=\"color:rgb(255, 88, 116)\">None</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">:</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">        </span><span class=\"token triple-quoted-string string\" style=\"color:rgb(195, 232, 141)\">\"\"\"Clean up any resources held by the checker.\"\"\"</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">        </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\" style=\"display:inline-block\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">    </span><span class=\"token keyword\" style=\"font-style:italic\">def</span><span class=\"token plain\"> </span><span class=\"token function\" style=\"color:rgb(130, 170, 255)\">_async_check</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token plain\">self</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"> </span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">**</span><span class=\"token plain\">kwargs</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">:</span><span class=\"token plain\"> Unpack</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">[</span><span class=\"token plain\">ConditionCheckParams</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">]</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token plain\"> </span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">-</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">&gt;</span><span class=\"token plain\"> </span><span class=\"token builtin\" style=\"color:rgb(130, 170, 255)\">bool</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">:</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">        </span><span class=\"token triple-quoted-string string\" style=\"color:rgb(195, 232, 141)\">\"\"\"Check the condition.\"\"\"</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">        </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><br></div></code></pre></div></div>",
            "url": "https://developers.home-assistant.io/blog/2026/05/13/condition-script-api-changes",
            "title": "Changes to the condition and script APIs",
            "summary": "Summary",
            "date_modified": "2026-05-13T00:00:00.000Z",
            "author": {
                "name": "Erik Montnemery",
                "url": "https://github.com/emontnemery"
            },
            "tags": []
        },
        {
            "id": "https://developers.home-assistant.io/blog/2026/05/11/format-entity-name-helper",
            "content_html": "<p>As of Home Assistant 2026.4, the <code>hass</code> object exposes a <code>formatEntityName</code> helper. It is the same function used by the built-in cards (tile card, entity rows, ...) to compute the display name of an entity from its registry context (entity, device, area, floor). Custom cards can use it to produce names that stay consistent with the rest of the dashboard.</p>\n<p>Given a temperature sensor named <code>Temperature</code> on a device named <code>Thermostat</code>:</p>\n<div class=\"language-js codeBlockContainer_Ckt0 theme-code-block\" style=\"--prism-color:#bfc7d5;--prism-background-color:#292d3e\"><div class=\"codeBlockContent_QJqH\"><pre tabindex=\"0\" class=\"prism-code language-js codeBlock_bY9V thin-scrollbar\" style=\"color:#bfc7d5;background-color:#292d3e\"><code class=\"codeBlockLines_e6Vv\"><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token keyword\" style=\"font-style:italic\">const</span><span class=\"token plain\"> stateObj </span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">=</span><span class=\"token plain\"> hass</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token property-access\">states</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">[</span><span class=\"token string\" style=\"color:rgb(195, 232, 141)\">\"sensor.living_room_thermostat_temperature\"</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">]</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">;</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\" style=\"display:inline-block\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">hass</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token method function property-access\" style=\"color:rgb(130, 170, 255)\">formatEntityName</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">  stateObj</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">  </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">[</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">{</span><span class=\"token plain\"> </span><span class=\"token literal-property property\">type</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">:</span><span class=\"token plain\"> </span><span class=\"token string\" style=\"color:rgb(195, 232, 141)\">\"device\"</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">}</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">{</span><span class=\"token plain\"> </span><span class=\"token literal-property property\">type</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">:</span><span class=\"token plain\"> </span><span class=\"token string\" style=\"color:rgb(195, 232, 141)\">\"entity\"</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">}</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">]</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">  </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">{</span><span class=\"token plain\"> </span><span class=\"token literal-property property\">separator</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">:</span><span class=\"token plain\"> </span><span class=\"token string\" style=\"color:rgb(195, 232, 141)\">\" · \"</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">}</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\"></span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">;</span><span class=\"token plain\"> </span><span class=\"token comment\" style=\"color:rgb(105, 112, 152);font-style:italic\">// \"Thermostat · Temperature\"</span><br></div></code></pre></div></div>\n<p>The frontend also ships an <code>entity_name</code> selector. If your card uses the <a class=\"\" href=\"https://developers.home-assistant.io/docs/frontend/custom-ui/custom-card#using-the-built-in-form-editor\">built-in form editor</a>, you can offer users the same name picker the built-in cards use — accepting either a free-form string or a composition of registry items.</p>\n<p>Take a look at the updated <a class=\"\" href=\"https://developers.home-assistant.io/docs/frontend/data#hassformatentitynamestateobj-name-options\">data documentation</a> for the full reference and more examples.</p>",
            "url": "https://developers.home-assistant.io/blog/2026/05/11/format-entity-name-helper",
            "title": "Format entity names in custom cards",
            "summary": "As of Home Assistant 2026.4, the hass object exposes a formatEntityName helper. It is the same function used by the built-in cards (tile card, entity rows, ...) to compute the display name of an entity from its registry context (entity, device, area, floor). Custom cards can use it to produce names that stay consistent with the rest of the dashboard.",
            "date_modified": "2026-05-11T00:00:00.000Z",
            "author": {
                "name": "Paul Bottein",
                "url": "https://github.com/piitaya"
            },
            "tags": []
        },
        {
            "id": "https://developers.home-assistant.io/blog/2026/05/11/mqtt-publish-api-changes",
            "content_html": "<p>In the future, the MQTT publish API will require explicit values for <code>qos</code> and <code>retain</code>. Passing <code>None</code> for either argument will no longer be supported.\nCustom integrations should update their code to accept the defaults, or pass valid typed arguments.\nThe fallbacks of <code>None</code> to a valid value for <code>qos</code> and <code>retain</code> will stop working with HA Core 2027.6.</p>\n<p>The new API signatures are:</p>\n<div class=\"language-python codeBlockContainer_Ckt0 theme-code-block\" style=\"--prism-color:#bfc7d5;--prism-background-color:#292d3e\"><div class=\"codeBlockContent_QJqH\"><pre tabindex=\"0\" class=\"prism-code language-python codeBlock_bY9V thin-scrollbar\" style=\"color:#bfc7d5;background-color:#292d3e\"><code class=\"codeBlockLines_e6Vv\"><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token keyword\" style=\"font-style:italic\">def</span><span class=\"token plain\"> </span><span class=\"token function\" style=\"color:rgb(130, 170, 255)\">publish</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">    hass</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">:</span><span class=\"token plain\"> HomeAssistant</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">    topic</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">:</span><span class=\"token plain\"> </span><span class=\"token builtin\" style=\"color:rgb(130, 170, 255)\">str</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">    payload</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">:</span><span class=\"token plain\"> PublishPayloadType</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">    qos</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">:</span><span class=\"token plain\"> </span><span class=\"token builtin\" style=\"color:rgb(130, 170, 255)\">int</span><span class=\"token plain\"> </span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">=</span><span class=\"token plain\"> </span><span class=\"token number\" style=\"color:rgb(247, 140, 108)\">0</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">    retain</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">:</span><span class=\"token plain\"> </span><span class=\"token builtin\" style=\"color:rgb(130, 170, 255)\">bool</span><span class=\"token plain\"> </span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">=</span><span class=\"token plain\"> </span><span class=\"token boolean\" style=\"color:rgb(255, 88, 116)\">False</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">    encoding</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">:</span><span class=\"token plain\"> </span><span class=\"token builtin\" style=\"color:rgb(130, 170, 255)\">str</span><span class=\"token plain\"> </span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">|</span><span class=\"token plain\"> </span><span class=\"token boolean\" style=\"color:rgb(255, 88, 116)\">None</span><span class=\"token plain\"> </span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">=</span><span class=\"token plain\"> DEFAULT_ENCODING</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\"></span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token plain\"> </span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">-</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">&gt;</span><span class=\"token plain\"> </span><span class=\"token boolean\" style=\"color:rgb(255, 88, 116)\">None</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">:</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">    </span><span class=\"token triple-quoted-string string\" style=\"color:rgb(195, 232, 141)\">\"\"\"Publish message to a MQTT topic.\"\"\"</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">    hass</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token plain\">create_task</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token plain\">async_publish</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token plain\">hass</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"> topic</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"> payload</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"> qos</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"> retain</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"> encoding</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><br></div></code></pre></div></div>\n<p>and</p>\n<div class=\"language-python codeBlockContainer_Ckt0 theme-code-block\" style=\"--prism-color:#bfc7d5;--prism-background-color:#292d3e\"><div class=\"codeBlockContent_QJqH\"><pre tabindex=\"0\" class=\"prism-code language-python codeBlock_bY9V thin-scrollbar\" style=\"color:#bfc7d5;background-color:#292d3e\"><code class=\"codeBlockLines_e6Vv\"><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token keyword\" style=\"font-style:italic\">async</span><span class=\"token plain\"> </span><span class=\"token keyword\" style=\"font-style:italic\">def</span><span class=\"token plain\"> </span><span class=\"token function\" style=\"color:rgb(130, 170, 255)\">async_publish</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">    hass</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">:</span><span class=\"token plain\"> HomeAssistant</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">    topic</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">:</span><span class=\"token plain\"> </span><span class=\"token builtin\" style=\"color:rgb(130, 170, 255)\">str</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">    payload</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">:</span><span class=\"token plain\"> PublishPayloadType</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">    qos</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">:</span><span class=\"token plain\"> </span><span class=\"token builtin\" style=\"color:rgb(130, 170, 255)\">int</span><span class=\"token plain\"> </span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">=</span><span class=\"token plain\"> </span><span class=\"token number\" style=\"color:rgb(247, 140, 108)\">0</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">    retain</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">:</span><span class=\"token plain\"> </span><span class=\"token builtin\" style=\"color:rgb(130, 170, 255)\">bool</span><span class=\"token plain\"> </span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">=</span><span class=\"token plain\"> </span><span class=\"token boolean\" style=\"color:rgb(255, 88, 116)\">False</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">    encoding</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">:</span><span class=\"token plain\"> </span><span class=\"token builtin\" style=\"color:rgb(130, 170, 255)\">str</span><span class=\"token plain\"> </span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">|</span><span class=\"token plain\"> </span><span class=\"token boolean\" style=\"color:rgb(255, 88, 116)\">None</span><span class=\"token plain\"> </span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">=</span><span class=\"token plain\"> DEFAULT_ENCODING</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\"></span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token plain\"> </span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">-</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">&gt;</span><span class=\"token plain\"> </span><span class=\"token boolean\" style=\"color:rgb(255, 88, 116)\">None</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">:</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">    </span><span class=\"token triple-quoted-string string\" style=\"color:rgb(195, 232, 141)\">\"\"\"Publish message to a MQTT topic.\"\"\"</span><br></div></code></pre></div></div>",
            "url": "https://developers.home-assistant.io/blog/2026/05/11/mqtt-publish-api-changes",
            "title": "MQTT publish API changes",
            "summary": "In the future, the MQTT publish API will require explicit values for qos and retain. Passing None for either argument will no longer be supported.",
            "date_modified": "2026-05-11T00:00:00.000Z",
            "author": {
                "name": "Jan Bouwhuis",
                "url": "https://github.com/jbouwh"
            },
            "tags": []
        },
        {
            "id": "https://developers.home-assistant.io/blog/2026/05/11/mqtt-publish-api-message-expiry-interval",
            "content_html": "<p>The MQTT publish API now supports setting a message expiry interval.\nPreviously, retained messages were stored by the broker until they were replaced or explicitly cleared. With a <code>message_expiry_interval</code> set (in seconds), a published message — including a retained one — will automatically expire after the specified interval.\nThis option is only supported when using MQTT protocol version 5; it is ignored when using earlier protocol versions.</p>\n<p>The new API signatures are:</p>\n<div class=\"language-python codeBlockContainer_Ckt0 theme-code-block\" style=\"--prism-color:#bfc7d5;--prism-background-color:#292d3e\"><div class=\"codeBlockContent_QJqH\"><pre tabindex=\"0\" class=\"prism-code language-python codeBlock_bY9V thin-scrollbar\" style=\"color:#bfc7d5;background-color:#292d3e\"><code class=\"codeBlockLines_e6Vv\"><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token keyword\" style=\"font-style:italic\">def</span><span class=\"token plain\"> </span><span class=\"token function\" style=\"color:rgb(130, 170, 255)\">publish</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">    hass</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">:</span><span class=\"token plain\"> HomeAssistant</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">    topic</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">:</span><span class=\"token plain\"> </span><span class=\"token builtin\" style=\"color:rgb(130, 170, 255)\">str</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">    payload</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">:</span><span class=\"token plain\"> PublishPayloadType</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">    qos</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">:</span><span class=\"token plain\"> </span><span class=\"token builtin\" style=\"color:rgb(130, 170, 255)\">int</span><span class=\"token plain\"> </span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">=</span><span class=\"token plain\"> </span><span class=\"token number\" style=\"color:rgb(247, 140, 108)\">0</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">    retain</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">:</span><span class=\"token plain\"> </span><span class=\"token builtin\" style=\"color:rgb(130, 170, 255)\">bool</span><span class=\"token plain\"> </span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">=</span><span class=\"token plain\"> </span><span class=\"token boolean\" style=\"color:rgb(255, 88, 116)\">False</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">    encoding</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">:</span><span class=\"token plain\"> </span><span class=\"token builtin\" style=\"color:rgb(130, 170, 255)\">str</span><span class=\"token plain\"> </span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">|</span><span class=\"token plain\"> </span><span class=\"token boolean\" style=\"color:rgb(255, 88, 116)\">None</span><span class=\"token plain\"> </span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">=</span><span class=\"token plain\"> DEFAULT_ENCODING</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">    </span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">*</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">    message_expiry_interval</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">:</span><span class=\"token plain\"> </span><span class=\"token builtin\" style=\"color:rgb(130, 170, 255)\">int</span><span class=\"token plain\"> </span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">|</span><span class=\"token plain\"> </span><span class=\"token boolean\" style=\"color:rgb(255, 88, 116)\">None</span><span class=\"token plain\"> </span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">=</span><span class=\"token plain\"> </span><span class=\"token boolean\" style=\"color:rgb(255, 88, 116)\">None</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\"></span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token plain\"> </span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">-</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">&gt;</span><span class=\"token plain\"> </span><span class=\"token boolean\" style=\"color:rgb(255, 88, 116)\">None</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">:</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">    </span><span class=\"token triple-quoted-string string\" style=\"color:rgb(195, 232, 141)\">\"\"\"Publish message to a MQTT topic.\"\"\"</span><br></div></code></pre></div></div>\n<p>and</p>\n<div class=\"language-python codeBlockContainer_Ckt0 theme-code-block\" style=\"--prism-color:#bfc7d5;--prism-background-color:#292d3e\"><div class=\"codeBlockContent_QJqH\"><pre tabindex=\"0\" class=\"prism-code language-python codeBlock_bY9V thin-scrollbar\" style=\"color:#bfc7d5;background-color:#292d3e\"><code class=\"codeBlockLines_e6Vv\"><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token keyword\" style=\"font-style:italic\">async</span><span class=\"token plain\"> </span><span class=\"token keyword\" style=\"font-style:italic\">def</span><span class=\"token plain\"> </span><span class=\"token function\" style=\"color:rgb(130, 170, 255)\">async_publish</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">    hass</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">:</span><span class=\"token plain\"> HomeAssistant</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">    topic</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">:</span><span class=\"token plain\"> </span><span class=\"token builtin\" style=\"color:rgb(130, 170, 255)\">str</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">    payload</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">:</span><span class=\"token plain\"> PublishPayloadType</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">    qos</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">:</span><span class=\"token plain\"> </span><span class=\"token builtin\" style=\"color:rgb(130, 170, 255)\">int</span><span class=\"token plain\"> </span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">=</span><span class=\"token plain\"> </span><span class=\"token number\" style=\"color:rgb(247, 140, 108)\">0</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">    retain</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">:</span><span class=\"token plain\"> </span><span class=\"token builtin\" style=\"color:rgb(130, 170, 255)\">bool</span><span class=\"token plain\"> </span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">=</span><span class=\"token plain\"> </span><span class=\"token boolean\" style=\"color:rgb(255, 88, 116)\">False</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">    encoding</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">:</span><span class=\"token plain\"> </span><span class=\"token builtin\" style=\"color:rgb(130, 170, 255)\">str</span><span class=\"token plain\"> </span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">|</span><span class=\"token plain\"> </span><span class=\"token boolean\" style=\"color:rgb(255, 88, 116)\">None</span><span class=\"token plain\"> </span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">=</span><span class=\"token plain\"> DEFAULT_ENCODING</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">    </span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">*</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">    message_expiry_interval</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">:</span><span class=\"token plain\"> </span><span class=\"token builtin\" style=\"color:rgb(130, 170, 255)\">int</span><span class=\"token plain\"> </span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">|</span><span class=\"token plain\"> </span><span class=\"token boolean\" style=\"color:rgb(255, 88, 116)\">None</span><span class=\"token plain\"> </span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">=</span><span class=\"token plain\"> </span><span class=\"token boolean\" style=\"color:rgb(255, 88, 116)\">None</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\"></span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token plain\"> </span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">-</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">&gt;</span><span class=\"token plain\"> </span><span class=\"token boolean\" style=\"color:rgb(255, 88, 116)\">None</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">:</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">    </span><span class=\"token triple-quoted-string string\" style=\"color:rgb(195, 232, 141)\">\"\"\"Publish message to a MQTT topic.\"\"\"</span><br></div></code></pre></div></div>",
            "url": "https://developers.home-assistant.io/blog/2026/05/11/mqtt-publish-api-message-expiry-interval",
            "title": "MQTT publish API supports message expiry interval",
            "summary": "The MQTT publish API now supports setting a message expiry interval.",
            "date_modified": "2026-05-11T00:00:00.000Z",
            "author": {
                "name": "Jan Bouwhuis",
                "url": "https://github.com/jbouwh"
            },
            "tags": []
        },
        {
            "id": "https://developers.home-assistant.io/blog/2026/05/07/config-entry-listener-together-with-reloading-methods",
            "content_html": "<p>As of Home Assistant Core 2026.6, using a config entry listener together with any reloading methods in a config flow is deprecated and will result in an error from 2026.12.</p>\n<h2 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"background\">Background<a href=\"https://developers.home-assistant.io/blog/2026/05/07/config-entry-listener-together-with-reloading-methods#background\" class=\"hash-link\" aria-label=\"Direct link to Background\" title=\"Direct link to Background\" translate=\"no\">​</a></h2>\n<p>Using a config entry listener together with any reloading methods in a config flow can cause the integration to reload twice and/or create a race condition.</p>\n<h2 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"possible-solutions\">Possible solutions<a href=\"https://developers.home-assistant.io/blog/2026/05/07/config-entry-listener-together-with-reloading-methods#possible-solutions\" class=\"hash-link\" aria-label=\"Direct link to Possible solutions\" title=\"Direct link to Possible solutions\" translate=\"no\">​</a></h2>\n<ul>\n<li class=\"\">Remove the config entry listener and rely only on the reloading methods in your config flow.</li>\n<li class=\"\">Use <code>async_update_and_abort()</code> instead of <code>async_update_reload_and_abort()</code>.</li>\n<li class=\"\">Set <code>reload_on_update=False</code> when calling <code>_abort_if_unique_id_configured()</code>.</li>\n</ul>\n<p>More details can be found in the <a href=\"https://github.com/home-assistant/core/pull/169198\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"\">core PR</a>.</p>",
            "url": "https://developers.home-assistant.io/blog/2026/05/07/config-entry-listener-together-with-reloading-methods",
            "title": "Deprecating config entry listener with reloading methods in config flow",
            "summary": "As of Home Assistant Core 2026.6, using a config entry listener together with any reloading methods in a config flow is deprecated and will result in an error from 2026.12.",
            "date_modified": "2026-05-07T00:00:00.000Z",
            "author": {
                "name": "G Johansson",
                "url": "https://github.com/gjohansson-ST"
            },
            "tags": []
        },
        {
            "id": "https://developers.home-assistant.io/blog/2026/05/04/frontend-component-updates-2026.5",
            "content_html": "<h2 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"component-updates\">Component updates<a href=\"https://developers.home-assistant.io/blog/2026/05/04/frontend-component-updates-2026.5#component-updates\" class=\"hash-link\" aria-label=\"Direct link to Component updates\" title=\"Direct link to Component updates\" translate=\"no\">​</a></h2>\n<h3 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"ha-progress-bar\">ha-progress-bar<a href=\"https://developers.home-assistant.io/blog/2026/05/04/frontend-component-updates-2026.5#ha-progress-bar\" class=\"hash-link\" aria-label=\"Direct link to ha-progress-bar\" title=\"Direct link to ha-progress-bar\" translate=\"no\">​</a></h3>\n<p>A new component replaces <code>mwc-progress-bar</code> in our codebase and is fully themeable. Check out this <a href=\"https://github.com/home-assistant/frontend/pull/51489\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"\">PR</a> for a fully custom progress bar.</p>\n<p>New component specific tokens:</p>\n<div class=\"language-css codeBlockContainer_Ckt0 theme-code-block\" style=\"--prism-color:#bfc7d5;--prism-background-color:#292d3e\"><div class=\"codeBlockContent_QJqH\"><pre tabindex=\"0\" class=\"prism-code language-css codeBlock_bY9V thin-scrollbar\" style=\"color:#bfc7d5;background-color:#292d3e\"><code class=\"codeBlockLines_e6Vv\"><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token variable\" style=\"color:rgb(191, 199, 213)\">--ha-progress-bar-indicator-color</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\"></span><span class=\"token variable\" style=\"color:rgb(191, 199, 213)\">--ha-progress-bar-indicator-background</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\"></span><span class=\"token variable\" style=\"color:rgb(191, 199, 213)\">--ha-progress-bar-track-color</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\"></span><span class=\"token variable\" style=\"color:rgb(191, 199, 213)\">--ha-progress-bar-track-height</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\"></span><span class=\"token variable\" style=\"color:rgb(191, 199, 213)\">--ha-progress-bar-border-radius</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\"></span><span class=\"token variable\" style=\"color:rgb(191, 199, 213)\">--ha-progress-bar-animation-duration</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\"></span><span class=\"token variable\" style=\"color:rgb(191, 199, 213)\">--ha-progress-bar-indicator-highlight-image</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\"></span><span class=\"token variable\" style=\"color:rgb(191, 199, 213)\">--ha-progress-bar-indicator-highlight-width</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\"></span><span class=\"token variable\" style=\"color:rgb(191, 199, 213)\">--ha-progress-bar-indicator-highlight-height</span><br></div></code></pre></div></div>\n<h3 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"ha-switch\">ha-switch<a href=\"https://developers.home-assistant.io/blog/2026/05/04/frontend-component-updates-2026.5#ha-switch\" class=\"hash-link\" aria-label=\"Direct link to ha-switch\" title=\"Direct link to ha-switch\" translate=\"no\">​</a></h3>\n<p><code>ha-switch</code> was migrated to webawesome. It now has many CSS properties to make customization easier. We also removed some tokens from the old switch:</p>\n<p>Removed tokens:</p>\n<div class=\"language-css codeBlockContainer_Ckt0 theme-code-block\" style=\"--prism-color:#bfc7d5;--prism-background-color:#292d3e\"><div class=\"codeBlockContent_QJqH\"><pre tabindex=\"0\" class=\"prism-code language-css codeBlock_bY9V thin-scrollbar\" style=\"color:#bfc7d5;background-color:#292d3e\"><code class=\"codeBlockLines_e6Vv\"><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token variable\" style=\"color:rgb(191, 199, 213)\">--switch-unchecked-button-color</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\"></span><span class=\"token variable\" style=\"color:rgb(191, 199, 213)\">--switch-unchecked-track-color</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\"></span><span class=\"token variable\" style=\"color:rgb(191, 199, 213)\">--switch-unchecked-color</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\"></span><span class=\"token variable\" style=\"color:rgb(191, 199, 213)\">--switch-checked-button-color</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\"></span><span class=\"token variable\" style=\"color:rgb(191, 199, 213)\">--switch-checked-track-color</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\"></span><span class=\"token variable\" style=\"color:rgb(191, 199, 213)\">--switch-checked-color</span><br></div></code></pre></div></div>\n<p>New component specific tokens:</p>\n<div class=\"language-css codeBlockContainer_Ckt0 theme-code-block\" style=\"--prism-color:#bfc7d5;--prism-background-color:#292d3e\"><div class=\"codeBlockContent_QJqH\"><pre tabindex=\"0\" class=\"prism-code language-css codeBlock_bY9V thin-scrollbar\" style=\"color:#bfc7d5;background-color:#292d3e\"><code class=\"codeBlockLines_e6Vv\"><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token variable\" style=\"color:rgb(191, 199, 213)\">--ha-switch-size</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\"></span><span class=\"token variable\" style=\"color:rgb(191, 199, 213)\">--ha-switch-thumb-size</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\"></span><span class=\"token variable\" style=\"color:rgb(191, 199, 213)\">--ha-switch-width</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\"></span><span class=\"token variable\" style=\"color:rgb(191, 199, 213)\">--ha-switch-background-color</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\"></span><span class=\"token variable\" style=\"color:rgb(191, 199, 213)\">--ha-switch-thumb-background-color</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\"></span><span class=\"token variable\" style=\"color:rgb(191, 199, 213)\">--ha-switch-background-color-hover</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\"></span><span class=\"token variable\" style=\"color:rgb(191, 199, 213)\">--ha-switch-thumb-background-color-hover</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\"></span><span class=\"token variable\" style=\"color:rgb(191, 199, 213)\">--ha-switch-checked-background-color</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\"></span><span class=\"token variable\" style=\"color:rgb(191, 199, 213)\">--ha-switch-checked-thumb-background-color</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\"></span><span class=\"token variable\" style=\"color:rgb(191, 199, 213)\">--ha-switch-checked-background-color-hover</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\"></span><span class=\"token variable\" style=\"color:rgb(191, 199, 213)\">--ha-switch-checked-thumb-background-color-hover</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\"></span><span class=\"token variable\" style=\"color:rgb(191, 199, 213)\">--ha-switch-border-color</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\"></span><span class=\"token variable\" style=\"color:rgb(191, 199, 213)\">--ha-switch-thumb-border-color</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\"></span><span class=\"token variable\" style=\"color:rgb(191, 199, 213)\">--ha-switch-thumb-border-color-hover</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\"></span><span class=\"token variable\" style=\"color:rgb(191, 199, 213)\">--ha-switch-checked-border-color</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\"></span><span class=\"token variable\" style=\"color:rgb(191, 199, 213)\">--ha-switch-checked-thumb-border-color</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\"></span><span class=\"token variable\" style=\"color:rgb(191, 199, 213)\">--ha-switch-checked-border-color-hover</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\"></span><span class=\"token variable\" style=\"color:rgb(191, 199, 213)\">--ha-switch-checked-thumb-border-color-hover</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\"></span><span class=\"token variable\" style=\"color:rgb(191, 199, 213)\">--ha-switch-thumb-box-shadow</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\"></span><span class=\"token variable\" style=\"color:rgb(191, 199, 213)\">--ha-switch-disabled-opacity</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\"></span><span class=\"token variable\" style=\"color:rgb(191, 199, 213)\">--ha-switch-required-marker</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\"></span><span class=\"token variable\" style=\"color:rgb(191, 199, 213)\">--ha-switch-required-marker-offset</span><br></div></code></pre></div></div>\n<h3 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"ha-checkbox\">ha-checkbox<a href=\"https://developers.home-assistant.io/blog/2026/05/04/frontend-component-updates-2026.5#ha-checkbox\" class=\"hash-link\" aria-label=\"Direct link to ha-checkbox\" title=\"Direct link to ha-checkbox\" translate=\"no\">​</a></h3>\n<p><code>ha-checkbox</code> was also migrated to webawesome and got new CSS properties. You can no longer use MDC tokens for it, but we added a set of tokens to customize the new checkbox.</p>\n<p>New component specific tokens:</p>\n<div class=\"language-css codeBlockContainer_Ckt0 theme-code-block\" style=\"--prism-color:#bfc7d5;--prism-background-color:#292d3e\"><div class=\"codeBlockContent_QJqH\"><pre tabindex=\"0\" class=\"prism-code language-css codeBlock_bY9V thin-scrollbar\" style=\"color:#bfc7d5;background-color:#292d3e\"><code class=\"codeBlockLines_e6Vv\"><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token variable\" style=\"color:rgb(191, 199, 213)\">--ha-checkbox-size</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\"></span><span class=\"token variable\" style=\"color:rgb(191, 199, 213)\">--ha-checkbox-border-color</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\"></span><span class=\"token variable\" style=\"color:rgb(191, 199, 213)\">--ha-checkbox-border-color-hover</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\"></span><span class=\"token variable\" style=\"color:rgb(191, 199, 213)\">--ha-checkbox-background-color</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\"></span><span class=\"token variable\" style=\"color:rgb(191, 199, 213)\">--ha-checkbox-background-color-hover</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\"></span><span class=\"token variable\" style=\"color:rgb(191, 199, 213)\">--ha-checkbox-checked-background-color</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\"></span><span class=\"token variable\" style=\"color:rgb(191, 199, 213)\">--ha-checkbox-checked-background-color-hover</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\"></span><span class=\"token variable\" style=\"color:rgb(191, 199, 213)\">--ha-checkbox-checked-icon-color</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\"></span><span class=\"token variable\" style=\"color:rgb(191, 199, 213)\">--ha-checkbox-checked-icon-scale</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\"></span><span class=\"token variable\" style=\"color:rgb(191, 199, 213)\">--ha-checkbox-border-radius</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\"></span><span class=\"token variable\" style=\"color:rgb(191, 199, 213)\">--ha-checkbox-border-width</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\"></span><span class=\"token variable\" style=\"color:rgb(191, 199, 213)\">--ha-checkbox-required-marker</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\"></span><span class=\"token variable\" style=\"color:rgb(191, 199, 213)\">--ha-checkbox-required-marker-offset</span><br></div></code></pre></div></div>\n<h3 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"ha-textarea\">ha-textarea<a href=\"https://developers.home-assistant.io/blog/2026/05/04/frontend-component-updates-2026.5#ha-textarea\" class=\"hash-link\" aria-label=\"Direct link to ha-textarea\" title=\"Direct link to ha-textarea\" translate=\"no\">​</a></h3>\n<p><code>ha-textarea</code> was migrated to webawesome and got new CSS properties. You can no longer use MDC tokens for it, but we added a set of tokens to customize the new textarea.</p>\n<p>The API changed slightly. To make your textarea grow in size, set the <code>resize</code> prop to <code>auto</code>.</p>\n<h3 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"ha-adaptive-popover\">ha-adaptive-popover<a href=\"https://developers.home-assistant.io/blog/2026/05/04/frontend-component-updates-2026.5#ha-adaptive-popover\" class=\"hash-link\" aria-label=\"Direct link to ha-adaptive-popover\" title=\"Direct link to ha-adaptive-popover\" translate=\"no\">​</a></h3>\n<p>You might already know the (fairly new) <code>ha-adaptive-dialog</code> component. It combines a dialog and bottom sheet by showing a dialog on desktop and a bottom sheet on mobile.\nWe added <code>ha-adaptive-popover</code> as the popover counterpart to the adaptive dialog. It shows a popover on desktop and a bottom sheet on mobile. It is based on <code>ha-adaptive-dialog</code> and is currently used in the tile card date picker feature.</p>\n<h3 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"removed-ha-fab\">Removed ha-fab<a href=\"https://developers.home-assistant.io/blog/2026/05/04/frontend-component-updates-2026.5#removed-ha-fab\" class=\"hash-link\" aria-label=\"Direct link to Removed ha-fab\" title=\"Direct link to Removed ha-fab\" translate=\"no\">​</a></h3>\n<p><code>ha-fab</code> was removed, we use just a normal <code>ha-button</code> now, since the position styling was always done from the parent component.</p>\n<h2 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"style-updates\">Style updates<a href=\"https://developers.home-assistant.io/blog/2026/05/04/frontend-component-updates-2026.5#style-updates\" class=\"hash-link\" aria-label=\"Direct link to Style updates\" title=\"Direct link to Style updates\" translate=\"no\">​</a></h2>\n<h3 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"box-shadow-tokens\">Box shadow tokens<a href=\"https://developers.home-assistant.io/blog/2026/05/04/frontend-component-updates-2026.5#box-shadow-tokens\" class=\"hash-link\" aria-label=\"Direct link to Box shadow tokens\" title=\"Direct link to Box shadow tokens\" translate=\"no\">​</a></h3>\n<p>We added new global box shadow tokens: <code>--ha-box-shadow-s</code>, <code>--ha-box-shadow-m</code>, <code>--ha-box-shadow-l</code></p>\n<p>But we also removed the old box shadow tokens:</p>\n<div class=\"language-css codeBlockContainer_Ckt0 theme-code-block\" style=\"--prism-color:#bfc7d5;--prism-background-color:#292d3e\"><div class=\"codeBlockContent_QJqH\"><pre tabindex=\"0\" class=\"prism-code language-css codeBlock_bY9V thin-scrollbar\" style=\"color:#bfc7d5;background-color:#292d3e\"><code class=\"codeBlockLines_e6Vv\"><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token variable\" style=\"color:rgb(191, 199, 213)\">--ha-color-shadow-light</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\"></span><span class=\"token variable\" style=\"color:rgb(191, 199, 213)\">--ha-color-shadow-dark</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\"></span><span class=\"token variable\" style=\"color:rgb(191, 199, 213)\">--ha-shadow-offset-x-</span><span class=\"token plain\">...</span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\"></span><span class=\"token variable\" style=\"color:rgb(191, 199, 213)\">--ha-shadow-blur-</span><span class=\"token plain\">...</span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\"></span><span class=\"token variable\" style=\"color:rgb(191, 199, 213)\">--ha-shadow-spread-</span><span class=\"token plain\">..</span><br></div></code></pre></div></div>\n<h3 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"surface-colors\">Surface colors<a href=\"https://developers.home-assistant.io/blog/2026/05/04/frontend-component-updates-2026.5#surface-colors\" class=\"hash-link\" aria-label=\"Direct link to Surface colors\" title=\"Direct link to Surface colors\" translate=\"no\">​</a></h3>\n<p>In the next release we plan to change the way we handle surface background colors. The tokens are introduced now but are just used for ha-tooltip.</p>\n<p>New tokens:</p>\n<div class=\"language-css codeBlockContainer_Ckt0 theme-code-block\" style=\"--prism-color:#bfc7d5;--prism-background-color:#292d3e\"><div class=\"codeBlockContent_QJqH\"><pre tabindex=\"0\" class=\"prism-code language-css codeBlock_bY9V thin-scrollbar\" style=\"color:#bfc7d5;background-color:#292d3e\"><code class=\"codeBlockLines_e6Vv\"><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token variable\" style=\"color:rgb(191, 199, 213)\">--ha-color-surface-default</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\"></span><span class=\"token variable\" style=\"color:rgb(191, 199, 213)\">--ha-color-surface-low</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\"></span><span class=\"token variable\" style=\"color:rgb(191, 199, 213)\">--ha-color-surface-lower</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\"></span><span class=\"token variable\" style=\"color:rgb(191, 199, 213)\">--ha-color-surface-default-inverted</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\"></span><span class=\"token variable\" style=\"color:rgb(191, 199, 213)\">--ha-color-surface-low-inverted</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\"></span><span class=\"token variable\" style=\"color:rgb(191, 199, 213)\">--ha-color-surface-lower-inverted</span><br></div></code></pre></div></div>",
            "url": "https://developers.home-assistant.io/blog/2026/05/04/frontend-component-updates-2026.5",
            "title": "Frontend component updates in 2026.5",
            "summary": "Component updates",
            "date_modified": "2026-05-04T00:00:00.000Z",
            "author": {
                "name": "Wendelin Peleska",
                "url": "https://github.com/wendevlin"
            },
            "tags": []
        },
        {
            "id": "https://developers.home-assistant.io/blog/2026/05/04/frontend-context-groups-decorators",
            "content_html": "<p>Last release we introduced the lazy context and we wanted to use hass context and lazy context more in favor of passing the hass object.\nWe found that small tasks often required subscribing to many contexts, so we grouped Hass contexts into logical groups.</p>\n<h2 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"context-groups\">Context groups<a href=\"https://developers.home-assistant.io/blog/2026/05/04/frontend-context-groups-decorators#context-groups\" class=\"hash-link\" aria-label=\"Direct link to Context groups\" title=\"Direct link to Context groups\" translate=\"no\">​</a></h2>\n<p>Following context groups have been added:</p>\n<ul>\n<li class=\"\">registriesContext: contains all registries (device, entity, area, etc)</li>\n<li class=\"\">internationalizationContext: contains all internationalization related data (locale, localize, etc)</li>\n<li class=\"\">apiContext: contains all API related methods (callService, callWS, etc)</li>\n<li class=\"\">connectionContext: contains all connection related data (connection, connected, hassUrl, etc)</li>\n<li class=\"\">uiContext: contains all UI related data (themes, panels, dockedSidebar, etc)</li>\n<li class=\"\">configContext: contains all config related data (auth, config, user, etc)</li>\n</ul>\n<h2 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"consume-context-entry-decorators\">Consume context entry decorators<a href=\"https://developers.home-assistant.io/blog/2026/05/04/frontend-context-groups-decorators#consume-context-entry-decorators\" class=\"hash-link\" aria-label=\"Direct link to Consume context entry decorators\" title=\"Direct link to Consume context entry decorators\" translate=\"no\">​</a></h2>\n<p>In the last <a class=\"\" href=\"https://developers.home-assistant.io/blog/2026/03/25/frontend-lazy-context\">blogpost</a> I showed how to use context with <code>@transform</code>. <code>@transform</code> is powerful, but sometimes you only need a single context entry and do not want to define a transform function.\nTo support that, we added decorators that consume a single context entry directly.\nYou pass an array that defines where the entity ID comes from (usually a config property), and the decorator consumes the correct context and maps the entity ID to the correct registry entry.\nIt also watches the defined path and updates the entry when needed.</p>\n<p>New decorators:</p>\n<ul>\n<li class=\"\">@consumeEntityState</li>\n<li class=\"\">@consumeEntityStates</li>\n<li class=\"\">@consumeEntityRegistryEntry</li>\n</ul>\n<p>sample usage:</p>\n<div class=\"language-ts codeBlockContainer_Ckt0 theme-code-block\" style=\"--prism-color:#bfc7d5;--prism-background-color:#292d3e\"><div class=\"codeBlockContent_QJqH\"><pre tabindex=\"0\" class=\"prism-code language-ts codeBlock_bY9V thin-scrollbar\" style=\"color:#bfc7d5;background-color:#292d3e\"><code class=\"codeBlockLines_e6Vv\"><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token decorator at operator\" style=\"color:rgb(137, 221, 255)\">@</span><span class=\"token decorator function\" style=\"color:rgb(130, 170, 255)\">state</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\"></span><span class=\"token decorator at operator\" style=\"color:rgb(137, 221, 255)\">@</span><span class=\"token decorator function\" style=\"color:rgb(130, 170, 255)\">consumeEntityRegistryEntry</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">{</span><span class=\"token plain\"> entityIdPath</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">:</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">[</span><span class=\"token string\" style=\"color:rgb(195, 232, 141)\">\"_config\"</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"> </span><span class=\"token string\" style=\"color:rgb(195, 232, 141)\">\"entity\"</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">]</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">}</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">_entity</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">?</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">:</span><span class=\"token plain\"> EntityRegistryDisplayEntry</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">;</span><br></div></code></pre></div></div>\n<p>We may add more of these decorators in the future, e.g. for areas, devices, etc.</p>\n<h2 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"deprecate-contexts\">Deprecate contexts<a href=\"https://developers.home-assistant.io/blog/2026/05/04/frontend-context-groups-decorators#deprecate-contexts\" class=\"hash-link\" aria-label=\"Direct link to Deprecate contexts\" title=\"Direct link to Deprecate contexts\" translate=\"no\">​</a></h2>\n<p>These contexts are still available, but they can be removed in a future release. Use the new context groups instead.</p>\n<ul>\n<li class=\"\">connectionSingleContext</li>\n<li class=\"\">localizeContext</li>\n<li class=\"\">localeContext</li>\n<li class=\"\">configSingleContext</li>\n<li class=\"\">themesContext</li>\n<li class=\"\">selectedThemeContext</li>\n<li class=\"\">userContext</li>\n<li class=\"\">userDataContext</li>\n<li class=\"\">panelsContext</li>\n<li class=\"\">authContext</li>\n</ul>",
            "url": "https://developers.home-assistant.io/blog/2026/05/04/frontend-context-groups-decorators",
            "title": "Frontend context groups, new context decorators and deprecated contexts",
            "summary": "Last release we introduced the lazy context and we wanted to use hass context and lazy context more in favor of passing the hass object.",
            "date_modified": "2026-05-04T00:00:00.000Z",
            "author": {
                "name": "Wendelin Peleska",
                "url": "https://github.com/wendevlin"
            },
            "tags": []
        },
        {
            "id": "https://developers.home-assistant.io/blog/2026/04/27/pyserial-to-serialx",
            "content_html": "<p>Existing integrations and libraries communicating with serial ports should migrate from <code>pyserial</code>, <code>pyserial-asyncio</code>, and <code>pyserial-asyncio-fast</code> to <a href=\"https://github.com/puddly/serialx\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"\"><code>serialx</code></a>. This new library features native asyncio support on all platforms and will allow your integrations and libraries to take advantage of <a href=\"https://esphome.io/components/serial_proxy/\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"\">ESPHome serial proxies</a> in Home Assistant, and includes critical fixes for asyncio event loop stability.</p>\n<h2 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"background\">Background<a href=\"https://developers.home-assistant.io/blog/2026/04/27/pyserial-to-serialx#background\" class=\"hash-link\" aria-label=\"Direct link to Background\" title=\"Direct link to Background\" translate=\"no\">​</a></h2>\n<p><code>pyserial</code> has been the de facto serial library in Python for many years and has broad support for all popular platforms. Its API, however, predates asyncio in Python and is sync-only. The <code>pyserial-asyncio</code> package was eventually released to bridge <code>pyserial</code> with asyncio. Unfortunately, <code>pyserial-asyncio</code> development never reached 1.0 stability or cross-platform support, and neither <code>pyserial</code> nor <code>pyserial-asyncio</code> have had PyPI releases in almost five years. We forked <code>pyserial-asyncio</code> and released <a href=\"https://developers.home-assistant.io/blog/2026/01/05/pyserial-asyncio-fast/\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"\"><code>pyserial-asyncio-fast</code></a> to fix outstanding issues affecting Core event loop stability.</p>\n<p>We developed <code>serialx</code> from the ground up as a modern Python serial library with native sync and async APIs. It is import-compatible with the <code>serial</code>, <code>serial_asyncio</code>, and <code>serial_asyncio_fast</code> modules and allows existing packages to migrate with very minimal changes, if any.</p>\n<h2 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"migration\">Migration<a href=\"https://developers.home-assistant.io/blog/2026/04/27/pyserial-to-serialx#migration\" class=\"hash-link\" aria-label=\"Direct link to Migration\" title=\"Direct link to Migration\" translate=\"no\">​</a></h2>\n<p>The <code>serialx</code> documentation has <a href=\"https://puddly.github.io/serialx/how-to/pyserial-migration.html\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"\">an extensive migration guide</a> that goes into more detail.</p>\n<p>Most packages just need to replace <code>pyserial</code>, <code>pyserial-asyncio</code>, and <code>pyserial-asyncio-fast</code> with <code>serialx</code> in their <code>setup.py</code> or <code>pyproject.toml</code> file and update exception handling to replace broad catching of <code>SerialException</code> with more granular error handling (such as <code>OSError</code> and <code>TimeoutError</code>).</p>\n<p>Packages directly constructing a sync <code>serial.Serial()</code> object should migrate to using the <code>serialx.serial_for_url()</code> helper to ensure automatic compatibility with all supported protocols.</p>\n<h3 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"prompt-for-your-agent\">Prompt for your agent<a href=\"https://developers.home-assistant.io/blog/2026/04/27/pyserial-to-serialx#prompt-for-your-agent\" class=\"hash-link\" aria-label=\"Direct link to Prompt for your agent\" title=\"Direct link to Prompt for your agent\" translate=\"no\">​</a></h3>\n<p>The migration itself is mechanical, paste the following instructions into your agent of choice:</p>\n<blockquote>\n<p>Migrate my code from pyserial, pyserial-asyncio, and pyserial-asyncio-fast to serialx using\n<a href=\"https://raw.githubusercontent.com/puddly/serialx/refs/heads/dev/docs/how-to/pyserial-migration.md\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"\">https://raw.githubusercontent.com/puddly/serialx/refs/heads/dev/docs/how-to/pyserial-migration.md</a></p>\n</blockquote>",
            "url": "https://developers.home-assistant.io/blog/2026/04/27/pyserial-to-serialx",
            "title": "Serious about serial: migrating from pyserial to serialx",
            "summary": "Existing integrations and libraries communicating with serial ports should migrate from pyserial, pyserial-asyncio, and pyserial-asyncio-fast to serialx. This new library features native asyncio support on all platforms and will allow your integrations and libraries to take advantage of ESPHome serial proxies in Home Assistant, and includes critical fixes for asyncio event loop stability.",
            "date_modified": "2026-04-27T00:00:00.000Z",
            "author": {
                "name": "Nikita Nikishin",
                "url": "https://github.com/puddly"
            },
            "tags": []
        },
        {
            "id": "https://developers.home-assistant.io/blog/2026/04/24/radio-frequency-entity-platform",
            "content_html": "<p>Home Assistant now has a <code>radio_frequency</code> entity platform that decouples RF transceiver hardware from the devices it controls. Instead of each device integration talking directly to specific RF hardware, transmitter integrations (like <code>esphome</code>) expose <code>RadioFrequencyTransmitterEntity</code> instances, and device integrations send commands through them via helper functions.</p>\n<p>This mirrors the <a class=\"\" href=\"https://developers.home-assistant.io/blog/2026/03/30/infrared-entity-platform\"><code>infrared</code> entity platform</a> and was approved in <a href=\"https://github.com/home-assistant/architecture/discussions/1365\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"\">architecture discussion #1365</a>.</p>\n<h2 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"architecture\">Architecture<a href=\"https://developers.home-assistant.io/blog/2026/04/24/radio-frequency-entity-platform#architecture\" class=\"hash-link\" aria-label=\"Direct link to Architecture\" title=\"Direct link to Architecture\" translate=\"no\">​</a></h2>\n<p>The <code>radio_frequency</code> domain sits between two types of integrations:</p>\n<ul>\n<li class=\"\"><strong>Transmitter integrations</strong> (ESPHome, Broadlink, …) implement the <code>RadioFrequencyTransmitterEntity</code> base class to provide hardware-specific RF transmission.</li>\n<li class=\"\"><strong>Consumer integrations</strong> (garage door openers, RF remotes, wireless switches, …) use helper functions to send device-specific RF commands through available transmitters.</li>\n</ul>\n<p>Users select which transmitter to use during the consumer integration's config flow, filtered by the frequency the device operates on.</p>\n<h2 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"implementing-a-transmitter-integration\">Implementing a transmitter integration<a href=\"https://developers.home-assistant.io/blog/2026/04/24/radio-frequency-entity-platform#implementing-a-transmitter-integration\" class=\"hash-link\" aria-label=\"Direct link to Implementing a transmitter integration\" title=\"Direct link to Implementing a transmitter integration\" translate=\"no\">​</a></h2>\n<p>Transmitter integrations provide the <code>radio_frequency</code> platform by subclassing <code>RadioFrequencyTransmitterEntity</code>, declaring their <code>supported_frequency_ranges</code>, and implementing <code>async_send_command</code>:</p>\n<div class=\"language-python codeBlockContainer_Ckt0 theme-code-block\" style=\"--prism-color:#bfc7d5;--prism-background-color:#292d3e\"><div class=\"codeBlockContent_QJqH\"><pre tabindex=\"0\" class=\"prism-code language-python codeBlock_bY9V thin-scrollbar\" style=\"color:#bfc7d5;background-color:#292d3e\"><code class=\"codeBlockLines_e6Vv\"><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token keyword\" style=\"font-style:italic\">from</span><span class=\"token plain\"> rf_protocols </span><span class=\"token keyword\" style=\"font-style:italic\">import</span><span class=\"token plain\"> RadioFrequencyCommand</span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\"></span><span class=\"token keyword\" style=\"font-style:italic\">from</span><span class=\"token plain\"> homeassistant</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token plain\">components</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token plain\">radio_frequency </span><span class=\"token keyword\" style=\"font-style:italic\">import</span><span class=\"token plain\"> RadioFrequencyTransmitterEntity</span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\" style=\"display:inline-block\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\"></span><span class=\"token keyword\" style=\"font-style:italic\">class</span><span class=\"token plain\"> </span><span class=\"token class-name\" style=\"color:rgb(255, 203, 107)\">MyRadioFrequencyTransmitterEntity</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token plain\">RadioFrequencyTransmitterEntity</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">:</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">    </span><span class=\"token triple-quoted-string string\" style=\"color:rgb(195, 232, 141)\">\"\"\"My RF transmitter.\"\"\"</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\" style=\"display:inline-block\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">    </span><span class=\"token decorator annotation punctuation\" style=\"color:rgb(199, 146, 234)\">@property</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">    </span><span class=\"token keyword\" style=\"font-style:italic\">def</span><span class=\"token plain\"> </span><span class=\"token function\" style=\"color:rgb(130, 170, 255)\">supported_frequency_ranges</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token plain\">self</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token plain\"> </span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">-</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">&gt;</span><span class=\"token plain\"> </span><span class=\"token builtin\" style=\"color:rgb(130, 170, 255)\">list</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">[</span><span class=\"token builtin\" style=\"color:rgb(130, 170, 255)\">tuple</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">[</span><span class=\"token builtin\" style=\"color:rgb(130, 170, 255)\">int</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"> </span><span class=\"token builtin\" style=\"color:rgb(130, 170, 255)\">int</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">]</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">]</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">:</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">        </span><span class=\"token triple-quoted-string string\" style=\"color:rgb(195, 232, 141)\">\"\"\"Return the list of (min_hz, max_hz) ranges this hardware can transmit on.\"\"\"</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">        </span><span class=\"token keyword\" style=\"font-style:italic\">return</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">[</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token number\" style=\"color:rgb(247, 140, 108)\">300_000_000</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"> </span><span class=\"token number\" style=\"color:rgb(247, 140, 108)\">348_000_000</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token number\" style=\"color:rgb(247, 140, 108)\">433_050_000</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"> </span><span class=\"token number\" style=\"color:rgb(247, 140, 108)\">434_790_000</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">]</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\" style=\"display:inline-block\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">    </span><span class=\"token keyword\" style=\"font-style:italic\">async</span><span class=\"token plain\"> </span><span class=\"token keyword\" style=\"font-style:italic\">def</span><span class=\"token plain\"> </span><span class=\"token function\" style=\"color:rgb(130, 170, 255)\">async_send_command</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token plain\">self</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"> command</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">:</span><span class=\"token plain\"> RadioFrequencyCommand</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token plain\"> </span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">-</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">&gt;</span><span class=\"token plain\"> </span><span class=\"token boolean\" style=\"color:rgb(255, 88, 116)\">None</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">:</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">        </span><span class=\"token triple-quoted-string string\" style=\"color:rgb(195, 232, 141)\">\"\"\"Send an RF command.\"\"\"</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">        </span><span class=\"token keyword\" style=\"font-style:italic\">await</span><span class=\"token plain\"> self</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token plain\">_device</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token plain\">transmit</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">            frequency</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">=</span><span class=\"token plain\">command</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token plain\">frequency</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">            modulation</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">=</span><span class=\"token plain\">command</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token plain\">modulation</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">            timings</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">=</span><span class=\"token plain\">command</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token plain\">get_raw_timings</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">        </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><br></div></code></pre></div></div>\n<p>The base class tracks the timestamp of the last sent command as the entity state, so transmitter integrations only need to handle the actual transmission.</p>\n<h2 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"building-a-consumer-integration\">Building a consumer integration<a href=\"https://developers.home-assistant.io/blog/2026/04/24/radio-frequency-entity-platform#building-a-consumer-integration\" class=\"hash-link\" aria-label=\"Direct link to Building a consumer integration\" title=\"Direct link to Building a consumer integration\" translate=\"no\">​</a></h2>\n<p>Consumer integrations control RF devices by sending commands through a transmitter entity. They don't interact with RF hardware directly. The snippets below are adapted from the <a href=\"https://github.com/home-assistant/core/pull/168450\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"\"><code>honeywell_string_lights</code></a> integration, which uses the platform to drive a Honeywell String Lights set.</p>\n<p><strong>1. Declare the dependency</strong> in <code>manifest.json</code>:</p>\n<div class=\"language-json codeBlockContainer_Ckt0 theme-code-block\" style=\"--prism-color:#bfc7d5;--prism-background-color:#292d3e\"><div class=\"codeBlockContent_QJqH\"><pre tabindex=\"0\" class=\"prism-code language-json codeBlock_bY9V thin-scrollbar\" style=\"color:#bfc7d5;background-color:#292d3e\"><code class=\"codeBlockLines_e6Vv\"><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">{</span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">  \"dependencies\": [\"radio_frequency\"]</span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">}</span><br></div></code></pre></div></div>\n<p><strong>2. Load the device's commands</strong> from the <a href=\"https://github.com/home-assistant-libs/rf-protocols\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"\"><code>rf-protocols</code></a> library:</p>\n<div class=\"language-python codeBlockContainer_Ckt0 theme-code-block\" style=\"--prism-color:#bfc7d5;--prism-background-color:#292d3e\"><div class=\"codeBlockContent_QJqH\"><pre tabindex=\"0\" class=\"prism-code language-python codeBlock_bY9V thin-scrollbar\" style=\"color:#bfc7d5;background-color:#292d3e\"><code class=\"codeBlockLines_e6Vv\"><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token keyword\" style=\"font-style:italic\">from</span><span class=\"token plain\"> rf_protocols </span><span class=\"token keyword\" style=\"font-style:italic\">import</span><span class=\"token plain\"> get_codes</span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\" style=\"display:inline-block\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">COMMANDS </span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">=</span><span class=\"token plain\"> get_codes</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token string\" style=\"color:rgb(195, 232, 141)\">\"honeywell/string_lights\"</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><br></div></code></pre></div></div>\n<p>Each loaded command exposes the frequency and modulation the device uses, which the config flow needs to filter transmitters.</p>\n<p><strong>3. Let the user pick a transmitter</strong> in the config flow, using a sample command to filter by the frequency and modulation the device requires:</p>\n<div class=\"language-python codeBlockContainer_Ckt0 theme-code-block\" style=\"--prism-color:#bfc7d5;--prism-background-color:#292d3e\"><div class=\"codeBlockContent_QJqH\"><pre tabindex=\"0\" class=\"prism-code language-python codeBlock_bY9V thin-scrollbar\" style=\"color:#bfc7d5;background-color:#292d3e\"><code class=\"codeBlockLines_e6Vv\"><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token keyword\" style=\"font-style:italic\">from</span><span class=\"token plain\"> rf_protocols </span><span class=\"token keyword\" style=\"font-style:italic\">import</span><span class=\"token plain\"> RadioFrequencyCommand</span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\"></span><span class=\"token keyword\" style=\"font-style:italic\">from</span><span class=\"token plain\"> homeassistant</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token plain\">components</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token plain\">radio_frequency </span><span class=\"token keyword\" style=\"font-style:italic\">import</span><span class=\"token plain\"> async_get_transmitters</span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\"></span><span class=\"token keyword\" style=\"font-style:italic\">from</span><span class=\"token plain\"> homeassistant</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token plain\">exceptions </span><span class=\"token keyword\" style=\"font-style:italic\">import</span><span class=\"token plain\"> HomeAssistantError</span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\" style=\"display:inline-block\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">sample_command</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">:</span><span class=\"token plain\"> RadioFrequencyCommand </span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">=</span><span class=\"token plain\"> </span><span class=\"token keyword\" style=\"font-style:italic\">await</span><span class=\"token plain\"> self</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token plain\">hass</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token plain\">async_add_executor_job</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">    COMMANDS</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token plain\">load_command</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"> </span><span class=\"token string\" style=\"color:rgb(195, 232, 141)\">\"turn_on\"</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\"></span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\"></span><span class=\"token keyword\" style=\"font-style:italic\">try</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">:</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">    transmitters </span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">=</span><span class=\"token plain\"> async_get_transmitters</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">        self</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token plain\">hass</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"> sample_command</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token plain\">frequency</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"> sample_command</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token plain\">modulation</span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">    </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\"></span><span class=\"token keyword\" style=\"font-style:italic\">except</span><span class=\"token plain\"> HomeAssistantError</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">:</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">    </span><span class=\"token keyword\" style=\"font-style:italic\">return</span><span class=\"token plain\"> self</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token plain\">async_abort</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token plain\">reason</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">=</span><span class=\"token string\" style=\"color:rgb(195, 232, 141)\">\"no_transmitters\"</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\" style=\"display:inline-block\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\"></span><span class=\"token keyword\" style=\"font-style:italic\">if</span><span class=\"token plain\"> </span><span class=\"token keyword\" style=\"font-style:italic\">not</span><span class=\"token plain\"> transmitters</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">:</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">    </span><span class=\"token keyword\" style=\"font-style:italic\">return</span><span class=\"token plain\"> self</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token plain\">async_abort</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token plain\">reason</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">=</span><span class=\"token string\" style=\"color:rgb(195, 232, 141)\">\"no_compatible_transmitters\"</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><br></div></code></pre></div></div>\n<p>Only <code>ModulationType.OOK</code> (on-off keying) is supported right now; later releases can add other modulation types.</p>\n<p><strong>4. Send RF commands</strong> using the helper function and the stored transmitter entity ID:</p>\n<div class=\"language-python codeBlockContainer_Ckt0 theme-code-block\" style=\"--prism-color:#bfc7d5;--prism-background-color:#292d3e\"><div class=\"codeBlockContent_QJqH\"><pre tabindex=\"0\" class=\"prism-code language-python codeBlock_bY9V thin-scrollbar\" style=\"color:#bfc7d5;background-color:#292d3e\"><code class=\"codeBlockLines_e6Vv\"><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token keyword\" style=\"font-style:italic\">from</span><span class=\"token plain\"> homeassistant</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token plain\">components</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token plain\">radio_frequency </span><span class=\"token keyword\" style=\"font-style:italic\">import</span><span class=\"token plain\"> async_send_command</span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\" style=\"display:inline-block\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\"></span><span class=\"token keyword\" style=\"font-style:italic\">async</span><span class=\"token plain\"> </span><span class=\"token keyword\" style=\"font-style:italic\">def</span><span class=\"token plain\"> </span><span class=\"token function\" style=\"color:rgb(130, 170, 255)\">async_turn_on</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token plain\">self</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"> </span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">**</span><span class=\"token plain\">kwargs</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">:</span><span class=\"token plain\"> Any</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token plain\"> </span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">-</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">&gt;</span><span class=\"token plain\"> </span><span class=\"token boolean\" style=\"color:rgb(255, 88, 116)\">None</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">:</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">    </span><span class=\"token triple-quoted-string string\" style=\"color:rgb(195, 232, 141)\">\"\"\"Turn on the light.\"\"\"</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">    command </span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">=</span><span class=\"token plain\"> </span><span class=\"token keyword\" style=\"font-style:italic\">await</span><span class=\"token plain\"> self</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token plain\">hass</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token plain\">async_add_executor_job</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">        COMMANDS</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token plain\">load_command</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"> </span><span class=\"token string\" style=\"color:rgb(195, 232, 141)\">\"turn_on\"</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">    </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">    </span><span class=\"token keyword\" style=\"font-style:italic\">await</span><span class=\"token plain\"> async_send_command</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token plain\">self</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token plain\">hass</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"> self</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token plain\">_transmitter</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"> command</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">    self</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token plain\">_attr_is_on </span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">=</span><span class=\"token plain\"> </span><span class=\"token boolean\" style=\"color:rgb(255, 88, 116)\">True</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">    self</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token plain\">async_write_ha_state</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><br></div></code></pre></div></div>\n<h2 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"rf-protocols-and-codes\">RF protocols and codes<a href=\"https://developers.home-assistant.io/blog/2026/04/24/radio-frequency-entity-platform#rf-protocols-and-codes\" class=\"hash-link\" aria-label=\"Direct link to RF protocols and codes\" title=\"Direct link to RF protocols and codes\" translate=\"no\">​</a></h2>\n<p>RF protocol encoders and device code sets live outside Home Assistant in the <a href=\"https://github.com/home-assistant-libs/rf-protocols\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"\"><code>rf-protocols</code></a> library. Common protocols and well-known device codes should be contributed there. For niche or proprietary protocols, a separate third-party library can also be used.</p>\n<p>For full details, see the <a class=\"\" href=\"https://developers.home-assistant.io/docs/core/entity/radio-frequency\">radio frequency entity documentation</a>.</p>",
            "url": "https://developers.home-assistant.io/blog/2026/04/24/radio-frequency-entity-platform",
            "title": "New radio frequency entity platform for RF device integrations",
            "summary": "Home Assistant now has a radio_frequency entity platform that decouples RF transceiver hardware from the devices it controls. Instead of each device integration talking directly to specific RF hardware, transmitter integrations (like esphome) expose RadioFrequencyTransmitterEntity instances, and device integrations send commands through them via helper functions.",
            "date_modified": "2026-04-24T00:00:00.000Z",
            "author": {
                "name": "Paulus Schoutsen",
                "url": "https://github.com/balloob"
            },
            "tags": []
        },
        {
            "id": "https://developers.home-assistant.io/blog/2026/04/21/registering-custom-dashboard-strategies",
            "content_html": "<p>As of Home Assistant 2026.5, you can now register custom dashboard strategies, just as you can with <a class=\"\" href=\"https://developers.home-assistant.io/docs/frontend/custom-ui/custom-card\">custom cards</a>, making them easier to discover and add using the <strong>new dashboard</strong> dialog under the <strong>Community dashboards</strong> section.</p>\n<p>Previously, you had to send users to create a blank dashboard, edit in YAML mode, and paste in your custom strategy. Now you can register a friendly name, description, and documentation.</p>\n<p>To register your strategy, call <code>window.customStrategies.push()</code> with an object containing the following keys:</p>\n<ul>\n<li class=\"\"><code>type</code>: The strategy type without the <code>custom:</code> prefix, for example <code>\"my-demo\"</code>.</li>\n<li class=\"\"><code>strategyType</code>: Set to <code>\"dashboard\"</code> to register a dashboard strategy.</li>\n<li class=\"\"><code>name</code>: The friendly name of the strategy.</li>\n<li class=\"\"><code>description</code> (<code>optional</code>): A short description of the strategy.</li>\n<li class=\"\"><code>documentationURL</code> (<code>optional</code>): A URL to the documentation for the strategy. This is not shown in the strategy UI yet but may in the future.</li>\n</ul>\n<p>Example:</p>\n<div class=\"language-js codeBlockContainer_Ckt0 theme-code-block\" style=\"--prism-color:#bfc7d5;--prism-background-color:#292d3e\"><div class=\"codeBlockContent_QJqH\"><pre tabindex=\"0\" class=\"prism-code language-js codeBlock_bY9V thin-scrollbar\" style=\"color:#bfc7d5;background-color:#292d3e\"><code class=\"codeBlockLines_e6Vv\"><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token dom variable\" style=\"color:rgb(191, 199, 213)\">window</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token property-access\">customStrategies</span><span class=\"token plain\"> </span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">=</span><span class=\"token plain\"> </span><span class=\"token dom variable\" style=\"color:rgb(191, 199, 213)\">window</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token property-access\">customStrategies</span><span class=\"token plain\"> </span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">||</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">[</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">]</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">;</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\"></span><span class=\"token dom variable\" style=\"color:rgb(191, 199, 213)\">window</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token property-access\">customStrategies</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token method function property-access\" style=\"color:rgb(130, 170, 255)\">push</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">{</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">  </span><span class=\"token literal-property property\">type</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">:</span><span class=\"token plain\"> </span><span class=\"token string\" style=\"color:rgb(195, 232, 141)\">\"my-demo\"</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">  </span><span class=\"token literal-property property\">strategyType</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">:</span><span class=\"token plain\"> </span><span class=\"token string\" style=\"color:rgb(195, 232, 141)\">\"dashboard\"</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">  </span><span class=\"token literal-property property\">name</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">:</span><span class=\"token plain\"> </span><span class=\"token string\" style=\"color:rgb(195, 232, 141)\">\"My demo dashboard\"</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">  </span><span class=\"token literal-property property\">description</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">:</span><span class=\"token plain\"> </span><span class=\"token string\" style=\"color:rgb(195, 232, 141)\">\"A starter dashboard generated from JavaScript.\"</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">  </span><span class=\"token literal-property property\">documentationURL</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">:</span><span class=\"token plain\"> </span><span class=\"token string\" style=\"color:rgb(195, 232, 141)\">\"https://example.com/my-demo-dashboard\"</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\"></span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">}</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">;</span><br></div></code></pre></div></div>\n<p>This metadata is separate from the custom element itself. Your strategy still needs to be registered with a tag like <code>ll-strategy-dashboard-my-demo</code>, and users still need the resource loaded before Home Assistant can discover it. You can use HACS for this as other resources can be added, like custom cards.</p>\n<p>Take a look at the updated <a class=\"\" href=\"https://developers.home-assistant.io/docs/frontend/custom-ui/custom-strategy\">custom strategies</a> documentation with example code and further details.</p>",
            "url": "https://developers.home-assistant.io/blog/2026/04/21/registering-custom-dashboard-strategies",
            "title": "Registering custom dashboard strategies",
            "summary": "As of Home Assistant 2026.5, you can now register custom dashboard strategies, just as you can with custom cards, making them easier to discover and add using the new dashboard dialog under the Community dashboards section.",
            "date_modified": "2026-04-21T00:00:00.000Z",
            "author": {
                "name": "Aidan Timson",
                "url": "https://github.com/timmo001"
            },
            "tags": []
        }
    ]
}