[External Converter]: TS0003 from _TZ3000_ly9apzky

Open Beginner friendly
#32,810 2 comments 0 reactions 0 assignees View on GitHub

Nobody has claimed this yet.

Assessment

Difficulty
2/5
Estimated time
1-3 hours
Newbie friendliness
72/100
Issue type
Feature
Clarity
Mostly clear
Activity status
Quiet
Tech stack
typescript
Domain
embedded-iot

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.

Description

external converter
Link

https://www.ozon.ru/product/umnoe-rele-s-zigbee-3-kanal-vyklyuchatel-rabotaet-s-yandeks-alisoy-2915753787/?is_apparel_size_selected=true&sh=i6OlamhEgQ

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"]}}}
Dominant language
TypeScript
Stars
15.7k
Forks
2k
Avg merge
18h 55m
Merged PRs (30d)
35

Contributor guide

Open the contributing guide

First steps

  1. Read the whole issue, then the project's contributing guide.
  2. Comment on the issue to say you are picking it up — it saves two people doing the same work.
  3. Fork the repository and make your change on a branch.
  4. Open a pull request that references the issue number.

More from Koenkk/zigbee2mqtt

All issues in Koenkk/zigbee2mqtt

Similar issues

More TypeScript issues

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.