zigbee-herdsman-converters 26.67.0 → 26.68.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +20 -0
- package/dist/devices/makegood.d.ts.map +1 -1
- package/dist/devices/makegood.js +2 -1
- package/dist/devices/makegood.js.map +1 -1
- package/dist/devices/namron.d.ts.map +1 -1
- package/dist/devices/namron.js +67 -16
- package/dist/devices/namron.js.map +1 -1
- package/dist/devices/shelly.d.ts.map +1 -1
- package/dist/devices/shelly.js +52 -7
- package/dist/devices/shelly.js.map +1 -1
- package/dist/devices/somfy.d.ts.map +1 -1
- package/dist/devices/somfy.js +8 -1
- package/dist/devices/somfy.js.map +1 -1
- package/dist/devices/sonoff.d.ts.map +1 -1
- package/dist/devices/sonoff.js +35 -0
- package/dist/devices/sonoff.js.map +1 -1
- package/dist/devices/tuya.d.ts.map +1 -1
- package/dist/devices/tuya.js +11 -7
- package/dist/devices/tuya.js.map +1 -1
- package/dist/devices/wyze.d.ts.map +1 -1
- package/dist/devices/wyze.js +4 -2
- package/dist/devices/wyze.js.map +1 -1
- package/dist/models-index.json +1 -1
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,25 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## [26.68.0](https://github.com/Koenkk/zigbee-herdsman-converters/compare/v26.67.0...v26.68.0) (2026-06-18)
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
### Features
|
|
7
|
+
|
|
8
|
+
* **add:** _TZ3210_qlmnxmac ([#12451](https://github.com/Koenkk/zigbee-herdsman-converters/issues/12451)) ([67656c7](https://github.com/Koenkk/zigbee-herdsman-converters/commit/67656c7c59a1a9cad063c41816052efa00259cc9))
|
|
9
|
+
* **add:** 1241754 ([#12197](https://github.com/Koenkk/zigbee-herdsman-converters/issues/12197)) ([4ce3746](https://github.com/Koenkk/zigbee-herdsman-converters/commit/4ce3746044da74ae1cd71d78c83c3e7946df01e2))
|
|
10
|
+
* Shelly gen4: add button mode scene actions (single/double/triple/hold) ([#12465](https://github.com/Koenkk/zigbee-herdsman-converters/issues/12465)) ([a5f5eae](https://github.com/Koenkk/zigbee-herdsman-converters/commit/a5f5eae9530af4e18b0fd7dc16e4f059ccc5f9ea))
|
|
11
|
+
* SONOFF SNZB-02DR2: expose `temperature_sensor_select` and `external_temperature` ([#12463](https://github.com/Koenkk/zigbee-herdsman-converters/issues/12463)) ([d3c1105](https://github.com/Koenkk/zigbee-herdsman-converters/commit/d3c1105b6f5f264d5fdd37106345f770c5a121da))
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
### Bug Fixes
|
|
15
|
+
|
|
16
|
+
* **detect:** Detect `_TZ3000_ky0fq4ho` as Tuya TS011F_din_smart_relay_polling ([#12468](https://github.com/Koenkk/zigbee-herdsman-converters/issues/12468)) ([f82b50d](https://github.com/Koenkk/zigbee-herdsman-converters/commit/f82b50d46c150f33726ad3bf84608f5fc3a1cc66))
|
|
17
|
+
* **detect:** Detect `_TZE284_xpq2rzhq` as Moes ZSS-QY-HP ([#12467](https://github.com/Koenkk/zigbee-herdsman-converters/issues/12467)) ([e7b41bc](https://github.com/Koenkk/zigbee-herdsman-converters/commit/e7b41bc04c0dab5df7b2f2ded528ecb43d34a7f6))
|
|
18
|
+
* Namron 4512791: Write min/max brightness and dimming speed to device ([#12464](https://github.com/Koenkk/zigbee-herdsman-converters/issues/12464)) ([f9fb195](https://github.com/Koenkk/zigbee-herdsman-converters/commit/f9fb1950c8390bdbfe06f40b438696c9f0a1ed46))
|
|
19
|
+
* Tongou TO-Q-SYS-JZT: expose `control_mode` ([#12466](https://github.com/Koenkk/zigbee-herdsman-converters/issues/12466)) ([261197b](https://github.com/Koenkk/zigbee-herdsman-converters/commit/261197b8caaa9c3be234b95b08f137e15053b25b))
|
|
20
|
+
* Tuya _TZ3000_9ni6xxld: poll electrical measurements ([#12460](https://github.com/Koenkk/zigbee-herdsman-converters/issues/12460)) ([9e765a2](https://github.com/Koenkk/zigbee-herdsman-converters/commit/9e765a2fcfdca09129900c2fdbe52c5a19527146))
|
|
21
|
+
* Wyze: fix hourly false locked state ([#12462](https://github.com/Koenkk/zigbee-herdsman-converters/issues/12462)) ([483d8c2](https://github.com/Koenkk/zigbee-herdsman-converters/commit/483d8c264fb843beb99ec14af4babef5ab093836))
|
|
22
|
+
|
|
3
23
|
## [26.67.0](https://github.com/Koenkk/zigbee-herdsman-converters/compare/v26.66.0...v26.67.0) (2026-06-17)
|
|
4
24
|
|
|
5
25
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"makegood.d.ts","sourceRoot":"","sources":["../../src/devices/makegood.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAC,oBAAoB,EAAC,MAAM,cAAc,CAAC;AAEvD,eAAO,MAAM,WAAW,EAAE,oBAAoB,
|
|
1
|
+
{"version":3,"file":"makegood.d.ts","sourceRoot":"","sources":["../../src/devices/makegood.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAC,oBAAoB,EAAC,MAAM,cAAc,CAAC;AAEvD,eAAO,MAAM,WAAW,EAAE,oBAAoB,EA+E7C,CAAC"}
|
package/dist/devices/makegood.js
CHANGED
|
@@ -68,7 +68,8 @@ exports.definitions = [
|
|
|
68
68
|
},
|
|
69
69
|
},
|
|
70
70
|
{
|
|
71
|
-
fingerprint: tuya.fingerprint("TS011F", ["_TZ3210_bep7ccew"]),
|
|
71
|
+
fingerprint: tuya.fingerprint("TS011F", ["_TZ3210_bep7ccew", "_TZ3210_qlmnxmac"]),
|
|
72
|
+
whiteLabel: [tuya.whitelabel("Melery", "_TZ3210_qlmnxmac", "2 gang power point with power monitoring", ["_TZ3210_qlmnxmac"])],
|
|
72
73
|
model: "MG-GPO01",
|
|
73
74
|
vendor: "MakeGood",
|
|
74
75
|
description: "Double Zigbee power point",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"makegood.js","sourceRoot":"","sources":["../../src/devices/makegood.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,6DAA+C;AAC/C,2DAA6C;AAC7C,uDAAyC;AACzC,4DAA8C;AAC9C,kDAAoC;AAGvB,QAAA,WAAW,GAA2B;IAC/C;QACI,WAAW,EAAE,IAAI,CAAC,WAAW,CAAC,QAAQ,EAAE,CAAC,kBAAkB,CAAC,CAAC;QAC7D,KAAK,EAAE,WAAW;QAClB,MAAM,EAAE,UAAU;QAClB,WAAW,EAAE,2BAA2B;QACxC,MAAM,EAAE;YACJ,IAAI,CAAC,YAAY,CAAC,QAAQ,EAAE;YAC5B,IAAI,CAAC,YAAY,CAAC,SAAS,CAAC,EAAC,iBAAiB,EAAE,IAAI,EAAE,aAAa,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE,sBAAsB,EAAE,IAAI,EAAC,CAAC;SACrI;QACD,IAAI,EAAE,EAAC,iBAAiB,EAAE,CAAC,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,QAAQ,CAAC,EAAE,aAAa,EAAE,IAAI,EAAC;QACzF,QAAQ,EAAE,CAAC,MAAM,EAAE,EAAE;YACjB,OAAO,EAAC,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAC,CAAC;QAC1B,CAAC;QACD,SAAS,EAAE,KAAK,EAAE,MAAM,EAAE,mBAAmB,EAAE,EAAE;YAC7C,MAAM,QAAQ,GAAG,MAAM,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC;YACvC,MAAM,IAAI,CAAC,oBAAoB,CAAC,MAAM,EAAE,mBAAmB,CAAC,CAAC;YAC7D,MAAM,SAAS,CAAC,IAAI,CAAC,QAAQ,EAAE,mBAAmB,EAAE,CAAC,UAAU,EAAE,yBAAyB,EAAE,YAAY,CAAC,CAAC,CAAC;YAC3G,MAAM,SAAS,CAAC,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,mBAAmB,EAAE,CAAC,UAAU,CAAC,CAAC,CAAC;YAC/E,MAAM,SAAS,CAAC,UAAU,CAAC,QAAQ,EAAE,EAAC,MAAM,EAAE,CAAC,EAAC,CAAC,CAAC;YAClD,MAAM,SAAS,CAAC,UAAU,CAAC,QAAQ,EAAE,EAAC,MAAM,EAAE,EAAE,EAAC,CAAC,CAAC;YACnD,MAAM,SAAS,CAAC,WAAW,CAAC,QAAQ,EAAE,EAAC,MAAM,EAAE,EAAE,EAAC,CAAC,CAAC;YACpD,MAAM,SAAS,CAAC,oBAAoB,CAAC,QAAQ,CAAC,CAAC;YAC/C,QAAQ,CAAC,4BAA4B,CAAC,yBAAyB,EAAE,EAAC,gBAAgB,EAAE,IAAI,EAAE,mBAAmB,EAAE,CAAC,EAAC,CAAC,CAAC;YACnH,QAAQ,CAAC,4BAA4B,CAAC,YAAY,EAAE,EAAC,OAAO,EAAE,GAAG,EAAE,UAAU,EAAE,CAAC,EAAC,CAAC,CAAC;YACnF,MAAM,CAAC,IAAI,EAAE,CAAC;QAClB,CAAC;KACJ;IACD;QACI,WAAW,EAAE,IAAI,CAAC,WAAW,CAAC,QAAQ,EAAE,CAAC,kBAAkB,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"makegood.js","sourceRoot":"","sources":["../../src/devices/makegood.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"namron.d.ts","sourceRoot":"","sources":["../../src/devices/namron.ts"],"names":[],"mappings":"AAWA,OAAO,KAAK,EAAC,oBAAoB,EAAmB,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"namron.d.ts","sourceRoot":"","sources":["../../src/devices/namron.ts"],"names":[],"mappings":"AAWA,OAAO,KAAK,EAAC,oBAAoB,EAAmB,MAAM,cAAc,CAAC;AAy7BzE,eAAO,MAAM,WAAW,EAAE,oBAAoB,EAmnE7C,CAAC"}
|
package/dist/devices/namron.js
CHANGED
|
@@ -438,17 +438,17 @@ const tzLocal = {
|
|
|
438
438
|
},
|
|
439
439
|
},
|
|
440
440
|
};
|
|
441
|
-
// Simplify Dimmer (4512791) — local toZigbee converters (repo-check-safe)
|
|
442
441
|
const sdClamp = (v, min, max) => Math.min(Math.max(v, min), max);
|
|
443
442
|
const sdSecToZclTime = (s) => Math.max(0, Math.round(Number(s || 0) * 10)); // ZCL = 1/10s
|
|
444
443
|
// Percent <-> level (1..254)
|
|
445
444
|
const sdPctToLevel = (pct) => sdClamp(Math.round((Number(pct) / 100) * 254), 1, 254);
|
|
446
445
|
const sdLevelToPct = (lvl) => sdClamp(Math.round((Number(lvl) / 254) * 100), 1, 100);
|
|
447
|
-
const
|
|
448
|
-
//
|
|
446
|
+
const tzLocalSimplifyDimmer4512791 = {
|
|
447
|
+
// Device supports off-spec writing to minLevel (0x0002).
|
|
448
|
+
// Requires read-before-write pattern - device returns NOT_AUTHORIZED without prior read.
|
|
449
449
|
min_brightness: {
|
|
450
450
|
key: ["min_brightness"],
|
|
451
|
-
convertSet: (entity, key, value, meta) => {
|
|
451
|
+
convertSet: async (entity, key, value, meta) => {
|
|
452
452
|
const pct = Number(value);
|
|
453
453
|
if (!Number.isFinite(pct) || pct < 1 || pct > 50)
|
|
454
454
|
throw new Error("min_brightness must be 1..50 (%)");
|
|
@@ -457,14 +457,21 @@ const _tzLocalSimplifyDimmer4512791 = {
|
|
|
457
457
|
if (typeof maxLvl === "number" && lvl > maxLvl) {
|
|
458
458
|
throw new Error(`min_brightness (${pct}%) cannot exceed max_brightness (${sdLevelToPct(maxLvl)}%)`);
|
|
459
459
|
}
|
|
460
|
+
// Device requires read-before-write to accept the write (off-spec HZC firmware behavior)
|
|
461
|
+
await entity.read("genLevelCtrl", ["minLevel"]);
|
|
462
|
+
await entity.write("genLevelCtrl", { [0x0002]: { value: lvl, type: 0x20 } }, { disableDefaultResponse: true, disableResponse: false });
|
|
460
463
|
store.putValue(meta.device, "min_brightness_level", lvl);
|
|
461
464
|
return { state: { min_brightness: sdLevelToPct(lvl) } };
|
|
462
465
|
},
|
|
466
|
+
convertGet: async (entity, key, meta) => {
|
|
467
|
+
await entity.read("genLevelCtrl", ["minLevel"]);
|
|
468
|
+
},
|
|
463
469
|
},
|
|
464
|
-
//
|
|
470
|
+
// Device supports off-spec writing to maxLevel (0x0003).
|
|
471
|
+
// Requires read-before-write pattern - device returns NOT_AUTHORIZED without prior read.
|
|
465
472
|
max_brightness: {
|
|
466
473
|
key: ["max_brightness"],
|
|
467
|
-
convertSet: (entity, key, value, meta) => {
|
|
474
|
+
convertSet: async (entity, key, value, meta) => {
|
|
468
475
|
const pct = Number(value);
|
|
469
476
|
if (!Number.isFinite(pct) || pct < 50 || pct > 100)
|
|
470
477
|
throw new Error("max_brightness must be 50..100 (%)");
|
|
@@ -473,26 +480,35 @@ const _tzLocalSimplifyDimmer4512791 = {
|
|
|
473
480
|
if (typeof minLvl === "number" && lvl < minLvl) {
|
|
474
481
|
throw new Error(`max_brightness (${pct}%) cannot be below min_brightness (${sdLevelToPct(minLvl)}%)`);
|
|
475
482
|
}
|
|
483
|
+
// Device requires read-before-write to accept the write (off-spec HZC firmware behavior)
|
|
484
|
+
await entity.read("genLevelCtrl", ["maxLevel"]);
|
|
485
|
+
await entity.write("genLevelCtrl", { [0x0003]: { value: lvl, type: 0x20 } }, { disableDefaultResponse: true, disableResponse: false });
|
|
476
486
|
store.putValue(meta.device, "max_brightness_level", lvl);
|
|
477
487
|
return { state: { max_brightness: sdLevelToPct(lvl) } };
|
|
478
488
|
},
|
|
489
|
+
convertGet: async (entity, key, meta) => {
|
|
490
|
+
await entity.read("genLevelCtrl", ["maxLevel"]);
|
|
491
|
+
},
|
|
479
492
|
},
|
|
480
|
-
//
|
|
493
|
+
// Device supports writing to defaultMoveRate (0x0014)
|
|
481
494
|
dimming_speed: {
|
|
482
495
|
key: ["dimming_speed"],
|
|
483
|
-
convertSet: (entity, key, value, meta) => {
|
|
496
|
+
convertSet: async (entity, key, value, meta) => {
|
|
484
497
|
const s = Number(value);
|
|
485
498
|
if (!Number.isFinite(s) || s < 1 || s > 10)
|
|
486
499
|
throw new Error("dimming_speed must be 1..10 seconds");
|
|
500
|
+
await entity.write("genLevelCtrl", { [0x0014]: { value: s, type: 0x20 } }, { disableDefaultResponse: true });
|
|
487
501
|
store.putValue(meta.device, "dimming_speed", s);
|
|
488
502
|
return { state: { dimming_speed: s } };
|
|
489
503
|
},
|
|
504
|
+
convertGet: async (entity, key, meta) => {
|
|
505
|
+
await entity.read("genLevelCtrl", ["defaultMoveRate"]);
|
|
506
|
+
},
|
|
490
507
|
},
|
|
491
|
-
// Brightness set with clamp + required optionsMask/optionsOverride
|
|
508
|
+
// Brightness set with clamp + required optionsMask/optionsOverride
|
|
492
509
|
brightness_clamped: {
|
|
493
510
|
key: ["brightness", "brightness_percent", "transition"],
|
|
494
511
|
convertSet: async (entity, key, value, meta) => {
|
|
495
|
-
// meta.message typing varies; keep it safe without any
|
|
496
512
|
const msg = meta.message ?? {};
|
|
497
513
|
let level = key === "brightness" ? Number(value) : sdPctToLevel(Number(value));
|
|
498
514
|
if (!Number.isFinite(level))
|
|
@@ -2559,34 +2575,69 @@ exports.definitions = [
|
|
|
2559
2575
|
.numeric("min_brightness", ea.ALL)
|
|
2560
2576
|
.withValueMin(1)
|
|
2561
2577
|
.withValueMax(50)
|
|
2562
|
-
.withDescription("Minimum brightness in % (1–50).
|
|
2578
|
+
.withDescription("Minimum brightness in % (1–50). Written to device minLevel (0x0002).")
|
|
2563
2579
|
.withCategory("config"),
|
|
2564
2580
|
exposes
|
|
2565
2581
|
.numeric("max_brightness", ea.ALL)
|
|
2566
2582
|
.withValueMin(50)
|
|
2567
2583
|
.withValueMax(100)
|
|
2568
|
-
.withDescription("Maximum brightness in % (50–100).
|
|
2584
|
+
.withDescription("Maximum brightness in % (50–100). Written to device maxLevel (0x0003).")
|
|
2569
2585
|
.withCategory("config"),
|
|
2570
2586
|
exposes
|
|
2571
2587
|
.numeric("dimming_speed", ea.ALL)
|
|
2572
2588
|
.withValueMin(1)
|
|
2573
2589
|
.withValueMax(10)
|
|
2574
|
-
.withDescription("Default dimming time in seconds (1–10).
|
|
2590
|
+
.withDescription("Default dimming time in seconds (1–10). Written to device defaultMoveRate (0x0014).")
|
|
2575
2591
|
.withCategory("config"),
|
|
2576
|
-
// Built-in key is level_config.on_level (this is what tz.level_config expects)
|
|
2577
2592
|
exposes
|
|
2578
2593
|
.composite("level_config", "level_config", ea.ALL)
|
|
2579
2594
|
.withFeature(exposes
|
|
2580
2595
|
.numeric("on_level", ea.ALL)
|
|
2581
2596
|
.withValueMin(1)
|
|
2582
2597
|
.withValueMax(254)
|
|
2583
|
-
.withDescription("On-level (1–254). Applied via genLevelCtrl.onLevel."))
|
|
2598
|
+
.withDescription("On-level (1–254). Applied via genLevelCtrl.onLevel (0x0011)."))
|
|
2584
2599
|
.withCategory("config"),
|
|
2585
2600
|
],
|
|
2586
|
-
|
|
2601
|
+
fromZigbee: [
|
|
2602
|
+
fz.on_off,
|
|
2603
|
+
fz.brightness,
|
|
2604
|
+
fz.electrical_measurement,
|
|
2605
|
+
fz.metering,
|
|
2606
|
+
{
|
|
2607
|
+
cluster: "genLevelCtrl",
|
|
2608
|
+
type: ["attributeReport", "readResponse"],
|
|
2609
|
+
convert: (model, msg, publish, options, meta) => {
|
|
2610
|
+
const result = {};
|
|
2611
|
+
if (Object.hasOwn(msg.data, "minLevel"))
|
|
2612
|
+
result["min_brightness"] = sdLevelToPct(msg.data["minLevel"]);
|
|
2613
|
+
if (Object.hasOwn(msg.data, "maxLevel"))
|
|
2614
|
+
result["max_brightness"] = sdLevelToPct(msg.data["maxLevel"]);
|
|
2615
|
+
if (Object.hasOwn(msg.data, "defaultMoveRate"))
|
|
2616
|
+
result["dimming_speed"] = msg.data["defaultMoveRate"];
|
|
2617
|
+
return result;
|
|
2618
|
+
},
|
|
2619
|
+
},
|
|
2620
|
+
],
|
|
2621
|
+
toZigbee: [
|
|
2622
|
+
tzLocalSimplifyDimmer4512791.min_brightness,
|
|
2623
|
+
tzLocalSimplifyDimmer4512791.max_brightness,
|
|
2624
|
+
tzLocalSimplifyDimmer4512791.dimming_speed,
|
|
2625
|
+
tzLocalSimplifyDimmer4512791.brightness_clamped,
|
|
2626
|
+
tz.light_onoff_brightness,
|
|
2627
|
+
tz.level_config,
|
|
2628
|
+
],
|
|
2629
|
+
configure: async (device, coordinatorEndpoint) => {
|
|
2630
|
+
const endpoint = device.getEndpoint(1);
|
|
2587
2631
|
store.putValue(device, "min_brightness_level", sdPctToLevel(20));
|
|
2588
2632
|
store.putValue(device, "max_brightness_level", sdPctToLevel(100));
|
|
2589
2633
|
store.putValue(device, "dimming_speed", 1);
|
|
2634
|
+
// Read current values from device
|
|
2635
|
+
try {
|
|
2636
|
+
await endpoint.read("genLevelCtrl", ["minLevel", "maxLevel", "defaultMoveRate", "onLevel"]);
|
|
2637
|
+
}
|
|
2638
|
+
catch (_e) {
|
|
2639
|
+
// Not all firmware versions support reading these
|
|
2640
|
+
}
|
|
2590
2641
|
},
|
|
2591
2642
|
},
|
|
2592
2643
|
{
|