Remove devices from group when removing group. #3861

This commit is contained in:
Koen Kanters
2020-07-07 21:16:35 +02:00
parent 49ebf66b0b
commit ffa47b79e3
6 changed files with 49 additions and 5 deletions
+9 -2
View File
@@ -251,6 +251,9 @@ class Bridge extends Extension {
ban = !!message.ban;
force = !!message.force;
banForceLog = ` (ban: ${ban}, force: ${force})`;
} else if (entityType === 'group' && typeof message === 'object') {
force = !!message.force;
banForceLog = ` (force: ${force})`;
}
try {
@@ -266,7 +269,11 @@ class Bridge extends Extension {
await entity.device.removeFromNetwork();
}
} else {
await entity.group.removeFromDatabase();
if (force) {
await entity.group.removeFromDatabase();
} else {
await entity.group.removeFromNetwork();
}
}
// Fire event
@@ -291,7 +298,7 @@ class Bridge extends Extension {
return utils.getResponse(message, {ID, ban: ban, force: force}, null);
} else {
this.publishGroups();
return utils.getResponse(message, {ID}, null);
return utils.getResponse(message, {ID, force: force}, null);
}
} catch (error) {
throw new Error(
+8 -1
View File
@@ -52,6 +52,7 @@ class BridgeLegacy extends Extension {
'device_options': this.deviceOptions,
'add_group': this.addGroup,
'remove_group': this.removeGroup,
'force_remove_group': this.removeGroup,
'whitelist': this.whitelist,
'touchlink/factory_reset': this.touchlinkFactoryReset,
};
@@ -272,8 +273,14 @@ class BridgeLegacy extends Extension {
const name = message;
const entity = this.zigbee.resolveEntity(message);
assert(entity && entity.type === 'group', `Group '${message}' does not exist`);
if (topic.includes('force')) {
entity.group.removeFromDatabase();
} else {
entity.group.removeFromNetwork();
}
settings.removeGroup(message);
entity.group.removeFromDatabase();
this.mqtt.publish('bridge/log', JSON.stringify({type: `group_removed`, message}));
logger.info(`Removed group '${name}'`);
}
+1 -1
View File
@@ -47,7 +47,7 @@
"semver": "*",
"winston": "*",
"winston-syslog": "*",
"zigbee-herdsman": "0.12.99",
"zigbee-herdsman": "0.12.100",
"zigbee-herdsman-converters": "12.0.126"
},
"devDependencies": {
+16 -1
View File
@@ -292,12 +292,27 @@ describe('Bridge', () => {
MQTT.publish.mockClear();
MQTT.events.message('zigbee2mqtt/bridge/request/group/remove', 'group_1');
await flushPromises();
expect(group.removeFromNetwork).toHaveBeenCalledTimes(1);
expect(settings.getGroup('group_1')).toBeNull();
expect(MQTT.publish).toHaveBeenCalledWith('zigbee2mqtt/bridge/groups', expect.any(String), expect.any(Object), expect.any(Function));
expect(MQTT.publish).toHaveBeenCalledWith(
'zigbee2mqtt/bridge/response/group/remove',
JSON.stringify({"data":{"ID": "group_1", "force": false},"status":"ok"}),
{retain: false, qos: 0}, expect.any(Function)
);
});
it('Should allow to force remove group', async () => {
const group = zigbeeHerdsman.groups.group_1;
MQTT.publish.mockClear();
MQTT.events.message('zigbee2mqtt/bridge/request/group/remove', JSON.stringify({ID: "group_1", force: true}));
await flushPromises();
expect(group.removeFromDatabase).toHaveBeenCalledTimes(1);
expect(settings.getGroup('group_1')).toBeNull();
expect(MQTT.publish).toHaveBeenCalledWith('zigbee2mqtt/bridge/groups', expect.any(String), expect.any(Object), expect.any(Function));
expect(MQTT.publish).toHaveBeenCalledWith(
'zigbee2mqtt/bridge/response/group/remove',
JSON.stringify({"data":{"ID": "group_1"},"status":"ok"}),
JSON.stringify({"data":{"ID": "group_1", "force": true},"status":"ok"}),
{retain: false, qos: 0}, expect.any(Function)
);
});
+14
View File
@@ -318,6 +318,20 @@ describe('Bridge legacy', () => {
MQTT.events.message('zigbee2mqtt/bridge/config/remove_group', 'group_1');
await flushPromises();
expect(settings.getGroup('to_be_removed')).toStrictEqual(null);
expect(group.removeFromNetwork).toHaveBeenCalledTimes(1);
expect(MQTT.publish).toHaveBeenCalledWith(
'zigbee2mqtt/bridge/log',
JSON.stringify({type: 'group_removed', message: 'group_1'}),
{qos: 0, retain: false},
expect.any(Function)
);
});
it('Should allow to force remove groups', async () => {
const group = zigbeeHerdsman.groups.group_1;
MQTT.events.message('zigbee2mqtt/bridge/config/force_remove_group', 'group_1');
await flushPromises();
expect(settings.getGroup('to_be_removed')).toStrictEqual(null);
expect(group.removeFromDatabase).toHaveBeenCalledTimes(1);
expect(MQTT.publish).toHaveBeenCalledWith(
'zigbee2mqtt/bridge/log',
+1
View File
@@ -8,6 +8,7 @@ class Group {
this.meta = {};
this.members = members;
this.removeFromDatabase = jest.fn();
this.removeFromNetwork = jest.fn();
this.hasMember = (endpoint) => this.members.includes(endpoint);
}
}