diff --git a/lib/zigbee.ts b/lib/zigbee.ts index 35425c5bd..81652e00e 100644 --- a/lib/zigbee.ts +++ b/lib/zigbee.ts @@ -110,14 +110,21 @@ export default class Zigbee { // If a passlist is used, all other device will be removed from the network. const passlist = settings.get().passlist.concat(settings.get().whitelist); const blocklist = settings.get().blocklist.concat(settings.get().ban); + const remove = async (device: Device): Promise => { + try { + await device.zh.removeFromNetwork(); + } catch (error) { + logger.error(`Failed to remove '${device.ieeeAddr}' (${error.message})`); + } + }; if (passlist.length > 0) { if (!passlist.includes(device.ieeeAddr)) { logger.warn(`Device which is not on passlist connected (${device.ieeeAddr}), removing...`); - device.zh.removeFromNetwork(); + await remove(device); } } else if (blocklist.includes(device.ieeeAddr)) { logger.warn(`Device on blocklist is connected (${device.ieeeAddr}), removing...`); - device.zh.removeFromNetwork(); + await remove(device); } } diff --git a/test/controller.test.js b/test/controller.test.js index d8177754e..afa291c8a 100644 --- a/test/controller.test.js +++ b/test/controller.test.js @@ -174,6 +174,7 @@ describe('Controller', () => { it('Should remove device not on passlist on startup', async () => { settings.set(['passlist'], [zigbeeHerdsman.devices.bulb_color.ieeeAddr]); + zigbeeHerdsman.devices.bulb.removeFromNetwork.mockImplementationOnce(() => {throw new Error("dummy")}); await controller.start(); await flushPromises(); expect(zigbeeHerdsman.devices.bulb_color.removeFromNetwork).toHaveBeenCalledTimes(0);