Repository: zigpy/zha-device-handlers

Issue:
[Device Support Request] Tuya siren zigbee 3.0
## **Is your feature request related to a problem? Please describe.**
Hi all, i just bought this zigbee 3.0 siren : 
[Tuya Zigbee Smart Siren Alarm With temperature and Humidity Sensor Works With TUYA Smart Hub](https://a.aliexpress.com/_msosKhR)
I achieved to add it using ZHA (I have a SonOff Zigbee bridge as Coordinator)
But there is no entites in the device (no switch to toggle the alarm, no temp and humidity sensors, nothing !), here is a picture :
![zigbee_siren_issue](https://user-images.githubusercontent.com/41644590/102664460-1c860b00-4183-11eb-8c68-d57402d140ab.png)


## **Describe the solution you'd like**
It would be great if there was switch entity for the alarm siren (so we can control alarm sound), and sensors for temperature and humidity since this device is supposed to have those.

## **Device signature - this can be acquired by removing the device from ZHA and pairing it again from the add devices screen. Be sure to add the entire content of the log panel after pairing the device to a code block below this line.**
Zigbee device signature from ZHA :
```json
{
  "node_descriptor": "NodeDescriptor(byte1=2, byte2=64, mac_capability_flags=128, manufacturer_code=4098, maximum_buffer_size=82, maximum_incoming_transfer_size=82, server_mask=11264, maximum_outgoing_transfer_size=82, descriptor_capability_field=0)",
  "endpoints": {
    "1": {
      "profile_id": 260,
      "device_type": "0x0051",
      "in_clusters": [
        "0x0000",
        "0x0004",
        "0x0005",
        "0xef00"
      ],
      "out_clusters": [
        "0x000a",
        "0x0019"
      ]
    }
  },
  "manufacturer": "_TZE200_d0yu2xgi",
  "model": "TS0601",
  "class": "zigpy.device.Device"
}
```

Here are the logs from ZHA while adding the device :
```txt

[0x0000:zdo] ZDO request ZDOCmd.Mgmt_Permit_Joining_req: [60, <Bool.false: 0>]
Device 0xc030 (84:2e:14:ff:fe:db:84:32) joined the network
[0xc030] Requesting 'Node Descriptor'
Tries remaining: 2
[0xc030] Extending timeout for 0x50 request
Device 0xc030 (84:2e:14:ff:fe:db:84:32) joined the network
Skip initialization for existing device 84:2e:14:ff:fe:db:84:32
Device 0xc030 (84:2e:14:ff:fe:db:84:32) joined the network
Skip initialization for existing device 84:2e:14:ff:fe:db:84:32
[0xc030:zdo] ZDO request ZDOCmd.Device_annce: [0xC030, 84:2e:14:ff:fe:db:84:32, 128]
[0xc030] Node Descriptor: NodeDescriptor(byte1=2, byte2=64, mac_capability_flags=128, manufacturer_code=4098, maximum_buffer_size=82, maximum_incoming_transfer_size=82, server_mask=11264, maximum_outgoing_transfer_size=82, descriptor_capability_field=0)
[0xc030] Discovering endpoints
Tries remaining: 3
[0xc030] Extending timeout for 0x52 request
[0xc030] Discovered endpoints: [1]
[0xc030:1] Discovering endpoint information
Tries remaining: 3
[0xc030] Extending timeout for 0x54 request
[0xc030:1] Discovered endpoint information: SizePrefixedSimpleDescriptor(endpoint=1, profile=260, device_type=81, device_version=1, input_clusters=[0, 4, 5, 61184], output_clusters=[25, 10])
Unknown cluster 61184
[0xc030] Extending timeout for 0x56 request
[0xc030:1:0x0000] ZCL deserialize: <ZCLHeader frame_control=<FrameControl frame_type=GLOBAL_COMMAND manufacturer_specific=False is_reply=True disable_default_response=True> manufacturer=None tsn=86 command_id=Command.Read_Attributes_rsp>
[0xc030:1] Manufacturer: _TZE200_d0yu2xgi
[0xc030:1] Model: TS0601
Checking quirks for _TZE200_d0yu2xgi TS0601 (84:2e:14:ff:fe:db:84:32)
Considering <class 'bellows.zigbee.application.EZSPCoordinator'>
Fail because device_type mismatch on at least one endpoint
Considering <class 'zhaquirks.gledopto.soposhgu10.SoposhGU10'>
Fail because endpoint list mismatch: {11, 13} {1}
Considering <class 'zhaquirks.netvox.z308e3ed.Z308E3ED'>
Fail because device_type mismatch on at least one endpoint
Considering <class 'zhaquirks.philips.rom001.PhilipsROM001'>
Fail because device_type mismatch on at least one endpoint
Considering <class 'zhaquirks.philips.rwl020.PhilipsRWL020'>
Fail because endpoint list mismatch: {1, 2} {1}
Considering <class 'zhaquirks.philips.rwl021.PhilipsRWL021'>
Fail because endpoint list mismatch: {1, 2} {1}
Considering <class 'zhaquirks.smartthings.multi.SmartthingsMultiPurposeSensor'>
Fail because device_type mismatch on at least one endpoint
Considering <class 'zhaquirks.smartthings.tag_v4.SmartThingsTagV4'>
Fail because device_type mismatch on at least one endpoint
Considering <class 'zhaquirks.xbee.xbee3_io.XBee3Sensor'>
Fail because endpoint list mismatch: {232, 230} {1}
Considering <class 'zhaquirks.xbee.xbee_io.XBeeSensor'>
Fail because endpoint list mismatch: {232, 230} {1}
device - 0xC030:84:2e:14:ff:fe:db:84:32 entering async_device_initialized - is_new_join: True
device - 0xC030:84:2e:14:ff:fe:db:84:32 has joined the ZHA zigbee network
[0xC030](TS0601): started configuration
[0xC030:ZDO](TS0601): 'async_configure' stage succeeded
[0xc030] Extending timeout for 0x58 request
[0xc030] Extending timeout for 0x5a request
[0xc030:zdo] ZDO request ZDOCmd.Node_Desc_req: [0x0000]
[0xc030:zdo] Unsupported ZDO request:ZDOCmd.Node_Desc_req
[0xC030:1:0x0000]: bound 'basic' cluster: Status.SUCCESS
[0xC030:1:0x0000]: finished channel configuration
[0xc030] Extending timeout for 0x5c request
[0xC030:1:0x0019]: bound 'ota' cluster: Status.SUCCESS
[0xC030:1:0x0019]: finished channel configuration
[0xc030:1:0x0000] ZCL deserialize: <ZCLHeader frame_control=<FrameControl frame_type=GLOBAL_COMMAND manufacturer_specific=False is_reply=True disable_default_response=True> manufacturer=None tsn=92 command_id=Command.Read_Attributes_rsp>
[0xC030:1:0x0000]: initializing channel: from_cache: False
[0xC030:1:0x0000]: 'async_configure' stage succeeded
[0xC030:1:0x0019]: 'async_configure' stage succeeded
[0xC030](TS0601): completed configuration
[0xC030](TS0601): stored in registry: ZhaDeviceEntry(name='_TZE200_d0yu2xgi TS0601', ieee='84:2e:14:ff:fe:db:84:32', last_seen=1608275398.9227688)
[0xC030](TS0601): started initialization
[0xC030:ZDO](TS0601): 'async_initialize' stage succeeded
[0xc030] Extending timeout for 0x5e request
[0xC030:1:0x0019]: initializing channel: from_cache: False
[0xc030:1:0x0000] ZCL deserialize: <ZCLHeader frame_control=<FrameControl frame_type=GLOBAL_COMMAND manufacturer_specific=False is_reply=True disable_default_response=True> manufacturer=None tsn=94 command_id=Command.Read_Attributes_rsp>
[0xC030:1:0x0000]: initializing channel: from_cache: False
[0xC030:1:0x0000]: 'async_initialize' stage succeeded
[0xC030:1:0x0019]: 'async_initialize' stage succeeded
[0xC030](TS0601): power source: Battery or Unknown
[0xC030](TS0601): completed initialization
[0xc030:1:0x000a] ZCL deserialize: <ZCLHeader frame_control=<FrameControl frame_type=GLOBAL_COMMAND manufacturer_specific=False is_reply=False disable_default_response=False> manufacturer=None tsn=73 command_id=Command.Read_Attributes>
[0xc030:1:0x000a] ZCL request 0x0000: [[7]]
[0x8C07:1:0x0b04]: async_update
[0x7114:1:0x0b04]: async_update
[0xB9E3:1:0x0b04]: async_update
[0x7114:1:0x0b04] ZCL deserialize: <ZCLHeader frame_control=<FrameControl frame_type=GLOBAL_COMMAND manufacturer_specific=False is_reply=True disable_default_response=True> manufacturer=None tsn=99 command_id=Command.Read_Attributes_rsp>
[0x8c07:1:0x0b04] ZCL deserialize: <ZCLHeader frame_control=<FrameControl frame_type=GLOBAL_COMMAND manufacturer_specific=False is_reply=True disable_default_response=True> manufacturer=None tsn=97 command_id=Command.Read_Attributes_rsp>
[0xb9e3:1:0x0b04] ZCL deserialize: <ZCLHeader frame_control=<FrameControl frame_type=GLOBAL_COMMAND manufacturer_specific=False is_reply=True disable_default_response=True> manufacturer=None tsn=101 command_id=Command.Read_Attributes_rsp>
[0xc030:1:0xef00] ZCL deserialize: <ZCLHeader frame_control=<FrameControl frame_type=CLUSTER_COMMAND manufacturer_specific=False is_reply=True disable_default_response=True> manufacturer=None tsn=74 command_id=36>
[0xc030:1:0xef00] Unknown cluster-specific command 36
[0xc030:1:0xef00] ZCL request 0x0024: b'\x00"'
[0xc030:1:0xef00] No handler for cluster command 36
[0xc030:1:0xef00] ZCL deserialize: <ZCLHeader frame_control=<FrameControl frame_type=CLUSTER_COMMAND manufacturer_specific=False is_reply=True disable_default_response=False> manufacturer=None tsn=75 command_id=2>
[0xc030:1:0xef00] Unknown cluster-specific command 2
[0xc030:1:0xef00] ZCL request 0x0002: b"\x00\x02j\x02\x00\x04\x00\x00\x00'"
[0xc030:1:0xef00] No handler for cluster command 2
[0xc030:1:0xef00] ZCL deserialize: <ZCLHeader frame_control=<FrameControl frame_type=CLUSTER_COMMAND manufacturer_specific=False is_reply=True disable_default_response=False> manufacturer=None tsn=75 command_id=2>
[0xc030:1:0xef00] Unknown cluster-specific command 2
[0xc030:1:0xef00] ZCL request 0x0002: b"\x00\x02j\x02\x00\x04\x00\x00\x00'"
[0xc030:1:0xef00] No handler for cluster command 2
[0xc030:1:0xef00] ZCL deserialize: <ZCLHeader frame_control=<FrameControl frame_type=CLUSTER_COMMAND manufacturer_specific=False is_reply=True disable_default_response=False> manufacturer=None tsn=75 command_id=2>
[0xc030:1:0xef00] Unknown cluster-specific command 2
[0xc030:1:0xef00] ZCL request 0x0002: b"\x00\x02j\x02\x00\x04\x00\x00\x00'"
[0xc030:1:0xef00] No handler for cluster command 2
[0xc030:1:0xef00] ZCL deserialize: <ZCLHeader frame_control=<FrameControl frame_type=CLUSTER_COMMAND manufacturer_specific=False is_reply=True disable_default_response=False> manufacturer=None tsn=75 command_id=2>
[0xc030:1:0xef00] Unknown cluster-specific command 2
[0xc030:1:0xef00] ZCL request 0x0002: b"\x00\x02j\x02\x00\x04\x00\x00\x00'"
[0xc030:1:0xef00] No handler for cluster command 2
[0xc030:1:0xef00] ZCL deserialize: <ZCLHeader frame_control=<FrameControl frame_type=CLUSTER_COMMAND manufacturer_specific=False is_reply=True disable_default_response=False> manufacturer=None tsn=75 command_id=2>
[0xc030:1:0xef00] Unknown cluster-specific command 2
[0xc030:1:0xef00] ZCL request 0x0002: b"\x00\x02j\x02\x00\x04\x00\x00\x00'"
[0xc030:1:0xef00] No handler for cluster command 2
[0xc030:1:0xef00] ZCL deserialize: <ZCLHeader frame_control=<FrameControl frame_type=CLUSTER_COMMAND manufacturer_specific=False is_reply=True disable_default_response=False> manufacturer=None tsn=75 command_id=2>
[0xc030:1:0xef00] Unknown cluster-specific command 2
[0xc030:1:0xef00] ZCL request 0x0002: b"\x00\x02j\x02\x00\x04\x00\x00\x00'"
[0xc030:1:0xef00] No handler for cluster command 2
[0xc030:1:0xef00] ZCL deserialize: <ZCLHeader frame_control=<FrameControl frame_type=CLUSTER_COMMAND manufacturer_specific=False is_reply=True disable_default_response=False> manufacturer=None tsn=75 command_id=2>
[0xc030:1:0xef00] Unknown cluster-specific command 2
[0xc030:1:0xef00] ZCL request 0x0002: b"\x00\x02j\x02\x00\x04\x00\x00\x00'"
[0xc030:1:0xef00] No handler for cluster command 2
[0xc030:1:0xef00] ZCL deserialize: <ZCLHeader frame_control=<FrameControl frame_type=CLUSTER_COMMAND manufacturer_specific=False is_reply=True disable_default_response=False> manufacturer=None tsn=75 command_id=2>
[0xc030:1:0xef00] Unknown cluster-specific command 2
[0xc030:1:0xef00] ZCL request 0x0002: b"\x00\x02j\x02\x00\x04\x00\x00\x00'"
[0xc030:1:0xef00] No handler for cluster command 2
[0xc030:1:0xef00] ZCL deserialize: <ZCLHeader frame_control=<FrameControl frame_type=CLUSTER_COMMAND manufacturer_specific=False is_reply=True disable_default_response=False> manufacturer=None tsn=75 command_id=2>
[0xc030:1:0xef00] Unknown cluster-specific command 2
[0xc030:1:0xef00] ZCL request 0x0002: b"\x00\x02j\x02\x00\x04\x00\x00\x00'"
[0xc030:1:0xef00] No handler for cluster command 2
[0xc030:1:0xef00] ZCL deserialize: <ZCLHeader frame_control=<FrameControl frame_type=CLUSTER_COMMAND manufacturer_specific=False is_reply=True disable_default_response=False> manufacturer=None tsn=75 command_id=2>
[0xc030:1:0xef00] Unknown cluster-specific command 2
[0xc030:1:0xef00] ZCL request 0x0002: b"\x00\x02j\x02\x00\x04\x00\x00\x00'"
[0xc030:1:0xef00] No handler for cluster command 2
[0xc030:1:0xef00] ZCL deserialize: <ZCLHeader frame_control=<FrameControl frame_type=CLUSTER_COMMAND manufacturer_specific=False is_reply=True disable_default_response=False> manufacturer=None tsn=75 command_id=2>
[0xc030:1:0xef00] Unknown cluster-specific command 2
[0xc030:1:0xef00] ZCL request 0x0002: b"\x00\x02j\x02\x00\x04\x00\x00\x00'"
[0xc030:1:0xef00] No handler for cluster command 2
[0xc030:1:0xef00] ZCL deserialize: <ZCLHeader frame_control=<FrameControl frame_type=CLUSTER_COMMAND manufacturer_specific=False is_reply=True disable_default_response=False> manufacturer=None tsn=75 command_id=2>
[0xc030:1:0xef00] Unknown cluster-specific command 2
[0xc030:1:0xef00] ZCL request 0x0002: b"\x00\x02j\x02\x00\x04\x00\x00\x00'"
[0xc030:1:0xef00] No handler for cluster command 2
[0xc030:1:0xef00] ZCL deserialize: <ZCLHeader frame_control=<FrameControl frame_type=CLUSTER_COMMAND manufacturer_specific=False is_reply=True disable_default_response=False> manufacturer=None tsn=75 command_id=2>
[0xc030:1:0xef00] Unknown cluster-specific command 2
[0xc030:1:0xef00] ZCL request 0x0002: b"\x00\x02j\x02\x00\x04\x00\x00\x00'"
[0xc030:1:0xef00] No handler for cluster command 2
[0xc030:1:0xef00] ZCL deserialize: <ZCLHeader frame_control=<FrameControl frame_type=CLUSTER_COMMAND manufacturer_specific=False is_reply=True disable_default_response=False> manufacturer=None tsn=76 command_id=17>
[0xc030:1:0xef00] Unknown cluster-specific command 17
[0xc030:1:0xef00] ZCL request 0x0011: b'\x00#@'
[0xc030:1:0xef00] No handler for cluster command 17
[0x8C07:1:0x0b04]: async_update
[0x7114:1:0x0b04]: async_update
[0xB9E3:1:0x0b04]: async_update
[0x7114:1:0x0b04] ZCL deserialize: <ZCLHeader frame_control=<FrameControl frame_type=GLOBAL_COMMAND manufacturer_specific=False is_reply=True disable_default_response=True> manufacturer=None tsn=105 command_id=Command.Read_Attributes_rsp>
[0x8c07:1:0x0b04] ZCL deserialize: <ZCLHeader frame_control=<FrameControl frame_type=GLOBAL_COMMAND manufacturer_specific=False is_reply=True disable_default_response=True> manufacturer=None tsn=103 command_id=Command.Read_Attributes_rsp>
[0x8c07:1:0x0b04] ZCL deserialize: <ZCLHeader frame_control=<FrameControl frame_type=GLOBAL_COMMAND manufacturer_specific=False is_reply=True disable_default_response=True> manufacturer=None tsn=103 command_id=Command.Read_Attributes_rsp>
[0x8c07:1:0x0b04] ZCL request 0x0001: [[ReadAttributeRecord(attrid=1291, status=<Status.SUCCESS: 0>, value=<TypeValue type=int16s, value=0>)]]
[0x8c07:1:0x0b04] ZCL deserialize: <ZCLHeader frame_control=<FrameControl frame_type=GLOBAL_COMMAND manufacturer_specific=False is_reply=True disable_default_response=True> manufacturer=None tsn=103 command_id=Command.Read_Attributes_rsp>
[0x8c07:1:0x0b04] ZCL request 0x0001: [[ReadAttributeRecord(attrid=1291, status=<Status.SUCCESS: 0>, value=<TypeValue type=int16s, value=0>)]]
[0xb9e3:1:0x0b04] ZCL deserialize: <ZCLHeader frame_control=<FrameControl frame_type=GLOBAL_COMMAND manufacturer_specific=False is_reply=True disable_default_response=True> manufacturer=None tsn=107 command_id=Command.Read_Attributes_rsp>
[0x8C07:1:0x0b04]: async_update
[0x7114:1:0x0b04]: async_update
[0xB9E3:1:0x0b04]: async_update
[0x7114:1:0x0b04] ZCL deserialize: <ZCLHeader frame_control=<FrameControl frame_type=GLOBAL_COMMAND manufacturer_specific=False is_reply=True disable_default_response=True> manufacturer=None tsn=111 command_id=Command.Read_Attributes_rsp>
[0x8c07:1:0x0b04] ZCL deserialize: <ZCLHeader frame_control=<FrameControl frame_type=GLOBAL_COMMAND manufacturer_specific=False is_reply=True disable_default_response=True> manufacturer=None tsn=109 command_id=Command.Read_Attributes_rsp>
[0xb9e3:1:0x0b04] ZCL deserialize: <ZCLHeader frame_control=<FrameControl frame_type=GLOBAL_COMMAND manufacturer_specific=False is_reply=True disable_default_response=True> manufacturer=None tsn=113 command_id=Command.Read_Attributes_rsp>
[0x8C07:1:0x0b04]: async_update
[0x7114:1:0x0b04]: async_update
[0xB9E3:1:0x0b04]: async_update
[0x7114:1:0x0b04] ZCL deserialize: <ZCLHeader frame_control=<FrameControl frame_type=GLOBAL_COMMAND manufacturer_specific=False is_reply=True disable_default_response=True> manufacturer=None tsn=117 command_id=Command.Read_Attributes_rsp>
[0x8c07:1:0x0b04] ZCL deserialize: <ZCLHeader frame_control=<FrameControl frame_type=GLOBAL_COMMAND manufacturer_specific=False is_reply=True disable_default_response=True> manufacturer=None tsn=115 command_id=Command.Read_Attributes_rsp>
[0xb9e3:1:0x0b04] ZCL deserialize: <ZCLHeader frame_control=<FrameControl frame_type=GLOBAL_COMMAND manufacturer_specific=False is_reply=True disable_default_response=True> manufacturer=None tsn=119 command_id=Command.Read_Attributes_rsp>
```

## **Additional context**
I already tried to remove it and add it back in ZHA, but still nothing.
I will take a look on how to contribute, but I post this here if anyone wants to help !
Thanks !


Discussion:
Ok so first I checked if there was any similar quirk already written, and it seems that #444 is a very similar product.
Moreover it has been implemented in #530, but it is not exactly the same as my device, so I will take a look, but any help is welcome !
Signature is different, but it is Tuya, so functionality wise could be the same. 
Hi thanks for your reply, but even though I am following the steps as described [here](https://github.com/zigpy/zha-device-handlers#testing-quirks-in-development-in-docker-based-install), I can't get ZHA to use a custom quirk for my device, it doesn't want to check if the quirk in `tuya/siren.py` is working for my device even though I added my device signature [here](https://github.com/zigpy/zha-device-handlers/blob/fbe1e8045f0bd471bf1d69effb413f7f67ef6a23/zhaquirks/tuya/siren.py#L150). It is also not checking for a custom quirk 

It is weird because ZHA is always 'considering' the same quirks(even for my other Zigbee devices) whatever the device signature. It is never 'considering' tuya siren class or my custom siren class if I try to add one, see here in the logs :

```txt
[0xc030:1] Manufacturer: _TZE200_d0yu2xgi
[0xc030:1] Model: TS0601
Checking quirks for _TZE200_d0yu2xgi TS0601 (84:2e:14:ff:fe:db:84:32)
Considering <class 'bellows.zigbee.application.EZSPCoordinator'>
Fail because device_type mismatch on at least one endpoint
Considering <class 'zhaquirks.gledopto.soposhgu10.SoposhGU10'>
Fail because endpoint list mismatch: {11, 13} {1}
Considering <class 'zhaquirks.netvox.z308e3ed.Z308E3ED'>
Fail because device_type mismatch on at least one endpoint
Considering <class 'zhaquirks.philips.rom001.PhilipsROM001'>
Fail because device_type mismatch on at least one endpoint
Considering <class 'zhaquirks.philips.rwl020.PhilipsRWL020'>
Fail because endpoint list mismatch: {1, 2} {1}
Considering <class 'zhaquirks.philips.rwl021.PhilipsRWL021'>
Fail because endpoint list mismatch: {1, 2} {1}
Considering <class 'zhaquirks.smartthings.multi.SmartthingsMultiPurposeSensor'>
Fail because device_type mismatch on at least one endpoint
Considering <class 'zhaquirks.smartthings.tag_v4.SmartThingsTagV4'>
Fail because device_type mismatch on at least one endpoint
Considering <class 'zhaquirks.xbee.xbee3_io.XBee3Sensor'>
Fail because endpoint list mismatch: {232, 230} {1}
Considering <class 'zhaquirks.xbee.xbee_io.XBeeSensor'>
Fail because endpoint list mismatch: {232, 230} {1}
```
The steps I am following are still valid ?
Why is ZHA always considering the same quirks even with different signature ?
Why isn't it checking for the `tuya/siren.py` quirk even though I add my device signature 
By the way I am running Home Assistant OS 2020.12.1 64 bits on RPi4 4GB  on a SSD.

Thanks !
If it is not considering it, then most likely it did not find any in the dict by manufacturer and the model. 
Make sure you are testing on 2020.12 and post the file with your changed
Ok I understand it is possible it doesn't find it, but then why is it considering a for example `zhaquirks.philips.rom001.PhilipsROM001` quirk on each of my device ?

I am sure I am on 2020.12.1, and here are the 2 files I tested : 
[quirks.tar.gz](https://github.com/zigpy/zha-device-handlers/files/5721061/quirks.tar.gz)
In siren.py I just added my manufacturer and my model.
In siren_neo.py I also adjusted the endpoint to match mine.

But what is weird is that __pycache__ folders are not comming back when I remove them, as if my changes were not applied or something like that.
And also if I remove all the quirks except those in the tuya folder, it is still considering the defaults quirks(those I mentioned earlier).
Because those older  quirks don't have manufacturer model specified, so it tries to match it based on other criteria.
Ok, but I am still blocked with the fact that my `__pycache__` folders are not regenerated and thus my zha is maybe not considering my updates, what do you think I am doing wrong ?
🤷 What environment and were exactly did you put the files? Have you restarted HA after the change?

I have home assistant os on a raspberry pi 4, and I followed the steps involving the portainer addons so i put the files in the ..../zhaquirks/tuya folder, and yes i restarted after changes
Try asking in #zigbee channel on HA discord server. It is still not clear to me if this is a supervised install, HA Core or HassOS
Ok i'll try that.
It is HassOS
on  hass os just get dev access to console and run/modify files in the container directly. 
Ok i followed this : https://developers.home-assistant.io/docs/operating-system/debugging/
I am in the container but there is no difference with the portainer method, is there ?
I can see the changes I made by using portainer console
Ok I achieved to test my quirk, and now my device is working, see the result :
![zha](https://user-images.githubusercontent.com/41644590/103709667-65c3c080-4fb3-11eb-960e-1d64566015a3.png)
 I will try to make a pull request soon, it is just a tiny change in the `siren.py` file.

Resolving patch:
diff --git a/zhaquirks/tuya/siren.py b/zhaquirks/tuya/siren.py
--- a/zhaquirks/tuya/siren.py
+++ b/zhaquirks/tuya/siren.py
@@ -6,10 +6,10 @@
 from zigpy.quirks import CustomDevice
 import zigpy.types as t
 from zigpy.zcl import foundation
-from zigpy.zcl.clusters.general import Basic, Identify, OnOff, Ota
+from zigpy.zcl.clusters.general import Basic, Groups, Identify, OnOff, Ota, Scenes, Time
 from zigpy.zcl.clusters.measurement import RelativeHumidity, TemperatureMeasurement
 
-from . import TuyaManufClusterAttributes
+from . import TuyaManufCluster, TuyaManufClusterAttributes
 from .. import Bus, LocalDataCluster
 from ..const import (
     DEVICE_TYPE,
@@ -135,7 +135,7 @@ def humidity_reported(self, value):
 
 
 class TuyaSiren(CustomDevice):
-    """NEO Tuya Siren and humidity/temperature sensor."""
+    """NEO Tuya Siren and humidity/temperature sensor."""
 
     def __init__(self, *args, **kwargs):
         """Init device."""
@@ -175,3 +175,26 @@ def __init__(self, *args, **kwargs):
             }
         }
     }
+
+
+class TuyaSiren2(TuyaSiren):
+    """NEO Tuya Siren and humidity/temperature sensor."""
+
+    signature = {
+        #  endpoint=1 profile=260 device_type=81 device_version=1 input_clusters=[0, 4, 5, 61184]
+        #  output_clusters=[25, 10]>
+        MODELS_INFO: [("_TZE200_d0yu2xgi", "TS0601")],
+        ENDPOINTS: {
+            1: {
+                PROFILE_ID: zha.PROFILE_ID,
+                DEVICE_TYPE: zha.DeviceType.SMART_PLUG,
+                INPUT_CLUSTERS: [
+                    Basic.cluster_id,
+                    Groups.cluster_id,
+                    Scenes.cluster_id,
+                    TuyaManufCluster.cluster_id,
+                ],
+                OUTPUT_CLUSTERS: [Ota.cluster_id, Time.cluster_id],
+            }
+        },
+    }


Test patch: