diff --git a/plejd/MqttClient.js b/plejd/MqttClient.js index af79c03..5ad8a1d 100644 --- a/plejd/MqttClient.js +++ b/plejd/MqttClient.js @@ -13,10 +13,8 @@ const logger = Logger.getLogger('plejd-mqtt'); const discoveryPrefix = 'homeassistant'; const nodeId = 'plejd'; -const getMqttUniqueId = (/** @type {string} */ uniqueId) => `${nodeId}.${uniqueId}`; - const getSubscribePath = () => `${discoveryPrefix}/+/${nodeId}/#`; -const getBaseTopic = (/** @type {{ uniqueId: string; type: string; }} */ plug) => `${discoveryPrefix}/${plug.type}/${nodeId}/${getMqttUniqueId(plug.uniqueId)}`; +const getBaseTopic = (/** @type {{ uniqueId: string; type: string; }} */ plug) => `${discoveryPrefix}/${plug.type}/${nodeId}/${plug.uniqueId}`; const getTopicName = ( /** @type {{ uniqueId: string; type: string; }} */ plug, @@ -48,7 +46,7 @@ const getLightDiscoveryPayload = ( ) => ({ schema: 'json', name: device.name, - unique_id: getMqttUniqueId(device.uniqueId), + unique_id: device.uniqueId, '~': getBaseTopic(device), state_topic: `~/${TOPICS.STATE}`, command_topic: `~/${TOPICS.COMMAND}`, diff --git a/plejd/PlejdApi.js b/plejd/PlejdApi.js index 01616c0..91d078a 100644 --- a/plejd/PlejdApi.js +++ b/plejd/PlejdApi.js @@ -320,6 +320,16 @@ class PlejdApi { (x) => x.deviceParseId === device.objectId, ); + if (!outputSettings) { + logger.verbose( + `No outputSettings found for ${device.title} (${device.deviceId}), assuming output 0`, + ); + } + + const bleOutputAddress = this.siteDetails.outputAddress[device.deviceId][ + outputSettings ? outputSettings.output : 0 + ]; + if (device.traits === TRAITS.NO_LOAD) { logger.warn( `Device ${device.title} (${device.deviceId}) has no load configured and will be excluded`, @@ -330,10 +340,6 @@ class PlejdApi { outputSettings.output, ); - const bleOutputAddress = this.siteDetails.outputAddress[device.deviceId][ - outputSettings.output - ]; - const plejdDevice = this.siteDetails.plejdDevices.find( (x) => x.deviceId === device.deviceId, ); @@ -361,13 +367,6 @@ class PlejdApi { }; this.deviceRegistry.addOutputDevice(outputDevice); - } else { - logger.warn( - `No outputSettings found for ${device.title} (${device.deviceId}), device will not be included`, - ); - logger.verbose( - 'Fallback cound potentially be implemented by assuming default deviceSettings[deviceId]', - ); } // What should we do with inputs?! diff --git a/plejd/PlejdBLEHandler.js b/plejd/PlejdBLEHandler.js index 2bb062b..1ea20ad 100644 --- a/plejd/PlejdBLEHandler.js +++ b/plejd/PlejdBLEHandler.js @@ -154,21 +154,26 @@ class PlejBLEHandler extends EventEmitter { logger.info('BLE init done, waiting for devices.'); } - async sendCommand(command, uniqueOutputId, data) { + /** + * @param {string} command + * @param {number} bleOutputAddress + * @param {number} data + */ + async sendCommand(command, bleOutputAddress, data) { let payload; let brightnessVal; switch (command) { case COMMANDS.TURN_ON: - payload = this._createHexPayload(uniqueOutputId, BLE_CMD_STATE_CHANGE, '01'); + payload = this._createHexPayload(bleOutputAddress, BLE_CMD_STATE_CHANGE, '01'); break; case COMMANDS.TURN_OFF: - payload = this._createHexPayload(uniqueOutputId, BLE_CMD_STATE_CHANGE, '00'); + payload = this._createHexPayload(bleOutputAddress, BLE_CMD_STATE_CHANGE, '00'); break; case COMMANDS.DIM: // eslint-disable-next-line no-bitwise brightnessVal = (data << 8) | data; payload = this._createHexPayload( - uniqueOutputId, + bleOutputAddress, BLE_CMD_DIM2_CHANGE, `01${brightnessVal.toString(16).padStart(4, '0')}`, ); @@ -820,7 +825,9 @@ class PlejBLEHandler extends EventEmitter { // decoded.toString() could potentially be expensive logger.verbose(`Raw event received: ${decoded.toString('hex')}`); logger.verbose( - `Decoded: Device ${outputUniqueId}, cmd ${cmd.toString(16)}, state ${state}, dim ${dim}`, + `Decoded: Device ${outputUniqueId} (BLE address ${bleOutputAddress}), cmd ${cmd.toString( + 16, + )}, state ${state}, dim ${dim}`, ); } diff --git a/plejd/PlejdDeviceCommunication.js b/plejd/PlejdDeviceCommunication.js index 3c4431b..4321f94 100644 --- a/plejd/PlejdDeviceCommunication.js +++ b/plejd/PlejdDeviceCommunication.js @@ -255,9 +255,10 @@ class PlejdDeviceCommunication extends EventEmitter { return; } const queueItem = this.writeQueue.pop(); - const deviceName = this.deviceRegistry.getOutputDeviceName(queueItem.uniqueOutputId); + const device = this.deviceRegistry.getOutputDevice(queueItem.uniqueOutputId); + logger.debug( - `Write queue: Processing ${deviceName} (${queueItem.uniqueOutputId}). Command ${ + `Write queue: Processing ${device.name} (${queueItem.uniqueOutputId}). Command ${ queueItem.command }${queueItem.data ? ` ${queueItem.data}` : ''}. Total queue length: ${ this.writeQueue.length @@ -266,7 +267,7 @@ class PlejdDeviceCommunication extends EventEmitter { if (this.writeQueue.some((item) => item.uniqueOutputId === queueItem.uniqueOutputId)) { logger.verbose( - `Skipping ${deviceName} (${queueItem.uniqueOutputId}) ` + `Skipping ${device.name} (${queueItem.uniqueOutputId}) ` + `${queueItem.command} due to more recent command in queue.`, ); // Skip commands if new ones exist for the same uniqueOutputId @@ -276,7 +277,7 @@ class PlejdDeviceCommunication extends EventEmitter { try { await this.plejdBleHandler.sendCommand( queueItem.command, - queueItem.uniqueOutputId, + device.bleOutputAddress, queueItem.data, ); } catch (err) { @@ -287,7 +288,7 @@ class PlejdDeviceCommunication extends EventEmitter { this.writeQueue.push(queueItem); // Add back to top of queue to be processed next; } else { logger.error( - `Write queue: Exceeed max retry count (${MAX_RETRY_COUNT}) for ${deviceName} (${queueItem.uniqueOutputId}). Command ${queueItem.command} failed.`, + `Write queue: Exceeed max retry count (${MAX_RETRY_COUNT}) for ${device.name} (${queueItem.uniqueOutputId}). Command ${queueItem.command} failed.`, ); break; }