From 0dbe0bb95fe1d06b5d735e04adfafb4f75d4494e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Victor=20Hagelb=C3=A4ck?= Date: Sat, 20 Feb 2021 12:34:30 +0100 Subject: [PATCH] Move BLE states to DeviceRegistry and improve logging - Make deviceRegistry states/lists immutable --- plejd/DeviceRegistry.js | 92 ++++++++++++++++++++++++++----- plejd/PlejdBLEHandler.js | 9 ++- plejd/PlejdDeviceCommunication.js | 19 +------ 3 files changed, 86 insertions(+), 34 deletions(-) diff --git a/plejd/DeviceRegistry.js b/plejd/DeviceRegistry.js index 647e5bc..0a60c3d 100644 --- a/plejd/DeviceRegistry.js +++ b/plejd/DeviceRegistry.js @@ -1,3 +1,6 @@ +const Logger = require('./Logger'); + +const logger = Logger.getLogger('device-registry'); class DeviceRegistry { apiSite; cryptoKey = null; @@ -19,20 +22,56 @@ class DeviceRegistry { } addPlejdDevice(device) { - this.plejdDevices[device.id] = device; - this.deviceIdsBySerial[device.serialNumber] = device.id; - if (!this.deviceIdsByRoom[device.roomId]) { - this.deviceIdsByRoom[device.roomId] = []; + const added = { + ...this.plejdDevices[device.id], + ...device, + }; + + this.plejdDevices = { + ...this.plejdDevices, + [added.id]: added, + }; + + this.deviceIdsBySerial[added.serialNumber] = added.id; + + logger.verbose(`Added/updated device: ${JSON.stringify(added)}`); + + if (added.roomId) { + this.deviceIdsByRoom[added.roomId] = [ + ...(this.deviceIdsByRoom[added.roomId] || []), + added.id, + ]; + logger.verbose(`Added to room: ${JSON.stringify(this.deviceIdsByRoom[added.roomId])}`); } - this.deviceIdsByRoom[device.roomId].push(device.id); + + return added; + } + + addRoomDevice(device) { + const added = { + ...this.roomDevices[device.id], + ...device, + }; + this.roomDevices = { + ...this.roomDevices, + [device.id]: added, + }; + + logger.verbose(`Added/updated room device: ${JSON.stringify(added)}`); + return added; } addScene(scene) { - this.sceneDevices[scene.id] = scene; - } - - setApiSite(siteDetails) { - this.apiSite = siteDetails; + const added = { + ...this.sceneDevices[scene.id], + ...scene, + }; + this.sceneDevices = { + ...this.sceneDevices, + added, + }; + logger.verbose(`Added/updated scene: ${JSON.stringify(added)}`); + return added; } clearPlejdDevices() { @@ -41,10 +80,6 @@ class DeviceRegistry { this.deviceIdsBySerial = {}; } - addRoomDevice(device) { - this.roomDevices[device.id] = device; - } - clearRoomDevices() { this.roomDevices = {}; } @@ -58,7 +93,7 @@ class DeviceRegistry { } getDeviceBySerialNumber(serialNumber) { - return this.plejdDevices[this.deviceIdsBySerial[serialNumber]]; + return this.getDevice(this.deviceIdsBySerial[serialNumber]); } getDeviceName(deviceId) { @@ -72,6 +107,33 @@ class DeviceRegistry { getSceneName(sceneId) { return (this.sceneDevices[sceneId] || {}).name; } + + getState(deviceId) { + const device = this.getDevice(deviceId) || {}; + if (device.dimmable) { + return { + state: device.state, + dim: device.dim, + }; + } + return { + state: device.state, + }; + } + + setApiSite(siteDetails) { + this.apiSite = siteDetails; + } + + setState(deviceId, state, dim) { + const device = this.addPlejdDevice({ id: deviceId, state }); + if (dim && device.dimmable) { + device.dim = dim; + } + if (Logger.shouldLog('silly')) { + logger.silly(`Updated state: ${JSON.stringify(device)}`); + } + } } module.exports = DeviceRegistry; diff --git a/plejd/PlejdBLEHandler.js b/plejd/PlejdBLEHandler.js index cd3abd7..92b1232 100644 --- a/plejd/PlejdBLEHandler.js +++ b/plejd/PlejdBLEHandler.js @@ -171,9 +171,12 @@ class PlejBLEHandler extends EventEmitter { fixedPlejdPath = fixedPlejdPath.replace(/_/g, ''); plejd.device = this.deviceRegistry.getDeviceBySerialNumber(fixedPlejdPath); - logger.debug(`Discovered ${plejd.path} with rssi ${plejd.rssi}, name ${plejd.device.name}`); - // Todo: Connect should probably be done here - this.bleDevices.push(plejd); + if (plejd.device) { + logger.debug(`Discovered ${plejd.path} with rssi ${plejd.rssi}, name ${plejd.device.name}`); + this.bleDevices.push(plejd); + } else { + logger.warn(`Device registry does not contain device with serial ${fixedPlejdPath}`); + } } catch (err) { logger.error(`Failed inspecting ${path}. `, err); } diff --git a/plejd/PlejdDeviceCommunication.js b/plejd/PlejdDeviceCommunication.js index 888f4cb..9ce469c 100644 --- a/plejd/PlejdDeviceCommunication.js +++ b/plejd/PlejdDeviceCommunication.js @@ -15,7 +15,6 @@ class PlejdDeviceCommunication extends EventEmitter { plejdBleHandler; config; deviceRegistry; - plejdDevices = {}; // Todo: Move to deviceRegistry? writeQueue = []; writeQueueRef = null; @@ -77,30 +76,18 @@ class PlejdDeviceCommunication extends EventEmitter { _bleCommandReceived(deviceId, command, data) { try { if (command === COMMANDS.DIM) { - this.plejdDevices[deviceId] = { - state: data.state, - dim: data.dim, - }; - logger.silly(`All states: ${JSON.stringify(this.plejdDevices, null, 2)}`); + this.deviceRegistry.setState(deviceId, data.state, data.dim); this.emit(PlejdDeviceCommunication.EVENTS.stateChanged, deviceId, { state: data.state, brightness: data.dim, }); } else if (command === COMMANDS.TURN_ON) { - this.plejdDevices[deviceId] = { - state: 1, - dim: 0, - }; - logger.silly(`All states: ${JSON.stringify(this.plejdDevices, null, 2)}`); + this.deviceRegistry.setState(deviceId, 1); this.emit(PlejdDeviceCommunication.EVENTS.stateChanged, deviceId, { state: 1, }); } else if (command === COMMANDS.TURN_OFF) { - this.plejdDevices[deviceId] = { - state: 0, - dim: 0, - }; - logger.silly(`All states: ${JSON.stringify(this.plejdDevices, null, 2)}`); + this.deviceRegistry.setState(deviceId, 0); this.emit(PlejdDeviceCommunication.EVENTS.stateChanged, deviceId, { state: 0, });