diff --git a/homeassistant/components/deconz/deconz_device.py b/homeassistant/components/deconz/deconz_device.py index 56dc00dab58..68d96aecf35 100644 --- a/homeassistant/components/deconz/deconz_device.py +++ b/homeassistant/components/deconz/deconz_device.py @@ -10,17 +10,10 @@ from .const import DOMAIN as DECONZ_DOMAIN class DeconzBase: """Common base for deconz entities and events.""" - TYPE = "" - def __init__(self, device, gateway): """Set up device and add update callback to get data from websocket.""" self._device = device self.gateway = gateway - self.gateway.entities[self.TYPE].add(self.unique_id) - - async def async_will_remove_from_hass(self) -> None: - """Remove unique id.""" - self.gateway.entities[self.TYPE].remove(self.unique_id) @property def unique_id(self): @@ -57,6 +50,13 @@ class DeconzBase: class DeconzDevice(DeconzBase, Entity): """Representation of a deCONZ device.""" + TYPE = "" + + def __init__(self, device, gateway): + """Set up device and add update callback to get data from websocket.""" + super().__init__(device, gateway) + self.gateway.entities[self.TYPE].add(self.unique_id) + @property def entity_registry_enabled_default(self): """Return if the entity should be enabled when first added to the entity registry. @@ -83,7 +83,7 @@ class DeconzDevice(DeconzBase, Entity): self._device.remove_callback(self.async_update_callback) if self.entity_id in self.gateway.deconz_ids: del self.gateway.deconz_ids[self.entity_id] - await super().async_will_remove_from_hass() + self.gateway.entities[self.TYPE].remove(self.unique_id) @callback def async_update_callback(self, force_update=False, ignore_update=False): diff --git a/homeassistant/components/deconz/deconz_event.py b/homeassistant/components/deconz/deconz_event.py index 4b7027b8b36..0192c55add9 100644 --- a/homeassistant/components/deconz/deconz_event.py +++ b/homeassistant/components/deconz/deconz_event.py @@ -11,12 +11,9 @@ from .deconz_device import DeconzBase CONF_DECONZ_EVENT = "deconz_event" -EVENT = "Event" - async def async_setup_events(gateway) -> None: """Set up the deCONZ events.""" - gateway.entities[EVENT] = set() @callback def async_add_sensor(sensors): @@ -26,10 +23,9 @@ async def async_setup_events(gateway) -> None: if not gateway.option_allow_clip_sensor and sensor.type.startswith("CLIP"): continue - if ( - sensor.type not in Switch.ZHATYPE - or sensor.uniqueid in gateway.entities[EVENT] - ): + if sensor.type not in Switch.ZHATYPE or sensor.uniqueid in { + event.unique_id for event in gateway.events + }: continue new_event = DeconzEvent(sensor, gateway) @@ -47,10 +43,11 @@ async def async_setup_events(gateway) -> None: ) -async def async_unload_events(gateway) -> None: +@callback +def async_unload_events(gateway) -> None: """Unload all deCONZ events.""" for event in gateway.events: - await event.async_will_remove_from_hass() + event.async_will_remove_from_hass() gateway.events.clear() @@ -62,8 +59,6 @@ class DeconzEvent(DeconzBase): instead of a sensor entity in hass. """ - TYPE = EVENT - def __init__(self, device, gateway): """Register callback that will be used for signals.""" super().__init__(device, gateway) @@ -79,10 +74,10 @@ class DeconzEvent(DeconzBase): """Return Event device.""" return self._device - async def async_will_remove_from_hass(self) -> None: + @callback + def async_will_remove_from_hass(self) -> None: """Disconnect event object when removed.""" self._device.remove_callback(self.async_update_callback) - await super().async_will_remove_from_hass() @callback def async_update_callback(self, force_update=False, ignore_update=False): diff --git a/homeassistant/components/deconz/gateway.py b/homeassistant/components/deconz/gateway.py index ceed473a383..998c8cd4812 100644 --- a/homeassistant/components/deconz/gateway.py +++ b/homeassistant/components/deconz/gateway.py @@ -232,7 +232,7 @@ class DeconzGateway: unsub_dispatcher() self.listeners = [] - await async_unload_events(self) + async_unload_events(self) self.deconz_ids = {} return True diff --git a/homeassistant/components/deconz/light.py b/homeassistant/components/deconz/light.py index 135a01cd0df..3f11cef31da 100644 --- a/homeassistant/components/deconz/light.py +++ b/homeassistant/components/deconz/light.py @@ -75,7 +75,7 @@ async def async_setup_entry(hass, config_entry, async_add_entities): if not group.lights: continue - known_groups = list(gateway.entities[DOMAIN]) + known_groups = set(gateway.entities[DOMAIN]) new_group = DeconzGroup(group, gateway) if new_group.unique_id not in known_groups: entities.append(new_group) diff --git a/homeassistant/components/deconz/sensor.py b/homeassistant/components/deconz/sensor.py index d7d7b777b41..d7210b31c43 100644 --- a/homeassistant/components/deconz/sensor.py +++ b/homeassistant/components/deconz/sensor.py @@ -96,7 +96,7 @@ async def async_setup_entry(hass, config_entry, async_add_entities): if sensor.battery is not None: battery_handler.remove_tracker(sensor) - known_batteries = list(gateway.entities[DOMAIN]) + known_batteries = set(gateway.entities[DOMAIN]) new_battery = DeconzBattery(sensor, gateway) if new_battery.unique_id not in known_batteries: entities.append(new_battery) diff --git a/tests/components/deconz/test_binary_sensor.py b/tests/components/deconz/test_binary_sensor.py index 1ced3b8ed2d..30f7251e067 100644 --- a/tests/components/deconz/test_binary_sensor.py +++ b/tests/components/deconz/test_binary_sensor.py @@ -67,7 +67,6 @@ async def test_no_binary_sensors(hass): """Test that no sensors in deconz results in no sensor entities.""" gateway = await setup_deconz_integration(hass) assert len(gateway.deconz_ids) == 0 - assert len(gateway.entities[binary_sensor.DOMAIN]) == 0 assert len(hass.states.async_all()) == 0 @@ -81,7 +80,6 @@ async def test_binary_sensors(hass): assert "binary_sensor.clip_presence_sensor" not in gateway.deconz_ids assert "binary_sensor.vibration_sensor" in gateway.deconz_ids assert len(hass.states.async_all()) == 3 - assert len(gateway.entities[binary_sensor.DOMAIN]) == 2 presence_sensor = hass.states.get("binary_sensor.presence_sensor") assert presence_sensor.state == "off" @@ -113,7 +111,6 @@ async def test_binary_sensors(hass): await gateway.async_reset() assert len(hass.states.async_all()) == 0 - assert len(gateway.entities[binary_sensor.DOMAIN]) == 0 async def test_allow_clip_sensor(hass): @@ -130,7 +127,6 @@ async def test_allow_clip_sensor(hass): assert "binary_sensor.clip_presence_sensor" in gateway.deconz_ids assert "binary_sensor.vibration_sensor" in gateway.deconz_ids assert len(hass.states.async_all()) == 4 - assert len(gateway.entities[binary_sensor.DOMAIN]) == 3 presence_sensor = hass.states.get("binary_sensor.presence_sensor") assert presence_sensor.state == "off" @@ -154,7 +150,6 @@ async def test_allow_clip_sensor(hass): assert "binary_sensor.clip_presence_sensor" not in gateway.deconz_ids assert "binary_sensor.vibration_sensor" in gateway.deconz_ids assert len(hass.states.async_all()) == 3 - assert len(gateway.entities[binary_sensor.DOMAIN]) == 2 hass.config_entries.async_update_entry( gateway.config_entry, options={deconz.gateway.CONF_ALLOW_CLIP_SENSOR: True} @@ -166,14 +161,12 @@ async def test_allow_clip_sensor(hass): assert "binary_sensor.clip_presence_sensor" in gateway.deconz_ids assert "binary_sensor.vibration_sensor" in gateway.deconz_ids assert len(hass.states.async_all()) == 4 - assert len(gateway.entities[binary_sensor.DOMAIN]) == 3 async def test_add_new_binary_sensor(hass): """Test that adding a new binary sensor works.""" gateway = await setup_deconz_integration(hass) assert len(gateway.deconz_ids) == 0 - assert len(gateway.entities[binary_sensor.DOMAIN]) == 0 state_added_event = { "t": "event", @@ -189,4 +182,3 @@ async def test_add_new_binary_sensor(hass): presence_sensor = hass.states.get("binary_sensor.presence_sensor") assert presence_sensor.state == "off" - assert len(gateway.entities[binary_sensor.DOMAIN]) == 1 diff --git a/tests/components/deconz/test_climate.py b/tests/components/deconz/test_climate.py index 361e182fe98..ddc89295cba 100644 --- a/tests/components/deconz/test_climate.py +++ b/tests/components/deconz/test_climate.py @@ -59,7 +59,6 @@ async def test_no_sensors(hass): gateway = await setup_deconz_integration(hass) assert len(gateway.deconz_ids) == 0 assert len(hass.states.async_all()) == 0 - assert len(gateway.entities[climate.DOMAIN]) == 0 async def test_climate_devices(hass): @@ -73,7 +72,6 @@ async def test_climate_devices(hass): assert "climate.presence_sensor" not in gateway.deconz_ids assert "climate.clip_thermostat" not in gateway.deconz_ids assert len(hass.states.async_all()) == 3 - assert len(gateway.entities[climate.DOMAIN]) == 1 thermostat = hass.states.get("climate.thermostat") assert thermostat.state == "auto" @@ -183,7 +181,6 @@ async def test_climate_devices(hass): await gateway.async_reset() assert len(hass.states.async_all()) == 0 - assert len(gateway.entities[climate.DOMAIN]) == 0 async def test_clip_climate_device(hass): @@ -201,7 +198,6 @@ async def test_clip_climate_device(hass): assert "climate.presence_sensor" not in gateway.deconz_ids assert "climate.clip_thermostat" in gateway.deconz_ids assert len(hass.states.async_all()) == 4 - assert len(gateway.entities[climate.DOMAIN]) == 2 thermostat = hass.states.get("climate.thermostat") assert thermostat.state == "auto" @@ -229,7 +225,6 @@ async def test_clip_climate_device(hass): assert "climate.presence_sensor" not in gateway.deconz_ids assert "climate.clip_thermostat" not in gateway.deconz_ids assert len(hass.states.async_all()) == 3 - assert len(gateway.entities[climate.DOMAIN]) == 1 hass.config_entries.async_update_entry( gateway.config_entry, options={deconz.gateway.CONF_ALLOW_CLIP_SENSOR: True} @@ -242,7 +237,6 @@ async def test_clip_climate_device(hass): assert "climate.presence_sensor" not in gateway.deconz_ids assert "climate.clip_thermostat" in gateway.deconz_ids assert len(hass.states.async_all()) == 4 - assert len(gateway.entities[climate.DOMAIN]) == 2 async def test_verify_state_update(hass): @@ -274,7 +268,6 @@ async def test_add_new_climate_device(hass): """Test that adding a new climate device works.""" gateway = await setup_deconz_integration(hass) assert len(gateway.deconz_ids) == 0 - assert len(gateway.entities[climate.DOMAIN]) == 0 state_added_event = { "t": "event", @@ -290,4 +283,3 @@ async def test_add_new_climate_device(hass): thermostat = hass.states.get("climate.thermostat") assert thermostat.state == "auto" - assert len(gateway.entities[climate.DOMAIN]) == 1 diff --git a/tests/components/deconz/test_cover.py b/tests/components/deconz/test_cover.py index 28a6f150fc4..095ae7e4bc5 100644 --- a/tests/components/deconz/test_cover.py +++ b/tests/components/deconz/test_cover.py @@ -67,7 +67,6 @@ async def test_no_covers(hass): """Test that no cover entities are created.""" gateway = await setup_deconz_integration(hass) assert len(gateway.deconz_ids) == 0 - assert len(gateway.entities[cover.DOMAIN]) == 0 assert len(hass.states.async_all()) == 0 @@ -82,7 +81,6 @@ async def test_cover(hass): assert "cover.deconz_old_brightness_cover" in gateway.deconz_ids assert "cover.window_covering_controller" in gateway.deconz_ids assert len(hass.states.async_all()) == 5 - assert len(gateway.entities[cover.DOMAIN]) == 4 level_controllable_cover = hass.states.get("cover.level_controllable_cover") assert level_controllable_cover.state == "open" @@ -160,4 +158,3 @@ async def test_cover(hass): await gateway.async_reset() assert len(hass.states.async_all()) == 0 - assert len(gateway.entities[cover.DOMAIN]) == 0 diff --git a/tests/components/deconz/test_deconz_event.py b/tests/components/deconz/test_deconz_event.py index 717c783d0ed..525821e389f 100644 --- a/tests/components/deconz/test_deconz_event.py +++ b/tests/components/deconz/test_deconz_event.py @@ -1,7 +1,7 @@ """Test deCONZ remote events.""" from copy import deepcopy -from homeassistant.components.deconz.deconz_event import CONF_DECONZ_EVENT, EVENT +from homeassistant.components.deconz.deconz_event import CONF_DECONZ_EVENT from .test_gateway import DECONZ_WEB_REQUEST, setup_deconz_integration @@ -62,7 +62,6 @@ async def test_deconz_events(hass): assert "sensor.switch_2_battery_level" in gateway.deconz_ids assert len(hass.states.async_all()) == 3 assert len(gateway.events) == 5 - assert len(gateway.entities[EVENT]) == 5 switch_1 = hass.states.get("sensor.switch_1") assert switch_1 is None @@ -128,4 +127,3 @@ async def test_deconz_events(hass): assert len(hass.states.async_all()) == 0 assert len(gateway.events) == 0 - assert len(gateway.entities[EVENT]) == 0 diff --git a/tests/components/deconz/test_light.py b/tests/components/deconz/test_light.py index dac1b071e93..4e9f6b3d512 100644 --- a/tests/components/deconz/test_light.py +++ b/tests/components/deconz/test_light.py @@ -95,7 +95,6 @@ async def test_no_lights_or_groups(hass): gateway = await setup_deconz_integration(hass) assert len(gateway.deconz_ids) == 0 assert len(hass.states.async_all()) == 0 - assert len(gateway.entities[light.DOMAIN]) == 0 async def test_lights_and_groups(hass): @@ -112,7 +111,6 @@ async def test_lights_and_groups(hass): assert "light.on_off_light" in gateway.deconz_ids assert len(hass.states.async_all()) == 6 - assert len(gateway.entities[light.DOMAIN]) == 5 rgb_light = hass.states.get("light.rgb_light") assert rgb_light.state == "on" @@ -258,7 +256,6 @@ async def test_lights_and_groups(hass): await gateway.async_reset() assert len(hass.states.async_all()) == 0 - assert len(gateway.entities[light.DOMAIN]) == 0 async def test_disable_light_groups(hass): @@ -278,7 +275,6 @@ async def test_disable_light_groups(hass): assert "light.on_off_switch" not in gateway.deconz_ids # 3 entities assert len(hass.states.async_all()) == 5 - assert len(gateway.entities[light.DOMAIN]) == 4 rgb_light = hass.states.get("light.rgb_light") assert rgb_light is not None @@ -304,7 +300,6 @@ async def test_disable_light_groups(hass): assert "light.on_off_switch" not in gateway.deconz_ids # 3 entities assert len(hass.states.async_all()) == 6 - assert len(gateway.entities[light.DOMAIN]) == 5 hass.config_entries.async_update_entry( gateway.config_entry, options={deconz.gateway.CONF_ALLOW_DECONZ_GROUPS: False} @@ -318,4 +313,3 @@ async def test_disable_light_groups(hass): assert "light.on_off_switch" not in gateway.deconz_ids # 3 entities assert len(hass.states.async_all()) == 5 - assert len(gateway.entities[light.DOMAIN]) == 4 diff --git a/tests/components/deconz/test_sensor.py b/tests/components/deconz/test_sensor.py index 8c7829586e4..9d87c7b91cb 100644 --- a/tests/components/deconz/test_sensor.py +++ b/tests/components/deconz/test_sensor.py @@ -2,7 +2,6 @@ from copy import deepcopy from homeassistant.components import deconz -from homeassistant.components.deconz.deconz_event import EVENT import homeassistant.components.sensor as sensor from homeassistant.const import ( DEVICE_CLASS_BATTERY, @@ -97,7 +96,6 @@ async def test_no_sensors(hass): gateway = await setup_deconz_integration(hass) assert len(gateway.deconz_ids) == 0 assert len(hass.states.async_all()) == 0 - assert len(gateway.entities[sensor.DOMAIN]) == 0 async def test_sensors(hass): @@ -116,7 +114,6 @@ async def test_sensors(hass): assert "sensor.consumption_sensor" in gateway.deconz_ids assert "sensor.clip_light_level_sensor" not in gateway.deconz_ids assert len(hass.states.async_all()) == 5 - assert len(gateway.entities[sensor.DOMAIN]) == 5 light_level_sensor = hass.states.get("sensor.light_level_sensor") assert light_level_sensor.state == "999.8" @@ -177,8 +174,6 @@ async def test_sensors(hass): await gateway.async_reset() assert len(hass.states.async_all()) == 0 - # Daylight sensor from deCONZ is added to set but is disabled by default - assert len(gateway.entities[sensor.DOMAIN]) == 1 async def test_allow_clip_sensors(hass): @@ -201,7 +196,6 @@ async def test_allow_clip_sensors(hass): assert "sensor.consumption_sensor" in gateway.deconz_ids assert "sensor.clip_light_level_sensor" in gateway.deconz_ids assert len(hass.states.async_all()) == 6 - assert len(gateway.entities[sensor.DOMAIN]) == 6 light_level_sensor = hass.states.get("sensor.light_level_sensor") assert light_level_sensor.state == "999.8" @@ -249,7 +243,6 @@ async def test_allow_clip_sensors(hass): assert "sensor.consumption_sensor" in gateway.deconz_ids assert "sensor.clip_light_level_sensor" not in gateway.deconz_ids assert len(hass.states.async_all()) == 5 - assert len(gateway.entities[sensor.DOMAIN]) == 5 hass.config_entries.async_update_entry( gateway.config_entry, options={deconz.gateway.CONF_ALLOW_CLIP_SENSOR: True} @@ -267,7 +260,6 @@ async def test_allow_clip_sensors(hass): assert "sensor.consumption_sensor" in gateway.deconz_ids assert "sensor.clip_light_level_sensor" in gateway.deconz_ids assert len(hass.states.async_all()) == 6 - assert len(gateway.entities[sensor.DOMAIN]) == 6 async def test_add_new_sensor(hass): @@ -300,8 +292,6 @@ async def test_add_battery_later(hass): assert len(gateway.deconz_ids) == 0 assert len(gateway.events) == 1 assert len(remote._callbacks) == 2 - assert len(gateway.entities[sensor.DOMAIN]) == 0 - assert len(gateway.entities[EVENT]) == 1 remote.update({"config": {"battery": 50}}) await hass.async_block_till_done() @@ -312,5 +302,3 @@ async def test_add_battery_later(hass): battery_sensor = hass.states.get("sensor.switch_1_battery_level") assert battery_sensor is not None - assert len(gateway.entities[sensor.DOMAIN]) == 1 - assert len(gateway.entities[EVENT]) == 1 diff --git a/tests/components/deconz/test_switch.py b/tests/components/deconz/test_switch.py index 7b1e0e6121c..b441868859b 100644 --- a/tests/components/deconz/test_switch.py +++ b/tests/components/deconz/test_switch.py @@ -64,7 +64,6 @@ async def test_no_switches(hass): gateway = await setup_deconz_integration(hass) assert len(gateway.deconz_ids) == 0 assert len(hass.states.async_all()) == 0 - assert len(gateway.entities[switch.DOMAIN]) == 0 async def test_switches(hass): @@ -78,7 +77,6 @@ async def test_switches(hass): assert "switch.unsupported_switch" not in gateway.deconz_ids assert "switch.on_off_relay" in gateway.deconz_ids assert len(hass.states.async_all()) == 5 - assert len(gateway.entities[switch.DOMAIN]) == 4 on_off_switch = hass.states.get("switch.on_off_switch") assert on_off_switch.state == "on" @@ -175,4 +173,3 @@ async def test_switches(hass): await gateway.async_reset() assert len(hass.states.async_all()) == 0 - assert len(gateway.entities[switch.DOMAIN]) == 0