瀏覽代碼

Add support for Vork VK6067AW Purifier

Issue #135
Jason Rumney 4 年之前
父節點
當前提交
1df1bc4268

+ 109 - 0
custom_components/tuya_local/devices/vork_vk6067aw_purifier.yaml

@@ -0,0 +1,109 @@
+name: Vork VK-6067AW Air Purifier
+products:
+  - id: trpege6ebn8at1el
+primary_entity:
+  entity: fan
+  icon: "mdi:air-purifier"
+  dps:
+    - id: 1
+      name: switch
+      type: boolean
+    - id: 4
+      type: string
+      name: preset_mode
+      mapping:
+        - dps_val: "low"
+          value: "Low"
+        - dps_val: "mid"
+          value: "Mid"
+        - dps_val: "high"
+          value: "High"
+        - dps_val: "auto"
+          value: "Auto"
+        - dps_val: "sleep"
+          value: "Sleep"
+    - id: 22
+      name: error_code
+      type: integer
+secondary_entities:
+  - entity: sensor
+    name: Filter
+    category: diagnostic
+    icon: "mdi:air-filter"
+    dps:
+      - id: 5
+        name: sensor
+        type: integer
+        unit: "%"
+  - entity: light
+    category: config
+    dps:
+      - id: 8
+        type: boolean
+        name: switch
+        mapping:
+            - dps_val: true
+              icon: "mdi:led-on"
+            - dps_val: false
+              icon: "mdi:led-off"
+  - entity: switch
+    name: Filter Reset
+    category: config
+    icon: "mdi:refresh"
+    dps:
+      - id: 11
+        type: boolean
+        name: switch
+  - entity: select
+    name: Timer
+    category: config
+    icon: "mdi:timer"
+    dps:
+      - id: 18
+        type: string
+        name: option
+        mapping:
+          - dps_val: cancel
+            value: "off"
+          - dps_val: "1h"
+            value: "1 hour"
+          - dps_val: "2h"
+            value: "2 hours" 
+  - entity: sensor
+    name: Timer
+    category: diagnostic
+    icon: "mdi:timer"
+    dps:
+      - id: 19
+        name: sensor
+        type: integer
+        unit: min
+  - entity: sensor
+    name: Air Quality
+    category: diagnostic
+    icon: "mdi:air-filter"
+    dps:
+      - id: 21
+        name: sensor
+        type: string
+        mapping:
+          - dps_val: great
+            value: "Great"
+          - dps_val: "good"
+            value: "Good"
+          - dps_val: "medium"
+            value: "Medium" 
+          - dps_val: "severe"
+            value: "Severe" 
+  - entity: binary_sensor
+    name: Error
+    category: diagnostic
+    class: problem
+    dps:
+      - id: 22
+        name: sensor
+        type: bitfield
+        mapping:
+          - dps_val: 0
+            value: false
+          - value: true

+ 12 - 0
tests/const.py

@@ -1019,3 +1019,15 @@ HIMOX_H06_PURIFIER_PAYLOAD = {
     "22": "medium",
     "101": "calcle",
 }
+
+VORK_VK6067_PURIFIER_PAYLOAD = {
+    "1": True,
+    "4": "auto",
+    "5": 80,
+    "8": True,
+    "11": False,
+    "18": "cancel",
+    "19": 0,
+    "21": "good",
+    "22": 0,
+}

+ 134 - 0
tests/devices/test_vork_vk6067aw_purifier.py

@@ -0,0 +1,134 @@
+from homeassistant.components.binary_sensor import DEVICE_CLASS_PROBLEM
+from homeassistant.components.fan import SUPPORT_PRESET_MODE
+from homeassistant.const import (
+    PERCENTAGE,
+    TIME_MINUTES,
+)
+
+from ..const import VORK_VK6067_PURIFIER_PAYLOAD
+from ..helpers import assert_device_properties_set
+from ..mixins.binary_sensor import BasicBinarySensorTests
+from ..mixins.light import BasicLightTests
+from ..mixins.select import BasicSelectTests
+from ..mixins.sensor import MultiSensorTests
+from ..mixins.switch import BasicSwitchTests, SwitchableTests
+from .base_device_tests import TuyaDeviceTestCase
+
+SWITCH_DPS = "1"
+MODE_DPS = "4"
+FILTER_DPS = "5"
+LIGHT_DPS = "8"
+RESET_DPS = "11"
+TIMER_DPS = "18"
+COUNTDOWN_DPS = "19"
+AQI_DPS = "21"
+ERROR_DPS = "22"
+
+
+class TestVorkVK6267AWPurifier(
+    BasicBinarySensorTests,
+    BasicLightTests,
+    BasicSelectTests,
+    BasicSwitchTests,
+    MultiSensorTests,
+    SwitchableTests,
+    TuyaDeviceTestCase,
+):
+    __test__ = True
+
+    def setUp(self):
+        self.setUpForConfig("vork_vk6067aw_purifier.yaml", VORK_VK6067_PURIFIER_PAYLOAD)
+        self.subject = self.entities["fan"]
+        self.setUpSwitchable(SWITCH_DPS, self.subject)
+        self.setUpBasicBinarySensor(
+            ERROR_DPS,
+            self.entities.get("binary_sensor_error"),
+            device_class=DEVICE_CLASS_PROBLEM,
+            testdata=(1, 0),
+        )
+        self.setUpBasicLight(LIGHT_DPS, self.entities.get("light"))
+        self.setUpBasicSelect(
+            TIMER_DPS,
+            self.entities.get("select_timer"),
+            {
+                "cancel": "off",
+                "1h": "1 hour",
+                "2h": "2 hours",
+            },
+        )
+        self.setUpBasicSwitch(RESET_DPS, self.entities.get("switch_filter_reset"))
+        self.setUpMultiSensors(
+            [
+                {
+                    "dps": AQI_DPS,
+                    "name": "sensor_air_quality",
+                    "testdata": ("great", "Great"),
+                },
+                {
+                    "dps": COUNTDOWN_DPS,
+                    "name": "sensor_timer",
+                    "unit": TIME_MINUTES,
+                },
+                {
+                    "dps": FILTER_DPS,
+                    "name": "sensor_filter",
+                    "unit": PERCENTAGE,
+                },
+            ]
+        )
+        self.mark_secondary(
+            [
+                "binary_sensor_error",
+                "light",
+                "select_timer",
+                "sensor_air_quality",
+                "sensor_filter",
+                "sensor_timer",
+                "switch_filter_reset",
+            ]
+        )
+
+    def test_supported_features(self):
+        self.assertEqual(
+            self.subject.supported_features,
+            SUPPORT_PRESET_MODE,
+        )
+
+    def test_preset_modes(self):
+        self.assertCountEqual(
+            self.subject.preset_modes,
+            ["Low", "Mid", "High", "Auto", "Sleep"],
+        )
+
+    def test_preset_mode(self):
+        self.dps[MODE_DPS] = "low"
+        self.assertEqual(self.subject.preset_mode, "Low")
+        self.dps[MODE_DPS] = "mid"
+        self.assertEqual(self.subject.preset_mode, "Mid")
+        self.dps[MODE_DPS] = "high"
+        self.assertEqual(self.subject.preset_mode, "High")
+        self.dps[MODE_DPS] = "auto"
+        self.assertEqual(self.subject.preset_mode, "Auto")
+        self.dps[MODE_DPS] = "sleep"
+        self.assertEqual(self.subject.preset_mode, "Sleep")
+
+    async def test_set_preset_to_low(self):
+        async with assert_device_properties_set(
+            self.subject._device,
+            {MODE_DPS: "low"},
+        ):
+            await self.subject.async_set_preset_mode("Low")
+
+    async def test_set_preset_to_auto(self):
+        async with assert_device_properties_set(
+            self.subject._device,
+            {MODE_DPS: "auto"},
+        ):
+            await self.subject.async_set_preset_mode("Auto")
+
+    async def test_set_preset_to_sleep(self):
+        async with assert_device_properties_set(
+            self.subject._device,
+            {MODE_DPS: "sleep"},
+        ):
+            await self.subject.async_set_preset_mode("Sleep")