diff --git a/lib/extension/availability.ts b/lib/extension/availability.ts index 20a4df678..816333b39 100644 --- a/lib/extension/availability.ts +++ b/lib/extension/availability.ts @@ -97,10 +97,10 @@ export default class Availability extends Extension { override async start(): Promise { logger.warn('Using experimental new availability feature'); - this.eventBus.onDeviceRenamed(this, (data: eventdata.DeviceRenamed) => - this.publishAvailability(data.device, false, true)); - this.eventBus.onDeviceLeave(this, (data: eventdata.DeviceLeave) => clearTimeout(this.timers[data.ieeeAddr])); - this.eventBus.onDeviceAnnounce(this, (data: eventdata.DeviceAnnounce) => this.retrieveState(data.device)); + this.eventBus.onDeviceRenamed(this, (data) => this.publishAvailability(data.device, false, true)); + this.eventBus.onDeviceRemoved(this, (data) => clearTimeout(this.timers[data.ieeeAddr])); + this.eventBus.onDeviceLeave(this, (data) => clearTimeout(this.timers[data.ieeeAddr])); + this.eventBus.onDeviceAnnounce(this, (data) => this.retrieveState(data.device)); this.eventBus.onLastSeenChanged(this, this.onLastSeenChanged); for (const device of this.zigbee.devices(false)) { diff --git a/test/availability.test.js b/test/availability.test.js index fb8aea448..8b60fded7 100644 --- a/test/availability.test.js +++ b/test/availability.test.js @@ -205,6 +205,20 @@ describe('Availability', () => { expect(devices.bulb_color.ping).toHaveBeenCalledTimes(0); }); + it('Should stop pinging device when it is removed', async () => { + await resetExtension(); + MQTT.publish.mockClear(); + + await advancedTime(utils.minutes(9)); + expect(devices.bulb_color.ping).toHaveBeenCalledTimes(0); + + MQTT.events.message('zigbee2mqtt/bridge/request/device/remove', stringify({id: "bulb_color"})); + await flushPromises(); + + await advancedTime(utils.minutes(3)); + expect(devices.bulb_color.ping).toHaveBeenCalledTimes(0); + }); + it('Should allow to be disabled', async () => { settings.set(['availability'], false); await resetExtension();