Store Hue bridge in hass.data before setting up platforms (#50703)
* Store bridge in hass.data before setting up platforms * Self
This commit is contained in:
parent
7350942e9e
commit
2976bbbbdd
4 changed files with 43 additions and 8 deletions
|
@ -66,7 +66,6 @@ async def async_setup_entry(
|
|||
|
||||
_register_services(hass)
|
||||
|
||||
hass.data.setdefault(DOMAIN, {})[entry.entry_id] = bridge
|
||||
config = bridge.api.config
|
||||
|
||||
# For backwards compat
|
||||
|
@ -133,11 +132,11 @@ async def async_setup_entry(
|
|||
|
||||
async def async_unload_entry(hass, entry):
|
||||
"""Unload a config entry."""
|
||||
bridge = hass.data[DOMAIN].pop(entry.entry_id)
|
||||
unload_success = await hass.data[DOMAIN][entry.entry_id].async_reset()
|
||||
if len(hass.data[DOMAIN]) == 0:
|
||||
hass.data.pop(DOMAIN)
|
||||
hass.services.async_remove(DOMAIN, SERVICE_HUE_SCENE)
|
||||
return await bridge.async_reset()
|
||||
return unload_success
|
||||
|
||||
|
||||
@core.callback
|
||||
|
@ -172,7 +171,7 @@ def _register_services(hass):
|
|||
group_name,
|
||||
)
|
||||
|
||||
if DOMAIN not in hass.data:
|
||||
if not hass.services.has_service(DOMAIN, SERVICE_HUE_SCENE):
|
||||
# Register a local handler for scene activation
|
||||
hass.services.async_register(
|
||||
DOMAIN,
|
||||
|
|
|
@ -23,6 +23,7 @@ from .const import (
|
|||
CONF_ALLOW_UNREACHABLE,
|
||||
DEFAULT_ALLOW_HUE_GROUPS,
|
||||
DEFAULT_ALLOW_UNREACHABLE,
|
||||
DOMAIN,
|
||||
LOGGER,
|
||||
)
|
||||
from .errors import AuthenticationRequired, CannotConnect
|
||||
|
@ -107,6 +108,7 @@ class HueBridge:
|
|||
if bridge.sensors is not None:
|
||||
self.sensor_manager = SensorManager(self)
|
||||
|
||||
hass.data.setdefault(DOMAIN, {})[self.config_entry.entry_id] = self
|
||||
hass.config_entries.async_setup_platforms(self.config_entry, PLATFORMS)
|
||||
|
||||
self.parallel_updates_semaphore = asyncio.Semaphore(
|
||||
|
@ -173,10 +175,15 @@ class HueBridge:
|
|||
|
||||
# If setup was successful, we set api variable, forwarded entry and
|
||||
# register service
|
||||
return await self.hass.config_entries.async_unload_platforms(
|
||||
unload_success = await self.hass.config_entries.async_unload_platforms(
|
||||
self.config_entry, PLATFORMS
|
||||
)
|
||||
|
||||
if unload_success:
|
||||
self.hass.data[DOMAIN].pop(self.config_entry.entry_id)
|
||||
|
||||
return unload_success
|
||||
|
||||
async def hue_activate_scene(self, data, skip_reload=False, hide_warnings=False):
|
||||
"""Service to call directly into bridge to set scenes."""
|
||||
if self.api.scenes is None:
|
||||
|
|
|
@ -32,6 +32,7 @@ def create_mock_bridge(hass):
|
|||
allow_unreachable=False,
|
||||
allow_groups=False,
|
||||
api=create_mock_api(hass),
|
||||
config_entry=None,
|
||||
reset_jobs=[],
|
||||
spec=hue.HueBridge,
|
||||
)
|
||||
|
@ -41,10 +42,25 @@ def create_mock_bridge(hass):
|
|||
bridge.mock_group_responses = bridge.api.mock_group_responses
|
||||
bridge.mock_sensor_responses = bridge.api.mock_sensor_responses
|
||||
|
||||
async def async_setup():
|
||||
if bridge.config_entry:
|
||||
hass.data.setdefault(hue.DOMAIN, {})[bridge.config_entry.entry_id] = bridge
|
||||
return True
|
||||
|
||||
bridge.async_setup = async_setup
|
||||
|
||||
async def async_request_call(task):
|
||||
await task()
|
||||
|
||||
bridge.async_request_call = async_request_call
|
||||
|
||||
async def async_reset():
|
||||
if bridge.config_entry:
|
||||
hass.data[hue.DOMAIN].pop(bridge.config_entry.entry_id)
|
||||
return True
|
||||
|
||||
bridge.async_reset = async_reset
|
||||
|
||||
return bridge
|
||||
|
||||
|
||||
|
@ -80,7 +96,15 @@ def create_mock_api(hass):
|
|||
|
||||
logger = logging.getLogger(__name__)
|
||||
|
||||
api.config.apiversion = "9.9.9"
|
||||
api.config = Mock(
|
||||
bridgeid="ff:ff:ff:ff:ff:ff",
|
||||
mac="aa:bb:cc:dd:ee:ff",
|
||||
modelid="BSB002",
|
||||
apiversion="9.9.9",
|
||||
swversion="1935144040",
|
||||
)
|
||||
api.config.name = "Home"
|
||||
|
||||
api.lights = Lights(logger, {}, [], mock_request)
|
||||
api.groups = Groups(logger, {}, [], mock_request)
|
||||
api.sensors = Sensors(logger, {}, [], mock_request)
|
||||
|
|
|
@ -38,9 +38,14 @@ async def test_unload_entry(hass, mock_bridge_setup):
|
|||
assert await async_setup_component(hass, hue.DOMAIN, {}) is True
|
||||
assert len(mock_bridge_setup.mock_calls) == 1
|
||||
|
||||
mock_bridge_setup.async_reset = AsyncMock(return_value=True)
|
||||
hass.data[hue.DOMAIN] = {entry.entry_id: mock_bridge_setup}
|
||||
|
||||
async def mock_reset():
|
||||
hass.data[hue.DOMAIN].pop(entry.entry_id)
|
||||
return True
|
||||
|
||||
mock_bridge_setup.async_reset = mock_reset
|
||||
assert await hue.async_unload_entry(hass, entry)
|
||||
assert len(mock_bridge_setup.async_reset.mock_calls) == 1
|
||||
assert hue.DOMAIN not in hass.data
|
||||
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue