### Problem description
I have purchased this small Zigbee temperature/humidity… sensor with screen from Aliexpress https://a.aliexpress.com/_mL7xBbs

It has a perfect form factor for my gecko tank. Unfortunately there are two issues that I have found with using these devices on ZHA
1. Humidity reporting does not display properly in Home Assistant, but only when the humidity is above 65.5%. When the humidity is below 65.5%, it works perfectly. See the following graph as the humidity rises at night in my gecko tank. Once the humidity rises above 65.5%, the humidity drops to a truncated value of 0 then continues to rise even though the display on the device shows the correct, higher value.

Someone else reported the issue here but didn't understand why it was happening https://community.home-assistant.io/t/ts0201-by-tz3210-ncw88jfq-reports-wrong-humidity-still/654814
2. The screen defaults to celsius but supports switching to Fahrenheit if sent a Zigbee command. This is not currently supported in this device in ZHA. I was able to successfully switch them to Fahrenheit when connected to a Zuya Zigbee hub, but they switch back to Celsius when they are reset to connect to ZHA.
### Solution description
For the problems outline above:
1. I would like humidity to be reported accurately in ZHA. I have done some debugging of this issue and I have figured out how to convert the humidity to the correct values. This sensor has a weird reporting scheme:
For humidity values below 65.5%, the device sends out the humidity multiplied by 100. For example, 11.1% humidity is 1110, and 62.6% humidity is 6260. The last digit is **always** a 0. That's easy enough, HA reports these values fine.
HOWEVER for humidity values above 65.5%, the device CHANGES its reporting scheme to a new one where the last digit is **always** a 6 and the remaining digits start over at 0. So for example, if the actual humidity is 67.6, then the device is sending a reported humidity value of 216. If the actual humidity is 95.3%, the device is sending a reported humidity value of 2986.
2. I would like the ability to switch the device display to Fahrenheit in ZHA. I'm not sure if this is helpful for ZHA, but I followed the directions for Zigbee2MQTT to find the Tuya DP (https://www.zigbee2mqtt.io/advanced/support-new-devices/03_find_tuya_data_points.html#_5-link-your-tuya-account-with-your-new-tuya-project) and the datapoint was 101.

### 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",
"0x0402",
"0x0405",
"0xef00"
],
"output_clusters": [
"0x000a",
"0x0019"
]
}
},
"manufacturer": "_TZ3210_ncw88jfq",
"model": "TS0201",
"class": "zigpy.device.Device"
}
```
</details>
### Diagnostic information
<details><summary>Diagnostic information</summary>
```json
{
"home_assistant": {
"installation_type": "Home Assistant OS",
"version": "2024.4.1",
"dev": false,
"hassio": true,
"virtualenv": false,
"python_version": "3.12.2",
"docker": true,
"arch": "x86_64",
"timezone": "America/Denver",
"os_name": "Linux",
"os_version": "6.6.20-haos",
"supervisor": "2024.03.1",
"host_os": "Home Assistant OS 12.1",
"docker_version": "24.0.7",
"chassis": "vm",
"run_as_root": true
},
"custom_components": {},
"integration_manifest": {
"domain": "zha",
"name": "Zigbee Home Automation",
"after_dependencies": [
"onboarding",
"usb"
],
"codeowners": [
"@dmulcahey",
"@adminiuga",
"@puddly",
"@TheJulianJES"
],
"config_flow": true,
"dependencies": [
"file_upload"
],
"documentation": "https://www.home-assistant.io/integrations/zha",
"iot_class": "local_polling",
"loggers": [
"aiosqlite",
"bellows",
"crccheck",
"pure_pcapy3",
"zhaquirks",
"zigpy",
"zigpy_deconz",
"zigpy_xbee",
"zigpy_zigate",
"zigpy_znp",
"universal_silabs_flasher"
],
"requirements": [
"bellows==0.38.1",
"pyserial==3.5",
"pyserial-asyncio==0.6",
"zha-quirks==0.0.113",
"zigpy-deconz==0.23.1",
"zigpy==0.63.5",
"zigpy-xbee==0.20.1",
"zigpy-zigate==0.12.0",
"zigpy-znp==0.12.1",
"universal-silabs-flasher==0.0.18",
"pyserial-asyncio-fast==0.11"
],
"usb": [
{
"vid": "10C4",
"pid": "EA60",
"description": "*2652*",
"known_devices": [
"slae.sh cc2652rb stick"
]
},
{
"vid": "10C4",
"pid": "EA60",
"description": "*slzb-07*",
"known_devices": [
"smlight slzb-07"
]
},
{
"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": 51955,
"manufacturer": "_TZ3210_ncw88jfq",
"model": "TS0201",
"name": "_TZ3210_ncw88jfq TS0201",
"quirk_applied": false,
"quirk_class": "zigpy.device.Device",
"quirk_id": null,
"manufacturer_code": 4417,
"power_source": "Battery or Unknown",
"lqi": 224,
"rssi": -44,
"last_seen": "2024-04-07T22:12:35",
"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",
"0x0402",
"0x0405",
"0xef00"
],
"output_clusters": [
"0x000a",
"0x0019"
]
}
},
"manufacturer": "_TZ3210_ncw88jfq",
"model": "TS0201"
},
"active_coordinator": false,
"entities": [
{
"entity_id": "sensor.test_screen_battery",
"name": "_TZ3210_ncw88jfq TS0201"
},
{
"entity_id": "update.test_screen_firmware",
"name": "_TZ3210_ncw88jfq TS0201"
},
{
"entity_id": "sensor.test_screen_humidity",
"name": "_TZ3210_ncw88jfq TS0201"
},
{
"entity_id": "sensor.test_screen_temperature",
"name": "_TZ3210_ncw88jfq TS0201"
}
],
"neighbors": [],
"routes": [],
"endpoint_names": [
{
"name": "TEMPERATURE_SENSOR"
}
],
"user_given_name": "test screen",
"device_reg_id": "1e1323279747e8df9ab86629eda20b0a",
"area_id": "master_bedroom",
"cluster_details": {
"1": {
"device_type": {
"name": "TEMPERATURE_SENSOR",
"id": 770
},
"profile_id": 260,
"in_clusters": {
"0x0001": {
"endpoint_attribute": "power",
"attributes": {
"0x0021": {
"attribute_name": "battery_percentage_remaining",
"value": 200
},
"0x0020": {
"attribute_name": "battery_voltage",
"value": 30
}
},
"unsupported_attributes": {
"0x0031": {
"attribute_name": "battery_size"
},
"0x0033": {
"attribute_name": "battery_quantity"
}
}
},
"0x0402": {
"endpoint_attribute": "temperature",
"attributes": {
"0x0000": {
"attribute_name": "measured_value",
"value": 2140
}
},
"unsupported_attributes": {}
},
"0x0405": {
"endpoint_attribute": "humidity",
"attributes": {
"0x0000": {
"attribute_name": "measured_value",
"value": 3710
}
},
"unsupported_attributes": {}
},
"0xef00": {
"endpoint_attribute": null,
"attributes": {},
"unsupported_attributes": {}
},
"0x0000": {
"endpoint_attribute": "basic",
"attributes": {
"0x0004": {
"attribute_name": "manufacturer",
"value": "_TZ3210_ncw88jfq"
},
"0x0005": {
"attribute_name": "model",
"value": "TS0201"
}
},
"unsupported_attributes": {}
}
},
"out_clusters": {
"0x0019": {
"endpoint_attribute": "ota",
"attributes": {
"0x0002": {
"attribute_name": "current_file_version",
"value": 131
}
},
"unsupported_attributes": {}
},
"0x000a": {
"endpoint_attribute": "time",
"attributes": {},
"unsupported_attributes": {}
}
}
}
}
}
}
```
</details>
### Logs
<details><summary>Logs</summary>
```python
[Paste the logs here]
```
</details>
### Custom quirk
<details><summary>Custom quirk</summary>
```python
[Paste your custom quirk here]
```
</details>
### Additional information
_No response_