Bläddra i källkod

Swap the primary device on humidifier and dehumidifier devices.

It doesn't have any practical impact, which strengthens the case for eliminating
the primary/secondary distinction.
Jason Rumney 4 år sedan
förälder
incheckning
8f657ee65f

+ 16 - 16
custom_components/tuya_local/devices/eanons_humidifier.yaml

@@ -1,7 +1,9 @@
-name: Eanons Humidifier
+name: Eanons/pureenjoy Humidifier
 legacy_type: eanons_humidifier
 primary_entity:
-  entity: climate
+  entity: humidifier
+  name: Humidifier
+  class: humidifier
   dps:
     - id: 2
       name: fan_mode
@@ -28,17 +30,10 @@ primary_entity:
         - dps_val: 1
           value: Water Level Low
     - id: 10
-      name: hvac_mode
+      name: switch
       type: boolean
-      mapping:
-        - dps_val: false
-          value: "off"
-          icon: mdi:air-humidifier-off
-        - dps_val: true
-          value: "dry"
-          icon: mdi:air-humidifier
     - id: 12
-      name: preset_mode
+      name: mode
       type: string
       mapping:
         - dps_val: sleep
@@ -57,9 +52,7 @@ primary_entity:
       name: current_humidity
       type: integer
 secondary_entities:
-  - entity: humidifier
-    name: Humidifier
-    class: humidifier
+  - entity: climate
     dps:
       - id: 2
         name: fan_mode
@@ -86,10 +79,17 @@ secondary_entities:
           - dps_val: 1
             value: Water Level Low
       - id: 10
-        name: switch
+        name: hvac_mode
         type: boolean
+        mapping:
+          - dps_val: false
+            value: "off"
+            icon: mdi:air-humidifier-off
+          - dps_val: true
+            value: "dry"
+            icon: mdi:air-humidifier
       - id: 12
-        name: mode
+        name: preset_mode
         type: string
         mapping:
           - dps_val: sleep

+ 21 - 21
custom_components/tuya_local/devices/goldair_dehumidifier.yaml

@@ -1,22 +1,22 @@
 name: Goldair Dehumidifier
 legacy_type: dehumidifier
 primary_entity:
-  entity: climate
-  legacy_class: ".dehumidifier.climate.GoldairDehumidifier"
+  entity: humidifier
+  name: Dehumidifier
+  class: dehumidifier
   dps:
     - id: 1
+      name: switch
       type: boolean
       mapping:
-        - dps_val: False
-          value: "off"
-          icon: mdi:air-humidifier-off
+        - dps_val: false
+          icon: "mdi:air-humidifier-off"
           icon_priority: 3
-        - dps_val: True
-          value: "dry"
-          icon: mdi:air-humidifier
+        - dps_val: true
+          icon: "mdi:air-humidifier"
           icon_priority: 5
-      name: hvac_mode
     - id: 2
+      name: mode
       type: string
       mapping:
         - dps_val: "0"
@@ -29,7 +29,6 @@ primary_entity:
           value: "Dry clothes"
           icon: "mdi:tshirt-crew-outline"
           icon_priority: 4
-      name: preset_mode
     - id: 4
       type: integer
       name: humidity
@@ -82,24 +81,24 @@ primary_entity:
         - dps_val: true
           icon: "mdi:snowflake-melt"
           icon_priority: 2
-          readonly: true
+      readonly: true
 secondary_entities:
-  - entity: humidifier
-    name: Dehumidifier
-    class: dehumidifier
+  - entity: climate
+    legacy_class: ".dehumidifier.climate.GoldairDehumidifier"
     dps:
       - id: 1
-        name: switch
         type: boolean
         mapping:
-          - dps_val: false
-            icon: "mdi:air-humidifier-off"
+          - dps_val: False
+            value: "off"
+            icon: mdi:air-humidifier-off
             icon_priority: 3
-          - dps_val: true
-            icon: "mdi:air-humidifier"
+          - dps_val: True
+            value: "dry"
+            icon: mdi:air-humidifier
             icon_priority: 5
+        name: hvac_mode
       - id: 2
-        name: mode
         type: string
         mapping:
           - dps_val: "0"
@@ -112,6 +111,7 @@ secondary_entities:
             value: "Dry clothes"
             icon: "mdi:tshirt-crew-outline"
             icon_priority: 4
+        name: preset_mode
       - id: 4
         type: integer
         name: humidity
@@ -164,7 +164,7 @@ secondary_entities:
           - dps_val: true
             icon: "mdi:snowflake-melt"
             icon_priority: 2
-        readonly: true
+            readonly: true
   - entity: light
     name: Panel Light
     dps:

+ 12 - 8
tests/devices/test_eanons_humidifier.py

@@ -43,16 +43,20 @@ class TestEanonsHumidifier(IsolatedAsyncioTestCase):
         self.addCleanup(device_patcher.stop)
         self.mock_device = device_patcher.start()
         cfg = TuyaDeviceConfig("eanons_humidifier.yaml")
-        climate = cfg.primary_entity
-        switch = None
+        entities = {}
+        entities[cfg.primary_entity.entity] = cfg.primary_entity
         for e in cfg.secondary_entities():
-            if e.entity == "switch":
-                switch = e
-        self.climate_name = climate.name
-        self.switch_name = "missing" if switch is None else switch.name
+            entities[e.entity] = e
 
-        self.subject = TuyaLocalClimate(self.mock_device(), climate)
-        self.switch = TuyaLocalSwitch(self.mock_device(), switch)
+        self.climate_name = (
+            "missing" if "climate" not in entities else entities["climate"].name
+        )
+        self.switch_name = (
+            "missing" if "switch" not in entities else entities["switch"].name
+        )
+
+        self.subject = TuyaLocalClimate(self.mock_device(), entities.get("climate"))
+        self.switch = TuyaLocalSwitch(self.mock_device(), entities.get("switch"))
 
         self.dps = EANONS_HUMIDIFIER_PAYLOAD.copy()
         self.subject._device.get_property.side_effect = lambda id: self.dps[id]

+ 22 - 19
tests/devices/test_goldair_dehumidifier.py

@@ -51,26 +51,29 @@ class TestGoldairDehumidifier(IsolatedAsyncioTestCase):
         self.addCleanup(device_patcher.stop)
         self.mock_device = device_patcher.start()
         cfg = TuyaDeviceConfig("goldair_dehumidifier.yaml")
-        climate = cfg.primary_entity
-        light = None
-        lock = None
-        humidifier = None
+        entities = {}
+        entities[cfg.primary_entity.entity] = cfg.primary_entity
+
         for e in cfg.secondary_entities():
-            if e.entity == "light":
-                light = e
-            elif e.entity == "lock":
-                lock = e
-            elif e.entity == "humidifier":
-                humidifier = e
-        self.climate_name = climate.name
-        self.light_name = "missing" if light is None else light.name
-        self.lock_name = "missing" if lock is None else lock.name
-        self.humidifier_name = "missing" if humidifier is None else humidifier.name
-
-        self.subject = TuyaLocalClimate(self.mock_device(), climate)
-        self.light = TuyaLocalLight(self.mock_device(), light)
-        self.lock = TuyaLocalLock(self.mock_device(), lock)
-        self.humidifier = TuyaLocalHumidifier(self.mock_device(), humidifier)
+            entities[e.entity] = e
+
+        self.climate_name = (
+            "missing" if "climate" not in entities else entities["climate"].name
+        )
+        self.light_name = (
+            "missing" if "light" not in entities else entities["light"].name
+        )
+        self.lock_name = "missing" if "lock" not in entities else entities["lock"].name
+        self.humidifier_name = (
+            "missing" if "humidifier" not in entities else entities["humidifier"].name
+        )
+
+        self.subject = TuyaLocalClimate(self.mock_device(), entities.get("climate"))
+        self.light = TuyaLocalLight(self.mock_device(), entities.get("light"))
+        self.lock = TuyaLocalLock(self.mock_device(), entities.get("lock"))
+        self.humidifier = TuyaLocalHumidifier(
+            self.mock_device(), entities.get("humidifier")
+        )
 
         self.dps = DEHUMIDIFIER_PAYLOAD.copy()
         self.subject._device.get_property.side_effect = lambda id: self.dps[id]

+ 15 - 2
tests/test_device_config.py

@@ -84,8 +84,15 @@ class TestDeviceConfig(unittest.TestCase):
                 matched = True
                 quality = cfg.match_quality(payload)
                 if legacy_class is not None:
+                    cfg_class = cfg.primary_entity.legacy_class
+                    if cfg_class is None:
+                        for e in cfg.secondary_entities():
+                            cfg_class = e.legacy_class
+                            if cfg_class is not None:
+                                break
+
                     self.assertEqual(
-                        cfg.primary_entity.legacy_class.__name__,
+                        cfg_class.__name__,
                         legacy_class,
                     )
             else:
@@ -109,8 +116,14 @@ class TestDeviceConfig(unittest.TestCase):
         # Ensure the same correct config is returned when looked up by type
         cfg = config_for_legacy_use(legacy_type)
         if legacy_class is not None:
+            cfg_class = cfg.primary_entity.legacy_class
+            if cfg_class is None:
+                for e in cfg.secondary_entities():
+                    cfg_class = e.legacy_class
+                    if cfg_class is not None:
+                        break
             self.assertEqual(
-                cfg.primary_entity.legacy_class.__name__,
+                cfg_class.__name__,
                 legacy_class,
             )