From 4497214588b2f5e51e2d18cf0420848c0581d7d5 Mon Sep 17 00:00:00 2001 From: clockbrain <40568549+clockbrain@users.noreply.github.com> Date: Sun, 2 Jun 2019 18:05:44 +1000 Subject: [PATCH] Network map fixes (#1590) * Remove device status from network scan topology * Random start for each lqi scan then sort resultant link map * Fix log statement order * Sort network map links by composite key * Fix typo in link sorting * Fix eslint formatting --- lib/zigbee.js | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/lib/zigbee.js b/lib/zigbee.js index 1713e5e28..d978f202c 100644 --- a/lib/zigbee.js +++ b/lib/zigbee.js @@ -304,7 +304,7 @@ class Zigbee { })); }; - const processResponse = function(parent, shepherd) { + const processResponse = function(parent) { logger.debug(`Scanning device: '${parent}'`); return function(data) { const linkSet = []; @@ -312,9 +312,7 @@ class Zigbee { logger.debug(`Processing scan for: '${parent}'`); if (data) { data.forEach(function(devinfo) { - const childDev = shepherd._findDevByAddr(devinfo.ieeeAddr); devinfo.parent = parent; - devinfo.status = childDev ? childDev.status : 'offline'; linkSet.push(devinfo); }); } @@ -326,8 +324,9 @@ class Zigbee { const allScans = this.getScanable().map((dev) => { logger.debug(`Preparing asynch network scan for '${dev.ieeeAddr}'`); - return this.shepherd.lqi(dev.ieeeAddr) - .then(processResponse(dev.ieeeAddr, this.shepherd)) + // Delay the start of each device scan by a random time to avoid network congestion + return Promise.delay(Math.random()*3000, this.shepherd.lqi(dev.ieeeAddr)) + .then(processResponse(dev.ieeeAddr)) .catch(() => { return new Promise((resolve) => []); }); @@ -335,7 +334,10 @@ class Zigbee { logger.debug('All network map promises created'); // Collect all lqi scan results but timeout after specified miliseconds if any haven't completed Promise.raceAll(allScans, 8000, []).then((linkSets) => { - const linkMap = [].concat(...linkSets); + // Assemble the individual scan results then sort by ieeeAddr to generate consistent maps + const linkMap = [].concat(...linkSets) + .sort((a, b) => ((a.parent + '|' + a.ieeeAddr) > (b.parent + '|' + b.ieeeAddr)) ? 1 + : (((b.parent + '|' + b.ieeeAddr) > (a.parent + '|' + a.ieeeAddr)) ? -1 : 0)); logger.info('Network scan completed'); logger.debug(`Link map: %j`, linkMap); callback(linkMap);