diff --git a/lib/extension/homeassistant.ts b/lib/extension/homeassistant.ts index c97a3f0fb..bc0972e7f 100644 --- a/lib/extension/homeassistant.ts +++ b/lib/extension/homeassistant.ts @@ -1938,6 +1938,9 @@ export class HomeAssistant extends Extension { } } else if (data.topic === this.statusTopic && data.message.toLowerCase() === "online") { const timer = setTimeout(async () => { + // Re-publish bridge state so HA marks all entities as available before receiving cached device states. + await this.mqtt.publish("bridge/state", stringify({state: "online"}), {clientOptions: {retain: true, qos: 1}}); + // Publish all device states. for (const entity of this.zigbee.devicesAndGroupsIterator(utils.deviceNotCoordinator)) { if (this.state.exists(entity)) { diff --git a/test/extensions/homeassistant.test.ts b/test/extensions/homeassistant.test.ts index 806437c9f..5ea3a7ef3 100644 --- a/test/extensions/homeassistant.test.ts +++ b/test/extensions/homeassistant.test.ts @@ -1722,6 +1722,7 @@ describe("Extension: HomeAssistant", () => { await flushPromises(); await vi.runOnlyPendingTimersAsync(); await flushPromises(); + expect(mockMQTTPublishAsync).toHaveBeenCalledWith("zigbee2mqtt/bridge/state", stringify({state: "online"}), {retain: true, qos: 1}); expect(mockMQTTPublishAsync).toHaveBeenCalledWith( "zigbee2mqtt/bulb", stringify({ @@ -1762,6 +1763,7 @@ describe("Extension: HomeAssistant", () => { await flushPromises(); await vi.runOnlyPendingTimersAsync(); await flushPromises(); + expect(mockMQTTPublishAsync).toHaveBeenCalledWith("zigbee2mqtt/bridge/state", stringify({state: "online"}), {retain: true, qos: 1}); expect(mockMQTTPublishAsync).toHaveBeenCalledWith( "zigbee2mqtt/bulb", stringify({