mirror of
https://github.com/Koenkk/zigbee2mqtt.git
synced 2026-10-22 14:01:20 +00:00
Home Assistant: skip state when bulb is already on when setting color or color temperature. #1349
This commit is contained in:
1 parent
2f52b851a9
commit
55c3edfa95
2 files changed
+139
-1
No files matched your search
@@ -190,6 +190,23 @@ class DevicePublish {
|
||||
json = {state: message.toString()};
|
||||
}
|
||||
|
||||
/**
|
||||
* Home Assistant always publishes 'state', even when e.g. only setting
|
||||
* the color temperature. This would lead to 2 zigbee publishes, where the first one
|
||||
* (state) is probably unecessary.
|
||||
*/
|
||||
if (settings.get().homeassistant && this.state) {
|
||||
const deviceState = this.state.get(entity.ID);
|
||||
const hasColorTemp = json.hasOwnProperty('color_temp');
|
||||
const hasColor = json.hasOwnProperty('color');
|
||||
const hasBrightness = json.hasOwnProperty('brightness');
|
||||
const isOn = deviceState && deviceState.state === 'ON' ? true : false;
|
||||
if (isOn && (hasColorTemp || hasColor) && !hasBrightness) {
|
||||
delete json.state;
|
||||
logger.debug('Skipping state because of Home Assistant');
|
||||
}
|
||||
}
|
||||
|
||||
// Ensure that state and brightness are executed before other commands.
|
||||
const keys = Object.keys(json);
|
||||
keys.sort((a, b) => (['state', 'brightness'].includes(a) ? -1 : 1));
|
||||
|
||||
+122
-1
@@ -15,6 +15,10 @@ const zigbee = {
|
||||
}),
|
||||
};
|
||||
|
||||
const state = {
|
||||
get: jest.fn(),
|
||||
};
|
||||
|
||||
const publishEntityState = jest.fn();
|
||||
|
||||
const cfg = {
|
||||
@@ -29,7 +33,7 @@ describe('DevicePublish', () => {
|
||||
|
||||
beforeEach(() => {
|
||||
utils.stubLogger(jest);
|
||||
devicePublish = new DevicePublish(zigbee, mqtt, null, publishEntityState);
|
||||
devicePublish = new DevicePublish(zigbee, mqtt, state, publishEntityState);
|
||||
});
|
||||
|
||||
afterEach(() => {
|
||||
@@ -936,4 +940,121 @@ describe('DevicePublish', () => {
|
||||
'0x00000001',
|
||||
{state: 'OFF', brightness: 0});
|
||||
});
|
||||
|
||||
it('Home Assistant: should set state', async () => {
|
||||
zigbee.publish.mockClear();
|
||||
publishEntityState.mockClear();
|
||||
jest.spyOn(settings, 'get').mockReturnValue({homeassistant: true, mqtt: {base_topic: 'zigbee2mqtt'}});
|
||||
zigbee.getDevice = () => ({modelId: 'RB 185 C'});
|
||||
devicePublish.onMQTTMessage('zigbee2mqtt/0x00000001/set', JSON.stringify({state: 'ON'}));
|
||||
expect(zigbee.publish).toHaveBeenCalledTimes(1);
|
||||
expect(zigbee.publish).toHaveBeenNthCalledWith(1,
|
||||
'0x00000001',
|
||||
'device',
|
||||
'genOnOff',
|
||||
'on',
|
||||
'functional',
|
||||
{},
|
||||
cfg.default,
|
||||
null,
|
||||
expect.any(Function));
|
||||
expect(publishEntityState).toHaveBeenCalledTimes(1);
|
||||
expect(publishEntityState).toHaveBeenNthCalledWith(1,
|
||||
'0x00000001',
|
||||
{state: 'ON'});
|
||||
});
|
||||
|
||||
it('Home Assistant: should not set state when color temperature is also set', async () => {
|
||||
zigbee.publish.mockClear();
|
||||
publishEntityState.mockClear();
|
||||
jest.spyOn(state, 'get').mockReturnValue({state: 'ON'});
|
||||
jest.spyOn(settings, 'get').mockReturnValue({homeassistant: true, mqtt: {base_topic: 'zigbee2mqtt'}});
|
||||
zigbee.getDevice = () => ({modelId: 'RB 185 C'});
|
||||
devicePublish.onMQTTMessage('zigbee2mqtt/0x00000001/set', JSON.stringify({state: 'ON', color_temp: 100}));
|
||||
expect(zigbee.publish).toHaveBeenCalledTimes(1);
|
||||
expect(zigbee.publish).toHaveBeenNthCalledWith(1,
|
||||
'0x00000001',
|
||||
'device',
|
||||
'lightingColorCtrl',
|
||||
'moveToColorTemp',
|
||||
'functional',
|
||||
{colortemp: 100, transtime: 0},
|
||||
cfg.default,
|
||||
null,
|
||||
expect.any(Function));
|
||||
|
||||
// TODO
|
||||
// expect(publishEntityState).toHaveBeenCalledTimes(1);
|
||||
// expect(publishEntityState).toHaveBeenNthCalledWith(1,
|
||||
// '0x00000001',
|
||||
// {state: 'ON', brightness: 100});
|
||||
});
|
||||
|
||||
it('Home Assistant: should not set state when color is also set', async () => {
|
||||
zigbee.publish.mockClear();
|
||||
publishEntityState.mockClear();
|
||||
jest.spyOn(state, 'get').mockReturnValue({state: 'ON'});
|
||||
jest.spyOn(settings, 'get').mockReturnValue({homeassistant: true, mqtt: {base_topic: 'zigbee2mqtt'}});
|
||||
zigbee.getDevice = () => ({modelId: 'RB 185 C'});
|
||||
devicePublish.onMQTTMessage(
|
||||
'zigbee2mqtt/0x00000001/set',
|
||||
JSON.stringify({state: 'ON', color: {x: 0.41, y: 0.25}})
|
||||
);
|
||||
expect(zigbee.publish).toHaveBeenCalledTimes(1);
|
||||
expect(zigbee.publish).toHaveBeenNthCalledWith(1,
|
||||
'0x00000001',
|
||||
'device',
|
||||
'lightingColorCtrl',
|
||||
'moveToColor',
|
||||
'functional',
|
||||
{colorx: 26869, colory: 16384, transtime: 0},
|
||||
cfg.default,
|
||||
null,
|
||||
expect.any(Function));
|
||||
|
||||
// TODO
|
||||
// expect(publishEntityState).toHaveBeenCalledTimes(1);
|
||||
// expect(publishEntityState).toHaveBeenNthCalledWith(1,
|
||||
// '0x00000001',
|
||||
// {state: 'ON', brightness: 100});
|
||||
});
|
||||
|
||||
it('Home Assistant: should set state when color is also set and bulb is off', async () => {
|
||||
zigbee.publish.mockClear();
|
||||
publishEntityState.mockClear();
|
||||
jest.spyOn(state, 'get').mockReturnValue({state: 'OFF'});
|
||||
jest.spyOn(settings, 'get').mockReturnValue({homeassistant: true, mqtt: {base_topic: 'zigbee2mqtt'}});
|
||||
zigbee.getDevice = () => ({modelId: 'RB 185 C'});
|
||||
devicePublish.onMQTTMessage(
|
||||
'zigbee2mqtt/0x00000001/set',
|
||||
JSON.stringify({state: 'ON', color: {x: 0.41, y: 0.25}})
|
||||
);
|
||||
expect(zigbee.publish).toHaveBeenCalledTimes(2);
|
||||
expect(zigbee.publish).toHaveBeenNthCalledWith(1,
|
||||
'0x00000001',
|
||||
'device',
|
||||
'genOnOff',
|
||||
'on',
|
||||
'functional',
|
||||
{},
|
||||
cfg.default,
|
||||
null,
|
||||
expect.any(Function));
|
||||
expect(zigbee.publish).toHaveBeenNthCalledWith(2,
|
||||
'0x00000001',
|
||||
'device',
|
||||
'lightingColorCtrl',
|
||||
'moveToColor',
|
||||
'functional',
|
||||
{colorx: 26869, colory: 16384, transtime: 0},
|
||||
cfg.default,
|
||||
null,
|
||||
expect.any(Function));
|
||||
|
||||
// TODO
|
||||
// expect(publishEntityState).toHaveBeenCalledTimes(1);
|
||||
// expect(publishEntityState).toHaveBeenNthCalledWith(1,
|
||||
// '0x00000001',
|
||||
// {state: 'ON', brightness: 100});
|
||||
});
|
||||
});
|
||||
Reference in new issue
Block a user