diff --git a/homeassistant/components/guardian/__init__.py b/homeassistant/components/guardian/__init__.py index 9cb2590a289..4284d793764 100644 --- a/homeassistant/components/guardian/__init__.py +++ b/homeassistant/components/guardian/__init__.py @@ -29,7 +29,6 @@ from .const import ( DATA_COORDINATOR, DATA_COORDINATOR_PAIRED_SENSOR, DATA_PAIRED_SENSOR_MANAGER, - DATA_UNSUB_DISPATCHER_CONNECT, DOMAIN, LOGGER, SIGNAL_PAIRED_SENSOR_COORDINATOR_ADDED, @@ -41,22 +40,13 @@ PLATFORMS = ["binary_sensor", "sensor", "switch"] async def async_setup_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool: """Set up Elexa Guardian from a config entry.""" - hass.data.setdefault( - DOMAIN, - { - DATA_CLIENT: {}, - DATA_COORDINATOR: {}, - DATA_COORDINATOR_PAIRED_SENSOR: {}, - DATA_PAIRED_SENSOR_MANAGER: {}, - DATA_UNSUB_DISPATCHER_CONNECT: {}, - }, - ) - client = hass.data[DOMAIN][DATA_CLIENT][entry.entry_id] = Client( - entry.data[CONF_IP_ADDRESS], port=entry.data[CONF_PORT] - ) - hass.data[DOMAIN][DATA_COORDINATOR][entry.entry_id] = {} - hass.data[DOMAIN][DATA_COORDINATOR_PAIRED_SENSOR][entry.entry_id] = {} - hass.data[DOMAIN][DATA_UNSUB_DISPATCHER_CONNECT][entry.entry_id] = [] + hass.data.setdefault(DOMAIN, {}) + hass.data[DOMAIN][entry.entry_id] = { + DATA_COORDINATOR: {}, + DATA_COORDINATOR_PAIRED_SENSOR: {}, + } + + client = Client(entry.data[CONF_IP_ADDRESS], port=entry.data[CONF_PORT]) # The valve controller's UDP-based API can't handle concurrent requests very well, # so we use a lock to ensure that only one API request is reaching it at a time: @@ -71,7 +61,7 @@ async def async_setup_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool: (API_VALVE_STATUS, client.valve.status), (API_WIFI_STATUS, client.wifi.status), ): - coordinator = hass.data[DOMAIN][DATA_COORDINATOR][entry.entry_id][ + coordinator = hass.data[DOMAIN][entry.entry_id][DATA_COORDINATOR][ api ] = GuardianDataUpdateCoordinator( hass, @@ -84,11 +74,12 @@ async def async_setup_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool: init_valve_controller_tasks.append(coordinator.async_refresh()) await asyncio.gather(*init_valve_controller_tasks) + hass.data[DOMAIN][entry.entry_id][DATA_CLIENT] = client # Set up an object to evaluate each batch of paired sensor UIDs and add/remove # devices as appropriate: - paired_sensor_manager = hass.data[DOMAIN][DATA_PAIRED_SENSOR_MANAGER][ - entry.entry_id + paired_sensor_manager = hass.data[DOMAIN][entry.entry_id][ + DATA_PAIRED_SENSOR_MANAGER ] = PairedSensorManager(hass, entry, client, api_lock) await paired_sensor_manager.async_process_latest_paired_sensor_uids() @@ -99,7 +90,7 @@ async def async_setup_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool: paired_sensor_manager.async_process_latest_paired_sensor_uids() ) - hass.data[DOMAIN][DATA_COORDINATOR][entry.entry_id][ + hass.data[DOMAIN][entry.entry_id][DATA_COORDINATOR][ API_SENSOR_PAIR_DUMP ].async_add_listener(async_process_paired_sensor_uids) @@ -113,12 +104,7 @@ async def async_unload_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool: """Unload a config entry.""" unload_ok = await hass.config_entries.async_unload_platforms(entry, PLATFORMS) if unload_ok: - hass.data[DOMAIN][DATA_CLIENT].pop(entry.entry_id) - hass.data[DOMAIN][DATA_COORDINATOR].pop(entry.entry_id) - hass.data[DOMAIN][DATA_COORDINATOR_PAIRED_SENSOR].pop(entry.entry_id) - for unsub in hass.data[DOMAIN][DATA_UNSUB_DISPATCHER_CONNECT][entry.entry_id]: - unsub() - hass.data[DOMAIN][DATA_UNSUB_DISPATCHER_CONNECT].pop(entry.entry_id) + hass.data[DOMAIN].pop(entry.entry_id) return unload_ok @@ -146,8 +132,8 @@ class PairedSensorManager: self._paired_uids.add(uid) - coordinator = self._hass.data[DOMAIN][DATA_COORDINATOR_PAIRED_SENSOR][ - self._entry.entry_id + coordinator = self._hass.data[DOMAIN][self._entry.entry_id][ + DATA_COORDINATOR_PAIRED_SENSOR ][uid] = GuardianDataUpdateCoordinator( self._hass, client=self._client, @@ -170,7 +156,7 @@ class PairedSensorManager: """Process a list of new UIDs.""" try: uids = set( - self._hass.data[DOMAIN][DATA_COORDINATOR][self._entry.entry_id][ + self._hass.data[DOMAIN][self._entry.entry_id][DATA_COORDINATOR][ API_SENSOR_PAIR_DUMP ].data["paired_uids"] ) @@ -197,8 +183,8 @@ class PairedSensorManager: # Clear out objects related to this paired sensor: self._paired_uids.remove(uid) - self._hass.data[DOMAIN][DATA_COORDINATOR_PAIRED_SENSOR][ - self._entry.entry_id + self._hass.data[DOMAIN][self._entry.entry_id][ + DATA_COORDINATOR_PAIRED_SENSOR ].pop(uid) # Remove the paired sensor device from the device registry (which will diff --git a/homeassistant/components/guardian/binary_sensor.py b/homeassistant/components/guardian/binary_sensor.py index 7db91d41885..6ac07274501 100644 --- a/homeassistant/components/guardian/binary_sensor.py +++ b/homeassistant/components/guardian/binary_sensor.py @@ -22,7 +22,6 @@ from .const import ( CONF_UID, DATA_COORDINATOR, DATA_COORDINATOR_PAIRED_SENSOR, - DATA_UNSUB_DISPATCHER_CONNECT, DOMAIN, SIGNAL_PAIRED_SENSOR_COORDINATOR_ADDED, ) @@ -69,7 +68,7 @@ async def async_setup_entry( @callback def add_new_paired_sensor(uid: str) -> None: """Add a new paired sensor.""" - coordinator = hass.data[DOMAIN][DATA_COORDINATOR_PAIRED_SENSOR][entry.entry_id][ + coordinator = hass.data[DOMAIN][entry.entry_id][DATA_COORDINATOR_PAIRED_SENSOR][ uid ] @@ -81,7 +80,7 @@ async def async_setup_entry( ) # Handle adding paired sensors after HASS startup: - hass.data[DOMAIN][DATA_UNSUB_DISPATCHER_CONNECT][entry.entry_id].append( + entry.async_on_unload( async_dispatcher_connect( hass, SIGNAL_PAIRED_SENSOR_COORDINATOR_ADDED.format(entry.data[CONF_UID]), @@ -92,7 +91,7 @@ async def async_setup_entry( # Add all valve controller-specific binary sensors: sensors: list[PairedSensorBinarySensor | ValveControllerBinarySensor] = [ ValveControllerBinarySensor( - entry, hass.data[DOMAIN][DATA_COORDINATOR][entry.entry_id], description + entry, hass.data[DOMAIN][entry.entry_id][DATA_COORDINATOR], description ) for description in VALVE_CONTROLLER_DESCRIPTIONS ] @@ -101,8 +100,8 @@ async def async_setup_entry( sensors.extend( [ PairedSensorBinarySensor(entry, coordinator, description) - for coordinator in hass.data[DOMAIN][DATA_COORDINATOR_PAIRED_SENSOR][ - entry.entry_id + for coordinator in hass.data[DOMAIN][entry.entry_id][ + DATA_COORDINATOR_PAIRED_SENSOR ].values() for description in PAIRED_SENSOR_DESCRIPTIONS ] diff --git a/homeassistant/components/guardian/const.py b/homeassistant/components/guardian/const.py index e27e8a37047..5e3779cc447 100644 --- a/homeassistant/components/guardian/const.py +++ b/homeassistant/components/guardian/const.py @@ -18,6 +18,5 @@ DATA_CLIENT = "client" DATA_COORDINATOR = "coordinator" DATA_COORDINATOR_PAIRED_SENSOR = "coordinator_paired_sensor" DATA_PAIRED_SENSOR_MANAGER = "paired_sensor_manager" -DATA_UNSUB_DISPATCHER_CONNECT = "unsub_dispatcher_connect" SIGNAL_PAIRED_SENSOR_COORDINATOR_ADDED = "guardian_paired_sensor_coordinator_added_{0}" diff --git a/homeassistant/components/guardian/sensor.py b/homeassistant/components/guardian/sensor.py index 3a014d5cbf4..9a88805baaf 100644 --- a/homeassistant/components/guardian/sensor.py +++ b/homeassistant/components/guardian/sensor.py @@ -26,7 +26,6 @@ from .const import ( CONF_UID, DATA_COORDINATOR, DATA_COORDINATOR_PAIRED_SENSOR, - DATA_UNSUB_DISPATCHER_CONNECT, DOMAIN, SIGNAL_PAIRED_SENSOR_COORDINATOR_ADDED, ) @@ -75,7 +74,7 @@ async def async_setup_entry( @callback def add_new_paired_sensor(uid: str) -> None: """Add a new paired sensor.""" - coordinator = hass.data[DOMAIN][DATA_COORDINATOR_PAIRED_SENSOR][entry.entry_id][ + coordinator = hass.data[DOMAIN][entry.entry_id][DATA_COORDINATOR_PAIRED_SENSOR][ uid ] @@ -87,7 +86,7 @@ async def async_setup_entry( ) # Handle adding paired sensors after HASS startup: - hass.data[DOMAIN][DATA_UNSUB_DISPATCHER_CONNECT][entry.entry_id].append( + entry.async_on_unload( async_dispatcher_connect( hass, SIGNAL_PAIRED_SENSOR_COORDINATOR_ADDED.format(entry.data[CONF_UID]), @@ -98,7 +97,7 @@ async def async_setup_entry( # Add all valve controller-specific binary sensors: sensors: list[PairedSensorSensor | ValveControllerSensor] = [ ValveControllerSensor( - entry, hass.data[DOMAIN][DATA_COORDINATOR][entry.entry_id], description + entry, hass.data[DOMAIN][entry.entry_id][DATA_COORDINATOR], description ) for description in VALVE_CONTROLLER_DESCRIPTIONS ] @@ -107,8 +106,8 @@ async def async_setup_entry( sensors.extend( [ PairedSensorSensor(entry, coordinator, description) - for coordinator in hass.data[DOMAIN][DATA_COORDINATOR_PAIRED_SENSOR][ - entry.entry_id + for coordinator in hass.data[DOMAIN][entry.entry_id][ + DATA_COORDINATOR_PAIRED_SENSOR ].values() for description in PAIRED_SENSOR_DESCRIPTIONS ] diff --git a/homeassistant/components/guardian/switch.py b/homeassistant/components/guardian/switch.py index 9b7db16dd15..7417499e53a 100644 --- a/homeassistant/components/guardian/switch.py +++ b/homeassistant/components/guardian/switch.py @@ -81,8 +81,8 @@ async def async_setup_entry( [ ValveControllerSwitch( entry, - hass.data[DOMAIN][DATA_CLIENT][entry.entry_id], - hass.data[DOMAIN][DATA_COORDINATOR][entry.entry_id], + hass.data[DOMAIN][entry.entry_id][DATA_CLIENT], + hass.data[DOMAIN][entry.entry_id][DATA_COORDINATOR], ) ] ) @@ -160,8 +160,8 @@ class ValveControllerSwitch(ValveControllerEntity, SwitchEntity): LOGGER.error("Error while adding paired sensor: %s", err) return - await self.hass.data[DOMAIN][DATA_PAIRED_SENSOR_MANAGER][ - self._entry.entry_id + await self.hass.data[DOMAIN][self._entry.entry_id][ + DATA_PAIRED_SENSOR_MANAGER ].async_pair_sensor(uid) async def async_reboot(self) -> None: @@ -189,8 +189,8 @@ class ValveControllerSwitch(ValveControllerEntity, SwitchEntity): LOGGER.error("Error while removing paired sensor: %s", err) return - await self.hass.data[DOMAIN][DATA_PAIRED_SENSOR_MANAGER][ - self._entry.entry_id + await self.hass.data[DOMAIN][self._entry.entry_id][ + DATA_PAIRED_SENSOR_MANAGER ].async_unpair_sensor(uid) async def async_upgrade_firmware(