zigbee-herdsman-converters 25.64.0 → 25.66.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.
@@ -358,6 +358,21 @@ const convLocal = {
358
358
  return new node_util_1.TextDecoder("utf-8").decode(hexToBytes);
359
359
  },
360
360
  },
361
+ nameTrunc: {
362
+ to: (v, meta, len = 8) => {
363
+ const truncated = v.slice(0, len);
364
+ const utf8bytes = new node_util_1.TextEncoder().encode(truncated);
365
+ return Array.from(utf8bytes, (utf8bytes) => utf8bytes.toString(16).padStart(4, "0")).join("");
366
+ },
367
+ from: (v, meta) => {
368
+ const bytes = [];
369
+ for (let i = 0; i < v.length; i += 4) {
370
+ bytes.push(Number.parseInt(v.slice(i, i + 4), 16));
371
+ }
372
+ const hexToBytes = Uint8Array.from(bytes);
373
+ return new node_util_1.TextDecoder("utf-8").decode(hexToBytes);
374
+ },
375
+ },
361
376
  };
362
377
  const tzLocal = {
363
378
  ts0049_countdown: {
@@ -2271,7 +2286,7 @@ exports.definitions = [
2271
2286
  zigbeeModel: ["CK-BL702-AL-01(7009_Z102LG03-1)", "CK-BL702-AL-01(7009_Z102LG04-1)", "CK-BL702-AL-01(7009_Z102LG04-2)"],
2272
2287
  model: "CK-BL702-AL-01",
2273
2288
  vendor: "Tuya",
2274
- description: "Zigbee LED bulb",
2289
+ description: "GU-10 5W 350lm Zigbee RGBCCW LED bulb",
2275
2290
  extend: [
2276
2291
  tuya.modernExtend.tuyaLight({
2277
2292
  colorTemp: { range: [142, 500] },
@@ -2362,7 +2377,7 @@ exports.definitions = [
2362
2377
  tuya.whitelabel("Moes", "ZB-TDA9-RCW-E27-MS", "RGB+CCT 9W E27 LED bulb", ["_TZ3210_wxa85bwk"]),
2363
2378
  tuya.whitelabel("Moes", "ZB-LZD10-RCW", "10W RGB+CCT Smart Downlight", ["_TZ3210_s9lumfhn", "_TZ3210_jjqdqxfq", "_TZ3210_dwzfzfjc"]),
2364
2379
  tuya.whitelabel("Moes", "ZB-TDC6-RCW-E14", "RGB+CCT 5W E14 LED bulb", ["_TZ3210_ifga63rg"]),
2365
- tuya.whitelabel("MiBoxer", "E3-ZR", "3 in 1 LED Controller", ["_TZB210_wy1pyu1q"]),
2380
+ tuya.whitelabel("MiBoxer", "E3-ZR", "3 in 1 LED Controller", ["_TZB210_wy1pyu1q", "_TZB210_yatkpuha"]),
2366
2381
  tuya.whitelabel("MiBoxer", "SZ5", "5 in 1 LED Controller", ["_TZB210_w9hcix2r"]),
2367
2382
  tuya.whitelabel("MiBoxer", "FUT037Z+", "RGB led controller", ["_TZB210_417ikxay", "_TZB210_wxazcmsh"]),
2368
2383
  tuya.whitelabel("MiBoxer", "FUT039Z", "RGB+CCT LED controller", ["_TZ3210_jicmoite", "_TZB210_rs0ufzwg"]),
@@ -7578,6 +7593,7 @@ exports.definitions = [
7578
7593
  tuya.modernExtend.tuyaOnOff({
7579
7594
  electricalMeasurements: true,
7580
7595
  powerOutageMemory: true,
7596
+ onOffCountdown: true,
7581
7597
  indicatorMode: true,
7582
7598
  childLock: true,
7583
7599
  }),
@@ -10999,7 +11015,11 @@ exports.definitions = [
10999
11015
  exposes: [ez.learn_ir_code(), ez.learned_ir_code(), ez.ir_code_to_send()],
11000
11016
  whiteLabel: [
11001
11017
  tuya.whitelabel("Tuya", "UFO-R4Z", "Universal smart IR remote control", ["_TZ3290_rlkmy85q4pzoxobl"]),
11002
- tuya.whitelabel("QA", "QAIRZPRO", "Infrared hub pro", ["_TZ3290_jxvzqatwgsaqzx1u", "_TZ3290_lypnqvlem5eq1ree"]),
11018
+ tuya.whitelabel("QA", "QAIRZPRO", "Infrared hub pro", [
11019
+ "_TZ3290_jxvzqatwgsaqzx1u",
11020
+ "_TZ3290_lypnqvlem5eq1ree",
11021
+ "_TZ3290_yac64inudpovoaba",
11022
+ ]),
11003
11023
  tuya.whitelabel("Zemismart", "ZM-18-USB", "Universal smart IR remote control", ["_TZ3290_uc8lwbi2"]),
11004
11024
  tuya.whitelabel("Zemismart", "ZXMIR-02", "Universal smart IR remote control", ["_TZ3290_8xzb2ghn"]),
11005
11025
  ],
@@ -14578,7 +14598,9 @@ exports.definitions = [
14578
14598
  .withValueMax(9.99)
14579
14599
  .withUnit("m/s")
14580
14600
  .withDescription("Target speed with direction"),
14581
- e.enum("debug_switch", ea.STATE_SET, ["off", "on"]).withDescription("Debug mode toggle"),
14601
+ e
14602
+ .binary("debug_switch", ea.STATE_SET, "on", "off") // change to toggle
14603
+ .withDescription("Debug mode toggle"),
14582
14604
  e
14583
14605
  .enum("led_mode", ea.STATE_SET, ["silence", "status"]) // same as in the app
14584
14606
  .withDescription("LED indicator mode"),
@@ -14594,7 +14616,10 @@ exports.definitions = [
14594
14616
  .enum("judge_logic", ea.STATE_SET, ["large_move", "small_move", "custom_move"]) // same as in the app
14595
14617
  .withDescription("Presence detection algorithm"),
14596
14618
  e
14597
- .enum("environmental_noise_collect", ea.STATE_SET, ["start", "ongoing", "complete"])
14619
+ .enum("start_noise_collect", ea.SET, ["start"]) // only button to start noise collection
14620
+ .withDescription("Start environmental background noise collection and auto adjust thresholds"),
14621
+ e
14622
+ .enum("noise_collect_status", ea.STATE, ["start", "ongoing", "complete"]) // status of noise collection
14598
14623
  .withDescription("Environmental background noise collection status"),
14599
14624
  e.enum("device_control", ea.STATE_SET, ["no_action", "restart", "reset_param"]).withDescription("Device control commands"),
14600
14625
  e.enum("presence_sensitivity", ea.STATE_SET, ["high", "medium", "low", "custom"]).withDescription("Presence sensitivity"),
@@ -14656,10 +14681,13 @@ exports.definitions = [
14656
14681
  "judge_logic",
14657
14682
  tuya.valueConverterBasic.lookup({ large_move: tuya.enum(0), small_move: tuya.enum(1), custom_move: tuya.enum(2) }),
14658
14683
  ],
14684
+ [123, "noise_collect_status", tuya.valueConverterBasic.lookup({ start: tuya.enum(0), ongoing: tuya.enum(1), complete: tuya.enum(2) })], // status reporting, this line MUST above button to work properly
14659
14685
  [
14660
14686
  123,
14661
- "environmental_noise_collect",
14662
- tuya.valueConverterBasic.lookup({ start: tuya.enum(0), ongoing: tuya.enum(1), complete: tuya.enum(2) }),
14687
+ "start_noise_collect", // for button, this line MUST below status reporting
14688
+ {
14689
+ to: () => tuya.enum(0), // send 0 to start noise collection
14690
+ },
14663
14691
  ],
14664
14692
  [124, "device_control", tuya.valueConverterBasic.lookup({ no_action: tuya.enum(0), restart: tuya.enum(1), reset_param: tuya.enum(2) })],
14665
14693
  [125, "illuminance", tuya.valueConverter.raw],
@@ -16884,6 +16912,13 @@ exports.definitions = [
16884
16912
  e.binary("switch1", ea.STATE_SET, "ON", "OFF").withDescription("Switch1"),
16885
16913
  e.binary("switch2", ea.STATE_SET, "ON", "OFF").withDescription("Switch2"),
16886
16914
  e.binary("switch3", ea.STATE_SET, "ON", "OFF").withDescription("Switch3"),
16915
+ e
16916
+ .numeric("distance", ea.STATE_SET)
16917
+ .withValueMin(0)
16918
+ .withValueMax(6)
16919
+ .withValueStep(0.1)
16920
+ .withUnit("m")
16921
+ .withDescription("detection distance"),
16887
16922
  e
16888
16923
  .numeric("sensitivity", ea.STATE_SET)
16889
16924
  .withValueMin(0)
@@ -16911,10 +16946,11 @@ exports.definitions = [
16911
16946
  meta: {
16912
16947
  tuyaDatapoints: [
16913
16948
  [1, "presence", tuya.valueConverter.trueFalse1],
16949
+ [2, "sensitivity", tuya.valueConverter.raw],
16950
+ [4, "distance", tuya.valueConverter.divideBy100],
16914
16951
  [101, "switch1", tuya.valueConverter.onOff],
16915
16952
  [102, "switch2", tuya.valueConverter.onOff],
16916
16953
  [103, "switch3", tuya.valueConverter.onOff],
16917
- [110, "sensitivity", tuya.valueConverter.raw],
16918
16954
  [111, "backlight", tuya.valueConverter.onOff],
16919
16955
  [114, "trigger_hold", tuya.valueConverter.raw],
16920
16956
  [
@@ -20582,5 +20618,193 @@ exports.definitions = [
20582
20618
  ],
20583
20619
  },
20584
20620
  },
20621
+ {
20622
+ fingerprint: tuya.fingerprint("TS0601", ["_TZE284_iwyqtclw"]),
20623
+ model: "M9Pro",
20624
+ vendor: "Tuya",
20625
+ description: "Smart 4 gang switch, curtain, smart light or scene. 1x thermosat control",
20626
+ exposes: [
20627
+ ...[1, 2, 3, 4].map((i) => e.switch().withEndpoint(`l${i}`).setAccess("state", ea.STATE_SET)),
20628
+ ...[1, 2, 3].map((i) => e.enum("mode", ea.STATE_SET, ["switch", "scene", "smart_light", "curtain"]).withEndpoint(`l${i}`).withDescription(`Switch ${i} mode`)),
20629
+ e
20630
+ .enum("mode", ea.STATE_SET, ["switch", "scene", "smart_light", "curtain", "thermostat"])
20631
+ .withEndpoint("l4")
20632
+ .withDescription("Switch 4 mode"),
20633
+ ...[1, 2, 3, 4].map((i) => e.text("name", ea.STATE_SET).withEndpoint(`l${i}`).withDescription(`Name for Switch ${i} (max 8 chars displayed)`)),
20634
+ ...[1, 2, 3, 4].map((i) => e.text("scene_name", ea.STATE_SET).withEndpoint(`l${i}`).withDescription(`Scene name for switch ${i} (max 8 chars displayed)`)),
20635
+ ...[1, 2, 3, 4].map((i) => e.text("dimmer_name", ea.STATE_SET).withEndpoint(`l${i}`).withDescription(`Smart Light name for switch ${i} (max 8 chars displayed)`)),
20636
+ ...[1, 2, 3, 4].map((i) => exposes.binary("dimmer_switch", ea.STATE_SET, "ON", "OFF").withEndpoint(`l${i}`).withDescription(`Smart Light - toggle switch ${i}`)),
20637
+ ...[1, 2, 3, 4].map((i) => e.text("curtain_name", ea.STATE_SET).withEndpoint(`l${i}`).withDescription(`Curtain name for switch ${i} (max 8 chars displayed)`)),
20638
+ ...[1, 2, 3, 4].map((i) => exposes.binary("curtain_switch", ea.STATE_SET, "ON", "OFF").withEndpoint(`l${i}`).withDescription(`Curtain - toggle switch ${i}`)),
20639
+ e.power_on_behavior(["off", "on", "previous"]).withAccess(ea.STATE_SET).withDescription("Whole panel override.").withCategory("config"),
20640
+ ...[1, 2, 3, 4].map((i) => e.power_on_behavior(["off", "on", "previous"]).withAccess(ea.STATE_SET).withEndpoint(`l${i}`)),
20641
+ exposes.binary("show_weather", ea.STATE_SET, "ON", "OFF").withDescription("Show time and weather (on) or just switch names (off)"),
20642
+ exposes.binary("backlight", ea.STATE_SET, "ON", "OFF").withDescription("Button LED backlights"),
20643
+ e.enum("show_screen", ea.STATE_SET, ["motion", "on_press", "on"]).withDescription("Screen display mode"),
20644
+ // Thermostat - Switch 4 only
20645
+ exposes
20646
+ .binary("thermostat", ea.STATE_SET, "ON", "OFF")
20647
+ .withDescription("Thermostat - toggle switch"),
20648
+ e.text("thermostat_name", ea.STATE_SET).withDescription("Name for Thermostat (max 8 chars displayed)"),
20649
+ e
20650
+ .enum("scene_switch", ea.STATE_SET, [
20651
+ "switch_1",
20652
+ "switch_2",
20653
+ "switch_3",
20654
+ "switch_4",
20655
+ "switch_5",
20656
+ "switch_6",
20657
+ "switch_7",
20658
+ "switch_8",
20659
+ "switch_9",
20660
+ ])
20661
+ .withDescription("Scene Switch"),
20662
+ e.action(["scene_0", "scene_1", "scene_2", "scene_3", "scene_4", "scene_5", "scene_6", "scene_7", "scene_8"]),
20663
+ // Set weather
20664
+ // Temperature will accept decimal values e.g. 0.1 but display will round off to nearest whole number.
20665
+ // Best to handle rounding in HA before passing to z2m.
20666
+ e
20667
+ .numeric("temperature_1", ea.STATE_SET)
20668
+ .withValueMin(-65)
20669
+ .withValueMax(99)
20670
+ .withDescription("Temperature")
20671
+ .withValueStep(0.1),
20672
+ // If you need other values to match your weather provider, map them with a template in HA or
20673
+ // add a z2m 'External Extension' to override tuya.M8ProTuyaWeatherCondition.
20674
+ e
20675
+ .enum("condition_1", ea.STATE_SET, Object.keys(tuya.M8ProTuyaWeatherCondition))
20676
+ .withDescription("Weather condition"),
20677
+ ],
20678
+ meta: {
20679
+ multiEndpoint: true,
20680
+ disableDefaultResponse: true,
20681
+ tuyaDatapoints: [
20682
+ [1, "action", tuya.valueConverter.static("scene_1")],
20683
+ [2, "action", tuya.valueConverter.static("scene_2")],
20684
+ [3, "action", tuya.valueConverter.static("scene_3")],
20685
+ [4, "action", tuya.valueConverter.static("scene_4")],
20686
+ [17, "action", tuya.valueConverter.static("scene_0")],
20687
+ [
20688
+ 18,
20689
+ "mode_l1",
20690
+ tuya.valueConverterBasic.lookup({
20691
+ switch: tuya.enum(0),
20692
+ scene: tuya.enum(1),
20693
+ smart_light: tuya.enum(2),
20694
+ curtain: tuya.enum(3),
20695
+ }),
20696
+ ],
20697
+ [
20698
+ 19,
20699
+ "mode_l2",
20700
+ tuya.valueConverterBasic.lookup({
20701
+ switch: tuya.enum(0),
20702
+ scene: tuya.enum(1),
20703
+ smart_light: tuya.enum(2),
20704
+ curtain: tuya.enum(3),
20705
+ }),
20706
+ ],
20707
+ [
20708
+ 20,
20709
+ "mode_l3",
20710
+ tuya.valueConverterBasic.lookup({
20711
+ switch: tuya.enum(0),
20712
+ scene: tuya.enum(1),
20713
+ smart_light: tuya.enum(2),
20714
+ curtain: tuya.enum(3),
20715
+ }),
20716
+ ],
20717
+ [
20718
+ 21,
20719
+ "mode_l4",
20720
+ tuya.valueConverterBasic.lookup({
20721
+ switch: tuya.enum(0),
20722
+ scene: tuya.enum(1),
20723
+ smart_light: tuya.enum(2),
20724
+ curtain: tuya.enum(3),
20725
+ thermostat: tuya.enum(4),
20726
+ }),
20727
+ ],
20728
+ [24, "state_l1", tuya.valueConverter.onOff],
20729
+ [25, "state_l2", tuya.valueConverter.onOff],
20730
+ [26, "state_l3", tuya.valueConverter.onOff],
20731
+ [27, "state_l4", tuya.valueConverter.onOff],
20732
+ [36, "show_weather", tuya.valueConverter.onOff],
20733
+ // Screen display modes.
20734
+ // From Tuya Dev Platform: enum "range": ["relay", "pos", "none"]. These names don't match what's happening on the device
20735
+ [
20736
+ 37,
20737
+ "show_screen",
20738
+ tuya.valueConverterBasic.lookup({
20739
+ motion: tuya.enum(0), // Screen on/off with motion detection.
20740
+ on_press: tuya.enum(1), // Disable motion detection. Only show screen on physical button press.
20741
+ on: tuya.enum(2), // Screen stays on.
20742
+ }),
20743
+ ],
20744
+ [38, "power_on_behavior", tuya.valueConverter.powerOnBehaviorEnum], // whole panel
20745
+ [39, "power_on_behavior_l1", tuya.valueConverter.powerOnBehaviorEnum],
20746
+ [40, "power_on_behavior_l2", tuya.valueConverter.powerOnBehaviorEnum],
20747
+ [41, "power_on_behavior_l3", tuya.valueConverter.powerOnBehaviorEnum],
20748
+ [42, "power_on_behavior_l4", tuya.valueConverter.powerOnBehaviorEnum],
20749
+ [101, "backlight", tuya.valueConverter.onOff], // Buttton backlights
20750
+ [
20751
+ 102,
20752
+ "scene_switch",
20753
+ tuya.valueConverterBasic.lookup({
20754
+ switch_1: tuya.enum(0),
20755
+ switch_2: tuya.enum(1),
20756
+ switch_3: tuya.enum(2),
20757
+ switch_4: tuya.enum(3),
20758
+ switch_5: tuya.enum(4),
20759
+ switch_6: tuya.enum(5),
20760
+ switch_7: tuya.enum(6),
20761
+ switch_8: tuya.enum(7),
20762
+ switch_9: tuya.enum(8),
20763
+ }),
20764
+ ],
20765
+ // The M9 Pro only displays first 8 chars of names, but state will hold the whole string.
20766
+ // I prefer that the state always equals what is displayed, so trim name to 8 chars.
20767
+ // Switch names
20768
+ [103, "name_l1", convLocal.nameTrunc],
20769
+ [104, "name_l2", convLocal.nameTrunc],
20770
+ [105, "name_l3", convLocal.nameTrunc],
20771
+ [106, "name_l4", convLocal.nameTrunc],
20772
+ // Scene names
20773
+ [107, "scene_name_l1", convLocal.nameTrunc],
20774
+ [108, "scene_name_l2", convLocal.nameTrunc],
20775
+ [109, "scene_name_l3", convLocal.nameTrunc],
20776
+ [110, "scene_name_l4", convLocal.nameTrunc],
20777
+ // Dimmer names
20778
+ [111, "dimmer_name_l1", convLocal.nameTrunc],
20779
+ [112, "dimmer_name_l2", convLocal.nameTrunc],
20780
+ [113, "dimmer_name_l3", convLocal.nameTrunc],
20781
+ [114, "dimmer_name_l4", convLocal.nameTrunc],
20782
+ // Curtain names
20783
+ [115, "curtain_name_l1", convLocal.nameTrunc],
20784
+ [116, "curtain_name_l2", convLocal.nameTrunc],
20785
+ [117, "curtain_name_l3", convLocal.nameTrunc],
20786
+ [118, "curtain_name_l4", convLocal.nameTrunc],
20787
+ [119, "curtain_switch_l1", tuya.valueConverter.onOff],
20788
+ [120, "curtain_switch_l2", tuya.valueConverter.onOff],
20789
+ [121, "curtain_switch_l3", tuya.valueConverter.onOff],
20790
+ [122, "curtain_switch_l4", tuya.valueConverter.onOff],
20791
+ [123, "dimmer_switch_l1", tuya.valueConverter.onOff],
20792
+ [124, "dimmer_switch_l2", tuya.valueConverter.onOff],
20793
+ [125, "dimmer_switch_l3", tuya.valueConverter.onOff],
20794
+ [126, "dimmer_switch_l4", tuya.valueConverter.onOff],
20795
+ [127, "thermostat", tuya.valueConverter.onOff],
20796
+ [128, "thermostat_name", convLocal.nameTrunc],
20797
+ ],
20798
+ },
20799
+ extend: [
20800
+ // NOTE: M9 Pro only updates the weather condition and temperature on power cycle and once per hour.
20801
+ tuya.modernExtend.tuyaWeatherForecast({ includeCurrentWeather: true, numberOfForecastDays: 3, correctForNegativeValues: false }),
20802
+ tuya.modernExtend.tuyaBase({
20803
+ dp: true,
20804
+ timeStart: "1970", // needed else date/time doesn't sync with z2m > 2.6.2
20805
+ }),
20806
+ m.deviceEndpoints({ endpoints: { l1: 1, l2: 1, l3: 1, l4: 1 } }),
20807
+ ],
20808
+ },
20585
20809
  ];
20586
20810
  //# sourceMappingURL=tuya.js.map