From d3ff682600eb40201859ae5015d29e12d9ffd87b Mon Sep 17 00:00:00 2001 From: Grant Levene Date: Tue, 6 Feb 2018 18:17:41 -0500 Subject: [PATCH 1/3] Fix KeepAlive refresh The state of every device was getting reset on every network refresh, which is problematic when we want to display devices that weren't in the refresh, but haven't passed their keepalive timeout. This change determines if a device has gone past the timeout before saving it to the devices to be displayed on the screen. --- MMM-NetworkScanner.js | 57 ++++++++++++++++++++++--------------------- 1 file changed, 29 insertions(+), 28 deletions(-) diff --git a/MMM-NetworkScanner.js b/MMM-NetworkScanner.js index 0c2d110..2482308 100644 --- a/MMM-NetworkScanner.js +++ b/MMM-NetworkScanner.js @@ -59,6 +59,10 @@ Module.register("MMM-NetworkScanner", { if (this.config.debug) Log.info(this.name + " received a notification: " + notification, payload); var self = this; + var getKeyedObject = (objects = [], key) => objects.reduce( + (acc, object) => (Object.assign(acc, { [object[key]]: object })), + {} + ); if (notification === 'IP_ADDRESS') { if (payload.hasOwnProperty("ipAddress")) { @@ -74,38 +78,35 @@ Module.register("MMM-NetworkScanner", { if (notification === 'MAC_ADDRESSES') { if (this.config.debug) Log.info(this.name + " MAC_ADDRESSES payload: ", payload); - this.networkDevices = payload; + var nextState = payload.map(device => + Object.assign(device, { lastSeen: moment() }) + ); - // Update device info - for (var i = 0; i < this.networkDevices.length; i++) { - var device = this.networkDevices[i]; - // Set last seen - if (device.online) { - device.lastSeen = moment(); - } - // Keep alive? - device.online = (moment().diff(device.lastSeen, 'seconds') < this.config.keepAlive); - } - - // Add offline devices from config if (this.config.showOffline) { - for (var d = 0; d < this.config.devices.length; d++) { - var device = this.config.devices[d]; - - for(var n = 0; n < this.networkDevices.length; n++){ - if( device.macAddress && this.networkDevices[n].macAddress && this.networkDevices[n].macAddress.toUpperCase() === device.macAddress.toUpperCase()) { - n = -1; - break; - } - } - - if (n != -1) { - device.online = false; - this.networkDevices.push(device); - } - } + var networkDevicesByMac = getKeyedObject(this.networkDevices, 'macAddress'); + var payloadDevicesByMac = getKeyedObject(nextState, 'macAddress') + + nextState = this.config.devices.map(device => { + var oldDeviceState = networkDevicesByMac[device.macAddress]; + var payloadDeviceState = payloadDevicesByMac[device.macAddress]; + var newDeviceState = payloadDeviceState + ? payloadDeviceState + : (oldDeviceState || device); + + var sinceLastSeen = newDeviceState.lastSeen + ? moment().diff(newDeviceState.lastSeen, 'seconds') + : null; + + newDeviceState.online = (sinceLastSeen != null) + ? (sinceLastSeen < this.config.keepAlive) + : false; + + return newDeviceState; + }); } + this.networkDevices = nextState; + // Sort list by known device names, then unknown device mac addresses this.networkDevices.sort(function (a, b) { var stringA, stringB; From 2febdb3913ddac3fb92689e2d0ee41466a27df91 Mon Sep 17 00:00:00 2001 From: Grant Levene Date: Wed, 7 Feb 2018 10:06:56 -0500 Subject: [PATCH 2/3] Clean ternarys in Mac address handling --- MMM-NetworkScanner.js | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/MMM-NetworkScanner.js b/MMM-NetworkScanner.js index 2482308..43ceb83 100644 --- a/MMM-NetworkScanner.js +++ b/MMM-NetworkScanner.js @@ -89,17 +89,14 @@ Module.register("MMM-NetworkScanner", { nextState = this.config.devices.map(device => { var oldDeviceState = networkDevicesByMac[device.macAddress]; var payloadDeviceState = payloadDevicesByMac[device.macAddress]; - var newDeviceState = payloadDeviceState - ? payloadDeviceState - : (oldDeviceState || device); + var newDeviceState = payloadDeviceState || oldDeviceState || device; var sinceLastSeen = newDeviceState.lastSeen ? moment().diff(newDeviceState.lastSeen, 'seconds') : null; + var isStale = (sinceLastSeen >= this.config.keepAlive); - newDeviceState.online = (sinceLastSeen != null) - ? (sinceLastSeen < this.config.keepAlive) - : false; + newDeviceState.online = (sinceLastSeen != null) && (!isStale) return newDeviceState; }); From d13532ec27c20a28ad36a0219e3d4a61541f9cc7 Mon Sep 17 00:00:00 2001 From: Grant Levene Date: Wed, 7 Feb 2018 11:25:33 -0500 Subject: [PATCH 3/3] Add missing semicolons --- MMM-NetworkScanner.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/MMM-NetworkScanner.js b/MMM-NetworkScanner.js index 43ceb83..94adb60 100644 --- a/MMM-NetworkScanner.js +++ b/MMM-NetworkScanner.js @@ -84,7 +84,7 @@ Module.register("MMM-NetworkScanner", { if (this.config.showOffline) { var networkDevicesByMac = getKeyedObject(this.networkDevices, 'macAddress'); - var payloadDevicesByMac = getKeyedObject(nextState, 'macAddress') + var payloadDevicesByMac = getKeyedObject(nextState, 'macAddress'); nextState = this.config.devices.map(device => { var oldDeviceState = networkDevicesByMac[device.macAddress]; @@ -96,7 +96,7 @@ Module.register("MMM-NetworkScanner", { : null; var isStale = (sinceLastSeen >= this.config.keepAlive); - newDeviceState.online = (sinceLastSeen != null) && (!isStale) + newDeviceState.online = (sinceLastSeen != null) && (!isStale); return newDeviceState; });