From d5c6e39e7d5547e08d216017f57b948e330eb8ea Mon Sep 17 00:00:00 2001 From: Koen Kanters Date: Thu, 31 Jan 2019 21:32:18 +0100 Subject: [PATCH] Refactor device reconfigure when device comes online and mark online. #966 #775 --- lib/extension/deviceAvailability.js | 30 +++++++---------------------- lib/extension/deviceConfigure.js | 23 +++++++++++++++++++++- npm-shrinkwrap.json | 4 ++-- package.json | 2 +- 4 files changed, 32 insertions(+), 27 deletions(-) diff --git a/lib/extension/deviceAvailability.js b/lib/extension/deviceAvailability.js index daf0ece7..5e0b1043 100644 --- a/lib/extension/deviceAvailability.js +++ b/lib/extension/deviceAvailability.js @@ -21,6 +21,7 @@ class DeviceAvailabilityHandler { this.availability_timeout = settings.get().advanced.availability_timeout; this.timers = {}; this.pending = []; + this.state = {}; /** * Setup command queue. @@ -106,6 +107,7 @@ class DeviceAvailabilityHandler { } publishAvailability(ieeeAddr, available) { + this.state[ieeeAddr] = available; const deviceSettings = settings.getDevice(ieeeAddr); const name = deviceSettings ? deviceSettings.friendly_name : ieeeAddr; const topic = `${name}/availability`; @@ -113,35 +115,17 @@ class DeviceAvailabilityHandler { this.mqtt.publish(topic, payload, {retain: true, qos: 0}); } - configure(device, mappedDevice) { - const ieeeAddr = device.ieeeAddr; - const friendlyName = settings.getDevice(ieeeAddr) ? settings.getDevice(ieeeAddr).friendly_name : 'unknown'; - logger.debug(`Configuring ${friendlyName} (${ieeeAddr}) ...`); - // Call configure function of this device. - mappedDevice.configure(ieeeAddr, this.zigbee.shepherd, this.zigbee.getCoordinator(), (ok, msg) => { - if (ok) { - logger.info(`Succesfully configured ${friendlyName} (${ieeeAddr})`); - } else { - logger.error(`Failed to configure ${friendlyName} (${ieeeAddr}) ('${msg}')`); - } - }); - } - onZigbeeMessage(message, device, mappedDevice) { // When a zigbee message from a device is received we know the device is still alive. // => reset the timer. if (device && this.isPingable(this.zigbee.getDevice(device.ieeeAddr))) { + // When a message is received and the device is marked as offline, mark it online. + if (this.state.hasOwnProperty(device.ieeeAddr) && !this.state[device.ieeeAddr]) { + this.publishAvailability(device.ieeeAddr, true); + } + this.setTimer(device.ieeeAddr); } - - if (message.type == 'devIncoming' || message.type == 'endDeviceAnnce') { - logger.info('Announcement: Device incoming...'); - //check device for post announce handler - if(device && mappedDevice && mappedDevice.configure) { - //logger.info('Announcement: need to re-configure'); - this.configure(device,mappedDevice); - } - } } } diff --git a/lib/extension/deviceConfigure.js b/lib/extension/deviceConfigure.js index bf216b83..b6eeaeca 100644 --- a/lib/extension/deviceConfigure.js +++ b/lib/extension/deviceConfigure.js @@ -23,10 +23,31 @@ class DeviceConfigure { onZigbeeMessage(message, device, mappedDevice) { if (device && mappedDevice) { + // endDeviceAnnce is typically send when a device comes online after being + // powered off. In some cases this requires a re-configure of the device. + // Mark this device as not configured. + // https://github.com/Koenkk/zigbee2mqtt/issues/966 + if (message.type === 'endDeviceAnnce') { + this.mark(device.ieeeAddr, false); + } + this.configure(device, mappedDevice); } } + mark(ieeeAddr, configured) { + if (configured) { + if (!this.configured.includes(ieeeAddr)) { + this.configured.push(ieeeAddr); + } + } else { + const index = this.configured.indexOf(ieeeAddr); + if (index > -1) { + this.configured.splice(index, 1); + } + } + } + configure(device, mappedDevice) { const ieeeAddr = device.ieeeAddr; @@ -44,7 +65,7 @@ class DeviceConfigure { }); // Mark as configured - this.configured.push(ieeeAddr); + this.mark(ieeeAddr, true); } } } diff --git a/npm-shrinkwrap.json b/npm-shrinkwrap.json index bfa4fb52..e0eb2af6 100644 --- a/npm-shrinkwrap.json +++ b/npm-shrinkwrap.json @@ -4803,8 +4803,8 @@ } }, "zigbee-shepherd": { - "version": "git+https://github.com/Koenkk/zigbee-shepherd.git#94debb60dfe8b85632708990dfe97913d1474a53", - "from": "git+https://github.com/Koenkk/zigbee-shepherd.git#94debb60dfe8b85632708990dfe97913d1474a53", + "version": "git+https://github.com/Koenkk/zigbee-shepherd.git#6f06ba01d7dbe13dc5a3b0652cf4ad01debbf188", + "from": "git+https://github.com/Koenkk/zigbee-shepherd.git#6f06ba01d7dbe13dc5a3b0652cf4ad01debbf188", "requires": { "areq": "^0.2.0", "busyman": "^0.3.0", diff --git a/package.json b/package.json index 9229ddf7..511d6ec4 100644 --- a/package.json +++ b/package.json @@ -45,7 +45,7 @@ "semver": "*", "winston": "2.4.2", "ziee": "*", - "zigbee-shepherd": "git+https://github.com/Koenkk/zigbee-shepherd.git#94debb60dfe8b85632708990dfe97913d1474a53", + "zigbee-shepherd": "git+https://github.com/Koenkk/zigbee-shepherd.git#6f06ba01d7dbe13dc5a3b0652cf4ad01debbf188", "zigbee-shepherd-converters": "7.0.27", "zive": "*" },