Tuya Smart Siren Zigbee - Driver doesn't work

Hi community,

I've bought a Zigbee Tuya Smart siren:

On the driver page > 'State Variables' it says:
"Comment: Works with the Tuya Alarm"
I've tried it (and pressed Configure) but that driver doesn't works neither do these drivers work:

  • Zigbee tuya Alarm (installed driver)
  • Tuya zigbee scene switch
  • Neu zigbee scene controller
  • ikea (why not) zigbee sound controller

I've done a bit research and found this post:

But that doesn't work either..

Could anyone help me out with what to do/try next? I don't have a Zigbee sniffer..

Thanks in advance!

If you look in that thread you found, @mike.maxwell has one in his possession (one I sent him) to get a native driver made for it. I have no idea what the status of this is, but I to am waiting impatiently for this driver to come out.

1 Like

Hi @nclark ,

Are you sure we are talking about the same product?
It seems in that topic you are talking about the Neo ZigBee Siren Alarm (which is powered and has sensors), mine doesn't have any sensors nor sounds and is wireless.

Thanks for the quick response, hopefully that driver will also work with this device.

PS It does have a sound, but only one

Just looked more in detail the product page, not the same so your mileage may vary when the driver does come out.

1 Like

Seems like you might be trying the wrong community driver. The NEO Zigbee driver you linked to doesn't have the word "TUYA" in it once, but this driver has it 33 times.

Try this one

Reach out to the community for specific model numbers that work with a given driver before ordering. Just saying TUYA sirens work is a really broad brush. Tuya makes hundreds of products with their name on it and for other manufacturers.


Hi @SmartHomePrimer

Before buying I did do a research on the community and didn't find anything about this product (maybe because its quit new?) So I thought i'd give it a chance.
I've tried multiple drivers, included the one that you are suggesting (see OP).

I thought that zigbee was universal so I could try a generic zigbee siren/alarm driver.
wait a sec.. :thinking:

I just found this driver! :grin: But it doesnt work either :frowning:

Good tip about putting the specific model numbers in here (oldy enough there isn't any on the box/manual or online) so I hope the info from HE might help:

  • endpointId: 01
  • application: 56
  • softwareBuild:
  • inClusters: 0000,000A,0502,0500,EF01
  • outClusters: 0019
  • model: TS0216
  • manufacturer: _TYZB01_0wcfvptl

I've found this:

Isn't that the data we need for making a driver? I would love to do it myself but I have no clue where to start.

No. That link just describes how this siren integrates with zigbee2mqtt. It doesn’t provide information needed to write a Hubitat driver.

1 Like

Okay, I'm kind of stubborn to get this to work (but hopefully not to the point at being annoying).
I've found this and they are talking about a sniffing log. Is that something we can work with?

"Sniffing log with original gateway:
tuya_siren.zip "

The Zigbee specification can be followed or not followed, and it's still Zigbee. But that's just the radio layer. How that radio communicates with the controller (the hub) is not part of any standard for any hub. A specific driver is always needed for a different hub, from a different manufacturer. And even from the same manufacturer, there could be a requirement for a different driver, depending on the hub or bridge used.


Try this one - it might work.

You may try these one too, I use it in a similar siren from Heimann.

 *  Copyright 2019 gabriele-v
 *  Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
 *  in compliance with the License. You may obtain a copy of the License at:
 *      http://www.apache.org/licenses/LICENSE-2.0
 *  Unless required by applicable law or agreed to in writing, software distributed under the License is distributed
 *  on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License
 *  for the specific language governing permissions and limitations under the License.
 *  Heiman HS2WD-E Siren
 *  Version: 0.2b
 *  0.1b (2019-01-26) => First release
 *  0.2b (2019-01-26) => Bugfixes and new events
 *  0.3b (2019-02-14) => Using proper zigbee.parseDescriptionAsMap
 *  Author: gabriele-v
 *  Date: 2019-01-26
 *  Sources:
 *  ST Siren => https://github.com/SmartThingsCommunity/SmartThingsPublic/blob/master/devicetypes/smartthings/ozom-smart-siren.src/ozom-smart-siren.groovy

metadata {
definition (name: "Heiman HS2WD-E Siren", namespace: "gabriele-v", author: "gabriele-v") {
    capability "Alarm"
    capability "Switch"
    capability "Actuator"
    capability "Battery"
    capability "Refresh"
    capability "Configuration"

    attribute "maxDuration", "Integer"
    attribute "hwVer", "String"
    fingerprint profileId: "0104", endpointId: "01", inClusters: "0000,0001,0003,0004,0009,0500,0502", outClusters: "0003,0019", manufacturer: "Heiman", model: "WarningDevice"

preferences {
    input name: "maxDuration", type: "number", title: "Max duration of strobe/siren",  range: "1..1800", defaultValue: "240", required: true
    //Logging Message Config
    input name: "infoLogging", type: "bool", title: "Enable info message logging", description: ""
    input name: "debugLogging", type: "bool", title: "Enable debug message logging", description: ""

// parse events into attributes
def parse(String description) {
displayDebugLog("Parsing message: ${description}")
Map map = [:]

if (description?.startsWith("read attr -")) {
    def descMap = zigbee.parseDescriptionAsMap(description)
    displayDebugLog("Desc Map: ${descMap}")
    if (descMap.cluster == "0000" && descMap.attrId == "0003")
        displayDebugLog("RAW HW VER: ${descMap.value}")
        map = [
            name: 'hwVer',
            value: descMap.value
    else if (descMap.cluster == "0001" && descMap.attrId == "0021")
        displayDebugLog("RAW BATTERY PERCENTAGE: ${descMap.value}")
        retValue = Integer.parseInt(descMap.value, 16) - 100
        map = [
            name: 'battery',
            value: retValue,
            unit: "%",
            descriptionText: "Battery level is ${retValue}%"
    else if (descMap.cluster == "0502" && descMap.attrId == "0000")
        displayDebugLog("RAW MAX DURATION: ${descMap.value}")
        retValue = Integer.parseInt(descMap.value, 16)
        map = [
            name: "maxDuration",
            value: retValue,
            descriptionText: "Max siren/strobe duration is ${retValue}"

if (map != [:]) {
    displayInfoLog("${map.name} => ${map.value} (${map.descriptionText})")
    displayDebugLog("Creating event $map")
    return createEvent(map)
} else
    return [:]

private def displayDebugLog(message) {
if (debugLogging) log.debug "${device.displayName}: ${message}"

private def displayInfoLog(message) {
if (infoLogging || state.prefsSetCount != 1)
    log.info "${device.displayName}: ${message}"

def updated() {
displayDebugLog("updated called")
displayInfoLog("maxDuration : ${settings.maxDuration}")

def cmds = 
zigbee.writeAttribute(0x502, 0x0000, DataType.UINT16, (int)settings.maxDuration) +
zigbee.readAttribute(0x502, 0x0000)

displayInfoLog("updated() --- cmds: $cmds")
return cmds

def refresh() {
def cmds =
    //Read the configured variables
    zigbee.readAttribute(0x000, 0x0003) +    //Read HW Version
    zigbee.readAttribute(0x001, 0x0021) +   //Battery percentage
    zigbee.readAttribute(0x502, 0x0000) //Read Max Duration

displayInfoLog("refresh() --- cmds: $cmds")
return cmds

def off() {
zigbee.command(0x0502, 0x00, "00", "0000", "00", "00")

def on() {
sendEvent(name: "alarm", value: "on", descriptionText: "Device alarming on", type: "digital")

def both() {
sendEvent(name: "alarm", value: "both", descriptionText: "Device alarming with siren and strobe", type: "digital")
zigbee.command(0x502, 0x00, "17", DataType.pack(1, DataType.UINT16), "00", "01")

def strobe() {
sendEvent(name: "alarm", value: "strobe", descriptionText: "Device alarming with strobe", type: "digital")
zigbee.command(0x502, 0x00, "04", DataType.pack(1, DataType.UINT16), "00", "01")

def siren() {
sendEvent(name: "alarm", value: "siren", descriptionText: "Device alarming with siren", type: "digital")
zigbee.command(0x502, 0x00, "13", DataType.pack(1, DataType.UINT16), "00", "00")

@SmartHomePrimer Thank you so much for taking your time and explaining it.

@rocketwiz Thanks but I have already tried that, see OP.

@marcusvrsilva YEAAHHH!!! THIS ONE WORKS!!! :facepunch:t2:
Where did you found that driver? It's not in the "List of Compatible Devices".

For others that might be interested about how the Heimann driver works with the Tuya Siren (TS0216):

  • The driver buttons Configure/Both/Off/On works as expected.
  • The driver button Siren (sound only I guess) works, but always with the light/flashes.
  • The driver button Strobe (light only) doesn't work (but for me that isn't an issue).
  • In Preferences you can adjust the "Max duration of the siren" which also works.
  • It always goes on max. volume.

I've read somewhere that it should be possible to lower the volume (even mute it) and that would fix the last 3 points (for example that you only use the light as an indicator).

But overall I'm very pleased with this driver,
Thanks everyone for diming in!


Hi @SmartHomePrimer, I'm happy the driver worked. As I said, I have a Zelman siren and I find this driver on GitHub searching on Google! :upside_down_face:

Many of these Chinese devices use the same hardware, so it is common that a specific driver works on a similar device of other brand.

1 Like

@ShadoW Lucky you. it's not working on me

Is there anyone help me to fix this?

Thank you

Can you post your Zigbee siren Model and Manufacturer ( from the device web UI Data section)?

@kkossev Thank you for reply

and this from iot.tuya.com

or you can see from here.


The drivers referenced above will definitely not work with this model.
... but there is enough information for this device on the net, so I can try to ake a custom driver - next weekend! : )

1 Like