From 8d9f14e30b28c8c2f0638cc5b1e1d1db6cbc1b37 Mon Sep 17 00:00:00 2001 From: Koen Kanters Date: Wed, 29 Sep 2021 22:00:01 +0200 Subject: [PATCH] Fix device configuring with endpoint ID not working. https://github.com/nurikk/zigbee2mqtt-frontend/issues/874 --- lib/model/device.ts | 4 +++- lib/util/utils.ts | 2 +- test/bridge.test.js | 4 ++-- 3 files changed, 6 insertions(+), 4 deletions(-) diff --git a/lib/model/device.ts b/lib/model/device.ts index fbc17a198..b5a6eef26 100644 --- a/lib/model/device.ts +++ b/lib/model/device.ts @@ -42,7 +42,9 @@ export default class Device { let endpoint: ZHEndpoint; if (key == null) key = 'default'; - if (this.definition?.endpoint) { + if (!isNaN(Number(key))) { + endpoint = this.device.getEndpoint(Number(key)); + } else if (this.definition?.endpoint) { const ID = this.definition?.endpoint?.(this.device)[key]; if (ID) endpoint = this.device.getEndpoint(ID); else if (key === 'default') endpoint = this.device.endpoints[0]; diff --git a/lib/util/utils.ts b/lib/util/utils.ts index 4755b2a83..c49a6deb1 100644 --- a/lib/util/utils.ts +++ b/lib/util/utils.ts @@ -313,7 +313,7 @@ export function isIkeaTradfriDevice(device: ZHDevice): boolean { return [4476].includes(device.manufacturerID); } -const entityIDRegex = new RegExp(`^(.+?)(?:/(${endpointNames.join('|')}))?$`); +const entityIDRegex = new RegExp(`^(.+?)(?:/(${endpointNames.join('|')}|\\d+))?$`); export function parseEntityID(ID: string): {ID: string, endpoint: string} { const match = ID.match(entityIDRegex); return match && {ID: match[1], endpoint: match[2]}; diff --git a/test/bridge.test.js b/test/bridge.test.js index 3beccb268..9f33c2699 100644 --- a/test/bridge.test.js +++ b/test/bridge.test.js @@ -958,7 +958,7 @@ describe('Bridge', () => { endpoint.configureReporting.mockClear(); zigbeeHerdsman.permitJoin.mockClear(); MQTT.publish.mockClear(); - MQTT.events.message('zigbee2mqtt/bridge/request/device/configure_reporting', stringify({id: 'bulb', cluster: 'genLevelCtrl', attribute: 'currentLevel', maximum_report_interval: 10, minimum_report_interval: 1, reportable_change: 1})); + MQTT.events.message('zigbee2mqtt/bridge/request/device/configure_reporting', stringify({id: '0x000b57fffec6a5b2/1', cluster: 'genLevelCtrl', attribute: 'currentLevel', maximum_report_interval: 10, minimum_report_interval: 1, reportable_change: 1})); await flushPromises(); expect(endpoint.bind).toHaveBeenCalledTimes(1); expect(endpoint.bind).toHaveBeenCalledWith('genLevelCtrl', coordinator.endpoints[0]); @@ -966,7 +966,7 @@ describe('Bridge', () => { expect(endpoint.configureReporting).toHaveBeenCalledWith('genLevelCtrl', [{"attribute": "currentLevel", "maximumReportInterval": 10, "minimumReportInterval": 1, "reportableChange": 1}]); expect(MQTT.publish).toHaveBeenCalledWith( 'zigbee2mqtt/bridge/response/device/configure_reporting', - stringify({"data":{id: 'bulb', cluster: 'genLevelCtrl', attribute: 'currentLevel', maximum_report_interval: 10, minimum_report_interval: 1, reportable_change: 1},"status":"ok"}), + stringify({"data":{id: '0x000b57fffec6a5b2/1', cluster: 'genLevelCtrl', attribute: 'currentLevel', maximum_report_interval: 10, minimum_report_interval: 1, reportable_change: 1},"status":"ok"}), {retain: false, qos: 0}, expect.any(Function) ); expect(MQTT.publish).toHaveBeenCalledWith(