Koenkk / Koenkk/zigbee2mqtt

[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.

external converter
Dominant language
TypeScript
Stars
15.7k
Forks
2k
Avg merge
18h 55m
Merged PRs (30d)
35

Description

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"]}}}

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.

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

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.