Revert "Set state of stateless properties to ‘idle’ after publish. #959"

This reverts commit 0826db07d0.
This commit is contained in:
Koen Kanters
2019-02-09 00:29:40 +01:00
parent e47b672bcb
commit 52fb19360e
2 changed files with 8 additions and 21 deletions
+3 -13
View File
@@ -1,7 +1,7 @@
const settings = require('../util/settings');
const logger = require('../util/logger');
const statelessProperties = ['action', 'button', 'button_left', 'button_right', 'click', 'forgotten', 'keyerror'];
const dontCacheProperties = ['action', 'button', 'button_left', 'button_right', 'click', 'forgotten', 'keyerror'];
/**
* This extensions handles messages received from devices.
@@ -100,18 +100,11 @@ class DeviceReceive {
// - If NO payload is returned do nothing. This is for non-standard behaviour
// for e.g. click switches where we need to count number of clicks and detect long presses.
const publish = (payload) => {
// Don't cache messages with stateless properties.
// After a stateless property is send we need to clear it.
// Otherwise the state of the device is incorrect.
// E.g. when a button is pressed a payload like {"click": "single"}
// is produced, afterwards we want to clear this with {"click": "idle"}
// https://github.com/Koenkk/zigbee2mqtt/issues/959
// Don't cache messages with following properties:
let cache = true;
const clearStatePayload = {};
statelessProperties.forEach((property) => {
dontCacheProperties.forEach((property) => {
if (payload.hasOwnProperty(property)) {
cache = false;
clearStatePayload[property] = 'idle';
}
});
@@ -140,9 +133,6 @@ class DeviceReceive {
}
this.publishEntityState(device.ieeeAddr, payload, cache);
if (Object.keys(clearStatePayload).length > 0) {
this.publishEntityState(device.ieeeAddr, clearStatePayload, false);
}
};
let payload = {};
+5 -8
View File
@@ -36,27 +36,24 @@ describe('DeviceReceive', () => {
const device = {ieeeAddr: '0x12345678'};
const message = utils.zigbeeMessage(device, 'genOnOff', 'attReport', {onOff: 1}, 1);
deviceReceive.onZigbeeMessage(message, device, WXKG11LM);
chai.assert.isTrue(publishEntityState.calledTwice);
chai.assert.isTrue(publishEntityState.calledOnce);
chai.assert.deepEqual(publishEntityState.getCall(0).args[1], {click: 'single'});
chai.assert.deepEqual(publishEntityState.getCall(1).args[1], {click: 'idle'});
});
it('Should handle a zigbee message which uses ep (left)', () => {
const device = {ieeeAddr: '0x12345678'};
const message = utils.zigbeeMessage(device, 'genOnOff', 'attReport', {onOff: 1}, 1);
deviceReceive.onZigbeeMessage(message, device, WXKG02LM);
chai.assert.isTrue(publishEntityState.calledTwice);
chai.assert.isTrue(publishEntityState.calledOnce);
chai.assert.deepEqual(publishEntityState.getCall(0).args[1], {click: 'left'});
chai.assert.deepEqual(publishEntityState.getCall(1).args[1], {click: 'idle'});
});
it('Should handle a zigbee message which uses ep (right)', () => {
const device = {ieeeAddr: '0x12345678'};
const message = utils.zigbeeMessage(device, 'genOnOff', 'attReport', {onOff: 1}, 2);
deviceReceive.onZigbeeMessage(message, device, WXKG02LM);
chai.assert.isTrue(publishEntityState.calledTwice);
chai.assert.isTrue(publishEntityState.calledOnce);
chai.assert.deepEqual(publishEntityState.getCall(0).args[1], {click: 'right'});
chai.assert.deepEqual(publishEntityState.getCall(1).args[1], {click: 'idle'});
});
it('Should handle a zigbee message with default precision', () => {
@@ -210,7 +207,7 @@ describe('DeviceReceive', () => {
};
});
deviceReceive.onZigbeeMessage(message, device, WXKG02LM);
chai.assert.isTrue(publishEntityState.calledTwice);
chai.assert.isTrue(publishEntityState.calledOnce);
chai.assert.equal(typeof publishEntityState.getCall(0).args[1].last_seen, 'number');
});
@@ -225,7 +222,7 @@ describe('DeviceReceive', () => {
};
});
deviceReceive.onZigbeeMessage(message, device, WXKG02LM);
chai.assert.isTrue(publishEntityState.calledTwice);
chai.assert.isTrue(publishEntityState.calledOnce);
chai.assert.equal(typeof publishEntityState.getCall(0).args[1].last_seen, 'string');
});
});