Clear availability topic on device remove. #4432

This commit is contained in:
Koen Kanters
2020-09-25 16:50:12 +02:00
parent f26ddd93ff
commit da2eb505fd
5 changed files with 29 additions and 13 deletions
+9 -4
View File
@@ -24,6 +24,8 @@ class Availability extends Extension {
this.timers = {};
this.state = {};
this.eventBus.on('deviceRemoved', (data) => this.onDeviceRemoved(data.resolvedEntity), this.constructor.name);
this.blocklist = settings.get().advanced.availability_blocklist
.concat(settings.get().advanced.availability_blacklist)
.map((e) => settings.getEntity(e).ID);
@@ -33,6 +35,12 @@ class Availability extends Extension {
.map((e) => settings.getEntity(e).ID);
}
onDeviceRemoved(resolvedEntity) {
this.mqtt.publish(`${resolvedEntity.name}/availability`, null, {retain: true, qos: 0});
delete this.state[resolvedEntity.device.ieeeAddr];
clearTimeout(this.timers[resolvedEntity.device.ieeeAddr]);
}
inPasslistOrNotInBlocklist(device) {
const ieeeAddr = device.ieeeAddr;
const deviceSettings = settings.getDevice(ieeeAddr);
@@ -114,10 +122,7 @@ class Availability extends Extension {
}
setTimerPingable(device) {
if (this.timers[device.ieeeAddr]) {
clearTimeout(this.timers[device.ieeeAddr]);
}
clearTimeout(this.timers[device.ieeeAddr]);
this.timers[device.ieeeAddr] = setTimeout(async () => {
await this.handleIntervalPingable(device);
}, utils.secondsToMilliseconds(this.availability_timeout));
+1 -1
View File
@@ -377,7 +377,7 @@ class Bridge extends Extension {
// Fire event
if (entity.type === 'device') {
this.eventBus.emit('deviceRemoved', {device: entity.device});
this.eventBus.emit('deviceRemoved', {resolvedEntity: entity});
}
// Remove from configuration.yaml
+5 -6
View File
@@ -2056,7 +2056,7 @@ class HomeAssistant extends Extension {
this.discoveryTopic = settings.get().advanced.homeassistant_discovery_topic;
this.statusTopic = settings.get().advanced.homeassistant_status_topic;
this.eventBus.on('deviceRemoved', (data) => this.onDeviceRemoved(data.device), this.constructor.name);
this.eventBus.on('deviceRemoved', (data) => this.onDeviceRemoved(data.resolvedEntity), this.constructor.name);
this.eventBus.on('publishEntityState', (data) => this.onPublishEntityState(data), this.constructor.name);
this.eventBus.on('deviceRenamed', (data) =>
this.onDeviceRenamed(data.device, data.homeAssisantRename), this.constructor.name,
@@ -2069,12 +2069,11 @@ class HomeAssistant extends Extension {
}
}
onDeviceRemoved(device) {
logger.debug(`Clearing Home Assistant discovery topic for '${device.ieeeAddr}'`);
delete this.discovered[device.ieeeAddr];
const resolvedEntity = this.zigbee.resolveEntity(device);
onDeviceRemoved(resolvedEntity) {
logger.debug(`Clearing Home Assistant discovery topic for '${resolvedEntity.name}'`);
delete this.discovered[resolvedEntity.device.ieeeAddr];
for (const config of this.getConfigs(resolvedEntity)) {
const topic = this.getDiscoveryTopic(config, device);
const topic = this.getDiscoveryTopic(config, resolvedEntity.device);
this.mqtt.publish(topic, null, {retain: true, qos: 0}, this.discoveryTopic);
}
}
+1 -1
View File
@@ -316,7 +316,7 @@ class BridgeLegacy extends Extension {
const cleanup = () => {
// Fire event
this.eventBus.emit('deviceRemoved', {device: entity.device});
this.eventBus.emit('deviceRemoved', {resolvedEntity: entity});
// Remove from configuration.yaml
settings.removeDevice(entity.settings.ID);
+13 -1
View File
@@ -27,7 +27,8 @@ describe('Availability', () => {
settings._reRead();
data.writeEmptyState();
jest.useFakeTimers();
settings.set(['advanced', 'availability_timeout'], 10)
settings.set(['advanced', 'availability_timeout'], 10);
settings.set(['experimental', 'new_api'], true);
controller = new Controller();
mocksClear.forEach((m) => m.mockClear());
await controller.start();
@@ -397,4 +398,15 @@ describe('Availability', () => {
expect.any(Function)
);
});
it('Should clear retained availability topic when device is remove', async () => {
MQTT.publish.mockClear();
MQTT.events.message('zigbee2mqtt/bridge/request/device/remove', 'bulb_color');
await flushPromises();
expect(MQTT.publish).toHaveBeenCalledWith(
'zigbee2mqtt/bulb_color/availability',
null,
{retain: true, qos: 0}, expect.any(Function)
);
});
});