Home Assistant Unofficial Reference 2024.12.1
__init__.py
Go to the documentation of this file.
1 """Support for Roku API emulation."""
2 
3 import voluptuous as vol
4 
5 from homeassistant import config_entries
6 from homeassistant.components.network import async_get_source_ip
7 from homeassistant.config_entries import ConfigEntry
8 from homeassistant.const import CONF_NAME
9 from homeassistant.core import HomeAssistant
11 from homeassistant.helpers.typing import ConfigType
12 
13 from .binding import EmulatedRoku
14 from .config_flow import configured_servers
15 from .const import (
16  CONF_ADVERTISE_IP,
17  CONF_ADVERTISE_PORT,
18  CONF_HOST_IP,
19  CONF_LISTEN_PORT,
20  CONF_SERVERS,
21  CONF_UPNP_BIND_MULTICAST,
22  DOMAIN,
23 )
24 
25 SERVER_CONFIG_SCHEMA = vol.Schema(
26  {
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,
33  }
34 )
35 
36 CONFIG_SCHEMA = vol.Schema(
37  {
38  DOMAIN: vol.Schema(
39  {
40  vol.Required(CONF_SERVERS): vol.All(
41  cv.ensure_list, [SERVER_CONFIG_SCHEMA]
42  )
43  }
44  )
45  },
46  extra=vol.ALLOW_EXTRA,
47 )
48 
49 
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:
53  return True
54 
55  existing_servers = configured_servers(hass)
56 
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
62  )
63  )
64 
65  return True
66 
67 
68 async def async_setup_entry(hass: HomeAssistant, config_entry: ConfigEntry) -> bool:
69  """Set up an emulated roku server from a config entry."""
70  config = config_entry.data
71 
72  if DOMAIN not in hass.data:
73  hass.data[DOMAIN] = {}
74 
75  name = config[CONF_NAME]
76  listen_port = config[CONF_LISTEN_PORT]
77  host_ip = config.get(CONF_HOST_IP) or await async_get_source_ip(hass)
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)
81 
82  server = EmulatedRoku(
83  hass,
84  name,
85  host_ip,
86  listen_port,
87  advertise_ip,
88  advertise_port,
89  upnp_bind_multicast,
90  )
91 
92  hass.data[DOMAIN][name] = server
93 
94  return await server.setup()
95 
96 
97 async def async_unload_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool:
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)
Definition: config_flow.py:15
bool async_unload_entry(HomeAssistant hass, ConfigEntry entry)
Definition: __init__.py:97
bool async_setup_entry(HomeAssistant hass, ConfigEntry config_entry)
Definition: __init__.py:68
bool async_setup(HomeAssistant hass, ConfigType config)
Definition: __init__.py:50
str async_get_source_ip(HomeAssistant hass, str|UndefinedType target_ip=UNDEFINED)
Definition: __init__.py:40