zigbee-herdsman 6.0.1 → 6.0.3
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/CHANGELOG.md +16 -0
- package/dist/adapter/ezsp/driver/uart.js +1 -1
- package/dist/adapter/ezsp/driver/uart.js.map +1 -1
- package/dist/adapter/z-stack/adapter/zStackAdapter.js +4 -4
- package/dist/adapter/z-stack/adapter/zStackAdapter.js.map +1 -1
- package/dist/adapter/zigate/adapter/zigateAdapter.js +4 -4
- package/dist/adapter/zigate/adapter/zigateAdapter.js.map +1 -1
- package/dist/controller/model/device.d.ts.map +1 -1
- package/dist/controller/model/device.js +1 -0
- package/dist/controller/model/device.js.map +1 -1
- package/package.json +14 -6
- package/.github/ISSUE_TEMPLATE/config.yml +0 -5
- package/.github/dependabot.yml +0 -22
- package/.github/workflows/ci.yml +0 -64
- package/.github/workflows/release-please.yml +0 -18
- package/.github/workflows/stale.yml +0 -20
- package/.github/workflows/typedoc.yaml +0 -47
- package/.release-please-manifest.json +0 -3
- package/.vscode/extensions.json +0 -3
- package/.vscode/settings.json +0 -11
- package/biome.json +0 -98
- package/examples/join-and-log.js +0 -24
- package/release-please-config.json +0 -9
- package/src/adapter/adapter.ts +0 -189
- package/src/adapter/adapterDiscovery.ts +0 -666
- package/src/adapter/const.ts +0 -12
- package/src/adapter/deconz/adapter/deconzAdapter.ts +0 -877
- package/src/adapter/deconz/driver/constants.ts +0 -246
- package/src/adapter/deconz/driver/driver.ts +0 -1540
- package/src/adapter/deconz/driver/frame.ts +0 -11
- package/src/adapter/deconz/driver/frameParser.ts +0 -753
- package/src/adapter/deconz/driver/parser.ts +0 -45
- package/src/adapter/deconz/driver/writer.ts +0 -22
- package/src/adapter/deconz/types.d.ts +0 -13
- package/src/adapter/ember/adapter/emberAdapter.ts +0 -2265
- package/src/adapter/ember/adapter/endpoints.ts +0 -86
- package/src/adapter/ember/adapter/oneWaitress.ts +0 -324
- package/src/adapter/ember/adapter/tokensManager.ts +0 -782
- package/src/adapter/ember/consts.ts +0 -178
- package/src/adapter/ember/enums.ts +0 -1746
- package/src/adapter/ember/ezsp/buffalo.ts +0 -1392
- package/src/adapter/ember/ezsp/consts.ts +0 -148
- package/src/adapter/ember/ezsp/enums.ts +0 -1114
- package/src/adapter/ember/ezsp/ezsp.ts +0 -9061
- package/src/adapter/ember/ezspError.ts +0 -10
- package/src/adapter/ember/types.ts +0 -866
- package/src/adapter/ember/uart/ash.ts +0 -1960
- package/src/adapter/ember/uart/consts.ts +0 -109
- package/src/adapter/ember/uart/enums.ts +0 -192
- package/src/adapter/ember/uart/parser.ts +0 -48
- package/src/adapter/ember/uart/queues.ts +0 -247
- package/src/adapter/ember/uart/writer.ts +0 -53
- package/src/adapter/ember/utils/initters.ts +0 -58
- package/src/adapter/ember/utils/math.ts +0 -73
- package/src/adapter/events.ts +0 -21
- package/src/adapter/ezsp/adapter/backup.ts +0 -109
- package/src/adapter/ezsp/adapter/ezspAdapter.ts +0 -614
- package/src/adapter/ezsp/driver/commands.ts +0 -2497
- package/src/adapter/ezsp/driver/consts.ts +0 -11
- package/src/adapter/ezsp/driver/driver.ts +0 -1002
- package/src/adapter/ezsp/driver/ezsp.ts +0 -802
- package/src/adapter/ezsp/driver/frame.ts +0 -101
- package/src/adapter/ezsp/driver/index.ts +0 -4
- package/src/adapter/ezsp/driver/multicast.ts +0 -78
- package/src/adapter/ezsp/driver/parser.ts +0 -81
- package/src/adapter/ezsp/driver/types/basic.ts +0 -201
- package/src/adapter/ezsp/driver/types/index.ts +0 -239
- package/src/adapter/ezsp/driver/types/named.ts +0 -2330
- package/src/adapter/ezsp/driver/types/struct.ts +0 -844
- package/src/adapter/ezsp/driver/uart.ts +0 -460
- package/src/adapter/ezsp/driver/utils/crc16ccitt.ts +0 -44
- package/src/adapter/ezsp/driver/utils/index.ts +0 -32
- package/src/adapter/ezsp/driver/writer.ts +0 -64
- package/src/adapter/index.ts +0 -3
- package/src/adapter/serialPort.ts +0 -58
- package/src/adapter/socketPortUtils.ts +0 -16
- package/src/adapter/tstype.ts +0 -78
- package/src/adapter/z-stack/adapter/adapter-backup.ts +0 -519
- package/src/adapter/z-stack/adapter/adapter-nv-memory.ts +0 -457
- package/src/adapter/z-stack/adapter/endpoints.ts +0 -57
- package/src/adapter/z-stack/adapter/manager.ts +0 -543
- package/src/adapter/z-stack/adapter/tstype.ts +0 -6
- package/src/adapter/z-stack/adapter/zStackAdapter.ts +0 -1190
- package/src/adapter/z-stack/constants/af.ts +0 -27
- package/src/adapter/z-stack/constants/common.ts +0 -285
- package/src/adapter/z-stack/constants/dbg.ts +0 -23
- package/src/adapter/z-stack/constants/index.ts +0 -11
- package/src/adapter/z-stack/constants/mac.ts +0 -128
- package/src/adapter/z-stack/constants/sapi.ts +0 -25
- package/src/adapter/z-stack/constants/sys.ts +0 -72
- package/src/adapter/z-stack/constants/util.ts +0 -82
- package/src/adapter/z-stack/constants/utils.ts +0 -14
- package/src/adapter/z-stack/constants/zdo.ts +0 -103
- package/src/adapter/z-stack/models/startup-options.ts +0 -13
- package/src/adapter/z-stack/structs/entries/address-manager-entry.ts +0 -44
- package/src/adapter/z-stack/structs/entries/address-manager-table.ts +0 -19
- package/src/adapter/z-stack/structs/entries/aps-link-key-data-entry.ts +0 -12
- package/src/adapter/z-stack/structs/entries/aps-link-key-data-table.ts +0 -21
- package/src/adapter/z-stack/structs/entries/aps-tc-link-key-entry.ts +0 -19
- package/src/adapter/z-stack/structs/entries/aps-tc-link-key-table.ts +0 -21
- package/src/adapter/z-stack/structs/entries/channel-list.ts +0 -8
- package/src/adapter/z-stack/structs/entries/has-configured.ts +0 -16
- package/src/adapter/z-stack/structs/entries/index.ts +0 -16
- package/src/adapter/z-stack/structs/entries/nib.ts +0 -66
- package/src/adapter/z-stack/structs/entries/nwk-key-descriptor.ts +0 -15
- package/src/adapter/z-stack/structs/entries/nwk-key.ts +0 -13
- package/src/adapter/z-stack/structs/entries/nwk-pan-id.ts +0 -8
- package/src/adapter/z-stack/structs/entries/nwk-sec-material-descriptor-entry.ts +0 -20
- package/src/adapter/z-stack/structs/entries/nwk-sec-material-descriptor-table.ts +0 -19
- package/src/adapter/z-stack/structs/entries/security-manager-entry.ts +0 -33
- package/src/adapter/z-stack/structs/entries/security-manager-table.ts +0 -22
- package/src/adapter/z-stack/structs/index.ts +0 -4
- package/src/adapter/z-stack/structs/serializable-memory-object.ts +0 -14
- package/src/adapter/z-stack/structs/struct.ts +0 -367
- package/src/adapter/z-stack/structs/table.ts +0 -198
- package/src/adapter/z-stack/unpi/constants.ts +0 -33
- package/src/adapter/z-stack/unpi/frame.ts +0 -62
- package/src/adapter/z-stack/unpi/index.ts +0 -4
- package/src/adapter/z-stack/unpi/parser.ts +0 -56
- package/src/adapter/z-stack/unpi/writer.ts +0 -21
- package/src/adapter/z-stack/utils/channel-list.ts +0 -40
- package/src/adapter/z-stack/utils/index.ts +0 -2
- package/src/adapter/z-stack/utils/network-options.ts +0 -26
- package/src/adapter/z-stack/znp/buffaloZnp.ts +0 -175
- package/src/adapter/z-stack/znp/definition.ts +0 -2713
- package/src/adapter/z-stack/znp/index.ts +0 -2
- package/src/adapter/z-stack/znp/parameterType.ts +0 -22
- package/src/adapter/z-stack/znp/tstype.ts +0 -44
- package/src/adapter/z-stack/znp/utils.ts +0 -10
- package/src/adapter/z-stack/znp/znp.ts +0 -342
- package/src/adapter/z-stack/znp/zpiObject.ts +0 -148
- package/src/adapter/zboss/adapter/zbossAdapter.ts +0 -526
- package/src/adapter/zboss/commands.ts +0 -1184
- package/src/adapter/zboss/consts.ts +0 -9
- package/src/adapter/zboss/driver.ts +0 -422
- package/src/adapter/zboss/enums.ts +0 -360
- package/src/adapter/zboss/frame.ts +0 -227
- package/src/adapter/zboss/reader.ts +0 -65
- package/src/adapter/zboss/types.ts +0 -0
- package/src/adapter/zboss/uart.ts +0 -428
- package/src/adapter/zboss/utils.ts +0 -58
- package/src/adapter/zboss/writer.ts +0 -49
- package/src/adapter/zigate/adapter/patchZdoBuffaloBE.ts +0 -27
- package/src/adapter/zigate/adapter/zigateAdapter.ts +0 -618
- package/src/adapter/zigate/driver/LICENSE +0 -17
- package/src/adapter/zigate/driver/buffaloZiGate.ts +0 -212
- package/src/adapter/zigate/driver/commandType.ts +0 -418
- package/src/adapter/zigate/driver/constants.ts +0 -150
- package/src/adapter/zigate/driver/frame.ts +0 -197
- package/src/adapter/zigate/driver/messageType.ts +0 -287
- package/src/adapter/zigate/driver/parameterType.ts +0 -32
- package/src/adapter/zigate/driver/ziGateObject.ts +0 -146
- package/src/adapter/zigate/driver/zigate.ts +0 -423
- package/src/adapter/zoh/adapter/utils.ts +0 -27
- package/src/adapter/zoh/adapter/zohAdapter.ts +0 -838
- package/src/buffalo/buffalo.ts +0 -342
- package/src/buffalo/index.ts +0 -1
- package/src/controller/controller.ts +0 -1022
- package/src/controller/database.ts +0 -124
- package/src/controller/events.ts +0 -52
- package/src/controller/greenPower.ts +0 -603
- package/src/controller/helpers/index.ts +0 -1
- package/src/controller/helpers/installCodes.ts +0 -107
- package/src/controller/helpers/request.ts +0 -96
- package/src/controller/helpers/requestQueue.ts +0 -125
- package/src/controller/helpers/zclFrameConverter.ts +0 -47
- package/src/controller/helpers/zclTransactionSequenceNumber.ts +0 -19
- package/src/controller/index.ts +0 -6
- package/src/controller/model/device.ts +0 -1248
- package/src/controller/model/endpoint.ts +0 -1105
- package/src/controller/model/entity.ts +0 -23
- package/src/controller/model/group.ts +0 -424
- package/src/controller/model/index.ts +0 -5
- package/src/controller/model/zigbeeEntity.ts +0 -30
- package/src/controller/touchlink.ts +0 -189
- package/src/controller/tstype.ts +0 -274
- package/src/index.ts +0 -12
- package/src/models/backup-storage-legacy.ts +0 -48
- package/src/models/backup-storage-unified.ts +0 -47
- package/src/models/backup.ts +0 -37
- package/src/models/index.ts +0 -5
- package/src/models/network-options.ts +0 -11
- package/src/utils/backup.ts +0 -152
- package/src/utils/index.ts +0 -5
- package/src/utils/logger.ts +0 -20
- package/src/utils/patchBigIntSerialization.ts +0 -8
- package/src/utils/queue.ts +0 -76
- package/src/utils/types.d.ts +0 -3
- package/src/utils/utils.ts +0 -19
- package/src/utils/wait.ts +0 -5
- package/src/utils/waitress.ts +0 -96
- package/src/zspec/consts.ts +0 -84
- package/src/zspec/enums.ts +0 -22
- package/src/zspec/index.ts +0 -3
- package/src/zspec/tstypes.ts +0 -18
- package/src/zspec/utils.ts +0 -247
- package/src/zspec/zcl/buffaloZcl.ts +0 -1220
- package/src/zspec/zcl/definition/cluster.ts +0 -5915
- package/src/zspec/zcl/definition/clusters-typegen.ts +0 -588
- package/src/zspec/zcl/definition/clusters-types.ts +0 -7331
- package/src/zspec/zcl/definition/consts.ts +0 -24
- package/src/zspec/zcl/definition/enums.ts +0 -203
- package/src/zspec/zcl/definition/foundation.ts +0 -329
- package/src/zspec/zcl/definition/manufacturerCode.ts +0 -729
- package/src/zspec/zcl/definition/status.ts +0 -69
- package/src/zspec/zcl/definition/tstype.ts +0 -377
- package/src/zspec/zcl/index.ts +0 -11
- package/src/zspec/zcl/utils.ts +0 -321
- package/src/zspec/zcl/zclFrame.ts +0 -356
- package/src/zspec/zcl/zclHeader.ts +0 -102
- package/src/zspec/zcl/zclStatusError.ts +0 -10
- package/src/zspec/zdo/buffaloZdo.ts +0 -2336
- package/src/zspec/zdo/definition/clusters.ts +0 -722
- package/src/zspec/zdo/definition/consts.ts +0 -16
- package/src/zspec/zdo/definition/enums.ts +0 -99
- package/src/zspec/zdo/definition/status.ts +0 -105
- package/src/zspec/zdo/definition/tstypes.ts +0 -1062
- package/src/zspec/zdo/index.ts +0 -7
- package/src/zspec/zdo/utils.ts +0 -76
- package/src/zspec/zdo/zdoStatusError.ts +0 -10
- package/test/adapter/adapter.test.ts +0 -1062
- package/test/adapter/ember/ash.test.ts +0 -337
- package/test/adapter/ember/consts.ts +0 -131
- package/test/adapter/ember/emberAdapter.test.ts +0 -3449
- package/test/adapter/ember/ezsp.test.ts +0 -385
- package/test/adapter/ember/ezspBuffalo.test.ts +0 -93
- package/test/adapter/ember/ezspError.test.ts +0 -12
- package/test/adapter/ember/math.test.ts +0 -206
- package/test/adapter/ezsp/frame.test.ts +0 -30
- package/test/adapter/ezsp/uart.test.ts +0 -181
- package/test/adapter/z-stack/adapter.test.ts +0 -3984
- package/test/adapter/z-stack/constants.test.ts +0 -33
- package/test/adapter/z-stack/structs.test.ts +0 -115
- package/test/adapter/z-stack/unpi.test.ts +0 -213
- package/test/adapter/z-stack/znp.test.ts +0 -1284
- package/test/adapter/zboss/fixZdoResponse.test.ts +0 -179
- package/test/adapter/zigate/patchZdoBuffaloBE.test.ts +0 -81
- package/test/adapter/zigate/zdo.test.ts +0 -187
- package/test/adapter/zoh/utils.test.ts +0 -36
- package/test/adapter/zoh/zohAdapter.test.ts +0 -1307
- package/test/buffalo.test.ts +0 -431
- package/test/controller.bench.ts +0 -193
- package/test/controller.test.ts +0 -8702
- package/test/greenpower.test.ts +0 -1408
- package/test/mockAdapters.ts +0 -65
- package/test/mockDevices.ts +0 -598
- package/test/requests.bench.ts +0 -206
- package/test/testUtils.ts +0 -20
- package/test/tsconfig.json +0 -9
- package/test/utils/math.ts +0 -19
- package/test/utils.test.ts +0 -279
- package/test/vitest.config.mts +0 -27
- package/test/zcl.test.ts +0 -2831
- package/test/zspec/utils.test.ts +0 -68
- package/test/zspec/zcl/buffalo.test.ts +0 -1374
- package/test/zspec/zcl/frame.test.ts +0 -960
- package/test/zspec/zcl/utils.test.ts +0 -273
- package/test/zspec/zdo/buffalo.test.ts +0 -1850
- package/test/zspec/zdo/utils.test.ts +0 -241
- package/tsconfig.json +0 -24
|
@@ -1,86 +0,0 @@
|
|
|
1
|
-
import {GP_ENDPOINT, GP_PROFILE_ID, HA_PROFILE_ID} from "../../../zspec/consts";
|
|
2
|
-
import {Clusters} from "../../../zspec/zcl/definition/cluster";
|
|
3
|
-
import type {ClusterId, EmberMulticastId, ProfileId} from "../types";
|
|
4
|
-
|
|
5
|
-
type FixedEndpointInfo = {
|
|
6
|
-
/** Actual Zigbee endpoint number. uint8_t */
|
|
7
|
-
endpoint: number;
|
|
8
|
-
/** Profile ID of the device on this endpoint. */
|
|
9
|
-
profileId: ProfileId;
|
|
10
|
-
/** Device ID of the device on this endpoint. uint16_t*/
|
|
11
|
-
deviceId: number;
|
|
12
|
-
/** Version of the device. uint8_t */
|
|
13
|
-
deviceVersion: number;
|
|
14
|
-
/** List of server clusters. */
|
|
15
|
-
inClusterList: readonly ClusterId[];
|
|
16
|
-
/** List of client clusters. */
|
|
17
|
-
outClusterList: readonly ClusterId[];
|
|
18
|
-
/** Network index for this endpoint. uint8_t */
|
|
19
|
-
networkIndex: number;
|
|
20
|
-
/** Multicast group IDs to register in the multicast table */
|
|
21
|
-
multicastIds: readonly EmberMulticastId[];
|
|
22
|
-
};
|
|
23
|
-
|
|
24
|
-
/**
|
|
25
|
-
* List of endpoints to register.
|
|
26
|
-
*
|
|
27
|
-
* Index 0 is used as default and expected to be the primary network.
|
|
28
|
-
*/
|
|
29
|
-
export const FIXED_ENDPOINTS: readonly FixedEndpointInfo[] = [
|
|
30
|
-
{
|
|
31
|
-
// primary network
|
|
32
|
-
endpoint: 1,
|
|
33
|
-
profileId: HA_PROFILE_ID,
|
|
34
|
-
deviceId: 0x65, // ?
|
|
35
|
-
deviceVersion: 1,
|
|
36
|
-
inClusterList: [
|
|
37
|
-
Clusters.genBasic.ID, // 0x0000,// Basic
|
|
38
|
-
Clusters.genIdentify.ID, // 0x0003,// Identify
|
|
39
|
-
Clusters.genOnOff.ID, // 0x0006,// On/off
|
|
40
|
-
Clusters.genLevelCtrl.ID, // 0x0008,// Level Control
|
|
41
|
-
Clusters.genTime.ID, // 0x000A,// Time
|
|
42
|
-
Clusters.genOta.ID, // 0x0019,// Over the Air Bootloading
|
|
43
|
-
// Cluster.genPowerProfile.ID,// 0x001A,// Power Profile XXX: missing ZCL cluster def in Z2M?
|
|
44
|
-
Clusters.lightingColorCtrl.ID, // 0x0300,// Color Control
|
|
45
|
-
],
|
|
46
|
-
outClusterList: [
|
|
47
|
-
Clusters.genBasic.ID, // 0x0000,// Basic
|
|
48
|
-
Clusters.genIdentify.ID, // 0x0003,// Identify
|
|
49
|
-
Clusters.genGroups.ID, // 0x0004,// Groups
|
|
50
|
-
Clusters.genScenes.ID, // 0x0005,// Scenes
|
|
51
|
-
Clusters.genOnOff.ID, // 0x0006,// On/off
|
|
52
|
-
Clusters.genLevelCtrl.ID, // 0x0008,// Level Control
|
|
53
|
-
Clusters.genPollCtrl.ID, // 0x0020,// Poll Control
|
|
54
|
-
Clusters.lightingColorCtrl.ID, // 0x0300,// Color Control
|
|
55
|
-
Clusters.msIlluminanceMeasurement.ID, // 0x0400,// Illuminance Measurement
|
|
56
|
-
Clusters.msTemperatureMeasurement.ID, // 0x0402,// Temperature Measurement
|
|
57
|
-
Clusters.msRelativeHumidity.ID, // 0x0405,// Relative Humidity Measurement
|
|
58
|
-
Clusters.msOccupancySensing.ID, // 0x0406,// Occupancy Sensing
|
|
59
|
-
Clusters.ssIasZone.ID, // 0x0500,// IAS Zone
|
|
60
|
-
Clusters.seMetering.ID, // 0x0702,// Simple Metering
|
|
61
|
-
Clusters.haMeterIdentification.ID, // 0x0B01,// Meter Identification
|
|
62
|
-
Clusters.haApplianceStatistics.ID, // 0x0B03,// Appliance Statistics
|
|
63
|
-
Clusters.haElectricalMeasurement.ID, // 0x0B04,// Electrical Measurement
|
|
64
|
-
Clusters.touchlink.ID, // 0x1000, // touchlink
|
|
65
|
-
],
|
|
66
|
-
networkIndex: 0x00,
|
|
67
|
-
// - Cluster spec 3.7.2.4.1: group identifier 0x0000 is reserved for the global scene used by the OnOff cluster.
|
|
68
|
-
// - 901: defaultBindGroup
|
|
69
|
-
multicastIds: [0, 901],
|
|
70
|
-
},
|
|
71
|
-
{
|
|
72
|
-
// green power
|
|
73
|
-
endpoint: GP_ENDPOINT,
|
|
74
|
-
profileId: GP_PROFILE_ID,
|
|
75
|
-
deviceId: 0x66,
|
|
76
|
-
deviceVersion: 1,
|
|
77
|
-
inClusterList: [
|
|
78
|
-
Clusters.greenPower.ID, // 0x0021,// Green Power
|
|
79
|
-
],
|
|
80
|
-
outClusterList: [
|
|
81
|
-
Clusters.greenPower.ID, // 0x0021,// Green Power
|
|
82
|
-
],
|
|
83
|
-
networkIndex: 0x00,
|
|
84
|
-
multicastIds: [0x0b84],
|
|
85
|
-
},
|
|
86
|
-
];
|
|
@@ -1,324 +0,0 @@
|
|
|
1
|
-
/* v8 ignore start */
|
|
2
|
-
|
|
3
|
-
import equals from "fast-deep-equal/es6";
|
|
4
|
-
|
|
5
|
-
import {TOUCHLINK_PROFILE_ID} from "../../../zspec/consts";
|
|
6
|
-
import type {Eui64, NodeId} from "../../../zspec/tstypes";
|
|
7
|
-
import type {ZclPayload} from "../../events";
|
|
8
|
-
import type {EmberApsFrame} from "../types";
|
|
9
|
-
|
|
10
|
-
/** Events specific to OneWaitress usage. */
|
|
11
|
-
export enum OneWaitressEvents {
|
|
12
|
-
STACK_STATUS_NETWORK_UP = "STACK_STATUS_NETWORK_UP",
|
|
13
|
-
STACK_STATUS_NETWORK_DOWN = "STACK_STATUS_NETWORK_DOWN",
|
|
14
|
-
STACK_STATUS_NETWORK_OPENED = "STACK_STATUS_NETWORK_OPENED",
|
|
15
|
-
STACK_STATUS_NETWORK_CLOSED = "STACK_STATUS_NETWORK_CLOSED",
|
|
16
|
-
}
|
|
17
|
-
|
|
18
|
-
type OneWaitressMatcher = {
|
|
19
|
-
/**
|
|
20
|
-
* Matches `indexOrDestination` in `ezspMessageSentHandler` or `sender` in `ezspIncomingMessageHandler`
|
|
21
|
-
* EUI64 is currently only for NetworkAddress Request/Response
|
|
22
|
-
* Except for InterPAN touchlink, it should always be present.
|
|
23
|
-
*/
|
|
24
|
-
target?: NodeId | Eui64;
|
|
25
|
-
apsFrame: EmberApsFrame;
|
|
26
|
-
/** Cluster ID for ZDO (because request !== response). */
|
|
27
|
-
zdoResponseClusterId?: number;
|
|
28
|
-
/** ZCL frame transaction sequence number */
|
|
29
|
-
zclSequence?: number;
|
|
30
|
-
/** Expected command ID for ZCL commands */
|
|
31
|
-
commandIdentifier?: number;
|
|
32
|
-
};
|
|
33
|
-
|
|
34
|
-
type OneWaitressEventMatcher = {
|
|
35
|
-
eventName: string;
|
|
36
|
-
/** If supplied, keys/values are expected to match with resolve payload. */
|
|
37
|
-
payload?: {[k: string]: unknown};
|
|
38
|
-
};
|
|
39
|
-
|
|
40
|
-
interface Waiter<A, B> {
|
|
41
|
-
id: number;
|
|
42
|
-
matcher: A;
|
|
43
|
-
timer?: NodeJS.Timeout;
|
|
44
|
-
resolve: (payload: B) => void;
|
|
45
|
-
reject: (error: Error) => void;
|
|
46
|
-
resolved: boolean;
|
|
47
|
-
timedout: boolean;
|
|
48
|
-
}
|
|
49
|
-
|
|
50
|
-
/**
|
|
51
|
-
* The one waitress to rule them all. Hopefully.
|
|
52
|
-
* Careful, she'll burn you if you're late on delivery!
|
|
53
|
-
*
|
|
54
|
-
* NOTE: `messageTag` is unreliable, so not used...
|
|
55
|
-
*/
|
|
56
|
-
export class EmberOneWaitress {
|
|
57
|
-
// biome-ignore lint/suspicious/noExplicitAny: API
|
|
58
|
-
private readonly waiters: Map<number, Waiter<OneWaitressMatcher, any>>;
|
|
59
|
-
// NOTE: for now, this could be much simpler (array-like), but more complex events might come into play
|
|
60
|
-
// biome-ignore lint/suspicious/noExplicitAny: API
|
|
61
|
-
private readonly eventWaiters: Map<number, Waiter<OneWaitressEventMatcher, any>>;
|
|
62
|
-
private currentId: number;
|
|
63
|
-
private currentEventId: number;
|
|
64
|
-
|
|
65
|
-
public constructor() {
|
|
66
|
-
this.waiters = new Map();
|
|
67
|
-
this.eventWaiters = new Map();
|
|
68
|
-
this.currentId = 0;
|
|
69
|
-
this.currentEventId = 0;
|
|
70
|
-
}
|
|
71
|
-
|
|
72
|
-
/**
|
|
73
|
-
* Reject because of failed delivery notified by `ezspMessageSentHandler`.
|
|
74
|
-
* NOTE: This checks for APS sequence, which is only valid in `ezspMessageSentHandler`, not `ezspIncomingMessageHandler` (sequence from stack)
|
|
75
|
-
*
|
|
76
|
-
* @param target
|
|
77
|
-
* @param apsFrame
|
|
78
|
-
* @returns
|
|
79
|
-
*/
|
|
80
|
-
public deliveryFailedFor(target: number, apsFrame: EmberApsFrame): boolean {
|
|
81
|
-
for (const [index, waiter] of this.waiters.entries()) {
|
|
82
|
-
if (waiter.timedout) {
|
|
83
|
-
this.waiters.delete(index);
|
|
84
|
-
continue;
|
|
85
|
-
}
|
|
86
|
-
|
|
87
|
-
// no target in touchlink
|
|
88
|
-
// in `ezspMessageSentHandler`, the clusterId for ZDO is still the request one, so check against apsFrame, not override
|
|
89
|
-
if (
|
|
90
|
-
(waiter.matcher.apsFrame.profileId === TOUCHLINK_PROFILE_ID || target === waiter.matcher.target) &&
|
|
91
|
-
apsFrame.sequence === waiter.matcher.apsFrame.sequence &&
|
|
92
|
-
apsFrame.profileId === waiter.matcher.apsFrame.profileId &&
|
|
93
|
-
apsFrame.clusterId === waiter.matcher.apsFrame.clusterId
|
|
94
|
-
) {
|
|
95
|
-
clearTimeout(waiter.timer);
|
|
96
|
-
|
|
97
|
-
waiter.resolved = true;
|
|
98
|
-
|
|
99
|
-
this.waiters.delete(index);
|
|
100
|
-
waiter.reject(new Error(`Delivery failed for '${target}'.`));
|
|
101
|
-
|
|
102
|
-
return true;
|
|
103
|
-
}
|
|
104
|
-
}
|
|
105
|
-
|
|
106
|
-
return false;
|
|
107
|
-
}
|
|
108
|
-
|
|
109
|
-
/**
|
|
110
|
-
* Resolve ZDO response payload.
|
|
111
|
-
* @param sender Node ID or EUI64 in the response
|
|
112
|
-
* @param apsFrame APS Frame in the response
|
|
113
|
-
* @param payload Payload to resolve
|
|
114
|
-
* @returns True if resolved a waiter
|
|
115
|
-
*/
|
|
116
|
-
public resolveZDO(sender: NodeId | Eui64, apsFrame: EmberApsFrame, payload: unknown): boolean {
|
|
117
|
-
for (const [index, waiter] of this.waiters.entries()) {
|
|
118
|
-
if (waiter.timedout) {
|
|
119
|
-
this.waiters.delete(index);
|
|
120
|
-
continue;
|
|
121
|
-
}
|
|
122
|
-
|
|
123
|
-
if (
|
|
124
|
-
waiter.matcher.zdoResponseClusterId !== undefined && // skip if not a zdo waiter
|
|
125
|
-
sender === waiter.matcher.target && // always a sender expected in ZDO
|
|
126
|
-
apsFrame.profileId === waiter.matcher.apsFrame.profileId && // profileId is a bit redundant here, but...
|
|
127
|
-
apsFrame.clusterId === waiter.matcher.zdoResponseClusterId
|
|
128
|
-
) {
|
|
129
|
-
clearTimeout(waiter.timer);
|
|
130
|
-
|
|
131
|
-
waiter.resolved = true;
|
|
132
|
-
|
|
133
|
-
this.waiters.delete(index);
|
|
134
|
-
waiter.resolve(payload);
|
|
135
|
-
|
|
136
|
-
return true;
|
|
137
|
-
}
|
|
138
|
-
}
|
|
139
|
-
|
|
140
|
-
return false;
|
|
141
|
-
}
|
|
142
|
-
|
|
143
|
-
/**
|
|
144
|
-
* Resolve ZCL response payload
|
|
145
|
-
* @param payload Payload to resolve
|
|
146
|
-
* @returns True if resolved a waiter
|
|
147
|
-
*/
|
|
148
|
-
public resolveZCL(payload: ZclPayload): boolean {
|
|
149
|
-
if (!payload.header) return false;
|
|
150
|
-
|
|
151
|
-
for (const [index, waiter] of this.waiters.entries()) {
|
|
152
|
-
if (waiter.timedout) {
|
|
153
|
-
this.waiters.delete(index);
|
|
154
|
-
continue;
|
|
155
|
-
}
|
|
156
|
-
|
|
157
|
-
// no target in touchlink, also no APS sequence, but use the ZCL one instead
|
|
158
|
-
if (
|
|
159
|
-
(waiter.matcher.apsFrame.profileId === TOUCHLINK_PROFILE_ID ||
|
|
160
|
-
(payload.address === waiter.matcher.target && payload.endpoint === waiter.matcher.apsFrame.destinationEndpoint)) &&
|
|
161
|
-
(waiter.matcher.zclSequence === undefined || payload.header.transactionSequenceNumber === waiter.matcher.zclSequence) &&
|
|
162
|
-
(waiter.matcher.commandIdentifier === undefined || payload.header.commandIdentifier === waiter.matcher.commandIdentifier) &&
|
|
163
|
-
payload.clusterID === waiter.matcher.apsFrame.clusterId
|
|
164
|
-
) {
|
|
165
|
-
clearTimeout(waiter.timer);
|
|
166
|
-
|
|
167
|
-
waiter.resolved = true;
|
|
168
|
-
|
|
169
|
-
this.waiters.delete(index);
|
|
170
|
-
waiter.resolve(payload);
|
|
171
|
-
|
|
172
|
-
return true;
|
|
173
|
-
}
|
|
174
|
-
}
|
|
175
|
-
|
|
176
|
-
return false;
|
|
177
|
-
}
|
|
178
|
-
|
|
179
|
-
public waitFor<T>(matcher: OneWaitressMatcher, timeout: number): {id: number; start: () => {promise: Promise<T>; id: number}} {
|
|
180
|
-
this.currentId += 1;
|
|
181
|
-
const id = this.currentId;
|
|
182
|
-
this.currentId &= 0xffff; // roll-over every so often - 65535 should be enough not to create conflicts ;-)
|
|
183
|
-
|
|
184
|
-
const promise: Promise<T> = new Promise((resolve, reject): void => {
|
|
185
|
-
const object: Waiter<typeof matcher, T> = {matcher, resolve, reject, timedout: false, resolved: false, id};
|
|
186
|
-
|
|
187
|
-
this.waiters.set(id, object);
|
|
188
|
-
});
|
|
189
|
-
|
|
190
|
-
const start = (): {promise: Promise<T>; id: number} => {
|
|
191
|
-
const waiter = this.waiters.get(id);
|
|
192
|
-
|
|
193
|
-
if (waiter && !waiter.resolved && !waiter.timer) {
|
|
194
|
-
// Capture the stack trace from the caller of start()
|
|
195
|
-
const error = new Error();
|
|
196
|
-
Error.captureStackTrace(error);
|
|
197
|
-
|
|
198
|
-
waiter.timer = setTimeout((): void => {
|
|
199
|
-
error.message = `${JSON.stringify(matcher)} timed out after ${timeout}ms`;
|
|
200
|
-
waiter.timedout = true;
|
|
201
|
-
|
|
202
|
-
waiter.reject(error);
|
|
203
|
-
}, timeout);
|
|
204
|
-
}
|
|
205
|
-
|
|
206
|
-
return {promise, id};
|
|
207
|
-
};
|
|
208
|
-
|
|
209
|
-
return {id, start};
|
|
210
|
-
}
|
|
211
|
-
|
|
212
|
-
/**
|
|
213
|
-
* Shortcut that starts the timer immediately and returns the promise.
|
|
214
|
-
* No access to `id`, so no easy cancel.
|
|
215
|
-
* @param matcher
|
|
216
|
-
* @param timeout
|
|
217
|
-
* @returns
|
|
218
|
-
*/
|
|
219
|
-
public startWaitingFor<T>(matcher: OneWaitressMatcher, timeout: number): Promise<T> {
|
|
220
|
-
return this.waitFor<T>(matcher, timeout).start().promise;
|
|
221
|
-
}
|
|
222
|
-
|
|
223
|
-
public remove(id: number): void {
|
|
224
|
-
const waiter = this.waiters.get(id);
|
|
225
|
-
|
|
226
|
-
if (waiter) {
|
|
227
|
-
if (!waiter.timedout && waiter.timer) {
|
|
228
|
-
clearTimeout(waiter.timer);
|
|
229
|
-
}
|
|
230
|
-
|
|
231
|
-
this.waiters.delete(id);
|
|
232
|
-
}
|
|
233
|
-
}
|
|
234
|
-
|
|
235
|
-
/**
|
|
236
|
-
* Matches event name with matcher's, and payload (if any in matcher) using `fast-deep-equal/es6` (all keys & values must match)
|
|
237
|
-
* @param eventName
|
|
238
|
-
* @param payload
|
|
239
|
-
* @returns
|
|
240
|
-
*/
|
|
241
|
-
public resolveEvent(eventName: string, payload?: {[k: string]: unknown}): boolean {
|
|
242
|
-
for (const [index, waiter] of this.eventWaiters.entries()) {
|
|
243
|
-
if (waiter.timedout) {
|
|
244
|
-
this.eventWaiters.delete(index);
|
|
245
|
-
continue;
|
|
246
|
-
}
|
|
247
|
-
|
|
248
|
-
if (eventName === waiter.matcher.eventName && (!waiter.matcher.payload || equals(payload, waiter.matcher.payload))) {
|
|
249
|
-
clearTimeout(waiter.timer);
|
|
250
|
-
|
|
251
|
-
waiter.resolved = true;
|
|
252
|
-
|
|
253
|
-
this.eventWaiters.delete(index);
|
|
254
|
-
waiter.resolve(payload);
|
|
255
|
-
|
|
256
|
-
return true;
|
|
257
|
-
}
|
|
258
|
-
}
|
|
259
|
-
|
|
260
|
-
return false;
|
|
261
|
-
}
|
|
262
|
-
|
|
263
|
-
public waitForEvent<T>(
|
|
264
|
-
matcher: OneWaitressEventMatcher,
|
|
265
|
-
timeout: number,
|
|
266
|
-
reason?: string,
|
|
267
|
-
): {id: number; start: () => {promise: Promise<T>; id: number}} {
|
|
268
|
-
// NOTE: logic is very much the same as `waitFor`, just different matcher
|
|
269
|
-
this.currentEventId += 1;
|
|
270
|
-
const id = this.currentEventId;
|
|
271
|
-
this.currentEventId &= 0xffff; // roll-over every so often - 65535 should be enough not to create conflicts ;-)
|
|
272
|
-
|
|
273
|
-
const promise: Promise<T> = new Promise((resolve, reject): void => {
|
|
274
|
-
const object: Waiter<typeof matcher, T> = {matcher, resolve, reject, timedout: false, resolved: false, id};
|
|
275
|
-
|
|
276
|
-
this.eventWaiters.set(id, object);
|
|
277
|
-
});
|
|
278
|
-
|
|
279
|
-
const start = (): {promise: Promise<T>; id: number} => {
|
|
280
|
-
const waiter = this.eventWaiters.get(id);
|
|
281
|
-
|
|
282
|
-
if (waiter && !waiter.resolved && !waiter.timer) {
|
|
283
|
-
// Capture the stack trace from the caller of start()
|
|
284
|
-
const error = new Error();
|
|
285
|
-
Error.captureStackTrace(error);
|
|
286
|
-
|
|
287
|
-
waiter.timer = setTimeout((): void => {
|
|
288
|
-
error.message = `${reason ? reason : JSON.stringify(matcher)} timed out after ${timeout}ms`;
|
|
289
|
-
waiter.timedout = true;
|
|
290
|
-
|
|
291
|
-
waiter.reject(error);
|
|
292
|
-
}, timeout);
|
|
293
|
-
}
|
|
294
|
-
|
|
295
|
-
return {promise, id};
|
|
296
|
-
};
|
|
297
|
-
|
|
298
|
-
return {id, start};
|
|
299
|
-
}
|
|
300
|
-
|
|
301
|
-
/**
|
|
302
|
-
* Shortcut that starts the timer immediately and returns the promise.
|
|
303
|
-
* No access to `id`, so no easy cancel.
|
|
304
|
-
* @param matcher
|
|
305
|
-
* @param timeout
|
|
306
|
-
* @param reason If supplied, will be used as timeout label, otherwise stringified matcher is.
|
|
307
|
-
* @returns
|
|
308
|
-
*/
|
|
309
|
-
public startWaitingForEvent<T>(matcher: OneWaitressEventMatcher, timeout: number, reason?: string): Promise<T> {
|
|
310
|
-
return this.waitForEvent<T>(matcher, timeout, reason).start().promise;
|
|
311
|
-
}
|
|
312
|
-
|
|
313
|
-
public removeEvent(id: number): void {
|
|
314
|
-
const waiter = this.eventWaiters.get(id);
|
|
315
|
-
|
|
316
|
-
if (waiter) {
|
|
317
|
-
if (!waiter.timedout && waiter.timer) {
|
|
318
|
-
clearTimeout(waiter.timer);
|
|
319
|
-
}
|
|
320
|
-
|
|
321
|
-
this.eventWaiters.delete(id);
|
|
322
|
-
}
|
|
323
|
-
}
|
|
324
|
-
}
|