Fix device option set to null instead of removed when sending null. https://github.com/nurikk/z2m-frontend/issues/430

This commit is contained in:
Koen Kanters
2021-04-12 19:49:21 +02:00
parent 5963f3b7f4
commit 07262bd62f
3 changed files with 28 additions and 0 deletions
+2
View File
@@ -635,8 +635,10 @@ function changeEntityOptions(IDorName, newOptions) {
delete newOptions.devices;
if (getDevice(IDorName)) {
objectAssignDeep(settings.devices[getDevice(IDorName).ID], newOptions);
utils.removeNullPropertiesFromObject(settings.devices[getDevice(IDorName).ID]);
} else if (getGroup(IDorName)) {
objectAssignDeep(settings.groups[getGroup(IDorName).ID], newOptions);
utils.removeNullPropertiesFromObject(settings.groups[getGroup(IDorName).ID]);
} else {
throw new Error(`Device or group '${IDorName}' does not exist`);
}
+12
View File
@@ -190,6 +190,17 @@ function* getExternalConvertersDefinitions(settings) {
}
}
function removeNullPropertiesFromObject(obj) {
for (const key of Object.keys(obj)) {
const value = obj[key];
if (value == null) {
delete obj[key];
} else if (typeof value === 'object') {
removeNullPropertiesFromObject(value);
}
}
}
function getKey(object, value, fallback, convertTo) {
for (const key in object) {
if (object[key]===value) {
@@ -276,4 +287,5 @@ module.exports = {
loadModuleFromText,
getKey,
sanitizeImageParameter,
removeNullPropertiesFromObject,
};
+14
View File
@@ -593,6 +593,20 @@ describe('Bridge', () => {
);
});
it('Should allow to remove device option', async () => {
MQTT.publish.mockClear();
settings.set(['devices', '0x000b57fffec6a5b2', 'qos'], 1);
expect(settings.getDevice('bulb')).toStrictEqual({"ID": "0x000b57fffec6a5b2", "friendly_name": "bulb", "friendlyName": "bulb", "qos": 1, "retain": true});
MQTT.events.message('zigbee2mqtt/bridge/request/device/options', stringify({options: {qos: null}, id: 'bulb'}));
await flushPromises();
expect(settings.getDevice('bulb')).toStrictEqual({"ID": "0x000b57fffec6a5b2", "friendly_name": "bulb", "friendlyName": "bulb", "retain": true});
expect(MQTT.publish).toHaveBeenCalledWith(
'zigbee2mqtt/bridge/response/device/options',
stringify({"data":{"from":{"retain": true, "qos": 1},"to":{"retain": true}, "id":"bulb"},"status":"ok"}),
{retain: false, qos: 0}, expect.any(Function)
);
});
it('Should allow change group options', async () => {
MQTT.publish.mockClear();
expect(settings.getGroup('group_1')).toStrictEqual({"ID": 1, "devices": [], "friendly_name": "group_1", "retain": false, "friendlyName": "group_1", "optimistic": true});