zigbee-herdsman-converters 25.89.0 → 25.91.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.
Files changed (53) hide show
  1. package/CHANGELOG.md +50 -0
  2. package/dist/devices/bubendorff.d.ts +3 -0
  3. package/dist/devices/bubendorff.d.ts.map +1 -0
  4. package/dist/devices/bubendorff.js +47 -0
  5. package/dist/devices/bubendorff.js.map +1 -0
  6. package/dist/devices/easyiot.js +5 -2
  7. package/dist/devices/easyiot.js.map +1 -1
  8. package/dist/devices/envilar.d.ts.map +1 -1
  9. package/dist/devices/envilar.js +7 -0
  10. package/dist/devices/envilar.js.map +1 -1
  11. package/dist/devices/ewelink.d.ts.map +1 -1
  12. package/dist/devices/ewelink.js +2 -1
  13. package/dist/devices/ewelink.js.map +1 -1
  14. package/dist/devices/index.d.ts.map +1 -1
  15. package/dist/devices/index.js +2 -0
  16. package/dist/devices/index.js.map +1 -1
  17. package/dist/devices/innr.d.ts.map +1 -1
  18. package/dist/devices/innr.js +7 -0
  19. package/dist/devices/innr.js.map +1 -1
  20. package/dist/devices/lincukoo.d.ts.map +1 -1
  21. package/dist/devices/lincukoo.js +8 -0
  22. package/dist/devices/lincukoo.js.map +1 -1
  23. package/dist/devices/lumi.d.ts.map +1 -1
  24. package/dist/devices/lumi.js +32 -12
  25. package/dist/devices/lumi.js.map +1 -1
  26. package/dist/devices/philips.d.ts.map +1 -1
  27. package/dist/devices/philips.js +63 -30
  28. package/dist/devices/philips.js.map +1 -1
  29. package/dist/devices/schneider_electric.d.ts.map +1 -1
  30. package/dist/devices/schneider_electric.js +5 -1
  31. package/dist/devices/schneider_electric.js.map +1 -1
  32. package/dist/devices/sinope.d.ts.map +1 -1
  33. package/dist/devices/sinope.js +3 -2
  34. package/dist/devices/sinope.js.map +1 -1
  35. package/dist/devices/somfy.d.ts.map +1 -1
  36. package/dist/devices/somfy.js +7 -0
  37. package/dist/devices/somfy.js.map +1 -1
  38. package/dist/devices/third_reality.d.ts.map +1 -1
  39. package/dist/devices/third_reality.js +196 -26
  40. package/dist/devices/third_reality.js.map +1 -1
  41. package/dist/devices/tuya.d.ts.map +1 -1
  42. package/dist/devices/tuya.js +241 -116
  43. package/dist/devices/tuya.js.map +1 -1
  44. package/dist/lib/lumi.d.ts +3 -0
  45. package/dist/lib/lumi.d.ts.map +1 -1
  46. package/dist/lib/lumi.js +113 -0
  47. package/dist/lib/lumi.js.map +1 -1
  48. package/dist/lib/tuya.d.ts +4 -4
  49. package/dist/lib/tuya.d.ts.map +1 -1
  50. package/dist/lib/tuya.js +28 -15
  51. package/dist/lib/tuya.js.map +1 -1
  52. package/dist/models-index.json +1 -1
  53. package/package.json +2 -2
@@ -2580,6 +2580,7 @@ exports.definitions = [
2580
2580
  exposes: [e.power_on_behavior(["off", "on", "toggle", "previous"])],
2581
2581
  meta: {
2582
2582
  moveToLevelWithOnOffDisable: true,
2583
+ noOffTransitionWhenOff: true,
2583
2584
  },
2584
2585
  configure: async (device, coordinatorEndpoint) => {
2585
2586
  const endpoint = device.getEndpoint(1);
@@ -3919,6 +3920,42 @@ exports.definitions = [
3919
3920
  extend: [m.battery(), m.windowCovering({ controls: ["lift"] })],
3920
3921
  whiteLabel: [tuya.whitelabel("Yookee", "D10110_1", "Smart blind", ["_TZE200_9caxna4s"])],
3921
3922
  },
3923
+ {
3924
+ fingerprint: tuya.fingerprint("TS0301", ["_TZE210_m6lwazh9"]),
3925
+ model: "TS0301_cover_1",
3926
+ vendor: "Tuya",
3927
+ description: "Cover motor",
3928
+ extend: [tuya.modernExtend.tuyaBase({ dp: true })],
3929
+ options: [exposes.options.invert_cover()],
3930
+ exposes: [
3931
+ e.battery(),
3932
+ e.cover_position().setAccess("position", ea.STATE_SET),
3933
+ e.enum("reverse_direction", ea.STATE_SET, ["forward", "back"]).withDescription("Reverse the motor direction"),
3934
+ ],
3935
+ meta: {
3936
+ tuyaDatapoints: [
3937
+ [
3938
+ 1,
3939
+ "state",
3940
+ tuya.valueConverterBasic.lookup({
3941
+ OPEN: tuya.enum(0),
3942
+ STOP: tuya.enum(1),
3943
+ CLOSE: tuya.enum(2),
3944
+ }),
3945
+ ],
3946
+ [2, "position", tuya.valueConverter.coverPosition],
3947
+ [3, "position", tuya.valueConverter.coverPosition],
3948
+ [
3949
+ 5,
3950
+ "reverse_direction",
3951
+ tuya.valueConverterBasic.lookup({
3952
+ forward: tuya.enum(0),
3953
+ back: tuya.enum(1),
3954
+ }),
3955
+ ],
3956
+ ],
3957
+ },
3958
+ },
3922
3959
  {
3923
3960
  fingerprint: tuya.fingerprint("TS0601", [
3924
3961
  "_TZE200_aqnazj70",
@@ -4816,56 +4853,34 @@ exports.definitions = [
4816
4853
  },
4817
4854
  {
4818
4855
  fingerprint: tuya.fingerprint("TS0601", ["_TZE200_dzuqwsyg", "_TZE204_dzuqwsyg"]),
4819
- model: "BAC-003",
4856
+ model: "BAC-002",
4820
4857
  vendor: "Tuya",
4821
4858
  description: "FCU thermostat temperature controller",
4822
4859
  extend: [tuya.modernExtend.tuyaBase({ dp: true, forceTimeUpdates: true, timeStart: "1970" })],
4823
4860
  options: [
4861
+ e.enum("control_sequence_of_operation", ea.SET, ["cooling_only", "cooling_and_heating_4-pipes"]),
4862
+ e.binary("expose_device_state", ea.SET, true, false),
4863
+ ],
4864
+ exposes: [
4824
4865
  e
4825
- .enum("control_sequence_of_operation", ea.SET, ["cooling_only", "cooling_and_heating_4-pipes"])
4826
- .withDescription("Operating environment of the thermostat"),
4827
- e.binary("expose_device_state", ea.SET, true, false).withDescription("Expose device power state as a separate property when enabled."),
4866
+ .climate()
4867
+ .withLocalTemperature(ea.STATE)
4868
+ .withSystemMode(["off", "cool", "heat", "fan_only"], ea.STATE_SET)
4869
+ .withFanMode(["low", "medium", "high", "auto"], ea.STATE_SET)
4870
+ .withSetpoint("current_heating_setpoint", 5, 35, 1, ea.STATE_SET)
4871
+ .withPreset(["auto", "manual"])
4872
+ .withLocalTemperatureCalibration(-9, 9, 1, ea.STATE_SET),
4873
+ e.child_lock(),
4874
+ e.max_temperature().withValueMin(35).withValueMax(45),
4875
+ e.numeric("deadzone_temperature", ea.STATE_SET).withUnit("°C").withValueMax(5).withValueMin(1),
4876
+ e.text("schedule_text", ea.STATE_SET).withDescription(`Weekly schedule in the format "HH:MM/TT HH:MM/TT ...".
4877
+ Example for 12 segments:
4878
+ "06:00/20 11:30/21 13:30/22 17:30/23 06:00/24 12:00/23 14:30/22 17:30/21 06:00/19 12:30/20 14:30/21 18:30/20".
4879
+ Each segment contains:
4880
+ - HH:MM: Time in 24-hour format.
4881
+ - TT: Temperature in °C.
4882
+ Ensure all 12 segments are defined and separated by spaces.`),
4828
4883
  ],
4829
- exposes: (device, options) => {
4830
- const system_modes = ["off", "cool", "heat", "fan_only"];
4831
- // Device can operate either in 2-pipe or 4-pipe configuration
4832
- // For 2-pipe configurations remove 'heat' mode
4833
- switch (options?.control_sequence_of_operation) {
4834
- case "cooling_only":
4835
- system_modes.splice(2, 1);
4836
- break;
4837
- }
4838
- const exposes = [
4839
- e
4840
- .climate()
4841
- .withLocalTemperature(ea.STATE)
4842
- .withSystemMode(system_modes, ea.STATE_SET)
4843
- .withFanMode(["low", "medium", "high", "auto"], ea.STATE_SET)
4844
- .withSetpoint("current_heating_setpoint", 5, 35, 1, ea.STATE_SET)
4845
- .withPreset(["auto", "manual"])
4846
- .withLocalTemperatureCalibration(-3, 3, 1, ea.STATE_SET),
4847
- e.child_lock(),
4848
- e
4849
- .composite("schedule", "schedule", ea.STATE_SET)
4850
- .withFeature(e.text("weekdays", ea.SET).withDescription('Schedule (1-5), 4 periods in format "hh:mm/tt".'))
4851
- .withFeature(e.text("saturday", ea.SET).withDescription('Schedule (6), 4 periods in format "hh:mm/tt".'))
4852
- .withFeature(e.text("sunday", ea.SET).withDescription('Schedule (7), 4 periods in format "hh:mm/tt".'))
4853
- .withDescription('Auto-mode schedule, 4 periods each per category. Example: "06:00/20 11:30/21 13:30/22 17:30/23.5".'),
4854
- e.max_temperature().withValueMin(35).withValueMax(45).withPreset("default", 35, "Default value"),
4855
- e
4856
- .numeric("deadzone_temperature", ea.STATE_SET)
4857
- .withUnit("°C")
4858
- .withValueMax(5)
4859
- .withValueMin(1)
4860
- .withValueStep(1)
4861
- .withPreset("default", 1, "Default value")
4862
- .withDescription("The delta between local_temperature and current_heating_setpoint to trigger activity"),
4863
- ];
4864
- if (options?.expose_device_state === true) {
4865
- exposes.unshift(e.binary("state", ea.STATE_SET, "ON", "OFF").withDescription("Turn the thermostat ON or OFF"));
4866
- }
4867
- return exposes;
4868
- },
4869
4884
  meta: {
4870
4885
  publishDuplicateTransaction: true,
4871
4886
  tuyaDatapoints: [
@@ -4880,9 +4895,8 @@ exports.definitions = [
4880
4895
  },
4881
4896
  from: (v, meta, options) => {
4882
4897
  meta.state.system_mode = v === true ? (meta.state.system_mode_device ?? "cool") : "off";
4883
- if (options?.expose_device_state === true) {
4898
+ if (options?.expose_device_state === true)
4884
4899
  return v === true ? "ON" : "OFF";
4885
- }
4886
4900
  delete meta.state.state;
4887
4901
  },
4888
4902
  },
@@ -4891,22 +4905,22 @@ exports.definitions = [
4891
4905
  2,
4892
4906
  "system_mode",
4893
4907
  {
4894
- // Extend system_mode to support 'off' in addition to 'cool', 'heat' and 'fan_only'
4895
4908
  to: async (v, meta) => {
4896
- const entity = meta.device.endpoints[0];
4897
- // Power State
4898
- await tuya.sendDataPointBool(entity, 1, v !== "off", "dataRequest", 1);
4899
- switch (v) {
4900
- case "cool":
4901
- await tuya.sendDataPointEnum(entity, 2, 0, "dataRequest", 1);
4902
- break;
4903
- case "heat":
4904
- await tuya.sendDataPointEnum(entity, 2, 1, "dataRequest", 1);
4905
- break;
4906
- case "fan_only":
4907
- await tuya.sendDataPointEnum(entity, 2, 2, "dataRequest", 1);
4908
- break;
4909
+ const ep = meta.device.endpoints[0];
4910
+ if (v === "off") {
4911
+ await tuya.sendDataPointBool(ep, 1, true, "dataRequest", 1);
4912
+ await new Promise((r) => setTimeout(r, 120));
4913
+ await tuya.sendDataPointBool(ep, 1, false, "dataRequest", 1);
4914
+ await tuya.sendDataPointEnum(ep, 2, 0, "dataRequest", 1);
4915
+ return;
4909
4916
  }
4917
+ await tuya.sendDataPointBool(ep, 1, true, "dataRequest", 1);
4918
+ if (v === "cool")
4919
+ await tuya.sendDataPointEnum(ep, 2, 0, "dataRequest", 1);
4920
+ if (v === "heat")
4921
+ await tuya.sendDataPointEnum(ep, 2, 1, "dataRequest", 1);
4922
+ if (v === "fan_only")
4923
+ await tuya.sendDataPointEnum(ep, 2, 2, "dataRequest", 1);
4910
4924
  },
4911
4925
  from: (v, meta) => {
4912
4926
  const modes = ["cool", "heat", "fan_only"];
@@ -4915,7 +4929,21 @@ exports.definitions = [
4915
4929
  },
4916
4930
  },
4917
4931
  ],
4918
- [4, "preset", tuya.valueConverterBasic.lookup({ manual: true, auto: false })],
4932
+ [
4933
+ 4,
4934
+ "preset",
4935
+ {
4936
+ to: async (v, meta) => {
4937
+ const ep = meta.device.endpoints[0];
4938
+ await tuya.sendDataPointBool(ep, 4, v === "manual");
4939
+ },
4940
+ from: (v, meta) => {
4941
+ const preset = v ? "manual" : "auto";
4942
+ meta.state.preset = preset;
4943
+ return preset;
4944
+ },
4945
+ },
4946
+ ],
4919
4947
  [16, "current_heating_setpoint", tuya.valueConverter.raw],
4920
4948
  [19, "max_temperature", tuya.valueConverter.raw],
4921
4949
  [24, "local_temperature", tuya.valueConverter.divideBy10],
@@ -4936,46 +4964,39 @@ exports.definitions = [
4936
4964
  101,
4937
4965
  "schedule",
4938
4966
  {
4939
- to: (v, meta) => {
4940
- const periods = (value) => {
4941
- const regex = /((?<h>[01][0-9]|2[0-3]):(?<m>[0-5][0-9])\/(?<t>[0-3][0-9](\.[0,5]|)))/gm;
4942
- const matches = [...value.matchAll(regex)];
4943
- if (matches.length === 4) {
4944
- return matches.reduce((arr, m) => {
4945
- arr.push(Number.parseInt(m.groups.h, 10));
4946
- arr.push(Number.parseInt(m.groups.m, 10));
4947
- arr.push(Number.parseFloat(m.groups.t) * 2);
4948
- return arr;
4949
- }, []);
4950
- }
4951
- logger_1.logger.warning("Ignoring invalid or incomplete schedule", NS);
4952
- };
4953
- const schedule = [...periods(v.weekdays), ...periods(v.saturday), ...periods(v.sunday)];
4954
- return schedule;
4955
- },
4956
4967
  from: (v, meta) => {
4957
- const format = (data) => {
4958
- return data.reduce((a, v, i) => {
4959
- switch (i % 3) {
4960
- // Hour
4961
- case 0:
4962
- return `${a}${i > 0 ? " " : ""}${v.toString().padStart(2, "0")}`;
4963
- // Minute
4964
- case 1:
4965
- return `${a}:${v.toString().padStart(2, "0")}`;
4966
- // Setpoint
4967
- case 2:
4968
- return `${a}/${v / 2}`;
4969
- default:
4970
- throw new Error(`Unexpected index ${i} in schedule data`);
4971
- }
4972
- }, "");
4973
- };
4974
- return {
4975
- weekdays: format(v.slice(0, 12)),
4976
- saturday: format(v.slice(1 * 12, 2 * 12)),
4977
- sunday: format(v.slice(2 * 12, 3 * 12)),
4978
- };
4968
+ const format = (data) => data.reduce((txt, val, i) => {
4969
+ if (i % 3 === 0)
4970
+ return `${txt}${i > 0 ? " " : ""}${val.toString().padStart(2, "0")}`;
4971
+ if (i % 3 === 1)
4972
+ return `${txt}:${val.toString().padStart(2, "0")}`;
4973
+ return `${txt}/${val / 2}`;
4974
+ }, "");
4975
+ const weekdays = format(v.slice(0, 12));
4976
+ const saturday = format(v.slice(12, 24));
4977
+ const sunday = format(v.slice(24, 36));
4978
+ const full = `${weekdays} ${saturday} ${sunday}`.trim();
4979
+ meta.state.schedule_text = full;
4980
+ return full;
4981
+ },
4982
+ },
4983
+ ],
4984
+ [
4985
+ 202,
4986
+ "schedule_text",
4987
+ {
4988
+ to: async (v, meta) => {
4989
+ const regex = /((?<h>[01][0-9]|2[0-3]):(?<m>[0-5][0-9])\/(?<t>[0-3]?[0-9](\.[0,5])?))/gm;
4990
+ const matches = [...v.matchAll(regex)];
4991
+ if (matches.length !== 12)
4992
+ return;
4993
+ const result = [];
4994
+ for (const m of matches) {
4995
+ result.push(Number(m.groups?.h));
4996
+ result.push(Number(m.groups?.m));
4997
+ result.push(Number(m.groups?.t) * 2);
4998
+ }
4999
+ await tuya.sendDataPointRaw(meta.device.endpoints[0], 101, Buffer.from(result));
4979
5000
  },
4980
5001
  },
4981
5002
  ],
@@ -5372,17 +5393,17 @@ exports.definitions = [
5372
5393
  vendor: "Tuya",
5373
5394
  description: "3-Gang switch with backlight",
5374
5395
  extend: [
5396
+ tuya.modernExtend.tuyaMagicPacket(),
5397
+ m.deviceEndpoints({ endpoints: { l1: 1, l2: 2, l3: 3 } }),
5375
5398
  tuya.modernExtend.tuyaOnOff({
5376
- powerOnBehavior2: true,
5377
- indicatorMode: true,
5399
+ powerOnBehavior2: (m) => m !== "_TZ3000_nwidmc4n",
5400
+ indicatorMode: (m) => m !== "_TZ3000_nwidmc4n",
5378
5401
  backlightModeOffOn: true,
5379
5402
  endpoints: ["l1", "l2", "l3"],
5403
+ powerOutageMemory: (m) => m === "_TZ3000_nwidmc4n",
5404
+ switchType: (m) => m === "_TZ3000_nwidmc4n",
5380
5405
  }),
5381
5406
  ],
5382
- endpoint: (device) => {
5383
- return { l1: 1, l2: 2, l3: 3 };
5384
- },
5385
- meta: { multiEndpoint: true },
5386
5407
  configure: async (device, coordinatorEndpoint) => {
5387
5408
  await tuya.configureMagicPacket(device, coordinatorEndpoint);
5388
5409
  await reporting.bind(device.getEndpoint(1), coordinatorEndpoint, ["genOnOff"]);
@@ -5394,6 +5415,7 @@ exports.definitions = [
5394
5415
  tuya.whitelabel("Zemismart", "ZM-L03E-Z", "3 gang switch with neutral", ["_TZ3000_empogkya", "_TZ3000_lsunm46z"]),
5395
5416
  tuya.whitelabel("Zemismart", "KES-606US-L3", "3 gang switch with neutral", ["_TZ3000_uilitwsy"]),
5396
5417
  tuya.whitelabel("AVATTO", "ZWOT16-W2", "2 gang switch and 1 socket", ["_TZ3000_66fekqhh"]),
5418
+ tuya.whitelabel("AVATTO", "ZBTS60-03", "3 gang switch module with backlight", ["_TZ3000_nwidmc4n"]),
5397
5419
  tuya.whitelabel("Tuya", "M10Z", "2 gang switch with 20A power socket", ["_TZ3000_lubfc1t5"]),
5398
5420
  tuya.whitelabel("Zemismart", "ZMO-606-S2", "Smart 2 gangs switch with outlet", ["_TZ3000_aknpkt02"]),
5399
5421
  ],
@@ -5588,8 +5610,18 @@ exports.definitions = [
5588
5610
  { vendor: "OXT", model: "SWTZ21" },
5589
5611
  { vendor: "Moes", model: "ZM-104-M" },
5590
5612
  tuya.whitelabel("AVATTO", "ZWSM16-1-Zigbee", "1 gang switch module", ["_TZ3000_4rbqgcuv"]),
5613
+ tuya.whitelabel("AVATTO", "ZBTS60-01", "1 gang switch module with backlight", ["_TZ3000_xfxpoxe0"]),
5614
+ ],
5615
+ extend: [
5616
+ tuya.modernExtend.tuyaMagicPacket(),
5617
+ tuya.modernExtend.tuyaOnOff({
5618
+ switchType: true,
5619
+ onOffCountdown: (m) => m !== "_TZ3000_xfxpoxe0",
5620
+ indicatorMode: (m) => m !== "_TZ3000_xfxpoxe0",
5621
+ powerOutageMemory: (m) => m === "_TZ3000_xfxpoxe0",
5622
+ backlightModeOffOn: (m) => m === "_TZ3000_xfxpoxe0",
5623
+ }),
5591
5624
  ],
5592
- extend: [tuya.modernExtend.tuyaOnOff({ switchType: true, onOffCountdown: true, indicatorMode: true })],
5593
5625
  configure: async (device, coordinatorEndpoint) => {
5594
5626
  await tuya.configureMagicPacket(device, coordinatorEndpoint);
5595
5627
  await reporting.bind(device.getEndpoint(1), coordinatorEndpoint, ["genOnOff"]);
@@ -6506,6 +6538,7 @@ exports.definitions = [
6506
6538
  "_TZE204_ejh6owwz",
6507
6539
  "_TZE200_ba69l9ol",
6508
6540
  "_TZE200_68nvbi09",
6541
+ "_TZE200_vexa5o82",
6509
6542
  ]),
6510
6543
  model: "TS0601_cover_3",
6511
6544
  vendor: "Tuya",
@@ -6525,6 +6558,7 @@ exports.definitions = [
6525
6558
  tuya.whitelabel("Zemismart", "ZM25EL", "Cover motor", ["_TZE200_pw7mji0l"]),
6526
6559
  tuya.whitelabel("Zemismart", "ZM85EL-2Z", "Roman Rod I type U curtains track", ["_TZE200_cf1sl3tj", "_TZE200_nw1r9hp6"]),
6527
6560
  tuya.whitelabel("Hiladuo", "B09M3R35GC", "Motorized roller shade", ["_TZE200_9p5xmj5r"]),
6561
+ tuya.whitelabel("Tuya", "MYQ-RM25-1.3/25-BZ", "Tubular roller blind motor", ["_TZE200_vexa5o82"]),
6528
6562
  ],
6529
6563
  meta: {
6530
6564
  // All datapoints go in here
@@ -9171,22 +9205,22 @@ exports.definitions = [
9171
9205
  vendor: "Tuya",
9172
9206
  description: "Smart light switch - 4 gang with neutral wire",
9173
9207
  extend: [
9208
+ m.deviceEndpoints({ endpoints: { l1: 1, l2: 2, l3: 3, l4: 4 } }),
9174
9209
  tuya.modernExtend.tuyaOnOff({
9175
- powerOnBehavior2: true,
9210
+ powerOnBehavior2: (m) => m !== "_TZ3000_r9e2w7dn",
9176
9211
  backlightModeOffOn: true,
9177
9212
  endpoints: ["l1", "l2", "l3", "l4"],
9213
+ powerOutageMemory: (m) => m === "_TZ3000_r9e2w7dn",
9214
+ switchType: (m) => m === "_TZ3000_r9e2w7dn",
9178
9215
  }),
9179
9216
  ],
9180
- endpoint: (device) => {
9181
- return { l1: 1, l2: 2, l3: 3, l4: 4 };
9182
- },
9183
9217
  whiteLabel: [
9184
9218
  tuya.whitelabel("Tuya", "DS-111", "Smart light switch - 4 gang with neutral wire", ["_TZ3000_mdj7kra9"]),
9185
9219
  tuya.whitelabel("MHCOZY", "TYWB 4ch-RF", "4 channel relay", ["_TZ3000_u3oupgdy", "_TZ3000_imaccztn"]),
9186
9220
  tuya.whitelabel("AVATTO", "TS0004_1", "Smart light switch - 4 gang with neutral wire", ["_TZ3000_nivavasg", "_TZ3000_gexniqbq"]),
9187
9221
  tuya.whitelabel("Nova Digital", "SA-4", "Safira smart light switch - 4 gang", ["_TZ3000_iymfxdis"]),
9222
+ tuya.whitelabel("AVATTO", "ZBTS60-04", "4 gang switch module with backlight", ["_TZ3000_r9e2w7dn"]),
9188
9223
  ],
9189
- meta: { multiEndpoint: true },
9190
9224
  configure: async (device, coordinatorEndpoint) => {
9191
9225
  await tuya.configureMagicPacket(device, coordinatorEndpoint);
9192
9226
  await reporting.bind(device.getEndpoint(1), coordinatorEndpoint, ["genOnOff"]);
@@ -9343,7 +9377,7 @@ exports.definitions = [
9343
9377
  },
9344
9378
  },
9345
9379
  {
9346
- fingerprint: tuya.fingerprint("TS0726", ["_TZ3002_iedhxgyi"]),
9380
+ fingerprint: tuya.fingerprint("TS0726", ["_TZ3002_iedhxgyi", "_TZ3000_lcjsewlo"]),
9347
9381
  model: "TS0726_3_gang",
9348
9382
  vendor: "Tuya",
9349
9383
  description: "3 gang switch with neutral wire",
@@ -11381,6 +11415,7 @@ exports.definitions = [
11381
11415
  "_TZ3290_uc8lwbi2",
11382
11416
  "_TZ3290_nba3knpsarkawgnt",
11383
11417
  "_TZ3290_8xzb2ghn",
11418
+ "_TZ3290_s6ezpa3j",
11384
11419
  ]),
11385
11420
  model: "ZS06",
11386
11421
  vendor: "Tuya",
@@ -11404,6 +11439,7 @@ exports.definitions = [
11404
11439
  ]),
11405
11440
  tuya.whitelabel("Zemismart", "ZM-18-USB", "Universal smart IR remote control", ["_TZ3290_uc8lwbi2"]),
11406
11441
  tuya.whitelabel("Zemismart", "ZXMIR-02", "Universal smart IR remote control", ["_TZ3290_8xzb2ghn"]),
11442
+ tuya.whitelabel("Ekaza", "EKAT-T304Z", "Universal smart IR remote control", ["_TZ3290_s6ezpa3j"]),
11407
11443
  ],
11408
11444
  },
11409
11445
  {
@@ -19279,7 +19315,7 @@ exports.definitions = [
19279
19315
  },
19280
19316
  },
19281
19317
  {
19282
- fingerprint: tuya.fingerprint("TS0726", ["_TZ3000_ezqbvrqz", "_TZ3002_ymv5vytn", "_TZ3002_6ahhkwyh", "_TZ3002_zjuvw9zf"]),
19318
+ fingerprint: tuya.fingerprint("TS0726", ["_TZ3000_ezqbvrqz", "_TZ3002_ymv5vytn", "_TZ3002_6ahhkwyh", "_TZ3002_zjuvw9zf", "_TZ3002_a4kvf6zd"]),
19283
19319
  model: "TS0726_2_gang_scene_switch",
19284
19320
  vendor: "Tuya",
19285
19321
  description: "2 gang switch with scene and backlight",
@@ -19308,7 +19344,7 @@ exports.definitions = [
19308
19344
  },
19309
19345
  },
19310
19346
  {
19311
- fingerprint: tuya.fingerprint("TS0726", ["_TZ3000_noru9tix", "_TZ3002_rbnycsav", "_TZ3002_kq3kqwjt"]),
19347
+ fingerprint: tuya.fingerprint("TS0726", ["_TZ3000_noru9tix", "_TZ3002_rbnycsav", "_TZ3002_kq3kqwjt", "_TZ3002_ybtqbyk3"]),
19312
19348
  model: "TS0726_3_gang_scene_switch",
19313
19349
  vendor: "Tuya",
19314
19350
  description: "3 gang switch with scene and backlight",
@@ -19336,7 +19372,7 @@ exports.definitions = [
19336
19372
  },
19337
19373
  },
19338
19374
  {
19339
- fingerprint: tuya.fingerprint("TS0726", ["_TZ3000_rsylfthg", "_TZ3002_umdkr64x"]),
19375
+ fingerprint: tuya.fingerprint("TS0726", ["_TZ3000_rsylfthg", "_TZ3002_umdkr64x", "_TZ3002_hkaktryd"]),
19340
19376
  model: "TS0726_4_gang_scene_switch",
19341
19377
  vendor: "Tuya",
19342
19378
  description: "4 gang switch with scene and backlight",
@@ -20652,6 +20688,35 @@ exports.definitions = [
20652
20688
  ],
20653
20689
  },
20654
20690
  },
20691
+ {
20692
+ fingerprint: tuya.fingerprint("TS0601", ["_TZE200_mlglxwp3"]),
20693
+ model: "TS0601_cover_12",
20694
+ vendor: "Tuya",
20695
+ description: "Curtain motor",
20696
+ extend: [tuya.modernExtend.tuyaBase({ dp: true })],
20697
+ exposes: [
20698
+ e.cover_position().setAccess("position", ea.STATE_SET),
20699
+ e.enum("motor_direction", ea.STATE_SET, ["forward", "back"]).withDescription("Motor direction"),
20700
+ e.enum("work_state", ea.STATE, ["opening", "closing"]).withDescription("Current work state"),
20701
+ e.numeric("total_time", ea.STATE).withUnit("ms").withDescription("Total running time in milliseconds"),
20702
+ e.enum("situation_set", ea.STATE_SET, ["fully_close", "fully_open"]).withDescription("Set fully open or fully close position"),
20703
+ e.text("fault", ea.STATE).withDescription("Fault details"),
20704
+ e.battery(),
20705
+ ],
20706
+ meta: {
20707
+ tuyaDatapoints: [
20708
+ [1, "state", tuya.valueConverterBasic.lookup({ OPEN: tuya.enum(0), STOP: tuya.enum(1), CLOSE: tuya.enum(2) })],
20709
+ [2, "position", tuya.valueConverter.coverPosition],
20710
+ [3, "position", tuya.valueConverter.coverPosition],
20711
+ [5, "motor_direction", tuya.valueConverterBasic.lookup({ forward: tuya.enum(0), back: tuya.enum(1) })],
20712
+ [7, "work_state", tuya.valueConverterBasic.lookup({ opening: tuya.enum(0), closing: tuya.enum(1) })],
20713
+ [10, "total_time", tuya.valueConverter.raw],
20714
+ [11, "situation_set", tuya.valueConverterBasic.lookup({ fully_close: tuya.enum(0), fully_open: tuya.enum(1) })],
20715
+ [12, "fault", tuya.valueConverter.raw],
20716
+ [103, "battery", tuya.valueConverter.raw],
20717
+ ],
20718
+ },
20719
+ },
20655
20720
  {
20656
20721
  zigbeeModel: ["ZS-304Z"],
20657
20722
  fingerprint: tuya.fingerprint("TS0601", ["_TZE284_k7p2q5d9", "_TZE284_65gzcss7", "_TZE284_0ints6wl", "_TZE284_yzr43ayq"]),
@@ -21942,5 +22007,65 @@ exports.definitions = [
21942
22007
  ],
21943
22008
  },
21944
22009
  },
22010
+ {
22011
+ fingerprint: [{ modelID: "Arteco", manufacturerName: "A89G12C" }],
22012
+ model: "ZS-SF00",
22013
+ vendor: "Arteco",
22014
+ description: "Soil fertility sensor",
22015
+ extend: [tuya.modernExtend.tuyaBase({ dp: true })],
22016
+ exposes: [
22017
+ e.enum("water_warning", ea.STATE, ["none", "alarm"]).withDescription("Water shortage warning"),
22018
+ e.enum("soil_fertility_warning", ea.STATE, ["none", "alarm"]).withDescription("Soil fertility warning"),
22019
+ e.battery(),
22020
+ e.soil_moisture(),
22021
+ e
22022
+ .numeric("soil_fertility", ea.STATE)
22023
+ .withUnit("μS/cm")
22024
+ .withValueMin(0)
22025
+ .withValueMax(5000)
22026
+ .withDescription("Soil fertility value,between 0-5000"),
22027
+ e.temperature(),
22028
+ e.humidity(),
22029
+ e.illuminance(),
22030
+ tuya.exposes.soilSampling(),
22031
+ tuya.exposes.soilCalibration(),
22032
+ tuya.exposes.humidityCalibration(),
22033
+ e
22034
+ .numeric("illuminance_calibration", ea.STATE_SET)
22035
+ .withValueMin(-15)
22036
+ .withValueMax(1000)
22037
+ .withValueStep(1)
22038
+ .withUnit("lux")
22039
+ .withDescription("Illuminance calibration"),
22040
+ tuya.exposes.temperatureCalibration(),
22041
+ tuya.exposes.soilWarning(),
22042
+ e
22043
+ .numeric("soil_fertility_warning_setting", ea.STATE_SET)
22044
+ .withValueMin(100)
22045
+ .withValueMax(1800)
22046
+ .withValueStep(1)
22047
+ .withUnit("μS/cm")
22048
+ .withDescription("When the soil fertility value is lower than what threshold should a warning be issued"),
22049
+ ],
22050
+ meta: {
22051
+ tuyaDatapoints: [
22052
+ [3, "soil_moisture", tuya.valueConverter.raw],
22053
+ [5, "temperature", tuya.valueConverter.divideBy10],
22054
+ [14, "battery", tuya.valueConverter.raw],
22055
+ [101, "humidity", tuya.valueConverter.raw],
22056
+ [102, "illuminance", tuya.valueConverter.raw],
22057
+ [103, "soil_sampling", tuya.valueConverter.raw],
22058
+ [104, "soil_calibration", tuya.valueConverter.raw],
22059
+ [105, "humidity_calibration", tuya.valueConverter.raw],
22060
+ [106, "illuminance_calibration", tuya.valueConverter.raw],
22061
+ [107, "temperature_calibration", tuya.valueConverter.divideBy10],
22062
+ [110, "soil_warning", tuya.valueConverter.raw],
22063
+ [111, "water_warning", tuya.valueConverterBasic.lookup({ none: tuya.enum(0), alarm: tuya.enum(1) })],
22064
+ [112, "soil_fertility", tuya.valueConverter.raw],
22065
+ [114, "soil_fertility_warning_setting", tuya.valueConverter.raw],
22066
+ [115, "soil_fertility_warning", tuya.valueConverterBasic.lookup({ none: tuya.enum(0), alarm: tuya.enum(1) })],
22067
+ ],
22068
+ },
22069
+ },
21945
22070
  ];
21946
22071
  //# sourceMappingURL=tuya.js.map