Skip to content

Commit e505c90

Browse files
committed
fix(alarms): Declare Get Alarm Response for getAlarm
getAlarm had no response, so with response matching by command its Get Alarm Response (0x01) no longer resolved the call. Before, it only resolved by TSN, parsed as resetAllAlarms with no args. Status-dependent payload per ZCL R8 3.11.2.5.1.
1 parent b36d342 commit e505c90

3 files changed

Lines changed: 47 additions & 1 deletion

File tree

‎index.d.ts‎

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -490,7 +490,12 @@ declare module "zigbee-clusters" {
490490
timeout?: number,
491491
disableDefaultResponse?: boolean,
492492
},
493-
): Promise<void>;
493+
): Promise<{
494+
status?: types.ZCLEnum8Status,
495+
alarmCode?: number,
496+
clusterId?: number,
497+
timeStamp?: number,
498+
}>;
494499
resetAlarmLog(
495500
args?: {
496501
manufacturerId?: number,

‎lib/clusters/alarms.js‎

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
'use strict';
22

33
const Cluster = require('../Cluster');
4+
const { ZCLDataTypes } = require('../zclTypes');
45

56
const ATTRIBUTES = {};
67

@@ -10,6 +11,17 @@ const COMMANDS = {
1011
},
1112
getAlarm: {
1213
id: 2,
14+
response: {
15+
id: 1,
16+
encodeMissingFieldsBehavior: 'skip',
17+
args: {
18+
status: ZCLDataTypes.enum8Status,
19+
// Remaining fields only present when status is SUCCESS
20+
alarmCode: ZCLDataTypes.uint8,
21+
clusterId: ZCLDataTypes.uint16,
22+
timeStamp: ZCLDataTypes.uint32,
23+
},
24+
},
1325
},
1426
resetAlarmLog: {
1527
id: 3,

‎test/testClusterResponseTimeout.js‎

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ const sinon = require('sinon');
77
const Node = require('../lib/Node');
88
const BoundCluster = require('../lib/BoundCluster');
99
const OnOffCluster = require('../lib/clusters/onOff');
10+
const AlarmsCluster = require('../lib/clusters/alarms');
1011

1112
const sandbox = sinon.createSandbox();
1213

@@ -127,4 +128,32 @@ describe('Cluster Response Timeout', function() {
127128
assert.deepStrictEqual(reportedValues, [true]);
128129
assert.strictEqual(result, undefined);
129130
});
131+
132+
it('should resolve getAlarm with a Get Alarm Response alone', async function() {
133+
const pair = [AlarmsCluster.ID];
134+
const sender = new Node({
135+
// eslint-disable-next-line no-use-before-define
136+
sendFrame: (...args) => receiver.handleFrame(...args),
137+
endpointDescriptors: [{ endpointId: 1, inputClusters: pair }],
138+
});
139+
const receiver = new Node({
140+
sendFrame: (...args) => sender.handleFrame(...args),
141+
endpointDescriptors: [{ endpointId: 1, inputClusters: pair }],
142+
});
143+
receiver.endpoints[1].bind('alarms', new class extends BoundCluster {
144+
145+
getAlarm() {
146+
return {
147+
status: 'SUCCESS', alarmCode: 2, clusterId: 6, timeStamp: 1234,
148+
};
149+
}
150+
151+
}());
152+
153+
const { alarms } = sender.endpoints[1].clusters;
154+
const response = await alarms.getAlarm(undefined, { timeout: 1000 });
155+
156+
assert.strictEqual(response.alarmCode, 2);
157+
assert.strictEqual(response.timeStamp, 1234);
158+
});
130159
});

0 commit comments

Comments
 (0)