Просмотр исходного кода

Add support for ElectriQ CD12PW-v2 dehumidifier.

Issue #109 (@Gekko47)
Jason Rumney 4 лет назад
Родитель
Сommit
f30c71f1be

+ 1 - 1
ACKNOWLEDGEMENTS.md

@@ -71,4 +71,4 @@ Further device support has been made with the assistance of users.  Please consi
  - [Paul-C-S](https://github.com/Paul-C-S) for assistance with Ecostrad Accent iQ heaters.
  - [WildeRNS](https://github.com/WildeRNS) for assistance with Nashone MTS-700-WB thermostat smartplugs.
  - [ishioni](https://github.com/ishioni) for contributing support for Eberg Cooly C32HD air conditioner.
- 
+ - [Gekko47](https://github.com/Gekko47) for contributing support for ElectriQ CD12v2 dehumidifiers.

+ 2 - 1
README.md

@@ -104,7 +104,8 @@ the device will not work despite being listed below.
 
 ### Dehumidifiers
 - Goldair GPDH420 dehumidifier
-- ElectriQ CD12PW dehmidifier
+- ElectriQ CD12PW dehumidifier
+- ElectriQ CD12PWv2 dehumidifier
 - ElectriQ CD20PRO-LE-V2 dehumidifier
 - ElectriQ CD25PRO-LE-V2 dehumidifier
 - ElectriQ DESD9LW dehumidifier

+ 90 - 0
custom_components/tuya_local/devices/electriq_cd12pwv2_dehumidifier.yaml

@@ -0,0 +1,90 @@
+name: "Electriq CD12PW-V2 Dehumidifier"
+primary_entity:
+  entity: humidifier
+  class: dehumidifier
+  dps:
+    - id: 1
+      name: switch
+      type: boolean
+      mapping:
+        - dps_val: false
+          icon: "mdi:air-humidifier-off"
+          icon_priority: 1
+        - dps_val: true
+          icon: "mdi:air-humidifier"
+          icon_priority: 3
+    - id: 2
+      type: integer
+      name: humidity
+      range:
+        min: 35
+        max: 80
+      mapping:
+        - step: 5
+    - id: 5
+      name: mode
+      type: string
+      mapping:
+        - dps_val: "Smart"
+          value: "Smart"
+        - dps_val: "Air_purifier"
+          value: "Air Purifier"
+          icon: "mdi:air-purifier"
+          icon_priority: 2
+    - id: 6
+      type: integer
+      name: current_humidity
+      readonly: true
+    - id: 19
+      type: integer
+      name: error_code
+      readonly: true
+secondary_entities:
+  - entity: sensor
+    class: humidity
+    name: Current Humidity
+    dps:
+      - id: 6
+        type: integer
+        name: sensor
+        unit: "%"
+        class: measurement
+        readonly: true
+  - entity: light
+    name: Display
+    category: config
+    dps:
+      - id: 101
+        type: boolean
+        name: switch
+        mapping:
+          - dps_val: true
+            icon: "mdi:led-on"
+          - dps_val: false
+            icon: "mdi:led-off"
+  - entity: switch
+    name: Sleep
+    category: config
+    dps:
+      - id: 104
+        type: boolean
+        name: switch
+        mapping:
+          - dps_val: true
+            icon: "mdi:sleep"
+          - dps_val: false
+            icon: "mdi:sleep-off"
+  - entity: binary_sensor
+    name: Tank
+    category: diagnostic
+    dps:
+      - id: 19
+        name: sensor
+        type: integer
+        mapping:
+          - dps_val: 1
+            value: true
+            icon: "mdi:flask-empty"
+          - dps_val: 0
+            value: false
+            icon: "mdi:flask-empty-outline"

+ 10 - 0
tests/const.py

@@ -310,6 +310,16 @@ ELECTRIQ_CD12PW_DEHUMIDIFIER_PAYLOAD = {
     "103": 30,
 }
 
+ELECTRIQ_CD12PWV2_DEHUMIDIFIER_PAYLOAD = {
+    "1": True,
+    "2": 45,
+    "5": "Smart",
+    "6": 39,
+    "19": 0,
+    "101": True,
+    "104": False,
+}
+
 ELECTRIQ_DESD9LW_DEHUMIDIFIER_PAYLOAD = {
     "1": True,
     "2": 50,

+ 1 - 1
tests/devices/test_electriq_cd12_dehumidifier.py

@@ -21,7 +21,7 @@ LIGHT_DPS = "101"
 CURRENTTEMP_DPS = "103"
 
 
-class TestElectriqCD20ProDehumidifier(
+class TestElectriqCD12PWDehumidifier(
     BasicLightTests, MultiSensorTests, SwitchableTests, TuyaDeviceTestCase
 ):
     __test__ = True

+ 142 - 0
tests/devices/test_electriq_cd12pwv2_dehumidifier.py

@@ -0,0 +1,142 @@
+from homeassistant.components.humidifier import SUPPORT_MODES
+from homeassistant.const import (
+    DEVICE_CLASS_HUMIDITY,
+    PERCENTAGE,
+)
+
+from ..const import ELECTRIQ_CD12PWV2_DEHUMIDIFIER_PAYLOAD
+from ..helpers import assert_device_properties_set
+from ..mixins.binary_sensor import BasicBinarySensorTests
+from ..mixins.light import BasicLightTests
+from ..mixins.sensor import BasicSensorTests
+from ..mixins.switch import BasicSwitchTests, SwitchableTests
+from .base_device_tests import TuyaDeviceTestCase
+
+SWITCH_DPS = "1"
+HUMIDITY_DPS = "2"
+MODE_DPS = "5"
+CURRENTHUMID_DPS = "6"
+ERROR_DPS = "19"
+LIGHT_DPS = "101"
+SLEEP_DPS = "104"
+
+
+class TestElectriqCD12PWV2Dehumidifier(
+    BasicBinarySensorTests,
+    BasicLightTests,
+    BasicSensorTests,
+    BasicSwitchTests,
+    SwitchableTests,
+    TuyaDeviceTestCase,
+):
+    __test__ = True
+
+    def setUp(self):
+        self.setUpForConfig(
+            "electriq_cd12pwv2_dehumidifier.yaml",
+            ELECTRIQ_CD12PWV2_DEHUMIDIFIER_PAYLOAD,
+        )
+        self.subject = self.entities.get("humidifier")
+        self.setUpSwitchable(SWITCH_DPS, self.subject)
+        self.setUpBasicBinarySensor(
+            ERROR_DPS, self.entities.get("binary_sensor_tank"), testdata=(1, 0)
+        )
+        self.setUpBasicLight(LIGHT_DPS, self.entities.get("light_display"))
+        self.setUpBasicSensor(
+            CURRENTHUMID_DPS,
+            self.entities.get("sensor_current_humidity"),
+            unit=PERCENTAGE,
+            device_class=DEVICE_CLASS_HUMIDITY,
+            state_class="measurement",
+        )
+        self.setUpBasicSwitch(
+            SLEEP_DPS,
+            self.entities.get("switch_sleep"),
+        )
+        self.mark_secondary(["light_display", "switch_sleep", "binary_sensor_tank"])
+
+    def test_supported_features(self):
+        self.assertEqual(self.subject.supported_features, SUPPORT_MODES)
+
+    def test_icon(self):
+        """Test that the icon is as expected."""
+        self.dps[SWITCH_DPS] = True
+        self.dps[MODE_DPS] = "Smart"
+        self.assertEqual(self.subject.icon, "mdi:air-humidifier")
+
+        self.dps[SWITCH_DPS] = False
+        self.assertEqual(self.subject.icon, "mdi:air-humidifier-off")
+
+        self.dps[MODE_DPS] = "Air_purifier"
+        self.assertEqual(self.subject.icon, "mdi:air-humidifier-off")
+
+        self.dps[SWITCH_DPS] = True
+        self.assertEqual(self.subject.icon, "mdi:air-purifier")
+
+        self.dps[LIGHT_DPS] = True
+        self.assertEqual(self.basicLight.icon, "mdi:led-on")
+        self.dps[LIGHT_DPS] = False
+        self.assertEqual(self.basicLight.icon, "mdi:led-off")
+
+        self.dps[SLEEP_DPS] = True
+        self.assertEqual(self.basicSwitch.icon, "mdi:sleep")
+        self.dps[SLEEP_DPS] = False
+        self.assertEqual(self.basicSwitch.icon, "mdi:sleep-off")
+
+    def test_min_target_humidity(self):
+        self.assertEqual(self.subject.min_humidity, 35)
+
+    def test_max_target_humidity(self):
+        self.assertEqual(self.subject.max_humidity, 80)
+
+    def test_target_humidity(self):
+        self.dps[HUMIDITY_DPS] = 55
+        self.assertEqual(self.subject.target_humidity, 55)
+
+    async def test_set_target_humidity_rounds_up_to_5_percent(self):
+        async with assert_device_properties_set(
+            self.subject._device,
+            {HUMIDITY_DPS: 55},
+        ):
+            await self.subject.async_set_humidity(53)
+
+    async def test_set_target_humidity_rounds_down_to_5_percent(self):
+        async with assert_device_properties_set(
+            self.subject._device,
+            {HUMIDITY_DPS: 50},
+        ):
+            await self.subject.async_set_humidity(52)
+
+    def test_mode(self):
+        self.dps[MODE_DPS] = "Smart"
+        self.assertEqual(self.subject.mode, "Smart")
+        self.dps[MODE_DPS] = "Air_purifier"
+        self.assertEqual(self.subject.mode, "Air Purifier")
+
+    async def test_set_mode_to_smart(self):
+        async with assert_device_properties_set(
+            self.subject._device,
+            {
+                MODE_DPS: "Smart",
+            },
+        ):
+            await self.subject.async_set_mode("Smart")
+            self.subject._device.anticipate_property_value.assert_not_called()
+
+    async def test_set_mode_to_air_purify(self):
+        async with assert_device_properties_set(
+            self.subject._device,
+            {
+                MODE_DPS: "Air_purifier",
+            },
+        ):
+            await self.subject.async_set_mode("Air Purifier")
+            self.subject._device.anticipate_property_value.assert_not_called()
+
+    def test_extra_state_attributes(self):
+        self.dps[CURRENTHUMID_DPS] = 50
+        self.dps[ERROR_DPS] = 2
+        self.assertDictEqual(
+            self.subject.extra_state_attributes,
+            {"current_humidity": 50, "error_code": 2},
+        )