92 lines
2.6 KiB
Python
92 lines
2.6 KiB
Python
"""Support for the Roku remote."""
|
|
from typing import Callable, List
|
|
|
|
from requests.exceptions import (
|
|
ConnectionError as RequestsConnectionError,
|
|
ReadTimeout as RequestsReadTimeout,
|
|
)
|
|
from roku import RokuException
|
|
|
|
from homeassistant.components.remote import RemoteEntity
|
|
from homeassistant.config_entries import ConfigEntry
|
|
from homeassistant.helpers.typing import HomeAssistantType
|
|
|
|
from .const import DATA_CLIENT, DEFAULT_MANUFACTURER, DOMAIN
|
|
|
|
|
|
async def async_setup_entry(
|
|
hass: HomeAssistantType,
|
|
entry: ConfigEntry,
|
|
async_add_entities: Callable[[List, bool], None],
|
|
) -> bool:
|
|
"""Load Roku remote based on a config entry."""
|
|
roku = hass.data[DOMAIN][entry.entry_id][DATA_CLIENT]
|
|
async_add_entities([RokuRemote(roku)], True)
|
|
|
|
|
|
class RokuRemote(RemoteEntity):
|
|
"""Device that sends commands to an Roku."""
|
|
|
|
def __init__(self, roku):
|
|
"""Initialize the Roku device."""
|
|
self.roku = roku
|
|
self._available = False
|
|
self._device_info = {}
|
|
|
|
def update(self):
|
|
"""Retrieve latest state."""
|
|
if not self.enabled:
|
|
return
|
|
|
|
try:
|
|
self._device_info = self.roku.device_info
|
|
self._available = True
|
|
except (RequestsConnectionError, RequestsReadTimeout, RokuException):
|
|
self._available = False
|
|
|
|
@property
|
|
def name(self):
|
|
"""Return the name of the device."""
|
|
if self._device_info.user_device_name:
|
|
return self._device_info.user_device_name
|
|
return f"Roku {self._device_info.serial_num}"
|
|
|
|
@property
|
|
def available(self):
|
|
"""Return if able to retrieve information from device or not."""
|
|
return self._available
|
|
|
|
@property
|
|
def unique_id(self):
|
|
"""Return a unique ID."""
|
|
return self._device_info.serial_num
|
|
|
|
@property
|
|
def device_info(self):
|
|
"""Return device specific attributes."""
|
|
return {
|
|
"name": self.name,
|
|
"identifiers": {(DOMAIN, self.unique_id)},
|
|
"manufacturer": DEFAULT_MANUFACTURER,
|
|
"model": self._device_info.model_num,
|
|
"sw_version": self._device_info.software_version,
|
|
}
|
|
|
|
@property
|
|
def is_on(self):
|
|
"""Return true if device is on."""
|
|
return True
|
|
|
|
@property
|
|
def should_poll(self):
|
|
"""No polling needed for Roku."""
|
|
return False
|
|
|
|
def send_command(self, command, **kwargs):
|
|
"""Send a command to one device."""
|
|
for single_command in command:
|
|
if not hasattr(self.roku, single_command):
|
|
continue
|
|
|
|
getattr(self.roku, single_command)()
|