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 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,EA8E7C,CAAC"}
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"}
@@ -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":"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"}
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;AAw6BzE,eAAO,MAAM,WAAW,EAAE,oBAAoB,EA2lE7C,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"}
@@ -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 _tzLocalSimplifyDimmer4512791 = {
448
- // Software clamp only -> stored in store, no device attribute to read => no convertGet
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
- // Software clamp only -> stored in store, no device attribute to read => no convertGet
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
- // Software default transition only -> stored in store, we do NOT write unsupported attributes => no convertGet
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 to avoid "optionsMask is missing"
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). Used to clamp brightness.")
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). Used to clamp brightness.")
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). Used as default transition for brightness commands.")
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
- configure: (device) => {
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
  {