From a494d3ec69525435146aa960ce4e8ff864af8bf3 Mon Sep 17 00:00:00 2001 From: Yuxin Wang Date: Wed, 17 Sep 2025 04:41:19 -0400 Subject: [PATCH] Sort the resources for deterministic sensor addition order in APCUPSD (#152467) --- homeassistant/components/apcupsd/sensor.py | 5 +- tests/components/apcupsd/__init__.py | 1 + .../apcupsd/snapshots/test_diagnostics.ambr | 1 + .../apcupsd/snapshots/test_sensor.ambr | 52 ++++++++++++++++++- 4 files changed, 56 insertions(+), 3 deletions(-) diff --git a/homeassistant/components/apcupsd/sensor.py b/homeassistant/components/apcupsd/sensor.py index 00922b75ed8..3a18bea1a8a 100644 --- a/homeassistant/components/apcupsd/sensor.py +++ b/homeassistant/components/apcupsd/sensor.py @@ -467,7 +467,10 @@ async def async_setup_entry( # periodical (or manual) self test since last daemon restart. It might not be available # when we set up the integration, and we do not know if it would ever be available. Here we # add it anyway and mark it as unknown initially. - for resource in available_resources | {LAST_S_TEST}: + # + # We also sort the resources to ensure the order of entities created is deterministic since + # "APCMODEL" and "MODEL" resources map to the same "Model" name. + for resource in sorted(available_resources | {LAST_S_TEST}): if resource not in SENSORS: _LOGGER.warning("Invalid resource from APCUPSd: %s", resource.upper()) continue diff --git a/tests/components/apcupsd/__init__.py b/tests/components/apcupsd/__init__.py index ac18d4e4277..27ddd478b9b 100644 --- a/tests/components/apcupsd/__init__.py +++ b/tests/components/apcupsd/__init__.py @@ -16,6 +16,7 @@ MOCK_STATUS: Final = { "DRIVER": "USB UPS Driver", "UPSMODE": "Stand Alone", "UPSNAME": "MyUPS", + "APCMODEL": "Back-UPS ES 600", "MODEL": "Back-UPS ES 600", "STATUS": "ONLINE", "LINEV": "124.0 Volts", diff --git a/tests/components/apcupsd/snapshots/test_diagnostics.ambr b/tests/components/apcupsd/snapshots/test_diagnostics.ambr index a3c4d16da2f..669654c75bb 100644 --- a/tests/components/apcupsd/snapshots/test_diagnostics.ambr +++ b/tests/components/apcupsd/snapshots/test_diagnostics.ambr @@ -3,6 +3,7 @@ dict({ 'ALARMDEL': '30 Seconds', 'APC': '001,038,0985', + 'APCMODEL': 'Back-UPS ES 600', 'BATTDATE': '1970-01-01', 'BATTV': '13.7 Volts', 'BCHARGE': '100.0 Percent', diff --git a/tests/components/apcupsd/snapshots/test_sensor.ambr b/tests/components/apcupsd/snapshots/test_sensor.ambr index a873607180f..4e9626bec6b 100644 --- a/tests/components/apcupsd/snapshots/test_sensor.ambr +++ b/tests/components/apcupsd/snapshots/test_sensor.ambr @@ -934,8 +934,8 @@ 'previous_unique_id': None, 'suggested_object_id': None, 'supported_features': 0, - 'translation_key': 'model', - 'unique_id': 'XXXXXXXXXXXX_model', + 'translation_key': 'apc_model', + 'unique_id': 'XXXXXXXXXXXX_apcmodel', 'unit_of_measurement': None, }) # --- @@ -952,6 +952,54 @@ 'state': 'Back-UPS ES 600', }) # --- +# name: test_sensor[sensor.myups_model_2-entry] + EntityRegistryEntrySnapshot({ + 'aliases': set({ + }), + 'area_id': None, + 'capabilities': None, + 'config_entry_id': , + 'config_subentry_id': , + 'device_class': None, + 'device_id': , + 'disabled_by': None, + 'domain': 'sensor', + 'entity_category': , + 'entity_id': 'sensor.myups_model_2', + 'has_entity_name': True, + 'hidden_by': None, + 'icon': None, + 'id': , + 'labels': set({ + }), + 'name': None, + 'options': dict({ + }), + 'original_device_class': None, + 'original_icon': None, + 'original_name': 'Model', + 'platform': 'apcupsd', + 'previous_unique_id': None, + 'suggested_object_id': None, + 'supported_features': 0, + 'translation_key': 'model', + 'unique_id': 'XXXXXXXXXXXX_model', + 'unit_of_measurement': None, + }) +# --- +# name: test_sensor[sensor.myups_model_2-state] + StateSnapshot({ + 'attributes': ReadOnlyDict({ + 'friendly_name': 'MyUPS Model', + }), + 'context': , + 'entity_id': 'sensor.myups_model_2', + 'last_changed': , + 'last_reported': , + 'last_updated': , + 'state': 'Back-UPS ES 600', + }) +# --- # name: test_sensor[sensor.myups_name-entry] EntityRegistryEntrySnapshot({ 'aliases': set({