From e90be52dfbaddd9960ef7304019ef643d829d8fa Mon Sep 17 00:00:00 2001 From: Jason Rumney Date: Sat, 29 Jul 2023 23:46:27 +0900 Subject: [PATCH] Breaking change: Use device class in unique id if entity has no name. Issue #871. To make use of Home Assistant provided translations, it would be good to remove as many names from entities as possible. To distinguish between multiple entities of the same type without names, we need to use something other than the name in the identifier. This will break existing configs, so a migration will need to be written if possible to transfer entities to their new id. --- custom_components/tuya_local/helpers/device_config.py | 2 +- tests/devices/test_avatto_blinds.py | 2 +- tests/devices/test_avatto_curtain_switch.py | 2 +- tests/devices/test_digoo_dgsp01_dual_nightlight_switch.py | 2 +- tests/devices/test_eanons_humidifier.py | 2 +- tests/devices/test_garage_door_opener.py | 2 +- tests/devices/test_kogan_garage_door_opener.py | 2 +- tests/devices/test_m027_curtain.py | 2 +- tests/devices/test_moes_rgb_socket.py | 2 +- tests/devices/test_pc321ty_energy_meter.py | 2 +- tests/devices/test_qs_c01_curtain.py | 2 +- tests/devices/test_sd123_hpr01_presence.py | 2 +- tests/devices/test_simple_blinds.py | 2 +- tests/devices/test_simple_switch_with_timer.py | 2 +- tests/devices/test_simple_switch_with_timerv2.py | 2 +- tests/devices/test_smartplug_encoded.py | 2 +- tests/devices/test_smartplugv1.py | 2 +- tests/devices/test_smartplugv2.py | 2 +- tests/devices/test_smartplugv2_energy.py | 4 ++-- tests/devices/test_wetair_wawh1210lw_humidifier.py | 2 +- tests/devices/test_wilfa_haze_hu400bc_humidifier.py | 2 +- tests/test_cover.py | 2 +- tests/test_humidifier.py | 5 ++++- tests/test_switch.py | 2 +- 24 files changed, 28 insertions(+), 25 deletions(-) diff --git a/custom_components/tuya_local/helpers/device_config.py b/custom_components/tuya_local/helpers/device_config.py index c59589aac8..abf14102a1 100644 --- a/custom_components/tuya_local/helpers/device_config.py +++ b/custom_components/tuya_local/helpers/device_config.py @@ -265,7 +265,7 @@ def entity(self): @property def config_id(self): """The identifier for this entity in the config.""" - own_name = self.name + own_name = self._config.get("name", self.device_class) if own_name: return f"{self.entity}_{slugify(own_name)}" diff --git a/tests/devices/test_avatto_blinds.py b/tests/devices/test_avatto_blinds.py index d32f21eec0..58837271a7 100644 --- a/tests/devices/test_avatto_blinds.py +++ b/tests/devices/test_avatto_blinds.py @@ -24,7 +24,7 @@ class TestAvattoBlinds(MultiSensorTests, BasicSelectTests, TuyaDeviceTestCase): def setUp(self): self.setUpForConfig("avatto_roller_blinds.yaml", AVATTO_BLINDS_PAYLOAD) - self.subject = self.entities["cover"] + self.subject = self.entities["cover_blind"] self.setUpMultiSensors( [ { diff --git a/tests/devices/test_avatto_curtain_switch.py b/tests/devices/test_avatto_curtain_switch.py index 09fcb53827..f036538197 100644 --- a/tests/devices/test_avatto_curtain_switch.py +++ b/tests/devices/test_avatto_curtain_switch.py @@ -18,7 +18,7 @@ def setUp(self): "avatto_curtain_switch.yaml", AVATTO_CURTAIN_PAYLOAD, ) - self.subject = self.entities.get("cover") + self.subject = self.entities.get("cover_curtain") self.setUpBasicLight( BACKLIGHT_DP, self.entities.get("light_backlight"), diff --git a/tests/devices/test_digoo_dgsp01_dual_nightlight_switch.py b/tests/devices/test_digoo_dgsp01_dual_nightlight_switch.py index b8e08b6a60..1f122a0e72 100644 --- a/tests/devices/test_digoo_dgsp01_dual_nightlight_switch.py +++ b/tests/devices/test_digoo_dgsp01_dual_nightlight_switch.py @@ -27,7 +27,7 @@ def setUp(self): "digoo_dgsp01_dual_nightlight_switch.yaml", DIGOO_DGSP01_SOCKET_PAYLOAD, ) - self.subject = self.entities.get("switch") + self.subject = self.entities.get("switch_outlet") self.light = self.entities.get("light_night_light") self.setUpBasicSwitch( diff --git a/tests/devices/test_eanons_humidifier.py b/tests/devices/test_eanons_humidifier.py index 638fe2a688..78de9e03de 100644 --- a/tests/devices/test_eanons_humidifier.py +++ b/tests/devices/test_eanons_humidifier.py @@ -35,7 +35,7 @@ class TestEanonsHumidifier( def setUp(self): self.setUpForConfig("eanons_humidifier.yaml", EANONS_HUMIDIFIER_PAYLOAD) - self.subject = self.entities.get("humidifier") + self.subject = self.entities.get("humidifier_humidifier") self.setUpSwitchable(HVACMODE_DPS, self.subject) self.fan = self.entities.get("fan_intensity") self.setUpBasicSwitch(SWITCH_DPS, self.entities.get("switch_uv_sterilization")) diff --git a/tests/devices/test_garage_door_opener.py b/tests/devices/test_garage_door_opener.py index 217076cd77..967bbab563 100644 --- a/tests/devices/test_garage_door_opener.py +++ b/tests/devices/test_garage_door_opener.py @@ -14,7 +14,7 @@ class TestSimpleGarageOpener(TuyaDeviceTestCase): def setUp(self): self.setUpForConfig("garage_door_opener.yaml", SIMPLE_GARAGE_DOOR_PAYLOAD) - self.subject = self.entities["cover"] + self.subject = self.entities["cover_garage"] def test_device_class_is_garage(self): self.assertEqual(self.subject.device_class, CoverDeviceClass.GARAGE) diff --git a/tests/devices/test_kogan_garage_door_opener.py b/tests/devices/test_kogan_garage_door_opener.py index 07292021f5..422e220098 100644 --- a/tests/devices/test_kogan_garage_door_opener.py +++ b/tests/devices/test_kogan_garage_door_opener.py @@ -24,7 +24,7 @@ class TestKoganGarageOpener( def setUp(self): self.setUpForConfig("kogan_garage_opener.yaml", KOGAN_GARAGE_DOOR_PAYLOAD) - self.subject = self.entities["cover"] + self.subject = self.entities["cover_garage"] self.setUpBasicBinarySensor( LEFTOPEN_DPS, self.entities.get("binary_sensor_door_open"), diff --git a/tests/devices/test_m027_curtain.py b/tests/devices/test_m027_curtain.py index a3f90d271e..a275a16774 100644 --- a/tests/devices/test_m027_curtain.py +++ b/tests/devices/test_m027_curtain.py @@ -24,7 +24,7 @@ class TestM027Curtains(MultiSensorTests, BasicSelectTests, TuyaDeviceTestCase): def setUp(self): self.setUpForConfig("m027_curtain.yaml", M027_CURTAIN_PAYLOAD) - self.subject = self.entities["cover"] + self.subject = self.entities["cover_curtain"] self.setUpMultiSensors( [ { diff --git a/tests/devices/test_moes_rgb_socket.py b/tests/devices/test_moes_rgb_socket.py index 9aba2cd6ea..742d1fee4c 100644 --- a/tests/devices/test_moes_rgb_socket.py +++ b/tests/devices/test_moes_rgb_socket.py @@ -47,7 +47,7 @@ def setUp(self): self.setUpBasicSwitch( SWITCH_DPS, - self.entities.get("switch"), + self.entities.get("switch_outlet"), device_class=SwitchDeviceClass.OUTLET, power_dps=POWER_DPS, power_scale=10, diff --git a/tests/devices/test_pc321ty_energy_meter.py b/tests/devices/test_pc321ty_energy_meter.py index f66a7f9c95..bead314e7e 100644 --- a/tests/devices/test_pc321ty_energy_meter.py +++ b/tests/devices/test_pc321ty_energy_meter.py @@ -51,7 +51,7 @@ def setUp(self): [ { "dps": TOTALENERGY_DP, - "name": "sensor", + "name": "sensor_energy", "unit": UnitOfEnergy.KILO_WATT_HOUR, "device_class": SensorDeviceClass.ENERGY, "state_class": STATE_CLASS_TOTAL_INCREASING, diff --git a/tests/devices/test_qs_c01_curtain.py b/tests/devices/test_qs_c01_curtain.py index ef6fcbac05..dfebda5dd6 100644 --- a/tests/devices/test_qs_c01_curtain.py +++ b/tests/devices/test_qs_c01_curtain.py @@ -19,7 +19,7 @@ class TestQSC01Curtains(BasicNumberTests, BasicSelectTests, TuyaDeviceTestCase): def setUp(self): self.setUpForConfig("qs_c01_curtain.yaml", QS_C01_CURTAIN_PAYLOAD) - self.subject = self.entities["cover"] + self.subject = self.entities["cover_curtain"] self.setUpBasicNumber( TRAVELTIME_DPS, self.entities.get("number_travel_time"), diff --git a/tests/devices/test_sd123_hpr01_presence.py b/tests/devices/test_sd123_hpr01_presence.py index a3cd465c07..42ddb47cf1 100644 --- a/tests/devices/test_sd123_hpr01_presence.py +++ b/tests/devices/test_sd123_hpr01_presence.py @@ -40,7 +40,7 @@ def setUp(self): self.setUpForConfig("sd123_hpr01_presence.yaml", SD123_PRESENCE_PAYLOAD) self.setUpBasicBinarySensor( PRESENCE_DPS, - self.entities.get("binary_sensor"), + self.entities.get("binary_sensor_occupancy"), device_class=BinarySensorDeviceClass.OCCUPANCY, testdata=("presence", "none"), ) diff --git a/tests/devices/test_simple_blinds.py b/tests/devices/test_simple_blinds.py index a8ca8e3351..a2a41457f0 100644 --- a/tests/devices/test_simple_blinds.py +++ b/tests/devices/test_simple_blinds.py @@ -16,7 +16,7 @@ class TestSimpleBlinds(TuyaDeviceTestCase): def setUp(self): self.setUpForConfig("simple_blinds.yaml", SIMPLE_BLINDS_PAYLOAD) - self.subject = self.entities["cover"] + self.subject = self.entities["cover_blind"] def test_device_class_is_blind(self): self.assertEqual(self.subject.device_class, CoverDeviceClass.BLIND) diff --git a/tests/devices/test_simple_switch_with_timer.py b/tests/devices/test_simple_switch_with_timer.py index f613d4c977..b57e9257b7 100644 --- a/tests/devices/test_simple_switch_with_timer.py +++ b/tests/devices/test_simple_switch_with_timer.py @@ -16,7 +16,7 @@ class TestTimedSwitch(BasicNumberTests, SwitchableTests, TuyaDeviceTestCase): def setUp(self): self.setUpForConfig("simple_switch_timer.yaml", TIMED_SOCKET_PAYLOAD) - self.subject = self.entities.get("switch") + self.subject = self.entities.get("switch_outlet") self.setUpSwitchable(SWITCH_DPS, self.subject) self.setUpBasicNumber( TIMER_DPS, diff --git a/tests/devices/test_simple_switch_with_timerv2.py b/tests/devices/test_simple_switch_with_timerv2.py index d3cfab71fd..8638849cea 100644 --- a/tests/devices/test_simple_switch_with_timerv2.py +++ b/tests/devices/test_simple_switch_with_timerv2.py @@ -16,7 +16,7 @@ class TestTimedSwitch(BasicNumberTests, SwitchableTests, TuyaDeviceTestCase): def setUp(self): self.setUpForConfig("simple_switch_timerv2.yaml", TIMED_SOCKETV2_PAYLOAD) - self.subject = self.entities.get("switch") + self.subject = self.entities.get("switch_outlet") self.setUpSwitchable(SWITCH_DPS, self.subject) self.setUpBasicNumber( TIMER_DPS, diff --git a/tests/devices/test_smartplug_encoded.py b/tests/devices/test_smartplug_encoded.py index 99b98da268..6c55d7be98 100644 --- a/tests/devices/test_smartplug_encoded.py +++ b/tests/devices/test_smartplug_encoded.py @@ -19,7 +19,7 @@ class TestSwitchEncoded(BasicNumberTests, SwitchableTests, TuyaDeviceTestCase): def setUp(self): self.setUpForConfig("smartplug_encoded.yaml", SMARTPLUG_ENCODED_PAYLOAD) - self.subject = self.entities.get("switch") + self.subject = self.entities.get("switch_outlet") self.setUpSwitchable(SWITCH_DPS, self.subject) self.setUpBasicNumber( TIMER_DPS, diff --git a/tests/devices/test_smartplugv1.py b/tests/devices/test_smartplugv1.py index 923377829e..79c3e6427d 100644 --- a/tests/devices/test_smartplugv1.py +++ b/tests/devices/test_smartplugv1.py @@ -35,7 +35,7 @@ class TestKoganSwitch( def setUp(self): self.setUpForConfig("smartplugv1.yaml", KOGAN_SOCKET_PAYLOAD) - self.subject = self.entities.get("switch") + self.subject = self.entities.get("switch_outlet") self.setUpSwitchable(SWITCH_DPS, self.subject) self.setUpBasicBinarySensor( OVERCURRENT_DPS, diff --git a/tests/devices/test_smartplugv2.py b/tests/devices/test_smartplugv2.py index 3d57895701..556230801d 100644 --- a/tests/devices/test_smartplugv2.py +++ b/tests/devices/test_smartplugv2.py @@ -28,7 +28,7 @@ class TestSwitchV2( def setUp(self): self.setUpForConfig("smartplugv2.yaml", KOGAN_SOCKET_PAYLOAD2) - self.subject = self.entities.get("switch") + self.subject = self.entities.get("switch_outlet") self.setUpSwitchable(SWITCH_DPS, self.subject) self.setUpBasicNumber( TIMER_DPS, diff --git a/tests/devices/test_smartplugv2_energy.py b/tests/devices/test_smartplugv2_energy.py index bf98970b27..b557c3dbf5 100644 --- a/tests/devices/test_smartplugv2_energy.py +++ b/tests/devices/test_smartplugv2_energy.py @@ -51,7 +51,7 @@ def setUp(self): self.setUpMultiSwitch( [ { - "name": "switch", + "name": "switch_outlet", "dps": SWITCH_DPS, "device_class": SwitchDeviceClass.OUTLET, }, @@ -135,7 +135,7 @@ def test_multi_switch_state_attributes(self): self.dps[RANDOM_DPS] = "3C4D" self.assertDictEqual( - self.multiSwitch["switch"].extra_state_attributes, + self.multiSwitch["switch_outlet"].extra_state_attributes, { "test_bit": 21, "fault_code": 26, diff --git a/tests/devices/test_wetair_wawh1210lw_humidifier.py b/tests/devices/test_wetair_wawh1210lw_humidifier.py index 5362c6dab2..590a6196ff 100644 --- a/tests/devices/test_wetair_wawh1210lw_humidifier.py +++ b/tests/devices/test_wetair_wawh1210lw_humidifier.py @@ -42,7 +42,7 @@ def setUp(self): self.setUpForConfig( "wetair_wawh1210lw_humidifier.yaml", WETAIR_WAWH1210_HUMIDIFIER_PAYLOAD ) - self.subject = self.entities.get("humidifier") + self.subject = self.entities.get("humidifier_humidifier") self.setUpSwitchable(SWITCH_DPS, self.subject) self.setUpBasicLight(LIGHT_DPS, self.entities.get("light_display")) self.setUpBasicLock(LOCK_DPS, self.entities.get("lock_child_lock")) diff --git a/tests/devices/test_wilfa_haze_hu400bc_humidifier.py b/tests/devices/test_wilfa_haze_hu400bc_humidifier.py index e1bf0421b8..8899f96aa8 100644 --- a/tests/devices/test_wilfa_haze_hu400bc_humidifier.py +++ b/tests/devices/test_wilfa_haze_hu400bc_humidifier.py @@ -45,7 +45,7 @@ def setUp(self): self.setUpForConfig( "wilfa_haze_hu400bc_humidifier.yaml", WILFA_HAZE_HUMIDIFIER_PAYLOAD ) - self.subject = self.entities.get("humidifier") + self.subject = self.entities.get("humidifier_humidifier") self.fan = self.entities.get("fan") self.setUpSwitchable(SWITCH_DPS, self.subject) self.setUpBasicBinarySensor( diff --git a/tests/test_cover.py b/tests/test_cover.py index 675a8f1581..acd7af0fac 100644 --- a/tests/test_cover.py +++ b/tests/test_cover.py @@ -33,7 +33,7 @@ async def test_init_entry(hass): }, } await async_setup_entry(hass, entry, m_add_entities) - assert type(hass.data[DOMAIN]["dummy"]["cover"]) == TuyaLocalCover + assert type(hass.data[DOMAIN]["dummy"]["cover_garage"]) == TuyaLocalCover m_add_entities.assert_called_once() diff --git a/tests/test_humidifier.py b/tests/test_humidifier.py index e2601c361f..c916588e31 100644 --- a/tests/test_humidifier.py +++ b/tests/test_humidifier.py @@ -38,7 +38,10 @@ async def test_init_entry(hass): hass.data[DOMAIN]["dummy"]["device"] = m_device await async_setup_entry(hass, entry, m_add_entities) - assert type(hass.data[DOMAIN]["dummy"]["humidifier"]) == TuyaLocalHumidifier + assert ( + type(hass.data[DOMAIN]["dummy"]["humidifier_dehumidifier"]) + == TuyaLocalHumidifier + ) m_add_entities.assert_called_once() diff --git a/tests/test_switch.py b/tests/test_switch.py index 0fda0c2ee7..ed03d7bf7d 100644 --- a/tests/test_switch.py +++ b/tests/test_switch.py @@ -35,7 +35,7 @@ async def test_init_entry(hass): hass.data[DOMAIN]["dummy"]["device"] = m_device await async_setup_entry(hass, entry, m_add_entities) - assert type(hass.data[DOMAIN]["dummy"]["switch"]) == TuyaLocalSwitch + assert type(hass.data[DOMAIN]["dummy"]["switch_outlet"]) == TuyaLocalSwitch m_add_entities.assert_called_once()