diff --git a/homeassistant/components/esphome/update.py b/homeassistant/components/esphome/update.py index 618e31024b1..6f51b9df744 100644 --- a/homeassistant/components/esphome/update.py +++ b/homeassistant/components/esphome/update.py @@ -111,7 +111,11 @@ class ESPHomeUpdateEntity(CoordinatorEntity[ESPHomeDashboard], UpdateEntity): """ return ( super().available - and (self._entry_data.available or self._device_info.has_deep_sleep) + and ( + self._entry_data.available + or self._entry_data.expected_disconnect + or self._device_info.has_deep_sleep + ) and self._device_info.name in self.coordinator.data ) diff --git a/tests/components/esphome/test_update.py b/tests/components/esphome/test_update.py index 5410af96bd7..dd0daf1c455 100644 --- a/tests/components/esphome/test_update.py +++ b/tests/components/esphome/test_update.py @@ -7,6 +7,7 @@ import pytest from homeassistant.components.esphome.dashboard import async_get_dashboard from homeassistant.components.update import UpdateEntityFeature +from homeassistant.const import STATE_ON, STATE_UNAVAILABLE from homeassistant.core import HomeAssistant from homeassistant.helpers.dispatcher import async_dispatcher_send @@ -149,8 +150,12 @@ async def test_update_static_info( assert state.state == "off" +@pytest.mark.parametrize( + "expected_disconnect_state", [(True, STATE_ON), (False, STATE_UNAVAILABLE)] +) async def test_update_device_state_for_availability( hass: HomeAssistant, + expected_disconnect_state: tuple[bool, str], mock_config_entry, mock_device_info, mock_dashboard, @@ -167,6 +172,7 @@ async def test_update_device_state_for_availability( signal_device_updated = f"esphome_{mock_config_entry.entry_id}_on_device_update" runtime_data = Mock( available=True, + expected_disconnect=False, device_info=mock_device_info, signal_device_updated=signal_device_updated, ) @@ -183,11 +189,14 @@ async def test_update_device_state_for_availability( assert state is not None assert state.state == "on" + expected_disconnect, expected_state = expected_disconnect_state + runtime_data.available = False + runtime_data.expected_disconnect = expected_disconnect async_dispatcher_send(hass, signal_device_updated) state = hass.states.get("update.none_firmware") - assert state.state == "unavailable" + assert state.state == expected_state # Deep sleep devices should still be available runtime_data.device_info = dataclasses.replace(