diff --git a/lib/util/settings.js b/lib/util/settings.js index c7a2b27e..7d0151ff 100644 --- a/lib/util/settings.js +++ b/lib/util/settings.js @@ -625,14 +625,7 @@ function removeGroup(groupIDorName) { function changeDeviceOptions(IDorName, newOptions) { const device = getDeviceThrowIfNotExists(IDorName); const settings = get(); - const currentOptions = settings.devices[device.ID]; - - Object.keys(currentOptions).forEach((key) => { - if (newOptions[key]) { - currentOptions[key] = newOptions[key]; - } - }); - + objectAssignDeep(settings.devices[device.ID], newOptions); write(); } diff --git a/test/bridgeConfig.test.js b/test/bridgeConfig.test.js index b25200c0..67bf1e4e 100644 --- a/test/bridgeConfig.test.js +++ b/test/bridgeConfig.test.js @@ -100,6 +100,21 @@ describe('Bridge config', () => { expect(settings.getDevice('bulb_color')).toStrictEqual( {"ID": "0x000b57fffec6a5b3", "friendlyName": "bulb_color", "friendly_name": "bulb_color", "retain": true} ); + MQTT.events.message('zigbee2mqtt/bridge/config/device_options', JSON.stringify({friendly_name: 'bulb_color', options: {random_setting: true}})); + await flushPromises(); + expect(settings.getDevice('bulb_color')).toStrictEqual( + {"ID": "0x000b57fffec6a5b3", "friendlyName": "bulb_color", "friendly_name": "bulb_color", "random_setting": true, "retain": true} + ); + MQTT.events.message('zigbee2mqtt/bridge/config/device_options', JSON.stringify({friendly_name: 'bulb_color', options: {options: {random_1: true}}})); + await flushPromises(); + expect(settings.getDevice('bulb_color')).toStrictEqual( + {"ID": "0x000b57fffec6a5b3", "friendlyName": "bulb_color", "friendly_name": "bulb_color", "random_setting": true, "retain": true, options: {random_1: true}} + ); + MQTT.events.message('zigbee2mqtt/bridge/config/device_options', JSON.stringify({friendly_name: 'bulb_color', options: {options: {random_2: false}}})); + await flushPromises(); + expect(settings.getDevice('bulb_color')).toStrictEqual( + {"ID": "0x000b57fffec6a5b3", "friendlyName": "bulb_color", "friendly_name": "bulb_color", "random_setting": true, "retain": true, options: {random_1: true, random_2: false}} + ); }); it('Should allow permit join', async () => {