1 """Support for Roku API emulation."""
3 import voluptuous
as vol
5 from homeassistant
import config_entries
13 from .binding
import EmulatedRoku
14 from .config_flow
import configured_servers
21 CONF_UPNP_BIND_MULTICAST,
25 SERVER_CONFIG_SCHEMA = vol.Schema(
27 vol.Required(CONF_NAME): cv.string,
28 vol.Required(CONF_LISTEN_PORT): cv.port,
29 vol.Optional(CONF_HOST_IP): cv.string,
30 vol.Optional(CONF_ADVERTISE_IP): cv.string,
31 vol.Optional(CONF_ADVERTISE_PORT): cv.port,
32 vol.Optional(CONF_UPNP_BIND_MULTICAST): cv.boolean,
36 CONFIG_SCHEMA = vol.Schema(
40 vol.Required(CONF_SERVERS): vol.All(
41 cv.ensure_list, [SERVER_CONFIG_SCHEMA]
46 extra=vol.ALLOW_EXTRA,
50 async
def async_setup(hass: HomeAssistant, config: ConfigType) -> bool:
51 """Set up the emulated roku component."""
52 if (conf := config.get(DOMAIN))
is None:
57 for entry
in conf[CONF_SERVERS]:
58 if entry[CONF_NAME]
not in existing_servers:
59 hass.async_create_task(
60 hass.config_entries.flow.async_init(
61 DOMAIN, context={
"source": config_entries.SOURCE_IMPORT}, data=entry
69 """Set up an emulated roku server from a config entry."""
70 config = config_entry.data
72 if DOMAIN
not in hass.data:
73 hass.data[DOMAIN] = {}
75 name = config[CONF_NAME]
76 listen_port = config[CONF_LISTEN_PORT]
78 advertise_ip = config.get(CONF_ADVERTISE_IP)
79 advertise_port = config.get(CONF_ADVERTISE_PORT)
80 upnp_bind_multicast = config.get(CONF_UPNP_BIND_MULTICAST)
92 hass.data[DOMAIN][name] = server
94 return await server.setup()
98 """Unload a config entry."""
99 name = entry.data[CONF_NAME]
100 server = hass.data[DOMAIN].pop(name)
101 return await server.unload()
set[str] configured_servers(HomeAssistant hass)
bool async_unload_entry(HomeAssistant hass, ConfigEntry entry)
bool async_setup_entry(HomeAssistant hass, ConfigEntry config_entry)
bool async_setup(HomeAssistant hass, ConfigType config)
str async_get_source_ip(HomeAssistant hass, str|UndefinedType target_ip=UNDEFINED)