Pārlūkot izejas kodu

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.
Jason Rumney 2 gadi atpakaļ
vecāks
revīzija
e90be52dfb

+ 1 - 1
custom_components/tuya_local/helpers/device_config.py

@@ -265,7 +265,7 @@ class TuyaEntityConfig:
     @property
     @property
     def config_id(self):
     def config_id(self):
         """The identifier for this entity in the config."""
         """The identifier for this entity in the config."""
-        own_name = self.name
+        own_name = self._config.get("name", self.device_class)
         if own_name:
         if own_name:
             return f"{self.entity}_{slugify(own_name)}"
             return f"{self.entity}_{slugify(own_name)}"
 
 

+ 1 - 1
tests/devices/test_avatto_blinds.py

@@ -24,7 +24,7 @@ class TestAvattoBlinds(MultiSensorTests, BasicSelectTests, TuyaDeviceTestCase):
 
 
     def setUp(self):
     def setUp(self):
         self.setUpForConfig("avatto_roller_blinds.yaml", AVATTO_BLINDS_PAYLOAD)
         self.setUpForConfig("avatto_roller_blinds.yaml", AVATTO_BLINDS_PAYLOAD)
-        self.subject = self.entities["cover"]
+        self.subject = self.entities["cover_blind"]
         self.setUpMultiSensors(
         self.setUpMultiSensors(
             [
             [
                 {
                 {

+ 1 - 1
tests/devices/test_avatto_curtain_switch.py

@@ -18,7 +18,7 @@ class TestAvattoCurtainSwitch(BasicLightTests, TuyaDeviceTestCase):
             "avatto_curtain_switch.yaml",
             "avatto_curtain_switch.yaml",
             AVATTO_CURTAIN_PAYLOAD,
             AVATTO_CURTAIN_PAYLOAD,
         )
         )
-        self.subject = self.entities.get("cover")
+        self.subject = self.entities.get("cover_curtain")
         self.setUpBasicLight(
         self.setUpBasicLight(
             BACKLIGHT_DP,
             BACKLIGHT_DP,
             self.entities.get("light_backlight"),
             self.entities.get("light_backlight"),

+ 1 - 1
tests/devices/test_digoo_dgsp01_dual_nightlight_switch.py

@@ -27,7 +27,7 @@ class TestDigooNightlightSwitch(BasicSwitchTests, TuyaDeviceTestCase):
             "digoo_dgsp01_dual_nightlight_switch.yaml",
             "digoo_dgsp01_dual_nightlight_switch.yaml",
             DIGOO_DGSP01_SOCKET_PAYLOAD,
             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.light = self.entities.get("light_night_light")
 
 
         self.setUpBasicSwitch(
         self.setUpBasicSwitch(

+ 1 - 1
tests/devices/test_eanons_humidifier.py

@@ -35,7 +35,7 @@ class TestEanonsHumidifier(
 
 
     def setUp(self):
     def setUp(self):
         self.setUpForConfig("eanons_humidifier.yaml", EANONS_HUMIDIFIER_PAYLOAD)
         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.setUpSwitchable(HVACMODE_DPS, self.subject)
         self.fan = self.entities.get("fan_intensity")
         self.fan = self.entities.get("fan_intensity")
         self.setUpBasicSwitch(SWITCH_DPS, self.entities.get("switch_uv_sterilization"))
         self.setUpBasicSwitch(SWITCH_DPS, self.entities.get("switch_uv_sterilization"))

+ 1 - 1
tests/devices/test_garage_door_opener.py

@@ -14,7 +14,7 @@ class TestSimpleGarageOpener(TuyaDeviceTestCase):
 
 
     def setUp(self):
     def setUp(self):
         self.setUpForConfig("garage_door_opener.yaml", SIMPLE_GARAGE_DOOR_PAYLOAD)
         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):
     def test_device_class_is_garage(self):
         self.assertEqual(self.subject.device_class, CoverDeviceClass.GARAGE)
         self.assertEqual(self.subject.device_class, CoverDeviceClass.GARAGE)

+ 1 - 1
tests/devices/test_kogan_garage_door_opener.py

@@ -24,7 +24,7 @@ class TestKoganGarageOpener(
 
 
     def setUp(self):
     def setUp(self):
         self.setUpForConfig("kogan_garage_opener.yaml", KOGAN_GARAGE_DOOR_PAYLOAD)
         self.setUpForConfig("kogan_garage_opener.yaml", KOGAN_GARAGE_DOOR_PAYLOAD)
-        self.subject = self.entities["cover"]
+        self.subject = self.entities["cover_garage"]
         self.setUpBasicBinarySensor(
         self.setUpBasicBinarySensor(
             LEFTOPEN_DPS,
             LEFTOPEN_DPS,
             self.entities.get("binary_sensor_door_open"),
             self.entities.get("binary_sensor_door_open"),

+ 1 - 1
tests/devices/test_m027_curtain.py

@@ -24,7 +24,7 @@ class TestM027Curtains(MultiSensorTests, BasicSelectTests, TuyaDeviceTestCase):
 
 
     def setUp(self):
     def setUp(self):
         self.setUpForConfig("m027_curtain.yaml", M027_CURTAIN_PAYLOAD)
         self.setUpForConfig("m027_curtain.yaml", M027_CURTAIN_PAYLOAD)
-        self.subject = self.entities["cover"]
+        self.subject = self.entities["cover_curtain"]
         self.setUpMultiSensors(
         self.setUpMultiSensors(
             [
             [
                 {
                 {

+ 1 - 1
tests/devices/test_moes_rgb_socket.py

@@ -47,7 +47,7 @@ class TestMoesRGBSocket(
 
 
         self.setUpBasicSwitch(
         self.setUpBasicSwitch(
             SWITCH_DPS,
             SWITCH_DPS,
-            self.entities.get("switch"),
+            self.entities.get("switch_outlet"),
             device_class=SwitchDeviceClass.OUTLET,
             device_class=SwitchDeviceClass.OUTLET,
             power_dps=POWER_DPS,
             power_dps=POWER_DPS,
             power_scale=10,
             power_scale=10,

+ 1 - 1
tests/devices/test_pc321ty_energy_meter.py

@@ -51,7 +51,7 @@ class TestPC321TYPowerClamp(MultiSensorTests, TuyaDeviceTestCase):
             [
             [
                 {
                 {
                     "dps": TOTALENERGY_DP,
                     "dps": TOTALENERGY_DP,
-                    "name": "sensor",
+                    "name": "sensor_energy",
                     "unit": UnitOfEnergy.KILO_WATT_HOUR,
                     "unit": UnitOfEnergy.KILO_WATT_HOUR,
                     "device_class": SensorDeviceClass.ENERGY,
                     "device_class": SensorDeviceClass.ENERGY,
                     "state_class": STATE_CLASS_TOTAL_INCREASING,
                     "state_class": STATE_CLASS_TOTAL_INCREASING,

+ 1 - 1
tests/devices/test_qs_c01_curtain.py

@@ -19,7 +19,7 @@ class TestQSC01Curtains(BasicNumberTests, BasicSelectTests, TuyaDeviceTestCase):
 
 
     def setUp(self):
     def setUp(self):
         self.setUpForConfig("qs_c01_curtain.yaml", QS_C01_CURTAIN_PAYLOAD)
         self.setUpForConfig("qs_c01_curtain.yaml", QS_C01_CURTAIN_PAYLOAD)
-        self.subject = self.entities["cover"]
+        self.subject = self.entities["cover_curtain"]
         self.setUpBasicNumber(
         self.setUpBasicNumber(
             TRAVELTIME_DPS,
             TRAVELTIME_DPS,
             self.entities.get("number_travel_time"),
             self.entities.get("number_travel_time"),

+ 1 - 1
tests/devices/test_sd123_hpr01_presence.py

@@ -40,7 +40,7 @@ class TestSD123HumanPresenceRadar(
         self.setUpForConfig("sd123_hpr01_presence.yaml", SD123_PRESENCE_PAYLOAD)
         self.setUpForConfig("sd123_hpr01_presence.yaml", SD123_PRESENCE_PAYLOAD)
         self.setUpBasicBinarySensor(
         self.setUpBasicBinarySensor(
             PRESENCE_DPS,
             PRESENCE_DPS,
-            self.entities.get("binary_sensor"),
+            self.entities.get("binary_sensor_occupancy"),
             device_class=BinarySensorDeviceClass.OCCUPANCY,
             device_class=BinarySensorDeviceClass.OCCUPANCY,
             testdata=("presence", "none"),
             testdata=("presence", "none"),
         )
         )

+ 1 - 1
tests/devices/test_simple_blinds.py

@@ -16,7 +16,7 @@ class TestSimpleBlinds(TuyaDeviceTestCase):
 
 
     def setUp(self):
     def setUp(self):
         self.setUpForConfig("simple_blinds.yaml", SIMPLE_BLINDS_PAYLOAD)
         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):
     def test_device_class_is_blind(self):
         self.assertEqual(self.subject.device_class, CoverDeviceClass.BLIND)
         self.assertEqual(self.subject.device_class, CoverDeviceClass.BLIND)

+ 1 - 1
tests/devices/test_simple_switch_with_timer.py

@@ -16,7 +16,7 @@ class TestTimedSwitch(BasicNumberTests, SwitchableTests, TuyaDeviceTestCase):
 
 
     def setUp(self):
     def setUp(self):
         self.setUpForConfig("simple_switch_timer.yaml", TIMED_SOCKET_PAYLOAD)
         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.setUpSwitchable(SWITCH_DPS, self.subject)
         self.setUpBasicNumber(
         self.setUpBasicNumber(
             TIMER_DPS,
             TIMER_DPS,

+ 1 - 1
tests/devices/test_simple_switch_with_timerv2.py

@@ -16,7 +16,7 @@ class TestTimedSwitch(BasicNumberTests, SwitchableTests, TuyaDeviceTestCase):
 
 
     def setUp(self):
     def setUp(self):
         self.setUpForConfig("simple_switch_timerv2.yaml", TIMED_SOCKETV2_PAYLOAD)
         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.setUpSwitchable(SWITCH_DPS, self.subject)
         self.setUpBasicNumber(
         self.setUpBasicNumber(
             TIMER_DPS,
             TIMER_DPS,

+ 1 - 1
tests/devices/test_smartplug_encoded.py

@@ -19,7 +19,7 @@ class TestSwitchEncoded(BasicNumberTests, SwitchableTests, TuyaDeviceTestCase):
 
 
     def setUp(self):
     def setUp(self):
         self.setUpForConfig("smartplug_encoded.yaml", SMARTPLUG_ENCODED_PAYLOAD)
         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.setUpSwitchable(SWITCH_DPS, self.subject)
         self.setUpBasicNumber(
         self.setUpBasicNumber(
             TIMER_DPS,
             TIMER_DPS,

+ 1 - 1
tests/devices/test_smartplugv1.py

@@ -35,7 +35,7 @@ class TestKoganSwitch(
 
 
     def setUp(self):
     def setUp(self):
         self.setUpForConfig("smartplugv1.yaml", KOGAN_SOCKET_PAYLOAD)
         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.setUpSwitchable(SWITCH_DPS, self.subject)
         self.setUpBasicBinarySensor(
         self.setUpBasicBinarySensor(
             OVERCURRENT_DPS,
             OVERCURRENT_DPS,

+ 1 - 1
tests/devices/test_smartplugv2.py

@@ -28,7 +28,7 @@ class TestSwitchV2(
 
 
     def setUp(self):
     def setUp(self):
         self.setUpForConfig("smartplugv2.yaml", KOGAN_SOCKET_PAYLOAD2)
         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.setUpSwitchable(SWITCH_DPS, self.subject)
         self.setUpBasicNumber(
         self.setUpBasicNumber(
             TIMER_DPS,
             TIMER_DPS,

+ 2 - 2
tests/devices/test_smartplugv2_energy.py

@@ -51,7 +51,7 @@ class TestSwitchV2Energy(
         self.setUpMultiSwitch(
         self.setUpMultiSwitch(
             [
             [
                 {
                 {
-                    "name": "switch",
+                    "name": "switch_outlet",
                     "dps": SWITCH_DPS,
                     "dps": SWITCH_DPS,
                     "device_class": SwitchDeviceClass.OUTLET,
                     "device_class": SwitchDeviceClass.OUTLET,
                 },
                 },
@@ -135,7 +135,7 @@ class TestSwitchV2Energy(
         self.dps[RANDOM_DPS] = "3C4D"
         self.dps[RANDOM_DPS] = "3C4D"
 
 
         self.assertDictEqual(
         self.assertDictEqual(
-            self.multiSwitch["switch"].extra_state_attributes,
+            self.multiSwitch["switch_outlet"].extra_state_attributes,
             {
             {
                 "test_bit": 21,
                 "test_bit": 21,
                 "fault_code": 26,
                 "fault_code": 26,

+ 1 - 1
tests/devices/test_wetair_wawh1210lw_humidifier.py

@@ -42,7 +42,7 @@ class TestWetairWAWH1210LWHumidifier(
         self.setUpForConfig(
         self.setUpForConfig(
             "wetair_wawh1210lw_humidifier.yaml", WETAIR_WAWH1210_HUMIDIFIER_PAYLOAD
             "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.setUpSwitchable(SWITCH_DPS, self.subject)
         self.setUpBasicLight(LIGHT_DPS, self.entities.get("light_display"))
         self.setUpBasicLight(LIGHT_DPS, self.entities.get("light_display"))
         self.setUpBasicLock(LOCK_DPS, self.entities.get("lock_child_lock"))
         self.setUpBasicLock(LOCK_DPS, self.entities.get("lock_child_lock"))

+ 1 - 1
tests/devices/test_wilfa_haze_hu400bc_humidifier.py

@@ -45,7 +45,7 @@ class TestWilfaHazeHumidifier(
         self.setUpForConfig(
         self.setUpForConfig(
             "wilfa_haze_hu400bc_humidifier.yaml", WILFA_HAZE_HUMIDIFIER_PAYLOAD
             "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.fan = self.entities.get("fan")
         self.setUpSwitchable(SWITCH_DPS, self.subject)
         self.setUpSwitchable(SWITCH_DPS, self.subject)
         self.setUpBasicBinarySensor(
         self.setUpBasicBinarySensor(

+ 1 - 1
tests/test_cover.py

@@ -33,7 +33,7 @@ async def test_init_entry(hass):
         },
         },
     }
     }
     await async_setup_entry(hass, entry, m_add_entities)
     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()
     m_add_entities.assert_called_once()
 
 
 
 

+ 4 - 1
tests/test_humidifier.py

@@ -38,7 +38,10 @@ async def test_init_entry(hass):
     hass.data[DOMAIN]["dummy"]["device"] = m_device
     hass.data[DOMAIN]["dummy"]["device"] = m_device
 
 
     await async_setup_entry(hass, entry, m_add_entities)
     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()
     m_add_entities.assert_called_once()
 
 
 
 

+ 1 - 1
tests/test_switch.py

@@ -35,7 +35,7 @@ async def test_init_entry(hass):
     hass.data[DOMAIN]["dummy"]["device"] = m_device
     hass.data[DOMAIN]["dummy"]["device"] = m_device
 
 
     await async_setup_entry(hass, entry, m_add_entities)
     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()
     m_add_entities.assert_called_once()