fix: Fix HA entities unavailable after broker restart when broker does not persist retained messages (#17891)

* Fix race condition with bridge status message cancelling reinitialize after a reconnect to mqtt

* Fix tests
This commit is contained in:
Sean Kelly
2023-06-07 09:16:11 +02:00
committed by GitHub
parent fd1622ba80
commit c12bedb3e5
2 changed files with 5 additions and 5 deletions
+3 -2
View File
@@ -101,9 +101,10 @@ export default class MQTT {
}, utils.seconds(10));
logger.info('Connected to MQTT server');
await this.publishStateOnline();
if (!this.initialConnect) {
if (this.initialConnect) {
await this.publishStateOnline();
} else {
this.republishRetainedTimer = setTimeout(() => {
// Republish retained messages in case MQTT broker does not persist them.
// https://github.com/Koenkk/zigbee2mqtt/issues/9629
+2 -3
View File
@@ -651,7 +651,7 @@ describe('Controller', () => {
MQTT.events['connect']();
await flushPromises();
jest.runOnlyPendingTimers();
expect(MQTT.publish).toHaveBeenCalledTimes(13);
expect(MQTT.publish).toHaveBeenCalledTimes(12);
expect(MQTT.publish).toHaveBeenCalledWith('zigbee2mqtt/bridge/info', expect.any(String), { retain: true, qos: 0 }, expect.any(Function));
});
@@ -662,8 +662,7 @@ describe('Controller', () => {
await flushPromises();
await MQTT.events.message('zigbee2mqtt/bridge/state', 'online');
jest.runOnlyPendingTimers();
expect(MQTT.publish).toHaveBeenCalledTimes(1);
expect(MQTT.publish).toHaveBeenCalledWith('zigbee2mqtt/bridge/state', expect.any(String), { retain: true, qos: 0 }, expect.any(Function));
expect(MQTT.publish).toHaveBeenCalledTimes(0);
});
it('Should prevent any message being published with retain flag when force_disable_retain is set', async () => {