Procházet zdrojové kódy

Implement entity category test based on config.

Need to set which entities are expected to be secondary in the test setup.
diagnostic or config is still based on the type of entity, to detect config
errors.

Fixed a few typos and omissions in the configs.
Jason Rumney před 4 roky
rodič
revize
f464e6b13c
56 změnil soubory, kde provedl 255 přidání a 16 odebrání
  1. 1 0
      custom_components/tuya_local/devices/electriq_cd25pro_dehumidifier.yaml
  2. 1 0
      custom_components/tuya_local/devices/kogan_dehumidifier.yaml
  3. 1 1
      custom_components/tuya_local/devices/madimack_heatpump.yaml
  4. 0 1
      custom_components/tuya_local/devices/minco_mh1823d_thermostat.yaml
  5. 1 1
      custom_components/tuya_local/devices/smartplugv2_energy.yaml
  6. 29 10
      tests/devices/base_device_tests.py
  7. 1 0
      tests/devices/test_anko_fan.py
  8. 1 0
      tests/devices/test_arlec_fan.py
  9. 1 0
      tests/devices/test_aspen_adv200_fan.py
  10. 8 0
      tests/devices/test_awow_th213_thermostat.py
  11. 1 0
      tests/devices/test_beca_bac002_thermostat.py
  12. 2 0
      tests/devices/test_beca_bhp6000_thermostat.py
  13. 1 0
      tests/devices/test_beca_bht002_thermostat.py
  14. 1 0
      tests/devices/test_beca_bht6000_thermostat.py
  15. 1 0
      tests/devices/test_bwt_heatpump.py
  16. 1 0
      tests/devices/test_deta_fan.py
  17. 1 0
      tests/devices/test_eanons_humidifier.py
  18. 1 0
      tests/devices/test_eberg_qubo_q40hd_heatpump.py
  19. 1 0
      tests/devices/test_electriq_12wminv_heatpump.py
  20. 1 0
      tests/devices/test_electriq_cd12_dehumidifier.py
  21. 1 0
      tests/devices/test_electriq_cd20_dehumidifier.py
  22. 1 0
      tests/devices/test_electriq_cd25_dehumidifier.py
  23. 1 0
      tests/devices/test_eurom_600_heater.py
  24. 1 0
      tests/devices/test_eurom_601_heater.py
  25. 1 0
      tests/devices/test_gardenpac_heatpump.py
  26. 9 0
      tests/devices/test_goldair_dehumidifier.py
  27. 1 0
      tests/devices/test_goldair_fan.py
  28. 7 0
      tests/devices/test_goldair_geco_heater.py
  29. 3 0
      tests/devices/test_goldair_gpcv_heater.py
  30. 14 1
      tests/devices/test_goldair_gpph_heater.py
  31. 28 0
      tests/devices/test_grid_connect_double_power_point.py
  32. 13 0
      tests/devices/test_inkbird_itc306a_thermostat.py
  33. 1 0
      tests/devices/test_kogan_dehumidifier.py
  34. 1 0
      tests/devices/test_kogan_kahtp_heater.py
  35. 1 0
      tests/devices/test_kogan_kawfhtp_heater.py
  36. 8 0
      tests/devices/test_lexy_f501_fan.py
  37. 13 1
      tests/devices/test_madimack_elitev3_heatpump.py
  38. 1 0
      tests/devices/test_madimack_heatpump.py
  39. 13 0
      tests/devices/test_minco_mh1823d_thermostat.py
  40. 1 0
      tests/devices/test_moes_bht002_thermostat.py
  41. 1 0
      tests/devices/test_nedis_htpl20f_heater.py
  42. 1 0
      tests/devices/test_poolex_silverline_heatpump.py
  43. 1 0
      tests/devices/test_poolex_vertigo_heatpump.py
  44. 1 0
      tests/devices/test_purline_m100_heater.py
  45. 8 0
      tests/devices/test_qoto_03_sprinkler.py
  46. 1 0
      tests/devices/test_remora_heatpump.py
  47. 11 0
      tests/devices/test_renpho_rp_ap001s.py
  48. 11 0
      tests/devices/test_saswell_c16_thermostat.py
  49. 1 0
      tests/devices/test_saswell_t29utk_thermostat.py
  50. 8 0
      tests/devices/test_smartplugv1.py
  51. 8 0
      tests/devices/test_smartplugv2.py
  52. 12 0
      tests/devices/test_smartplugv2_energy.py
  53. 1 0
      tests/devices/test_stirling_fs140dc_fan.py
  54. 1 0
      tests/devices/test_tmwf02_fan.py
  55. 8 0
      tests/devices/test_wetair_wawh1210lw_humidifier.py
  56. 7 1
      tests/devices/test_wetair_wch750_heater.py

+ 1 - 0
custom_components/tuya_local/devices/electriq_cd25pro_dehumidifier.yaml

@@ -78,6 +78,7 @@ secondary_entities:
         type: boolean
         type: boolean
   - entity: lock
   - entity: lock
     name: Child Lock
     name: Child Lock
+    category: config
     dps:
     dps:
       - id: 7
       - id: 7
         type: boolean
         type: boolean

+ 1 - 0
custom_components/tuya_local/devices/kogan_dehumidifier.yaml

@@ -88,6 +88,7 @@ secondary_entities:
   - entity: binary_sensor
   - entity: binary_sensor
     class: problem
     class: problem
     name: Tank
     name: Tank
+    category: diagnostic
     dps:
     dps:
       - id: 11
       - id: 11
         name: sensor
         name: sensor

+ 1 - 1
custom_components/tuya_local/devices/madimack_heatpump.yaml

@@ -122,7 +122,7 @@ primary_entity:
       type: string
       type: string
 secondary_entities:
 secondary_entities:
   - entity: sensor
   - entity: sensor
-    category: disagnostic
+    category: diagnostic
     name: Power Level
     name: Power Level
     icon: "mdi:signal"
     icon: "mdi:signal"
     class: power_factor
     class: power_factor

+ 0 - 1
custom_components/tuya_local/devices/minco_mh1823d_thermostat.yaml

@@ -245,7 +245,6 @@ secondary_entities:
             value: "5+2 day"
             value: "5+2 day"
   - entity: sensor
   - entity: sensor
     name: External Temperature
     name: External Temperature
-    category: diagnostic
     class: temperature
     class: temperature
     dps:
     dps:
       - id: 101
       - id: 101

+ 1 - 1
custom_components/tuya_local/devices/smartplugv2_energy.yaml

@@ -88,7 +88,7 @@ secondary_entities:
           - scale: 10
           - scale: 10
   - entity: binary_sensor
   - entity: binary_sensor
     class: problem
     class: problem
-    category: disagnostic
+    category: diagnostic
     name: Error
     name: Error
     dps:
     dps:
       - id: 26
       - id: 26

+ 29 - 10
tests/devices/base_device_tests.py

@@ -53,6 +53,7 @@ class TuyaDeviceTestCase(IsolatedAsyncioTestCase):
         self.mock_device.name = cfg.name
         self.mock_device.name = cfg.name
 
 
         self.entities = {}
         self.entities = {}
+        self.secondary_category = []
         self.primary_entity = cfg.primary_entity.config_id
         self.primary_entity = cfg.primary_entity.config_id
         self.entities[self.primary_entity] = self.create_entity(cfg.primary_entity)
         self.entities[self.primary_entity] = self.create_entity(cfg.primary_entity)
 
 
@@ -68,10 +69,17 @@ class TuyaDeviceTestCase(IsolatedAsyncioTestCase):
         if dev_type:
         if dev_type:
             return dev_type(self.mock_device, config)
             return dev_type(self.mock_device, config)
 
 
+    def mark_secondary(self, entities):
+        self.secondary_category = self.secondary_category + entities
+
     def test_config_matched(self):
     def test_config_matched(self):
         for cfg in possible_matches(self.dps):
         for cfg in possible_matches(self.dps):
             if cfg.legacy_type == self.conf_type:
             if cfg.legacy_type == self.conf_type:
-                self.assertEqual(cfg.match_quality(self.dps), 100.0)
+                self.assertEqual(
+                    cfg.match_quality(self.dps),
+                    100.0,
+                    msg=f"{self.conf_type} is an imperfect match",
+                )
                 return
                 return
         self.fail()
         self.fail()
 
 
@@ -83,15 +91,26 @@ class TuyaDeviceTestCase(IsolatedAsyncioTestCase):
         for e in self.entities.values():
         for e in self.entities.values():
             self.assertTrue(e.available)
             self.assertTrue(e.available)
 
 
-    # def test_entity_category(self):
-    #     for k in self.entities:
-    #         e = self.entities[k]
-    #         if k == self.primary_entity:
-    #             self.assertIsNone(e.entity_category)
-    #         elif type(e) in [TuyaLocalBinarySensor, TuyaLocalSensor]:
-    #             self.assertEqual(e.entity_category, "diagnostic")
-    #         else:
-    #             self.assertEqual(e.entity_category, "config")
+    def test_entity_category(self):
+        for k, e in self.entities.items():
+            if k in self.secondary_category:
+                if type(e) in [TuyaLocalBinarySensor, TuyaLocalSensor]:
+                    self.assertEqual(
+                        e.entity_category,
+                        "diagnostic",
+                        msg=f"{k} is {e.entity_category}, expected diagnostic",
+                    )
+                else:
+                    self.assertEqual(
+                        e.entity_category,
+                        "config",
+                        msg=f"{k} is {e.entity_category}, expected config",
+                    )
+            else:
+                self.assertIsNone(
+                    e.entity_category,
+                    msg=f"{k} is {e.entity_category}, expected None",
+                )
 
 
     def test_name_returns_device_name(self):
     def test_name_returns_device_name(self):
         for e in self.entities:
         for e in self.entities:

+ 1 - 0
tests/devices/test_anko_fan.py

@@ -25,6 +25,7 @@ class TestAnkoFan(SwitchableTests, BasicNumberTests, TuyaDeviceTestCase):
         self.subject = self.entities["fan"]
         self.subject = self.entities["fan"]
         self.setUpSwitchable(SWITCH_DPS, self.subject)
         self.setUpSwitchable(SWITCH_DPS, self.subject)
         self.setUpBasicNumber(TIMER_DPS, self.entities.get("number_timer"), max=9)
         self.setUpBasicNumber(TIMER_DPS, self.entities.get("number_timer"), max=9)
+        self.mark_secondary(["number_timer"])
 
 
     def test_supported_features(self):
     def test_supported_features(self):
         self.assertEqual(
         self.assertEqual(

+ 1 - 0
tests/devices/test_arlec_fan.py

@@ -37,6 +37,7 @@ class TestArlecFan(SwitchableTests, BasicSelectTests, TuyaDeviceTestCase):
                 "8hour": "8 hours",
                 "8hour": "8 hours",
             },
             },
         )
         )
+        self.mark_secondary(["select_timer"])
 
 
     def test_supported_features(self):
     def test_supported_features(self):
         self.assertEqual(
         self.assertEqual(

+ 1 - 0
tests/devices/test_aspen_adv200_fan.py

@@ -55,6 +55,7 @@ class TestAspenASP200Fan(
             min=40,
             min=40,
             max=95,
             max=95,
         )
         )
+        self.mark_secondary(["light_display"])
 
 
     def test_supported_features(self):
     def test_supported_features(self):
         self.assertEqual(
         self.assertEqual(

+ 8 - 0
tests/devices/test_awow_th213_thermostat.py

@@ -90,6 +90,14 @@ class TestAwowTH213Thermostat(
                 },
                 },
             ]
             ]
         )
         )
+        self.mark_secondary(
+            [
+                "lock_child_lock",
+                "select_temperature_sensor",
+                "number_calibration_offset",
+                "number_calibration_swing",
+            ]
+        )
 
 
     def test_supported_features(self):
     def test_supported_features(self):
         self.assertEqual(
         self.assertEqual(

+ 1 - 0
tests/devices/test_beca_bac002_thermostat.py

@@ -61,6 +61,7 @@ class TestBecaBAC002Thermostat(
                 "2": "Fan",
                 "2": "Fan",
             },
             },
         )
         )
+        self.mark_secondary(["lock_child_lock"])
 
 
     def test_supported_features(self):
     def test_supported_features(self):
         self.assertEqual(
         self.assertEqual(

+ 2 - 0
tests/devices/test_beca_bhp6000_thermostat.py

@@ -45,6 +45,7 @@ class TestBecaBHP6000Thermostat(
         )
         )
         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"))
+        self.mark_secondary(["light_display", "lock_child_lock"])
 
 
     def test_supported_features(self):
     def test_supported_features(self):
         self.assertEqual(
         self.assertEqual(
@@ -162,6 +163,7 @@ class TestBecaBHP6000ThermostatC(TuyaDeviceTestCase):
     def setUp(self):
     def setUp(self):
         self.setUpForConfig("beca_bhp6000_thermostat_c.yaml", BECA_BHP6000_PAYLOAD)
         self.setUpForConfig("beca_bhp6000_thermostat_c.yaml", BECA_BHP6000_PAYLOAD)
         self.subject = self.entities.get("climate")
         self.subject = self.entities.get("climate")
+        self.mark_secondary(["light_display", "lock_child_lock"])
 
 
     def test_temperature_unit_returns_configured_temperature_unit(self):
     def test_temperature_unit_returns_configured_temperature_unit(self):
         self.assertEqual(self.subject.temperature_unit, TEMP_CELSIUS)
         self.assertEqual(self.subject.temperature_unit, TEMP_CELSIUS)

+ 1 - 0
tests/devices/test_beca_bht002_thermostat.py

@@ -63,6 +63,7 @@ class TestBecaBHT002Thermostat(
             state_class="measurement",
             state_class="measurement",
             testdata=(30, 15),
             testdata=(30, 15),
         )
         )
+        self.mark_secondary(["light_display", "lock_child_lock"])
 
 
     def test_supported_features(self):
     def test_supported_features(self):
         self.assertEqual(
         self.assertEqual(

+ 1 - 0
tests/devices/test_beca_bht6000_thermostat.py

@@ -60,6 +60,7 @@ class TestBecaBHT6000Thermostat(
             state_class="measurement",
             state_class="measurement",
             testdata=(36, 18),
             testdata=(36, 18),
         )
         )
+        self.mark_secondary(["light_display", "lock_child_lock"])
 
 
     def test_supported_features(self):
     def test_supported_features(self):
         self.assertEqual(
         self.assertEqual(

+ 1 - 0
tests/devices/test_bwt_heatpump.py

@@ -42,6 +42,7 @@ class TestBWTHeatpump(
             device_class=DEVICE_CLASS_PROBLEM,
             device_class=DEVICE_CLASS_PROBLEM,
             testdata=(1, 0),
             testdata=(1, 0),
         )
         )
+        self.mark_secondary(["binary_sensor_water_flow"])
 
 
     def test_supported_features(self):
     def test_supported_features(self):
         self.assertEqual(
         self.assertEqual(

+ 1 - 0
tests/devices/test_deta_fan.py

@@ -26,6 +26,7 @@ class TestDetaFan(
         self.setUpSwitchable(SWITCH_DPS, self.subject)
         self.setUpSwitchable(SWITCH_DPS, self.subject)
         self.setUpBasicLight(LIGHT_DPS, self.entities["light"])
         self.setUpBasicLight(LIGHT_DPS, self.entities["light"])
         self.setUpBasicSwitch(MASTER_DPS, self.entities["switch_master"])
         self.setUpBasicSwitch(MASTER_DPS, self.entities["switch_master"])
+        self.mark_secondary(["switch_master"])
 
 
     def test_supported_features(self):
     def test_supported_features(self):
         self.assertEqual(
         self.assertEqual(

+ 1 - 0
tests/devices/test_eanons_humidifier.py

@@ -86,6 +86,7 @@ class TestEanonsHumidifier(
             device_class=DEVICE_CLASS_PROBLEM,
             device_class=DEVICE_CLASS_PROBLEM,
             testdata=(1, 0),
             testdata=(1, 0),
         )
         )
+        self.mark_secondary(["select_timer", "sensor_timer", "binary_sensor_tank"])
 
 
     def test_supported_features(self):
     def test_supported_features(self):
         self.assertEqual(
         self.assertEqual(

+ 1 - 0
tests/devices/test_eberg_qubo_q40hd_heatpump.py

@@ -55,6 +55,7 @@ class TestEbergQuboQ40HDHeatpump(
             max=30,
             max=30,
         )
         )
         self.setUpBasicNumber(TIMER_DPS, self.entities.get("number_timer"), max=24)
         self.setUpBasicNumber(TIMER_DPS, self.entities.get("number_timer"), max=24)
+        self.mark_secondary(["number_timer"])
 
 
     def test_supported_features(self):
     def test_supported_features(self):
         self.assertEqual(
         self.assertEqual(

+ 1 - 0
tests/devices/test_electriq_12wminv_heatpump.py

@@ -57,6 +57,7 @@ class TestElectriq12WMINVHeatpump(
         )
         )
         self.setUpBasicLight(LIGHT_DPS, self.entities.get("light_display"))
         self.setUpBasicLight(LIGHT_DPS, self.entities.get("light_display"))
         self.setUpBasicSwitch(SWITCH_DPS, self.entities.get("switch_sleep"))
         self.setUpBasicSwitch(SWITCH_DPS, self.entities.get("switch_sleep"))
+        self.mark_secondary(["light_display", "lock_child_lock"])
 
 
     def test_supported_features(self):
     def test_supported_features(self):
         self.assertEqual(
         self.assertEqual(

+ 1 - 0
tests/devices/test_electriq_cd12_dehumidifier.py

@@ -51,6 +51,7 @@ class TestElectriqCD20ProDehumidifier(
                 },
                 },
             ]
             ]
         )
         )
+        self.mark_secondary(["light_display"])
 
 
     def test_supported_features(self):
     def test_supported_features(self):
         self.assertEqual(self.subject.supported_features, SUPPORT_MODES)
         self.assertEqual(self.subject.supported_features, SUPPORT_MODES)

+ 1 - 0
tests/devices/test_electriq_cd20_dehumidifier.py

@@ -66,6 +66,7 @@ class TestElectriqCD20ProDehumidifier(
                 },
                 },
             ]
             ]
         )
         )
+        self.mark_secondary(["light_display"])
 
 
     def test_supported_features(self):
     def test_supported_features(self):
         self.assertEqual(self.subject.supported_features, SUPPORT_MODES)
         self.assertEqual(self.subject.supported_features, SUPPORT_MODES)

+ 1 - 0
tests/devices/test_electriq_cd25_dehumidifier.py

@@ -64,6 +64,7 @@ class TestElectriqCD25ProDehumidifier(
                 },
                 },
             ]
             ]
         )
         )
+        self.mark_secondary(["lock_child_lock"])
 
 
     def test_supported_features(self):
     def test_supported_features(self):
         self.assertEqual(self.subject.supported_features, SUPPORT_MODES)
         self.assertEqual(self.subject.supported_features, SUPPORT_MODES)

+ 1 - 0
tests/devices/test_eurom_600_heater.py

@@ -38,6 +38,7 @@ class TestEurom600Heater(
             device_class=DEVICE_CLASS_PROBLEM,
             device_class=DEVICE_CLASS_PROBLEM,
             testdata=(1, 0),
             testdata=(1, 0),
         )
         )
+        self.mark_secondary(["binary_sensor_error"])
 
 
     def test_supported_features(self):
     def test_supported_features(self):
         self.assertEqual(
         self.assertEqual(

+ 1 - 0
tests/devices/test_eurom_601_heater.py

@@ -42,6 +42,7 @@ class TestEurom601Heater(
             device_class=DEVICE_CLASS_PROBLEM,
             device_class=DEVICE_CLASS_PROBLEM,
             testdata=(1, 0),
             testdata=(1, 0),
         )
         )
+        self.mark_secondary(["binary_sensor_error"])
 
 
     def test_supported_features(self):
     def test_supported_features(self):
         self.assertEqual(
         self.assertEqual(

+ 1 - 0
tests/devices/test_gardenpac_heatpump.py

@@ -57,6 +57,7 @@ class TestGardenPACPoolHeatpump(
             device_class=DEVICE_CLASS_POWER_FACTOR,
             device_class=DEVICE_CLASS_POWER_FACTOR,
             state_class="measurement",
             state_class="measurement",
         )
         )
+        self.mark_secondary(["sensor_power_level"])
 
 
     def test_supported_features(self):
     def test_supported_features(self):
         self.assertEqual(
         self.assertEqual(

+ 9 - 0
tests/devices/test_goldair_dehumidifier.py

@@ -108,6 +108,15 @@ class TestGoldairDehumidifier(
                 },
                 },
             ]
             ]
         )
         )
+        self.mark_secondary(
+            [
+                "light_display",
+                "lock_child_lock",
+                "number_timer",
+                "binary_sensor_tank",
+                "binary_sensor_defrost",
+            ],
+        )
 
 
     def test_supported_features(self):
     def test_supported_features(self):
         self.assertEqual(
         self.assertEqual(

+ 1 - 0
tests/devices/test_goldair_fan.py

@@ -40,6 +40,7 @@ class TestGoldairFan(BasicLightTests, SwitchableTests, TuyaDeviceTestCase):
         self.climate = self.entities.get("climate")
         self.climate = self.entities.get("climate")
         self.setUpSwitchable(HVACMODE_DPS, self.subject)
         self.setUpSwitchable(HVACMODE_DPS, self.subject)
         self.setUpBasicLight(LIGHT_DPS, self.entities.get("light_display"))
         self.setUpBasicLight(LIGHT_DPS, self.entities.get("light_display"))
+        self.mark_secondary(["light_display"])
 
 
     def test_supported_features(self):
     def test_supported_features(self):
         self.assertEqual(
         self.assertEqual(

+ 7 - 0
tests/devices/test_goldair_geco_heater.py

@@ -48,6 +48,13 @@ class TestGoldairGECOHeater(
             device_class=DEVICE_CLASS_PROBLEM,
             device_class=DEVICE_CLASS_PROBLEM,
             testdata=(1, 0),
             testdata=(1, 0),
         )
         )
+        self.mark_secondary(
+            [
+                "lock_child_lock",
+                "number_timer",
+                "binary_sensor_error",
+            ]
+        )
 
 
     def test_supported_features(self):
     def test_supported_features(self):
         self.assertEqual(
         self.assertEqual(

+ 3 - 0
tests/devices/test_goldair_gpcv_heater.py

@@ -50,6 +50,9 @@ class TestGoldairGPCVHeater(
             device_class=DEVICE_CLASS_PROBLEM,
             device_class=DEVICE_CLASS_PROBLEM,
             testdata=(1, 0),
             testdata=(1, 0),
         )
         )
+        self.mark_secondary(
+            ["lock_child_lock", "number_timer", "binary_sensor_error"],
+        )
 
 
     def test_supported_features(self):
     def test_supported_features(self):
         self.assertEqual(
         self.assertEqual(

+ 14 - 1
tests/devices/test_goldair_gpph_heater.py

@@ -7,7 +7,11 @@ from homeassistant.components.climate.const import (
     SUPPORT_TARGET_TEMPERATURE,
     SUPPORT_TARGET_TEMPERATURE,
 )
 )
 
 
-from homeassistant.const import DEVICE_CLASS_POWER_FACTOR, PERCENTAGE, STATE_UNAVAILABLE
+from homeassistant.const import (
+    DEVICE_CLASS_POWER_FACTOR,
+    PERCENTAGE,
+    STATE_UNAVAILABLE,
+)
 
 
 from ..const import GPPH_HEATER_PAYLOAD
 from ..const import GPPH_HEATER_PAYLOAD
 from ..helpers import assert_device_properties_set
 from ..helpers import assert_device_properties_set
@@ -71,6 +75,15 @@ class TestGoldairHeater(
             device_class=DEVICE_CLASS_PROBLEM,
             device_class=DEVICE_CLASS_PROBLEM,
             testdata=(1, 0),
             testdata=(1, 0),
         )
         )
+        self.mark_secondary(
+            [
+                "light_display",
+                "lock_child_lock",
+                "number_timer",
+                "sensor_power_level",
+                "binary_sensor_error",
+            ]
+        )
 
 
     def test_supported_features(self):
     def test_supported_features(self):
         self.assertEqual(
         self.assertEqual(

+ 28 - 0
tests/devices/test_grid_connect_double_power_point.py

@@ -40,6 +40,7 @@ MASTER_DPS = "101"
 class TestGridConnectDoubleSwitch(
 class TestGridConnectDoubleSwitch(
     BasicLockTests,
     BasicLockTests,
     BasicSelectTests,
     BasicSelectTests,
+    MultiNumberTests,
     MultiSensorTests,
     MultiSensorTests,
     MultiSwitchTests,
     MultiSwitchTests,
     TuyaDeviceTestCase,
     TuyaDeviceTestCase,
@@ -119,6 +120,33 @@ class TestGridConnectDoubleSwitch(
                 },
                 },
             ]
             ]
         )
         )
+        self.setUpMultiNumber(
+            [
+                {
+                    "name": "number_timer_1",
+                    "dps": COUNTDOWN1_DPS,
+                    "max": 86400,
+                },
+                {
+                    "name": "number_timer_2",
+                    "dps": COUNTDOWN2_DPS,
+                    "max": 86400,
+                },
+            ]
+        )
+        self.mark_secondary(
+            [
+                "lock_child_lock",
+                "number_timer_1",
+                "number_timer_2",
+                "select_initial_state",
+                "switch_master",
+                "sensor_energy",
+                "sensor_current",
+                "sensor_power",
+                "sensor_voltage",
+            ],
+        )
 
 
     async def test_turn_on_fails_when_master_is_off(self):
     async def test_turn_on_fails_when_master_is_off(self):
         self.dps[MASTER_DPS] = False
         self.dps[MASTER_DPS] = False

+ 13 - 0
tests/devices/test_inkbird_itc306a_thermostat.py

@@ -119,6 +119,19 @@ class TestInkbirdThermostat(
                 },
                 },
             ]
             ]
         )
         )
+        self.mark_secondary(
+            [
+                "select_temperature_unit",
+                "binary_sensor_high_temperature",
+                "binary_sensor_low_temperature",
+                "binary_sensor_continuous_heat",
+                "binary_sensor_error",
+                "number_calibration_offset",
+                "number_continuous_heat_hours",
+                "number_high_temperature_limit",
+                "number_low_temperature_limit",
+            ]
+        )
 
 
     def test_supported_features(self):
     def test_supported_features(self):
         self.assertEqual(
         self.assertEqual(

+ 1 - 0
tests/devices/test_kogan_dehumidifier.py

@@ -45,6 +45,7 @@ class TestKoganDehumidifier(
             state_class="measurement",
             state_class="measurement",
             unit=PERCENTAGE,
             unit=PERCENTAGE,
         )
         )
+        self.mark_secondary(["binary_sensor_tank"])
 
 
     def test_supported_features(self):
     def test_supported_features(self):
         self.assertEqual(self.subject.supported_features, SUPPORT_MODES)
         self.assertEqual(self.subject.supported_features, SUPPORT_MODES)

+ 1 - 0
tests/devices/test_kogan_kahtp_heater.py

@@ -37,6 +37,7 @@ class TestGoldairKoganKAHTPHeater(
         )
         )
         self.setUpBasicLock(LOCK_DPS, self.entities.get("lock_child_lock"))
         self.setUpBasicLock(LOCK_DPS, self.entities.get("lock_child_lock"))
         self.setUpBasicNumber(TIMER_DPS, self.entities.get("number_timer"), max=24)
         self.setUpBasicNumber(TIMER_DPS, self.entities.get("number_timer"), max=24)
+        self.mark_secondary(["lock_child_lock", "number_timer"])
 
 
     def test_supported_features(self):
     def test_supported_features(self):
         self.assertEqual(
         self.assertEqual(

+ 1 - 0
tests/devices/test_kogan_kawfhtp_heater.py

@@ -40,6 +40,7 @@ class TestGoldairKoganKAHTPHeater(
         )
         )
         self.setUpBasicLock(LOCK_DPS, self.entities.get("lock_child_lock"))
         self.setUpBasicLock(LOCK_DPS, self.entities.get("lock_child_lock"))
         self.setUpBasicNumber(TIMER_DPS, self.entities.get("number_timer"), max=24)
         self.setUpBasicNumber(TIMER_DPS, self.entities.get("number_timer"), max=24)
+        self.mark_secondary(["lock_child_lock", "number_timer"])
 
 
     def test_supported_features(self):
     def test_supported_features(self):
         self.assertEqual(
         self.assertEqual(

+ 8 - 0
tests/devices/test_lexy_f501_fan.py

@@ -40,6 +40,14 @@ class TestLexyF501Fan(
         self.setUpBasicLock(LOCK_DPS, self.entities.get("lock_child_lock"))
         self.setUpBasicLock(LOCK_DPS, self.entities.get("lock_child_lock"))
         self.setUpBasicNumber(TIMER_DPS, self.entities.get("number_timer"), max=7)
         self.setUpBasicNumber(TIMER_DPS, self.entities.get("number_timer"), max=7)
         self.setUpBasicSwitch(SWITCH_DPS, self.entities.get("switch_sound"))
         self.setUpBasicSwitch(SWITCH_DPS, self.entities.get("switch_sound"))
+        self.mark_secondary(
+            [
+                "light",
+                "lock_child_lock",
+                "number_timer",
+                "switch_sound",
+            ]
+        )
 
 
     def test_supported_features(self):
     def test_supported_features(self):
         self.assertEqual(
         self.assertEqual(

+ 13 - 1
tests/devices/test_madimack_elitev3_heatpump.py

@@ -11,7 +11,6 @@ from homeassistant.const import (
     DEVICE_CLASS_POWER_FACTOR,
     DEVICE_CLASS_POWER_FACTOR,
     DEVICE_CLASS_TEMPERATURE,
     DEVICE_CLASS_TEMPERATURE,
     PERCENTAGE,
     PERCENTAGE,
-    STATE_UNAVAILABLE,
     TEMP_CELSIUS,
     TEMP_CELSIUS,
     TEMP_FAHRENHEIT,
     TEMP_FAHRENHEIT,
 )
 )
@@ -119,6 +118,19 @@ class TestMadimackEliteV3Heatpump(
                 },
                 },
             ]
             ]
         )
         )
+        self.mark_secondary(
+            [
+                "sensor_power_level",
+                "sensor_evaporator_coil_pipe_temperature",
+                "sensor_exhaust_gas_temperature",
+                "sensor_outlet_water_temperature",
+                "sensor_ambient_temperature",
+                "sensor_return_gas_temperature",
+                "sensor_cooling_coil_pipe_temperature",
+                "sensor_cooling_plate_temperature",
+                "sensor_eev_opening",
+            ]
+        )
 
 
     def test_supported_features(self):
     def test_supported_features(self):
         self.assertEqual(
         self.assertEqual(

+ 1 - 0
tests/devices/test_madimack_heatpump.py

@@ -71,6 +71,7 @@ class TestMadimackPoolHeatpump(
             device_class=DEVICE_CLASS_POWER_FACTOR,
             device_class=DEVICE_CLASS_POWER_FACTOR,
             unit=PERCENTAGE,
             unit=PERCENTAGE,
         )
         )
+        self.mark_secondary(["sensor_power_level"])
 
 
     def test_supported_features(self):
     def test_supported_features(self):
         self.assertEqual(
         self.assertEqual(

+ 13 - 0
tests/devices/test_minco_mh1823d_thermostat.py

@@ -140,6 +140,19 @@ class TestMincoMH1823DThermostat(
                 },
                 },
             ]
             ]
         )
         )
+        self.mark_secondary(
+            [
+                "lock_child_lock",
+                "number_calibration_offset_internal",
+                "number_calibration_offset_external",
+                "number_calibration_swing",
+                "number_high_temperature_limit",
+                "select_temperature_sensor",
+                "select_temperature_unit",
+                "select_schedule",
+                "switch_anti_frost",
+            ]
+        )
 
 
     def test_supported_features(self):
     def test_supported_features(self):
         self.assertEqual(
         self.assertEqual(

+ 1 - 0
tests/devices/test_moes_bht002_thermostat.py

@@ -43,6 +43,7 @@ class TestMoesBHT002Thermostat(
             scale=2,
             scale=2,
         )
         )
         self.setUpBasicLock(LOCK_DPS, self.entities.get("lock_child_lock"))
         self.setUpBasicLock(LOCK_DPS, self.entities.get("lock_child_lock"))
+        self.mark_secondary(["lock_child_lock"])
 
 
     def test_supported_features(self):
     def test_supported_features(self):
         self.assertEqual(
         self.assertEqual(

+ 1 - 0
tests/devices/test_nedis_htpl20f_heater.py

@@ -45,6 +45,7 @@ class TestNedisHtpl20fHeater(
             self.entities.get("lock_child_lock"),
             self.entities.get("lock_child_lock"),
         )
         )
         self.setUpBasicNumber(TIMER_DPS, self.entities.get("number_timer"), max=1440)
         self.setUpBasicNumber(TIMER_DPS, self.entities.get("number_timer"), max=1440)
+        self.mark_secondary(["lock_child_lock", "number_timer"])
 
 
     def test_supported_features(self):
     def test_supported_features(self):
         self.assertEqual(
         self.assertEqual(

+ 1 - 0
tests/devices/test_poolex_silverline_heatpump.py

@@ -44,6 +44,7 @@ class TestPoolexSilverlineHeatpump(
             device_class=DEVICE_CLASS_PROBLEM,
             device_class=DEVICE_CLASS_PROBLEM,
             testdata=(256, 0),
             testdata=(256, 0),
         )
         )
+        self.mark_secondary(["binary_sensor_water_flow"])
 
 
     def test_supported_features(self):
     def test_supported_features(self):
         self.assertEqual(
         self.assertEqual(

+ 1 - 0
tests/devices/test_poolex_vertigo_heatpump.py

@@ -44,6 +44,7 @@ class TestPoolexVertigoHeatpump(
             device_class=DEVICE_CLASS_PROBLEM,
             device_class=DEVICE_CLASS_PROBLEM,
             testdata=(4, 0),
             testdata=(4, 0),
         )
         )
+        self.mark_secondary(["binary_sensor_water_flow"])
 
 
     def test_supported_features(self):
     def test_supported_features(self):
         self.assertEqual(
         self.assertEqual(

+ 1 - 0
tests/devices/test_purline_m100_heater.py

@@ -52,6 +52,7 @@ class TestPulineM100Heater(
         self.setUpBasicSwitch(
         self.setUpBasicSwitch(
             SWITCH_DPS, self.entities.get("switch_open_window_detector")
             SWITCH_DPS, self.entities.get("switch_open_window_detector")
         )
         )
+        self.mark_secondary(["light_display", "switch_open_window_detector"])
 
 
     def test_supported_features(self):
     def test_supported_features(self):
         self.assertEqual(
         self.assertEqual(

+ 8 - 0
tests/devices/test_qoto_03_sprinkler.py

@@ -59,3 +59,11 @@ class TestQoboSprinkler(
                 },
                 },
             ]
             ]
         )
         )
+        self.mark_secondary(
+            [
+                "binary_sensor_error",
+                "number_timer",
+                "sensor_open",
+                "sensor_timer",
+            ]
+        )

+ 1 - 0
tests/devices/test_remora_heatpump.py

@@ -40,6 +40,7 @@ class TestRemoraHeatpump(
             device_class=DEVICE_CLASS_PROBLEM,
             device_class=DEVICE_CLASS_PROBLEM,
             testdata=(1, 0),
             testdata=(1, 0),
         )
         )
+        self.mark_secondary(["binary_sensor_water_flow"])
 
 
     def test_supported_features(self):
     def test_supported_features(self):
         self.assertEqual(
         self.assertEqual(

+ 11 - 0
tests/devices/test_renpho_rp_ap001s.py

@@ -64,6 +64,17 @@ class TestRenphoPurifier(
                 },
                 },
             ]
             ]
         )
         )
+        self.mark_secondary(
+            [
+                "light_aq_indicator",
+                "lock_child_lock",
+                "sensor_air_quality",
+                "sensor_active_filter_life",
+                "sensor_charcoal_filter_life",
+                "sensor_hepa_filter_life",
+                "sensor_prefilter_life",
+            ]
+        )
 
 
     def test_supported_features(self):
     def test_supported_features(self):
         self.assertEqual(self.subject.supported_features, SUPPORT_PRESET_MODE)
         self.assertEqual(self.subject.supported_features, SUPPORT_PRESET_MODE)

+ 11 - 0
tests/devices/test_saswell_c16_thermostat.py

@@ -113,6 +113,17 @@ class TestSaswellC16Thermostat(
                 },
                 },
             ]
             ]
         )
         )
+        self.mark_secondary(
+            [
+                "lock_child_lock",
+                "sensor_floor_temperature",
+                "switch_adaptive",
+                "number_floor_temperature_limit",
+                "number_power_rating",
+                "select_installation",
+                "select_schedule",
+            ]
+        )
 
 
     def test_supported_features(self):
     def test_supported_features(self):
         self.assertEqual(
         self.assertEqual(

+ 1 - 0
tests/devices/test_saswell_t29utk_thermostat.py

@@ -78,6 +78,7 @@ class TestSaswellT29UTKThermostat(
                 },
                 },
             ]
             ]
         )
         )
+        self.mark_secondary(["select_configuration", "select_temperature_unit"])
 
 
     def test_supported_features(self):
     def test_supported_features(self):
         self.assertEqual(
         self.assertEqual(

+ 8 - 0
tests/devices/test_smartplugv1.py

@@ -59,6 +59,14 @@ class TestKoganSwitch(
                 },
                 },
             ]
             ]
         )
         )
+        self.mark_secondary(
+            [
+                "number_timer",
+                "sensor_current",
+                "sensor_power",
+                "sensor_voltage",
+            ]
+        )
 
 
     def test_device_class_is_outlet(self):
     def test_device_class_is_outlet(self):
         self.assertEqual(self.subject.device_class, DEVICE_CLASS_OUTLET)
         self.assertEqual(self.subject.device_class, DEVICE_CLASS_OUTLET)

+ 8 - 0
tests/devices/test_smartplugv2.py

@@ -59,6 +59,14 @@ class TestSwitchV2(
                 },
                 },
             ]
             ]
         )
         )
+        self.mark_secondary(
+            [
+                "number_timer",
+                "sensor_current",
+                "sensor_power",
+                "sensor_voltage",
+            ]
+        )
 
 
     def test_device_class_is_outlet(self):
     def test_device_class_is_outlet(self):
         self.assertEqual(self.subject.device_class, DEVICE_CLASS_OUTLET)
         self.assertEqual(self.subject.device_class, DEVICE_CLASS_OUTLET)

+ 12 - 0
tests/devices/test_smartplugv2_energy.py

@@ -113,6 +113,18 @@ class TestSwitchV2Energy(
                 },
                 },
             ]
             ]
         )
         )
+        self.mark_secondary(
+            [
+                "binary_sensor_error",
+                "number_timer",
+                "select_initial_state",
+                "sensor_current",
+                "sensor_energy",
+                "sensor_power",
+                "sensor_voltage",
+                "switch_overcharge_cutoff",
+            ]
+        )
 
 
     def test_multi_switch_state_attributes(self):
     def test_multi_switch_state_attributes(self):
         self.dps[TEST_DPS] = 21
         self.dps[TEST_DPS] = 21

+ 1 - 0
tests/devices/test_stirling_fs140dc_fan.py

@@ -24,6 +24,7 @@ class TestStirlingFS1Fan(SwitchableTests, TuyaDeviceTestCase):
         self.subject = self.entities.get("fan")
         self.subject = self.entities.get("fan")
         self.timer = self.entities.get("select_timer")
         self.timer = self.entities.get("select_timer")
         self.setUpSwitchable(SWITCH_DPS, self.subject)
         self.setUpSwitchable(SWITCH_DPS, self.subject)
+        self.mark_secondary(["select_timer"])
 
 
     def test_supported_features(self):
     def test_supported_features(self):
         self.assertEqual(
         self.assertEqual(

+ 1 - 0
tests/devices/test_tmwf02_fan.py

@@ -28,6 +28,7 @@ class TestTMWF02Fan(BasicNumberTests, SwitchableTests, TuyaDeviceTestCase):
             max=1440,
             max=1440,
             scale=60,
             scale=60,
         )
         )
+        self.mark_secondary(["number_timer"])
 
 
     def test_supported_features(self):
     def test_supported_features(self):
         self.assertEqual(
         self.assertEqual(

+ 8 - 0
tests/devices/test_wetair_wawh1210lw_humidifier.py

@@ -77,6 +77,14 @@ class TestWetairWAWH1210LWHumidifier(
                 },
                 },
             ]
             ]
         )
         )
+        self.mark_secondary(
+            [
+                "light_display",
+                "lock_child_lock",
+                "sensor_water_level",
+                "switch_sound",
+            ]
+        )
 
 
     def test_supported_features(self):
     def test_supported_features(self):
         self.assertEqual(self.subject.supported_features, SUPPORT_MODES)
         self.assertEqual(self.subject.supported_features, SUPPORT_MODES)

+ 7 - 1
tests/devices/test_wetair_wch750_heater.py

@@ -56,7 +56,6 @@ class TestWetairWCH750Heater(
                 ("level3", 255),
                 ("level3", 255),
             ],
             ],
         )
         )
-        self.light = self.entities.get("light_display")
         self.setUpBasicSelect(
         self.setUpBasicSelect(
             TIMER_DPS,
             TIMER_DPS,
             self.entities.get("select_timer"),
             self.entities.get("select_timer"),
@@ -91,6 +90,13 @@ class TestWetairWCH750Heater(
         self.setUpBasicSensor(
         self.setUpBasicSensor(
             COUNTDOWN_DPS, self.entities.get("sensor_timer"), unit=TIME_MINUTES
             COUNTDOWN_DPS, self.entities.get("sensor_timer"), unit=TIME_MINUTES
         )
         )
+        self.mark_secondary(
+            [
+                "light_display",
+                "select_timer",
+                "sensor_timer",
+            ]
+        )
 
 
     def test_supported_features(self):
     def test_supported_features(self):
         self.assertEqual(
         self.assertEqual(