[APP][Pro] Universal TUYA Zigbee Device App - test

Hello Dylan.

Not in a hurry, but i can’t include several BSEED wall switches, like the TZ3000_l9brjwau TS0002. It is seen as a unknown zigbee device. Log is 7366d559-8375-4a3a-8dd2-af62bc3b3cdd

Hi everyone,

I’m trying to pair a HOBEIAN ZG-227Z climate sensor. From what I’ve seen in the GitHub repo, it should already be supported in version 5.5.695, which was updated earlier today. However, it still appears as an unsupported device and Homey only adds it as a generic Zigbee device.

I’m sharing the device interview here in case it’s helpful.

HOBEIAN ZG-227Z Interview

“ids”: {
“modelId”: “TS0601”,
“manufacturerName”: “_TZE200_a8sdabtg”
},
“endpoints”: {
“ieeeAddress”: “a4:c1:38:5f:d2:e4:da:8e”,
“networkAddress”: 51221,
“modelId”: “TS0601”,
“manufacturerName”: “_TZE200_a8sdabtg”,
“endpointDescriptors”: [
{
“status”: “SUCCESS”,
“nwkAddrOfInterest”: 51221,
“_reserved”: 20,
“endpointId”: 1,
“applicationProfileId”: 260,
“applicationDeviceId”: 770,
“applicationDeviceVersion”: 0,
“_reserved1”: 1,
“inputClusters”: [
0,
3,
1026,
1029,
1
],
“outputClusters”: [
3
]
}
],
“deviceType”: “enddevice”,
“receiveWhenIdle”: false,
“swBuildId”: “0122052017”,
“capabilities”: {
“alternatePANCoordinator”: false,
“deviceType”: false,
“powerSourceMains”: false,
“receiveWhenIdle”: false,
“security”: false,
“allocateAddress”: true
},
“extendedEndpointDescriptors”: {
“1”: {
“clusters”: {
“basic”: {
“attributes”: [
{
“acl”: [
“readable”
],
“id”: 0,
“name”: “zclVersion”
},
{
“acl”: [
“readable”
],
“id”: 1,
“name”: “appVersion”
},
{
“acl”: [
“readable”
],
“id”: 2,
“name”: “stackVersion”
},
{
“acl”: [
“readable”
],
“id”: 3,
“name”: “hwVersion”
},
{
“acl”: [
“readable”,
“reportable”
],
“id”: 4,
“name”: “manufacturerName”,
“reportingConfiguration”: {
“status”: “NOT_FOUND”,
“direction”: “reported”
}
},
{
“acl”: [
“readable”
],
“id”: 5,
“name”: “modelId”
},
{
“acl”: [
“readable”
],
“id”: 7,
“name”: “powerSource”
},
{
“acl”: [
“readable”,
“writable”
],
“id”: 18,
“name”: “deviceEnabled”
},
{
“acl”: [
“readable”
],
“id”: 16384,
“name”: “swBuildId”
},
{
“acl”: [
“readable”
],
“id”: 65533,
“name”: “clusterRevision”
}
],
“commandsGenerated”: “UNSUP_GENERAL_COMMAND”,
“commandsReceived”: “UNSUP_GENERAL_COMMAND”
},
“identify”: {
“attributes”: [
{
“acl”: [
“readable”,
“writable”
],
“id”: 0,
“name”: “identifyTime”,
“value”: 0
},
{
“acl”: [
“readable”
],
“id”: 65533,
“name”: “clusterRevision”,
“value”: 1
}
],
“commandsGenerated”: “UNSUP_GENERAL_COMMAND”,
“commandsReceived”: “UNSUP_GENERAL_COMMAND”
},
“temperatureMeasurement”: {
“attributes”: [
{
“acl”: [
“readable”,
“reportable”
],
“id”: 0,
“name”: “measuredValue”,
“value”: 3090,
“reportingConfiguration”: {
“status”: “NOT_FOUND”,
“direction”: “reported”
}
},
{
“acl”: [
“readable”
],
“id”: 1,
“name”: “minMeasuredValue”,
“value”: -32768
},
{
“acl”: [
“readable”
],
“id”: 2,
“name”: “maxMeasuredValue”,
“value”: -32768
},
{
“acl”: [
“readable”
],
“id”: 3
},
{
“acl”: [
“readable”
],
“id”: 65533,
“name”: “clusterRevision”,
“value”: 1
}
],
“commandsGenerated”: “UNSUP_GENERAL_COMMAND”,
“commandsReceived”: “UNSUP_GENERAL_COMMAND”
},
“relativeHumidity”: {
“attributes”: [
{
“acl”: [
“readable”,
“reportable”
],
“id”: 0,
“name”: “measuredValue”,
“value”: 5150,
“reportingConfiguration”: {
“status”: “NOT_FOUND”,
“direction”: “reported”
}
},
{
“acl”: [
“readable”
],
“id”: 1,
“name”: “minMeasuredValue”,
“value”: 32768
},
{
“acl”: [
“readable”
],
“id”: 2,
“name”: “maxMeasuredValue”,
“value”: 32768
},
{
“acl”: [
“readable”
],
“id”: 3,
“name”: “tolerance”,
“value”: 0
},
{
“acl”: [
“readable”
],
“id”: 65533,
“name”: “clusterRevision”,
“value”: 1
}
],
“commandsGenerated”: “UNSUP_GENERAL_COMMAND”,
“commandsReceived”: “UNSUP_GENERAL_COMMAND”
},
“powerConfiguration”: {
“attributes”: [
{
“acl”: [
“readable”,
“reportable”
],
“id”: 32,
“name”: “batteryVoltage”,
“value”: 30,
“reportingConfiguration”: {
“status”: “NOT_FOUND”,
“direction”: “reported”
}
},
{
“acl”: [
“readable”,
“reportable”
],
“id”: 33,
“name”: “batteryPercentageRemaining”,
“value”: 200,
“reportingConfiguration”: {
“status”: “NOT_FOUND”,
“direction”: “reported”
}
},
{
“acl”: [
“readable”
],
“id”: 65533,
“name”: “clusterRevision”,
“value”: 1
}
],
“commandsGenerated”: “UNSUP_GENERAL_COMMAND”,
“commandsReceived”: “UNSUP_GENERAL_COMMAND”
}
},
“bindings”: {
“identify”: {
“attributes”: [
{
“acl”: [
“readable”,
“writable”
],
“id”: 0,
“name”: “identifyTime”,
“value”: 0
},
{
“acl”: [
“readable”
],
“id”: 65533,
“name”: “clusterRevision”,
“value”: 1
}
],
“commandsGenerated”: “UNSUP_GENERAL_COMMAND”,
“commandsReceived”: “UNSUP_GENERAL_COMMAND”
}
}
}
}
}

Thanks a lot for your work and best regards.

Hi Dylan

Moes _TZ3000_zgyzgdua Still not working with v694 unfortunately. The hardware buttons and the icon buttons all have no effect. Thanks for your efforts.

Fred

Hi Dylan

Really appreciate your efforts and all your work so far.

Sorry for the repetitive negative replies, the two 4 gang scene switches remain unknown even in Version 5.5.696

_TZ3000_wkai4ga5 4gang switch

_TZ3000_5tqxpine 4gang switch

Thank u once more

Eftychis

Hi Dylan,

In the latest version the IR blaster is giving errors (and still not working). I’ve made a diag report.

image

89e408fe-d0ba-4216-95be-951824dac2b8

don’t worry you can ask as many times as you wan’t/request

it will be okay

I see that you had a major fix in **5.5.690 related to the TS0601 ProductId. Unfortunatly since then neither of my touch dimmers work anymore (previously the TZE200 worked). Both get added as a generic Zigbee device

I think the culprit might be that these these touch dimmers are different from the modules and they are both being handled by the same driver. In the old app they were two separate drivers, so perhaps they should be separate.

Just to clarify, a touch dimmer is such a device:** BSEED Switch - Wifi Light Switch **

According to my friend ChatGPT they have different clusters/bindings as well:

    "endpoints": {
      "1": {
        "clusters": [0, 4, 5, 61184],
        "bindings": [25, 10]
      }
    },

These are the interviews of the two:

"ids": {
    "modelId": "TS0601",
    "manufacturerName": "_TZE200_3p5ydos3"
  },
  "endpoints": {
    "ieeeAddress": "a4:c1:38:e7:57:35:32:91",
    "networkAddress": 48254,
    "modelId": "TS0601",
    "manufacturerName": "_TZE200_3p5ydos3",
    "endpointDescriptors": [
      {
        "status": "SUCCESS",
        "nwkAddrOfInterest": 48254,
        "_reserved": 20,
        "endpointId": 1,
        "applicationProfileId": 260,
        "applicationDeviceId": 81,
        "applicationDeviceVersion": 0,
        "_reserved1": 1,
        "inputClusters": [
          4,
          5,
          61184,
          0
        ],
        "outputClusters": [
          25,
          10
        ]
      },
      {
        "status": "SUCCESS",
        "nwkAddrOfInterest": 48254,
        "_reserved": 10,
        "endpointId": 242,
        "applicationProfileId": 41440,
        "applicationDeviceId": 97,
        "applicationDeviceVersion": 0,
        "_reserved1": 0,
        "inputClusters": [],
        "outputClusters": [
          33
        ]
      }
    ],
    "deviceType": "router",
    "receiveWhenIdle": true,
    "capabilities": {
      "alternatePANCoordinator": false,
      "deviceType": true,
      "powerSourceMains": true,
      "receiveWhenIdle": true,
      "security": false,
      "allocateAddress": true
    },
    "extendedEndpointDescriptors": {
      "1": {
        "clusters": {
          "groups": {
            "attributes": [
              {
                "acl": [
                  "readable",
                  "reportable"
                ],
                "id": 0,
                "name": "nameSupport",
                "value": {
                  "type": "Buffer",
                  "data": [
                    0
                  ]
                },
                "reportingConfiguration": {
                  "status": "NOT_FOUND",
                  "direction": "reported"
                }
              },
              {
                "acl": [
                  "readable",
                  "reportable"
                ],
                "id": 65533,
                "name": "clusterRevision",
                "value": 2,
                "reportingConfiguration": {
                  "status": "NOT_FOUND",
                  "direction": "reported"
                }
              }
            ]
          },
          "scenes": {
            "attributes": [
              {
                "acl": [
                  "readable",
                  "reportable"
                ],
                "id": 0,
                "reportingConfiguration": {
                  "status": "NOT_FOUND",
                  "direction": "reported"
                }
              },
              {
                "acl": [
                  "readable",
                  "reportable"
                ],
                "id": 1,
                "reportingConfiguration": {
                  "status": "NOT_FOUND",
                  "direction": "reported"
                }
              },
              {
                "acl": [
                  "readable",
                  "reportable"
                ],
                "id": 2,
                "reportingConfiguration": {
                  "status": "NOT_FOUND",
                  "direction": "reported"
                }
              },
              {
                "acl": [
                  "readable",
                  "reportable"
                ],
                "id": 3,
                "reportingConfiguration": {
                  "status": "NOT_FOUND",
                  "direction": "reported"
                }
              },
              {
                "acl": [
                  "readable",
                  "reportable"
                ],
                "id": 4,
                "reportingConfiguration": {
                  "status": "NOT_FOUND",
                  "direction": "reported"
                }
              },
              {
                "acl": [
                  "readable",
                  "reportable"
                ],
                "id": 65533,
                "name": "clusterRevision",
                "value": 2,
                "reportingConfiguration": {
                  "status": "NOT_FOUND",
                  "direction": "reported"
                }
              }
            ]
          },
          "basic": {
            "attributes": [
              {
                "acl": [
                  "readable",
                  "reportable"
                ],
                "id": 0,
                "name": "zclVersion",
                "value": 3
              },
              {
                "acl": [
                  "readable",
                  "reportable"
                ],
                "id": 1,
                "name": "appVersion",
                "value": 64
              },
              {
                "acl": [
                  "readable",
                  "reportable"
                ],
                "id": 2,
                "name": "stackVersion",
                "value": 0
              },
              {
                "acl": [
                  "readable",
                  "reportable"
                ],
                "id": 3,
                "name": "hwVersion",
                "value": 1
              },
              {
                "acl": [
                  "readable",
                  "reportable"
                ],
                "id": 4,
                "name": "manufacturerName",
                "value": "_TZE200_3p5ydos3"
              },
              {
                "acl": [
                  "readable",
                  "reportable"
                ],
                "id": 5,
                "name": "modelId",
                "value": "TS0601"
              },
              {
                "acl": [
                  "readable",
                  "reportable"
                ],
                "id": 6,
                "name": "dateCode",
                "value": ""
              },
              {
                "acl": [
                  "readable",
                  "reportable"
                ],
                "id": 7,
                "name": "powerSource",
                "value": "mains"
              },
              {
                "acl": [
                  "readable",
                  "writable",
                  "reportable"
                ],
                "id": 65502
              },
              {
                "acl": [
                  "readable",
                  "reportable"
                ],
                "id": 65533,
                "name": "clusterRevision",
                "value": 2
              },
              {
                "acl": [
                  "readable",
                  "reportable"
                ],
                "id": 65534,
                "name": "attributeReportingStatus",
                "value": "PENDING"
              },
              {
                "acl": [
                  "readable",
                  "reportable"
                ],
                "id": 65506
              },
              {
                "acl": [
                  "readable",
                  "reportable"
                ],
                "id": 65507
              }
            ]
          }
        },
        "bindings": {
          "ota": {},
          "time": {
            "attributes": [
              {
                "acl": [
                  "readable"
                ],
                "id": 65533,
                "name": "clusterRevision",
                "value": 1
              }
            ]
          }
        }
      },
      "242": {
        "clusters": {},
        "bindings": {}
      }
    }
  }
"ids": {
    "modelId": "TS0601",
    "manufacturerName": "_TZE204_n9ctkb6j"
  },
  "endpoints": {
    "ieeeAddress": "a4:c1:38:4d:31:99:c0:9d",
    "networkAddress": 30007,
    "modelId": "TS0601",
    "manufacturerName": "_TZE204_n9ctkb6j",
    "endpointDescriptors": [
      {
        "status": "SUCCESS",
        "nwkAddrOfInterest": 30007,
        "_reserved": 20,
        "endpointId": 1,
        "applicationProfileId": 260,
        "applicationDeviceId": 81,
        "applicationDeviceVersion": 0,
        "_reserved1": 1,
        "inputClusters": [
          4,
          5,
          61184,
          0
        ],
        "outputClusters": [
          25,
          10
        ]
      },
      {
        "status": "SUCCESS",
        "nwkAddrOfInterest": 30007,
        "_reserved": 10,
        "endpointId": 242,
        "applicationProfileId": 41440,
        "applicationDeviceId": 97,
        "applicationDeviceVersion": 0,
        "_reserved1": 0,
        "inputClusters": [],
        "outputClusters": [
          33
        ]
      }
    ],
    "deviceType": "router",
    "receiveWhenIdle": true,
    "capabilities": {
      "alternatePANCoordinator": false,
      "deviceType": true,
      "powerSourceMains": true,
      "receiveWhenIdle": true,
      "security": false,
      "allocateAddress": true
    },
    "extendedEndpointDescriptors": {
      "1": {
        "clusters": {
          "groups": {
            "attributes": [
              {
                "acl": [
                  "readable",
                  "reportable"
                ],
                "id": 0,
                "name": "nameSupport",
                "value": {
                  "type": "Buffer",
                  "data": [
                    0
                  ]
                },
                "reportingConfiguration": {
                  "status": "NOT_FOUND",
                  "direction": "reported"
                }
              },
              {
                "acl": [
                  "readable",
                  "reportable"
                ],
                "id": 65533,
                "name": "clusterRevision",
                "value": 2,
                "reportingConfiguration": {
                  "status": "NOT_FOUND",
                  "direction": "reported"
                }
              }
            ]
          },
          "scenes": {
            "attributes": [
              {
                "acl": [
                  "readable",
                  "reportable"
                ],
                "id": 0,
                "reportingConfiguration": {
                  "status": "NOT_FOUND",
                  "direction": "reported"
                }
              },
              {
                "acl": [
                  "readable",
                  "reportable"
                ],
                "id": 1,
                "reportingConfiguration": {
                  "status": "NOT_FOUND",
                  "direction": "reported"
                }
              },
              {
                "acl": [
                  "readable",
                  "reportable"
                ],
                "id": 2,
                "reportingConfiguration": {
                  "status": "NOT_FOUND",
                  "direction": "reported"
                }
              },
              {
                "acl": [
                  "readable",
                  "reportable"
                ],
                "id": 3,
                "reportingConfiguration": {
                  "status": "NOT_FOUND",
                  "direction": "reported"
                }
              },
              {
                "acl": [
                  "readable",
                  "reportable"
                ],
                "id": 4,
                "reportingConfiguration": {
                  "status": "NOT_FOUND",
                  "direction": "reported"
                }
              },
              {
                "acl": [
                  "readable",
                  "reportable"
                ],
                "id": 65533,
                "name": "clusterRevision",
                "value": 2,
                "reportingConfiguration": {
                  "status": "NOT_FOUND",
                  "direction": "reported"
                }
              }
            ]
          },
          "basic": {
            "attributes": [
              {
                "acl": [
                  "readable",
                  "reportable"
                ],
                "id": 0,
                "name": "zclVersion",
                "value": 3
              },
              {
                "acl": [
                  "readable",
                  "reportable"
                ],
                "id": 1,
                "name": "appVersion",
                "value": 74
              },
              {
                "acl": [
                  "readable",
                  "reportable"
                ],
                "id": 2,
                "name": "stackVersion",
                "value": 0
              },
              {
                "acl": [
                  "readable",
                  "reportable"
                ],
                "id": 3,
                "name": "hwVersion",
                "value": 1
              },
              {
                "acl": [
                  "readable",
                  "reportable"
                ],
                "id": 4,
                "name": "manufacturerName",
                "value": "_TZE204_n9ctkb6j"
              },
              {
                "acl": [
                  "readable",
                  "reportable"
                ],
                "id": 5,
                "name": "modelId",
                "value": "TS0601"
              },
              {
                "acl": [
                  "readable",
                  "reportable"
                ],
                "id": 6,
                "name": "dateCode",
                "value": ""
              },
              {
                "acl": [
                  "readable",
                  "reportable"
                ],
                "id": 7,
                "name": "powerSource",
                "value": "mains"
              },
              {
                "acl": [
                  "readable",
                  "writable",
                  "reportable"
                ],
                "id": 65502
              },
              {
                "acl": [
                  "readable",
                  "reportable"
                ],
                "id": 65533,
                "name": "clusterRevision",
                "value": 2
              },
              {
                "acl": [
                  "readable",
                  "reportable"
                ],
                "id": 65534,
                "name": "attributeReportingStatus",
                "value": "PENDING"
              },
              {
                "acl": [
                  "readable",
                  "reportable"
                ],
                "id": 65506
              },
              {
                "acl": [
                  "readable",
                  "reportable"
                ],
                "id": 65507
              }
            ]
          }
        },
        "bindings": {
          "ota": {},
          "time": {
            "attributes": [
              {
                "acl": [
                  "readable"
                ],
                "id": 65533,
                "name": "clusterRevision",
                "value": 1
              }
            ]
          }
        }
      },
      "242": {
        "clusters": {},
        "bindings": {}
      }
    }
  }

The water sensor installs, but no communication between water… and Homey. Thanks. Ver.696

It started to communicate after a while. Still no alarm. Sorry.

A clue might be at the same time the water.. is installed the log says alarm inactivated.

Do you want only dimming feature for this device ?

No communication, related about flow or pairing ?

From above: It started to communicate after a while. Still no alarm. Sorry.

A clue might be at the same time the water.. is installed the log says alarm inactivated.

Ver.696

Hi Dylan,

now on v707 my Switch is regognized again as a 4-Gang Smart switch. Thats good. But when i press any button on the switch nithing happens in Homey Pro with the device. On the other side when i press a virtual button in Homey Pro at the device nothing happens to the switch.

Here a new diag:
7fab96a9-09f6-4df4-ae01-9873f72ecc5e

Best regards, Hartmut

For now just on/off and dimming will do.

I would like to have more in the future and I’m willing to contribute as much as I can, but I think that is more work.

Is there any documentation for this app/driver development that I can look at?

I’m not a software engineer by any means, but with help of LLMs and a bit of coding I think I can contribute something. I was having a look yesterday and this morning, but it seems that the various drivers use libs differently (of different libs all together).

https://apps.developer.homey.app/

Best regards

I more meant the structure of the Tuya Zigbee app specifically. Is there a specific structure you have in mind for the various drivers or do you see every driver independent?

Feel free to contribute :slight_smile:

If you Want a good analysts ai , you can use Kimi K2

They’re some ai benchmark on the https://lmarena.ai/fr website .

Best regard.

Re: Architecture for the Universal Tuya Zigbee App
To address your question about whether drivers should be independent or share a unified structure: Technically, Homey requires them to be independent folders, but logically, they should be highly interdependent through a shared library.
If you treat every Tuya driver as a standalone silo, you will face a maintenance nightmare due to Tuya’s non-standard ZCL implementation (the infamous Data Points).
Here is the recommended thread-style breakdown of the architecture:

  1. The “Thin Driver” Strategy
    Instead of putting logic inside drivers/my_device/device.js, you should treat the driver folder as a configuration layer only.
  • Independent: Each folder in /drivers handles its own driver.compose.json (metadata, icons, pairing).
  • Shared: All drivers inherit from a central Class Hierarchy located in /lib.
  1. The Class Hierarchy (The “Core”)
    This is how you should structure your inheritance to avoid code duplication:
  • BaseDevice (Homey SDK): The standard foundation.
  • TuyaZigbeeDevice (Your Lib): Extends BaseDevice. Handles generic Tuya quirks (reporting intervals, battery logic).
  • TuyaDPDevice (Your Lib): Extends TuyaZigbeeDevice. This is the “Engine.” It contains the logic to map DP IDs (Data Points) to Homey Capabilities.

Example: When a socket sends DP 1 (Boolean), the TuyaDPDevice engine looks at a mapping file and automatically triggers capability: onoff.

  1. Proposed Folder Structure
    /lib/
    ├── TuyaDevice.js ← The “Master” class
    ├── TuyaDataPoints.js ← Registry of DP mappings (ID → Capability)
    └── TuyaClusters.js ← Custom Tuya Zigbee clusters definitions

/drivers/
├── tuya_plug/
│ ├── device.js ← Simply defines the DP Map to use
│ └── driver.js ← Standard boilerplate
├── tuya_sensor_temp/
│ ├── device.js ← Uses the same “Master” class logic
│ └── …

  1. Why this is the best approach for Tuya
    Tuya devices often use the same “Manufacturer ID” but different “Product IDs” with slightly shifted Data Points.
  • Scalability: If Tuya changes their protocol slightly, you fix it in one file (/lib/TuyaDevice.js) and it updates all 50+ drivers.
  • Clean Code: Your device.js files stay under 30 lines of code because they just “tell” the engine which mappings to use.
  • Flexibility: You can have a “Universal” driver that catches unknown devices, while still having “Specific” drivers for high-end devices that need custom Flow Cards.

This answer is ai gemini powered. The structure is discribed on the readme and on the documentation inside the GitHub repo

About drivers

I organized it on categorysum folders

They are some libs that have some smart feature like caseless manufacturer name function and many other like dp tuya parsing .

Thank you, much appreciated. If you have the chance to look at the basic on/off and dimming functionality, I can use my buttons in the house and look a contributing additional functionality.