Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add Tuya CO2 sensor _TZE200_3ejwxpmu #3023

Merged
merged 1 commit into from
Mar 18, 2024

Conversation

Syphdias
Copy link
Contributor

@Syphdias Syphdias commented Mar 6, 2024

Link to Amazon (German):
https://www.amazon.de/-/en/Detector-Quality-Detects-Temperature-Humidity/dp/B0BN66C263/ref=sr_1_15?crid=3MUBZEIE60NO2&dib=eyJ2IjoiMSJ9.6d4lrKBQtHphFxK7zUt3DdTm_Ubeway0SCqBwe3N9VmOUbwtfoUaBY7EYIElgGet79JXVL4wZKnuB53bVBUxGPxwkw_SHIpzcpDgPUO3sJFhExDSRXtiOsjVjk4eeAYlb7U_HJCzSO7Kl7OL_VvA7oEOXMynBcX72RLMVhJYtWoErYZEe5z_QZAwyscwo_tGkJWOC_X7iFUsyQRgApKy3uk3MruyIwKLgHaCWWEF5Dg.qOA81PqXb7m3qyBNe2kMmhalpioOETFOnR-BQut724g&dib_tag=se&keywords=Tuya+Smart+Zigbee+CO2+Detector+Air+Quality&qid=1709683021&s=diy&sprefix=tuya+smart+zigbee+co2+detector+air+quality%2Cdiy%2C136&sr=1-15

As the existing class TuyaNDIRCO2SensorGPP worked but did not have all
sensors, I copied the entire class and added Temperature and Humidity
sensors, and pasted the signature.

Issues I have:

  • I am unsure about the device version and
    SizePrefixedSimpleDescriptor as I could not find it in the signature
    or the diagnostic information. I left it as is.
  • I do not know how to name this properly; hence suffix of 2

This fixes #2303

Device signature
{
  "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.FullFunctionDevice|MainsPowered|RxOnWhenIdle|AllocateAddress: 142>, manufacturer_code=4417, maximum_buffer_size=66, maximum_incoming_transfer_size=66, server_mask=10752, maximum_outgoing_transfer_size=66, 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": "0x0104",
      "device_type": "0x0100",
      "input_clusters": [
        "0x0000",
        "0x0004",
        "0x0005",
        "0x0402",
        "0x0405",
        "0x040d",
        "0xef00"
      ],
      "output_clusters": [
        "0x000a",
        "0x0019"
      ]
    },
    "242": {
      "profile_id": "0xa1e0",
      "device_type": "0x0061",
      "input_clusters": [],
      "output_clusters": [
        "0x0021"
      ]
    }
  },
  "manufacturer": "_TZE200_3ejwxpmu",
  "model": "TS0601",
  "class": "ts0601_air_quality.TuyaNDIRCO2SensorGPP2"
}
Diagnostic information
{
  "home_assistant": {
    "installation_type": "Unknown",
    "version": "2024.1.5",
    "dev": false,
    "hassio": false,
    "virtualenv": false,
    "python_version": "3.11.6",
    "docker": false,
    "arch": "aarch64",
    "timezone": "Europe/Berlin",
    "os_name": "Linux",
    "os_version": "6.5.3",
    "run_as_root": true
  },
  "custom_components": {},
  "integration_manifest": {
    "domain": "zha",
    "name": "Zigbee Home Automation",
    "after_dependencies": [
      "onboarding",
      "usb"
    ],
    "codeowners": [
      "@dmulcahey",
      "@adminiuga",
      "@puddly",
      "@TheJulianJES"
    ],
    "config_flow": true,
    "dependencies": [
      "file_upload"
    ],
    "documentation": "https://www.home-assistant.io/integrations/zha",
    "iot_class": "local_polling",
    "loggers": [
      "aiosqlite",
      "bellows",
      "crccheck",
      "pure_pcapy3",
      "zhaquirks",
      "zigpy",
      "zigpy_deconz",
      "zigpy_xbee",
      "zigpy_zigate",
      "zigpy_znp",
      "universal_silabs_flasher"
    ],
    "requirements": [
      "bellows==0.37.6",
      "pyserial==3.5",
      "pyserial-asyncio==0.6",
      "zha-quirks==0.0.109",
      "zigpy-deconz==0.22.4",
      "zigpy==0.60.6",
      "zigpy-xbee==0.20.1",
      "zigpy-zigate==0.12.0",
      "zigpy-znp==0.12.1",
      "universal-silabs-flasher==0.0.15",
      "pyserial-asyncio-fast==0.11"
    ],
    "usb": [
      {
        "vid": "10C4",
        "pid": "EA60",
        "description": "*2652*",
        "known_devices": [
          "slae.sh cc2652rb stick"
        ]
      },
      {
        "vid": "1A86",
        "pid": "55D4",
        "description": "*sonoff*plus*",
        "known_devices": [
          "sonoff zigbee dongle plus v2"
        ]
      },
      {
        "vid": "10C4",
        "pid": "EA60",
        "description": "*sonoff*plus*",
        "known_devices": [
          "sonoff zigbee dongle plus"
        ]
      },
      {
        "vid": "10C4",
        "pid": "EA60",
        "description": "*tubeszb*",
        "known_devices": [
          "TubesZB Coordinator"
        ]
      },
      {
        "vid": "1A86",
        "pid": "7523",
        "description": "*tubeszb*",
        "known_devices": [
          "TubesZB Coordinator"
        ]
      },
      {
        "vid": "1A86",
        "pid": "7523",
        "description": "*zigstar*",
        "known_devices": [
          "ZigStar Coordinators"
        ]
      },
      {
        "vid": "1CF1",
        "pid": "0030",
        "description": "*conbee*",
        "known_devices": [
          "Conbee II"
        ]
      },
      {
        "vid": "0403",
        "pid": "6015",
        "description": "*conbee*",
        "known_devices": [
          "Conbee III"
        ]
      },
      {
        "vid": "10C4",
        "pid": "8A2A",
        "description": "*zigbee*",
        "known_devices": [
          "Nortek HUSBZB-1"
        ]
      },
      {
        "vid": "0403",
        "pid": "6015",
        "description": "*zigate*",
        "known_devices": [
          "ZiGate+"
        ]
      },
      {
        "vid": "10C4",
        "pid": "EA60",
        "description": "*zigate*",
        "known_devices": [
          "ZiGate"
        ]
      },
      {
        "vid": "10C4",
        "pid": "8B34",
        "description": "*bv 2010/10*",
        "known_devices": [
          "Bitron Video AV2010/10"
        ]
      }
    ],
    "zeroconf": [
      {
        "type": "_esphomelib._tcp.local.",
        "name": "tube*"
      },
      {
        "type": "_zigate-zigbee-gateway._tcp.local.",
        "name": "*zigate*"
      },
      {
        "type": "_zigstar_gw._tcp.local.",
        "name": "*zigstar*"
      },
      {
        "type": "_uzg-01._tcp.local.",
        "name": "uzg-01*"
      },
      {
        "type": "_slzb-06._tcp.local.",
        "name": "slzb-06*"
      }
    ],
    "is_built_in": true
  },
  "data": {
    "ieee": "**REDACTED**",
    "nwk": 1283,
    "manufacturer": "_TZE200_3ejwxpmu",
    "model": "TS0601",
    "name": "_TZE200_3ejwxpmu TS0601",
    "quirk_applied": false,
    "quirk_class": "zigpy.device.Device",
    "quirk_id": null,
    "manufacturer_code": 4417,
    "power_source": "Mains",
    "lqi": 255,
    "rssi": -46,
    "last_seen": "2024-03-06T00:14:58",
    "available": true,
    "device_type": "Router",
    "signature": {
      "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.FullFunctionDevice|MainsPowered|RxOnWhenIdle|AllocateAddress: 142>, manufacturer_code=4417, maximum_buffer_size=66, maximum_incoming_transfer_size=66, server_mask=10752, maximum_outgoing_transfer_size=66, 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": "0x0104",
          "device_type": "0x0051",
          "input_clusters": [
            "0x0000",
            "0x0004",
            "0x0005",
            "0xef00"
          ],
          "output_clusters": [
            "0x000a",
            "0x0019"
          ]
        },
        "242": {
          "profile_id": "0xa1e0",
          "device_type": "0x0061",
          "input_clusters": [],
          "output_clusters": [
            "0x0021"
          ]
        }
      },
      "manufacturer": "_TZE200_3ejwxpmu",
      "model": "TS0601"
    },
    "active_coordinator": false,
    "entities": [],
    "neighbors": [
      {
        "device_type": "Coordinator",
        "rx_on_when_idle": "On",
        "relationship": "Parent",
        "extended_pan_id": "**REDACTED**",
        "ieee": "**REDACTED**",
        "nwk": "0x0000",
        "permit_joining": "Unknown",
        "depth": "0",
        "lqi": "133"
      },
      {
        "device_type": "EndDevice",
        "rx_on_when_idle": "Off",
        "relationship": "Child",
        "extended_pan_id": "**REDACTED**",
        "ieee": "**REDACTED**",
        "nwk": "0xD371",
        "permit_joining": "Unknown",
        "depth": "2",
        "lqi": "233"
      },
      {
        "device_type": "EndDevice",
        "rx_on_when_idle": "Off",
        "relationship": "Child",
        "extended_pan_id": "**REDACTED**",
        "ieee": "**REDACTED**",
        "nwk": "0xB687",
        "permit_joining": "Unknown",
        "depth": "2",
        "lqi": "51"
      },
      {
        "device_type": "Router",
        "rx_on_when_idle": "On",
        "relationship": "Child",
        "extended_pan_id": "**REDACTED**",
        "ieee": "**REDACTED**",
        "nwk": "0x26C5",
        "permit_joining": "Unknown",
        "depth": "2",
        "lqi": "0"
      },
      {
        "device_type": "EndDevice",
        "rx_on_when_idle": "Off",
        "relationship": "Child",
        "extended_pan_id": "**REDACTED**",
        "ieee": "**REDACTED**",
        "nwk": "0x2627",
        "permit_joining": "Unknown",
        "depth": "2",
        "lqi": "91"
      }
    ],
    "routes": [],
    "endpoint_names": [
      {
        "name": "SMART_PLUG"
      },
      {
        "name": "PROXY_BASIC"
      }
    ],
    "user_given_name": "CO2 Sensor 1",
    "device_reg_id": "ebda3285c947489403edcc2eb96a8a1c",
    "area_id": "study",
    "cluster_details": {
      "1": {
        "device_type": {
          "name": "SMART_PLUG",
          "id": 81
        },
        "profile_id": 260,
        "in_clusters": {
          "0x0004": {
            "endpoint_attribute": "groups",
            "attributes": {},
            "unsupported_attributes": {}
          },
          "0x0005": {
            "endpoint_attribute": "scenes",
            "attributes": {},
            "unsupported_attributes": {}
          },
          "0xef00": {
            "endpoint_attribute": null,
            "attributes": {},
            "unsupported_attributes": {}
          },
          "0x0000": {
            "endpoint_attribute": "basic",
            "attributes": {
              "0x0001": {
                "attribute_name": "app_version",
                "value": 70
              },
              "0x0004": {
                "attribute_name": "manufacturer",
                "value": "_TZE200_3ejwxpmu"
              },
              "0x0005": {
                "attribute_name": "model",
                "value": "TS0601"
              }
            },
            "unsupported_attributes": {}
          }
        },
        "out_clusters": {
          "0x0019": {
            "endpoint_attribute": "ota",
            "attributes": {},
            "unsupported_attributes": {}
          },
          "0x000a": {
            "endpoint_attribute": "time",
            "attributes": {},
            "unsupported_attributes": {}
          }
        }
      },
      "242": {
        "device_type": {
          "name": "PROXY_BASIC",
          "id": 97
        },
        "profile_id": 41440,
        "in_clusters": {},
        "out_clusters": {
          "0x0021": {
            "endpoint_attribute": "green_power",
            "attributes": {},
            "unsupported_attributes": {}
          }
        }
      }
    }
  }
}

Link to Amazon (German):
https://www.amazon.de/-/en/Detector-Quality-Detects-Temperature-Humidity/dp/B0BN66C263/ref=sr_1_15?crid=3MUBZEIE60NO2&dib=eyJ2IjoiMSJ9.6d4lrKBQtHphFxK7zUt3DdTm_Ubeway0SCqBwe3N9VmOUbwtfoUaBY7EYIElgGet79JXVL4wZKnuB53bVBUxGPxwkw_SHIpzcpDgPUO3sJFhExDSRXtiOsjVjk4eeAYlb7U_HJCzSO7Kl7OL_VvA7oEOXMynBcX72RLMVhJYtWoErYZEe5z_QZAwyscwo_tGkJWOC_X7iFUsyQRgApKy3uk3MruyIwKLgHaCWWEF5Dg.qOA81PqXb7m3qyBNe2kMmhalpioOETFOnR-BQut724g&dib_tag=se&keywords=Tuya+Smart+Zigbee+CO2+Detector+Air+Quality&qid=1709683021&s=diy&sprefix=tuya+smart+zigbee+co2+detector+air+quality%2Cdiy%2C136&sr=1-15

As the existing class TuyaNDIRCO2SensorGPP worked but did not have all
sensors, I copied the entire class and added Temperature and Humidity
sensors, and pasted the signature.

Issues I have:
- I am unsure about the device version and
  `SizePrefixedSimpleDescriptor` as I could not find it in the signature
  or the diagnostic information. I left it as is.
- I do not know how to name this properly; hence suffix of `2`

This fixes zigpy#2303
Copy link

codecov bot commented Mar 6, 2024

Codecov Report

All modified and coverable lines are covered by tests ✅

Project coverage is 87.86%. Comparing base (e4d0663) to head (24bbca4).

Additional details and impacted files
@@           Coverage Diff           @@
##              dev    #3023   +/-   ##
=======================================
  Coverage   87.85%   87.86%           
=======================================
  Files         301      301           
  Lines        9217     9220    +3     
=======================================
+ Hits         8098     8101    +3     
  Misses       1119     1119           

☔ View full report in Codecov by Sentry.
📢 Have feedback on the report? Share it here.

@TheJulianJES TheJulianJES added the Tuya Request/PR regarding a Tuya device label Mar 8, 2024
@TheJulianJES
Copy link
Collaborator

I am unsure about the device version and
SizePrefixedSimpleDescriptor as I could not find it in the signature
or the diagnostic information. I left it as is.

Yeah, it's still from the time when this info was grabbed via logs, as ZHA couldn't show the signature in the UI back then. It doesn't really matter.
If we don't touch the NodeDescriptor, I don't think we even need it as a comment. But the whole code base for that can be cleaned up in a future PR, as it's still in my places. This is fine for now.
The "device type" and so on is also included in the device signature (except device_version).

@TheJulianJES TheJulianJES changed the title Add class for (another) Tuya CO2 Detector Add Tuya CO2 sensor _TZE200_3ejwxpmu Mar 18, 2024
Copy link
Collaborator

@TheJulianJES TheJulianJES left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks!

@TheJulianJES TheJulianJES merged commit 48a310f into zigpy:dev Mar 18, 2024
14 checks passed
@Syphdias
Copy link
Contributor Author

Thank you!

lgraf pushed a commit to lgraf/zha-device-handlers that referenced this pull request May 6, 2024
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Tuya Request/PR regarding a Tuya device
Projects
None yet
Development

Successfully merging this pull request may close these issues.

[Device Support Request] TS0601 by _TZE200_3ejwxpmu (QOXEZY Zigbee CO2 NDIR Sensor)
2 participants