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

[Device Support Request] TY0201 - Temperature + Humdity Sensor, round. Humidity not shown #2701

Closed
senna1992 opened this issue Nov 2, 2023 · 10 comments · Fixed by #3201 · May be fixed by #3231
Closed

[Device Support Request] TY0201 - Temperature + Humdity Sensor, round. Humidity not shown #2701

senna1992 opened this issue Nov 2, 2023 · 10 comments · Fixed by #3201 · May be fixed by #3231
Labels
Tuya Request/PR regarding a Tuya device

Comments

@senna1992
Copy link

Problem description

It works for temperature and battery reporting.
Humidity is not shown.

Solution description

A quirk supporting humidity, temp and battery!

Screenshots/Video

Screenshots/Video

[Paste/upload your media here]

Device signature

Device signature
{
  "node_descriptor": "NodeDescriptor(logical_type=<LogicalType.EndDevice: 2>, complex_descriptor_available=0, user_descriptor_available=0, reserved=0, aps_flags=0, frequency_band=<FrequencyBand.Freq2400MHz: 8>, mac_capability_flags=<MACCapabilityFlags.AllocateAddress: 128>, 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=True, *is_full_function_device=False, *is_mains_powered=False, *is_receiver_on_when_idle=False, *is_router=False, *is_security_capable=False)",
  "endpoints": {
    "1": {
      "profile_id": "0x0104",
      "device_type": "0x0302",
      "input_clusters": [
        "0x0000",
        "0x0001",
        "0x0003",
        "0x0402",
        "0x0405"
      ],
      "output_clusters": [
        "0x0019"
      ]
    }
  },
  "manufacturer": "_TZ3000_zl1kmjqx",
  "model": "TY0201",
  "class": "zigpy.device.Device"
}```

</details>


### Diagnostic information

<details><summary>Diagnostic information</summary>

```json
{
  "home_assistant": {
    "installation_type": "Home Assistant OS",
    "version": "2023.11.0",
    "dev": false,
    "hassio": true,
    "virtualenv": false,
    "python_version": "3.11.6",
    "docker": true,
    "arch": "aarch64",
    "timezone": "Europe/Berlin",
    "os_name": "Linux",
    "os_version": "6.1.21-v8",
    "supervisor": "2023.10.2.dev3001",
    "host_os": "Home Assistant OS 11.1",
    "docker_version": "24.0.6",
    "chassis": "embedded",
    "run_as_root": true
  },
  "custom_components": {
    "hacs": {
      "version": "1.33.0",
      "requirements": [
        "aiogithubapi>=22.10.1"
      ]
    },
    "wiser": {
      "version": "3.3.9",
      "requirements": [
        "aioWiserHeatAPI==1.3.8"
      ]
    },
    "ring_martinpham": {
      "version": "0.0.1",
      "requirements": []
    }
  },
  "integration_manifest": {
    "domain": "zha",
    "name": "Zigbee Home Automation",
    "after_dependencies": [
      "onboarding",
      "usb"
    ],
    "codeowners": [
      "@dmulcahey",
      "@adminiuga",
      "@puddly"
    ],
    "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.36.8",
      "pyserial==3.5",
      "pyserial-asyncio==0.6",
      "zha-quirks==0.0.106",
      "zigpy-deconz==0.21.1",
      "zigpy==0.59.0",
      "zigpy-xbee==0.19.0",
      "zigpy-zigate==0.11.0",
      "zigpy-znp==0.11.6",
      "universal-silabs-flasher==0.0.14",
      "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": "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": 39604,
    "manufacturer": "_TZ3000_zl1kmjqx",
    "model": "TY0201",
    "name": "_TZ3000_zl1kmjqx TY0201",
    "quirk_applied": false,
    "quirk_class": "zigpy.device.Device",
    "quirk_id": null,
    "manufacturer_code": 4417,
    "power_source": "Battery or Unknown",
    "lqi": 136,
    "rssi": -66,
    "last_seen": "2023-11-02T17:46:03",
    "available": true,
    "device_type": "EndDevice",
    "signature": {
      "node_descriptor": "NodeDescriptor(logical_type=<LogicalType.EndDevice: 2>, complex_descriptor_available=0, user_descriptor_available=0, reserved=0, aps_flags=0, frequency_band=<FrequencyBand.Freq2400MHz: 8>, mac_capability_flags=<MACCapabilityFlags.AllocateAddress: 128>, 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=True, *is_full_function_device=False, *is_mains_powered=False, *is_receiver_on_when_idle=False, *is_router=False, *is_security_capable=False)",
      "endpoints": {
        "1": {
          "profile_id": "0x0104",
          "device_type": "0x0302",
          "input_clusters": [
            "0x0000",
            "0x0001",
            "0x0003",
            "0x0402",
            "0x0405"
          ],
          "output_clusters": [
            "0x0019"
          ]
        }
      },
      "manufacturer": "_TZ3000_zl1kmjqx",
      "model": "TY0201"
    },
    "active_coordinator": false,
    "entities": [
      {
        "entity_id": "button.tz3000_zl1kmjqx_ty0201_identifizieren",
        "name": "_TZ3000_zl1kmjqx TY0201"
      },
      {
        "entity_id": "sensor.tz3000_zl1kmjqx_ty0201_batterie",
        "name": "_TZ3000_zl1kmjqx TY0201"
      },
      {
        "entity_id": "sensor.tz3000_zl1kmjqx_ty0201_temperatur",
        "name": "_TZ3000_zl1kmjqx TY0201"
      }
    ],
    "neighbors": [],
    "routes": [],
    "endpoint_names": [
      {
        "name": "TEMPERATURE_SENSOR"
      }
    ],
    "user_given_name": null,
    "device_reg_id": "e26e55c022eeed49a218377a86688891",
    "area_id": null,
    "cluster_details": {
      "1": {
        "device_type": {
          "name": "TEMPERATURE_SENSOR",
          "id": 770
        },
        "profile_id": 260,
        "in_clusters": {
          "0x0000": {
            "endpoint_attribute": "basic",
            "attributes": {
              "0x0004": {
                "attribute_name": "manufacturer",
                "value": "_TZ3000_zl1kmjqx"
              },
              "0x0005": {
                "attribute_name": "model",
                "value": "TY0201"
              }
            },
            "unsupported_attributes": {}
          },
          "0x0001": {
            "endpoint_attribute": "power",
            "attributes": {
              "0x0021": {
                "attribute_name": "battery_percentage_remaining",
                "value": 110
              },
              "0x0020": {
                "attribute_name": "battery_voltage",
                "value": 28
              }
            },
            "unsupported_attributes": {
              "0x0031": {
                "attribute_name": "battery_size"
              },
              "0x0033": {
                "attribute_name": "battery_quantity"
              }
            }
          },
          "0x0003": {
            "endpoint_attribute": "identify",
            "attributes": {},
            "unsupported_attributes": {}
          },
          "0x0402": {
            "endpoint_attribute": "temperature",
            "attributes": {
              "0x0000": {
                "attribute_name": "measured_value",
                "value": 2114
              }
            },
            "unsupported_attributes": {
              "0x0000": {
                "attribute_name": "measured_value"
              }
            }
          },
          "0x0405": {
            "endpoint_attribute": "humidity",
            "attributes": {
              "0x0000": {
                "attribute_name": "measured_value",
                "value": 6743
              }
            },
            "unsupported_attributes": {
              "0x0000": {
                "attribute_name": "measured_value"
              },
              "0xfffe": {
                "attribute_name": "reporting_status"
              },
              "0xfffd": {
                "attribute_name": "cluster_revision"
              }
            }
          }
        },
        "out_clusters": {
          "0x0019": {
            "endpoint_attribute": "ota",
            "attributes": {},
            "unsupported_attributes": {}
          }
        }
      }
    }
  }
}```

</details>


### Logs

<details><summary>Logs</summary>

```python
[Paste the logs here]

Custom quirk

Custom quirk
"""Tuya TS201 temperature, humidity and optional illumination sensors."""

from zigpy.profiles import zha
from zigpy.profiles.zha import DeviceType
from zigpy.quirks import CustomCluster, CustomDevice
import zigpy.types as t
from zigpy.zcl.clusters.general import Basic, Identify, Ota, PowerConfiguration, Time
from zigpy.zcl.clusters.measurement import (
    IlluminanceMeasurement,
    RelativeHumidity,
    TemperatureMeasurement,
)
from zigpy.zdo.types import NodeDescriptor

from zhaquirks.const import (
    DEVICE_TYPE,
    ENDPOINTS,
    INPUT_CLUSTERS,
    MODELS_INFO,
    NODE_DESCRIPTOR,
    OUTPUT_CLUSTERS,
    PROFILE_ID,
)


class ValueAlarm(t.enum8):
    """Temperature and humidity alarm values."""

    ALARM_OFF = 0x02
    MAX_ALARM_ON = 0x01
    MIN_ALARM_ON = 0x00


class TuyaTemperatureHumidityAlarmCluster(CustomCluster):
    """Tuya temperature and humidity alarm cluster (0xE002)."""

    name = "Tuya Temperature and Humidity Alarm Cluster"
    cluster_id = 0xE002

    attributes = {
        # Alarm settings
        0xD00A: ("alarm_temperature_max", t.uint16_t, True),
        0xD00B: ("alarm_temperature_min", t.uint16_t, True),
        0xD00C: ("alarm_humidity_max", t.uint16_t, True),
        0xD00E: ("alarm_humidity_min", t.uint16_t, True),
        # Alarm information
        0xD00F: ("alarm_humidity", ValueAlarm, True),
        0xD006: ("temperature_humidity", ValueAlarm, True),
        # Unknown
        0xD010: ("unknown", t.uint8_t, True),
    }


class NeoTemperatureHumidtyIlluminanceSensor(CustomDevice):
    """Neo temperature, humidity and illumination sensor."""

    signature = {
        #  <SimpleDescriptor endpoint=1, profile=260, device_type=262
        #  device_version=1
        #  input_clusters=[0, 1, 1024, 57346]
        #  output_clusters=[25, 10]>
        MODELS_INFO: [
            ("_TZ3000_zl1kmjqx", "TS0201"),
            ("_TZ3000_zl1kmjqx", "TY0201"),
        ],
        ENDPOINTS: {
            1: {
                PROFILE_ID: zha.PROFILE_ID,
                DEVICE_TYPE: DeviceType.LIGHT_SENSOR,
                INPUT_CLUSTERS: [
                    Basic.cluster_id,
                    PowerConfiguration.cluster_id,
                    IlluminanceMeasurement.cluster_id,
                    TuyaTemperatureHumidityAlarmCluster.cluster_id,
                ],
                OUTPUT_CLUSTERS: [
                    Time.cluster_id,
                    Ota.cluster_id,
                ],
            },
        },
    }

    replacement = {
        ENDPOINTS: {
            1: {
                INPUT_CLUSTERS: [
                    Basic.cluster_id,
                    PowerConfiguration.cluster_id,
                    IlluminanceMeasurement.cluster_id,
                    TuyaTemperatureHumidityAlarmCluster,
                ],
                OUTPUT_CLUSTERS: [
                    Time.cluster_id,
                    Ota.cluster_id,
                ],
            },
            2: {
                PROFILE_ID: zha.PROFILE_ID,
                DEVICE_TYPE: DeviceType.TEMPERATURE_SENSOR,
                INPUT_CLUSTERS: [
                    Basic.cluster_id,
                    TemperatureMeasurement.cluster_id,
                    RelativeHumidity.cluster_id,
                ],
            },
        },
    }


class ZemismartTemperatureHumidtySensor(CustomDevice):
    """Zemismart temperature and humidity sensor."""

    signature = {
        #  <SimpleDescriptor endpoint=1 profile=260 device_type=770
        # device_version=1
        # input_clusters=[0, 1, 3, 1029, 1026, 61183]
        # output_clusters=[3, 25]>
        MODELS_INFO: [("_TZ3000_zl1kmjqx", "TY0201")],
        ENDPOINTS: {
            1: {
                PROFILE_ID: zha.PROFILE_ID,
                DEVICE_TYPE: zha.DeviceType.TEMPERATURE_SENSOR,
                INPUT_CLUSTERS: [
                    Basic.cluster_id,
                    PowerConfiguration.cluster_id,
                    Identify.cluster_id,
                    RelativeHumidity.cluster_id,
                    TemperatureMeasurement.cluster_id,
                    0xEEFF,  # Unknown
                ],
                OUTPUT_CLUSTERS: [Identify.cluster_id, Ota.cluster_id],
            }
        },
    }

    replacement = {
        NODE_DESCRIPTOR: NodeDescriptor(
            0x02,
            0x40,
            0x80,
            0x1037,
            0x7F,
            0x0064,
            0x2C00,
            0x0064,
            0x00,  # Forcing capability 0x80 instead of 0x84 so AC Power = false
        ),
        ENDPOINTS: {
            1: {
                PROFILE_ID: zha.PROFILE_ID,
                DEVICE_TYPE: zha.DeviceType.TEMPERATURE_SENSOR,
                INPUT_CLUSTERS: [
                    Basic.cluster_id,
                    PowerConfiguration.cluster_id,
                    Identify.cluster_id,
                    RelativeHumidity.cluster_id,
                    TemperatureMeasurement.cluster_id,
                ],
                OUTPUT_CLUSTERS: [Identify.cluster_id, Ota.cluster_id],
            }
        },
    }


class RelativeHumidityX10(CustomCluster, RelativeHumidity):
    """Handles invalid humidity values."""

    def _update_attribute(self, attrid, value):
        # x10 factor in measured_value`(attrid=0)
        if attrid == 0:
            value = value * 10
        super()._update_attribute(attrid, value)


class MoesTemperatureHumidtySensorWithScreen(CustomDevice):
    """Moes temperature and humidity sensor with screen."""

    signature = {
        #  <SimpleDescriptor endpoint=1, profile=260, device_type="0x0302"
        #  input_clusters=["0x0000", "0x0001", "0x0003", "0x0402", "0x0405", "0xe002"]
        #  output_clusters=["0x0003", "0x000a", "0x0019"]>
        ENDPOINTS: {
            1: {
                PROFILE_ID: zha.PROFILE_ID,
                DEVICE_TYPE: DeviceType.TEMPERATURE_SENSOR,
                INPUT_CLUSTERS: [
                    Basic.cluster_id,
                    PowerConfiguration.cluster_id,
                    Identify.cluster_id,
                    TemperatureMeasurement.cluster_id,
                    RelativeHumidity.cluster_id,
                    TuyaTemperatureHumidityAlarmCluster.cluster_id,
                ],
                OUTPUT_CLUSTERS: [
                    Identify.cluster_id,
                    Time.cluster_id,
                    Ota.cluster_id,
                ],
            },
        },
    }

    replacement = {
        ENDPOINTS: {
            1: {
                INPUT_CLUSTERS: [
                    Basic.cluster_id,
                    PowerConfiguration.cluster_id,
                    Identify.cluster_id,
                    TemperatureMeasurement.cluster_id,
                    RelativeHumidityX10,
                    TuyaTemperatureHumidityAlarmCluster,
                ],
                OUTPUT_CLUSTERS: [
                    Identify.cluster_id,
                    Time.cluster_id,
                    Ota.cluster_id,
                ],
            },
        },
    }

Additional information

Source: https://de.aliexpress.com/item/1005005454107609.html

@TheJulianJES TheJulianJES added the Tuya Request/PR regarding a Tuya device label Nov 5, 2023
@alexsoh
Copy link

alexsoh commented Nov 9, 2023

The humidity sensor seems to be marked as unsupported. Hopefully this can be supported.

"0x0405": {
            "endpoint_attribute": "humidity",
            "attributes": {
              "0x0000": {
                "attribute_name": "measured_value",
                "value": 5097
              }
            },
            "unsupported_attributes": {
              "0x0000": {
                "attribute_name": "measured_value"
              }
            }
          }

@nikospall
Copy link

Not experienced in Python so apologies for the naive question in advance. This seem to be a quirk written already for this device, does it means it works if I add it to the respective directory in my HAOS? (no idea if I have one yet but I'll dig into it)

@alexsoh
Copy link

alexsoh commented Nov 15, 2023

Yah, you can try but the quirks doesn't work for me unfortunately.

@nikospall
Copy link

I'll see if I can figure it out in the weekend, and update if anything positive comes out.

@yuraant
Copy link

yuraant commented Nov 22, 2023

I'll see if I can figure it out in the weekend, and update if anything positive comes out.

Hey nikospall,
Have you had a chance to take a look? Any chance to get Humidity values in ZHA?
thanks

@nikospall
Copy link

nikospall commented Nov 22, 2023 via email

@alexsoh
Copy link

alexsoh commented Nov 25, 2023

Can't seem to get the custom quirks to work with my own config, so I think I am missing something. i gave up trying and just move this sensor to z2m. Will start migrating my sensors over to z2m and keep ZHA as a secondary going forward.

@batista16
Copy link

same issue here

@waverunner1962
Copy link

Hi and Happy new year 2024.

Same issue here, work like a charm with Tuya gateway, no humidity with Zigbee

Tnanks

@mpactdev
Copy link

There appears to be a more lively (but still yet unresolved) discussion on this device over here:
#2862

philippedeswert added a commit to philippedeswert/zha-device-handlers that referenced this issue Jun 12, 2024
This seems to be a pretty common sensor, for which several models
seem to exist : _TZ3000_bjawzodf and _TZ3000_zl1kmjqx

Fixes: issues zigpy#2862, zigpy#2851, zigpy#2701

Signed-off-by: Philippe De Swert <[email protected]>
philippedeswert added a commit to philippedeswert/zha-device-handlers that referenced this issue Jun 12, 2024
This seems to be a pretty common sensor, for which several models
seem to exist : _TZ3000_bjawzodf and _TZ3000_zl1kmjqx

Fixes: zigpy#2862, zigpy#2851, zigpy#2701

Signed-off-by: Philippe De Swert <[email protected]>
philippedeswert added a commit to philippedeswert/zha-device-handlers that referenced this issue Jun 12, 2024
This seems to be a pretty common sensor, for which several models
seem to exist : _TZ3000_bjawzodf and _TZ3000_zl1kmjqx

Fixes: zigpy#2862, zigpy#2851, zigpy#2701

Signed-off-by: Philippe De Swert <[email protected]>
philippedeswert added a commit to philippedeswert/zha-device-handlers that referenced this issue Jun 12, 2024
This seems to be a pretty common sensor, for which several models
seem to exist : _TZ3000_bjawzodf and _TZ3000_zl1kmjqx

Fixes: zigpy#2862, zigpy#2851, zigpy#2701

Signed-off-by: Philippe De Swert <[email protected]>
philippedeswert added a commit to philippedeswert/zha-device-handlers that referenced this issue Jun 12, 2024
This seems to be a pretty common sensor, for which several models
seem to exist : _TZ3000_bjawzodf and _TZ3000_zl1kmjqx

Fixes: zigpy#2862, zigpy#2851, zigpy#2701

Signed-off-by: Philippe De Swert <[email protected]>
philippedeswert added a commit to philippedeswert/zha-device-handlers that referenced this issue Jun 12, 2024
This seems to be a pretty common sensor, for which several models
seem to exist : _TZ3000_bjawzodf and _TZ3000_zl1kmjqx

Fixes: zigpy#2862, zigpy#2851, zigpy#2701

Signed-off-by: Philippe De Swert <[email protected]>
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
8 participants