|
60 | 60 | ATTR_VIDEO_INFORMATION = "video_information" |
61 | 61 | ATTR_VIDEO_OUT = "video_out" |
62 | 62 |
|
63 | | -AUDIO_VIDEO_INFORMATION_UPDATE_WAIT_TIME = 8 |
| 63 | +QUERY_STATE_DELAY = 4 |
| 64 | +QUERY_AV_INFO_DELAY = 8 |
64 | 65 |
|
65 | 66 | AUDIO_INFORMATION_MAPPING = [ |
66 | 67 | "audio_input_port", |
@@ -112,7 +113,7 @@ async def connect_callback(reconnect: bool) -> None: |
112 | 113 | if reconnect: |
113 | 114 | for entity in entities.values(): |
114 | 115 | if entity.enabled: |
115 | | - await entity.backfill_state() |
| 116 | + await entity.query_state() |
116 | 117 |
|
117 | 118 | async def update_callback(message: Status) -> None: |
118 | 119 | if isinstance(message, status.Raw): |
@@ -160,7 +161,8 @@ class OnkyoMediaPlayer(MediaPlayerEntity): |
160 | 161 | _supports_audio_info: bool = False |
161 | 162 | _supports_video_info: bool = False |
162 | 163 |
|
163 | | - _query_task: asyncio.Task | None = None |
| 164 | + _query_state_task: asyncio.Task | None = None |
| 165 | + _query_av_info_task: asyncio.Task | None = None |
164 | 166 |
|
165 | 167 | def __init__( |
166 | 168 | self, |
@@ -220,20 +222,19 @@ def __init__( |
220 | 222 |
|
221 | 223 | async def async_added_to_hass(self) -> None: |
222 | 224 | """Entity has been added to hass.""" |
223 | | - await self.backfill_state() |
| 225 | + await self.query_state() |
224 | 226 |
|
225 | 227 | async def async_will_remove_from_hass(self) -> None: |
226 | | - """Cancel the query timer when the entity is removed.""" |
227 | | - if self._query_task: |
228 | | - self._query_task.cancel() |
229 | | - self._query_task = None |
230 | | - |
231 | | - async def backfill_state(self) -> None: |
232 | | - """Get the receiver to send all the info we care about. |
233 | | -
|
234 | | - Usually run only on connect, as we can otherwise rely on the |
235 | | - receiver to keep us informed of changes. |
236 | | - """ |
| 228 | + """Cancel the tasks when the entity is removed.""" |
| 229 | + if self._query_state_task is not None: |
| 230 | + self._query_state_task.cancel() |
| 231 | + self._query_state_task = None |
| 232 | + if self._query_av_info_task is not None: |
| 233 | + self._query_av_info_task.cancel() |
| 234 | + self._query_av_info_task = None |
| 235 | + |
| 236 | + async def query_state(self) -> None: |
| 237 | + """Query the receiver for all the info, that we care about.""" |
237 | 238 | await self._manager.write(query.Power(self._zone)) |
238 | 239 | await self._manager.write(query.Volume(self._zone)) |
239 | 240 | await self._manager.write(query.Muting(self._zone)) |
@@ -342,6 +343,8 @@ def process_update(self, message: status.Known) -> None: |
342 | 343 | """Process update.""" |
343 | 344 | match message: |
344 | 345 | case status.Power(param=status.Power.Param.ON): |
| 346 | + if self.state != MediaPlayerState.ON: |
| 347 | + self._query_state_delayed() |
345 | 348 | self._attr_state = MediaPlayerState.ON |
346 | 349 | case status.Power(param=status.Power.Param.STANDBY): |
347 | 350 | self._attr_state = MediaPlayerState.OFF |
@@ -437,15 +440,28 @@ def process_update(self, message: status.Known) -> None: |
437 | 440 |
|
438 | 441 | self.async_write_ha_state() |
439 | 442 |
|
| 443 | + def _query_state_delayed(self) -> None: |
| 444 | + if self._query_state_task is not None: |
| 445 | + self._query_state_task.cancel() |
| 446 | + self._query_state_task = None |
| 447 | + |
| 448 | + async def coro() -> None: |
| 449 | + await asyncio.sleep(QUERY_STATE_DELAY) |
| 450 | + await self.query_state() |
| 451 | + self._query_state_task = None |
| 452 | + |
| 453 | + self._query_state_task = asyncio.create_task(coro()) |
| 454 | + |
440 | 455 | def _query_av_info_delayed(self) -> None: |
441 | | - if self._zone == Zone.MAIN and not self._query_task: |
| 456 | + if self._zone is not Zone.MAIN or self._query_av_info_task is not None: |
| 457 | + return |
442 | 458 |
|
443 | | - async def _query_av_info() -> None: |
444 | | - await asyncio.sleep(AUDIO_VIDEO_INFORMATION_UPDATE_WAIT_TIME) |
445 | | - if self._supports_audio_info: |
446 | | - await self._manager.write(query.AudioInformation()) |
447 | | - if self._supports_video_info: |
448 | | - await self._manager.write(query.VideoInformation()) |
449 | | - self._query_task = None |
| 459 | + async def coro() -> None: |
| 460 | + await asyncio.sleep(QUERY_AV_INFO_DELAY) |
| 461 | + if self._supports_audio_info: |
| 462 | + await self._manager.write(query.AudioInformation()) |
| 463 | + if self._supports_video_info: |
| 464 | + await self._manager.write(query.VideoInformation()) |
| 465 | + self._query_av_info_task = None |
450 | 466 |
|
451 | | - self._query_task = asyncio.create_task(_query_av_info()) |
| 467 | + self._query_av_info_task = asyncio.create_task(coro()) |
0 commit comments