Shorter reconnection delay
This commit is contained in:
1 parent
8a8cb02296
commit
8cc2ae32df
4 files changed
+64
-25
No files matched your search
@@ -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
|
||||
|
||||
Reference in new issue
Block a user