[External Converter]: TS0003 from _TZ3000_ly9apzky
Nobody has claimed this yet.
- Dominant language
- TypeScript
- Stars
- 15.7k
- Forks
- 2k
- Avg merge
- 18h 55m
- Merged PRs (30d)
- 35
Description
Link
Database entry
{"id":33,"type":"Router","ieeeAddr":"0xa4c1384b90d4e772","nwkAddr":17610,"manufId":4417,"manufName":"_TZ3000_ly9apzky","powerSource":"Mains (single phase)","modelId":"TS0003","epList":[1,2,3,242],"endpoints":{"1":{"profId":260,"epId":1,"devId":256,"inClusterList":[3,4,5,6,1794,2820,57344,57345,0],"outClusterList":[25,10],"clusters":{"57344":{"attributes":{"53251":"AAAAAgAABAAA"}},"57345":{"attributes":{"53248":0,"53249":0,"53250":0,"53251":0,"53252":0,"53253":0,"53296":0}},"genBasic":{"attributes":{"65506":56,"65508":0,"65534":0,"modelId":"TS0003","manufacturerName":"_TZ3000_ly9apzky","powerSource":1,"zclVersion":3,"appVersion":74,"stackVersion":0,"hwVersion":1,"dateCode":""}},"genOnOff":{"attributes":{"onOff":1,"onTime":0,"offWaitTime":0,"moesStartUpOnOff":1}}},"binds":[{"cluster":6,"type":"endpoint","deviceIeeeAddress":"0x180df9fffeed1f8f","endpointID":1}],"configuredReportings":[{"cluster":6,"attrId":0,"minRepIntval":0,"maxRepIntval":65000,"repChange":1}],"meta":{}},"2":{"profId":260,"epId":2,"devId":256,"inClusterList":[4,5,6],"outClusterList":[],"clusters":{"genOnOff":{"attributes":{"onOff":0,"onTime":0,"offWaitTime":0}}},"binds":[{"cluster":6,"type":"endpoint","deviceIeeeAddress":"0x180df9fffeed1f8f","endpointID":1}],"configuredReportings":[{"cluster":6,"attrId":0,"minRepIntval":0,"maxRepIntval":65000,"repChange":1}],"meta":{}},"3":{"profId":260,"epId":3,"devId":256,"inClusterList":[4,5,6],"outClusterList":[],"clusters":{"genOnOff":{"attributes":{"onOff":0,"onTime":0,"offWaitTime":0}}},"binds":[{"cluster":6,"type":"endpoint","deviceIeeeAddress":"0x180df9fffeed1f8f","endpointID":1}],"configuredReportings":[{"cluster":6,"attrId":0,"minRepIntval":0,"maxRepIntval":65000,"repChange":1}],"meta":{}},"242":{"profId":41440,"epId":242,"devId":97,"inClusterList":[],"outClusterList":[33],"clusters":{},"binds":[],"configuredReportings":[],"meta":{}}},"appVersion":74,"stackVersion":0,"hwVersion":1,"dateCode":"","zclVersion":3,"interviewCompleted":true,"interviewState":"SUCCESSFUL","meta":{"configured":"0.0.0"},"lastSeen":1786398307961}
Zigbee2MQTT version
2.9.2 (undefined)
External converter
import * as tuya from 'zigbee-herdsman-converters/lib/tuya';
import * as reporting from 'zigbee-herdsman-converters/lib/reporting';
export default {
fingerprint: [{modelID: 'TS0003', manufacturerName: '_TZ3000_ly9apzky'}],
model: 'TS0003_QS-Zigbee-S10-3C',
vendor: 'Tuya',
description: '3 gang switch module (QS-Zigbee-S10-3C)',
whiteLabel: [{vendor: 'Auronen', model: 'Zigbee-3C'}],
extend: [
tuya.modernExtend.tuyaOnOff({endpoints: ['l1', 'l2', 'l3']}),
],
endpoint: () => ({l1: 1, l2: 2, l3: 3}),
meta: {multiEndpoint: true},
configure: async (device, coordinatorEndpoint) => {
await tuya.configureMagicPacket(device, coordinatorEndpoint);
for (const id of [1, 2, 3]) {
const ep = device.getEndpoint(id);
await reporting.bind(ep, coordinatorEndpoint, ['genOnOff']);
await reporting.onOff(ep);
}
},
};
What does/doesn't work with the external definition?
Device: QS-Zigbee-S10-3C, 3 gang switch module (sold as "Auronen Zigbee-3C").
Z2M 2.9.2, zhc 26.27.0, zh 10.0.5. Firmware appVersion 74.
Without the converter it falls back to the generic TS0003 definition and
has no power_on_behavior, although the hardware supports it.
Works: state_l1/l2/l3 and power_on_behavior. Verified by reading
genOnOff 0x8002 after each write and by a real power cycle.
Notes:
- 0x8002 exists only on endpoint 1 (UNSUPPORTED_ATTRIBUTE on ep2/ep3), so
power_on_behavior is device-wide. tuyaOnOff() handles this correctly. - Clusters 0xE000/0xE001 are on ep1 but zigbee-herdsman doesn't resolve
them to names (manufId 4417), so switchType renders a disabled control.
Left out. - 1794/2820 declared but rmsVoltage reads 0 under load — not implemented.
Could probably just be added to the fingerprint of an existing
TS0003_switch_module_* definition.
Notes
software_build_id: undefined
date_code: ``
endpoints:
{"1":{"clusters":{"input":["genIdentify","genGroups","genScenes","genOnOff","seMetering","haElectricalMeasurement","57344","57345","genBasic"],"output":["genOta","genTime"]},"name":"l1"},"2":{"clusters":{"input":["genGroups","genScenes","genOnOff"],"output":[]},"name":"l2"},"3":{"clusters":{"input":["genGroups","genScenes","genOnOff"],"output":[]},"name":"l3"},"242":{"clusters":{"input":[],"output":["greenPower"]}}}
Contributor guide
First steps
- Read the whole issue, then the project's contributing guide.
- Comment on the issue to say you are picking it up — it saves two people doing the same work.
- Fork the repository and make your change on a branch.
- Open a pull request that references the issue number.
Research direction
Start with the existing TS0003_switch_module_* definition and compare its fingerprint and configuration behavior with the supplied external converter. Use the reported TS0003/_TZ3000_ly9apzky database entry to check the three endpoint states and device-wide power_on_behavior; done when the device matches without an external converter and those behaviors remain available.
Written by the indexing model from the issue text.
Assessment
- Tech stack
- typescript
- Domain
- embedded-iot
- Issue type
- Feature
- Difficulty
- 2/5
- Estimated time
- 1-3 hours
- Activity status
- Quiet
- Clarity
- Mostly clear
- Newbie friendliness
- 72/100