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

Add tests and documentation for JJPro dehumidifier.

Tweak some other configs to standardize anti-frost icons to snowflake-melt.
Jason Rumney 4 лет назад
Родитель
Сommit
6cf47273f1

+ 2 - 0
ACKNOWLEDGEMENTS.md

@@ -66,3 +66,5 @@ Further device support has been made with the assistance of users.  Please consi
  - [PaulJoosten](https://github.com/PaulJoosten) for assistance in figuring out the similarities and capabilities of different Eurom heaters.
  - [jdavidr17](https://github.com/jdavidr17) for assistance with discovering timer parameters for switches.
  - [miannelli516](https://github.com/miannelli516) for assistance with TR9B thermostats.
+ - [edwinyoo44](https://github.com/edwinyoo44) for contributing support for JJPro JPD01 dehumidifiers.
+ 

+ 1 - 0
README.md

@@ -103,6 +103,7 @@ the device will not work despite being listed below.
 - ElectriQ CD25PRO-LE-V2 dehumidifier
 - ElectriQ DESD9LW dehumidifier
 - Kogan SmarterHome 7L Desiccant dehumidifier
+- JJPro JPD01 dehumidifer
 
 ### Humidifiers
 - Eanons QT-JS2014 Purifying humidifier

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

@@ -72,7 +72,7 @@ primary_entity:
 secondary_entities:
   - entity: switch
     name: Anti-frost
-    icon: "mdi:snowflake"
+    icon: "mdi:snowflake-melt"
     category: config
     dps:
       - id: 10

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

@@ -283,7 +283,7 @@ secondary_entities:
   - entity: binary_sensor
     name: defrost
     class: cold
-    icon: "mdi:snowflake"
+    icon: "mdi:snowflake-melt"
     category: diagnostic
     dps:
       - id: 105

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

@@ -130,7 +130,7 @@ secondary_entities:
   - entity: binary_sensor
     name: Defrost
     class: cold
-    icon: "mdi:snowflake"
+    icon: "mdi:snowflake-melt"
     category: diagnostic
     dps:
       - id: 105

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

@@ -310,7 +310,7 @@ secondary_entities:
   - entity: switch
     category: config
     name: Anti-Frost
-    icon: "mdi:snowflake"
+    icon: "mdi:snowflake-melt"
     dps:
       - id: 9
         type: boolean

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

@@ -22,7 +22,7 @@ primary_entity:
           icon: "mdi:home-thermometer"
         - dps_val: "Anti_frozen"
           value: "away"
-          icon: "mdi:snowflake"
+          icon: "mdi:snowflake-melt"
         - dps_val: "Manual"
           value: "manual"
           icon: "mdi:cursor-pointer"

+ 16 - 0
tests/const.py

@@ -38,7 +38,23 @@ EUROM_WALLDESIGNHEAT2000_HEATER_PAYLOAD = {
 
 GECO_HEATER_PAYLOAD = {"1": True, "2": True, "3": 30, "4": 25, "5": 0, "6": 0}
 
+JJPRO_JPD01_PAYLOAD = {
+    "1": True,
+    "2": "0",
+    "4": 50,
+    "5": True,
+    "6": "1",
+    "11": 0,
+    "12": 0,
+    "101": False,
+    "102": False,
+    "103": 20,
+    "104": 62,
+    "105": False,
+}
+
 KOGAN_HEATER_PAYLOAD = {"2": 30, "3": 25, "4": "Low", "6": True, "7": True, "8": 0}
+
 KOGAN_KAWFHTP_HEATER_PAYLOAD = {
     "1": True,
     "2": True,

+ 260 - 0
tests/devices/test_jjpro_jpd01_dehumidifier.py

@@ -0,0 +1,260 @@
+from homeassistant.components.binary_sensor import (
+    DEVICE_CLASS_COLD,
+    DEVICE_CLASS_PROBLEM,
+)
+from homeassistant.components.fan import SUPPORT_SET_SPEED
+from homeassistant.components.humidifier import SUPPORT_MODES
+from homeassistant.const import (
+    DEVICE_CLASS_HUMIDITY,
+    DEVICE_CLASS_TEMPERATURE,
+    PERCENTAGE,
+    TIME_HOURS,
+    TEMP_CELSIUS,
+)
+from ..const import JJPRO_JPD01_PAYLOAD
+from ..helpers import assert_device_properties_set
+from ..mixins.binary_sensor import MultiBinarySensorTests
+from ..mixins.number import BasicNumberTests
+from ..mixins.sensor import MultiSensorTests
+from ..mixins.switch import MultiSwitchTests, SwitchableTests
+from .base_device_tests import TuyaDeviceTestCase
+
+SWITCH_DPS = "1"
+MODE_DPS = "2"
+HUMIDITY_DPS = "4"
+ANION_DPS = "5"
+FAN_DPS = "6"
+ERROR_DPS = "11"
+TIMER_DPS = "12"
+UNKNOWN101_DPS = "101"
+SLEEP_DPS = "102"
+CURRENTTEMP_DPS = "103"
+CURRENTHUMID_DPS = "104"
+DEFROST_DPS = "105"
+
+
+class TestJJProJPD01Dehumidifier(
+    BasicNumberTests,
+    MultiBinarySensorTests,
+    MultiSensorTests,
+    MultiSwitchTests,
+    SwitchableTests,
+    TuyaDeviceTestCase,
+):
+    __test__ = True
+
+    def setUp(self):
+        self.setUpForConfig("jjpro_jpd01_dehumidifier.yaml", JJPRO_JPD01_PAYLOAD)
+        self.subject = self.entities.get("humidifier")
+        self.setUpSwitchable(SWITCH_DPS, self.subject)
+        self.fan = self.entities.get("fan")
+        self.setUpBasicNumber(
+            TIMER_DPS,
+            self.entities.get("number_timer"),
+            max=24,
+            unit=TIME_HOURS,
+        )
+        self.setUpMultiBinarySensors(
+            [
+                {
+                    "dps": ERROR_DPS,
+                    "name": "binary_sensor_tank",
+                    "device_class": DEVICE_CLASS_PROBLEM,
+                    "testdata": (1, 0),
+                },
+                {
+                    "dps": DEFROST_DPS,
+                    "name": "binary_sensor_defrost",
+                    "device_class": DEVICE_CLASS_COLD,
+                },
+            ]
+        )
+        self.setUpMultiSensors(
+            [
+                {
+                    "dps": CURRENTHUMID_DPS,
+                    "name": "sensor_current_humidity",
+                    "device_class": DEVICE_CLASS_HUMIDITY,
+                    "state_class": "measurement",
+                    "unit": PERCENTAGE,
+                },
+                {
+                    "dps": CURRENTTEMP_DPS,
+                    "name": "sensor_current_temperature",
+                    "device_class": DEVICE_CLASS_TEMPERATURE,
+                    "state_class": "measurement",
+                    "unit": TEMP_CELSIUS,
+                },
+            ]
+        )
+        self.setUpMultiSwitch(
+            [
+                {
+                    "dps": SLEEP_DPS,
+                    "name": "switch_sleep",
+                },
+                {
+                    "dps": ANION_DPS,
+                    "name": "switch_ionizer",
+                },
+            ]
+        )
+        self.mark_secondary(
+            [
+                "binary_sensor_tank",
+                "binary_sensor_defrost",
+                "number_timer",
+            ]
+        )
+
+    def test_supported_features(self):
+        self.assertEqual(self.subject.supported_features, SUPPORT_MODES)
+        self.assertEqual(self.fan.supported_features, SUPPORT_SET_SPEED)
+
+    def test_icon(self):
+        """Test that the icon is as expected."""
+        self.dps[SWITCH_DPS] = True
+        self.dps[ANION_DPS] = False
+        self.dps[SLEEP_DPS] = False
+        self.dps[DEFROST_DPS] = False
+        self.dps[MODE_DPS] = "0"
+        self.assertEqual(self.subject.icon, "mdi:water-outline")
+
+        self.dps[SWITCH_DPS] = False
+        self.assertEqual(self.subject.icon, "mdi:air-humidifier-off")
+        self.dps[MODE_DPS] = "1"
+        self.assertEqual(self.subject.icon, "mdi:air-humidifier-off")
+
+        self.dps[SWITCH_DPS] = True
+        self.assertEqual(self.subject.icon, "mdi:water-plus-outline")
+        self.dps[MODE_DPS] = "2"
+        self.assertEqual(self.subject.icon, "mdi:tshirt-crew-outline")
+        self.dps[MODE_DPS] = "3"
+        self.assertEqual(self.subject.icon, "mdi:tailwind")
+        self.dps[ERROR_DPS] = 8
+        self.assertEqual(self.subject.icon, "mdi:cup-water")
+        self.dps[DEFROST_DPS] = True
+        self.assertEqual(self.subject.icon, "mdi:cup-water")
+        self.dps[ERROR_DPS] = 0
+        self.assertEqual(self.subject.icon, "mdi:snowflake-melt")
+
+    def test_min_target_humidity(self):
+        self.assertEqual(self.subject.min_humidity, 30)
+
+    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_fan_turn_on(self):
+        async with assert_device_properties_set(
+            self.subject._device, {SWITCH_DPS: True}
+        ):
+            await self.fan.async_turn_on()
+
+    async def test_fan_turn_off(self):
+        async with assert_device_properties_set(
+            self.subject._device, {SWITCH_DPS: False}
+        ):
+            await self.fan.async_turn_off()
+
+    def test_modes(self):
+        self.assertCountEqual(
+            self.subject.available_modes,
+            [
+                "Normal",
+                "Continuous",
+                "Strong",
+                "Ventilation",
+            ],
+        )
+
+    def test_mode(self):
+        self.dps[MODE_DPS] = "0"
+        self.assertEqual(self.subject.mode, "Normal")
+        self.dps[MODE_DPS] = "1"
+        self.assertEqual(self.subject.mode, "Continuous")
+        self.dps[MODE_DPS] = "2"
+        self.assertEqual(self.subject.mode, "Strong")
+        self.dps[MODE_DPS] = "3"
+        self.assertEqual(self.subject.mode, "Ventilation")
+
+    async def test_set_mode_to_normal(self):
+        async with assert_device_properties_set(
+            self.subject._device,
+            {
+                MODE_DPS: "0",
+            },
+        ):
+            await self.subject.async_set_mode("Normal")
+            self.subject._device.anticipate_property_value.assert_not_called()
+
+    async def test_set_mode_to_continuous(self):
+        async with assert_device_properties_set(
+            self.subject._device,
+            {
+                MODE_DPS: "1",
+            },
+        ):
+            await self.subject.async_set_mode("Continuous")
+            self.subject._device.anticipate_property_value.assert_not_called()
+
+    async def test_set_mode_to_strong(self):
+        async with assert_device_properties_set(
+            self.subject._device,
+            {
+                MODE_DPS: "2",
+            },
+        ):
+            await self.subject.async_set_mode("Strong")
+            self.subject._device.anticipate_property_value.assert_not_called()
+
+    async def test_set_mode_to_ventilation(self):
+        async with assert_device_properties_set(
+            self.subject._device,
+            {
+                MODE_DPS: "3",
+            },
+        ):
+            await self.subject.async_set_mode("Ventilation")
+            self.subject._device.anticipate_property_value.assert_not_called()
+
+    def test_fan_speed_steps(self):
+        self.assertEqual(self.fan.speed_count, 2)
+
+    def test_fan_speed(self):
+        self.dps[FAN_DPS] = "1"
+        self.assertEqual(self.fan.percentage, 50)
+        self.dps[FAN_DPS] = "3"
+
+    async def test_fan_set_speed_to_low(self):
+        async with assert_device_properties_set(
+            self.subject._device,
+            {
+                FAN_DPS: "1",
+            },
+        ):
+            await self.fan.async_set_percentage(50)
+
+    async def test_fan_set_speed_to_high(self):
+        async with assert_device_properties_set(
+            self.subject._device,
+            {
+                FAN_DPS: "3",
+            },
+        ):
+            await self.fan.async_set_percentage(100)
+
+    def test_extra_state_attributes(self):
+        self.dps[UNKNOWN101_DPS] = True
+        self.dps[ERROR_DPS] = 5
+        self.assertDictEqual(
+            self.subject.extra_state_attributes,
+            {
+                "error": 5,
+                "unknown_101": True,
+            },
+        )
+        self.assertEqual(self.fan.extra_state_attributes, {})

+ 1 - 1
tests/devices/test_minco_mh1823d_thermostat.py

@@ -172,7 +172,7 @@ class TestMincoMH1823DThermostat(
         self.dps[HVACACTION_DPS] = "stop"
         self.assertEqual(self.subject.icon, "mdi:thermometer-off")
 
-        self.assertEqual(self.basicSwitch.icon, "mdi:snowflake")
+        self.assertEqual(self.basicSwitch.icon, "mdi:snowflake-melt")
 
     def test_temperature_unit(self):
         self.dps[UNIT_DPS] = "c"

+ 1 - 1
tests/devices/test_saswell_c16_thermostat.py

@@ -139,7 +139,7 @@ class TestSaswellC16Thermostat(
         self.dps[PRESET_DPS] = "Manual"
         self.assertEqual(self.subject.icon, "mdi:cursor-pointer")
         self.dps[PRESET_DPS] = "Anti_frozen"
-        self.assertEqual(self.subject.icon, "mdi:snowflake")
+        self.assertEqual(self.subject.icon, "mdi:snowflake-melt")
         self.dps[LOCK_DPS] = True
         self.assertEqual(self.basicLock.icon, "mdi:hand-back-right-off")
         self.dps[LOCK_DPS] = False