Shorter reconnection delay

This commit is contained in:
Pierre committed 2026-10-17 22:46:44 +02:00
1 parent 8a8cb02296
commit 8cc2ae32df
4 files changed
+64 -25

No files matched your search

+13 -5
View File
@@ -308,6 +308,8 @@ class SamsungTheFrame(SmartObject):
if self._stopped:
return
self._generation += 1
# A fresh target must not inherit a long idle reconnection delay.
self._retry_at = min(self._retry_at, self._loop.time() + self._transition_retry_delay())
self.requested_state = None if state == 'manual' else state
previous = self._target_task
if previous is not None and not previous.cancelling():
@@ -422,7 +424,10 @@ class SamsungTheFrame(SmartObject):
await self._publish(*self._observed)
except NETWORK_ERRORS as error:
self.log_info(f'TV refresh failed: {type(error).__name__}: {error}')
self._retry_at = self._loop.time() + self._backoff
retry_delay = self._backoff
if self.requested_state is not None:
retry_delay = min(retry_delay, self._transition_retry_delay())
self._retry_at = self._loop.time() + retry_delay
self._backoff = min(60, self._backoff * 2)
# One refresh worker coalesces power events. WebSocket
# notifications wake it immediately; no network polling
@@ -490,6 +495,9 @@ class SamsungTheFrame(SmartObject):
selected = random.choice(available)
await self._client.art_request('select_image', content_id=selected['content_id'], show=True)
def _transition_retry_delay(self):
return max(0.2, float(self.args.get('transition_retry_delay', 2)))
async def _target_runner(self, previous, target, generation):
if previous is not None:
with suppress(asyncio.CancelledError):
@@ -510,7 +518,7 @@ class SamsungTheFrame(SmartObject):
return
except NETWORK_ERRORS + (KeyError, TypeError) as error:
self.log_info(f'TV transition failed: {type(error).__name__}: {error}')
delay = 30
delay = self._transition_retry_delay()
# Cancellation interrupts both network waits and confirmation delays.
await asyncio.sleep(delay)
self._refresh_at = 0
@@ -519,17 +527,17 @@ class SamsungTheFrame(SmartObject):
async def _transition(self, target):
plugged, powered = await self._power()
if plugged is None or powered is None:
return 30
return self._transition_retry_delay()
if not plugged:
if target == 'power_off':
return None
await self.turn_on(self.power_plug)
return 60
return 5
if not powered:
if target == 'tv_off':
return None
await self._wake_up()
return 60
return 10
if self._loop.time() < self._retry_at:
return max(1, self._retry_at - self._loop.time())
# Always confirm the current state before a toggle. Serialize Art reads