From 9fedf1e252be7f49bf9903b090597f48d9665c57 Mon Sep 17 00:00:00 2001 From: epenet <6771947+epenet@users.noreply.github.com> Date: Mon, 14 Sep 2026 14:54:43 +0200 Subject: [PATCH] Drop "unsupported" suffix in Tuya device info (#182171) --- homeassistant/components/tuya/coordinator.py | 2 +- homeassistant/components/tuya/entity.py | 6 +- homeassistant/components/tuya/util.py | 8 +- .../components/tuya/snapshots/test_init.ambr | 78 +++++++++---------- tests/components/tuya/test_init.py | 23 ++---- 5 files changed, 49 insertions(+), 68 deletions(-) diff --git a/homeassistant/components/tuya/coordinator.py b/homeassistant/components/tuya/coordinator.py index da1aad100759..c96e3b5fd29d 100644 --- a/homeassistant/components/tuya/coordinator.py +++ b/homeassistant/components/tuya/coordinator.py @@ -151,7 +151,7 @@ class DeviceListener(SharingDeviceListener): device_registry.async_get_or_create( config_entry_id=self._entry.entry_id, - **get_device_info(device, initial=True), + **get_device_info(device), ) def remove_device(self, device_id: str) -> None: diff --git a/homeassistant/components/tuya/entity.py b/homeassistant/components/tuya/entity.py index cbefb534acc7..fb5326038388 100644 --- a/homeassistant/components/tuya/entity.py +++ b/homeassistant/components/tuya/entity.py @@ -5,11 +5,11 @@ from typing import Any, override from tuya_device_handlers.device_wrapper import DeviceWrapper from tuya_sharing import CustomerDevice, Manager +from homeassistant.helpers.device_registry import DeviceInfo from homeassistant.helpers.dispatcher import async_dispatcher_connect from homeassistant.helpers.entity import Entity, EntityDescription -from .const import LOGGER, TUYA_HA_SIGNAL_UPDATE_ENTITY -from .util import get_device_info +from .const import DOMAIN, LOGGER, TUYA_HA_SIGNAL_UPDATE_ENTITY class TuyaEntity(Entity): @@ -25,7 +25,7 @@ class TuyaEntity(Entity): description: EntityDescription, ) -> None: """Init TuyaEntity.""" - self._attr_device_info = get_device_info(device) + self._attr_device_info = DeviceInfo(identifiers={(DOMAIN, device.id)}) self._attr_unique_id = f"tuya.{device.id}{description.key}" # pylint: disable=home-assistant-entity-unique-id-redundant-domain self.entity_description = description # TuyaEntity initialize mq can subscribe diff --git a/homeassistant/components/tuya/util.py b/homeassistant/components/tuya/util.py index bca752d81143..f340c2d80727 100644 --- a/homeassistant/components/tuya/util.py +++ b/homeassistant/components/tuya/util.py @@ -63,18 +63,12 @@ class ActionDPCodeNotFoundError(ServiceValidationError): ) -def get_device_info(device: CustomerDevice, *, initial: bool = False) -> DeviceInfo: +def get_device_info(device: CustomerDevice) -> DeviceInfo: """Get device info.""" manufacturer = "Tuya" model: str | None = device.product_name model_id: str | None = device.product_id - if initial: - # Note: the model is overridden via entity.device_info property - # when the entity is created. If no entities are generated, it will - # stay as unsupported - model = f"{device.product_name} (unsupported)" - if ( quirk := TUYA_QUIRKS_REGISTRY.get_quirk_for_device(device) ) and quirk.manufacturer: diff --git a/tests/components/tuya/snapshots/test_init.ambr b/tests/components/tuya/snapshots/test_init.ambr index 73e20d98523c..364e22de1037 100644 --- a/tests/components/tuya/snapshots/test_init.ambr +++ b/tests/components/tuya/snapshots/test_init.ambr @@ -20,7 +20,7 @@ 'labels': set({ }), 'manufacturer': 'Tuya', - 'model': 'LCDÕ▒ŵ©®µ╣┐Õ║ªõ©çÞâ¢ÚüѵĺÕÖ¿ (unsupported)', + 'model': 'LCDÕ▒ŵ©®µ╣┐Õ║ªõ©çÞâ¢ÚüѵĺÕÖ¿', 'model_id': 'ay30hrndaogxclh0', 'name': 'LCDÕ▒ŵ©®µ╣┐Õ║ªõ©çÞâ¢ÚüѵĺÕÖ¿', 'name_by_user': None, @@ -80,7 +80,7 @@ 'labels': set({ }), 'manufacturer': 'Tuya', - 'model': 'TV (unsupported)', + 'model': 'TV', 'model_id': '47pew0', 'name': 'TV', 'name_by_user': None, @@ -140,7 +140,7 @@ 'labels': set({ }), 'manufacturer': 'Tuya', - 'model': 'SORIA (unsupported)', + 'model': 'SORIA', 'model_id': '5l1ht8jygsyr1wn1', 'name': 'Panneaux solaires 2', 'name_by_user': None, @@ -770,7 +770,7 @@ 'labels': set({ }), 'manufacturer': 'Tuya', - 'model': 'Gateway (unsupported)', + 'model': 'Gateway', 'model_id': 'v7owd9tzcaninc36', 'name': 'Gateway2', 'name_by_user': None, @@ -830,7 +830,7 @@ 'labels': set({ }), 'manufacturer': 'Tuya', - 'model': 'Smart IR (unsupported)', + 'model': 'Smart IR', 'model_id': 'rqhxdyusjrwxyff6', 'name': 'Smart IR', 'name_by_user': None, @@ -890,7 +890,7 @@ 'labels': set({ }), 'manufacturer': 'Tuya', - 'model': 'S1-TY-BLE-PRO (unsupported)', + 'model': 'S1-TY-BLE-PRO', 'model_id': 'xqeob8h6', 'name': 'S1-TY-BLE-PRO 2', 'name_by_user': None, @@ -1610,7 +1610,7 @@ 'labels': set({ }), 'manufacturer': 'Tuya', - 'model': 'Curtain switch (unsupported)', + 'model': 'Curtain switch', 'model_id': 'TtXKwTMwiPpURWLJ', 'name': 'Dining-Blinds', 'name_by_user': None, @@ -2210,7 +2210,7 @@ 'labels': set({ }), 'manufacturer': 'Tuya', - 'model': 'T & H Sensor (unsupported)', + 'model': 'T & H Sensor', 'model_id': 'x3o8epevyeo3z3oa', 'name': 'Interior Bedroom Sensor', 'name_by_user': None, @@ -2420,7 +2420,7 @@ 'labels': set({ }), 'manufacturer': 'Tuya', - 'model': 'Curtain switch (unsupported)', + 'model': 'Curtain switch', 'model_id': 'uoa3mayicscacseb', 'name': 'Living room left', 'name_by_user': None, @@ -2630,7 +2630,7 @@ 'labels': set({ }), 'manufacturer': 'Tuya', - 'model': 'Double Digital Meter (unsupported)', + 'model': 'Double Digital Meter', 'model_id': '79a7z01v3n35kytb', 'name': 'Double Digital Meter', 'name_by_user': None, @@ -2720,7 +2720,7 @@ 'labels': set({ }), 'manufacturer': 'Tuya', - 'model': 'Tower bladeless fan (unsupported)', + 'model': 'Tower bladeless fan ', 'model_id': 'ibytpo6fpnugft1c', 'name': 'Ventilador Cama', 'name_by_user': None, @@ -2780,7 +2780,7 @@ 'labels': set({ }), 'manufacturer': 'Tuya', - 'model': 'QNECT WI-FI PIR SENSOR (unsupported)', + 'model': 'QNECT WI-FI PIR SENSOR', 'model_id': 'j5jgnjvdaczeb6dc', 'name': 'QNECT WI-FI PIR SENSOR', 'name_by_user': None, @@ -3230,7 +3230,7 @@ 'labels': set({ }), 'manufacturer': 'Tuya', - 'model': 'ISV-100W2.0 (unsupported)', + 'model': 'ISV-100W2.0', 'model_id': 'jlapoy5liocmtdvd', 'name': 'ISV-100W2.0', 'name_by_user': None, @@ -3260,7 +3260,7 @@ 'labels': set({ }), 'manufacturer': 'Tuya', - 'model': 'DOLCECLIMA 10 HP WIFI (unsupported)', + 'model': 'DOLCECLIMA 10 HP WIFI', 'model_id': 'jevroj5aguwdbs2e', 'name': 'DOLCECLIMA 10 HP WIFI', 'name_by_user': None, @@ -3290,7 +3290,7 @@ 'labels': set({ }), 'manufacturer': 'Tuya', - 'model': 'VITAL+ (unsupported)', + 'model': 'VITAL+', 'model_id': 'urzivdhumrwfakie', 'name': 'VITAL+', 'name_by_user': None, @@ -3320,7 +3320,7 @@ 'labels': set({ }), 'manufacturer': 'Tuya', - 'model': 'Air Conditioning (unsupported)', + 'model': 'Air Conditioning', 'model_id': 'qzktzhehinzsz2je', 'name': 'Air', 'name_by_user': None, @@ -3380,7 +3380,7 @@ 'labels': set({ }), 'manufacturer': 'Tuya', - 'model': 'Contact Sensor (unsupported)', + 'model': 'Contact Sensor', 'model_id': 'p6sqiuesvhmhvv4f', 'name': 'Entrance Door', 'name_by_user': None, @@ -3590,7 +3590,7 @@ 'labels': set({ }), 'manufacturer': 'Tuya', - 'model': 'Smart IR+RF Remote Control (unsupported)', + 'model': 'Smart IR+RF Remote Control', 'model_id': 'x0lyfgjuguuh1vof', 'name': 'Smart IR+RF Remote Control', 'name_by_user': None, @@ -3890,7 +3890,7 @@ 'labels': set({ }), 'manufacturer': 'Tuya', - 'model': 'Smart IR (unsupported)', + 'model': 'Smart IR ', 'model_id': 'kzwdw5bpxlbs9h9g', 'name': 'IR Minero', 'name_by_user': None, @@ -4550,7 +4550,7 @@ 'labels': set({ }), 'manufacturer': 'Tuya', - 'model': 'Smart IR (unsupported)', + 'model': 'Smart IR', 'model_id': 'om518smspsaltzdi', 'name': 'Smart IR Theater', 'name_by_user': None, @@ -5150,7 +5150,7 @@ 'labels': set({ }), 'manufacturer': 'Tuya', - 'model': 'ZigBee Gateway (unsupported)', + 'model': 'ZigBee Gateway', 'model_id': 'b25mh8sxawsgndck', 'name': 'ZigBee Gateway', 'name_by_user': None, @@ -5360,7 +5360,7 @@ 'labels': set({ }), 'manufacturer': 'Tuya', - 'model': 'Smart IR (unsupported)', + 'model': 'Smart IR', 'model_id': 'npbbca46yiug8ysk', 'name': 'Bedroom IR', 'name_by_user': None, @@ -5390,7 +5390,7 @@ 'labels': set({ }), 'manufacturer': 'Tuya', - 'model': '水泵 (unsupported)', + 'model': '水泵', 'model_id': 'l6ax0u6jwbz82atk', 'name': 'Pond', 'name_by_user': None, @@ -5600,7 +5600,7 @@ 'labels': set({ }), 'manufacturer': 'Tuya', - 'model': 'Double Digital Meter (unsupported)', + 'model': 'Double Digital Meter', 'model_id': 'dhto3y4uachr1wll', 'name': 'Meter', 'name_by_user': None, @@ -5750,7 +5750,7 @@ 'labels': set({ }), 'manufacturer': 'Tuya', - 'model': 'INTELAR IR288 (unsupported)', + 'model': 'INTELAR IR288', 'model_id': '5vlawhjm', 'name': 'INTELAR IR288', 'name_by_user': None, @@ -6170,7 +6170,7 @@ 'labels': set({ }), 'manufacturer': 'Tuya', - 'model': 'Zigbee Gateway (unsupported)', + 'model': 'Zigbee Gateway', 'model_id': 'plp0gnfcacdeqk5o', 'name': 'Zigbee Gateway', 'name_by_user': None, @@ -6530,7 +6530,7 @@ 'labels': set({ }), 'manufacturer': 'Tuya', - 'model': 'TV Sync Backlights (unsupported)', + 'model': 'TV Sync Backlights', 'model_id': 'gaobbrxqiblcng2p', 'name': 'TV Sync Backlights', 'name_by_user': None, @@ -6560,7 +6560,7 @@ 'labels': set({ }), 'manufacturer': 'Tuya', - 'model': 'PC321-W-TY(Bi-Directional) (unsupported)', + 'model': 'PC321-W-TY(Bi-Directional)', 'model_id': 'gqmmtjclqb7reg5p', 'name': 'Wi-Fi Meter(Bi-Directional)', 'name_by_user': None, @@ -6950,7 +6950,7 @@ 'labels': set({ }), 'manufacturer': 'Tuya', - 'model': 'Genio Nebula & Blue Star Projector (unsupported)', + 'model': 'Genio Nebula & Blue Star Projector', 'model_id': '3djw12ln4xtvv8eq', 'name': 'Genio Nebula & Blue Star Projector', 'name_by_user': None, @@ -7340,7 +7340,7 @@ 'labels': set({ }), 'manufacturer': 'Tuya', - 'model': 'Zigbee Smart Gateway (unsupported)', + 'model': 'Zigbee Smart Gateway', 'model_id': 'lieerjyy6l4ykjor', 'name': 'Zigbee Gateway', 'name_by_user': None, @@ -7820,7 +7820,7 @@ 'labels': set({ }), 'manufacturer': 'Tuya', - 'model': 'Gateway (unsupported)', + 'model': 'Gateway', 'model_id': 'tmwhss6ntjfc7prs', 'name': 'Gateway', 'name_by_user': None, @@ -7970,7 +7970,7 @@ 'labels': set({ }), 'manufacturer': 'Tuya', - 'model': 'Air Conditioner (unsupported)', + 'model': 'Air Conditioner', 'model_id': '47peys', 'name': 'Ar', 'name_by_user': None, @@ -8030,7 +8030,7 @@ 'labels': set({ }), 'manufacturer': 'Tuya', - 'model': 'TION Breezer Bio X (unsupported)', + 'model': 'TION Breezer Bio X', 'model_id': '9mqdhwklpvnnvb7t', 'name': 'Бризер Зал', 'name_by_user': None, @@ -8240,7 +8240,7 @@ 'labels': set({ }), 'manufacturer': 'Tuya', - 'model': 'GIEX Watering Timer (unsupported)', + 'model': 'GIEX Watering Timer', 'model_id': '7ytb3h8u', 'name': 'GIEX Watering Timer', 'name_by_user': None, @@ -8300,7 +8300,7 @@ 'labels': set({ }), 'manufacturer': 'Tuya', - 'model': 'Siren (unsupported)', + 'model': 'Siren', 'model_id': 'DYgId0sz6zWlmmYu', 'name': 'Siren', 'name_by_user': None, @@ -8690,7 +8690,7 @@ 'labels': set({ }), 'manufacturer': 'Tuya', - 'model': 'Zigbee Repeater (unsupported)', + 'model': 'Zigbee Repeater', 'model_id': 'nkkl7uzv', 'name': 'Zigby répéteur ', 'name_by_user': None, @@ -8810,7 +8810,7 @@ 'labels': set({ }), 'manufacturer': 'Tuya', - 'model': 'InverFlow (unsupported)', + 'model': 'InverFlow', 'model_id': 'ircs2n82vgrozoew', 'name': 'InverFlow', 'name_by_user': None, @@ -9620,7 +9620,7 @@ 'labels': set({ }), 'manufacturer': 'Tuya', - 'model': 'TV (unsupported)', + 'model': 'TV', 'model_id': 'lplun31mo1xaonwz', 'name': 'TV', 'name_by_user': None, @@ -9650,7 +9650,7 @@ 'labels': set({ }), 'manufacturer': 'Tuya', - 'model': 'REGISTER BOOSTER FAN (unsupported)', + 'model': 'REGISTER BOOSTER FAN ', 'model_id': 'pjabraecffsfrmxz', 'name': 'Register booster fan', 'name_by_user': None, diff --git a/tests/components/tuya/test_init.py b/tests/components/tuya/test_init.py index 4faa90146434..91425c85ab60 100644 --- a/tests/components/tuya/test_init.py +++ b/tests/components/tuya/test_init.py @@ -117,7 +117,6 @@ async def test_device_registry( mock_config_entry: MockConfigEntry, mock_devices: list[CustomerDevice], device_registry: dr.DeviceRegistry, - entity_registry: er.EntityRegistry, snapshot: SnapshotAssertion, ) -> None: """Validate device registry snapshots for all devices.""" @@ -136,31 +135,20 @@ async def test_device_registry( name=list(device_registry_entry.identifiers)[0][1] ) - # Ensure model is suffixed with "(unsupported)" when no entities are generated - assert (" (unsupported)" in device_registry_entry.model) == ( - not er.async_entries_for_device( - entity_registry, - device_registry_entry.id, - include_disabled_entities=True, - ) - ) - @pytest.mark.parametrize( ("mock_device_code", "platforms", "manufacturer", "model", "model_id", "quirks"), [ - # Ensure model is suffixed with "(unsupported)" when no entities - # are generated + # Device information is registered even when no entities are generated ( "mal_gyitctrjj1kefxp2", [], "Tuya", - "Multifunction alarm (unsupported)", + "Multifunction alarm", "gyitctrjj1kefxp2", {}, ), - # Ensure model is not suffixed with "(unsupported)" when entities - # are generated + # Creating entities does not alter the registered device information ( "mal_gyitctrjj1kefxp2", [Platform.ALARM_CONTROL_PANEL], @@ -170,8 +158,7 @@ async def test_device_registry( {}, ), # With a quirk that has manufacturer, model and model_id are - # taken from quirk (and not suffixed with "(unsupported)" even if - # no entities are generated) + # taken from quirk ( "mal_gyitctrjj1kefxp2", [], @@ -208,7 +195,7 @@ async def test_device_registry( "mal_gyitctrjj1kefxp2", [], "Tuya", - "Multifunction alarm (unsupported)", + "Multifunction alarm", "gyitctrjj1kefxp2", { "gyitctrjj1kefxp2": MagicMock(