Fix wirelesstag unique_id to use uuid instead of tag_id (#104394)

Co-authored-by: Robert Resch <robert@resch.dev>
This commit is contained in:
Sergiy Maysak 2023-11-30 13:14:46 +02:00 committed by GitHub
parent d1a2192e37
commit 1ab9357840
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 54 additions and 24 deletions

View File

@ -5,6 +5,7 @@ from requests.exceptions import ConnectTimeout, HTTPError
import voluptuous as vol import voluptuous as vol
from wirelesstagpy import WirelessTags from wirelesstagpy import WirelessTags
from wirelesstagpy.exceptions import WirelessTagsException from wirelesstagpy.exceptions import WirelessTagsException
from wirelesstagpy.sensortag import SensorTag
from homeassistant.components import persistent_notification from homeassistant.components import persistent_notification
from homeassistant.const import ( from homeassistant.const import (
@ -17,6 +18,7 @@ from homeassistant.const import (
UnitOfElectricPotential, UnitOfElectricPotential,
) )
from homeassistant.core import HomeAssistant from homeassistant.core import HomeAssistant
from homeassistant.helpers import entity_registry as er
import homeassistant.helpers.config_validation as cv import homeassistant.helpers.config_validation as cv
from homeassistant.helpers.dispatcher import dispatcher_send from homeassistant.helpers.dispatcher import dispatcher_send
from homeassistant.helpers.entity import Entity from homeassistant.helpers.entity import Entity
@ -126,6 +128,20 @@ class WirelessTagPlatform:
self.api.start_monitoring(push_callback) self.api.start_monitoring(push_callback)
def async_migrate_unique_id(hass: HomeAssistant, tag: SensorTag, domain: str, key: str):
"""Migrate old unique id to new one with use of tag's uuid."""
registry = er.async_get(hass)
new_unique_id = f"{tag.uuid}_{key}"
if registry.async_get_entity_id(domain, DOMAIN, new_unique_id):
return
old_unique_id = f"{tag.tag_id}_{key}"
if entity_id := registry.async_get_entity_id(domain, DOMAIN, old_unique_id):
_LOGGER.debug("Updating unique id for %s %s", key, entity_id)
registry.async_update_entity(entity_id, new_unique_id=new_unique_id)
def setup(hass: HomeAssistant, config: ConfigType) -> bool: def setup(hass: HomeAssistant, config: ConfigType) -> bool:
"""Set up the Wireless Sensor Tag component.""" """Set up the Wireless Sensor Tag component."""
conf = config[DOMAIN] conf = config[DOMAIN]

View File

@ -4,7 +4,7 @@ from __future__ import annotations
import voluptuous as vol import voluptuous as vol
from homeassistant.components.binary_sensor import PLATFORM_SCHEMA, BinarySensorEntity from homeassistant.components.binary_sensor import PLATFORM_SCHEMA, BinarySensorEntity
from homeassistant.const import CONF_MONITORED_CONDITIONS, STATE_OFF, STATE_ON from homeassistant.const import CONF_MONITORED_CONDITIONS, STATE_OFF, STATE_ON, Platform
from homeassistant.core import HomeAssistant, callback from homeassistant.core import HomeAssistant, callback
import homeassistant.helpers.config_validation as cv import homeassistant.helpers.config_validation as cv
from homeassistant.helpers.dispatcher import async_dispatcher_connect from homeassistant.helpers.dispatcher import async_dispatcher_connect
@ -15,6 +15,7 @@ from . import (
DOMAIN as WIRELESSTAG_DOMAIN, DOMAIN as WIRELESSTAG_DOMAIN,
SIGNAL_BINARY_EVENT_UPDATE, SIGNAL_BINARY_EVENT_UPDATE,
WirelessTagBaseSensor, WirelessTagBaseSensor,
async_migrate_unique_id,
) )
# On means in range, Off means out of range # On means in range, Off means out of range
@ -72,10 +73,10 @@ PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend(
) )
def setup_platform( async def async_setup_platform(
hass: HomeAssistant, hass: HomeAssistant,
config: ConfigType, config: ConfigType,
add_entities: AddEntitiesCallback, async_add_entities: AddEntitiesCallback,
discovery_info: DiscoveryInfoType | None = None, discovery_info: DiscoveryInfoType | None = None,
) -> None: ) -> None:
"""Set up the platform for a WirelessTags.""" """Set up the platform for a WirelessTags."""
@ -87,9 +88,10 @@ def setup_platform(
allowed_sensor_types = tag.supported_binary_events_types allowed_sensor_types = tag.supported_binary_events_types
for sensor_type in config[CONF_MONITORED_CONDITIONS]: for sensor_type in config[CONF_MONITORED_CONDITIONS]:
if sensor_type in allowed_sensor_types: if sensor_type in allowed_sensor_types:
async_migrate_unique_id(hass, tag, Platform.BINARY_SENSOR, sensor_type)
sensors.append(WirelessTagBinarySensor(platform, tag, sensor_type)) sensors.append(WirelessTagBinarySensor(platform, tag, sensor_type))
add_entities(sensors, True) async_add_entities(sensors, True)
class WirelessTagBinarySensor(WirelessTagBaseSensor, BinarySensorEntity): class WirelessTagBinarySensor(WirelessTagBaseSensor, BinarySensorEntity):
@ -100,7 +102,7 @@ class WirelessTagBinarySensor(WirelessTagBaseSensor, BinarySensorEntity):
super().__init__(api, tag) super().__init__(api, tag)
self._sensor_type = sensor_type self._sensor_type = sensor_type
self._name = f"{self._tag.name} {self.event.human_readable_name}" self._name = f"{self._tag.name} {self.event.human_readable_name}"
self._attr_unique_id = f"{self.tag_id}_{self._sensor_type}" self._attr_unique_id = f"{self._uuid}_{self._sensor_type}"
async def async_added_to_hass(self) -> None: async def async_added_to_hass(self) -> None:
"""Register callbacks.""" """Register callbacks."""

View File

@ -12,14 +12,19 @@ from homeassistant.components.sensor import (
SensorEntityDescription, SensorEntityDescription,
SensorStateClass, SensorStateClass,
) )
from homeassistant.const import CONF_MONITORED_CONDITIONS from homeassistant.const import CONF_MONITORED_CONDITIONS, Platform
from homeassistant.core import HomeAssistant, callback from homeassistant.core import HomeAssistant, callback
import homeassistant.helpers.config_validation as cv import homeassistant.helpers.config_validation as cv
from homeassistant.helpers.dispatcher import async_dispatcher_connect from homeassistant.helpers.dispatcher import async_dispatcher_connect
from homeassistant.helpers.entity_platform import AddEntitiesCallback from homeassistant.helpers.entity_platform import AddEntitiesCallback
from homeassistant.helpers.typing import ConfigType, DiscoveryInfoType from homeassistant.helpers.typing import ConfigType, DiscoveryInfoType
from . import DOMAIN as WIRELESSTAG_DOMAIN, SIGNAL_TAG_UPDATE, WirelessTagBaseSensor from . import (
DOMAIN as WIRELESSTAG_DOMAIN,
SIGNAL_TAG_UPDATE,
WirelessTagBaseSensor,
async_migrate_unique_id,
)
_LOGGER = logging.getLogger(__name__) _LOGGER = logging.getLogger(__name__)
@ -68,10 +73,10 @@ PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend(
) )
def setup_platform( async def async_setup_platform(
hass: HomeAssistant, hass: HomeAssistant,
config: ConfigType, config: ConfigType,
add_entities: AddEntitiesCallback, async_add_entities: AddEntitiesCallback,
discovery_info: DiscoveryInfoType | None = None, discovery_info: DiscoveryInfoType | None = None,
) -> None: ) -> None:
"""Set up the sensor platform.""" """Set up the sensor platform."""
@ -83,9 +88,10 @@ def setup_platform(
if key not in tag.allowed_sensor_types: if key not in tag.allowed_sensor_types:
continue continue
description = SENSOR_TYPES[key] description = SENSOR_TYPES[key]
async_migrate_unique_id(hass, tag, Platform.SENSOR, description.key)
sensors.append(WirelessTagSensor(platform, tag, description)) sensors.append(WirelessTagSensor(platform, tag, description))
add_entities(sensors, True) async_add_entities(sensors, True)
class WirelessTagSensor(WirelessTagBaseSensor, SensorEntity): class WirelessTagSensor(WirelessTagBaseSensor, SensorEntity):
@ -100,7 +106,7 @@ class WirelessTagSensor(WirelessTagBaseSensor, SensorEntity):
self._sensor_type = description.key self._sensor_type = description.key
self.entity_description = description self.entity_description = description
self._name = self._tag.name self._name = self._tag.name
self._attr_unique_id = f"{self.tag_id}_{self._sensor_type}" self._attr_unique_id = f"{self._uuid}_{self._sensor_type}"
# I want to see entity_id as: # I want to see entity_id as:
# sensor.wirelesstag_bedroom_temperature # sensor.wirelesstag_bedroom_temperature

View File

@ -10,13 +10,17 @@ from homeassistant.components.switch import (
SwitchEntity, SwitchEntity,
SwitchEntityDescription, SwitchEntityDescription,
) )
from homeassistant.const import CONF_MONITORED_CONDITIONS from homeassistant.const import CONF_MONITORED_CONDITIONS, Platform
from homeassistant.core import HomeAssistant from homeassistant.core import HomeAssistant
import homeassistant.helpers.config_validation as cv import homeassistant.helpers.config_validation as cv
from homeassistant.helpers.entity_platform import AddEntitiesCallback from homeassistant.helpers.entity_platform import AddEntitiesCallback
from homeassistant.helpers.typing import ConfigType, DiscoveryInfoType from homeassistant.helpers.typing import ConfigType, DiscoveryInfoType
from . import DOMAIN as WIRELESSTAG_DOMAIN, WirelessTagBaseSensor from . import (
DOMAIN as WIRELESSTAG_DOMAIN,
WirelessTagBaseSensor,
async_migrate_unique_id,
)
SWITCH_TYPES: tuple[SwitchEntityDescription, ...] = ( SWITCH_TYPES: tuple[SwitchEntityDescription, ...] = (
SwitchEntityDescription( SwitchEntityDescription(
@ -52,10 +56,10 @@ PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend(
) )
def setup_platform( async def async_setup_platform(
hass: HomeAssistant, hass: HomeAssistant,
config: ConfigType, config: ConfigType,
add_entities: AddEntitiesCallback, async_add_entities: AddEntitiesCallback,
discovery_info: DiscoveryInfoType | None = None, discovery_info: DiscoveryInfoType | None = None,
) -> None: ) -> None:
"""Set up switches for a Wireless Sensor Tags.""" """Set up switches for a Wireless Sensor Tags."""
@ -63,15 +67,17 @@ def setup_platform(
tags = platform.load_tags() tags = platform.load_tags()
monitored_conditions = config[CONF_MONITORED_CONDITIONS] monitored_conditions = config[CONF_MONITORED_CONDITIONS]
entities = [ entities = []
WirelessTagSwitch(platform, tag, description) for tag in tags.values():
for tag in tags.values() for description in SWITCH_TYPES:
for description in SWITCH_TYPES if (
if description.key in monitored_conditions description.key in monitored_conditions
and description.key in tag.allowed_monitoring_types and description.key in tag.allowed_monitoring_types
] ):
async_migrate_unique_id(hass, tag, Platform.SWITCH, description.key)
entities.append(WirelessTagSwitch(platform, tag, description))
add_entities(entities, True) async_add_entities(entities, True)
class WirelessTagSwitch(WirelessTagBaseSensor, SwitchEntity): class WirelessTagSwitch(WirelessTagBaseSensor, SwitchEntity):
@ -82,7 +88,7 @@ class WirelessTagSwitch(WirelessTagBaseSensor, SwitchEntity):
super().__init__(api, tag) super().__init__(api, tag)
self.entity_description = description self.entity_description = description
self._name = f"{self._tag.name} {description.name}" self._name = f"{self._tag.name} {description.name}"
self._attr_unique_id = f"{self.tag_id}_{description.key}" self._attr_unique_id = f"{self._uuid}_{description.key}"
def turn_on(self, **kwargs: Any) -> None: def turn_on(self, **kwargs: Any) -> None:
"""Turn on the switch.""" """Turn on the switch."""