1 """Support for the Mediaroom Set-up-box."""
3 from __future__
import annotations
8 from pymediaroom
import (
13 install_mediaroom_protocol,
15 import voluptuous
as vol
18 PLATFORM_SCHEMA
as MEDIA_PLAYER_PLATFORM_SCHEMA,
20 MediaPlayerEntityFeature,
29 EVENT_HOMEASSISTANT_STOP,
37 _LOGGER = logging.getLogger(__name__)
39 DATA_MEDIAROOM =
"mediaroom_known_stb"
40 DEFAULT_NAME =
"Mediaroom STB"
42 DISCOVERY_MEDIAROOM =
"mediaroom_discovery_installed"
44 MEDIA_TYPE_MEDIAROOM =
"mediaroom"
46 SIGNAL_STB_NOTIFY =
"mediaroom_stb_discovered"
49 PLATFORM_SCHEMA = MEDIA_PLAYER_PLATFORM_SCHEMA.extend(
51 vol.Optional(CONF_HOST): cv.string,
52 vol.Optional(CONF_NAME, default=DEFAULT_NAME): cv.string,
53 vol.Optional(CONF_OPTIMISTIC, default=
False): cv.boolean,
54 vol.Optional(CONF_TIMEOUT, default=DEFAULT_TIMEOUT): cv.positive_int,
62 async_add_entities: AddEntitiesCallback,
63 discovery_info: DiscoveryInfoType |
None =
None,
65 """Set up the Mediaroom platform."""
66 if (known_hosts := hass.data.get(DATA_MEDIAROOM))
is None:
67 known_hosts = hass.data[DATA_MEDIAROOM] = []
68 if host := config.get(CONF_HOST):
74 optimistic=config[CONF_OPTIMISTIC],
75 timeout=config[CONF_TIMEOUT],
79 known_hosts.append(host)
81 _LOGGER.debug(
"Trying to discover Mediaroom STB")
83 def callback_notify(notify):
84 """Process NOTIFY message from STB."""
85 if notify.ip_address
in known_hosts:
89 _LOGGER.debug(
"Discovered new stb %s", notify.ip_address)
90 known_hosts.append(notify.ip_address)
92 host=notify.ip_address, device_id=notify.device_uuid, optimistic=
False
96 if not config[CONF_OPTIMISTIC]:
97 already_installed = hass.data.get(DISCOVERY_MEDIAROOM)
98 if not already_installed:
99 hass.data[DISCOVERY_MEDIAROOM] = await install_mediaroom_protocol(
100 responses_callback=callback_notify
104 def stop_discovery(event):
105 """Stop discovery of new mediaroom STB's."""
106 _LOGGER.debug(
"Stopping internal pymediaroom discovery")
107 hass.data[DISCOVERY_MEDIAROOM].close()
109 hass.bus.async_listen_once(EVENT_HOMEASSISTANT_STOP, stop_discovery)
111 _LOGGER.debug(
"Auto discovery installed")
115 """Representation of a Mediaroom set-up-box on the network."""
117 _attr_media_content_type = MediaType.CHANNEL
118 _attr_should_poll =
False
119 _attr_supported_features = (
120 MediaPlayerEntityFeature.PAUSE
121 | MediaPlayerEntityFeature.TURN_ON
122 | MediaPlayerEntityFeature.TURN_OFF
123 | MediaPlayerEntityFeature.VOLUME_STEP
124 | MediaPlayerEntityFeature.VOLUME_MUTE
125 | MediaPlayerEntityFeature.PLAY_MEDIA
126 | MediaPlayerEntityFeature.STOP
127 | MediaPlayerEntityFeature.NEXT_TRACK
128 | MediaPlayerEntityFeature.PREVIOUS_TRACK
129 | MediaPlayerEntityFeature.PLAY
133 """Map pymediaroom state to HA state."""
136 State.OFF: MediaPlayerState.OFF,
137 State.STANDBY: MediaPlayerState.STANDBY,
138 State.PLAYING_LIVE_TV: MediaPlayerState.PLAYING,
139 State.PLAYING_RECORDED_TV: MediaPlayerState.PLAYING,
140 State.PLAYING_TIMESHIFT_TV: MediaPlayerState.PLAYING,
141 State.STOPPED: MediaPlayerState.PAUSED,
147 def __init__(self, host, device_id, optimistic=False, timeout=DEFAULT_TIMEOUT):
148 """Initialize the device."""
151 self.
stbstb = Remote(host)
153 "Found STB at %s%s", host,
" - I'm optimistic" if optimistic
else ""
158 MediaPlayerState.PLAYING
if optimistic
else MediaPlayerState.STANDBY
160 self.
_name_name = f
"Mediaroom {device_id if device_id else host}"
169 """Return True if entity is available."""
173 """Retrieve latest state."""
175 async
def async_notify_received(notify):
176 """Process STB state from NOTIFY message."""
177 stb_state = self.
stbstb.notify_callback(notify)
188 self.
hasshass, SIGNAL_STB_NOTIFY, async_notify_received
193 self, media_type: MediaType | str, media_id: str, **kwargs: Any
198 "STB(%s) Play media: %s (%s)", self.
stbstb.stb_ip, media_id, media_type
201 if media_type == MediaType.CHANNEL:
202 if not media_id.isdigit():
203 _LOGGER.error(
"Invalid media_id %s: Must be a channel number", media_id)
205 command =
int(media_id)
206 elif media_type == MEDIA_TYPE_MEDIAROOM:
207 if media_id
not in COMMANDS:
208 _LOGGER.error(
"Invalid media_id %s: Must be a command", media_id)
212 _LOGGER.error(
"Invalid media type %s", media_type)
216 await self.
stbstb.send_cmd(command)
218 self.
_attr_state_attr_state = MediaPlayerState.PLAYING
220 except PyMediaroomError:
226 """Return a unique ID."""
231 """Return the name of the device."""
232 return self.
_name_name
236 """Channel currently playing."""
240 """Turn on the receiver."""
245 self.
_attr_state_attr_state = MediaPlayerState.PLAYING
247 except PyMediaroomError:
252 """Turn off the receiver."""
257 self.
_attr_state_attr_state = MediaPlayerState.STANDBY
259 except PyMediaroomError:
264 """Send play command."""
267 _LOGGER.debug(
"media_play()")
268 await self.
stbstb.send_cmd(
"PlayPause")
270 self.
_attr_state_attr_state = MediaPlayerState.PLAYING
272 except PyMediaroomError:
277 """Send pause command."""
280 await self.
stbstb.send_cmd(
"PlayPause")
282 self.
_attr_state_attr_state = MediaPlayerState.PAUSED
284 except PyMediaroomError:
289 """Send stop command."""
292 await self.
stbstb.send_cmd(
"Stop")
294 self.
_attr_state_attr_state = MediaPlayerState.PAUSED
296 except PyMediaroomError:
301 """Send Program Down command."""
304 await self.
stbstb.send_cmd(
"ProgDown")
306 self.
_attr_state_attr_state = MediaPlayerState.PLAYING
308 except PyMediaroomError:
313 """Send Program Up command."""
316 await self.
stbstb.send_cmd(
"ProgUp")
318 self.
_attr_state_attr_state = MediaPlayerState.PLAYING
320 except PyMediaroomError:
325 """Send volume up command."""
328 await self.
stbstb.send_cmd(
"VolUp")
330 except PyMediaroomError:
335 """Send volume up command."""
338 await self.
stbstb.send_cmd(
"VolDown")
339 except PyMediaroomError:
344 """Send mute command."""
347 await self.
stbstb.send_cmd(
"Mute")
348 except PyMediaroomError:
None async_write_ha_state(self)
None async_on_remove(self, CALLBACK_TYPE func)
Callable[[], None] async_dispatcher_connect(HomeAssistant hass, str signal, Callable[..., Any] target)
None dispatcher_send(HomeAssistant hass, str signal, *Any args)