Skip to content

Commit 60c2593

Browse files
committed
Skip state when brightness is also published (reduces amount of useless zigbee commands).
1 parent db945c9 commit 60c2593

File tree

2 files changed

+24
-11
lines changed

2 files changed

+24
-11
lines changed

lib/extension/devicePublish.js

+6
Original file line numberDiff line numberDiff line change
@@ -107,6 +107,12 @@ class DevicePublish {
107107
endpoint = eps.hasOwnProperty(topic.postfix) ? eps[topic.postfix] : null;
108108
}
109109

110+
// When brightness is present skip state; brightness also handles state.
111+
if (json.hasOwnProperty('brightness') && json.hasOwnProperty('state')) {
112+
logger.debug(`Skipping 'state' because of 'brightness'`);
113+
delete json.state;
114+
}
115+
110116
// For each key in the JSON message find the matching converter.
111117
Object.keys(json).forEach((key) => {
112118
const converter = model.toZigbee.find((c) => c.key === key);

test/devicePublish.test.js

+18-11
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,9 @@ const mqtt = {
1111

1212
const zigbee = {
1313
getDevice: null,
14-
publish: sinon.spy(),
14+
publish: sandbox.stub().callsFake((ieeAddr, cid, cmd, cmdType, zclData, cfg, ep, callback) => {
15+
callback(false, null);
16+
}),
1517
};
1618

1719
const cfg = {
@@ -26,7 +28,7 @@ describe('DevicePublish', () => {
2628

2729
beforeEach(() => {
2830
utils.stubLogger(sandbox);
29-
devicePublish = new DevicePublish(zigbee, mqtt, null, null);
31+
devicePublish = new DevicePublish(zigbee, mqtt, null, () => {});
3032
});
3133

3234
afterEach(() => {
@@ -37,7 +39,6 @@ describe('DevicePublish', () => {
3739
it('Should publish messages to zigbee devices', () => {
3840
zigbee.publish.resetHistory();
3941
zigbee.getDevice = sinon.fake.returns({modelId: 'TRADFRI bulb E27 CWS opal 600lm'});
40-
devicePublish = new DevicePublish(zigbee, mqtt, null, null);
4142
devicePublish.onMQTTMessage('zigbee2mqtt/0x12345678/set', JSON.stringify({brightness: '200'}));
4243
chai.assert.isTrue(zigbee.publish.calledOnce);
4344
chai.assert.strictEqual(zigbee.publish.getCall(0).args[0], '0x12345678');
@@ -52,7 +53,6 @@ describe('DevicePublish', () => {
5253
it('Should publish messages to zigbee devices when brightness is in %', () => {
5354
zigbee.publish.resetHistory();
5455
zigbee.getDevice = sinon.fake.returns({modelId: 'TRADFRI bulb E27 CWS opal 600lm'});
55-
devicePublish = new DevicePublish(zigbee, mqtt, null, null);
5656
devicePublish.onMQTTMessage('zigbee2mqtt/0x12345678/set', JSON.stringify({brightness: '92%'}));
5757
chai.assert.isTrue(zigbee.publish.calledOnce);
5858
chai.assert.strictEqual(zigbee.publish.getCall(0).args[0], '0x12345678');
@@ -67,7 +67,6 @@ describe('DevicePublish', () => {
6767
it('Should publish messages to zigbee devices when brightness is in number', () => {
6868
zigbee.publish.resetHistory();
6969
zigbee.getDevice = sinon.fake.returns({modelId: 'TRADFRI bulb E27 CWS opal 600lm'});
70-
devicePublish = new DevicePublish(zigbee, mqtt, null, null);
7170
devicePublish.onMQTTMessage('zigbee2mqtt/0x12345678/set', JSON.stringify({brightness: 230}));
7271
chai.assert.isTrue(zigbee.publish.calledOnce);
7372
chai.assert.strictEqual(zigbee.publish.getCall(0).args[0], '0x12345678');
@@ -82,7 +81,6 @@ describe('DevicePublish', () => {
8281
it('Should publish messages to zigbee devices with color_temp', () => {
8382
zigbee.publish.resetHistory();
8483
zigbee.getDevice = sinon.fake.returns({modelId: 'TRADFRI bulb E27 CWS opal 600lm'});
85-
devicePublish = new DevicePublish(zigbee, mqtt, null, null);
8684
devicePublish.onMQTTMessage('zigbee2mqtt/0x12345678/set', JSON.stringify({color_temp: '222'}));
8785
chai.assert.isTrue(zigbee.publish.calledOnce);
8886
chai.assert.strictEqual(zigbee.publish.getCall(0).args[0], '0x12345678');
@@ -97,7 +95,6 @@ describe('DevicePublish', () => {
9795
it('Should publish messages to zigbee devices with color_temp in %', () => {
9896
zigbee.publish.resetHistory();
9997
zigbee.getDevice = sinon.fake.returns({modelId: 'TRADFRI bulb E27 CWS opal 600lm'});
100-
devicePublish = new DevicePublish(zigbee, mqtt, null, null);
10198
devicePublish.onMQTTMessage('zigbee2mqtt/0x12345678/set', JSON.stringify({color_temp: '100%'}));
10299
chai.assert.isTrue(zigbee.publish.calledOnce);
103100
chai.assert.strictEqual(zigbee.publish.getCall(0).args[0], '0x12345678');
@@ -112,7 +109,6 @@ describe('DevicePublish', () => {
112109
it('Should publish messages to zigbee devices with non-default ep', () => {
113110
zigbee.publish.resetHistory();
114111
zigbee.getDevice = sinon.fake.returns({modelId: 'lumi.ctrl_neutral1'});
115-
devicePublish = new DevicePublish(zigbee, mqtt, null, null);
116112
devicePublish.onMQTTMessage('zigbee2mqtt/0x12345678/set', JSON.stringify({state: 'OFF'}));
117113
chai.assert.isTrue(zigbee.publish.calledOnce);
118114
chai.assert.strictEqual(zigbee.publish.getCall(0).args[0], '0x12345678');
@@ -127,7 +123,6 @@ describe('DevicePublish', () => {
127123
it('Should publish messages to zigbee devices with non-default ep and postfix', () => {
128124
zigbee.publish.resetHistory();
129125
zigbee.getDevice = sinon.fake.returns({modelId: 'lumi.ctrl_neutral2'});
130-
devicePublish = new DevicePublish(zigbee, mqtt, null, null);
131126
devicePublish.onMQTTMessage('zigbee2mqtt/0x12345678/right/set', JSON.stringify({state: 'OFF'}));
132127
chai.assert.isTrue(zigbee.publish.calledOnce);
133128
chai.assert.strictEqual(zigbee.publish.getCall(0).args[0], '0x12345678');
@@ -142,7 +137,6 @@ describe('DevicePublish', () => {
142137
it('Should publish messages to zigbee gledopto with [11,13]', () => {
143138
zigbee.publish.resetHistory();
144139
zigbee.getDevice = sinon.fake.returns({modelId: 'GLEDOPTO', epList: [11, 13]});
145-
devicePublish = new DevicePublish(zigbee, mqtt, null, null);
146140
devicePublish.onMQTTMessage('zigbee2mqtt/0x12345678/set', JSON.stringify({state: 'OFF'}));
147141
chai.assert.isTrue(zigbee.publish.calledOnce);
148142
chai.assert.strictEqual(zigbee.publish.getCall(0).args[0], '0x12345678');
@@ -157,7 +151,6 @@ describe('DevicePublish', () => {
157151
it('Should publish messages to zigbee gledopto with [11,12,13]', () => {
158152
zigbee.publish.resetHistory();
159153
zigbee.getDevice = sinon.fake.returns({modelId: 'GLEDOPTO', epList: [11, 12, 13]});
160-
devicePublish = new DevicePublish(zigbee, mqtt, null, null);
161154
devicePublish.onMQTTMessage('zigbee2mqtt/0x12345678/set', JSON.stringify({state: 'OFF'}));
162155
chai.assert.isTrue(zigbee.publish.calledOnce);
163156
chai.assert.strictEqual(zigbee.publish.getCall(0).args[0], '0x12345678');
@@ -210,6 +203,20 @@ describe('DevicePublish', () => {
210203
chai.assert.deepEqual(zigbee.publish.getCall(0).args[5], cfg.default);
211204
chai.assert.deepEqual(zigbee.publish.getCall(0).args[6], null);
212205
});
206+
207+
it('Should publish 1 message when brightness with state is send', () => {
208+
zigbee.publish.resetHistory();
209+
zigbee.getDevice = sinon.fake.returns({modelId: 'TRADFRI bulb E27 CWS opal 600lm'});
210+
devicePublish.onMQTTMessage('zigbee2mqtt/0x12345678/set', JSON.stringify({state: 'ON', brightness: '50'}));
211+
chai.assert.isTrue(zigbee.publish.calledOnce);
212+
chai.assert.strictEqual(zigbee.publish.getCall(0).args[0], '0x12345678');
213+
chai.assert.strictEqual(zigbee.publish.getCall(0).args[1], 'genLevelCtrl');
214+
chai.assert.strictEqual(zigbee.publish.getCall(0).args[2], 'moveToLevelWithOnOff');
215+
chai.assert.strictEqual(zigbee.publish.getCall(0).args[3], 'functional');
216+
chai.assert.deepEqual(zigbee.publish.getCall(0).args[4], {level: '50', transtime: 0});
217+
chai.assert.deepEqual(zigbee.publish.getCall(0).args[5], cfg.default);
218+
chai.assert.deepEqual(zigbee.publish.getCall(0).args[6], null);
219+
});
213220
});
214221

215222
describe('Parse topic', () => {

0 commit comments

Comments
 (0)