1 """Support for local control of entities by emulating a Philips Hue bridge."""
3 from __future__
import annotations
7 from aiohttp
import web
8 import voluptuous
as vol
15 EVENT_HOMEASSISTANT_STARTED,
16 EVENT_HOMEASSISTANT_STOP,
27 CONF_EXPOSE_BY_DEFAULT,
30 CONF_LIGHTS_ALL_DIMMABLE,
32 CONF_OFF_MAPS_TO_ON_DOMAINS,
33 CONF_UPNP_BIND_MULTICAST,
34 DEFAULT_LIGHTS_ALL_DIMMABLE,
41 from .const
import DOMAIN
42 from .hue_api
import (
43 HueAllGroupsStateView,
44 HueAllLightsStateView,
48 HueOneLightChangeView,
53 from .upnp
import DescriptionXmlView, async_create_upnp_datagram_endpoint
55 _LOGGER = logging.getLogger(__name__)
58 CONFIG_ENTITY_SCHEMA = vol.Schema(
60 vol.Optional(CONF_ENTITY_NAME): cv.string,
61 vol.Optional(CONF_ENTITY_HIDDEN): cv.boolean,
66 CONFIG_SCHEMA = vol.Schema(
70 vol.Optional(CONF_HOST_IP): cv.string,
71 vol.Optional(CONF_LISTEN_PORT, default=DEFAULT_LISTEN_PORT): cv.port,
72 vol.Optional(CONF_ADVERTISE_IP): cv.string,
73 vol.Optional(CONF_ADVERTISE_PORT): cv.port,
74 vol.Optional(CONF_UPNP_BIND_MULTICAST): cv.boolean,
75 vol.Optional(CONF_OFF_MAPS_TO_ON_DOMAINS): cv.ensure_list,
76 vol.Optional(CONF_EXPOSE_BY_DEFAULT): cv.boolean,
77 vol.Optional(CONF_EXPOSED_DOMAINS): cv.ensure_list,
78 vol.Optional(CONF_TYPE, default=DEFAULT_TYPE): vol.Any(
79 TYPE_ALEXA, TYPE_GOOGLE
81 vol.Optional(CONF_ENTITIES): vol.Schema(
82 {cv.entity_id: CONFIG_ENTITY_SCHEMA}
85 CONF_LIGHTS_ALL_DIMMABLE, default=DEFAULT_LIGHTS_ALL_DIMMABLE
90 extra=vol.ALLOW_EXTRA,
95 hass: HomeAssistant, config: Config, app: web.Application
97 """Start the emulated hue bridge."""
100 config.upnp_bind_multicast,
102 config.advertise_port
or config.listen_port,
105 runner = web.AppRunner(app)
108 site = web.TCPSite(runner, config.host_ip_addr, config.listen_port)
112 except OSError
as error:
114 "Failed to create HTTP server at port %d: %s", config.listen_port, error
119 async
def stop_emulated_hue_bridge(event: Event) ->
None:
120 """Stop the emulated hue bridge."""
123 await runner.cleanup()
125 hass.bus.async_listen_once(EVENT_HOMEASSISTANT_STOP, stop_emulated_hue_bridge)
128 async
def async_setup(hass: HomeAssistant, yaml_config: ConfigType) -> bool:
129 """Activate the emulated_hue component."""
131 config =
Config(hass, yaml_config.get(DOMAIN, {}), local_ip)
132 await config.async_setup()
134 app = web.Application()
139 app._on_startup.freeze()
153 async
def _start(event: Event) ->
None:
154 """Start the bridge."""
157 hass.bus.async_listen_once(EVENT_HOMEASSISTANT_STARTED, _start)
UPNPResponderProtocol async_create_upnp_datagram_endpoint(str host_ip_addr, bool upnp_bind_multicast, str advertise_ip, int advertise_port)
None start_emulated_hue_bridge(HomeAssistant hass, Config config, web.Application app)
bool async_setup(HomeAssistant hass, ConfigType yaml_config)
def register(HomeAssistant hass, Heos controller)
str async_get_source_ip(HomeAssistant hass, str|UndefinedType target_ip=UNDEFINED)