mirror of
https://github.com/home-assistant/core.git
synced 2025-07-28 07:37:34 +00:00
Remove device and entity registry entries when removing a ZHA device (#24369)
* cleanup when device is removed fixes * cleanup
This commit is contained in:
parent
ee1884423a
commit
d9420c1f73
@ -312,7 +312,8 @@ class ZHADevice:
|
|||||||
ex
|
ex
|
||||||
)
|
)
|
||||||
|
|
||||||
async def async_unsub_dispatcher(self):
|
@callback
|
||||||
|
def async_unsub_dispatcher(self):
|
||||||
"""Unsubscribe the dispatcher."""
|
"""Unsubscribe the dispatcher."""
|
||||||
if self._unsub:
|
if self._unsub:
|
||||||
self._unsub()
|
self._unsub()
|
||||||
|
@ -14,6 +14,8 @@ import traceback
|
|||||||
|
|
||||||
from homeassistant.components.system_log import LogEntry, _figure_out_source
|
from homeassistant.components.system_log import LogEntry, _figure_out_source
|
||||||
from homeassistant.core import callback
|
from homeassistant.core import callback
|
||||||
|
from homeassistant.helpers.device_registry import\
|
||||||
|
async_get_registry as get_dev_reg
|
||||||
from homeassistant.helpers.dispatcher import async_dispatcher_send
|
from homeassistant.helpers.dispatcher import async_dispatcher_send
|
||||||
from homeassistant.helpers.entity_component import EntityComponent
|
from homeassistant.helpers.entity_component import EntityComponent
|
||||||
|
|
||||||
@ -146,13 +148,20 @@ class ZHAGateway:
|
|||||||
"""Handle device leaving the network."""
|
"""Handle device leaving the network."""
|
||||||
pass
|
pass
|
||||||
|
|
||||||
|
async def _async_remove_device(self, device):
|
||||||
|
ha_device_registry = await get_dev_reg(self._hass)
|
||||||
|
reg_device = ha_device_registry.async_get_device(
|
||||||
|
{(DOMAIN, str(device.ieee))}, set())
|
||||||
|
ha_device_registry.async_remove_device(reg_device.id)
|
||||||
|
|
||||||
def device_removed(self, device):
|
def device_removed(self, device):
|
||||||
"""Handle device being removed from the network."""
|
"""Handle device being removed from the network."""
|
||||||
zha_device = self._devices.pop(device.ieee, None)
|
zha_device = self._devices.pop(device.ieee, None)
|
||||||
self._device_registry.pop(device.ieee, None)
|
self._device_registry.pop(device.ieee, None)
|
||||||
if zha_device is not None:
|
if zha_device is not None:
|
||||||
device_info = async_get_device_info(self._hass, zha_device)
|
device_info = async_get_device_info(self._hass, zha_device)
|
||||||
self._hass.async_create_task(zha_device.async_unsub_dispatcher())
|
zha_device.async_unsub_dispatcher()
|
||||||
|
asyncio.ensure_future(self._async_remove_device(zha_device))
|
||||||
async_dispatcher_send(
|
async_dispatcher_send(
|
||||||
self._hass,
|
self._hass,
|
||||||
"{}_{}".format(SIGNAL_REMOVE, str(zha_device.ieee))
|
"{}_{}".format(SIGNAL_REMOVE, str(zha_device.ieee))
|
||||||
|
@ -219,7 +219,8 @@ class DeviceRegistry:
|
|||||||
|
|
||||||
return new
|
return new
|
||||||
|
|
||||||
def _async_remove_device(self, device_id):
|
def async_remove_device(self, device_id):
|
||||||
|
"""Remove a device from the device registry."""
|
||||||
del self.devices[device_id]
|
del self.devices[device_id]
|
||||||
self.hass.bus.async_fire(EVENT_DEVICE_REGISTRY_UPDATED, {
|
self.hass.bus.async_fire(EVENT_DEVICE_REGISTRY_UPDATED, {
|
||||||
'action': 'remove',
|
'action': 'remove',
|
||||||
@ -297,7 +298,7 @@ class DeviceRegistry:
|
|||||||
self._async_update_device(
|
self._async_update_device(
|
||||||
dev_id, remove_config_entry_id=config_entry_id)
|
dev_id, remove_config_entry_id=config_entry_id)
|
||||||
for dev_id in remove:
|
for dev_id in remove:
|
||||||
self._async_remove_device(dev_id)
|
self.async_remove_device(dev_id)
|
||||||
|
|
||||||
@callback
|
@callback
|
||||||
def async_clear_area_id(self, area_id: str) -> None:
|
def async_clear_area_id(self, area_id: str) -> None:
|
||||||
|
@ -17,6 +17,7 @@ import weakref
|
|||||||
import attr
|
import attr
|
||||||
|
|
||||||
from homeassistant.core import callback, split_entity_id, valid_entity_id
|
from homeassistant.core import callback, split_entity_id, valid_entity_id
|
||||||
|
from homeassistant.helpers.device_registry import EVENT_DEVICE_REGISTRY_UPDATED
|
||||||
from homeassistant.loader import bind_hass
|
from homeassistant.loader import bind_hass
|
||||||
from homeassistant.util import ensure_unique_string, slugify
|
from homeassistant.util import ensure_unique_string, slugify
|
||||||
from homeassistant.util.yaml import load_yaml
|
from homeassistant.util.yaml import load_yaml
|
||||||
@ -84,6 +85,10 @@ class EntityRegistry:
|
|||||||
self.hass = hass
|
self.hass = hass
|
||||||
self.entities = None
|
self.entities = None
|
||||||
self._store = hass.helpers.storage.Store(STORAGE_VERSION, STORAGE_KEY)
|
self._store = hass.helpers.storage.Store(STORAGE_VERSION, STORAGE_KEY)
|
||||||
|
self.hass.bus.async_listen(
|
||||||
|
EVENT_DEVICE_REGISTRY_UPDATED,
|
||||||
|
self.async_device_removed
|
||||||
|
)
|
||||||
|
|
||||||
@callback
|
@callback
|
||||||
def async_is_registered(self, entity_id):
|
def async_is_registered(self, entity_id):
|
||||||
@ -169,6 +174,19 @@ class EntityRegistry:
|
|||||||
})
|
})
|
||||||
self.async_schedule_save()
|
self.async_schedule_save()
|
||||||
|
|
||||||
|
@callback
|
||||||
|
def async_device_removed(self, event):
|
||||||
|
"""Handle the removal of a device.
|
||||||
|
|
||||||
|
Remove entities from the registry that are associated to a device when
|
||||||
|
the device is removed.
|
||||||
|
"""
|
||||||
|
if event.data['action'] != 'remove':
|
||||||
|
return
|
||||||
|
entities = async_entries_for_device(self, event.data['device_id'])
|
||||||
|
for entity in entities:
|
||||||
|
self.async_remove(entity.entity_id)
|
||||||
|
|
||||||
@callback
|
@callback
|
||||||
def async_update_entity(self, entity_id, *, name=_UNDEF,
|
def async_update_entity(self, entity_id, *, name=_UNDEF,
|
||||||
new_entity_id=_UNDEF, new_unique_id=_UNDEF):
|
new_entity_id=_UNDEF, new_unique_id=_UNDEF):
|
||||||
|
Loading…
x
Reference in New Issue
Block a user