From f06673506f5b5ee98310fb856058f2e378dd5f76 Mon Sep 17 00:00:00 2001 From: Igor Clemencov Date: Sat, 8 Aug 2026 22:42:16 +0300 Subject: [PATCH] fix: Home Assistant: avoid duplicate door names (#32752) Co-authored-by: Koen Kanters --- lib/extension/homeassistant.ts | 10 +++++++++- test/extensions/homeassistant.test.ts | 19 +++++++++++++++++++ 2 files changed, 28 insertions(+), 1 deletion(-) diff --git a/lib/extension/homeassistant.ts b/lib/extension/homeassistant.ts index fece62010..784d03831 100644 --- a/lib/extension/homeassistant.ts +++ b/lib/extension/homeassistant.ts @@ -401,6 +401,10 @@ const applyHomeAssistantExposeMetadata = (payload: DiscoveryEntry, homeAssistant payload.discovery_payload.icon = homeAssistant.icon; } + if (homeAssistant.name !== undefined) { + payload.discovery_payload.name = homeAssistant.name; + } + if (homeAssistant.valueTemplate !== undefined) { if (homeAssistant.valueTemplate === null) { delete payload.discovery_payload.value_template; @@ -1443,7 +1447,11 @@ export class HomeAssistant extends Extension { // Let Home Assistant generate entity name when device_class is present. // preserve_name allows device_class and explicit name to coexist (e.g. derived sensors). - if (entry.discovery_payload.device_class && !NUMERIC_DISCOVERY_LOOKUP[firstExpose.name]?.preserve_name) { + if ( + entry.discovery_payload.device_class && + entry.discovery_payload.name !== null && + !NUMERIC_DISCOVERY_LOOKUP[firstExpose.name]?.preserve_name + ) { delete entry.discovery_payload.name; } diff --git a/test/extensions/homeassistant.test.ts b/test/extensions/homeassistant.test.ts index b39b158dc..5dbad8c66 100644 --- a/test/extensions/homeassistant.test.ts +++ b/test/extensions/homeassistant.test.ts @@ -281,6 +281,25 @@ describe("Extension: HomeAssistant", () => { expect(configs.find((config) => config.object_id === "voltage")?.discovery_payload).not.toHaveProperty("type"); }); + it("Should set discovery name to null when expose specifies homeassistant name null", () => { + const createDevice = (exposes: zhc.Expose[]): Device => + ({ + definition: {}, + isDevice: (): boolean => true, + isGroup: (): boolean => false, + endpoint: () => undefined, + options: {}, + exposes: (): zhc.Expose[] => exposes, + zh: {endpoints: []}, + }) as Device; + + const contactExpose = new zhc.Binary("contact", zhc.access.STATE, false, true).withHomeAssistant({name: null}); + + // @ts-expect-error private + const configs = extension.getConfigs(createDevice([contactExpose])); + expect(configs.find((config) => config.object_id === "contact")?.discovery_payload.name).toBeNull(); + }); + it("Should discover devices and groups", async () => { settings.set(["homeassistant", "experimental_event_entities"], true); settings.set(["groups", "9", "homeassistant"], {name: "HA Discovery Group", icon: "mdi:lightbulb-group"});