diff --git a/homeassistant/components/esphome/manager.py b/homeassistant/components/esphome/manager.py
index 09c3cc3b7cbfebfc86a6b72ec6c90efc19ae4acb..c36a55d1f5500272ed1f20dcc24e42d2d69c45a5 100644
--- a/homeassistant/components/esphome/manager.py
+++ b/homeassistant/components/esphome/manager.py
@@ -476,6 +476,13 @@ class ESPHomeManager:
             # will be cleared anyway.
             entry_data.async_update_device_state()
 
+        if Platform.ASSIST_SATELLITE in self.entry_data.loaded_platforms:
+            await self.hass.config_entries.async_unload_platforms(
+                self.entry, [Platform.ASSIST_SATELLITE]
+            )
+
+            self.entry_data.loaded_platforms.remove(Platform.ASSIST_SATELLITE)
+
     async def on_connect_error(self, err: Exception) -> None:
         """Start reauth flow if appropriate connect error type."""
         if isinstance(
diff --git a/tests/components/esphome/test_assist_satellite.py b/tests/components/esphome/test_assist_satellite.py
index e245cfcf3bfdc78f495926e84adb9d2f01ad305e..89840daf45407ff222e292fb5b9952c80cad9a8d 100644
--- a/tests/components/esphome/test_assist_satellite.py
+++ b/tests/components/esphome/test_assist_satellite.py
@@ -36,7 +36,7 @@ from homeassistant.components.esphome.assist_satellite import (
     VoiceAssistantUDPServer,
 )
 from homeassistant.components.media_source import PlayMedia
-from homeassistant.const import Platform
+from homeassistant.const import STATE_UNAVAILABLE, Platform
 from homeassistant.core import HomeAssistant
 from homeassistant.helpers import entity_registry as er, intent as intent_helper
 import homeassistant.helpers.device_registry as dr
@@ -1038,3 +1038,38 @@ async def test_announce_media_id(
                 blocking=True,
             )
             await done.wait()
+
+
+async def test_satellite_unloaded_on_disconnect(
+    hass: HomeAssistant,
+    mock_client: APIClient,
+    mock_esphome_device: Callable[
+        [APIClient, list[EntityInfo], list[UserService], list[EntityState]],
+        Awaitable[MockESPHomeDevice],
+    ],
+) -> None:
+    """Test that the assist satellite platform is unloaded on disconnect."""
+    mock_device: MockESPHomeDevice = await mock_esphome_device(
+        mock_client=mock_client,
+        entity_info=[],
+        user_service=[],
+        states=[],
+        device_info={
+            "voice_assistant_feature_flags": VoiceAssistantFeature.VOICE_ASSISTANT
+        },
+    )
+    await hass.async_block_till_done()
+
+    satellite = get_satellite_entity(hass, mock_device.device_info.mac_address)
+    assert satellite is not None
+
+    state = hass.states.get(satellite.entity_id)
+    assert state is not None
+    assert state.state != STATE_UNAVAILABLE
+
+    # Device will be unavailable after disconnect
+    await mock_device.mock_disconnect(True)
+
+    state = hass.states.get(satellite.entity_id)
+    assert state is not None
+    assert state.state == STATE_UNAVAILABLE