From 321b34721f84073d6d851271ed032f5a770156b7 Mon Sep 17 00:00:00 2001 From: Koen Kanters Date: Tue, 20 Jul 2021 18:13:10 +0200 Subject: [PATCH] Clear outdated Home Assistant discovery when topic does not match. https://github.com/Koenkk/zigbee2mqtt/issues/8079 --- lib/extension/homeassistant.js | 4 +++- test/homeassistant.test.js | 7 +++++++ 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/lib/extension/homeassistant.js b/lib/extension/homeassistant.js index 814d97368..81744fc4e 100644 --- a/lib/extension/homeassistant.js +++ b/lib/extension/homeassistant.js @@ -1033,7 +1033,9 @@ class HomeAssistant extends Extension { if (!clear && !isDeviceAutomation) { const type = discoveryMatch[1]; const objectID = discoveryMatch[3]; - clear = !this.getConfigs(resolvedEntity).find((c) => c.type === type && c.object_id === objectID); + clear = !this.getConfigs(resolvedEntity) + .find((c) => c.type === type && c.object_id === objectID && + `${this.discoveryTopic}/${this.getDiscoveryTopic(c, resolvedEntity)}` === topic); } // Device was flagged to be excluded from homeassistant discovery clear = clear || (resolvedEntity.settings.hasOwnProperty('homeassistant') && diff --git a/test/homeassistant.test.js b/test/homeassistant.test.js index 60acdda82..fbdd10a4b 100644 --- a/test/homeassistant.test.js +++ b/test/homeassistant.test.js @@ -1592,6 +1592,13 @@ describe('HomeAssistant extension', () => { await flushPromises(); expect(MQTT.publish).toHaveBeenCalledTimes(0); + // Existing group with old topic structure (1.20.0) -> clear + MQTT.publish.mockClear(); + await MQTT.events.message('homeassistant/light/9/light/config', stringify({availability: [{topic: 'zigbee2mqtt/bridge/state'}]})); + await flushPromises(); + expect(MQTT.publish).toHaveBeenCalledTimes(1); + expect(MQTT.publish).toHaveBeenCalledWith('homeassistant/light/9/light/config', null, {qos: 0, retain: true}, expect.any(Function)); + // Existing group, non existing config -> clear MQTT.publish.mockClear(); await MQTT.events.message('homeassistant/light/1221051039810110150109113116116_9/switch/config', stringify({availability: [{topic: 'zigbee2mqtt/bridge/state'}]}));