We are currently solving the following issue within our repository. Here is the issue text:
--- BEGIN ISSUE ---
[BUG] TS0601 _TZE200_yvx5lh6k (Smart Air Box) not finding the quirk
I purchased a Tuya Smart Air Box with a Zigbee ID of: "_TZE200_8ygsuhe1" and it is working as expected. I purchased a second and it came with a Zigbee ID of: "_TZE200_yvx5lh6k" and it is not working as expected. The [Zigbee Device Compatibility Repository](https://zigbee.blakadder.com/Tuya_RSH-AirBox01.html) claims that both of the Zigbee IDs should be working.

**Here is the Zigbee device signature from the Smart Air box that is working correctly (_TZE200_8ygsuhe1).**

```
{
  "node_descriptor": "NodeDescriptor(logical_type=<LogicalType.Router: 1>, complex_descriptor_available=0, user_descriptor_available=0, reserved=0, aps_flags=0, frequency_band=<FrequencyBand.Freq2400MHz: 8>, mac_capability_flags=<MACCapabilityFlags.AllocateAddress|RxOnWhenIdle|MainsPowered|FullFunctionDevice: 142>, manufacturer_code=4098, maximum_buffer_size=82, maximum_incoming_transfer_size=82, server_mask=11264, maximum_outgoing_transfer_size=82, descriptor_capability_field=<DescriptorCapability.NONE: 0>, *allocate_address=True, *is_alternate_pan_coordinator=False, *is_coordinator=False, *is_end_device=False, *is_full_function_device=True, *is_mains_powered=True, *is_receiver_on_when_idle=True, *is_router=True, *is_security_capable=False)",
  "endpoints": {
    "1": {
      "profile_id": 260,
      "device_type": "0x0100",
      "in_clusters": [
        "0x0000",
        "0x0004",
        "0x0005",
        "0x0402",
        "0x0405",
        "0x040d",
        "0x042b",
        "0x042e",
        "0xef00"
      ],
      "out_clusters": [
        "0x000a",
        "0x0019"
      ]
    }
  },
  "manufacturer": "_TZE200_8ygsuhe1",
  "model": "TS0601",
  "class": "zhaquirks.tuya.air.ts0601_air_quality.TuyaCO2Sensor"
}

```
**Here is the Zigbee device signature from the Smart Air Box that is not working (_TZE200_yvx5lh6k)**

```
{
  "node_descriptor": "NodeDescriptor(logical_type=<LogicalType.Router: 1>, complex_descriptor_available=0, user_descriptor_available=0, reserved=0, aps_flags=0, frequency_band=<FrequencyBand.Freq2400MHz: 8>, mac_capability_flags=<MACCapabilityFlags.AllocateAddress|RxOnWhenIdle|MainsPowered|FullFunctionDevice: 142>, manufacturer_code=4098, maximum_buffer_size=82, maximum_incoming_transfer_size=82, server_mask=11264, maximum_outgoing_transfer_size=82, descriptor_capability_field=<DescriptorCapability.NONE: 0>, *allocate_address=True, *is_alternate_pan_coordinator=False, *is_coordinator=False, *is_end_device=False, *is_full_function_device=True, *is_mains_powered=True, *is_receiver_on_when_idle=True, *is_router=True, *is_security_capable=False)",
  "endpoints": {
    "1": {
      "profile_id": 260,
      "device_type": "0x0051",
      "in_clusters": [
        "0x0000",
        "0x0004",
        "0x0005",
        "0xef00"
      ],
      "out_clusters": [
        "0x000a",
        "0x0019"
      ]
    }
  },
  "manufacturer": "_TZE200_yvx5lh6k",
  "model": "TS0601",
  "class": "zigpy.device.Device"
}

```
**Here is an interesting excerpt from the logs:**

```
2021-08-23 10:08:18 DEBUG (MainThread) [zigpy.quirks.registry] Checking quirks for _TZE200_8ygsuhe1 TS0601 (84:fd:27:ff:fe:d6:98:2f)
2021-08-23 10:08:18 DEBUG (MainThread) [zigpy.quirks.registry] Considering <class 'zhaquirks.tuya.air.ts0601_air_quality.TuyaCO2Sensor'>
2021-08-23 10:08:18 DEBUG (MainThread) [zigpy.quirks.registry] Found custom device replacement for 84:fd:27:ff:fe:d6:98:2f: <class 'zhaquirks.tuya.air.ts0601_air_quality.TuyaCO2Sensor'>
2021-08-23 10:08:18 DEBUG (MainThread) [zigpy.quirks.registry] Checking quirks for _TZE200_yvx5lh6k TS0601 (0c:43:14:ff:fe:88:14:b4)
2021-08-23 10:08:18 DEBUG (MainThread) [zigpy.quirks.registry] Considering <class 'zhaquirks.xbee.xbee_io.XBeeSensor'>
2021-08-23 10:08:18 DEBUG (MainThread) [zigpy.quirks.registry] Fail because endpoint list mismatch: {232, 230} {1}
2021-08-23 10:08:18 DEBUG (MainThread) [zigpy.quirks.registry] Considering <class 'zhaquirks.xbee.xbee3_io.XBee3Sensor'>
2021-08-23 10:08:18 DEBUG (MainThread) [zigpy.quirks.registry] Fail because endpoint list mismatch: {232, 230} {1}
2021-08-23 10:08:18 DEBUG (MainThread) [zigpy.quirks.registry] Considering <class 'zhaquirks.smartthings.tag_v4.SmartThingsTagV4'>
2021-08-23 10:08:18 DEBUG (MainThread) [zigpy.quirks.registry] Fail because device_type mismatch on at least one endpoint
2021-08-23 10:08:18 DEBUG (MainThread) [zigpy.quirks.registry] Considering <class 'zhaquirks.smartthings.multi.SmartthingsMultiPurposeSensor'>
2021-08-23 10:08:18 DEBUG (MainThread) [zigpy.quirks.registry] Fail because device_type mismatch on at least one endpoint
2021-08-23 10:08:18 DEBUG (MainThread) [zigpy.quirks.registry] Considering <class 'zhaquirks.netvox.z308e3ed.Z308E3ED'>
2021-08-23 10:08:18 DEBUG (MainThread) [zigpy.quirks.registry] Fail because device_type mismatch on at least one endpoint
2021-08-23 10:08:18 DEBUG (MainThread) [zigpy.quirks.registry] Considering <class 'zhaquirks.gledopto.soposhgu10.SoposhGU10'>
2021-08-23 10:08:18 DEBUG (MainThread) [zigpy.quirks.registry] Fail because endpoint list mismatch: {11, 13} {1}
2021-08-23 10:08:18 DEBUG (MainThread) [zigpy.quirks.registry] Considering <class 'bellows.zigbee.application.EZSPCoordinator'>
2021-08-23 10:08:18 DEBUG (MainThread) [zigpy.quirks.registry] Fail because device_type mismatch on at least one endpoint


```

--- END ISSUE ---

Below are some code segments, each from a relevant file. One or more of these files may contain bugs.
--- BEGIN FILES ---
Path: `zhaquirks/tuya/air/ts0601_air_quality.py`
Content:
```
1 """Tuya Air Quality sensor."""
2 
3 from zigpy.profiles import zha
4 from zigpy.quirks import CustomDevice
5 from zigpy.zcl.clusters.general import Basic, GreenPowerProxy, Groups, Ota, Scenes, Time
6 
7 from zhaquirks.const import (
8     DEVICE_TYPE,
9     ENDPOINTS,
10     INPUT_CLUSTERS,
11     MODELS_INFO,
12     OUTPUT_CLUSTERS,
13     PROFILE_ID,
14 )
15 from zhaquirks.tuya.air import (
16     TuyaAirQualityCO2,
17     TuyaAirQualityFormaldehyde,
18     TuyaAirQualityHumidity,
19     TuyaAirQualityTemperature,
20     TuyaAirQualityVOC,
21     TuyaCO2ManufCluster,
22 )
23 
24 
25 class TuyaCO2Sensor(CustomDevice):
26     """Tuya Air quality device."""
27 
28     signature = {
29         # NodeDescriptor(logical_type=<LogicalType.Router: 1>, complex_descriptor_available=0, user_descriptor_available=0, reserved=0, aps_flags=0, frequency_band=<FrequencyBand.Freq2400MHz: 8>, mac_capability_flags=<MACCapabilityFlags.AllocateAddress|RxOnWhenIdle|MainsPowered|FullFunctionDevice: 142>, manufacturer_code=4098, maximum_buffer_size=82, maximum_incoming_transfer_size=82, server_mask=11264, maximum_outgoing_transfer_size=82, descriptor_capability_field=<DescriptorCapability.0: 0>, *allocate_address=True, *is_alternate_pan_coordinator=False, *is_coordinator=False, *is_end_device=False, *is_full_function_device=True, *is_mains_powered=True, *is_receiver_on_when_idle=True, *is_router=True, *is_security_capable=False)]
30         # device_version=1
31         # SizePrefixedSimpleDescriptor(endpoint=1, profile=260, device_type=81, device_version=1,
32         # input_clusters=[0, 4, 5, 61184],
33         # output_clusters=[25, 10])
34         MODELS_INFO: [
35             ("_TZE200_8ygsuhe1", "TS0601"),
36             ("_TZE200_yvx5lh6k", "TS0601"),
37         ],
38         ENDPOINTS: {
39             1: {
40                 PROFILE_ID: zha.PROFILE_ID,
41                 DEVICE_TYPE: zha.DeviceType.SMART_PLUG,
42                 INPUT_CLUSTERS: [
43                     Basic.cluster_id,
44                     Groups.cluster_id,
45                     Scenes.cluster_id,
46                     TuyaCO2ManufCluster.cluster_id,
47                 ],
48                 OUTPUT_CLUSTERS: [Time.cluster_id, Ota.cluster_id],
49             }
50         },
51     }
52 
53     replacement = {
54         ENDPOINTS: {
55             1: {
56                 DEVICE_TYPE: zha.DeviceType.ON_OFF_LIGHT,
57                 INPUT_CLUSTERS: [
58                     Basic.cluster_id,
59                     Groups.cluster_id,
60                     Scenes.cluster_id,
61                     TuyaCO2ManufCluster,
62                     TuyaAirQualityCO2,
63                     TuyaAirQualityFormaldehyde,
64                     TuyaAirQualityHumidity,
65                     TuyaAirQualityTemperature,
66                     TuyaAirQualityVOC,
67                 ],
68                 OUTPUT_CLUSTERS: [Time.cluster_id, Ota.cluster_id],
69             }
70         }
71     }
72 
73 
74 class TuyaCO2SensorGPP(CustomDevice):
75     """Tuya Air quality device with GPP."""
76 
77     signature = {
78         # NodeDescriptor(logical_type=<LogicalType.Router: 1>, complex_descriptor_available=0, user_descriptor_available=0, reserved=0, aps_flags=0, frequency_band=<FrequencyBand.Freq2400MHz: 8>, mac_capability_flags=<MACCapabilityFlags.AllocateAddress|RxOnWhenIdle|MainsPowered|FullFunctionDevice: 142>, manufacturer_code=4098, maximum_buffer_size=82, maximum_incoming_transfer_size=82, server_mask=11264, maximum_outgoing_transfer_size=82, descriptor_capability_field=<DescriptorCapability.0: 0>, *allocate_address=True, *is_alternate_pan_coordinator=False, *is_coordinator=False, *is_end_device=False, *is_full_function_device=True, *is_mains_powered=True, *is_receiver_on_when_idle=True, *is_router=True, *is_security_capable=False)]
79         # device_version=1
80         # SizePrefixedSimpleDescriptor(endpoint=1, profile=260, device_type=81, device_version=1,
81         # input_clusters=[0, 4, 5, 61184],
82         # output_clusters=[25, 10])
83         MODELS_INFO: [
84             ("_TZE200_ryfmq5rl", "TS0601"),
85         ],
86         ENDPOINTS: {
87             1: {
88                 PROFILE_ID: zha.PROFILE_ID,
89                 DEVICE_TYPE: zha.DeviceType.SMART_PLUG,
90                 INPUT_CLUSTERS: [
91                     Basic.cluster_id,
92                     Groups.cluster_id,
93                     Scenes.cluster_id,
94                     TuyaCO2ManufCluster.cluster_id,
95                 ],
96                 OUTPUT_CLUSTERS: [Time.cluster_id, Ota.cluster_id],
97             },
98             242: {
99                 # <SimpleDescriptor endpoint=242 profile=41440 device_type=97
100                 # input_clusters=[]
101                 # output_clusters=[33]
102                 PROFILE_ID: 41440,
103                 DEVICE_TYPE: 97,
104                 INPUT_CLUSTERS: [],
105                 OUTPUT_CLUSTERS: [GreenPowerProxy.cluster_id],
106             },
107         },
108     }
109 
110     replacement = {
111         ENDPOINTS: {
112             1: {
113                 DEVICE_TYPE: zha.DeviceType.ON_OFF_LIGHT,
114                 INPUT_CLUSTERS: [
115                     Basic.cluster_id,
116                     Groups.cluster_id,
117                     Scenes.cluster_id,
118                     TuyaCO2ManufCluster,
119                     TuyaAirQualityCO2,
120                     TuyaAirQualityFormaldehyde,
121                     TuyaAirQualityHumidity,
122                     TuyaAirQualityTemperature,
123                     TuyaAirQualityVOC,
124                 ],
125                 OUTPUT_CLUSTERS: [Time.cluster_id, Ota.cluster_id],
126             },
127             242: {
128                 PROFILE_ID: 41440,
129                 DEVICE_TYPE: 97,
130                 INPUT_CLUSTERS: [],
131                 OUTPUT_CLUSTERS: [GreenPowerProxy.cluster_id],
132             },
133         }
134     }
135
```
--- END FILES ---

Please first localize the bug based on the issue statement, and then generate a patch according to the `git diff` format fenced by three backticks.

Here is an example:

```diff
diff --git a/examples/server_async.py b/examples/server_async.py
--- a/examples/server_async.py
+++ b/examples/server_async.py
@@ -313,4 +313,4 @@
 
 
 if __name__ == "__main__":
-    asyncio.run(run_async_server("."), debug=True)
+    asyncio.run(run_async_server(), debug=True)
diff --git a/examples/server_sync.py b/examples/server_sync.py
--- a/examples/server_sync.py
+++ b/examples/server_sync.py
@@ -313,5 +313,5 @@
 
 
 if __name__ == "__main__":
-    server = run_sync_server(".")
+    server = run_sync_server()
     server.shutdown()

```

diff --git a/zhaquirks/tuya/air/ts0601_air_quality.py b/zhaquirks/tuya/air/ts0601_air_quality.py
--- a/zhaquirks/tuya/air/ts0601_air_quality.py
+++ b/zhaquirks/tuya/air/ts0601_air_quality.py
@@ -82,6 +82,7 @@
         # output_clusters=[25, 10])
         MODELS_INFO: [
             ("_TZE200_ryfmq5rl", "TS0601"),
+            ("_TZE200_yvx5lh6k", "TS0601"),
         ],
         ENDPOINTS: {
             1: {

{"golden_diff": "diff --git a/zhaquirks/tuya/air/ts0601_air_quality.py b/zhaquirks/tuya/air/ts0601_air_quality.py\n--- a/zhaquirks/tuya/air/ts0601_air_quality.py\n+++ b/zhaquirks/tuya/air/ts0601_air_quality.py\n@@ -82,6 +82,7 @@\n         # output_clusters=[25, 10])\n         MODELS_INFO: [\n             (\"_TZE200_ryfmq5rl\", \"TS0601\"),\n+            (\"_TZE200_yvx5lh6k\", \"TS0601\"),\n         ],\n         ENDPOINTS: {\n             1: {\n", "issue": "[BUG] TS0601 _TZE200_yvx5lh6k (Smart Air Box) not finding the quirk\nI purchased a Tuya Smart Air Box with a Zigbee ID of: \"_TZE200_8ygsuhe1\" and it is working as expected. I purchased a second and it came with a Zigbee ID of: \"_TZE200_yvx5lh6k\" and it is not working as expected. The [Zigbee Device Compatibility Repository](https://zigbee.blakadder.com/Tuya_RSH-AirBox01.html) claims that both of the Zigbee IDs should be working.\r\n\r\n**Here is the Zigbee device signature from the Smart Air box that is working correctly (_TZE200_8ygsuhe1).**\r\n\r\n```\r\n{\r\n  \"node_descriptor\": \"NodeDescriptor(logical_type=<LogicalType.Router: 1>, complex_descriptor_available=0, user_descriptor_available=0, reserved=0, aps_flags=0, frequency_band=<FrequencyBand.Freq2400MHz: 8>, mac_capability_flags=<MACCapabilityFlags.AllocateAddress|RxOnWhenIdle|MainsPowered|FullFunctionDevice: 142>, manufacturer_code=4098, maximum_buffer_size=82, maximum_incoming_transfer_size=82, server_mask=11264, maximum_outgoing_transfer_size=82, descriptor_capability_field=<DescriptorCapability.NONE: 0>, *allocate_address=True, *is_alternate_pan_coordinator=False, *is_coordinator=False, *is_end_device=False, *is_full_function_device=True, *is_mains_powered=True, *is_receiver_on_when_idle=True, *is_router=True, *is_security_capable=False)\",\r\n  \"endpoints\": {\r\n    \"1\": {\r\n      \"profile_id\": 260,\r\n      \"device_type\": \"0x0100\",\r\n      \"in_clusters\": [\r\n        \"0x0000\",\r\n        \"0x0004\",\r\n        \"0x0005\",\r\n        \"0x0402\",\r\n        \"0x0405\",\r\n        \"0x040d\",\r\n        \"0x042b\",\r\n        \"0x042e\",\r\n        \"0xef00\"\r\n      ],\r\n      \"out_clusters\": [\r\n        \"0x000a\",\r\n        \"0x0019\"\r\n      ]\r\n    }\r\n  },\r\n  \"manufacturer\": \"_TZE200_8ygsuhe1\",\r\n  \"model\": \"TS0601\",\r\n  \"class\": \"zhaquirks.tuya.air.ts0601_air_quality.TuyaCO2Sensor\"\r\n}\r\n\r\n```\r\n**Here is the Zigbee device signature from the Smart Air Box that is not working (_TZE200_yvx5lh6k)**\r\n\r\n```\r\n{\r\n  \"node_descriptor\": \"NodeDescriptor(logical_type=<LogicalType.Router: 1>, complex_descriptor_available=0, user_descriptor_available=0, reserved=0, aps_flags=0, frequency_band=<FrequencyBand.Freq2400MHz: 8>, mac_capability_flags=<MACCapabilityFlags.AllocateAddress|RxOnWhenIdle|MainsPowered|FullFunctionDevice: 142>, manufacturer_code=4098, maximum_buffer_size=82, maximum_incoming_transfer_size=82, server_mask=11264, maximum_outgoing_transfer_size=82, descriptor_capability_field=<DescriptorCapability.NONE: 0>, *allocate_address=True, *is_alternate_pan_coordinator=False, *is_coordinator=False, *is_end_device=False, *is_full_function_device=True, *is_mains_powered=True, *is_receiver_on_when_idle=True, *is_router=True, *is_security_capable=False)\",\r\n  \"endpoints\": {\r\n    \"1\": {\r\n      \"profile_id\": 260,\r\n      \"device_type\": \"0x0051\",\r\n      \"in_clusters\": [\r\n        \"0x0000\",\r\n        \"0x0004\",\r\n        \"0x0005\",\r\n        \"0xef00\"\r\n      ],\r\n      \"out_clusters\": [\r\n        \"0x000a\",\r\n        \"0x0019\"\r\n      ]\r\n    }\r\n  },\r\n  \"manufacturer\": \"_TZE200_yvx5lh6k\",\r\n  \"model\": \"TS0601\",\r\n  \"class\": \"zigpy.device.Device\"\r\n}\r\n\r\n```\r\n**Here is an interesting excerpt from the logs:**\r\n\r\n```\r\n2021-08-23 10:08:18 DEBUG (MainThread) [zigpy.quirks.registry] Checking quirks for _TZE200_8ygsuhe1 TS0601 (84:fd:27:ff:fe:d6:98:2f)\r\n2021-08-23 10:08:18 DEBUG (MainThread) [zigpy.quirks.registry] Considering <class 'zhaquirks.tuya.air.ts0601_air_quality.TuyaCO2Sensor'>\r\n2021-08-23 10:08:18 DEBUG (MainThread) [zigpy.quirks.registry] Found custom device replacement for 84:fd:27:ff:fe:d6:98:2f: <class 'zhaquirks.tuya.air.ts0601_air_quality.TuyaCO2Sensor'>\r\n2021-08-23 10:08:18 DEBUG (MainThread) [zigpy.quirks.registry] Checking quirks for _TZE200_yvx5lh6k TS0601 (0c:43:14:ff:fe:88:14:b4)\r\n2021-08-23 10:08:18 DEBUG (MainThread) [zigpy.quirks.registry] Considering <class 'zhaquirks.xbee.xbee_io.XBeeSensor'>\r\n2021-08-23 10:08:18 DEBUG (MainThread) [zigpy.quirks.registry] Fail because endpoint list mismatch: {232, 230} {1}\r\n2021-08-23 10:08:18 DEBUG (MainThread) [zigpy.quirks.registry] Considering <class 'zhaquirks.xbee.xbee3_io.XBee3Sensor'>\r\n2021-08-23 10:08:18 DEBUG (MainThread) [zigpy.quirks.registry] Fail because endpoint list mismatch: {232, 230} {1}\r\n2021-08-23 10:08:18 DEBUG (MainThread) [zigpy.quirks.registry] Considering <class 'zhaquirks.smartthings.tag_v4.SmartThingsTagV4'>\r\n2021-08-23 10:08:18 DEBUG (MainThread) [zigpy.quirks.registry] Fail because device_type mismatch on at least one endpoint\r\n2021-08-23 10:08:18 DEBUG (MainThread) [zigpy.quirks.registry] Considering <class 'zhaquirks.smartthings.multi.SmartthingsMultiPurposeSensor'>\r\n2021-08-23 10:08:18 DEBUG (MainThread) [zigpy.quirks.registry] Fail because device_type mismatch on at least one endpoint\r\n2021-08-23 10:08:18 DEBUG (MainThread) [zigpy.quirks.registry] Considering <class 'zhaquirks.netvox.z308e3ed.Z308E3ED'>\r\n2021-08-23 10:08:18 DEBUG (MainThread) [zigpy.quirks.registry] Fail because device_type mismatch on at least one endpoint\r\n2021-08-23 10:08:18 DEBUG (MainThread) [zigpy.quirks.registry] Considering <class 'zhaquirks.gledopto.soposhgu10.SoposhGU10'>\r\n2021-08-23 10:08:18 DEBUG (MainThread) [zigpy.quirks.registry] Fail because endpoint list mismatch: {11, 13} {1}\r\n2021-08-23 10:08:18 DEBUG (MainThread) [zigpy.quirks.registry] Considering <class 'bellows.zigbee.application.EZSPCoordinator'>\r\n2021-08-23 10:08:18 DEBUG (MainThread) [zigpy.quirks.registry] Fail because device_type mismatch on at least one endpoint\r\n\r\n\r\n```\n", "before_files": [{"content": "\"\"\"Tuya Air Quality sensor.\"\"\"\n\nfrom zigpy.profiles import zha\nfrom zigpy.quirks import CustomDevice\nfrom zigpy.zcl.clusters.general import Basic, GreenPowerProxy, Groups, Ota, Scenes, Time\n\nfrom zhaquirks.const import (\n    DEVICE_TYPE,\n    ENDPOINTS,\n    INPUT_CLUSTERS,\n    MODELS_INFO,\n    OUTPUT_CLUSTERS,\n    PROFILE_ID,\n)\nfrom zhaquirks.tuya.air import (\n    TuyaAirQualityCO2,\n    TuyaAirQualityFormaldehyde,\n    TuyaAirQualityHumidity,\n    TuyaAirQualityTemperature,\n    TuyaAirQualityVOC,\n    TuyaCO2ManufCluster,\n)\n\n\nclass TuyaCO2Sensor(CustomDevice):\n    \"\"\"Tuya Air quality device.\"\"\"\n\n    signature = {\n        # NodeDescriptor(logical_type=<LogicalType.Router: 1>, complex_descriptor_available=0, user_descriptor_available=0, reserved=0, aps_flags=0, frequency_band=<FrequencyBand.Freq2400MHz: 8>, mac_capability_flags=<MACCapabilityFlags.AllocateAddress|RxOnWhenIdle|MainsPowered|FullFunctionDevice: 142>, manufacturer_code=4098, maximum_buffer_size=82, maximum_incoming_transfer_size=82, server_mask=11264, maximum_outgoing_transfer_size=82, descriptor_capability_field=<DescriptorCapability.0: 0>, *allocate_address=True, *is_alternate_pan_coordinator=False, *is_coordinator=False, *is_end_device=False, *is_full_function_device=True, *is_mains_powered=True, *is_receiver_on_when_idle=True, *is_router=True, *is_security_capable=False)]\n        # device_version=1\n        # SizePrefixedSimpleDescriptor(endpoint=1, profile=260, device_type=81, device_version=1,\n        # input_clusters=[0, 4, 5, 61184],\n        # output_clusters=[25, 10])\n        MODELS_INFO: [\n            (\"_TZE200_8ygsuhe1\", \"TS0601\"),\n            (\"_TZE200_yvx5lh6k\", \"TS0601\"),\n        ],\n        ENDPOINTS: {\n            1: {\n                PROFILE_ID: zha.PROFILE_ID,\n                DEVICE_TYPE: zha.DeviceType.SMART_PLUG,\n                INPUT_CLUSTERS: [\n                    Basic.cluster_id,\n                    Groups.cluster_id,\n                    Scenes.cluster_id,\n                    TuyaCO2ManufCluster.cluster_id,\n                ],\n                OUTPUT_CLUSTERS: [Time.cluster_id, Ota.cluster_id],\n            }\n        },\n    }\n\n    replacement = {\n        ENDPOINTS: {\n            1: {\n                DEVICE_TYPE: zha.DeviceType.ON_OFF_LIGHT,\n                INPUT_CLUSTERS: [\n                    Basic.cluster_id,\n                    Groups.cluster_id,\n                    Scenes.cluster_id,\n                    TuyaCO2ManufCluster,\n                    TuyaAirQualityCO2,\n                    TuyaAirQualityFormaldehyde,\n                    TuyaAirQualityHumidity,\n                    TuyaAirQualityTemperature,\n                    TuyaAirQualityVOC,\n                ],\n                OUTPUT_CLUSTERS: [Time.cluster_id, Ota.cluster_id],\n            }\n        }\n    }\n\n\nclass TuyaCO2SensorGPP(CustomDevice):\n    \"\"\"Tuya Air quality device with GPP.\"\"\"\n\n    signature = {\n        # NodeDescriptor(logical_type=<LogicalType.Router: 1>, complex_descriptor_available=0, user_descriptor_available=0, reserved=0, aps_flags=0, frequency_band=<FrequencyBand.Freq2400MHz: 8>, mac_capability_flags=<MACCapabilityFlags.AllocateAddress|RxOnWhenIdle|MainsPowered|FullFunctionDevice: 142>, manufacturer_code=4098, maximum_buffer_size=82, maximum_incoming_transfer_size=82, server_mask=11264, maximum_outgoing_transfer_size=82, descriptor_capability_field=<DescriptorCapability.0: 0>, *allocate_address=True, *is_alternate_pan_coordinator=False, *is_coordinator=False, *is_end_device=False, *is_full_function_device=True, *is_mains_powered=True, *is_receiver_on_when_idle=True, *is_router=True, *is_security_capable=False)]\n        # device_version=1\n        # SizePrefixedSimpleDescriptor(endpoint=1, profile=260, device_type=81, device_version=1,\n        # input_clusters=[0, 4, 5, 61184],\n        # output_clusters=[25, 10])\n        MODELS_INFO: [\n            (\"_TZE200_ryfmq5rl\", \"TS0601\"),\n        ],\n        ENDPOINTS: {\n            1: {\n                PROFILE_ID: zha.PROFILE_ID,\n                DEVICE_TYPE: zha.DeviceType.SMART_PLUG,\n                INPUT_CLUSTERS: [\n                    Basic.cluster_id,\n                    Groups.cluster_id,\n                    Scenes.cluster_id,\n                    TuyaCO2ManufCluster.cluster_id,\n                ],\n                OUTPUT_CLUSTERS: [Time.cluster_id, Ota.cluster_id],\n            },\n            242: {\n                # <SimpleDescriptor endpoint=242 profile=41440 device_type=97\n                # input_clusters=[]\n                # output_clusters=[33]\n                PROFILE_ID: 41440,\n                DEVICE_TYPE: 97,\n                INPUT_CLUSTERS: [],\n                OUTPUT_CLUSTERS: [GreenPowerProxy.cluster_id],\n            },\n        },\n    }\n\n    replacement = {\n        ENDPOINTS: {\n            1: {\n                DEVICE_TYPE: zha.DeviceType.ON_OFF_LIGHT,\n                INPUT_CLUSTERS: [\n                    Basic.cluster_id,\n                    Groups.cluster_id,\n                    Scenes.cluster_id,\n                    TuyaCO2ManufCluster,\n                    TuyaAirQualityCO2,\n                    TuyaAirQualityFormaldehyde,\n                    TuyaAirQualityHumidity,\n                    TuyaAirQualityTemperature,\n                    TuyaAirQualityVOC,\n                ],\n                OUTPUT_CLUSTERS: [Time.cluster_id, Ota.cluster_id],\n            },\n            242: {\n                PROFILE_ID: 41440,\n                DEVICE_TYPE: 97,\n                INPUT_CLUSTERS: [],\n                OUTPUT_CLUSTERS: [GreenPowerProxy.cluster_id],\n            },\n        }\n    }\n", "path": "zhaquirks/tuya/air/ts0601_air_quality.py"}], "after_files": [{"content": "\"\"\"Tuya Air Quality sensor.\"\"\"\n\nfrom zigpy.profiles import zha\nfrom zigpy.quirks import CustomDevice\nfrom zigpy.zcl.clusters.general import Basic, GreenPowerProxy, Groups, Ota, Scenes, Time\n\nfrom zhaquirks.const import (\n    DEVICE_TYPE,\n    ENDPOINTS,\n    INPUT_CLUSTERS,\n    MODELS_INFO,\n    OUTPUT_CLUSTERS,\n    PROFILE_ID,\n)\nfrom zhaquirks.tuya.air import (\n    TuyaAirQualityCO2,\n    TuyaAirQualityFormaldehyde,\n    TuyaAirQualityHumidity,\n    TuyaAirQualityTemperature,\n    TuyaAirQualityVOC,\n    TuyaCO2ManufCluster,\n)\n\n\nclass TuyaCO2Sensor(CustomDevice):\n    \"\"\"Tuya Air quality device.\"\"\"\n\n    signature = {\n        # NodeDescriptor(logical_type=<LogicalType.Router: 1>, complex_descriptor_available=0, user_descriptor_available=0, reserved=0, aps_flags=0, frequency_band=<FrequencyBand.Freq2400MHz: 8>, mac_capability_flags=<MACCapabilityFlags.AllocateAddress|RxOnWhenIdle|MainsPowered|FullFunctionDevice: 142>, manufacturer_code=4098, maximum_buffer_size=82, maximum_incoming_transfer_size=82, server_mask=11264, maximum_outgoing_transfer_size=82, descriptor_capability_field=<DescriptorCapability.0: 0>, *allocate_address=True, *is_alternate_pan_coordinator=False, *is_coordinator=False, *is_end_device=False, *is_full_function_device=True, *is_mains_powered=True, *is_receiver_on_when_idle=True, *is_router=True, *is_security_capable=False)]\n        # device_version=1\n        # SizePrefixedSimpleDescriptor(endpoint=1, profile=260, device_type=81, device_version=1,\n        # input_clusters=[0, 4, 5, 61184],\n        # output_clusters=[25, 10])\n        MODELS_INFO: [\n            (\"_TZE200_8ygsuhe1\", \"TS0601\"),\n            (\"_TZE200_yvx5lh6k\", \"TS0601\"),\n        ],\n        ENDPOINTS: {\n            1: {\n                PROFILE_ID: zha.PROFILE_ID,\n                DEVICE_TYPE: zha.DeviceType.SMART_PLUG,\n                INPUT_CLUSTERS: [\n                    Basic.cluster_id,\n                    Groups.cluster_id,\n                    Scenes.cluster_id,\n                    TuyaCO2ManufCluster.cluster_id,\n                ],\n                OUTPUT_CLUSTERS: [Time.cluster_id, Ota.cluster_id],\n            }\n        },\n    }\n\n    replacement = {\n        ENDPOINTS: {\n            1: {\n                DEVICE_TYPE: zha.DeviceType.ON_OFF_LIGHT,\n                INPUT_CLUSTERS: [\n                    Basic.cluster_id,\n                    Groups.cluster_id,\n                    Scenes.cluster_id,\n                    TuyaCO2ManufCluster,\n                    TuyaAirQualityCO2,\n                    TuyaAirQualityFormaldehyde,\n                    TuyaAirQualityHumidity,\n                    TuyaAirQualityTemperature,\n                    TuyaAirQualityVOC,\n                ],\n                OUTPUT_CLUSTERS: [Time.cluster_id, Ota.cluster_id],\n            }\n        }\n    }\n\n\nclass TuyaCO2SensorGPP(CustomDevice):\n    \"\"\"Tuya Air quality device with GPP.\"\"\"\n\n    signature = {\n        # NodeDescriptor(logical_type=<LogicalType.Router: 1>, complex_descriptor_available=0, user_descriptor_available=0, reserved=0, aps_flags=0, frequency_band=<FrequencyBand.Freq2400MHz: 8>, mac_capability_flags=<MACCapabilityFlags.AllocateAddress|RxOnWhenIdle|MainsPowered|FullFunctionDevice: 142>, manufacturer_code=4098, maximum_buffer_size=82, maximum_incoming_transfer_size=82, server_mask=11264, maximum_outgoing_transfer_size=82, descriptor_capability_field=<DescriptorCapability.0: 0>, *allocate_address=True, *is_alternate_pan_coordinator=False, *is_coordinator=False, *is_end_device=False, *is_full_function_device=True, *is_mains_powered=True, *is_receiver_on_when_idle=True, *is_router=True, *is_security_capable=False)]\n        # device_version=1\n        # SizePrefixedSimpleDescriptor(endpoint=1, profile=260, device_type=81, device_version=1,\n        # input_clusters=[0, 4, 5, 61184],\n        # output_clusters=[25, 10])\n        MODELS_INFO: [\n            (\"_TZE200_ryfmq5rl\", \"TS0601\"),\n            (\"_TZE200_yvx5lh6k\", \"TS0601\"),\n        ],\n        ENDPOINTS: {\n            1: {\n                PROFILE_ID: zha.PROFILE_ID,\n                DEVICE_TYPE: zha.DeviceType.SMART_PLUG,\n                INPUT_CLUSTERS: [\n                    Basic.cluster_id,\n                    Groups.cluster_id,\n                    Scenes.cluster_id,\n                    TuyaCO2ManufCluster.cluster_id,\n                ],\n                OUTPUT_CLUSTERS: [Time.cluster_id, Ota.cluster_id],\n            },\n            242: {\n                # <SimpleDescriptor endpoint=242 profile=41440 device_type=97\n                # input_clusters=[]\n                # output_clusters=[33]\n                PROFILE_ID: 41440,\n                DEVICE_TYPE: 97,\n                INPUT_CLUSTERS: [],\n                OUTPUT_CLUSTERS: [GreenPowerProxy.cluster_id],\n            },\n        },\n    }\n\n    replacement = {\n        ENDPOINTS: {\n            1: {\n                DEVICE_TYPE: zha.DeviceType.ON_OFF_LIGHT,\n                INPUT_CLUSTERS: [\n                    Basic.cluster_id,\n                    Groups.cluster_id,\n                    Scenes.cluster_id,\n                    TuyaCO2ManufCluster,\n                    TuyaAirQualityCO2,\n                    TuyaAirQualityFormaldehyde,\n                    TuyaAirQualityHumidity,\n                    TuyaAirQualityTemperature,\n                    TuyaAirQualityVOC,\n                ],\n                OUTPUT_CLUSTERS: [Time.cluster_id, Ota.cluster_id],\n            },\n            242: {\n                PROFILE_ID: 41440,\n                DEVICE_TYPE: 97,\n                INPUT_CLUSTERS: [],\n                OUTPUT_CLUSTERS: [GreenPowerProxy.cluster_id],\n            },\n        }\n    }\n", "path": "zhaquirks/tuya/air/ts0601_air_quality.py"}]}