From f793eab4ab7aeaad966635e9dbee0c9ee0977c4f Mon Sep 17 00:00:00 2001 From: Koen Kanters Date: Thu, 28 May 2020 17:44:50 +0200 Subject: [PATCH] Republish availability on MQTT connected. #3625 --- lib/extension/availability.js | 9 +++++---- test/availability.test.js | 17 +++++++++++++++++ 2 files changed, 22 insertions(+), 4 deletions(-) diff --git a/lib/extension/availability.js b/lib/extension/availability.js index 460a3cd05..dbf486519 100644 --- a/lib/extension/availability.js +++ b/lib/extension/availability.js @@ -58,13 +58,14 @@ class Availability extends Extension { onMQTTConnected() { for (const device of this.zigbee.getClients()) { // Mark all devices as online on start - this.publishAvailability(device, true); + const ieeeAddr = device.ieeeAddr; + this.publishAvailability(device, this.state.hasOwnProperty(ieeeAddr) ? this.state[ieeeAddr] : true, true); if (this.inWhitelistOrNotInBlacklist(device)) { if (this.isPingable(device)) { this.setTimerPingable(device); } else { - this.timers[device.ieeeAddr] = setInterval(() => { + this.timers[ieeeAddr] = setInterval(() => { this.handleIntervalNotPingable(device); }, utils.secondsToMilliseconds(300)); } @@ -143,7 +144,7 @@ class Availability extends Extension { } } - publishAvailability(device, available) { + publishAvailability(device, available, force=false) { const ieeeAddr = device.ieeeAddr; if (this.state.hasOwnProperty(ieeeAddr) && !this.state[ieeeAddr] && available) { this.onReconnect(device); @@ -153,7 +154,7 @@ class Availability extends Extension { const name = deviceSettings ? deviceSettings.friendlyName : ieeeAddr; const topic = `${name}/availability`; const payload = available ? 'online' : 'offline'; - if (this.state[ieeeAddr] !== available) { + if (this.state[ieeeAddr] !== available || force) { this.state[ieeeAddr] = available; this.mqtt.publish(topic, payload, {retain: true, qos: 0}); } diff --git a/test/availability.test.js b/test/availability.test.js index d09f6ee79..ab9432dc6 100644 --- a/test/availability.test.js +++ b/test/availability.test.js @@ -352,4 +352,21 @@ describe('Availability', () => { device.lastSeen = defaultLastSeen; }); + + it('Should republish existing state on MQTT connected', async () => { + const device = zigbeeHerdsman.devices.bulb_color; + await controller.stop(); + await flushPromises(); + MQTT.publish.mockClear(); + controller = new Controller(); + getExtension().state[device.ieeeAddr] = false; + await controller.start(); + await flushPromises(); + expect(MQTT.publish).toHaveBeenCalledWith( + 'zigbee2mqtt/bulb_color/availability', + 'offline', + { retain: true, qos: 0 }, + expect.any(Function) + ); + }); });