diff --git a/MMM-NetworkScanner.js b/MMM-NetworkScanner.js index 0c2d110..94adb60 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,32 @@ 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; - } - } + var networkDevicesByMac = getKeyedObject(this.networkDevices, 'macAddress'); + var payloadDevicesByMac = getKeyedObject(nextState, 'macAddress'); - if (n != -1) { - device.online = false; - this.networkDevices.push(device); - } - } + nextState = this.config.devices.map(device => { + var oldDeviceState = networkDevicesByMac[device.macAddress]; + var payloadDeviceState = payloadDevicesByMac[device.macAddress]; + 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) && (!isStale); + + 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;