Repository: zigpy/zha-device-handlers

Issue:
[Device Support Request] TY0201 by _TZ3000_bjawzodf
### Problem description

Round white temperature and humidity sensor with display purchased from Temu.
Only temperature and battery shows.


I attempted using the [ts0201.py](https://github.com/zigpy/zha-device-handlers/blob/dev/zhaquirks/tuya/ts0201.py) and replacing `("_TZ3000_qaaysllp", "TS0201")` with `("_TZ3000_bjawzodf", "TY0201")` and it seems to be working.


### Solution description

Temperature, Humidity and Battery level support.

### Screenshots/Video

<details><summary>Screenshots/Video</summary>

Before Quirk
<img width="667" alt="Screenshot 2023-12-25 at 7 50 05 PM" src="https://github.com/zigpy/zha-device-handlers/assets/25732005/aa851f86-57b5-45e8-ac94-a6262d02efc6">

After Quirk
<img width="661" alt="Screenshot 2023-12-25 at 8 10 44 PM" src="https://github.com/zigpy/zha-device-handlers/assets/25732005/fd95c3df-33fb-482e-b989-9eb99cddbfd5">


</details>


### Device signature

<details><summary>Device signature</summary>

{
  "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_bjawzodf",
  "model": "TY0201",
  "class": "zigpy.device.Device"
}

</details>


### Diagnostic information

<details><summary>Diagnostic information</summary>

{
  "home_assistant": {
    "installation_type": "Home Assistant OS",
    "version": "2023.12.3",
    "dev": false,
    "hassio": true,
    "virtualenv": false,
    "python_version": "3.11.6",
    "docker": true,
    "arch": "x86_64",
    "timezone": "America/New_York",
    "os_name": "Linux",
    "os_version": "6.1.63-haos",
    "supervisor": "2023.12.0",
    "host_os": "Home Assistant OS 11.2",
    "docker_version": "24.0.7",
    "chassis": "vm",
    "run_as_root": true
  },
  "custom_components": {
    "meross_lan": {
      "version": "3.0.0",
      "requirements": []
    },
    "hacs": {
      "version": "1.33.0",
      "requirements": [
        "aiogithubapi>=22.10.1"
      ]
    }
  },
  "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.3",
      "pyserial==3.5",
      "pyserial-asyncio==0.6",
      "zha-quirks==0.0.107",
      "zigpy-deconz==0.22.2",
      "zigpy==0.60.1",
      "zigpy-xbee==0.20.1",
      "zigpy-zigate==0.12.0",
      "zigpy-znp==0.12.0",
      "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": 63935,
    "manufacturer": "_TZ3000_bjawzodf",
    "model": "TY0201",
    "name": "_TZ3000_bjawzodf TY0201",
    "quirk_applied": false,
    "quirk_class": "zigpy.device.Device",
    "quirk_id": null,
    "manufacturer_code": 4417,
    "power_source": "Battery or Unknown",
    "lqi": 87,
    "rssi": null,
    "last_seen": "2023-12-25T18:54:54",
    "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_bjawzodf",
      "model": "TY0201"
    },
    "active_coordinator": false,
    "entities": [
      {
        "entity_id": "button.tz3000_bjawzodf_ty0201_identify",
        "name": "_TZ3000_bjawzodf TY0201"
      },
      {
        "entity_id": "sensor.tz3000_bjawzodf_ty0201_battery",
        "name": "_TZ3000_bjawzodf TY0201"
      },
      {
        "entity_id": "sensor.tz3000_bjawzodf_ty0201_temperature",
        "name": "_TZ3000_bjawzodf TY0201"
      }
    ],
    "neighbors": [],
    "routes": [],
    "endpoint_names": [
      {
        "name": "TEMPERATURE_SENSOR"
      }
    ],
    "user_given_name": null,
    "device_reg_id": "388644d1eb87a058dbda55635d46ea92",
    "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_bjawzodf"
              },
              "0x0005": {
                "attribute_name": "model",
                "value": "TY0201"
              }
            },
            "unsupported_attributes": {}
          },
          "0x0001": {
            "endpoint_attribute": "power",
            "attributes": {
              "0x0021": {
                "attribute_name": "battery_percentage_remaining",
                "value": 200
              }
            },
            "unsupported_attributes": {}
          },
          "0x0003": {
            "endpoint_attribute": "identify",
            "attributes": {},
            "unsupported_attributes": {}
          },
          "0x0402": {
            "endpoint_attribute": "temperature",
            "attributes": {
              "0x0000": {
                "attribute_name": "measured_value",
                "value": 2360
              }
            },
            "unsupported_attributes": {}
          },
          "0x0405": {
            "endpoint_attribute": "humidity",
            "attributes": {
              "0x0000": {
                "attribute_name": "measured_value",
                "value": 3870
              }
            },
            "unsupported_attributes": {
              "0x0000": {
                "attribute_name": "measured_value"
              }
            }
          }
        },
        "out_clusters": {
          "0x0019": {
            "endpoint_attribute": "ota",
            "attributes": {},
            "unsupported_attributes": {}
          }
        }
      }
    }
  }
}

</details>


### Logs

<details><summary>Logs</summary>

```python
[Paste the logs here]
```

</details>


### Custom quirk

<details><summary>Custom quirk</summary>

"""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_bjawzodf", "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_lfa05ajd", "TS0201")],
        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,
                ],
            },
        },
    }

</details>


### Additional information

https://www.temu.com/tuya-smart-zigbee-temperature-and-humidity-sensor-smart-life-app-control-indoor-humidity-detector-works-with-zigbee-gateway-hub-g-601099531358811.html
[Device Support Request] TY0201 - Temperature + Humdity Sensor, round. Humidity not shown
### Problem description

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


### Solution description

A quirk supporting humidity, temp and battery!

### Screenshots/Video

<details><summary>Screenshots/Video</summary>

[Paste/upload your media here]

</details>


### Device signature

<details><summary>Device signature</summary>

```json
{
  "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]
```

</details>


### Custom quirk

<details><summary>Custom quirk</summary>

```python
"""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,
                ],
            },
        },
    }
```

</details>


### Additional information

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


Discussion:
Hi. My equipment works the same. Only temperature and battery shows.  TY0201, _TZ3000_bjawzodf
HA 2023.12.4
Try the custom quirk I listed on the original post. It should work for you as it is working for me. 
I take it back. The humidity stopped working for whatever reason.
Hi. My custom quirk works.
[ty0201.zip](https://github.com/zigpy/zha-device-handlers/files/13822854/ty0201.zip)

> Hi. My custom quirk works. [ty0201.zip](https://github.com/zigpy/zha-device-handlers/files/13822854/ty0201.zip)

It sure does! Thank you!!!
> Hi. My custom quirk works. [ty0201.zip](https://github.com/zigpy/zha-device-handlers/files/13822854/ty0201.zip)

Hello,

I just received one TY0201 by _TZ3000_bjawzodf device today and encountered the same situation as described in this issue. I could add the device to HA in ZHA, but I only got battery and temperature, but not humidity.
My HA is running on a raspberry PI 4 with ConBee II Zigbee stick.

After some search, I found this issue and tried the ty0201.zip custom quirk from @LukaszJedynowicz .
I think i managed to activate it ( I have no experience with custom quirks until now, I followed [this description](https://github.com/zigpy/zha-device-handlers/pull/2419)) correctly as I have an additional line in the Zigbee info of the device including the typo with the missing "i" from the ty0201.py (see screenshots).
But still the humidity is missing (also see screenshots).
I deleted and newly added the device to be sure.
Did you do anything additionally to get it running with humidity?

Thank you in advance!

Screenshot 1 - without quirk:
![without quirk](https://github.com/zigpy/zha-device-handlers/assets/83309424/a14d3c21-9d8b-4188-b7c4-f2bd0707f234)
Screenshot 2 - with quirk:
![with_quirk](https://github.com/zigpy/zha-device-handlers/assets/83309424/02c65798-cbe2-4926-8a52-3d71477eba4a)

It didn’t work for me at first either. Try restarting HA after applying the quirk and then adding the device again. 
> It didn’t work for me at first either. Try restarting HA after applying the quirk and then adding the device again.

Thanks for your answer.
I'm sorry I wasn't precise enough what I did, unfortunately I already did these steps.
In detail:
- applied quirk
- checked configuration (just to be sure...)
- restarted HA
- deleted device
- newly added device
- restarted HA 
--> Device is running but still without humidity.

I have the latest HA core update and some other updates open, so I will take the time to do all updates now.
I will give an update tomorrow if that changes anything.
Update: I did not succeed in getting the humidity in home assistant. I will leave it as it is for the moment, maybe there will be some activity here in the future that helps me getting it running.

Thank you @idumzaes for you support!
I don't know if this helps but here are a couple of internal pictures and a link to all the endpoints on the Tuya website as I too am experiencing the same problem.

![1704465116493](https://github.com/zigpy/zha-device-handlers/assets/2206975/1c3c4585-c15a-46de-bce6-93a67aecfafa)
![1704465494519](https://github.com/zigpy/zha-device-handlers/assets/2206975/f8bbe74d-424d-4ffb-865f-30073df0ef7c)

https://developer.tuya.com/en/docs/connect-subdevices-to-gateways/zigbee-sensor?id=K9ik6zvmhrfh6


Hi, I have two identical thermometers. The second thermometer only shows the temperature, but both provide humidity information in their diagnostics.
Diagnostics are identicaly.
Check your diagnostic information to see if there's humidity information available.
          "0x0405": {
            **"endpoint_attribute": "humidity",**
            "attributes": {
              "0x0000": {
                "attribute_name": "measured_value",
                **"value": 4140**
              }
            },
            "unsupported_attributes": {
              "0x0000": {
                "attribute_name": "measured_value"
              }
            }
          }
 The thermometers are of very poor quality.
  
![ty0201](https://github.com/zigpy/zha-device-handlers/assets/136688176/b11ac017-dbfe-44b3-81b1-9af87870d0aa)
![ty0201-2](https://github.com/zigpy/zha-device-handlers/assets/136688176/cd1f959d-c620-4a0a-a17e-a8257ef6ff94)

**Quirk: ty0201.TemperatureHumidtySensorWithScreen**
value: 41,40
Hello,
I got the same device today TY0201  _TZ3000_bjawzodf firmware: 0x10013001
The problem with ZHA is a little bit different. I can see the humidity but not the temperature. Currently I have no quirks installed. I am working with the current HA Version
![image](https://github.com/zigpy/zha-device-handlers/assets/64071021/d1505c41-5514-4a21-a7c6-d56fd332e771)
I am very interested in the temperature not so much in the humidity. Because of this I am looking forward for a fix. Below a screenshot from my device configuration.
![image](https://github.com/zigpy/zha-device-handlers/assets/64071021/ec7cd940-b12f-49ae-a7d0-cd7985a16feb)

> Hi. My custom quirk works. [ty0201.zip](https://github.com/zigpy/zha-device-handlers/files/13822854/ty0201.zip)

I can confirm this custom quirk works. I have been using it for 2 weeks without any issues.
If you are still having issues, you might need to check and see if Quirks are correctly enabled.

<img width="663" alt="Screenshot 2024-01-16 at 1 07 27 AM" src="https://github.com/zigpy/zha-device-handlers/assets/25732005/f7db740b-8116-4844-8239-cf3c51ea6a89">

Unfortunately, this still didn't work for me.
![image](https://github.com/zigpy/zha-device-handlers/assets/2206975/4185cd9b-bc51-4caa-9180-5e7ac3ee9b77)


Same here. The custom quirk doesn't work for me either.
![2024-01-16 17_40_24-MeinHA - Einstellungen – Home Assistant](https://github.com/zigpy/zha-device-handlers/assets/11487796/d7529e17-c9b3-4943-a214-24b3cadb734f)

How did you manage to pair the device? I tried to pair with PhosCon several times, also tried different devices, it never succeeded. Usually I'm using ioBroker with the Deconz adapter and RaspBee, but for testing I tried to pair using the Zigbee adapter in ioBroker and the Sonoff USB stick - that worked immediately. 
I’ve been using ZHA with a Sonoff Zigbee 3.0 USB Dongle Plus.  I’ve never used PhisCon, Deconz, ioBroker or RaspBee. On Jan 27, 2024, at 3:10 PM, ThorstenDtk ***@***.***> wrote:﻿
How did you manage to pair the device? I tried to pair with PhosCon several times, also tried different devices, it never succeeded. Usually I'm using ioBroker with the Deconz adapter and RaspBee, but for testing I tried to pair using the Zigbee adapter in ioBroker and the Sonoff USB stick - that worked immediately.

—Reply to this email directly, view it on GitHub, or unsubscribe.You are receiving this because you were mentioned.Message ID: ***@***.***>
I paired this device using  ```ZHA``` and ```SkyConnect``` as dongle.
The custom quirk mentioned does not work for me either. I'm not experienced with quirk development, but I also don't know why it works for anyone (please someone explain if they know, I'm legit curious, not criticizing) - since on the surface it appears to make the replacement template identical to the original.

Furthermore, if anyone understands how it's putting humidity in `"unsupported_attributes"` in the first place, please explain as well... the address `0x0405` is the valid address in the Zigbee spec for this attribute, just as `0x0402` is the correct address for temperature.
For me the quirk posted here didn't work either so I changed it a bit and now it works for me.
this Is my quirk.
`"""Tuya TY0201 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 TemperatureHumidtySensorWithScreen(CustomDevice):
    """Temu 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"]>
        MODELS_INFO: [("_TZ3000_bjawzodf", "TY0201")],
        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,
                  ],
                OUTPUT_CLUSTERS: [
                    Ota.cluster_id,
                ],
            },
        },
    }

    replacement = {
        ENDPOINTS: {
            1: {
                INPUT_CLUSTERS: [
                    Basic.cluster_id,
                    PowerConfiguration.cluster_id,
                    Identify.cluster_id,
                    TemperatureMeasurement.cluster_id,
                    RelativeHumidity.cluster_id,
                ],
                OUTPUT_CLUSTERS: [
                    Ota.cluster_id,
                ],
            },
        },
    }`
@gielie could you post it as a file? I think formatting broke it. 
@gielie  I have the same problem: "Only temperature shown". I had a look at the code posted above; it's the same as in the quirk files above, but I don't see any difference. What did you actually change?
I have had the same issue: no humidity only temperature in HA
Today I have upgraded to latest (2024.1.6) HA and added the custom quirk.
After that no measurement at all. Even the temperature and battery disappeared.
Then I stopped HA (docker container), removed the quirk and the cache in the custom quirk folder.
Started HA Docker container (on Raspberry Pi 4).

And it wokrs:
![image](https://github.com/zigpy/zha-device-handlers/assets/4959128/eb96f3b2-74bf-412b-842b-9992669d8aec)

> @gielie I have the same problem: "Only temperature shown". I had a look at the code posted above; it's the same as in the quirk files above, but I don't see any difference. What did you actually change?

I changed this part

 ```
  #  input_clusters=["0x0000", "0x0001", "0x0003", "0x0402", "0x0405"]
   #  output_clusters=["0x0019"]>
```

into this

```
  #  input_clusters=["0x0000", "0x0001", "0x0003", "0x0402", "0x0405", "0xe002”]
  #  output_clusters=["0x0003", "0x000a", "0x0019"]>
```
Hi @gielie !

Thanks for sharing your config.
Let me ask two questions:
1. These modified lines are only source comments. How do these effect the configuration? There is also a typo in the first comment line "0xe002 missing closing quoutes.
> \#  input_clusters=["0x0000", "0x0001", "0x0003", "0x0402", "0x0405", "0xe002]
>  \#  output_clusters=["0x0003", "0x000a", "0x0019"]>
2. Shouldn't the modification be made on the following lists two? How do you do it?
> INPUT_CLUSTERS: [
>                 Basic.cluster_id,
>                 PowerConfiguration.cluster_id,
>                 Identify.cluster_id,
>                 TemperatureMeasurement.cluster_id,
>                 RelativeHumidity.cluster_id,
>               ],
>             OUTPUT_CLUSTERS: [
>                 Ota.cluster_id,
>             ],

Regards,

Gábor
This is very strange. Following the change to the quirks file, one of the sensors has started showing temperature and humidity but another is only showing temperature still.

I have tried repeatedly restarting HA and removing the cache file but no further change.
Hi, Iam trying to get this working also, I got all the same results as above except a working device.

I cannot find how the clear the cache for the quirks, can anyone point me in the right direction?

My feeling is that any change I make to the quirk is not loaded when I pair the device.

Thanks in advance.

Danny
@koningdde your quirks cache is in `config\zha_quirks\__pycache__`. You can also see if your quirk is being used by looking at the device info 
![image](https://github.com/zigpy/zha-device-handlers/assets/2206975/de4cae96-c3a0-4956-8ad5-fcbc614936f3)

> @koningdde your quirks cache is in `config\zha_quirks\__pycache__`. You can also see if your quirk is being used by looking at the device info ![image](https://private-user-images.githubusercontent.com/2206975/302944629-de4cae96-c3a0-4956-8ad5-fcbc614936f3.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3MDczMDIxOTYsIm5iZiI6MTcwNzMwMTg5NiwicGF0aCI6Ii8yMjA2OTc1LzMwMjk0NDYyOS1kZTRjYWU5Ni1jM2EwLTQ5NTYtOGFkNS1mY2JjNjE0OTM2ZjMucG5nP1gtQW16LUFsZ29yaXRobT1BV1M0LUhNQUMtU0hBMjU2JlgtQW16LUNyZWRlbnRpYWw9QUtJQVZDT0RZTFNBNTNQUUs0WkElMkYyMDI0MDIwNyUyRnVzLWVhc3QtMSUyRnMzJTJGYXdzNF9yZXF1ZXN0JlgtQW16LURhdGU9MjAyNDAyMDdUMTAzMTM2WiZYLUFtei1FeHBpcmVzPTMwMCZYLUFtei1TaWduYXR1cmU9NjIyY2Q2YWNjMzYzNTcxYTdiZTA3ZDgxZDRhYWZhMTdiNDlhZTAwMmQ5NDQzODg2NzQyMjkwNmZlYjc5ZmFlMCZYLUFtei1TaWduZWRIZWFkZXJzPWhvc3QmYWN0b3JfaWQ9MCZrZXlfaWQ9MCZyZXBvX2lkPTAifQ.kLdLtyEcC0NMpnz9pzJBhjoYSyOnT06BIh1INmvua1g)

Thank you, 
I should have been looking a little closer as it is states obvious in the folder. 
I will restart this adventure now and see if the quirks is used again, indeed the quirk was not loaded at my configuation.
To add to the confusion I unpaired the working device, re-paired and the sensor returned to only showing temperature. It seems there is something more at play. I now have no idea how I got it fully working.
Weird results here also, i removed the devices, after pairing one is showing temperature, the other one has no data.
When pairing the endpoints looks fine.

![image](https://github.com/zigpy/zha-device-handlers/assets/12693756/6dd68357-724f-44a7-94e3-b545ad223bcc)

Data is available on one device, but only temperature:
![image](https://github.com/zigpy/zha-device-handlers/assets/12693756/84a2ffd6-f3bb-469a-8f2c-b720a5a47475)

Seems to me we are on the wrong track or the device doen's communicate as i should, maybe a timing problem in the RF system.

I think the devices are rubbish :)

> Weird results here also, i removed the devices, after pairing one is showing temperature, the other one has no data. When pairing the endpoints looks fine.
> 
> ![image](https://private-user-images.githubusercontent.com/12693756/303309574-6dd68357-724f-44a7-94e3-b545ad223bcc.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3MDczOTQyMDAsIm5iZiI6MTcwNzM5MzkwMCwicGF0aCI6Ii8xMjY5Mzc1Ni8zMDMzMDk1NzQtNmRkNjgzNTctNzI0Zi00NGE3LTk0ZTMtYjU0NWFkMjIzYmNjLnBuZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNDAyMDglMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjQwMjA4VDEyMDUwMFomWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPTBlMmM2Y2U3MDk0OGVhOWIzZWIzMDg4ZjI2NjEwZmM5ZThhODk5MjkwMDhjZDYyMmZkZTMyYTFmOTNlNTZiM2MmWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0JmFjdG9yX2lkPTAma2V5X2lkPTAmcmVwb19pZD0wIn0.GzZKFfpzDrh57ePMjGJa0KXMSfRB-xs7yhUChM1rWfY)
> 
> Data is available on one device, but only temperature: ![image](https://private-user-images.githubusercontent.com/12693756/303309680-84a2ffd6-f3bb-469a-8f2c-b720a5a47475.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3MDczOTQyMDAsIm5iZiI6MTcwNzM5MzkwMCwicGF0aCI6Ii8xMjY5Mzc1Ni8zMDMzMDk2ODAtODRhMmZmZDYtZjNiYi00NjlhLThmMmMtYjcyMGE1YTQ3NDc1LnBuZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNDAyMDglMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjQwMjA4VDEyMDUwMFomWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPWEwZmEyYWVkNzBiNjY2ODI5ZmE5NjE4ZjcwZjUyMjI5NTViNmY2Y2Y5ZDQzNzk4YzA0NjA3NzVmZDNlYWYwNmImWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0JmFjdG9yX2lkPTAma2V5X2lkPTAmcmVwb19pZD0wIn0.t9I9JFM0aPlC5ta6xoLyTKqMDL1U3dO9ulGCcN4NOdA)
> 
> Seems to me we are on the wrong track or the device doen's communicate as i should, maybe a timing problem in the RF system.
> 
> I think the devices are rubbish :)

Don’t give up, with my Quirk I have 5 devices working, I can remove them and add them without any problem. 

But the main thing is that it is an ZHA problem in Z2MQTT they are all working out of the box. 
Thanks, i don't feel like migrating to Z2MQTT yet, because i need to pair everything again, 
Although i like the idea that i can manipulate the communication more.
After repeatedly deleting the device and re-adding worked using the custom quirk given on this thread.
> After repeatedly deleting the device and re-adding worked using the custom quirk given on this thread.

Pretty much what I did to get mine working with ZHA and it’s been working ever since. Though I only have one of these sensors. 
I have four of these devices, the same, and they act randomly - some of them register humidity, some of them temperature. I never got two readings at once. Suprisingly, they are ultra reliable under zigbee2mqtt, in contrast to other meters... 
Here's the [ty0201.py.zip](https://github.com/zigpy/zha-device-handlers/files/14259766/ty0201.py.zip) that I ended up using which seems to work for me. I don't know if it continues to work, as of now, it does.

This is the file mentioned earlier in the thread, and with the changes from @gielie.   I made no other changes to it, I'm just posting it here as a file to make it easier to download (remember to unzip) :) 



Mine stopt working after a couple of days, can’t get them to include anymore in zha, I switched to z2mqtt, no more troubles. 

Someone needs to pick this up why zha doesn’t work but z2mqtt has no problem with this device. 
> Mine stopt working after a couple of days, can’t get them to include anymore in zha, I switched to z2mqtt, no more troubles.

Well that doesn't bode well.

Also, I can't get my 2nd of these devices to give me humidity, despite the same quirk is being applied as for the 1st one. 

Weird.


EDIT: Well that was quick. Not sure if it was HA restart or not that caused it, but ZHA stopped reading the Humidity. The diagnostic file contains the correct value from the sensor though, but it's also unsupported it seems:

```
        "0x0405": {
            "endpoint_attribute": "humidity",
            "attributes": {
              "0x0000": {
                "attribute_name": "measured_value",
                "value": 3800
              }
            },
            "unsupported_attributes": {
              "0x0000": {
                "attribute_name": "measured_value"
              },
              "0xfffd": {
                "attribute_name": "cluster_revision"
              }
            }
          }
          
```
Here's to hoping ZHA can fix this at some point.
This seems to be something very elementary at the protocol level query - as those particular meters doesn't work well here, while they work perfect in z2mqtt, but on the contrary - meters from Sonoff (eg. TH01) doesn't work well in z2mqtt while they are perfect here (ZHA) - i whish I have skills to compare differences, when the devices "talks" and how to debug that... 

On damn. My single one of these stopped reporting humidity so I’m back to square one.  
I’m thinking about switching to Z2MQTT but that’s a drastic move for just one device. I’ll probably just end up not using this sensor. 
The quirk did not immediately work for me. But after some other tweaking and restarting home assistant it finally got the humidity. I did notice the same thing as @theusen, which is that for some reason the humidity gets marked as unsupported. Thus I thought to maybe map it to something Tuya specific... No idea if this is even sane, as it is entirely new to me.

`
"""Tuya TY0201 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,
)

from zhaquirks.tuya.air import (
    TuyaAirQualityTemperature,
    TuyaAirQualityHumidity,
)

class TemperatureHumiditySensorWithScreen(CustomDevice):                             
    """Temu temperature and humidity sensor with screen."""
                                                                                     
    signature = {                                          
        #  <SimpleDescriptor endpoint=1, profile=260, device_type="0x0302"
        #  input_clusters=["0x000", "0x0001", "0x0003", "0x0402", "0x0405"]
        #  output_clusters=["0x0019"]>                                     
        MODELS_INFO: [("_TZ3000_bjawzodf", "TY0201")],                     
        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,                           
                  ],                                                       
                OUTPUT_CLUSTERS: [                                         
                    Ota.cluster_id,                                       
                ],                                                         
            },                                                            
        },                                                                 
    }                                                                     
                                                                           
    replacement = {                                                        
        ENDPOINTS: {                                                      
            1: {                                                           
                INPUT_CLUSTERS: [                                         
                    Basic.cluster_id,                                      
                    PowerConfiguration.cluster_id,         
                    Identify.cluster_id,                   
                    TuyaAirQualityTemperature,    
                    TuyaAirQualityHumidity,                
                ],                                
                OUTPUT_CLUSTERS: [                         
                    Ota.cluster_id,                   
                ],                                
            },                                        
        },                                        
    }                        
`
Hi @philippedeswert, I was just trying to make this work and saw your comment and tried it out, and I can confirm that it works for me too! I couldn't get the original quirk to work at all, even after several repairs and restarts.

I had to figure out the correct file format because your comment formatting is messed up, but after applying the changes, restarting and re-pairing I finally got the humidity to show! :tada: 
> Hi @philippedeswert, I was just trying to make this work and saw your comment and tried it out, and I can confirm that it works for me too! I couldn't get the original quirk to work at all, even after several repairs and restarts.
> 
> I had to figure out the correct file format because your comment formatting is messed up, but after applying the changes, restarting and re-pairing I finally got the humidity to show! 🎉

Could you share the file u used? Many thanks. 
> > Hi @philippedeswert, I was just trying to make this work and saw your comment and tried it out, and I can confirm that it works for me too! I couldn't get the original quirk to work at all, even after several repairs and restarts.
> > I had to figure out the correct file format because your comment formatting is messed up, but after applying the changes, restarting and re-pairing I finally got the humidity to show! 🎉
> 
> Could you share the file u used? Many thanks.

I apologize for the bad formatting, the quoting/code block just did not want to work correctly. Had to rename the file to .txt, but I guess it should be ok. 

Anyway I hope it helps. I suspect there is still some Tuya specific thing with the clusters/power as reconfiguring now works for the temperature and humidity but not for the battery,

[ty0201.txt](https://github.com/zigpy/zha-device-handlers/files/14471995/ty0201.txt)

> > > Hi @philippedeswert, I was just trying to make this work and saw your comment and tried it out, and I can confirm that it works for me too! I couldn't get the original quirk to work at all, even after several repairs and restarts.
> > > I had to figure out the correct file format because your comment formatting is messed up, but after applying the changes, restarting and re-pairing I finally got the humidity to show! 🎉
> > 
> > 
> > Could you share the file u used? Many thanks.
> 
> I apologize for the bad formatting, the quoting/code block just did not want to work correctly. Had to rename the file to .txt, but I guess it should be ok.
> 
> Anyway I hope it helps. I suspect there is still some Tuya specific thing with the clusters/power as reconfiguring now works for the temperature and humidity but not for the battery,
> 
> [ty0201.txt](https://github.com/zigpy/zha-device-handlers/files/14471995/ty0201.txt)

Great...with this querk, humidity is finally working for me after newly adding the device.
Thanks a lot!
> > > Hi @philippedeswert, I was just trying to make this work and saw your comment and tried it out, and I can confirm that it works for me too! I couldn't get the original quirk to work at all, even after several repairs and restarts.
> > > I had to figure out the correct file format because your comment formatting is messed up, but after applying the changes, restarting and re-pairing I finally got the humidity to show! 🎉
> > 
> > 
> > Could you share the file u used? Many thanks.
> 
> I apologize for the bad formatting, the quoting/code block just did not want to work correctly. Had to rename the file to .txt, but I guess it should be ok.
> 
> Anyway I hope it helps. I suspect there is still some Tuya specific thing with the clusters/power as reconfiguring now works for the temperature and humidity but not for the battery,
> 
> [ty0201.txt](https://github.com/zigpy/zha-device-handlers/files/14471995/ty0201.txt)

great work, this works for all my devices, many thanks.
How do you re-add it / factory reset it? 

I can't seem to figure out how to get it work. Whenever I remove it from ZHA, and I start to pair it again, it just re-appears in the list.

It seems if I hold down the top-button on the device for more than 10 seconds, it seems to forget its connected to my ZHA. But once I add it again, it gets the old quirk added (I believe), despite I removed it and only use the new one.
Absolutely excellent @gielie  that did it. Now showing humidity. I hadn't realised that I had to remove the device and unpair the sensor by holding the button in until the signal strength on the display disappeared. I then paired as usual and voila it works.
I changed the network to Z2MQTT an it is working without problems, so i cannot test this anymore, but i hope for you guys this is working now.
Someone wrote this morning that:
> After applying this quick, my ZHA shows nothing - no temp, no humidity.

But that message is now gone. If that someone managed to fix that issue, please enlighten us :D  I'm stuck at the same, after finally getting the device removed from ZHA (I think).
> Someone wrote this morning that:
> 
> > After applying this quick, my ZHA shows nothing - no temp, no humidity.
> 
> But that message is now gone. If that someone managed to fix that issue, please enlighten us :D I'm stuck at the same, after finally getting the device removed from ZHA (I think).

Usually restarting ZHA helps with that, but only after you added the device back... I had some cases when trying things out that the device would not report temp and/or humidity but would be fine after a ZHA restart.
> Someone wrote this morning that:
> 
> > After applying this quick, my ZHA shows nothing - no temp, no humidity.
> 
> But that message is now gone. If that someone managed to fix that issue, please enlighten us :D I'm stuck at the same, after finally getting the device removed from ZHA (I think).

In your custom quirk folder is a pycache folder, you can try to remove the files or the whole folder, restart and add your device. 
Thank you philippe and gielie for your suggestions. I was not aware of the __pycache__ folder, File Editor was hiding it. I tried to clear it, restart ZHA, HA, re-pair etc etc., but it keeps appearing with only "Firmware", no temperature or humidity.

I guess I'll let it be for now. Maybe it will change its mind eventually.
> Thank you philippe and gielie for your suggestions. I was not aware of the __pycache__ folder, File Editor was hiding it. I tried to clear it, restart ZHA, HA, re-pair etc etc., but it keeps appearing with only "Firmware", no temperature or humidity.
> 
> I guess I'll let it be for now. Maybe it will change its mind eventually.

Same here with @philippedeswert quirk I now don't even see temperature, which was only thing working out of the box.

I used txt file provided, I see that this quirk was applied but temperature and humidity is missing. (Did restart, remove device and cache, etc )
> > Thank you philippe and gielie for your suggestions. I was not aware of the **pycache** folder, File Editor was hiding it. I tried to clear it, restart ZHA, HA, re-pair etc etc., but it keeps appearing with only "Firmware", no temperature or humidity.
> > I guess I'll let it be for now. Maybe it will change its mind eventually.
> 
> Same here with @philippedeswert quirk I now don't even see temperature, which was only thing working out of the box.
> 
> I used txt file provided, I see that this quirk was applied but temperature and humidity is missing. (Did restart, remove device and cache, etc )

I hope you changed the txt extension back to .py?
> > > Thank you philippe and gielie for your suggestions. I was not aware of the **pycache** folder, File Editor was hiding it. I tried to clear it, restart ZHA, HA, re-pair etc etc., but it keeps appearing with only "Firmware", no temperature or humidity.
> > > I guess I'll let it be for now. Maybe it will change its mind eventually.
> > 
> > Same here with @philippedeswert quirk I now don't even see temperature, which was only thing working out of the box.
> > 
> > I used txt file provided, I see that this quirk was applied but temperature and humidity is missing. (Did restart, remove device and cache, etc )
> 
> I hope you changed the txt extension back to .py?

Yes I did as, I don't think it would be applied otherwise. 


> Thank you philippe and gielie for your suggestions. I was not aware of the **pycache** folder, File Editor was hiding it. I tried to clear it, restart ZHA, HA, re-pair etc etc., but it keeps appearing with only "Firmware", no temperature or humidity.
> 
> I guess I'll let it be for now. Maybe it will change its mind eventually.

You are not alone :) Same story, diagnostic shows that now temperature is not supported, but show nothing for both )))

UPD: after yet another restart the humidity back to live, but not temperature )) Magic... I can read both values using Manage Zigbee Device, btw...

UPD2: hm, now Download Diagnostic shows that all *value attributes supported, I did restart of the HA and guess what... it works... May be my manual execution of the Read Values in the Manage Zigbee Device did the trick, not sure..

UPD3: similar comment [here](https://github.com/zigpy/zha-device-handlers/issues/2851#issuecomment-1985536173), so may be really reading values manually do the magic...
> > Thank you philippe and gielie for your suggestions. I was not aware of the **pycache** folder, File Editor was hiding it. I tried to clear it, restart ZHA, HA, re-pair etc etc., but it keeps appearing with only "Firmware", no temperature or humidity.
> > I guess I'll let it be for now. Maybe it will change its mind eventually.
> 
> You are not alone :) Same story, diagnostic shows that now temperature is not supported, but show nothing for both )))
> 
> UPD: after yet another restart the humidity back to live, but not temperature )) Magic... I can read both values using Manage Zigbee Device, btw...
> 
> UPD2: hm, now Download Diagnostic shows that all *value attributes supported, I did restart of the HA and guess what... it works... May be my manual execution of the Read Values in the Manage Zigbee Device did the trick, not sure..
> 
> UPD3: similar comment [here](https://github.com/zigpy/zha-device-handlers/issues/2851#issuecomment-1985536173), so may be really reading values manually do the magic...

UPD3 seems to do it...same procedure as described, manual reading, temperature and humidity could be read but were not available as entities in the device, then restarting HA and - MAGIC - they're here and updating!
Let's see if it stays this way, if you compare my comment some days ago I was somehow able to get both values directly after adding the device with the custom quirk, but then the values stopped both updating.
> > > Thank you philippe and gielie for your suggestions. I was not aware of the **pycache** folder, File Editor was hiding it. I tried to clear it, restart ZHA, HA, re-pair etc etc., but it keeps appearing with only "Firmware", no temperature or humidity.
> > > I guess I'll let it be for now. Maybe it will change its mind eventually.
> > 
> > You are not alone :) Same story, diagnostic shows that now temperature is not supported, but show nothing for both )))
> > 
> > UPD: after yet another restart the humidity back to live, but not temperature )) Magic... I can read both values using Manage Zigbee Device, btw...
> > 
> > UPD2: hm, now Download Diagnostic shows that all *value attributes supported, I did restart of the HA and guess what... it works... May be my manual execution of the Read Values in the Manage Zigbee Device did the trick, not sure..
> > 
> > UPD3: similar comment [here](https://github.com/zigpy/zha-device-handlers/issues/2851#issuecomment-1985536173), so may be really reading values manually do the magic...
> 
> UPD3 seems to do it...same procedure as described, manual reading, temperature and humidity could be read but were not available as entities in the device, then restarting HA and - MAGIC - they're here and updating!
> Let's see if it stays this way, if you compare my comment some days ago I was somehow able to get both values directly after adding the device with the custom quirk, but then the values stopped both updating.

Do you use any quirk? If yes which one?

Edit: yes it looks like it is finally working also for me without any quirk. Just read those values and restart the HA ( I recently also updated HA to newest version 2024.3.1, if anybody interested, but I am not sure if that has anything to do with this, so upgrade on your own risk)

Edit2:
Got bit confused, in the end I had to use quirk to manually read data, but if quirk was then removed it was still working afterwards.
> > > > Thank you philippe and gielie for your suggestions. I was not aware of the **pycache** folder, File Editor was hiding it. I tried to clear it, restart ZHA, HA, re-pair etc etc., but it keeps appearing with only "Firmware", no temperature or humidity.
> > > > I guess I'll let it be for now. Maybe it will change its mind eventually.
> > > 
> > > 
> > > You are not alone :) Same story, diagnostic shows that now temperature is not supported, but show nothing for both )))
> > > UPD: after yet another restart the humidity back to live, but not temperature )) Magic... I can read both values using Manage Zigbee Device, btw...
> > > UPD2: hm, now Download Diagnostic shows that all *value attributes supported, I did restart of the HA and guess what... it works... May be my manual execution of the Read Values in the Manage Zigbee Device did the trick, not sure..
> > > UPD3: similar comment [here](https://github.com/zigpy/zha-device-handlers/issues/2851#issuecomment-1985536173), so may be really reading values manually do the magic...
> > 
> > 
> > UPD3 seems to do it...same procedure as described, manual reading, temperature and humidity could be read but were not available as entities in the device, then restarting HA and - MAGIC - they're here and updating!
> > Let's see if it stays this way, if you compare my comment some days ago I was somehow able to get both values directly after adding the device with the custom quirk, but then the values stopped both updating.
> 
> Do you use any quirk? If yes which one?
> 
> Edit: yes it looks like it is finally working also for me without any quirk. Just read those values and restart the HA ( I recently also updated HA to newest version 2024.3.1, if anybody interested, but I am not sure if that has anything to do with this, so upgrade on your own risk)

I was using this querk from philipedeswert above https://github.com/zigpy/zha-device-handlers/issues/2862#issuecomment-1975062539. I am running HA 2024.2.5 at the moment. The values are still updating this morning :-)
I will try without querk after your comment and give an update later
Worked for me too, doing the manual reading. Afterwards, humidity and temperature appears and seems to update. Hope it continues to work :)   Thanks for bringing that idea out there!

Still using the quirk. Don't know if it will work without the quirk.
> Worked for me too, doing the manual reading. Afterwards, humidity and temperature appears and seems to update. Hope it continues to work :) Thanks for bringing that idea out there!
> 
> Still using the quirk. Don't know if it will work without the quirk.

No, it doesn't work without quirk, even can't read values manually. 
The version in this [comment](https://github.com/zigpy/zha-device-handlers/issues/2862#issuecomment-1975062539) from @philippedeswert  works for me ( needed to re-pair the device, then restart HA, as initially I had no temperature and no humidity)
I do have _TZ3000_zl1kmjqx and with quirk in this [comment](https://github.com/zigpy/zha-device-handlers/issues/2862#issuecomment-1974011027) it is working for me.
I just did a reconfig + restart of HA, than it started working. Thank you!

Only what I had to do is to adjust MODELS_INFO to:

MODELS_INFO: [
            ("_TZ3000_bjawzodf", "TY0201"),
            ("_TZ3000_zl1kmjqx", "TY0201"),
            ("_TZ3000_zl1kmjqx", "") ]
The file from @philippedeswert worked for me too, thanks!
Summary of steps I took to get _TZ3000_bjawzodf working in Home Assistant, using the above comments:

1. Download [the quirk by @philippedeswert](https://github.com/zigpy/zha-device-handlers/files/14471995/ty0201.txt).
1. Move the file to your Home Assistant ZHA quirks directory (in my case `/config/zha_quirks`) and change the file extension to `.py` (since it is written in Python) so that you end up with `/config/zha_quirks/ty0201.py`.
1. Ensure your ZHA quirks directory is in your HA `configuration.yaml`:
   ```
   zha:
     custom_quirks_path: /config/zha_quirks  
   ```
1. Remove the thermometer from HA if it was previously added. 
1. Restart Home Assistant.
1. Add the thermometer to HA.
1. Verify under the device's 'Zigbee info' section in HA that the quirk is being used. Should say:
   ```
   Quirk: tuya_ty0201_thermometer.TemperatureHumiditySensorWithScreen
   ```
1. If the temperature and humidity values are not showing, go to the device in HA and select Triple Dots -> Manage zigbee device -> select TuyaAirQualityHumidity in clusters -> measured_value in attributes -> read attribute. Repeat the same for the TuyaAirQualityTemperature cluster. Restart HA again. Verify in the device's 'Download diagnostics' that the temperature and humidity are no longer unsupported values - you may need to refresh the page to see the sensors.
Thanks @holocronweaver and @philippedeswert for the file and the step-by-step summary of how to solve this problem.
Finally this worked for me!
Recently got to play with this device and I see the fix is already out there. Thanks to @philippedeswert  in https://github.com/zigpy/zha-device-handlers/issues/2862#issuecomment-1975062539 

This is not the only request for support, there's also #2851 and #2701 so many people are using this sensor. Digging through github issues and installing custom quirks might be too much for some however.

@philippedeswert would you be so kind as to send a PR to add the quirk to the repo and help any future users? Otherwise I can do that for you.
> @philippedeswert would you be so kind as to send a PR to add the quirk to the repo and help any future users? Otherwise I can do that for you.

I could, I just don't feel like the quirk is actually 100% correct. OTOH a PR might get some eyes on it that could make it work 100%. I'll see what I can do later tonight.

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"
              }
            }
          }
```
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)
Yah, you can try but the quirks doesn't work for me unfortunately. 
I'll see if I can figure it out in the weekend, and update if anything positive comes out.
> 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
Sorry I haven't tried it yet.. other things got priority...

On Wed, 22 Nov 2023 at 12:52, Yurii Abramkin ***@***.***>
wrote:

> 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
>
> —
> Reply to this email directly, view it on GitHub
> <https://github.com/zigpy/zha-device-handlers/issues/2701#issuecomment-1822715663>,
> or unsubscribe
> <https://github.com/notifications/unsubscribe-auth/AJLKOIXJ2ZGE2E4VTVCB77TYFXYPBAVCNFSM6AAAAAA63GSALGVHI2DSMVQWIX3LMV43OSLTON2WKQ3PNVWWK3TUHMYTQMRSG4YTKNRWGM>
> .
> You are receiving this because you commented.Message ID:
> ***@***.***>
>

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.
same issue here
Hi and Happy new year 2024.

Same issue here, work like a charm with Tuya gateway, no humidity with Zigbee

Tnanks
There appears to be a more lively (but still yet unresolved) discussion on this device over here:
https://github.com/zigpy/zha-device-handlers/issues/2862

Resolving patch:
diff --git a/zhaquirks/tuya/ty0201.py b/zhaquirks/tuya/ty0201.py
new file mode 100644
--- /dev/null
+++ b/zhaquirks/tuya/ty0201.py
@@ -0,0 +1,62 @@
+"""Tuya TY0201 temperature and humidity sensor."""
+
+from zigpy.profiles import zha
+from zigpy.profiles.zha import DeviceType
+from zigpy.quirks import CustomDevice
+from zigpy.zcl.clusters.general import Basic, Identify, Ota, PowerConfiguration
+from zigpy.zcl.clusters.measurement import RelativeHumidity, TemperatureMeasurement
+
+from zhaquirks.const import (
+    DEVICE_TYPE,
+    ENDPOINTS,
+    INPUT_CLUSTERS,
+    MODELS_INFO,
+    OUTPUT_CLUSTERS,
+    PROFILE_ID,
+)
+from zhaquirks.tuya.air import TuyaAirQualityHumidity, TuyaAirQualityTemperature
+
+
+class TuyaTempHumiditySensor(CustomDevice):
+    """Temu/Aliexpress temperature and humidity sensor."""
+
+    signature = {
+        #  <SimpleDescriptor endpoint=1, profile=260, device_type="0x0302"
+        #  input_clusters=["0x000", "0x0001", "0x0003", "0x0402", "0x0405"]
+        #  output_clusters=["0x0019"]>
+        MODELS_INFO: [("_TZ3000_bjawzodf", "TY0201"),
+                      ("_TZ3000_zl1kmjqx", "TY0201")],
+        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,
+                ],
+                OUTPUT_CLUSTERS: [
+                    Ota.cluster_id,
+                ],
+            },
+        },
+    }
+
+    replacement = {
+        ENDPOINTS: {
+            1: {
+                INPUT_CLUSTERS: [
+                    Basic.cluster_id,
+                    PowerConfiguration.cluster_id,
+                    Identify.cluster_id,
+                    TuyaAirQualityTemperature,
+                    TuyaAirQualityHumidity,
+                ],
+                OUTPUT_CLUSTERS: [
+                    Ota.cluster_id,
+                ],
+            },
+        },
+    }


Test patch: