media_player.py 9.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267
  1. """
  2. Implementation of the Tuya media player devices
  3. """
  4. import logging
  5. from homeassistant.components.media_player import (
  6. MediaPlayerEntity,
  7. MediaPlayerEntityFeature,
  8. MediaPlayerState,
  9. )
  10. from .device import TuyaLocalDevice
  11. from .entity import TuyaLocalEntity
  12. from .helpers.config import async_tuya_setup_platform
  13. from .helpers.device_config import TuyaEntityConfig
  14. _LOGGER = logging.getLogger(__name__)
  15. async def async_setup_entry(hass, config_entry, async_add_entities):
  16. """Set up the Tuya Local media player platform."""
  17. config = {**config_entry.data, **config_entry.options}
  18. await async_tuya_setup_platform(
  19. hass,
  20. async_add_entities,
  21. config,
  22. "media_player",
  23. TuyaLocalMediaPlayer,
  24. )
  25. class TuyaLocalMediaPlayer(TuyaLocalEntity, MediaPlayerEntity):
  26. """Representation of a Tuya Local media player device."""
  27. def __init__(self, device: TuyaLocalDevice, config: TuyaEntityConfig):
  28. """Initialize the media player device."""
  29. super().__init__()
  30. dps_map = self._init_begin(device, config)
  31. self._power_dp = dps_map.pop("switch", None)
  32. self._volume_dp = dps_map.pop("volume", None)
  33. self._mute_dp = dps_map.pop("mute", None)
  34. self._source_dp = dps_map.pop("source", None)
  35. self._state_dp = dps_map.pop("playback_state", None)
  36. self._play_dp = dps_map.pop("play", None)
  37. self._pause_dp = dps_map.pop("pause", None)
  38. self._prev_dp = dps_map.pop("prev", None)
  39. self._next_dp = dps_map.pop("next", None)
  40. self._stop_dp = dps_map.pop("stop", None)
  41. self._seek_dp = dps_map.pop("seek_position", None)
  42. self._clear_playlist_dp = dps_map.pop("clear_playlist", None)
  43. self._shuffle_dp = dps_map.pop("shuffle", None)
  44. self._repeat_dp = dps_map.pop("repeat", None)
  45. self._sound_mode_dp = dps_map.pop("sound_mode", None)
  46. self._init_end(dps_map)
  47. self._support_flags = MediaPlayerEntityFeature(0)
  48. if self._pause_dp:
  49. self._support_flags |= MediaPlayerEntityFeature.PAUSE
  50. if self._seek_dp:
  51. self._support_flags |= MediaPlayerEntityFeature.SEEK
  52. if self._volume_dp:
  53. self._support_flags |= MediaPlayerEntityFeature.VOLUME_SET
  54. if self._volume_dp.step is not None:
  55. self._support_flags |= MediaPlayerEntityFeature.VOLUME_STEP
  56. if self._mute_dp:
  57. self._support_flags |= MediaPlayerEntityFeature.VOLUME_MUTE
  58. if self._prev_dp:
  59. self._support_flags |= MediaPlayerEntityFeature.PREVIOUS_TRACK
  60. if self._next_dp:
  61. self._support_flags |= MediaPlayerEntityFeature.NEXT_TRACK
  62. if self._power_dp:
  63. self._support_flags |= MediaPlayerEntityFeature.TURN_ON
  64. self._support_flags |= MediaPlayerEntityFeature.TURN_OFF
  65. # PLAY_MEDIA for playing arbitrary media
  66. if self._source_dp:
  67. self._support_flags |= MediaPlayerEntityFeature.SELECT_SOURCE
  68. if self._stop_dp:
  69. self._support_flags |= MediaPlayerEntityFeature.STOP
  70. if self._clear_playlist_dp:
  71. self._support_flags |= MediaPlayerEntityFeature.CLEAR_PLAYLIST
  72. if self._play_dp:
  73. self._support_flags |= MediaPlayerEntityFeature.PLAY
  74. if self._shuffle_dp:
  75. self._support_flags |= MediaPlayerEntityFeature.SHUFFLE_SET
  76. if self._repeat_dp:
  77. self._support_flags |= MediaPlayerEntityFeature.REPEAT_SET
  78. if self._sound_mode_dp:
  79. self._support_flags |= MediaPlayerEntityFeature.SELECT_SOUND_MODE
  80. # BROWSE_MEDIA for browsing media on the device
  81. # GROUPING for grouping multiple media players together
  82. # MEDIA_ANNOUNCE for sending TTS to the device
  83. # MEDIA_ENQUEUE for adding media to the queue
  84. # SEARCH_MEDIA for searching media on the device
  85. def state(self):
  86. """Return the state of the media player."""
  87. if self._state_dp:
  88. return self._state_dp.get_value(self._device)
  89. elif self._play_dp and self._play_dp.get_value(self._device):
  90. return MediaPlayerState.PLAYING
  91. elif self._pause_dp and self._pause_dp.get_value(self._device):
  92. return MediaPlayerState.PAUSED
  93. elif self._power_dp and not self._power_dp.get_value(self._device):
  94. return MediaPlayerState.OFF
  95. elif self._power_dp and self._power_dp.get_value(self._device):
  96. return MediaPlayerState.ON
  97. return None
  98. def volume_level(self):
  99. """Return the volume level of the media player (0..1)."""
  100. if self._volume_dp:
  101. return self._volume_dp.get_value(self._device)
  102. return None
  103. def volume_step(self):
  104. """Return the volume step of the media player."""
  105. if self._volume_dp:
  106. return self._volume_dp.step(self._device)
  107. return None
  108. def is_volume_muted(self):
  109. """Return True if the volume is muted."""
  110. if self._mute_dp:
  111. return self._mute_dp.get_value(self._device)
  112. return None
  113. def source(self):
  114. """Return the current input source of the media player."""
  115. if self._source_dp:
  116. return self._source_dp.get_value(self._device)
  117. return None
  118. def source_list(self):
  119. """Return the list of available input sources of the media player."""
  120. if self._source_dp:
  121. return self._source_dp.values(self._device)
  122. return None
  123. def sound_mode(self):
  124. """Return the current sound mode of the media player."""
  125. if self._sound_mode_dp:
  126. return self._sound_mode_dp.get_value(self._device)
  127. return None
  128. def sound_mode_list(self):
  129. """Return the list of available sound modes of the media player."""
  130. if self._sound_mode_dp:
  131. return self._sound_mode_dp.values(self._device)
  132. return None
  133. def shuffle(self):
  134. """Return the current shuffle state of the media player."""
  135. if self._shuffle_dp:
  136. return self._shuffle_dp.get_value(self._device)
  137. return None
  138. def repeat(self):
  139. """Return the current repeat state of the media player."""
  140. if self._repeat_dp:
  141. return self._repeat_dp.get_value(self._device)
  142. return None
  143. async def async_turn_on(self):
  144. """Turn on the media player."""
  145. if self._power_dp:
  146. await self._power_dp.async_set_value(self._device, True)
  147. else:
  148. raise NotImplementedError()
  149. async def async_turn_off(self):
  150. """Turn off the media player."""
  151. if self._power_dp:
  152. await self._power_dp.async_set_value(self._device, False)
  153. else:
  154. raise NotImplementedError()
  155. async def async_mute_volume(self, mute):
  156. """Mute the volume."""
  157. if self._mute_dp:
  158. await self._mute_dp.async_set_value(self._device, mute)
  159. else:
  160. raise NotImplementedError()
  161. async def async_set_volume_level(self, volume):
  162. """Set the volume level."""
  163. if self._volume_dp:
  164. await self._volume_dp.async_set_value(self._device, volume)
  165. else:
  166. raise NotImplementedError()
  167. async def async_media_play(self):
  168. """Send play command."""
  169. if self._play_dp:
  170. await self._play_dp.async_set_value(self._device, True)
  171. else:
  172. raise NotImplementedError()
  173. async def async_media_pause(self):
  174. """Send pause command."""
  175. if self._pause_dp:
  176. await self._pause_dp.async_set_value(self._device, True)
  177. else:
  178. raise NotImplementedError()
  179. async def async_media_stop(self):
  180. """Send stop command."""
  181. if self._stop_dp:
  182. await self._stop_dp.async_set_value(self._device, True)
  183. else:
  184. raise NotImplementedError()
  185. async def async_media_previous_track(self):
  186. """Send previous track command."""
  187. if self._prev_dp:
  188. await self._prev_dp.async_set_value(self._device, True)
  189. else:
  190. raise NotImplementedError()
  191. async def async_media_next_track(self):
  192. """Send next track command."""
  193. if self._next_dp:
  194. await self._next_dp.async_set_value(self._device, True)
  195. else:
  196. raise NotImplementedError()
  197. async def async_media_seek(self, position):
  198. """Seek to a specific position in the media."""
  199. if self._seek_dp:
  200. await self._seek_dp.async_set_value(self._device, position)
  201. else:
  202. raise NotImplementedError()
  203. async def async_select_source(self, source):
  204. """Select input source."""
  205. if self._source_dp:
  206. await self._source_dp.async_set_value(self._device, source)
  207. else:
  208. raise NotImplementedError()
  209. async def async_select_sound_mode(self, sound_mode):
  210. """Select sound mode."""
  211. if self._sound_mode_dp:
  212. await self._sound_mode_dp.async_set_value(self._device, sound_mode)
  213. else:
  214. raise NotImplementedError()
  215. async def async_clear_playlist(self):
  216. """Clear the playlist."""
  217. if self._clear_playlist_dp:
  218. await self._clear_playlist_dp.async_set_value(self._device, True)
  219. else:
  220. raise NotImplementedError()
  221. async def async_set_shuffle(self, shuffle):
  222. """Set shuffle mode."""
  223. if self._shuffle_dp:
  224. await self._shuffle_dp.async_set_value(self._device, shuffle)
  225. else:
  226. raise NotImplementedError()
  227. async def async_set_repeat(self, repeat):
  228. """Set repeat mode [all|one|off]."""
  229. if self._repeat_dp:
  230. await self._repeat_dp.async_set_value(self._device, repeat)
  231. else:
  232. raise NotImplementedError()