From 2a81a546099eb08402ae891c9da7baedc188f112 Mon Sep 17 00:00:00 2001 From: Koen Kanters Date: Wed, 27 Nov 2019 18:14:39 +0100 Subject: [PATCH] Stop pinging device when removed. #2419 --- lib/extension/deviceAvailability.js | 7 ++++++- test/deviceAvailability.test.js | 15 ++++++++++++++- 2 files changed, 20 insertions(+), 2 deletions(-) diff --git a/lib/extension/deviceAvailability.js b/lib/extension/deviceAvailability.js index 38aa0f13a..4862c5179 100644 --- a/lib/extension/deviceAvailability.js +++ b/lib/extension/deviceAvailability.js @@ -69,9 +69,14 @@ class DeviceAvailability extends BaseExtension { async handleInterval(device) { // When a device is already unavailable, log the ping failed on 'debug' instead of 'error'. + const entity = this.zigbee.resolveEntity(device.ieeeAddr); + if (!entity) { + logger.debug(`Stop pinging '${device.ieeeAddr}', device is not known anymore`); + return; + } + const ieeeAddr = device.ieeeAddr; const level = this.state.hasOwnProperty(ieeeAddr) && !this.state[ieeeAddr] ? 'debug' : 'error'; - const entity = this.zigbee.resolveEntity(device.ieeeAddr); try { await device.ping(); this.publishAvailability(device, true); diff --git a/test/deviceAvailability.test.js b/test/deviceAvailability.test.js index 01cebae4a..1f6592102 100644 --- a/test/deviceAvailability.test.js +++ b/test/deviceAvailability.test.js @@ -258,7 +258,7 @@ describe('Device availability', () => { jest.advanceTimersByTime(11 * 1000); await flushPromises(); expect(device.ping).toHaveBeenCalledTimes(0); - }); + }); it('Should not read when device has no modelID and reconnects', async () => { const device = zigbeeHerdsman.devices.nomodel; @@ -277,4 +277,17 @@ describe('Device availability', () => { await flushPromises(); expect(endpoint.read).toHaveBeenCalledTimes(0); }); + + it('Should stop pinging device when removed', async () => { + const device = zigbeeHerdsman.devices.bulb_color; + device.ping.mockClear(); + const endpoint = device.getEndpoint(1); + jest.advanceTimersByTime(11 * 1000); + await flushPromises(); + expect(device.ping).toHaveBeenCalledTimes(1); + settings.removeDevice(device.ieeeAddr); + jest.advanceTimersByTime(11 * 1000); + await flushPromises(); + expect(device.ping).toHaveBeenCalledTimes(1); + }); });