From 8a9a141f3c6390776eff05addda69a3533c79a17 Mon Sep 17 00:00:00 2001 From: Raman Gupta <7243222+raman325@users.noreply.github.com> Date: Mon, 21 Jun 2021 16:45:47 -0400 Subject: [PATCH] Fix zwave_js migration logic (#52070) * Fix zwave_js migration logic * revert change to move tests to new module * Update tests/components/zwave_js/test_init.py Co-authored-by: Martin Hjelmare Co-authored-by: Martin Hjelmare --- homeassistant/components/zwave_js/migrate.py | 6 ++- tests/components/zwave_js/test_init.py | 41 ++++++++++++++++++++ 2 files changed, 46 insertions(+), 1 deletion(-) diff --git a/homeassistant/components/zwave_js/migrate.py b/homeassistant/components/zwave_js/migrate.py index ea4b978cab5..397f7efba24 100644 --- a/homeassistant/components/zwave_js/migrate.py +++ b/homeassistant/components/zwave_js/migrate.py @@ -84,7 +84,11 @@ def async_migrate_old_entity( if entry.domain != platform or entry.unique_id in registered_unique_ids: continue - old_ent_value_id = ValueID.from_unique_id(entry.unique_id) + try: + old_ent_value_id = ValueID.from_unique_id(entry.unique_id) + # Skip non value ID based unique ID's (e.g. node status sensor) + except IndexError: + continue if value_id.is_same_value_different_endpoints(old_ent_value_id): existing_entity_entries.append(entry) diff --git a/tests/components/zwave_js/test_init.py b/tests/components/zwave_js/test_init.py index 840d1b15b4d..3d57c449549 100644 --- a/tests/components/zwave_js/test_init.py +++ b/tests/components/zwave_js/test_init.py @@ -369,6 +369,47 @@ async def test_old_entity_migration( assert ent_reg.async_get_entity_id("sensor", DOMAIN, old_unique_id) is None +async def test_different_endpoint_migration_status_sensor( + hass, hank_binary_switch_state, client, integration +): + """Test that the different endpoint migration logic skips over the status sensor.""" + node = Node(client, hank_binary_switch_state) + + ent_reg = er.async_get(hass) + dev_reg = dr.async_get(hass) + device = dev_reg.async_get_or_create( + config_entry_id=integration.entry_id, identifiers={get_device_id(client, node)} + ) + + SENSOR_NAME = "sensor.smart_plug_with_two_usb_ports_status_sensor" + entity_name = SENSOR_NAME.split(".")[1] + + # Create entity RegistryEntry using fake endpoint + old_unique_id = f"{client.driver.controller.home_id}.32.node_status" + entity_entry = ent_reg.async_get_or_create( + "sensor", + DOMAIN, + old_unique_id, + suggested_object_id=entity_name, + config_entry=integration, + original_name=entity_name, + device_id=device.id, + ) + assert entity_entry.entity_id == SENSOR_NAME + assert entity_entry.unique_id == old_unique_id + + # Do this twice to make sure re-interview doesn't do anything weird + for i in range(0, 2): + # Add a ready node, unique ID should be migrated + event = {"node": node} + client.driver.controller.emit("node added", event) + await hass.async_block_till_done() + + # Check that the RegistryEntry is using the same unique ID + entity_entry = ent_reg.async_get(SENSOR_NAME) + assert entity_entry.unique_id == old_unique_id + + async def test_skip_old_entity_migration_for_multiple( hass, hank_binary_switch_state, client, integration ):