diff --git a/homeassistant/components/hue/sensor_base.py b/homeassistant/components/hue/sensor_base.py index 1d6fa2d34b4..9dca6e31b1d 100644 --- a/homeassistant/components/hue/sensor_base.py +++ b/homeassistant/components/hue/sensor_base.py @@ -13,7 +13,7 @@ from homeassistant.util.dt import utcnow CURRENT_SENSORS = 'current_sensors' -SENSOR_MANAGER = 'sensor_manager' +SENSOR_MANAGER_FORMAT = '{}_sensor_manager' _LOGGER = logging.getLogger(__name__) @@ -32,10 +32,11 @@ async def async_setup_entry(hass, config_entry, async_add_entities, bridge = hass.data[hue.DOMAIN][config_entry.data['host']] hass.data[hue.DOMAIN].setdefault(CURRENT_SENSORS, {}) - manager = hass.data[hue.DOMAIN].get(SENSOR_MANAGER) + sm_key = SENSOR_MANAGER_FORMAT.format(config_entry.data['host']) + manager = hass.data[hue.DOMAIN].get(sm_key) if manager is None: manager = SensorManager(hass, bridge) - hass.data[hue.DOMAIN][SENSOR_MANAGER] = manager + hass.data[hue.DOMAIN][sm_key] = manager manager.register_component(binary, async_add_entities) await manager.start() diff --git a/tests/components/hue/test_sensor_base.py b/tests/components/hue/test_sensor_base.py index 6259921dcfb..0ebb4a248ef 100644 --- a/tests/components/hue/test_sensor_base.py +++ b/tests/components/hue/test_sensor_base.py @@ -321,9 +321,8 @@ SENSOR_RESPONSE = { } -@pytest.fixture -def mock_bridge(hass): - """Mock a Hue bridge.""" +def create_mock_bridge(): + """Create a mock Hue bridge.""" bridge = Mock( available=True, allow_unreachable=False, @@ -348,22 +347,29 @@ def mock_bridge(hass): bridge.api.config.apiversion = '9.9.9' bridge.api.sensors = Sensors({}, mock_request) - return bridge +@pytest.fixture +def mock_bridge(hass): + """Mock a Hue bridge.""" + return create_mock_bridge() + + @pytest.fixture def increase_scan_interval(hass): """Increase the SCAN_INTERVAL to prevent unexpected scans during tests.""" hue_sensor_base.SensorManager.SCAN_INTERVAL = datetime.timedelta(days=365) -async def setup_bridge(hass, mock_bridge): +async def setup_bridge(hass, mock_bridge, hostname=None): """Load the Hue platform with the provided bridge.""" + if hostname is None: + hostname = 'mock-host' hass.config.components.add(hue.DOMAIN) - hass.data[hue.DOMAIN] = {'mock-host': mock_bridge} + hass.data[hue.DOMAIN] = {hostname: mock_bridge} config_entry = config_entries.ConfigEntry(1, hue.DOMAIN, 'Mock Title', { - 'host': 'mock-host' + 'host': hostname }, 'test', config_entries.CONN_CLASS_LOCAL_POLL) await hass.config_entries.async_forward_entry_setup( config_entry, 'binary_sensor') @@ -382,6 +388,24 @@ async def test_no_sensors(hass, mock_bridge): assert len(hass.states.async_all()) == 0 +async def test_sensors_with_multiple_bridges(hass, mock_bridge): + """Test the update_items function with some sensors.""" + mock_bridge_2 = create_mock_bridge() + mock_bridge_2.mock_sensor_responses.append({ + "1": PRESENCE_SENSOR_3_PRESENT, + "2": LIGHT_LEVEL_SENSOR_3, + "3": TEMPERATURE_SENSOR_3, + }) + mock_bridge.mock_sensor_responses.append(SENSOR_RESPONSE) + await setup_bridge(hass, mock_bridge) + await setup_bridge(hass, mock_bridge_2, hostname='mock-bridge-2') + + assert len(mock_bridge.mock_requests) == 1 + assert len(mock_bridge_2.mock_requests) == 1 + # 3 "physical" sensors with 3 virtual sensors each + assert len(hass.states.async_all()) == 9 + + async def test_sensors(hass, mock_bridge): """Test the update_items function with some sensors.""" mock_bridge.mock_sensor_responses.append(SENSOR_RESPONSE) @@ -450,7 +474,8 @@ async def test_new_sensor_discovered(hass, mock_bridge): mock_bridge.mock_sensor_responses.append(new_sensor_response) # Force updates to run again - sm = hass.data[hue.DOMAIN][hue_sensor_base.SENSOR_MANAGER] + sm_key = hue_sensor_base.SENSOR_MANAGER_FORMAT.format('mock-host') + sm = hass.data[hue.DOMAIN][sm_key] await sm.async_update_items() # To flush out the service call to update the group