From 8d4680255868cdfb8148d51ddc37a717bbab5e10 Mon Sep 17 00:00:00 2001 From: itairaz1 Date: Sat, 23 Oct 2021 00:13:14 +0300 Subject: [PATCH] Apple TV power management (#51520) --- .../components/apple_tv/media_player.py | 23 ++++++++++++++++--- 1 file changed, 20 insertions(+), 3 deletions(-) diff --git a/homeassistant/components/apple_tv/media_player.py b/homeassistant/components/apple_tv/media_player.py index 09ecc01015c..35b9777394e 100644 --- a/homeassistant/components/apple_tv/media_player.py +++ b/homeassistant/components/apple_tv/media_player.py @@ -6,6 +6,7 @@ from pyatv.const import ( FeatureName, FeatureState, MediaType, + PowerState, RepeatState, ShuffleState, ) @@ -87,12 +88,14 @@ class AppleTvMediaPlayer(AppleTVEntity, MediaPlayerEntity): """Handle when connection is made to device.""" self.atv.push_updater.listener = self self.atv.push_updater.start() + self.atv.power.listener = self @callback def async_device_disconnected(self): """Handle when connection was lost to device.""" self.atv.push_updater.stop() self.atv.push_updater.listener = None + self.atv.power.listener = None @property def state(self): @@ -101,6 +104,11 @@ class AppleTvMediaPlayer(AppleTVEntity, MediaPlayerEntity): return None if self.atv is None: return STATE_OFF + if ( + self._is_feature_available(FeatureName.PowerState) + and self.atv.power.power_state == PowerState.Off + ): + return STATE_STANDBY if self._playing: state = self._playing.device_state if state in (DeviceState.Idle, DeviceState.Loading): @@ -125,6 +133,11 @@ class AppleTvMediaPlayer(AppleTVEntity, MediaPlayerEntity): self._playing = None self.async_write_ha_state() + @callback + def powerstate_update(self, old_state: PowerState, new_state: PowerState): + """Update power state when it changes.""" + self.async_write_ha_state() + @property def app_id(self): """ID of the current running app.""" @@ -239,12 +252,16 @@ class AppleTvMediaPlayer(AppleTVEntity, MediaPlayerEntity): async def async_turn_on(self): """Turn the media player on.""" - await self.manager.connect() + if self._is_feature_available(FeatureName.TurnOn): + await self.atv.power.turn_on() async def async_turn_off(self): """Turn the media player off.""" - self._playing = None - await self.manager.disconnect() + if (self._is_feature_available(FeatureName.TurnOff)) and ( + not self._is_feature_available(FeatureName.PowerState) + or self.atv.power.power_state == PowerState.On + ): + await self.atv.power.turn_off() async def async_media_play_pause(self): """Pause media on media player."""