zigbee-herdsman 1.0.1 → 2.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.release-please-manifest.json +1 -1
- package/CHANGELOG.md +23 -0
- package/dist/adapter/adapter.d.ts +8 -12
- package/dist/adapter/adapter.d.ts.map +1 -1
- package/dist/adapter/adapter.js +3 -0
- package/dist/adapter/adapter.js.map +1 -1
- package/dist/adapter/deconz/adapter/deconzAdapter.d.ts +7 -15
- package/dist/adapter/deconz/adapter/deconzAdapter.d.ts.map +1 -1
- package/dist/adapter/deconz/adapter/deconzAdapter.js +154 -693
- package/dist/adapter/deconz/adapter/deconzAdapter.js.map +1 -1
- package/dist/adapter/deconz/driver/constants.d.ts +102 -56
- package/dist/adapter/deconz/driver/constants.d.ts.map +1 -1
- package/dist/adapter/deconz/driver/constants.js +1 -2
- package/dist/adapter/deconz/driver/constants.js.map +1 -1
- package/dist/adapter/deconz/driver/driver.d.ts.map +1 -1
- package/dist/adapter/deconz/driver/driver.js +46 -41
- package/dist/adapter/deconz/driver/driver.js.map +1 -1
- package/dist/adapter/deconz/driver/frameParser.d.ts.map +1 -1
- package/dist/adapter/deconz/driver/frameParser.js +174 -107
- package/dist/adapter/deconz/driver/frameParser.js.map +1 -1
- package/dist/adapter/ember/adapter/emberAdapter.d.ts +5 -22
- package/dist/adapter/ember/adapter/emberAdapter.d.ts.map +1 -1
- package/dist/adapter/ember/adapter/emberAdapter.js +92 -325
- package/dist/adapter/ember/adapter/emberAdapter.js.map +1 -1
- package/dist/adapter/ember/adapter/oneWaitress.d.ts +17 -14
- package/dist/adapter/ember/adapter/oneWaitress.d.ts.map +1 -1
- package/dist/adapter/ember/adapter/oneWaitress.js +16 -42
- package/dist/adapter/ember/adapter/oneWaitress.js.map +1 -1
- package/dist/adapter/events.d.ts +1 -9
- package/dist/adapter/events.d.ts.map +1 -1
- package/dist/adapter/ezsp/adapter/ezspAdapter.d.ts +12 -19
- package/dist/adapter/ezsp/adapter/ezspAdapter.d.ts.map +1 -1
- package/dist/adapter/ezsp/adapter/ezspAdapter.js +90 -272
- package/dist/adapter/ezsp/adapter/ezspAdapter.js.map +1 -1
- package/dist/adapter/ezsp/driver/driver.d.ts +6 -14
- package/dist/adapter/ezsp/driver/driver.d.ts.map +1 -1
- package/dist/adapter/ezsp/driver/driver.js +56 -37
- package/dist/adapter/ezsp/driver/driver.js.map +1 -1
- package/dist/adapter/ezsp/driver/ezsp.d.ts.map +1 -1
- package/dist/adapter/ezsp/driver/ezsp.js +3 -0
- package/dist/adapter/ezsp/driver/ezsp.js.map +1 -1
- package/dist/adapter/tstype.d.ts +1 -27
- package/dist/adapter/tstype.d.ts.map +1 -1
- package/dist/adapter/z-stack/adapter/manager.d.ts.map +1 -1
- package/dist/adapter/z-stack/adapter/manager.js +20 -10
- package/dist/adapter/z-stack/adapter/manager.js.map +1 -1
- package/dist/adapter/z-stack/adapter/zStackAdapter.d.ts +7 -15
- package/dist/adapter/z-stack/adapter/zStackAdapter.d.ts.map +1 -1
- package/dist/adapter/z-stack/adapter/zStackAdapter.js +128 -253
- package/dist/adapter/z-stack/adapter/zStackAdapter.js.map +1 -1
- package/dist/adapter/z-stack/znp/definition.d.ts.map +1 -1
- package/dist/adapter/z-stack/znp/definition.js +256 -302
- package/dist/adapter/z-stack/znp/definition.js.map +1 -1
- package/dist/adapter/z-stack/znp/tstype.d.ts +8 -8
- package/dist/adapter/z-stack/znp/tstype.d.ts.map +1 -1
- package/dist/adapter/z-stack/znp/utils.d.ts +3 -2
- package/dist/adapter/z-stack/znp/utils.d.ts.map +1 -1
- package/dist/adapter/z-stack/znp/utils.js +8 -7
- package/dist/adapter/z-stack/znp/utils.js.map +1 -1
- package/dist/adapter/z-stack/znp/znp.d.ts +3 -1
- package/dist/adapter/z-stack/znp/znp.d.ts.map +1 -1
- package/dist/adapter/z-stack/znp/znp.js +31 -14
- package/dist/adapter/z-stack/znp/znp.js.map +1 -1
- package/dist/adapter/z-stack/znp/zpiObject.d.ts +5 -6
- package/dist/adapter/z-stack/znp/zpiObject.d.ts.map +1 -1
- package/dist/adapter/z-stack/znp/zpiObject.js +28 -11
- package/dist/adapter/z-stack/znp/zpiObject.js.map +1 -1
- package/dist/adapter/zboss/adapter/zbossAdapter.d.ts +8 -16
- package/dist/adapter/zboss/adapter/zbossAdapter.d.ts.map +1 -1
- package/dist/adapter/zboss/adapter/zbossAdapter.js +124 -162
- package/dist/adapter/zboss/adapter/zbossAdapter.js.map +1 -1
- package/dist/adapter/zboss/commands.d.ts +3 -0
- package/dist/adapter/zboss/commands.d.ts.map +1 -1
- package/dist/adapter/zboss/commands.js +248 -205
- package/dist/adapter/zboss/commands.js.map +1 -1
- package/dist/adapter/zboss/driver.d.ts +4 -14
- package/dist/adapter/zboss/driver.d.ts.map +1 -1
- package/dist/adapter/zboss/driver.js +63 -89
- package/dist/adapter/zboss/driver.js.map +1 -1
- package/dist/adapter/zboss/enums.d.ts +24 -2
- package/dist/adapter/zboss/enums.d.ts.map +1 -1
- package/dist/adapter/zboss/enums.js +35 -3
- package/dist/adapter/zboss/enums.js.map +1 -1
- package/dist/adapter/zboss/frame.d.ts +6 -1
- package/dist/adapter/zboss/frame.d.ts.map +1 -1
- package/dist/adapter/zboss/frame.js +56 -11
- package/dist/adapter/zboss/frame.js.map +1 -1
- package/dist/adapter/zboss/uart.d.ts +1 -0
- package/dist/adapter/zboss/uart.d.ts.map +1 -1
- package/dist/adapter/zboss/uart.js +4 -2
- package/dist/adapter/zboss/uart.js.map +1 -1
- package/dist/adapter/zigate/adapter/patchZdoBuffaloBE.d.ts +5 -0
- package/dist/adapter/zigate/adapter/patchZdoBuffaloBE.d.ts.map +1 -0
- package/dist/adapter/zigate/adapter/patchZdoBuffaloBE.js +44 -0
- package/dist/adapter/zigate/adapter/patchZdoBuffaloBE.js.map +1 -0
- package/dist/adapter/zigate/adapter/zigateAdapter.d.ts +6 -10
- package/dist/adapter/zigate/adapter/zigateAdapter.d.ts.map +1 -1
- package/dist/adapter/zigate/adapter/zigateAdapter.js +99 -289
- package/dist/adapter/zigate/adapter/zigateAdapter.js.map +1 -1
- package/dist/adapter/zigate/driver/buffaloZiGate.d.ts.map +1 -1
- package/dist/adapter/zigate/driver/buffaloZiGate.js +2 -18
- package/dist/adapter/zigate/driver/buffaloZiGate.js.map +1 -1
- package/dist/adapter/zigate/driver/commandType.js +218 -218
- package/dist/adapter/zigate/driver/commandType.js.map +1 -1
- package/dist/adapter/zigate/driver/constants.d.ts +14 -8
- package/dist/adapter/zigate/driver/constants.d.ts.map +1 -1
- package/dist/adapter/zigate/driver/constants.js +36 -9
- package/dist/adapter/zigate/driver/constants.js.map +1 -1
- package/dist/adapter/zigate/driver/messageType.js +42 -42
- package/dist/adapter/zigate/driver/messageType.js.map +1 -1
- package/dist/adapter/zigate/driver/zigate.d.ts +17 -13
- package/dist/adapter/zigate/driver/zigate.d.ts.map +1 -1
- package/dist/adapter/zigate/driver/zigate.js +83 -18
- package/dist/adapter/zigate/driver/zigate.js.map +1 -1
- package/dist/controller/controller.d.ts +5 -0
- package/dist/controller/controller.d.ts.map +1 -1
- package/dist/controller/controller.js +143 -37
- package/dist/controller/controller.js.map +1 -1
- package/dist/controller/greenPower.js +3 -3
- package/dist/controller/greenPower.js.map +1 -1
- package/dist/controller/model/device.d.ts +8 -7
- package/dist/controller/model/device.d.ts.map +1 -1
- package/dist/controller/model/device.js +176 -72
- package/dist/controller/model/device.js.map +1 -1
- package/dist/controller/model/endpoint.d.ts +1 -0
- package/dist/controller/model/endpoint.d.ts.map +1 -1
- package/dist/controller/model/endpoint.js +27 -4
- package/dist/controller/model/endpoint.js.map +1 -1
- package/dist/zspec/zdo/buffaloZdo.d.ts +1 -139
- package/dist/zspec/zdo/buffaloZdo.d.ts.map +1 -1
- package/dist/zspec/zdo/buffaloZdo.js.map +1 -1
- package/dist/zspec/zdo/definition/tstypes.d.ts +168 -1
- package/dist/zspec/zdo/definition/tstypes.d.ts.map +1 -1
- package/dist/zspec/zdo/definition/tstypes.js +1 -0
- package/dist/zspec/zdo/definition/tstypes.js.map +1 -1
- package/dist/zspec/zdo/utils.d.ts +2 -3
- package/dist/zspec/zdo/utils.d.ts.map +1 -1
- package/dist/zspec/zdo/utils.js +3 -4
- package/dist/zspec/zdo/utils.js.map +1 -1
- package/package.json +5 -4
|
@@ -3,6 +3,8 @@ import { Backup } from '../../../models';
|
|
|
3
3
|
import * as ZSpec from '../../../zspec';
|
|
4
4
|
import { EUI64, ExtendedPanId, PanId } from '../../../zspec/tstypes';
|
|
5
5
|
import * as Zcl from '../../../zspec/zcl';
|
|
6
|
+
import * as Zdo from '../../../zspec/zdo';
|
|
7
|
+
import * as ZdoTypes from '../../../zspec/zdo/definition/tstypes';
|
|
6
8
|
import { ZclPayload } from '../../events';
|
|
7
9
|
import { IEEE802154CcaMode } from '../enums';
|
|
8
10
|
import { EmberKeyData, EmberNetworkParameters } from '../types';
|
|
@@ -318,29 +320,16 @@ export declare class EmberAdapter extends Adapter {
|
|
|
318
320
|
* @return uint8_t The next device request sequence number
|
|
319
321
|
*/
|
|
320
322
|
private nextZDORequestSequence;
|
|
321
|
-
/**
|
|
322
|
-
* ZDO
|
|
323
|
-
*
|
|
324
|
-
* @param destination
|
|
325
|
-
* @param clusterId uint16_t
|
|
326
|
-
* @param messageContents Content of the ZDO request (sequence to be assigned at index zero)
|
|
327
|
-
* @param options
|
|
328
|
-
* @returns status Indicates success or failure (with reason) of send
|
|
329
|
-
* @returns apsFrame The APS Frame resulting of the request being built and sent (`sequence` set from stack-given value).
|
|
330
|
-
* @returns messageTag The tag passed to ezspSend${x} function.
|
|
331
|
-
*/
|
|
332
|
-
private sendZDORequest;
|
|
333
323
|
static isValidPath(path: string): Promise<boolean>;
|
|
334
324
|
static autoDetectPath(): Promise<string | undefined>;
|
|
335
325
|
start(): Promise<TsType.StartResult>;
|
|
336
326
|
stop(): Promise<void>;
|
|
337
|
-
|
|
327
|
+
getCoordinatorIEEE(): Promise<string>;
|
|
338
328
|
getCoordinatorVersion(): Promise<TsType.CoordinatorVersion>;
|
|
339
329
|
reset(type: 'soft' | 'hard'): Promise<void>;
|
|
340
330
|
supportsBackup(): Promise<boolean>;
|
|
341
331
|
backup(ieeeAddressesInDatabase: string[]): Promise<Backup>;
|
|
342
332
|
getNetworkParameters(): Promise<TsType.NetworkParameters>;
|
|
343
|
-
changeChannel(newChannel: number): Promise<void>;
|
|
344
333
|
setTransmitPower(value: number): Promise<void>;
|
|
345
334
|
addInstallCode(ieeeAddress: string, key: Buffer): Promise<void>;
|
|
346
335
|
/** WARNING: Adapter impl. Starts timer immediately upon returning */
|
|
@@ -348,15 +337,9 @@ export declare class EmberAdapter extends Adapter {
|
|
|
348
337
|
promise: Promise<ZclPayload>;
|
|
349
338
|
cancel: () => void;
|
|
350
339
|
};
|
|
340
|
+
sendZdo(ieeeAddress: string, networkAddress: number, clusterId: Zdo.ClusterId, payload: Buffer, disableResponse: true): Promise<void>;
|
|
341
|
+
sendZdo<K extends keyof ZdoTypes.RequestToResponseMap>(ieeeAddress: string, networkAddress: number, clusterId: K, payload: Buffer, disableResponse: false): Promise<ZdoTypes.RequestToResponseMap[K]>;
|
|
351
342
|
permitJoin(seconds: number, networkAddress?: number): Promise<void>;
|
|
352
|
-
lqi(networkAddress: number): Promise<TsType.LQI>;
|
|
353
|
-
routingTable(networkAddress: number): Promise<TsType.RoutingTable>;
|
|
354
|
-
nodeDescriptor(networkAddress: number): Promise<TsType.NodeDescriptor>;
|
|
355
|
-
activeEndpoints(networkAddress: number): Promise<TsType.ActiveEndpoints>;
|
|
356
|
-
simpleDescriptor(networkAddress: number, endpointID: number): Promise<TsType.SimpleDescriptor>;
|
|
357
|
-
bind(destinationNetworkAddress: number, sourceIeeeAddress: string, sourceEndpoint: number, clusterID: number, destinationAddressOrGroup: string | number, type: 'endpoint' | 'group', destinationEndpoint?: number): Promise<void>;
|
|
358
|
-
unbind(destinationNetworkAddress: number, sourceIeeeAddress: string, sourceEndpoint: number, clusterID: number, destinationAddressOrGroup: string | number, type: 'endpoint' | 'group', destinationEndpoint?: number): Promise<void>;
|
|
359
|
-
removeDevice(networkAddress: number, ieeeAddr: string): Promise<void>;
|
|
360
343
|
sendZclFrameToEndpoint(ieeeAddr: string, networkAddress: number, endpoint: number, zclFrame: Zcl.Frame, timeout: number, disableResponse: boolean, disableRecovery: boolean, sourceEndpoint?: number): Promise<ZclPayload | void>;
|
|
361
344
|
sendZclFrameToGroup(groupID: number, zclFrame: Zcl.Frame, sourceEndpoint?: number): Promise<void>;
|
|
362
345
|
sendZclFrameToAll(endpoint: number, zclFrame: Zcl.Frame, sourceEndpoint: number, destination: ZSpec.BroadcastAddress): Promise<void>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"emberAdapter.d.ts","sourceRoot":"","sources":["../../../../src/adapter/ember/adapter/emberAdapter.ts"],"names":[],"mappings":"AAMA,OAAO,EAAC,OAAO,EAAE,MAAM,EAAC,MAAM,OAAO,CAAC;AACtC,OAAO,EAAC,MAAM,EAAuB,MAAM,iBAAiB,CAAC;AAG7D,OAAO,KAAK,KAAK,MAAM,gBAAgB,CAAC;AACxC,OAAO,EAAC,KAAK,EAAE,aAAa,EAAU,KAAK,EAAC,MAAM,wBAAwB,CAAC;AAC3E,OAAO,KAAK,GAAG,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"emberAdapter.d.ts","sourceRoot":"","sources":["../../../../src/adapter/ember/adapter/emberAdapter.ts"],"names":[],"mappings":"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"}
|
|
@@ -80,8 +80,6 @@ const autoDetectDefinitions = [
|
|
|
80
80
|
const APPLICATION_ZDO_SEQUENCE_MASK = 0x7f;
|
|
81
81
|
/* Default radius used for broadcast ZDO requests. uint8_t */
|
|
82
82
|
const ZDO_REQUEST_RADIUS = 0xff;
|
|
83
|
-
/** Current revision of the spec by zigbee alliance supported by Z2M. */
|
|
84
|
-
const CURRENT_ZIGBEE_SPEC_REVISION = 22;
|
|
85
83
|
/** Oldest supported EZSP version for backups. Don't take the risk to restore a broken network until older backup versions can be investigated. */
|
|
86
84
|
const BACKUP_OLDEST_SUPPORTED_EZSP_VERSION = 12;
|
|
87
85
|
/**
|
|
@@ -169,6 +167,8 @@ class EmberAdapter extends __1.Adapter {
|
|
|
169
167
|
multicastTable;
|
|
170
168
|
constructor(networkOptions, serialPortOptions, backupPath, adapterOptions) {
|
|
171
169
|
super(networkOptions, serialPortOptions, backupPath, adapterOptions);
|
|
170
|
+
this.hasZdoMessageOverhead = true;
|
|
171
|
+
this.manufacturerID = Zcl.ManufacturerCode.SILICON_LABORATORIES;
|
|
172
172
|
this.version = {
|
|
173
173
|
ezsp: 0,
|
|
174
174
|
revision: 'unknown',
|
|
@@ -287,7 +287,6 @@ class EmberAdapter extends __1.Adapter {
|
|
|
287
287
|
break;
|
|
288
288
|
}
|
|
289
289
|
case enums_1.SLStatus.ZIGBEE_CHANNEL_CHANGED: {
|
|
290
|
-
this.oneWaitress.resolveEvent(oneWaitress_1.OneWaitressEvents.STACK_STATUS_CHANNEL_CHANGED);
|
|
291
290
|
// invalidate cache
|
|
292
291
|
this.networkCache.parameters.radioChannel = consts_1.INVALID_RADIO_CHANNEL;
|
|
293
292
|
logger_1.logger.info(`[STACK STATUS] Channel changed.`, NS);
|
|
@@ -312,6 +311,7 @@ class EmberAdapter extends __1.Adapter {
|
|
|
312
311
|
async onMessageSent(status, type, indexOrDestination, apsFrame, messageTag) {
|
|
313
312
|
switch (status) {
|
|
314
313
|
case enums_1.SLStatus.ZIGBEE_DELIVERY_FAILED: {
|
|
314
|
+
logger_1.logger.debug(() => `~x~> DELIVERY_FAILED [indexOrDestination=${indexOrDestination} apsFrame=${JSON.stringify(apsFrame)} messageTag=${messageTag}]`, NS);
|
|
315
315
|
// no ACK was received from the destination
|
|
316
316
|
switch (type) {
|
|
317
317
|
case enums_1.EmberOutgoingMessageType.BROADCAST:
|
|
@@ -319,7 +319,7 @@ class EmberAdapter extends __1.Adapter {
|
|
|
319
319
|
case enums_1.EmberOutgoingMessageType.MULTICAST:
|
|
320
320
|
case enums_1.EmberOutgoingMessageType.MULTICAST_WITH_ALIAS: {
|
|
321
321
|
// BC/MC not checking for message sent, avoid unnecessary waitress lookups
|
|
322
|
-
logger_1.logger.error(`Delivery of ${enums_1.EmberOutgoingMessageType[type]} failed for '${indexOrDestination}'
|
|
322
|
+
logger_1.logger.error(`Delivery of ${enums_1.EmberOutgoingMessageType[type]} failed for '${indexOrDestination}'.`, NS);
|
|
323
323
|
break;
|
|
324
324
|
}
|
|
325
325
|
default: {
|
|
@@ -373,26 +373,19 @@ class EmberAdapter extends __1.Adapter {
|
|
|
373
373
|
* @param messageContents The content of the response.
|
|
374
374
|
*/
|
|
375
375
|
async onZDOResponse(apsFrame, sender, messageContents) {
|
|
376
|
-
const
|
|
377
|
-
if (
|
|
378
|
-
|
|
379
|
-
|
|
380
|
-
|
|
381
|
-
|
|
382
|
-
|
|
383
|
-
ieeeAddr: payload.eui64,
|
|
384
|
-
});
|
|
385
|
-
}
|
|
386
|
-
else if (apsFrame.clusterId === Zdo.ClusterId.END_DEVICE_ANNOUNCE) {
|
|
387
|
-
this.emit('deviceAnnounce', {
|
|
388
|
-
networkAddress: payload.nwkAddress,
|
|
389
|
-
ieeeAddr: payload.eui64,
|
|
390
|
-
});
|
|
376
|
+
const result = Zdo.Buffalo.readResponse(this.hasZdoMessageOverhead, apsFrame.clusterId, messageContents);
|
|
377
|
+
if (apsFrame.clusterId === Zdo.ClusterId.NETWORK_ADDRESS_RESPONSE) {
|
|
378
|
+
// special case to properly resolve a NETWORK_ADDRESS_RESPONSE following a NETWORK_ADDRESS_REQUEST (based on EUI64 from ZDO payload)
|
|
379
|
+
// NOTE: if response has invalid status (no EUI64 available), response waiter will eventually time out
|
|
380
|
+
/* istanbul ignore else */
|
|
381
|
+
if (Zdo.Buffalo.checkStatus(result)) {
|
|
382
|
+
this.oneWaitress.resolveZDO(result[1].eui64, apsFrame, result);
|
|
391
383
|
}
|
|
392
384
|
}
|
|
393
385
|
else {
|
|
394
|
-
this.oneWaitress.resolveZDO(sender, apsFrame,
|
|
386
|
+
this.oneWaitress.resolveZDO(sender, apsFrame, result);
|
|
395
387
|
}
|
|
388
|
+
this.emit('zdoResponse', apsFrame.clusterId, result);
|
|
396
389
|
}
|
|
397
390
|
/**
|
|
398
391
|
* Emitted from @see Ezsp.ezspIncomingMessageHandler @see Ezsp.ezspGpepIncomingMessageHandler
|
|
@@ -1164,48 +1157,6 @@ class EmberAdapter extends __1.Adapter {
|
|
|
1164
1157
|
nextZDORequestSequence() {
|
|
1165
1158
|
return (this.zdoRequestSequence = ++this.zdoRequestSequence & APPLICATION_ZDO_SEQUENCE_MASK);
|
|
1166
1159
|
}
|
|
1167
|
-
/**
|
|
1168
|
-
* ZDO
|
|
1169
|
-
*
|
|
1170
|
-
* @param destination
|
|
1171
|
-
* @param clusterId uint16_t
|
|
1172
|
-
* @param messageContents Content of the ZDO request (sequence to be assigned at index zero)
|
|
1173
|
-
* @param options
|
|
1174
|
-
* @returns status Indicates success or failure (with reason) of send
|
|
1175
|
-
* @returns apsFrame The APS Frame resulting of the request being built and sent (`sequence` set from stack-given value).
|
|
1176
|
-
* @returns messageTag The tag passed to ezspSend${x} function.
|
|
1177
|
-
*/
|
|
1178
|
-
async sendZDORequest(destination, clusterId, messageContents, options) {
|
|
1179
|
-
const messageTag = this.nextZDORequestSequence();
|
|
1180
|
-
messageContents[0] = messageTag;
|
|
1181
|
-
const apsFrame = {
|
|
1182
|
-
profileId: Zdo.ZDO_PROFILE_ID,
|
|
1183
|
-
clusterId,
|
|
1184
|
-
sourceEndpoint: Zdo.ZDO_ENDPOINT,
|
|
1185
|
-
destinationEndpoint: Zdo.ZDO_ENDPOINT,
|
|
1186
|
-
options,
|
|
1187
|
-
groupId: 0,
|
|
1188
|
-
sequence: 0, // set by stack
|
|
1189
|
-
};
|
|
1190
|
-
if (destination === ZSpec.BroadcastAddress.DEFAULT ||
|
|
1191
|
-
destination === ZSpec.BroadcastAddress.RX_ON_WHEN_IDLE ||
|
|
1192
|
-
destination === ZSpec.BroadcastAddress.SLEEPY) {
|
|
1193
|
-
logger_1.logger.debug(`~~~> [ZDO ${Zdo.ClusterId[clusterId]} BROADCAST to=${destination} messageTag=${messageTag} messageContents=${messageContents.toString('hex')}]`, NS);
|
|
1194
|
-
const [status, apsSequence] = await this.ezsp.ezspSendBroadcast(ZSpec.NULL_NODE_ID, // alias
|
|
1195
|
-
destination, 0, // nwkSequence
|
|
1196
|
-
apsFrame, ZDO_REQUEST_RADIUS, messageTag, messageContents);
|
|
1197
|
-
apsFrame.sequence = apsSequence;
|
|
1198
|
-
logger_1.logger.debug(`~~~> [SENT ZDO type=BROADCAST apsSequence=${apsSequence} messageTag=${messageTag} status=${enums_1.SLStatus[status]}`, NS);
|
|
1199
|
-
return [status, apsFrame, messageTag];
|
|
1200
|
-
}
|
|
1201
|
-
else {
|
|
1202
|
-
logger_1.logger.debug(`~~~> [ZDO ${Zdo.ClusterId[clusterId]} UNICAST to=${destination} messageTag=${messageTag} messageContents=${messageContents.toString('hex')}]`, NS);
|
|
1203
|
-
const [status, apsSequence] = await this.ezsp.ezspSendUnicast(enums_1.EmberOutgoingMessageType.DIRECT, destination, apsFrame, messageTag, messageContents);
|
|
1204
|
-
apsFrame.sequence = apsSequence;
|
|
1205
|
-
logger_1.logger.debug(`~~~> [SENT ZDO type=DIRECT apsSequence=${apsSequence} messageTag=${messageTag} status=${enums_1.SLStatus[status]}`, NS);
|
|
1206
|
-
return [status, apsFrame, messageTag];
|
|
1207
|
-
}
|
|
1208
|
-
}
|
|
1209
1160
|
//---- END Ember ZDO
|
|
1210
1161
|
//-- START Adapter implementation
|
|
1211
1162
|
/* istanbul ignore next */
|
|
@@ -1239,26 +1190,11 @@ class EmberAdapter extends __1.Adapter {
|
|
|
1239
1190
|
this.ezsp.removeAllListeners();
|
|
1240
1191
|
logger_1.logger.info(`======== Ember Adapter Stopped ========`, NS);
|
|
1241
1192
|
}
|
|
1242
|
-
|
|
1243
|
-
async getCoordinator() {
|
|
1193
|
+
async getCoordinatorIEEE() {
|
|
1244
1194
|
return await this.queue.execute(async () => {
|
|
1245
1195
|
this.checkInterpanLock();
|
|
1246
1196
|
// in all likelihood this will be retrieved from cache
|
|
1247
|
-
|
|
1248
|
-
return {
|
|
1249
|
-
ieeeAddr,
|
|
1250
|
-
networkAddress: ZSpec.COORDINATOR_ADDRESS,
|
|
1251
|
-
manufacturerID: DEFAULT_MANUFACTURER_CODE,
|
|
1252
|
-
endpoints: endpoints_1.FIXED_ENDPOINTS.map((ep) => {
|
|
1253
|
-
return {
|
|
1254
|
-
profileID: ep.profileId,
|
|
1255
|
-
ID: ep.endpoint,
|
|
1256
|
-
deviceID: ep.deviceId,
|
|
1257
|
-
inputClusters: ep.inClusterList.slice(), // copy
|
|
1258
|
-
outputClusters: ep.outClusterList.slice(), // copy
|
|
1259
|
-
};
|
|
1260
|
-
}),
|
|
1261
|
-
};
|
|
1197
|
+
return await this.emberGetEui64();
|
|
1262
1198
|
});
|
|
1263
1199
|
}
|
|
1264
1200
|
async getCoordinatorVersion() {
|
|
@@ -1361,19 +1297,6 @@ class EmberAdapter extends __1.Adapter {
|
|
|
1361
1297
|
});
|
|
1362
1298
|
}
|
|
1363
1299
|
// queued
|
|
1364
|
-
async changeChannel(newChannel) {
|
|
1365
|
-
return await this.queue.execute(async () => {
|
|
1366
|
-
this.checkInterpanLock();
|
|
1367
|
-
const zdoPayload = Zdo.Buffalo.buildRequest(this.hasZdoMessageOverhead, Zdo.ClusterId.NWK_UPDATE_REQUEST, [newChannel], 0xfe, undefined, undefined, undefined);
|
|
1368
|
-
const [status] = await this.sendZDORequest(ZSpec.BroadcastAddress.SLEEPY, Zdo.ClusterId.NWK_UPDATE_REQUEST, zdoPayload, exports.DEFAULT_APS_OPTIONS);
|
|
1369
|
-
if (status !== enums_1.SLStatus.OK) {
|
|
1370
|
-
throw new Error(`[ZDO] Failed broadcast channel change to '${newChannel}' with status=${enums_1.SLStatus[status]}.`);
|
|
1371
|
-
}
|
|
1372
|
-
await this.oneWaitress.startWaitingForEvent({ eventName: oneWaitress_1.OneWaitressEvents.STACK_STATUS_CHANNEL_CHANGED }, DEFAULT_NETWORK_REQUEST_TIMEOUT * 2, // observed to ~9sec
|
|
1373
|
-
'[ZDO] Change Channel');
|
|
1374
|
-
});
|
|
1375
|
-
}
|
|
1376
|
-
// queued
|
|
1377
1300
|
async setTransmitPower(value) {
|
|
1378
1301
|
return await this.queue.execute(async () => {
|
|
1379
1302
|
const status = await this.ezsp.ezspSetRadioPower(value);
|
|
@@ -1444,9 +1367,59 @@ class EmberAdapter extends __1.Adapter {
|
|
|
1444
1367
|
promise: waiter.start().promise,
|
|
1445
1368
|
};
|
|
1446
1369
|
}
|
|
1447
|
-
|
|
1370
|
+
async sendZdo(ieeeAddress, networkAddress, clusterId, payload, disableResponse) {
|
|
1371
|
+
return await this.queue.execute(async () => {
|
|
1372
|
+
this.checkInterpanLock();
|
|
1373
|
+
const clusterName = Zdo.ClusterId[clusterId];
|
|
1374
|
+
const messageTag = this.nextZDORequestSequence();
|
|
1375
|
+
payload[0] = messageTag;
|
|
1376
|
+
const apsFrame = {
|
|
1377
|
+
profileId: Zdo.ZDO_PROFILE_ID,
|
|
1378
|
+
clusterId,
|
|
1379
|
+
sourceEndpoint: Zdo.ZDO_ENDPOINT,
|
|
1380
|
+
destinationEndpoint: Zdo.ZDO_ENDPOINT,
|
|
1381
|
+
options: exports.DEFAULT_APS_OPTIONS,
|
|
1382
|
+
groupId: 0,
|
|
1383
|
+
sequence: 0, // set by stack
|
|
1384
|
+
};
|
|
1385
|
+
let status;
|
|
1386
|
+
let apsSequence;
|
|
1387
|
+
if (ZSpec.Utils.isBroadcastAddress(networkAddress)) {
|
|
1388
|
+
logger_1.logger.debug(() => `~~~> [ZDO ${clusterName} BROADCAST to=${networkAddress} messageTag=${messageTag} payload=${payload.toString('hex')}]`, NS);
|
|
1389
|
+
[status, apsSequence] = await this.ezsp.ezspSendBroadcast(ZSpec.NULL_NODE_ID, // alias
|
|
1390
|
+
networkAddress, 0, // nwkSequence
|
|
1391
|
+
apsFrame, ZDO_REQUEST_RADIUS, messageTag, payload);
|
|
1392
|
+
apsFrame.sequence = apsSequence;
|
|
1393
|
+
logger_1.logger.debug(`~~~> [SENT ZDO BROADCAST messageTag=${messageTag} apsSequence=${apsSequence} status=${enums_1.SLStatus[status]}]`, NS);
|
|
1394
|
+
if (status !== enums_1.SLStatus.OK) {
|
|
1395
|
+
throw new Error(`~x~> [ZDO ${clusterName} BROADCAST to=${networkAddress} messageTag=${messageTag}] Failed to send request with status=${enums_1.SLStatus[status]}.`);
|
|
1396
|
+
}
|
|
1397
|
+
}
|
|
1398
|
+
else {
|
|
1399
|
+
logger_1.logger.debug(() => `~~~> [ZDO ${clusterName} UNICAST to=${ieeeAddress}:${networkAddress} messageTag=${messageTag} payload=${payload.toString('hex')}]`, NS);
|
|
1400
|
+
[status, apsSequence] = await this.ezsp.ezspSendUnicast(enums_1.EmberOutgoingMessageType.DIRECT, networkAddress, apsFrame, messageTag, payload);
|
|
1401
|
+
apsFrame.sequence = apsSequence;
|
|
1402
|
+
logger_1.logger.debug(`~~~> [SENT ZDO UNICAST messageTag=${messageTag} apsSequence=${apsSequence} status=${enums_1.SLStatus[status]}]`, NS);
|
|
1403
|
+
if (status !== enums_1.SLStatus.OK) {
|
|
1404
|
+
throw new Error(`~x~> [ZDO ${clusterName} UNICAST to=${ieeeAddress}:${networkAddress} messageTag=${messageTag}] Failed to send request with status=${enums_1.SLStatus[status]}.`);
|
|
1405
|
+
}
|
|
1406
|
+
}
|
|
1407
|
+
if (!disableResponse) {
|
|
1408
|
+
const responseClusterId = Zdo.Utils.getResponseClusterId(clusterId);
|
|
1409
|
+
/* istanbul ignore else */
|
|
1410
|
+
if (responseClusterId) {
|
|
1411
|
+
return await this.oneWaitress.startWaitingFor({
|
|
1412
|
+
target: responseClusterId === Zdo.ClusterId.NETWORK_ADDRESS_RESPONSE ? ieeeAddress : networkAddress,
|
|
1413
|
+
apsFrame,
|
|
1414
|
+
zdoResponseClusterId: responseClusterId,
|
|
1415
|
+
}, DEFAULT_REQUEST_TIMEOUT);
|
|
1416
|
+
}
|
|
1417
|
+
}
|
|
1418
|
+
}, networkAddress);
|
|
1419
|
+
}
|
|
1448
1420
|
// queued, non-InterPAN
|
|
1449
1421
|
async permitJoin(seconds, networkAddress) {
|
|
1422
|
+
const clusterId = Zdo.ClusterId.PERMIT_JOINING_REQUEST;
|
|
1450
1423
|
const preJoining = async () => {
|
|
1451
1424
|
if (seconds) {
|
|
1452
1425
|
const plaintextKey = { contents: Buffer.from(consts_1.ZIGBEE_PROFILE_INTEROPERABILITY_LINK_KEY) };
|
|
@@ -1474,243 +1447,37 @@ class EmberAdapter extends __1.Adapter {
|
|
|
1474
1447
|
};
|
|
1475
1448
|
if (networkAddress) {
|
|
1476
1449
|
// specific device that is not `Coordinator`
|
|
1477
|
-
|
|
1450
|
+
await this.queue.execute(async () => {
|
|
1478
1451
|
this.checkInterpanLock();
|
|
1479
1452
|
await preJoining();
|
|
1480
|
-
// `authentication`: TC significance always 1 (zb specs)
|
|
1481
|
-
const zdoPayload = Zdo.Buffalo.buildRequest(this.hasZdoMessageOverhead, Zdo.ClusterId.PERMIT_JOINING_REQUEST, seconds, 1, []);
|
|
1482
|
-
const [status, apsFrame] = await this.sendZDORequest(networkAddress, Zdo.ClusterId.PERMIT_JOINING_REQUEST, zdoPayload, exports.DEFAULT_APS_OPTIONS);
|
|
1483
|
-
if (status !== enums_1.SLStatus.OK) {
|
|
1484
|
-
throw new Error(`[ZDO] Failed permit joining request for '${networkAddress}' with status=${enums_1.SLStatus[status]}.`);
|
|
1485
|
-
}
|
|
1486
|
-
await this.oneWaitress.startWaitingFor({
|
|
1487
|
-
target: networkAddress,
|
|
1488
|
-
apsFrame,
|
|
1489
|
-
responseClusterId: Zdo.ClusterId.PERMIT_JOINING_RESPONSE,
|
|
1490
|
-
}, DEFAULT_REQUEST_TIMEOUT);
|
|
1491
1453
|
});
|
|
1454
|
+
// `authentication`: TC significance always 1 (zb specs)
|
|
1455
|
+
const zdoPayload = Zdo.Buffalo.buildRequest(this.hasZdoMessageOverhead, clusterId, seconds, 1, []);
|
|
1456
|
+
const result = await this.sendZdo(ZSpec.BLANK_EUI64, networkAddress, clusterId, zdoPayload, false);
|
|
1457
|
+
/* istanbul ignore next */
|
|
1458
|
+
if (!Zdo.Buffalo.checkStatus(result)) {
|
|
1459
|
+
// TODO: will disappear once moved upstream
|
|
1460
|
+
throw new Zdo.StatusError(result[0]);
|
|
1461
|
+
}
|
|
1492
1462
|
}
|
|
1493
1463
|
else {
|
|
1494
1464
|
// coordinator-only (0), or all
|
|
1495
|
-
|
|
1465
|
+
await this.queue.execute(async () => {
|
|
1496
1466
|
this.checkInterpanLock();
|
|
1497
1467
|
await preJoining();
|
|
1498
|
-
const status = await this.ezsp.ezspPermitJoining(seconds);
|
|
1499
|
-
if (status !== enums_1.SLStatus.OK) {
|
|
1500
|
-
throw new Error(`[ZDO] Failed coordinator permit joining request with status=${enums_1.SLStatus[status]}.`);
|
|
1501
|
-
}
|
|
1502
|
-
logger_1.logger.debug(`Permit joining on coordinator for ${seconds} sec.`, NS);
|
|
1503
|
-
// broadcast permit joining ZDO
|
|
1504
|
-
if (networkAddress === undefined) {
|
|
1505
|
-
// `authentication`: TC significance always 1 (zb specs)
|
|
1506
|
-
const zdoPayload = Zdo.Buffalo.buildRequest(this.hasZdoMessageOverhead, Zdo.ClusterId.PERMIT_JOINING_REQUEST, seconds, 1, []);
|
|
1507
|
-
const [bcStatus] = await this.sendZDORequest(ZSpec.BroadcastAddress.DEFAULT, Zdo.ClusterId.PERMIT_JOINING_REQUEST, zdoPayload, exports.DEFAULT_APS_OPTIONS);
|
|
1508
|
-
if (bcStatus !== enums_1.SLStatus.OK) {
|
|
1509
|
-
// don't throw, coordinator succeeded at least
|
|
1510
|
-
logger_1.logger.error(`[ZDO] Failed broadcast permit joining request with status=${enums_1.SLStatus[bcStatus]}.`, NS);
|
|
1511
|
-
}
|
|
1512
|
-
}
|
|
1513
1468
|
});
|
|
1514
|
-
|
|
1515
|
-
}
|
|
1516
|
-
// queued, non-InterPAN
|
|
1517
|
-
async lqi(networkAddress) {
|
|
1518
|
-
return await this.queue.execute(async () => {
|
|
1519
|
-
this.checkInterpanLock();
|
|
1520
|
-
const neighbors = [];
|
|
1521
|
-
const request = async (startIndex) => {
|
|
1522
|
-
const zdoPayload = Zdo.Buffalo.buildRequest(this.hasZdoMessageOverhead, Zdo.ClusterId.LQI_TABLE_REQUEST, startIndex);
|
|
1523
|
-
const [status, apsFrame] = await this.sendZDORequest(networkAddress, Zdo.ClusterId.LQI_TABLE_REQUEST, zdoPayload, exports.DEFAULT_APS_OPTIONS);
|
|
1524
|
-
if (status !== enums_1.SLStatus.OK) {
|
|
1525
|
-
throw new Error(`[ZDO] Failed LQI request for '${networkAddress}' (index '${startIndex}') with status=${enums_1.SLStatus[status]}.`);
|
|
1526
|
-
}
|
|
1527
|
-
const result = await this.oneWaitress.startWaitingFor({
|
|
1528
|
-
target: networkAddress,
|
|
1529
|
-
apsFrame,
|
|
1530
|
-
responseClusterId: Zdo.ClusterId.LQI_TABLE_RESPONSE,
|
|
1531
|
-
}, DEFAULT_REQUEST_TIMEOUT);
|
|
1532
|
-
for (const entry of result.entryList) {
|
|
1533
|
-
neighbors.push({
|
|
1534
|
-
ieeeAddr: entry.eui64,
|
|
1535
|
-
networkAddress: entry.nwkAddress,
|
|
1536
|
-
linkquality: entry.lqi,
|
|
1537
|
-
relationship: entry.relationship,
|
|
1538
|
-
depth: entry.depth,
|
|
1539
|
-
});
|
|
1540
|
-
}
|
|
1541
|
-
return [result.neighborTableEntries, result.entryList.length];
|
|
1542
|
-
};
|
|
1543
|
-
let [tableEntries, entryCount] = await request(0);
|
|
1544
|
-
const size = tableEntries;
|
|
1545
|
-
let nextStartIndex = entryCount;
|
|
1546
|
-
while (neighbors.length < size) {
|
|
1547
|
-
[tableEntries, entryCount] = await request(nextStartIndex);
|
|
1548
|
-
nextStartIndex += entryCount;
|
|
1549
|
-
}
|
|
1550
|
-
return { neighbors };
|
|
1551
|
-
}, networkAddress);
|
|
1552
|
-
}
|
|
1553
|
-
// queued, non-InterPAN
|
|
1554
|
-
async routingTable(networkAddress) {
|
|
1555
|
-
return await this.queue.execute(async () => {
|
|
1556
|
-
this.checkInterpanLock();
|
|
1557
|
-
const table = [];
|
|
1558
|
-
const request = async (startIndex) => {
|
|
1559
|
-
const zdoPayload = Zdo.Buffalo.buildRequest(this.hasZdoMessageOverhead, Zdo.ClusterId.ROUTING_TABLE_REQUEST, startIndex);
|
|
1560
|
-
const [status, apsFrame] = await this.sendZDORequest(networkAddress, Zdo.ClusterId.ROUTING_TABLE_REQUEST, zdoPayload, exports.DEFAULT_APS_OPTIONS);
|
|
1561
|
-
if (status !== enums_1.SLStatus.OK) {
|
|
1562
|
-
throw new Error(`[ZDO] Failed routing table request for '${networkAddress}' (index '${startIndex}') with status=${enums_1.SLStatus[status]}.`);
|
|
1563
|
-
}
|
|
1564
|
-
const result = await this.oneWaitress.startWaitingFor({
|
|
1565
|
-
target: networkAddress,
|
|
1566
|
-
apsFrame,
|
|
1567
|
-
responseClusterId: Zdo.ClusterId.ROUTING_TABLE_RESPONSE,
|
|
1568
|
-
}, DEFAULT_REQUEST_TIMEOUT);
|
|
1569
|
-
for (const entry of result.entryList) {
|
|
1570
|
-
table.push({
|
|
1571
|
-
destinationAddress: entry.destinationAddress,
|
|
1572
|
-
status: entry.status,
|
|
1573
|
-
nextHop: entry.nextHopAddress,
|
|
1574
|
-
});
|
|
1575
|
-
}
|
|
1576
|
-
return [result.routingTableEntries, result.entryList.length];
|
|
1577
|
-
};
|
|
1578
|
-
let [tableEntries, entryCount] = await request(0);
|
|
1579
|
-
const size = tableEntries;
|
|
1580
|
-
let nextStartIndex = entryCount;
|
|
1581
|
-
while (table.length < size) {
|
|
1582
|
-
[tableEntries, entryCount] = await request(nextStartIndex);
|
|
1583
|
-
nextStartIndex += entryCount;
|
|
1584
|
-
}
|
|
1585
|
-
return { table };
|
|
1586
|
-
}, networkAddress);
|
|
1587
|
-
}
|
|
1588
|
-
// queued, non-InterPAN
|
|
1589
|
-
async nodeDescriptor(networkAddress) {
|
|
1590
|
-
return await this.queue.execute(async () => {
|
|
1591
|
-
this.checkInterpanLock();
|
|
1592
|
-
const zdoPayload = Zdo.Buffalo.buildRequest(this.hasZdoMessageOverhead, Zdo.ClusterId.NODE_DESCRIPTOR_REQUEST, networkAddress);
|
|
1593
|
-
const [status, apsFrame] = await this.sendZDORequest(networkAddress, Zdo.ClusterId.NODE_DESCRIPTOR_REQUEST, zdoPayload, exports.DEFAULT_APS_OPTIONS);
|
|
1469
|
+
const status = await this.ezsp.ezspPermitJoining(seconds);
|
|
1594
1470
|
if (status !== enums_1.SLStatus.OK) {
|
|
1595
|
-
throw new Error(`[ZDO] Failed
|
|
1596
|
-
}
|
|
1597
|
-
const result = await this.oneWaitress.startWaitingFor({
|
|
1598
|
-
target: networkAddress,
|
|
1599
|
-
apsFrame,
|
|
1600
|
-
responseClusterId: Zdo.ClusterId.NODE_DESCRIPTOR_RESPONSE,
|
|
1601
|
-
}, DEFAULT_REQUEST_TIMEOUT);
|
|
1602
|
-
let type = 'Unknown';
|
|
1603
|
-
switch (result.logicalType) {
|
|
1604
|
-
case 0x0:
|
|
1605
|
-
type = 'Coordinator';
|
|
1606
|
-
break;
|
|
1607
|
-
case 0x1:
|
|
1608
|
-
type = 'Router';
|
|
1609
|
-
break;
|
|
1610
|
-
case 0x2:
|
|
1611
|
-
type = 'EndDevice';
|
|
1612
|
-
break;
|
|
1613
|
-
}
|
|
1614
|
-
/* istanbul ignore else */
|
|
1615
|
-
if (result.serverMask.stackComplianceRevision < CURRENT_ZIGBEE_SPEC_REVISION) {
|
|
1616
|
-
// always 0 before rev. 21 where field was added
|
|
1617
|
-
const rev = result.serverMask.stackComplianceRevision < 21 ? 'pre-21' : result.serverMask.stackComplianceRevision;
|
|
1618
|
-
logger_1.logger.warning(`[ZDO] Device '${networkAddress}' is only compliant to revision '${rev}' of the ZigBee specification (current revision: ${CURRENT_ZIGBEE_SPEC_REVISION}).`, NS);
|
|
1471
|
+
throw new Error(`[ZDO] Failed coordinator permit joining request with status=${enums_1.SLStatus[status]}.`);
|
|
1619
1472
|
}
|
|
1620
|
-
|
|
1621
|
-
|
|
1622
|
-
|
|
1623
|
-
|
|
1624
|
-
|
|
1625
|
-
|
|
1626
|
-
this.checkInterpanLock();
|
|
1627
|
-
const zdoPayload = Zdo.Buffalo.buildRequest(this.hasZdoMessageOverhead, Zdo.ClusterId.ACTIVE_ENDPOINTS_REQUEST, networkAddress);
|
|
1628
|
-
const [status, apsFrame] = await this.sendZDORequest(networkAddress, Zdo.ClusterId.ACTIVE_ENDPOINTS_REQUEST, zdoPayload, exports.DEFAULT_APS_OPTIONS);
|
|
1629
|
-
if (status !== enums_1.SLStatus.OK) {
|
|
1630
|
-
throw new Error(`[ZDO] Failed active endpoints request for '${networkAddress}' with status=${enums_1.SLStatus[status]}.`);
|
|
1631
|
-
}
|
|
1632
|
-
const result = await this.oneWaitress.startWaitingFor({
|
|
1633
|
-
target: networkAddress,
|
|
1634
|
-
apsFrame,
|
|
1635
|
-
responseClusterId: Zdo.ClusterId.ACTIVE_ENDPOINTS_RESPONSE,
|
|
1636
|
-
}, DEFAULT_REQUEST_TIMEOUT);
|
|
1637
|
-
return { endpoints: result.endpointList };
|
|
1638
|
-
}, networkAddress);
|
|
1639
|
-
}
|
|
1640
|
-
// queued, non-InterPAN
|
|
1641
|
-
async simpleDescriptor(networkAddress, endpointID) {
|
|
1642
|
-
return await this.queue.execute(async () => {
|
|
1643
|
-
this.checkInterpanLock();
|
|
1644
|
-
const zdoPayload = Zdo.Buffalo.buildRequest(this.hasZdoMessageOverhead, Zdo.ClusterId.SIMPLE_DESCRIPTOR_REQUEST, networkAddress, endpointID);
|
|
1645
|
-
const [status, apsFrame] = await this.sendZDORequest(networkAddress, Zdo.ClusterId.SIMPLE_DESCRIPTOR_REQUEST, zdoPayload, exports.DEFAULT_APS_OPTIONS);
|
|
1646
|
-
if (status !== enums_1.SLStatus.OK) {
|
|
1647
|
-
throw new Error(`[ZDO] Failed simple descriptor request for '${networkAddress}' endpoint '${endpointID}' with status=${enums_1.SLStatus[status]}.`);
|
|
1648
|
-
}
|
|
1649
|
-
const result = await this.oneWaitress.startWaitingFor({
|
|
1650
|
-
target: networkAddress,
|
|
1651
|
-
apsFrame,
|
|
1652
|
-
responseClusterId: Zdo.ClusterId.SIMPLE_DESCRIPTOR_RESPONSE,
|
|
1653
|
-
}, DEFAULT_REQUEST_TIMEOUT);
|
|
1654
|
-
return {
|
|
1655
|
-
profileID: result.profileId,
|
|
1656
|
-
endpointID: result.endpoint,
|
|
1657
|
-
deviceID: result.deviceId,
|
|
1658
|
-
inputClusters: result.inClusterList,
|
|
1659
|
-
outputClusters: result.outClusterList,
|
|
1660
|
-
};
|
|
1661
|
-
}, networkAddress);
|
|
1662
|
-
}
|
|
1663
|
-
// queued, non-InterPAN
|
|
1664
|
-
async bind(destinationNetworkAddress, sourceIeeeAddress, sourceEndpoint, clusterID, destinationAddressOrGroup, type, destinationEndpoint) {
|
|
1665
|
-
return await this.queue.execute(async () => {
|
|
1666
|
-
this.checkInterpanLock();
|
|
1667
|
-
const zdoPayload = Zdo.Buffalo.buildRequest(this.hasZdoMessageOverhead, Zdo.ClusterId.BIND_REQUEST, sourceIeeeAddress, sourceEndpoint, clusterID, type === 'group' ? Zdo.MULTICAST_BINDING : Zdo.UNICAST_BINDING, destinationAddressOrGroup, // not used with MULTICAST_BINDING
|
|
1668
|
-
destinationAddressOrGroup, // not used with UNICAST_BINDING
|
|
1669
|
-
destinationEndpoint ?? 0);
|
|
1670
|
-
const [status, apsFrame] = await this.sendZDORequest(destinationNetworkAddress, Zdo.ClusterId.BIND_REQUEST, zdoPayload, exports.DEFAULT_APS_OPTIONS);
|
|
1671
|
-
if (status !== enums_1.SLStatus.OK) {
|
|
1672
|
-
throw new Error(`[ZDO] Failed bind request for '${destinationNetworkAddress}' destination '${destinationAddressOrGroup}' endpoint '${destinationEndpoint}' with status=${enums_1.SLStatus[status]}.`);
|
|
1673
|
-
}
|
|
1674
|
-
await this.oneWaitress.startWaitingFor({
|
|
1675
|
-
target: destinationNetworkAddress,
|
|
1676
|
-
apsFrame,
|
|
1677
|
-
responseClusterId: Zdo.ClusterId.BIND_RESPONSE,
|
|
1678
|
-
}, DEFAULT_REQUEST_TIMEOUT);
|
|
1679
|
-
}, destinationNetworkAddress);
|
|
1680
|
-
}
|
|
1681
|
-
// queued, non-InterPAN
|
|
1682
|
-
async unbind(destinationNetworkAddress, sourceIeeeAddress, sourceEndpoint, clusterID, destinationAddressOrGroup, type, destinationEndpoint) {
|
|
1683
|
-
return await this.queue.execute(async () => {
|
|
1684
|
-
this.checkInterpanLock();
|
|
1685
|
-
const zdoPayload = Zdo.Buffalo.buildRequest(this.hasZdoMessageOverhead, Zdo.ClusterId.UNBIND_REQUEST, sourceIeeeAddress, sourceEndpoint, clusterID, type === 'group' ? Zdo.MULTICAST_BINDING : Zdo.UNICAST_BINDING, destinationAddressOrGroup, // not used with MULTICAST_BINDING
|
|
1686
|
-
destinationAddressOrGroup, // not used with UNICAST_BINDING
|
|
1687
|
-
destinationEndpoint ?? 0);
|
|
1688
|
-
const [status, apsFrame] = await this.sendZDORequest(destinationNetworkAddress, Zdo.ClusterId.UNBIND_REQUEST, zdoPayload, exports.DEFAULT_APS_OPTIONS);
|
|
1689
|
-
if (status !== enums_1.SLStatus.OK) {
|
|
1690
|
-
throw new Error(`[ZDO] Failed unbind request for '${destinationNetworkAddress}' destination '${destinationAddressOrGroup}' endpoint '${destinationEndpoint}' with status=${enums_1.SLStatus[status]}.`);
|
|
1691
|
-
}
|
|
1692
|
-
await this.oneWaitress.startWaitingFor({
|
|
1693
|
-
target: destinationNetworkAddress,
|
|
1694
|
-
apsFrame,
|
|
1695
|
-
responseClusterId: Zdo.ClusterId.UNBIND_RESPONSE,
|
|
1696
|
-
}, DEFAULT_REQUEST_TIMEOUT);
|
|
1697
|
-
}, destinationNetworkAddress);
|
|
1698
|
-
}
|
|
1699
|
-
// queued, non-InterPAN
|
|
1700
|
-
async removeDevice(networkAddress, ieeeAddr) {
|
|
1701
|
-
return await this.queue.execute(async () => {
|
|
1702
|
-
this.checkInterpanLock();
|
|
1703
|
-
const zdoPayload = Zdo.Buffalo.buildRequest(this.hasZdoMessageOverhead, Zdo.ClusterId.LEAVE_REQUEST, ieeeAddr, Zdo.LeaveRequestFlags.WITHOUT_REJOIN);
|
|
1704
|
-
const [status, apsFrame] = await this.sendZDORequest(networkAddress, Zdo.ClusterId.LEAVE_REQUEST, zdoPayload, exports.DEFAULT_APS_OPTIONS);
|
|
1705
|
-
if (status !== enums_1.SLStatus.OK) {
|
|
1706
|
-
throw new Error(`[ZDO] Failed remove device request for '${networkAddress}' target '${ieeeAddr}' with status=${enums_1.SLStatus[status]}.`);
|
|
1473
|
+
logger_1.logger.debug(`Permit joining on coordinator for ${seconds} sec.`, NS);
|
|
1474
|
+
// broadcast permit joining ZDO
|
|
1475
|
+
if (networkAddress === undefined) {
|
|
1476
|
+
// `authentication`: TC significance always 1 (zb specs)
|
|
1477
|
+
const zdoPayload = Zdo.Buffalo.buildRequest(this.hasZdoMessageOverhead, clusterId, seconds, 1, []);
|
|
1478
|
+
await this.sendZdo(ZSpec.BLANK_EUI64, ZSpec.BroadcastAddress.DEFAULT, clusterId, zdoPayload, true);
|
|
1707
1479
|
}
|
|
1708
|
-
|
|
1709
|
-
target: networkAddress,
|
|
1710
|
-
apsFrame,
|
|
1711
|
-
responseClusterId: Zdo.ClusterId.LEAVE_RESPONSE,
|
|
1712
|
-
}, DEFAULT_REQUEST_TIMEOUT);
|
|
1713
|
-
}, networkAddress);
|
|
1480
|
+
}
|
|
1714
1481
|
}
|
|
1715
1482
|
//---- ZCL
|
|
1716
1483
|
// queued, non-InterPAN
|
|
@@ -1740,7 +1507,7 @@ class EmberAdapter extends __1.Adapter {
|
|
|
1740
1507
|
const data = zclFrame.toBuffer();
|
|
1741
1508
|
return await this.queue.execute(async () => {
|
|
1742
1509
|
this.checkInterpanLock();
|
|
1743
|
-
logger_1.logger.debug(() => `~~~> [ZCL to=${networkAddress} apsFrame=${JSON.stringify(apsFrame)} header=${JSON.stringify(zclFrame.header)}]`, NS);
|
|
1510
|
+
logger_1.logger.debug(() => `~~~> [ZCL to=${ieeeAddr}:${networkAddress} apsFrame=${JSON.stringify(apsFrame)} header=${JSON.stringify(zclFrame.header)}]`, NS);
|
|
1744
1511
|
for (let i = 1; i <= QUEUE_MAX_SEND_ATTEMPTS; i++) {
|
|
1745
1512
|
let status = enums_1.SLStatus.FAIL;
|
|
1746
1513
|
try {
|
|
@@ -1767,7 +1534,7 @@ class EmberAdapter extends __1.Adapter {
|
|
|
1767
1534
|
break;
|
|
1768
1535
|
}
|
|
1769
1536
|
else if (disableRecovery || i == QUEUE_MAX_SEND_ATTEMPTS) {
|
|
1770
|
-
throw new Error(`~x~> [ZCL to=${networkAddress}] Failed to send request with status=${enums_1.SLStatus[status]}.`);
|
|
1537
|
+
throw new Error(`~x~> [ZCL to=${ieeeAddr}:${networkAddress} apsFrame=${JSON.stringify(apsFrame)}] Failed to send request with status=${enums_1.SLStatus[status]}.`);
|
|
1771
1538
|
}
|
|
1772
1539
|
else if (status === enums_1.SLStatus.ZIGBEE_MAX_MESSAGE_LIMIT_REACHED || status === enums_1.SLStatus.BUSY) {
|
|
1773
1540
|
await (0, utils_1.Wait)(QUEUE_BUSY_DEFER_MSEC);
|
|
@@ -1776,9 +1543,9 @@ class EmberAdapter extends __1.Adapter {
|
|
|
1776
1543
|
await (0, utils_1.Wait)(QUEUE_NETWORK_DOWN_DEFER_MSEC);
|
|
1777
1544
|
}
|
|
1778
1545
|
else {
|
|
1779
|
-
throw new Error(`~x~> [ZCL to=${networkAddress}] Failed to send request with status=${enums_1.SLStatus[status]}.`);
|
|
1546
|
+
throw new Error(`~x~> [ZCL to=${ieeeAddr}:${networkAddress} apsFrame=${JSON.stringify(apsFrame)}] Failed to send request with status=${enums_1.SLStatus[status]}.`);
|
|
1780
1547
|
}
|
|
1781
|
-
logger_1.logger.debug(`~x~> [ZCL to=${networkAddress}] Failed to send request attempt ${i}/${QUEUE_MAX_SEND_ATTEMPTS} with status=${enums_1.SLStatus[status]}.`, NS);
|
|
1548
|
+
logger_1.logger.debug(`~x~> [ZCL to=${ieeeAddr}:${networkAddress}] Failed to send request attempt ${i}/${QUEUE_MAX_SEND_ATTEMPTS} with status=${enums_1.SLStatus[status]}.`, NS);
|
|
1782
1549
|
}
|
|
1783
1550
|
if (commandResponseId !== undefined) {
|
|
1784
1551
|
// NOTE: aps sequence number will have been set by send function
|
|
@@ -1809,11 +1576,11 @@ class EmberAdapter extends __1.Adapter {
|
|
|
1809
1576
|
this.checkInterpanLock();
|
|
1810
1577
|
logger_1.logger.debug(() => `~~~> [ZCL GROUP apsFrame=${JSON.stringify(apsFrame)} header=${JSON.stringify(zclFrame.header)}]`, NS);
|
|
1811
1578
|
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
1812
|
-
const [status, messageTag] = await this.ezsp.send(enums_1.EmberOutgoingMessageType.MULTICAST,
|
|
1579
|
+
const [status, messageTag] = await this.ezsp.send(enums_1.EmberOutgoingMessageType.MULTICAST, groupID, // not used with MULTICAST
|
|
1813
1580
|
apsFrame, data, 0, // alias
|
|
1814
1581
|
0);
|
|
1815
1582
|
if (status !== enums_1.SLStatus.OK) {
|
|
1816
|
-
throw new Error(`~x~> [ZCL GROUP] Failed to send with status=${enums_1.SLStatus[status]}.`);
|
|
1583
|
+
throw new Error(`~x~> [ZCL GROUP groupId=${groupID}] Failed to send with status=${enums_1.SLStatus[status]}.`);
|
|
1817
1584
|
}
|
|
1818
1585
|
// NOTE: since ezspMessageSentHandler could take a while here, we don't block, it'll just be logged if the delivery failed
|
|
1819
1586
|
await (0, utils_1.Wait)(QUEUE_BUSY_DEFER_MSEC);
|
|
@@ -1839,7 +1606,7 @@ class EmberAdapter extends __1.Adapter {
|
|
|
1839
1606
|
const [status, messageTag] = await this.ezsp.send(enums_1.EmberOutgoingMessageType.BROADCAST, destination, apsFrame, data, 0, // alias
|
|
1840
1607
|
0);
|
|
1841
1608
|
if (status !== enums_1.SLStatus.OK) {
|
|
1842
|
-
throw new Error(`~x~> [ZCL BROADCAST] Failed to send with status=${enums_1.SLStatus[status]}.`);
|
|
1609
|
+
throw new Error(`~x~> [ZCL BROADCAST destination=${destination}] Failed to send with status=${enums_1.SLStatus[status]}.`);
|
|
1843
1610
|
}
|
|
1844
1611
|
// NOTE: since ezspMessageSentHandler could take a while here, we don't block, it'll just be logged if the delivery failed
|
|
1845
1612
|
await (0, utils_1.Wait)(QUEUE_BUSY_DEFER_MSEC);
|