zigbee-herdsman-converters 25.89.0 → 25.90.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 (40) hide show
  1. package/CHANGELOG.md +27 -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/index.d.ts.map +1 -1
  12. package/dist/devices/index.js +2 -0
  13. package/dist/devices/index.js.map +1 -1
  14. package/dist/devices/innr.d.ts.map +1 -1
  15. package/dist/devices/innr.js +7 -0
  16. package/dist/devices/innr.js.map +1 -1
  17. package/dist/devices/lumi.d.ts.map +1 -1
  18. package/dist/devices/lumi.js +9 -1
  19. package/dist/devices/lumi.js.map +1 -1
  20. package/dist/devices/philips.d.ts.map +1 -1
  21. package/dist/devices/philips.js +63 -30
  22. package/dist/devices/philips.js.map +1 -1
  23. package/dist/devices/schneider_electric.d.ts.map +1 -1
  24. package/dist/devices/schneider_electric.js +5 -1
  25. package/dist/devices/schneider_electric.js.map +1 -1
  26. package/dist/devices/sinope.d.ts.map +1 -1
  27. package/dist/devices/sinope.js +3 -2
  28. package/dist/devices/sinope.js.map +1 -1
  29. package/dist/devices/third_reality.d.ts.map +1 -1
  30. package/dist/devices/third_reality.js +111 -5
  31. package/dist/devices/third_reality.js.map +1 -1
  32. package/dist/devices/tuya.d.ts.map +1 -1
  33. package/dist/devices/tuya.js +170 -112
  34. package/dist/devices/tuya.js.map +1 -1
  35. package/dist/lib/tuya.d.ts +4 -4
  36. package/dist/lib/tuya.d.ts.map +1 -1
  37. package/dist/lib/tuya.js +28 -15
  38. package/dist/lib/tuya.js.map +1 -1
  39. package/dist/models-index.json +1 -1
  40. package/package.json +2 -2
@@ -3006,6 +3006,7 @@ exports.definitions = [
3006
3006
  "_TZ3000_wmlc9p9z",
3007
3007
  "_TZ3000_shopg9ss",
3008
3008
  "_TZ3000_n0lphcok",
3009
+ "_TZ3000_hgm6k8ku",
3009
3010
  "_TZ3000_r80pzsb9",
3010
3011
  ]),
3011
3012
  ...tuya.fingerprint("TS0001", ["_TZ3000_n0lphcok", "_TZ3000_wn65ixz9"]),
@@ -4816,56 +4817,34 @@ exports.definitions = [
4816
4817
  },
4817
4818
  {
4818
4819
  fingerprint: tuya.fingerprint("TS0601", ["_TZE200_dzuqwsyg", "_TZE204_dzuqwsyg"]),
4819
- model: "BAC-003",
4820
+ model: "BAC-002",
4820
4821
  vendor: "Tuya",
4821
4822
  description: "FCU thermostat temperature controller",
4822
4823
  extend: [tuya.modernExtend.tuyaBase({ dp: true, forceTimeUpdates: true, timeStart: "1970" })],
4823
4824
  options: [
4825
+ e.enum("control_sequence_of_operation", ea.SET, ["cooling_only", "cooling_and_heating_4-pipes"]),
4826
+ e.binary("expose_device_state", ea.SET, true, false),
4827
+ ],
4828
+ exposes: [
4824
4829
  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."),
4830
+ .climate()
4831
+ .withLocalTemperature(ea.STATE)
4832
+ .withSystemMode(["off", "cool", "heat", "fan_only"], ea.STATE_SET)
4833
+ .withFanMode(["low", "medium", "high", "auto"], ea.STATE_SET)
4834
+ .withSetpoint("current_heating_setpoint", 5, 35, 1, ea.STATE_SET)
4835
+ .withPreset(["auto", "manual"])
4836
+ .withLocalTemperatureCalibration(-9, 9, 1, ea.STATE_SET),
4837
+ e.child_lock(),
4838
+ e.max_temperature().withValueMin(35).withValueMax(45),
4839
+ e.numeric("deadzone_temperature", ea.STATE_SET).withUnit("°C").withValueMax(5).withValueMin(1),
4840
+ e.text("schedule_text", ea.STATE_SET).withDescription(`Weekly schedule in the format "HH:MM/TT HH:MM/TT ...".
4841
+ Example for 12 segments:
4842
+ "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".
4843
+ Each segment contains:
4844
+ - HH:MM: Time in 24-hour format.
4845
+ - TT: Temperature in °C.
4846
+ Ensure all 12 segments are defined and separated by spaces.`),
4828
4847
  ],
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
4848
  meta: {
4870
4849
  publishDuplicateTransaction: true,
4871
4850
  tuyaDatapoints: [
@@ -4880,9 +4859,8 @@ exports.definitions = [
4880
4859
  },
4881
4860
  from: (v, meta, options) => {
4882
4861
  meta.state.system_mode = v === true ? (meta.state.system_mode_device ?? "cool") : "off";
4883
- if (options?.expose_device_state === true) {
4862
+ if (options?.expose_device_state === true)
4884
4863
  return v === true ? "ON" : "OFF";
4885
- }
4886
4864
  delete meta.state.state;
4887
4865
  },
4888
4866
  },
@@ -4891,22 +4869,22 @@ exports.definitions = [
4891
4869
  2,
4892
4870
  "system_mode",
4893
4871
  {
4894
- // Extend system_mode to support 'off' in addition to 'cool', 'heat' and 'fan_only'
4895
4872
  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;
4873
+ const ep = meta.device.endpoints[0];
4874
+ if (v === "off") {
4875
+ await tuya.sendDataPointBool(ep, 1, true, "dataRequest", 1);
4876
+ await new Promise((r) => setTimeout(r, 120));
4877
+ await tuya.sendDataPointBool(ep, 1, false, "dataRequest", 1);
4878
+ await tuya.sendDataPointEnum(ep, 2, 0, "dataRequest", 1);
4879
+ return;
4909
4880
  }
4881
+ await tuya.sendDataPointBool(ep, 1, true, "dataRequest", 1);
4882
+ if (v === "cool")
4883
+ await tuya.sendDataPointEnum(ep, 2, 0, "dataRequest", 1);
4884
+ if (v === "heat")
4885
+ await tuya.sendDataPointEnum(ep, 2, 1, "dataRequest", 1);
4886
+ if (v === "fan_only")
4887
+ await tuya.sendDataPointEnum(ep, 2, 2, "dataRequest", 1);
4910
4888
  },
4911
4889
  from: (v, meta) => {
4912
4890
  const modes = ["cool", "heat", "fan_only"];
@@ -4915,7 +4893,21 @@ exports.definitions = [
4915
4893
  },
4916
4894
  },
4917
4895
  ],
4918
- [4, "preset", tuya.valueConverterBasic.lookup({ manual: true, auto: false })],
4896
+ [
4897
+ 4,
4898
+ "preset",
4899
+ {
4900
+ to: async (v, meta) => {
4901
+ const ep = meta.device.endpoints[0];
4902
+ await tuya.sendDataPointBool(ep, 4, v === "manual");
4903
+ },
4904
+ from: (v, meta) => {
4905
+ const preset = v ? "manual" : "auto";
4906
+ meta.state.preset = preset;
4907
+ return preset;
4908
+ },
4909
+ },
4910
+ ],
4919
4911
  [16, "current_heating_setpoint", tuya.valueConverter.raw],
4920
4912
  [19, "max_temperature", tuya.valueConverter.raw],
4921
4913
  [24, "local_temperature", tuya.valueConverter.divideBy10],
@@ -4936,46 +4928,39 @@ exports.definitions = [
4936
4928
  101,
4937
4929
  "schedule",
4938
4930
  {
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
4931
  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
- };
4932
+ const format = (data) => data.reduce((txt, val, i) => {
4933
+ if (i % 3 === 0)
4934
+ return `${txt}${i > 0 ? " " : ""}${val.toString().padStart(2, "0")}`;
4935
+ if (i % 3 === 1)
4936
+ return `${txt}:${val.toString().padStart(2, "0")}`;
4937
+ return `${txt}/${val / 2}`;
4938
+ }, "");
4939
+ const weekdays = format(v.slice(0, 12));
4940
+ const saturday = format(v.slice(12, 24));
4941
+ const sunday = format(v.slice(24, 36));
4942
+ const full = `${weekdays} ${saturday} ${sunday}`.trim();
4943
+ meta.state.schedule_text = full;
4944
+ return full;
4945
+ },
4946
+ },
4947
+ ],
4948
+ [
4949
+ 202,
4950
+ "schedule_text",
4951
+ {
4952
+ to: async (v, meta) => {
4953
+ const regex = /((?<h>[01][0-9]|2[0-3]):(?<m>[0-5][0-9])\/(?<t>[0-3]?[0-9](\.[0,5])?))/gm;
4954
+ const matches = [...v.matchAll(regex)];
4955
+ if (matches.length !== 12)
4956
+ return;
4957
+ const result = [];
4958
+ for (const m of matches) {
4959
+ result.push(Number(m.groups?.h));
4960
+ result.push(Number(m.groups?.m));
4961
+ result.push(Number(m.groups?.t) * 2);
4962
+ }
4963
+ await tuya.sendDataPointRaw(meta.device.endpoints[0], 101, Buffer.from(result));
4979
4964
  },
4980
4965
  },
4981
4966
  ],
@@ -5372,17 +5357,17 @@ exports.definitions = [
5372
5357
  vendor: "Tuya",
5373
5358
  description: "3-Gang switch with backlight",
5374
5359
  extend: [
5360
+ tuya.modernExtend.tuyaMagicPacket(),
5361
+ m.deviceEndpoints({ endpoints: { l1: 1, l2: 2, l3: 3 } }),
5375
5362
  tuya.modernExtend.tuyaOnOff({
5376
- powerOnBehavior2: true,
5377
- indicatorMode: true,
5363
+ powerOnBehavior2: (m) => m !== "_TZ3000_nwidmc4n",
5364
+ indicatorMode: (m) => m !== "_TZ3000_nwidmc4n",
5378
5365
  backlightModeOffOn: true,
5379
5366
  endpoints: ["l1", "l2", "l3"],
5367
+ powerOutageMemory: (m) => m === "_TZ3000_nwidmc4n",
5368
+ switchType: (m) => m === "_TZ3000_nwidmc4n",
5380
5369
  }),
5381
5370
  ],
5382
- endpoint: (device) => {
5383
- return { l1: 1, l2: 2, l3: 3 };
5384
- },
5385
- meta: { multiEndpoint: true },
5386
5371
  configure: async (device, coordinatorEndpoint) => {
5387
5372
  await tuya.configureMagicPacket(device, coordinatorEndpoint);
5388
5373
  await reporting.bind(device.getEndpoint(1), coordinatorEndpoint, ["genOnOff"]);
@@ -5394,6 +5379,7 @@ exports.definitions = [
5394
5379
  tuya.whitelabel("Zemismart", "ZM-L03E-Z", "3 gang switch with neutral", ["_TZ3000_empogkya", "_TZ3000_lsunm46z"]),
5395
5380
  tuya.whitelabel("Zemismart", "KES-606US-L3", "3 gang switch with neutral", ["_TZ3000_uilitwsy"]),
5396
5381
  tuya.whitelabel("AVATTO", "ZWOT16-W2", "2 gang switch and 1 socket", ["_TZ3000_66fekqhh"]),
5382
+ tuya.whitelabel("AVATTO", "ZBTS60-03", "3 gang switch module with backlight", ["_TZ3000_nwidmc4n"]),
5397
5383
  tuya.whitelabel("Tuya", "M10Z", "2 gang switch with 20A power socket", ["_TZ3000_lubfc1t5"]),
5398
5384
  tuya.whitelabel("Zemismart", "ZMO-606-S2", "Smart 2 gangs switch with outlet", ["_TZ3000_aknpkt02"]),
5399
5385
  ],
@@ -5588,8 +5574,18 @@ exports.definitions = [
5588
5574
  { vendor: "OXT", model: "SWTZ21" },
5589
5575
  { vendor: "Moes", model: "ZM-104-M" },
5590
5576
  tuya.whitelabel("AVATTO", "ZWSM16-1-Zigbee", "1 gang switch module", ["_TZ3000_4rbqgcuv"]),
5577
+ tuya.whitelabel("AVATTO", "ZBTS60-01", "1 gang switch module with backlight", ["_TZ3000_xfxpoxe0"]),
5578
+ ],
5579
+ extend: [
5580
+ tuya.modernExtend.tuyaMagicPacket(),
5581
+ tuya.modernExtend.tuyaOnOff({
5582
+ switchType: true,
5583
+ onOffCountdown: (m) => m !== "_TZ3000_xfxpoxe0",
5584
+ indicatorMode: (m) => m !== "_TZ3000_xfxpoxe0",
5585
+ powerOutageMemory: (m) => m === "_TZ3000_xfxpoxe0",
5586
+ backlightModeOffOn: (m) => m === "_TZ3000_xfxpoxe0",
5587
+ }),
5591
5588
  ],
5592
- extend: [tuya.modernExtend.tuyaOnOff({ switchType: true, onOffCountdown: true, indicatorMode: true })],
5593
5589
  configure: async (device, coordinatorEndpoint) => {
5594
5590
  await tuya.configureMagicPacket(device, coordinatorEndpoint);
5595
5591
  await reporting.bind(device.getEndpoint(1), coordinatorEndpoint, ["genOnOff"]);
@@ -6506,6 +6502,7 @@ exports.definitions = [
6506
6502
  "_TZE204_ejh6owwz",
6507
6503
  "_TZE200_ba69l9ol",
6508
6504
  "_TZE200_68nvbi09",
6505
+ "_TZE200_vexa5o82",
6509
6506
  ]),
6510
6507
  model: "TS0601_cover_3",
6511
6508
  vendor: "Tuya",
@@ -6525,6 +6522,7 @@ exports.definitions = [
6525
6522
  tuya.whitelabel("Zemismart", "ZM25EL", "Cover motor", ["_TZE200_pw7mji0l"]),
6526
6523
  tuya.whitelabel("Zemismart", "ZM85EL-2Z", "Roman Rod I type U curtains track", ["_TZE200_cf1sl3tj", "_TZE200_nw1r9hp6"]),
6527
6524
  tuya.whitelabel("Hiladuo", "B09M3R35GC", "Motorized roller shade", ["_TZE200_9p5xmj5r"]),
6525
+ tuya.whitelabel("Tuya", "MYQ-RM25-1.3/25-BZ", "Tubular roller blind motor", ["_TZE200_vexa5o82"]),
6528
6526
  ],
6529
6527
  meta: {
6530
6528
  // All datapoints go in here
@@ -9171,22 +9169,22 @@ exports.definitions = [
9171
9169
  vendor: "Tuya",
9172
9170
  description: "Smart light switch - 4 gang with neutral wire",
9173
9171
  extend: [
9172
+ m.deviceEndpoints({ endpoints: { l1: 1, l2: 2, l3: 3, l4: 4 } }),
9174
9173
  tuya.modernExtend.tuyaOnOff({
9175
- powerOnBehavior2: true,
9174
+ powerOnBehavior2: (m) => m !== "_TZ3000_r9e2w7dn",
9176
9175
  backlightModeOffOn: true,
9177
9176
  endpoints: ["l1", "l2", "l3", "l4"],
9177
+ powerOutageMemory: (m) => m === "_TZ3000_r9e2w7dn",
9178
+ switchType: (m) => m === "_TZ3000_r9e2w7dn",
9178
9179
  }),
9179
9180
  ],
9180
- endpoint: (device) => {
9181
- return { l1: 1, l2: 2, l3: 3, l4: 4 };
9182
- },
9183
9181
  whiteLabel: [
9184
9182
  tuya.whitelabel("Tuya", "DS-111", "Smart light switch - 4 gang with neutral wire", ["_TZ3000_mdj7kra9"]),
9185
9183
  tuya.whitelabel("MHCOZY", "TYWB 4ch-RF", "4 channel relay", ["_TZ3000_u3oupgdy", "_TZ3000_imaccztn"]),
9186
9184
  tuya.whitelabel("AVATTO", "TS0004_1", "Smart light switch - 4 gang with neutral wire", ["_TZ3000_nivavasg", "_TZ3000_gexniqbq"]),
9187
9185
  tuya.whitelabel("Nova Digital", "SA-4", "Safira smart light switch - 4 gang", ["_TZ3000_iymfxdis"]),
9186
+ tuya.whitelabel("AVATTO", "ZBTS60-04", "4 gang switch module with backlight", ["_TZ3000_r9e2w7dn"]),
9188
9187
  ],
9189
- meta: { multiEndpoint: true },
9190
9188
  configure: async (device, coordinatorEndpoint) => {
9191
9189
  await tuya.configureMagicPacket(device, coordinatorEndpoint);
9192
9190
  await reporting.bind(device.getEndpoint(1), coordinatorEndpoint, ["genOnOff"]);
@@ -21942,5 +21940,65 @@ exports.definitions = [
21942
21940
  ],
21943
21941
  },
21944
21942
  },
21943
+ {
21944
+ fingerprint: [{ modelID: "Arteco", manufacturerName: "A89G12C" }],
21945
+ model: "ZS-SF00",
21946
+ vendor: "Arteco",
21947
+ description: "Soil fertility sensor",
21948
+ extend: [tuya.modernExtend.tuyaBase({ dp: true })],
21949
+ exposes: [
21950
+ e.enum("water_warning", ea.STATE, ["none", "alarm"]).withDescription("Water shortage warning"),
21951
+ e.enum("soil_fertility_warning", ea.STATE, ["none", "alarm"]).withDescription("Soil fertility warning"),
21952
+ e.battery(),
21953
+ e.soil_moisture(),
21954
+ e
21955
+ .numeric("soil_fertility", ea.STATE)
21956
+ .withUnit("μS/cm")
21957
+ .withValueMin(0)
21958
+ .withValueMax(5000)
21959
+ .withDescription("Soil fertility value,between 0-5000"),
21960
+ e.temperature(),
21961
+ e.humidity(),
21962
+ e.illuminance(),
21963
+ tuya.exposes.soilSampling(),
21964
+ tuya.exposes.soilCalibration(),
21965
+ tuya.exposes.humidityCalibration(),
21966
+ e
21967
+ .numeric("illuminance_calibration", ea.STATE_SET)
21968
+ .withValueMin(-15)
21969
+ .withValueMax(1000)
21970
+ .withValueStep(1)
21971
+ .withUnit("lux")
21972
+ .withDescription("Illuminance calibration"),
21973
+ tuya.exposes.temperatureCalibration(),
21974
+ tuya.exposes.soilWarning(),
21975
+ e
21976
+ .numeric("soil_fertility_warning_setting", ea.STATE_SET)
21977
+ .withValueMin(100)
21978
+ .withValueMax(1800)
21979
+ .withValueStep(1)
21980
+ .withUnit("μS/cm")
21981
+ .withDescription("When the soil fertility value is lower than what threshold should a warning be issued"),
21982
+ ],
21983
+ meta: {
21984
+ tuyaDatapoints: [
21985
+ [3, "soil_moisture", tuya.valueConverter.raw],
21986
+ [5, "temperature", tuya.valueConverter.divideBy10],
21987
+ [14, "battery", tuya.valueConverter.raw],
21988
+ [101, "humidity", tuya.valueConverter.raw],
21989
+ [102, "illuminance", tuya.valueConverter.raw],
21990
+ [103, "soil_sampling", tuya.valueConverter.raw],
21991
+ [104, "soil_calibration", tuya.valueConverter.raw],
21992
+ [105, "humidity_calibration", tuya.valueConverter.raw],
21993
+ [106, "illuminance_calibration", tuya.valueConverter.raw],
21994
+ [107, "temperature_calibration", tuya.valueConverter.divideBy10],
21995
+ [110, "soil_warning", tuya.valueConverter.raw],
21996
+ [111, "water_warning", tuya.valueConverterBasic.lookup({ none: tuya.enum(0), alarm: tuya.enum(1) })],
21997
+ [112, "soil_fertility", tuya.valueConverter.raw],
21998
+ [114, "soil_fertility_warning_setting", tuya.valueConverter.raw],
21999
+ [115, "soil_fertility_warning", tuya.valueConverterBasic.lookup({ none: tuya.enum(0), alarm: tuya.enum(1) })],
22000
+ ],
22001
+ },
22002
+ },
21945
22003
  ];
21946
22004
  //# sourceMappingURL=tuya.js.map