From ef718cf1dbf7f0b92fe68a910452ac8437044b54 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Victor=20Hagelb=C3=A4ck?= Date: Wed, 31 Mar 2021 19:57:25 +0200 Subject: [PATCH] Add physical devices to DeviceRegistry to allow for serial number lookup during BLE startup --- plejd/DeviceRegistry.js | 88 +++++++++++++++++++++++++++++++++-------- 1 file changed, 71 insertions(+), 17 deletions(-) diff --git a/plejd/DeviceRegistry.js b/plejd/DeviceRegistry.js index e1fb753..5ea12ba 100644 --- a/plejd/DeviceRegistry.js +++ b/plejd/DeviceRegistry.js @@ -5,18 +5,25 @@ class DeviceRegistry { /** @type {string} */ cryptoKey = null; - outputDeviceIdByRoomId = {}; - outputDeviceIdByBLEIndex = {}; + /** @private @type {Object.} */ + devices = {}; + /** @private */ + outputDeviceUniqueIdsByRoomId = {}; + /** @private */ + outputUniqueIdByBleOutputAddress = {}; + + /** @private @type {import('./types/ApiSite').ApiSite} */ + apiSite; // Dictionaries of [id]: device per type - /** @type {import('types/DeviceRegistry').OutputDevices} */ + /** @private @type {import('types/DeviceRegistry').OutputDevices} */ outputDevices = {}; - /** @type {import('types/DeviceRegistry').OutputDevices} */ + /** @private @type {import('types/DeviceRegistry').OutputDevices} */ sceneDevices = {}; - // eslint-disable-next-line class-methods-use-this - getUniqueOutputId(deviceId, outputIndex) { - return `${deviceId}_${outputIndex}`; + /** @param device {import('./types/ApiSite').Device} */ + addPhysicalDevice(device) { + this.devices[device.deviceId] = device; } /** @param outputDevice {import('types/DeviceRegistry').OutputDevice} */ @@ -32,19 +39,19 @@ class DeviceRegistry { } output devices in total.`, ); - this.outputDeviceIdByBLEIndex[outputDevice.bleDeviceIndex] = outputDevice.uniqueId; + this.outputUniqueIdByBleOutputAddress[outputDevice.bleOutputAddress] = outputDevice.uniqueId; - if (!this.outputDeviceIdByRoomId[outputDevice.roomId]) { - this.outputDeviceIdByRoomId[outputDevice.roomId] = []; + if (!this.outputDeviceUniqueIdsByRoomId[outputDevice.roomId]) { + this.outputDeviceUniqueIdsByRoomId[outputDevice.roomId] = []; } if ( - outputDevice.roomId !== outputDevice.uniqueId - && !this.outputDeviceIdByRoomId[outputDevice.roomId].includes(outputDevice.roomId) + outputDevice.roomId !== outputDevice.uniqueId && + !this.outputDeviceUniqueIdsByRoomId[outputDevice.roomId].includes(outputDevice.uniqueId) ) { - this.outputDeviceIdByRoomId[outputDevice.roomId].push(outputDevice.roomId); + this.outputDeviceUniqueIdsByRoomId[outputDevice.roomId].push(outputDevice.uniqueId); logger.verbose( `Added device to room ${outputDevice.roomId}: ${JSON.stringify( - this.outputDeviceIdByRoomId[outputDevice.roomId], + this.outputDeviceUniqueIdsByRoomId[outputDevice.roomId], )}`, ); } @@ -70,28 +77,64 @@ class DeviceRegistry { } clearPlejdDevices() { + this.devices = {}; this.outputDevices = {}; - this.outputDeviceIdByRoomId = {}; - this.deviceIdsBySerial = {}; + this.outputDeviceUniqueIdsByRoomId = {}; + this.outputUniqueIdByBleOutputAddress = {}; } clearSceneDevices() { this.sceneDevices = {}; } + /** + * @returns {import('./types/DeviceRegistry').OutputDevice[]} + */ + getAllOutputDevices() { + return Object.values(this.outputDevices); + } + + /** + * @returns {import('./types/DeviceRegistry').OutputDevice[]} + */ + getAllSceneDevices() { + return Object.values(this.sceneDevices); + } + + /** @returns {import('./types/ApiSite').ApiSite} */ + getApiSite() { + return this.apiSite; + } + + /** + * @param {string} uniqueOutputId + */ getOutputDevice(uniqueOutputId) { return this.outputDevices[uniqueOutputId]; } + /** @returns {import('./types/DeviceRegistry').OutputDevice} */ + getOutputDeviceByBleOutputAddress(bleOutputAddress) { + return this.outputDevices[this.outputUniqueIdByBleOutputAddress[bleOutputAddress]]; + } + /** @returns {string[]} */ getOutputDeviceIdsByRoomId(roomId) { - return this.outputDeviceIdByRoomId[roomId]; + return this.outputDeviceUniqueIdsByRoomId[roomId]; } getOutputDeviceName(uniqueOutputId) { return (this.outputDevices[uniqueOutputId] || {}).name; } + /** + * @param {string } deviceId The physical device serial number + * @return {import('./types/ApiSite').Device} + */ + getPhysicalDevice(deviceId) { + return this.devices[deviceId]; + } + getScene(sceneId) { return this.sceneDevices[sceneId]; } @@ -100,6 +143,17 @@ class DeviceRegistry { return (this.sceneDevices[sceneId] || {}).name; } + // eslint-disable-next-line class-methods-use-this + getUniqueOutputId(deviceId, outputIndex) { + return `${deviceId}_${outputIndex}`; + } + + /** @param apiSite {import('./types/ApiSite').ApiSite} */ + setApiSite(apiSite) { + this.apiSite = apiSite; + this.cryptoKey = apiSite.plejdMesh.cryptoKey; + } + /** * @param {string} uniqueOutputId * @param {boolean} state