From 3bd7e1a60751e285fd5d9745f033acff2154349c Mon Sep 17 00:00:00 2001 From: Ilya Kirov Date: Mon, 23 Sep 2024 19:55:27 +0300 Subject: [PATCH 1/5] sendZclFrameToAll broadcast request --- src/adapter/zboss/adapter/zbossAdapter.ts | 10 ++++++++-- src/adapter/zboss/commands.ts | 2 +- src/adapter/zboss/driver.ts | 23 ++++++++++++++++++++++- 3 files changed, 31 insertions(+), 4 deletions(-) diff --git a/src/adapter/zboss/adapter/zbossAdapter.ts b/src/adapter/zboss/adapter/zbossAdapter.ts index ef42201e99..863fd65b61 100644 --- a/src/adapter/zboss/adapter/zbossAdapter.ts +++ b/src/adapter/zboss/adapter/zbossAdapter.ts @@ -436,8 +436,14 @@ export class ZBOSSAdapter extends Adapter { sourceEndpoint: number, destination: ZSpec.BroadcastAddress, ): Promise { - logger.error(() => `NOT SUPPORTED: sendZclFrameToAll(${endpoint},${JSON.stringify(zclFrame)},${sourceEndpoint},${destination})`, NS); - return; + await this.driver.brequest( + destination, + sourceEndpoint === ZSpec.GP_ENDPOINT && endpoint === ZSpec.GP_ENDPOINT ? ZSpec.GP_PROFILE_ID : ZSpec.HA_PROFILE_ID, + zclFrame.cluster.ID, + endpoint, + sourceEndpoint || 0x01, + zclFrame.toBuffer(), + ); } public async setChannelInterPAN(channel: number): Promise { diff --git a/src/adapter/zboss/commands.ts b/src/adapter/zboss/commands.ts index 044575265c..32acc91ca5 100644 --- a/src/adapter/zboss/commands.ts +++ b/src/adapter/zboss/commands.ts @@ -689,7 +689,7 @@ export const FRAMES: {[key in CommandId]?: ZBOSSFrameDesc} = { request: [ {name: 'paramLength', type: DataType.UINT8}, {name: 'dataLength', type: DataType.UINT16}, - {name: 'ieee', type: DataType.IEEE_ADDR}, + {name: 'addr', type: DataType.IEEE_ADDR}, {name: 'profileID', type: DataType.UINT16}, {name: 'clusterID', type: DataType.UINT16}, //{name: 'dstEndpoint', type: DataType.UINT8, condition: (payload) => ![2,3].includes(payload.dstAddrMode)}, diff --git a/src/adapter/zboss/driver.ts b/src/adapter/zboss/driver.ts index 7d081107b5..6232e81cbb 100644 --- a/src/adapter/zboss/driver.ts +++ b/src/adapter/zboss/driver.ts @@ -10,6 +10,7 @@ import {KeyValue} from '../../controller/tstype'; import {Queue, Waitress} from '../../utils'; import {logger} from '../../utils/logger'; import * as Zdo from '../../zspec/zdo'; +import * as ZSpec from '../../zspec'; import {ZDO_REQ_CLUSTER_ID_TO_ZBOSS_COMMAND_ID} from './commands'; import {CommandId, DeviceType, PolicyType, ResetOptions, StatusCodeGeneric} from './enums'; import {FrameType, makeFrame, ZBOSSFrame} from './frame'; @@ -305,7 +306,7 @@ export class ZBOSSDriver extends EventEmitter { const payload = { paramLength: 21, dataLength: data.length, - ieee: ieee, + addr: ieee, profileID: profileID, clusterID: clusterID, dstEndpoint: dstEp, @@ -321,6 +322,26 @@ export class ZBOSSDriver extends EventEmitter { return await this.execCommand(CommandId.APSDE_DATA_REQ, payload); } + public async brequest(addr: ZSpec.BroadcastAddress, profileID: number, clusterID: number, dstEp: number, srcEp: number, data: Buffer): Promise { + const payload = { + paramLength: 21, + dataLength: data.length, + addr: `0x${addr.toString(16).padStart(16,'0')}`, + profileID: profileID, + clusterID: clusterID, + dstEndpoint: dstEp, + srcEndpoint: srcEp, + radius: 3, + dstAddrMode: 2, // ADDRESS MODE broadcast + txOptions: 2, // ROUTE DISCOVERY + useAlias: 0, + aliasAddr: 0, + aliasSequence: 0, + data: data, + }; + return await this.execCommand(CommandId.APSDE_DATA_REQ, payload); + } + public async requestZdo(clusterId: Zdo.ClusterId, payload: Buffer, disableResponse: boolean): Promise { if (!this.port.portOpen) { throw new Error('Connection not initialized'); From 776ee218f5340414de7abde5faa843ed4974eb09 Mon Sep 17 00:00:00 2001 From: Ilya Kirov Date: Mon, 23 Sep 2024 21:10:59 +0300 Subject: [PATCH 2/5] sendZclFrameToGroup --- src/adapter/zboss/adapter/zbossAdapter.ts | 9 +++++++-- src/adapter/zboss/commands.ts | 6 +++--- src/adapter/zboss/driver.ts | 19 +++++++++++++++++++ src/adapter/zboss/frame.ts | 2 +- 4 files changed, 30 insertions(+), 6 deletions(-) diff --git a/src/adapter/zboss/adapter/zbossAdapter.ts b/src/adapter/zboss/adapter/zbossAdapter.ts index 863fd65b61..087e13638d 100644 --- a/src/adapter/zboss/adapter/zbossAdapter.ts +++ b/src/adapter/zboss/adapter/zbossAdapter.ts @@ -426,8 +426,13 @@ export class ZBOSSAdapter extends Adapter { } public async sendZclFrameToGroup(groupID: number, zclFrame: Zcl.Frame, sourceEndpoint?: number): Promise { - logger.error(() => `NOT SUPPORTED: sendZclFrameToGroup(${groupID},${JSON.stringify(zclFrame)},${sourceEndpoint})`, NS); - return; + await this.driver.grequest( + groupID, + sourceEndpoint === ZSpec.GP_ENDPOINT ? ZSpec.GP_PROFILE_ID : ZSpec.HA_PROFILE_ID, + zclFrame.cluster.ID, + sourceEndpoint || 0x01, + zclFrame.toBuffer(), + ); } public async sendZclFrameToAll( diff --git a/src/adapter/zboss/commands.ts b/src/adapter/zboss/commands.ts index 32acc91ca5..8cd68be071 100644 --- a/src/adapter/zboss/commands.ts +++ b/src/adapter/zboss/commands.ts @@ -692,8 +692,8 @@ export const FRAMES: {[key in CommandId]?: ZBOSSFrameDesc} = { {name: 'addr', type: DataType.IEEE_ADDR}, {name: 'profileID', type: DataType.UINT16}, {name: 'clusterID', type: DataType.UINT16}, - //{name: 'dstEndpoint', type: DataType.UINT8, condition: (payload) => ![2,3].includes(payload.dstAddrMode)}, - {name: 'dstEndpoint', type: DataType.UINT8}, + {name: 'dstEndpoint', type: DataType.UINT8, condition: (payload) => [2, 3].includes(payload.dstAddrMode)}, + //{name: 'dstEndpoint', type: DataType.UINT8}, {name: 'srcEndpoint', type: DataType.UINT8}, {name: 'radius', type: DataType.UINT8}, {name: 'dstAddrMode', type: DataType.UINT8}, @@ -707,7 +707,7 @@ export const FRAMES: {[key in CommandId]?: ZBOSSFrameDesc} = { response: [ ...commonResponse, {name: 'ieee', type: DataType.IEEE_ADDR}, - {name: 'dstEndpoint', type: DataType.UINT8, condition: (payload) => ![2, 3].includes(payload.dstAddrMode)}, + {name: 'dstEndpoint', type: DataType.UINT8, condition: (payload) => [2, 3].includes(payload.dstAddrMode)}, {name: 'srcEndpoint', type: DataType.UINT8}, {name: 'txTime', type: DataType.UINT32}, {name: 'dstAddrMode', type: DataType.UINT8}, diff --git a/src/adapter/zboss/driver.ts b/src/adapter/zboss/driver.ts index 6232e81cbb..7e776efdcc 100644 --- a/src/adapter/zboss/driver.ts +++ b/src/adapter/zboss/driver.ts @@ -342,6 +342,25 @@ export class ZBOSSDriver extends EventEmitter { return await this.execCommand(CommandId.APSDE_DATA_REQ, payload); } + public async grequest(group: number, profileID: number, clusterID: number, srcEp: number, data: Buffer): Promise { + const payload = { + paramLength: 20, + dataLength: data.length, + addr: `0x${group.toString(16).padStart(16,'0')}`, + profileID: profileID, + clusterID: clusterID, + srcEndpoint: srcEp, + radius: 3, + dstAddrMode: 1, // ADDRESS MODE group + txOptions: 2, // ROUTE DISCOVERY + useAlias: 0, + aliasAddr: 0, + aliasSequence: 0, + data: data, + }; + return await this.execCommand(CommandId.APSDE_DATA_REQ, payload); + } + public async requestZdo(clusterId: Zdo.ClusterId, payload: Buffer, disableResponse: boolean): Promise { if (!this.port.portOpen) { throw new Error('Connection not initialized'); diff --git a/src/adapter/zboss/frame.ts b/src/adapter/zboss/frame.ts index b44e5b7b76..aafc154993 100644 --- a/src/adapter/zboss/frame.ts +++ b/src/adapter/zboss/frame.ts @@ -200,7 +200,7 @@ export function makeFrame(type: FrameType, commandId: CommandId, params: KeyValu for (const parameter of frameDesc) { // const options: BuffaloZclOptions = {payload}; - if (parameter.condition && !parameter.condition(payload, undefined)) { + if (parameter.condition && !parameter.condition(params, undefined)) { continue; } From cedbb330c3f4736f0e2e416c297ba726e0ff26f9 Mon Sep 17 00:00:00 2001 From: Ilya Kirov Date: Mon, 23 Sep 2024 21:19:16 +0300 Subject: [PATCH 3/5] lint --- src/adapter/zboss/driver.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/adapter/zboss/driver.ts b/src/adapter/zboss/driver.ts index 7e776efdcc..31885adec6 100644 --- a/src/adapter/zboss/driver.ts +++ b/src/adapter/zboss/driver.ts @@ -326,7 +326,7 @@ export class ZBOSSDriver extends EventEmitter { const payload = { paramLength: 21, dataLength: data.length, - addr: `0x${addr.toString(16).padStart(16,'0')}`, + addr: `0x${addr.toString(16).padStart(16, '0')}`, profileID: profileID, clusterID: clusterID, dstEndpoint: dstEp, @@ -346,7 +346,7 @@ export class ZBOSSDriver extends EventEmitter { const payload = { paramLength: 20, dataLength: data.length, - addr: `0x${group.toString(16).padStart(16,'0')}`, + addr: `0x${group.toString(16).padStart(16, '0')}`, profileID: profileID, clusterID: clusterID, srcEndpoint: srcEp, From bbbe0c796c87f22f00049d940eb962a053bbbd63 Mon Sep 17 00:00:00 2001 From: Ilya Kirov Date: Mon, 23 Sep 2024 21:23:59 +0300 Subject: [PATCH 4/5] lint --- src/adapter/zboss/driver.ts | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/src/adapter/zboss/driver.ts b/src/adapter/zboss/driver.ts index 31885adec6..e0b5ac4e94 100644 --- a/src/adapter/zboss/driver.ts +++ b/src/adapter/zboss/driver.ts @@ -9,8 +9,8 @@ import {TsType} from '..'; import {KeyValue} from '../../controller/tstype'; import {Queue, Waitress} from '../../utils'; import {logger} from '../../utils/logger'; -import * as Zdo from '../../zspec/zdo'; import * as ZSpec from '../../zspec'; +import * as Zdo from '../../zspec/zdo'; import {ZDO_REQ_CLUSTER_ID_TO_ZBOSS_COMMAND_ID} from './commands'; import {CommandId, DeviceType, PolicyType, ResetOptions, StatusCodeGeneric} from './enums'; import {FrameType, makeFrame, ZBOSSFrame} from './frame'; @@ -322,7 +322,14 @@ export class ZBOSSDriver extends EventEmitter { return await this.execCommand(CommandId.APSDE_DATA_REQ, payload); } - public async brequest(addr: ZSpec.BroadcastAddress, profileID: number, clusterID: number, dstEp: number, srcEp: number, data: Buffer): Promise { + public async brequest( + addr: ZSpec.BroadcastAddress, + profileID: number, + clusterID: number, + dstEp: number, + srcEp: number, + data: Buffer, + ): Promise { const payload = { paramLength: 21, dataLength: data.length, From fb2c4e027b9b47ce48b2b104e351122718f0d6c2 Mon Sep 17 00:00:00 2001 From: Ilya Kirov Date: Mon, 23 Sep 2024 21:26:26 +0300 Subject: [PATCH 5/5] lint --- src/adapter/zboss/driver.ts | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/src/adapter/zboss/driver.ts b/src/adapter/zboss/driver.ts index e0b5ac4e94..8044815c5e 100644 --- a/src/adapter/zboss/driver.ts +++ b/src/adapter/zboss/driver.ts @@ -323,13 +323,13 @@ export class ZBOSSDriver extends EventEmitter { } public async brequest( - addr: ZSpec.BroadcastAddress, - profileID: number, - clusterID: number, - dstEp: number, - srcEp: number, - data: Buffer, - ): Promise { + addr: ZSpec.BroadcastAddress, + profileID: number, + clusterID: number, + dstEp: number, + srcEp: number, + data: Buffer, + ): Promise { const payload = { paramLength: 21, dataLength: data.length,