Skip to content

Commit db63d9f

Browse files
Diegorro98frenck
authored andcommitted
Delete refresh after a non-breaking error at event stream at Home Connect (#139740)
* Delete refresh after non-breaking error And improve how many time does it take to retry to open stream * Update tests
1 parent 5b3d798 commit db63d9f

File tree

2 files changed

+10
-28
lines changed

2 files changed

+10
-28
lines changed

homeassistant/components/home_connect/coordinator.py

+6-8
Original file line numberDiff line numberDiff line change
@@ -47,8 +47,6 @@
4747

4848
type HomeConnectConfigEntry = ConfigEntry[HomeConnectCoordinator]
4949

50-
EVENT_STREAM_RECONNECT_DELAY = 30
51-
5250

5351
@dataclass(frozen=True, kw_only=True)
5452
class HomeConnectApplianceData:
@@ -157,9 +155,11 @@ def start_event_listener(self) -> None:
157155

158156
async def _event_listener(self) -> None:
159157
"""Match event with listener for event type."""
158+
retry_time = 10
160159
while True:
161160
try:
162161
async for event_message in self.client.stream_all_events():
162+
retry_time = 10
163163
event_message_ha_id = event_message.ha_id
164164
match event_message.type:
165165
case EventType.STATUS:
@@ -256,20 +256,18 @@ async def _event_listener(self) -> None:
256256
except (EventStreamInterruptedError, HomeConnectRequestError) as error:
257257
_LOGGER.debug(
258258
"Non-breaking error (%s) while listening for events,"
259-
" continuing in 30 seconds",
259+
" continuing in %s seconds",
260260
type(error).__name__,
261+
retry_time,
261262
)
262-
await asyncio.sleep(EVENT_STREAM_RECONNECT_DELAY)
263+
await asyncio.sleep(retry_time)
264+
retry_time = min(retry_time * 2, 3600)
263265
except HomeConnectApiError as error:
264266
_LOGGER.error("Error while listening for events: %s", error)
265267
self.hass.config_entries.async_schedule_reload(
266268
self.config_entry.entry_id
267269
)
268270
break
269-
# if there was a non-breaking error, we continue listening
270-
# but we need to refresh the data to get the possible changes
271-
# that happened while the event stream was interrupted
272-
await self.async_refresh()
273271

274272
@callback
275273
def _call_event_listener(self, event_message: EventMessage) -> None:

tests/components/home_connect/test_coordinator.py

+4-20
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
"""Test for Home Connect coordinator."""
22

33
from collections.abc import Awaitable, Callable
4+
from datetime import timedelta
45
from typing import Any
56
from unittest.mock import AsyncMock, MagicMock, patch
67

@@ -12,8 +13,6 @@
1213
EventKey,
1314
EventMessage,
1415
EventType,
15-
Status,
16-
StatusKey,
1716
)
1817
from aiohomeconnect.model.error import (
1918
EventStreamInterruptedError,
@@ -24,7 +23,6 @@
2423
import pytest
2524

2625
from homeassistant.components.home_connect.const import (
27-
BSH_DOOR_STATE_LOCKED,
2826
BSH_DOOR_STATE_OPEN,
2927
BSH_EVENT_PRESENT_STATE_PRESENT,
3028
BSH_POWER_OFF,
@@ -38,8 +36,9 @@
3836
callback,
3937
)
4038
from homeassistant.helpers import entity_registry as er
39+
from homeassistant.util import dt as dt_util
4140

42-
from tests.common import MockConfigEntry
41+
from tests.common import MockConfigEntry, async_fire_time_changed
4342

4443

4544
@pytest.fixture
@@ -286,9 +285,6 @@ async def test_event_listener_error(
286285
(
287286
"entity_id",
288287
"initial_state",
289-
"status_key",
290-
"status_value",
291-
"after_refresh_expected_state",
292288
"event_key",
293289
"event_value",
294290
"after_event_expected_state",
@@ -297,24 +293,15 @@ async def test_event_listener_error(
297293
(
298294
"sensor.washer_door",
299295
"closed",
300-
StatusKey.BSH_COMMON_DOOR_STATE,
301-
BSH_DOOR_STATE_LOCKED,
302-
"locked",
303296
EventKey.BSH_COMMON_STATUS_DOOR_STATE,
304297
BSH_DOOR_STATE_OPEN,
305298
"open",
306299
),
307300
],
308301
)
309-
@patch(
310-
"homeassistant.components.home_connect.coordinator.EVENT_STREAM_RECONNECT_DELAY", 0
311-
)
312302
async def test_event_listener_resilience(
313303
entity_id: str,
314304
initial_state: str,
315-
status_key: StatusKey,
316-
status_value: Any,
317-
after_refresh_expected_state: str,
318305
event_key: EventKey,
319306
event_value: Any,
320307
after_event_expected_state: str,
@@ -345,16 +332,13 @@ async def stream_exception():
345332

346333
assert hass.states.is_state(entity_id, initial_state)
347334

348-
client.get_status.return_value = ArrayOfStatus(
349-
[Status(key=status_key, raw_key=status_key.value, value=status_value)],
350-
)
351335
await hass.async_block_till_done()
352336
future.set_exception(exception)
353337
await hass.async_block_till_done()
338+
async_fire_time_changed(hass, dt_util.utcnow() + timedelta(seconds=30))
354339
await hass.async_block_till_done()
355340

356341
assert client.stream_all_events.call_count == 2
357-
assert hass.states.is_state(entity_id, after_refresh_expected_state)
358342

359343
await client.add_events(
360344
[

0 commit comments

Comments
 (0)