From 03fdb0cb88d22dab83d7cfa7729631b9f4b5c18c Mon Sep 17 00:00:00 2001 From: Koen Kanters Date: Wed, 1 Jun 2022 18:57:02 +0200 Subject: [PATCH] Fix Home Assistant rename creating duplicate entities. #12610 --- lib/extension/homeassistant.ts | 6 +++++- test/homeassistant.test.js | 4 ++++ 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/lib/extension/homeassistant.ts b/lib/extension/homeassistant.ts index fee1f3404..35956a55b 100644 --- a/lib/extension/homeassistant.ts +++ b/lib/extension/homeassistant.ts @@ -933,7 +933,7 @@ export default class HomeAssistant extends Extension { } } - @bind onEntityRenamed(data: eventdata.EntityRenamed): void { + @bind async onEntityRenamed(data: eventdata.EntityRenamed): Promise { logger.debug(`Refreshing Home Assistant discovery topic for '${data.entity.name}'`); // Clear before rename so Home Assistant uses new friendly_name @@ -943,6 +943,10 @@ export default class HomeAssistant extends Extension { const topic = this.getDiscoveryTopic(config, data.entity); this.mqtt.publish(topic, null, {retain: true, qos: 0}, this.discoveryTopic, false, false); } + + // Make sure Home Assistant deletes the old entity first otherwise another one (_2) is created + // https://github.com/Koenkk/zigbee2mqtt/issues/12610 + await utils.sleep(2); } this.discover(data.entity, true); diff --git a/test/homeassistant.test.js b/test/homeassistant.test.js index 253025ce7..ff2cf8bad 100644 --- a/test/homeassistant.test.js +++ b/test/homeassistant.test.js @@ -1178,6 +1178,8 @@ describe('HomeAssistant extension', () => { MQTT.publish.mockClear(); MQTT.events.message('zigbee2mqtt/bridge/request/device/rename', stringify({"from": "weather_sensor", "to": "weather_sensor_renamed","homeassistant_rename":true})); await flushPromises(); + jest.runOnlyPendingTimers(); + await flushPromises(); const payload = { 'unit_of_measurement': '°C', @@ -1240,6 +1242,8 @@ describe('HomeAssistant extension', () => { MQTT.publish.mockClear(); MQTT.events.message('zigbee2mqtt/bridge/request/group/rename', stringify({"from": "ha_discovery_group", "to": "ha_discovery_group_new","homeassistant_rename":true})); await flushPromises(); + jest.runOnlyPendingTimers(); + await flushPromises(); const payload = { "availability":[{"topic":"zigbee2mqtt/bridge/state"}],