zigbee-herdsman-converters 14.0.420 → 14.0.424

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.
@@ -1837,7 +1837,7 @@ const converters = {
1837
1837
  case tuya.dataPoints.nousBattery:
1838
1838
  return {battery: value};
1839
1839
  case tuya.dataPoints.nousTempUnitConvert:
1840
- return {temperature_unit_convert: {0x00: '°C', 0x01: '°F'}[value]};
1840
+ return {temperature_unit_convert: {0x00: 'celsius', 0x01: 'fahrenheit'}[value]};
1841
1841
  case tuya.dataPoints.nousMaxTemp:
1842
1842
  return {max_temperature: calibrateAndPrecisionRoundOptions(value / 10, options, 'temperature')};
1843
1843
  case tuya.dataPoints.nousMinTemp:
@@ -3224,8 +3224,9 @@ const converters = {
3224
3224
  }
3225
3225
 
3226
3226
  if (msg.data.hasOwnProperty('12288')) {
3227
- result.energy_consumed = precisionRound(msg.data['12288'], 2);
3227
+ result.energy_consumed = precisionRound(msg.data['12288'], 2); // deprecated
3228
3228
  result.energyconsumed = result.energy_consumed; // deprecated
3229
+ result.energy = result.energy_consumed;
3229
3230
  }
3230
3231
 
3231
3232
  if (msg.data.hasOwnProperty('12291')) {
@@ -4141,6 +4142,25 @@ const converters = {
4141
4142
  }
4142
4143
  },
4143
4144
  },
4145
+ tuya_CO: {
4146
+ cluster: 'manuSpecificTuya',
4147
+ type: ['commandDataReport', 'commandDataResponse'],
4148
+ options: [exposes.options.precision('co'), exposes.options.calibration('co')],
4149
+ convert: (model, msg, publish, options, meta) => {
4150
+ const dpValue = tuya.firstDpValue(msg, meta, 'tuya_CO');
4151
+ const dp = dpValue.dp;
4152
+ const value = tuya.getDataValue(dpValue);
4153
+ switch (dp) {
4154
+ case tuya.dataPoints.tuyaSabCO:
4155
+ return {co: calibrateAndPrecisionRoundOptions(value / 100, options, 'co')};
4156
+ case tuya.dataPoints.tuyaSabCOalarm:
4157
+ return {carbon_monoxide: value ? 'OFF' : 'ON'};
4158
+ default:
4159
+ meta.logger.warn(`zigbee-herdsman-converters:TuyaSmartAirBox: Unrecognized DP #${
4160
+ dp} with data ${JSON.stringify(dpValue)}`);
4161
+ }
4162
+ },
4163
+ },
4144
4164
  saswell_thermostat: {
4145
4165
  cluster: 'manuSpecificTuya',
4146
4166
  type: ['commandDataResponse', 'commandDataReport'],
@@ -4434,7 +4454,7 @@ const converters = {
4434
4454
  case tuya.dataPoints.ecoTemp:
4435
4455
  return {eco_temperature: value};
4436
4456
  case tuya.dataPoints.valvePos:
4437
- return {position: value};
4457
+ return {position: value, running_state: value ? 'heat' : 'idle'};
4438
4458
  case tuya.dataPoints.awayTemp:
4439
4459
  return {away_preset_temperature: value};
4440
4460
  case tuya.dataPoints.awayDays:
@@ -5106,7 +5126,7 @@ const converters = {
5106
5126
  },
5107
5127
  },
5108
5128
  legrand_cable_outlet_mode: {
5109
- cluster: '64576',
5129
+ cluster: 'manuSpecificLegrandDevices2',
5110
5130
  type: ['readResponse'],
5111
5131
  convert: (model, msg, publish, options, meta) => {
5112
5132
  const payload = {};
@@ -8134,6 +8154,7 @@ const converters = {
8134
8154
  }
8135
8155
  if (dp === tuya.dataPoints.hochTotalActivePower) {
8136
8156
  result.energy_consumed = value / 100;
8157
+ result.energy = result.energy_consumed;
8137
8158
  }
8138
8159
  if (dp === tuya.dataPoints.hochLocking) {
8139
8160
  result.trip = value ? 'trip' : 'clear';
@@ -8150,7 +8171,7 @@ const converters = {
8150
8171
  1: 'on',
8151
8172
  2: 'previous',
8152
8173
  };
8153
- result.power_on_behaviour = lookup[value];
8174
+ result.power_on_behavior = lookup[value];
8154
8175
  }
8155
8176
  if (dp === tuya.dataPoints.hochFaultCode) {
8156
8177
  const lookup = {
@@ -8410,6 +8431,20 @@ const converters = {
8410
8431
  }
8411
8432
  },
8412
8433
  },
8434
+ tm081: {
8435
+ cluster: 'manuSpecificTuya',
8436
+ type: ['commandDataReport'],
8437
+ convert: (model, msg, publish, options, meta) => {
8438
+ const dpValue = tuya.firstDpValue(msg, meta, 'tm0801');
8439
+ const dp = dpValue.dp;
8440
+ const value = tuya.getDataValue(dpValue);
8441
+ if (dp === 1) return {contact: value === true ? false : true};
8442
+ if (dp === 2) return {battery: value};
8443
+ else {
8444
+ meta.logger.warn(`zigbee-herdsman-converters:TM081: NOT RECOGNIZED DP #${dp} with data ${JSON.stringify(dpValue)}`);
8445
+ }
8446
+ },
8447
+ },
8413
8448
  // #endregion
8414
8449
 
8415
8450
  // #region Ignore converters (these message dont need parsing).
@@ -4577,10 +4577,20 @@ const converters = {
4577
4577
  legrand_cableOutletMode: {
4578
4578
  key: ['cable_outlet_mode'],
4579
4579
  convertSet: async (entity, key, value, meta) => {
4580
- meta.logger.warn('Feature under development !');
4580
+ const mode = {
4581
+ 'comfort': 0x00,
4582
+ 'comfort-1': 0x01,
4583
+ 'comfort-2': 0x02,
4584
+ 'eco': 0x03,
4585
+ 'frost_protection': 0x04,
4586
+ 'off': 0x05,
4587
+ };
4588
+ const payload = {data: Buffer.from([mode[value]])};
4589
+ await entity.command('manuSpecificLegrandDevices2', 'command0', payload);
4590
+ return {state: {'cable_outlet_mode': value}};
4581
4591
  },
4582
4592
  convertGet: async (entity, key, meta) => {
4583
- await entity.read(64576, [0x0000], manufacturerOptions.legrand);
4593
+ await entity.read('manuSpecificLegrandDevices2', [0x0000], manufacturerOptions.legrand);
4584
4594
  },
4585
4595
  },
4586
4596
  legrand_powerAlarm: {
@@ -5279,7 +5289,7 @@ const converters = {
5279
5289
  convertSet: async (entity, key, value, meta) => {
5280
5290
  switch (key) {
5281
5291
  case 'temperature_unit_convert':
5282
- await tuya.sendDataPointEnum(entity, tuya.dataPoints.nousTempUnitConvert, ['°C', '°F'].indexOf(value));
5292
+ await tuya.sendDataPointEnum(entity, tuya.dataPoints.nousTempUnitConvert, ['celsius', 'fahrenheit'].indexOf(value));
5283
5293
  break;
5284
5294
  case 'min_temperature':
5285
5295
  await tuya.sendDataPointValue(entity, tuya.dataPoints.nousMinTemp, Math.round(value * 10));
@@ -7006,7 +7016,7 @@ const converters = {
7006
7016
  key: ['state',
7007
7017
  'child_lock',
7008
7018
  'countdown_timer',
7009
- 'power_on_behaviour',
7019
+ 'power_on_behavior',
7010
7020
  'trip',
7011
7021
  'clear_device_data',
7012
7022
  /* TODO: Add the below keys when toZigbee converter work has been completed
@@ -7025,10 +7035,10 @@ const converters = {
7025
7035
  } else if (key === 'countdown_timer') {
7026
7036
  await tuya.sendDataPointValue(entity, tuya.dataPoints.hochCountdownTimer, value);
7027
7037
  return {state: {countdown_timer: value}};
7028
- } else if (key === 'power_on_behaviour') {
7038
+ } else if (key === 'power_on_behavior') {
7029
7039
  const lookup = {'off': 0, 'on': 1, 'previous': 2};
7030
7040
  await tuya.sendDataPointEnum(entity, tuya.dataPoints.hochRelayStatus, lookup[value], 'sendData');
7031
- return {state: {power_on_behaviour: value}};
7041
+ return {state: {power_on_behavior: value}};
7032
7042
  } else if (key === 'trip') {
7033
7043
  if (value === 'clear') {
7034
7044
  await tuya.sendDataPointBool(entity, tuya.dataPoints.hochLocking, true, 'sendData');
package/devices/adeo.js CHANGED
@@ -71,6 +71,13 @@ module.exports = [
71
71
  description: 'ENKI Lexman E27 14W to 100W LED RGBW',
72
72
  extend: extend.light_onoff_brightness_colortemp_color(),
73
73
  },
74
+ {
75
+ zigbeeModel: ['ZBEK-2'],
76
+ model: 'IG-CDZOTAAG014RA-MAN',
77
+ vendor: 'ADEO',
78
+ description: 'ENKI Lexman E27 14W to 100W LED RGBW v2',
79
+ extend: extend.light_onoff_brightness_colortemp_color({colorTempRange: [153, 370]}),
80
+ },
74
81
  {
75
82
  zigbeeModel: ['LXEK-7'],
76
83
  model: '9CZA-A806ST-Q1Z',
@@ -0,0 +1,11 @@
1
+ const extend = require('../lib/extend');
2
+
3
+ module.exports = [
4
+ {
5
+ zigbeeModel: ['AL8TC13W-AP'],
6
+ model: 'AL8TC13W-AP',
7
+ vendor: 'Alchemy',
8
+ description: 'Downlight with tuneable white',
9
+ extend: extend.light_onoff_brightness_colortemp({colorTempRange: [153, 370]}),
10
+ },
11
+ ];
@@ -4,6 +4,21 @@ const tz = require('../converters/toZigbee');
4
4
  const reporting = require('../lib/reporting');
5
5
  const extend = require('../lib/extend');
6
6
  const e = exposes.presets;
7
+ const utils = require('../lib/utils');
8
+ const ea = exposes.access;
9
+
10
+ const tzLocal = {
11
+ aOneBacklight: {
12
+ key: ['backlight_led'],
13
+ convertSet: async (entity, key, value, meta) => {
14
+ const state = value.toLowerCase();
15
+ utils.validateValue(state, ['toggle', 'off', 'on']);
16
+ const endpoint = meta.device.getEndpoint(3);
17
+ await endpoint.command('genOnOff', state, {});
18
+ return {state: {backlight_led: state.toUpperCase()}};
19
+ },
20
+ },
21
+ };
7
22
 
8
23
  const batteryRotaryDimmer = (...endpointsIds) => ({
9
24
  fromZigbee: [fz.battery, fz.command_on, fz.command_off, fz.command_step, fz.command_step_color_temperature],
@@ -129,6 +144,9 @@ module.exports = [
129
144
  model: 'AU-A1ZB2WDM',
130
145
  vendor: 'Aurora Lighting',
131
146
  description: 'AOne 250W smart rotary dimmer module',
147
+ exposes: [...extend.light_onoff_brightness({noConfigure: true}).exposes,
148
+ exposes.binary('backlight_led', ea.STATE_SET, 'ON', 'OFF').withDescription('Enable or disable the blue backlight LED')],
149
+ toZigbee: [...extend.light_onoff_brightness({noConfigure: true}).toZigbee, tzLocal.aOneBacklight],
132
150
  extend: extend.light_onoff_brightness({noConfigure: true}),
133
151
  configure: async (device, coordinatorEndpoint, logger) => {
134
152
  await extend.light_onoff_brightness().configure(device, coordinatorEndpoint, logger);
package/devices/awox.js CHANGED
@@ -1,4 +1,64 @@
1
1
  const extend = require('../lib/extend');
2
+ const fz = require('../converters/fromZigbee');
3
+ const exposes = require('../lib/exposes');
4
+ const e = exposes.presets;
5
+
6
+ const awoxRemoteHelper = {
7
+ convertToColorName: (buffer) => {
8
+ const commonForColors = buffer[0] === 17 && buffer[2] === 48 && buffer[3] === 0 && buffer[5] === 8 && buffer[6] === 0;
9
+
10
+ if (commonForColors && buffer[4] === 255) {
11
+ return 'red';
12
+ } else if (commonForColors && buffer[4] === 42) {
13
+ return 'yellow';
14
+ } else if (commonForColors && buffer[4] === 85) {
15
+ return 'green';
16
+ } else if (commonForColors && buffer[4] === 170) {
17
+ return 'blue';
18
+ }
19
+ return null;
20
+ },
21
+ isRefresh: (buffer) => {
22
+ return buffer[0] === 17 && buffer[2] === 16 && buffer[3] === 1 && buffer[4] === 1;
23
+ },
24
+ };
25
+
26
+ const fzLocal = {
27
+ colors: {
28
+ cluster: 'lightingColorCtrl',
29
+ type: ['raw'],
30
+ convert: (model, msg, publish, options, meta) => {
31
+ const color = awoxRemoteHelper.convertToColorName(msg.data);
32
+ if (color != null) {
33
+ return {
34
+ action: color,
35
+ };
36
+ }
37
+ },
38
+ },
39
+ refreshColored: {
40
+ cluster: 'lightingColorCtrl',
41
+ type: ['commandMoveHue'],
42
+ convert: (model, msg, publish, options, meta) => {
43
+ if (msg.data.movemode === 1 && msg.data.rate === 12) {
44
+ return {
45
+ action: 'refresh_colored',
46
+ };
47
+ }
48
+ },
49
+ },
50
+ refresh: {
51
+ cluster: 'genLevelCtrl',
52
+ type: ['raw'],
53
+ convert: (model, msg, publish, options, meta) => {
54
+ if (awoxRemoteHelper.isRefresh(msg.data)) {
55
+ return {
56
+ action: 'refresh',
57
+ };
58
+ }
59
+ },
60
+ },
61
+ };
2
62
 
3
63
  module.exports = [
4
64
  {
@@ -8,6 +68,23 @@ module.exports = [
8
68
  description: 'LED white',
9
69
  extend: extend.light_onoff_brightness(),
10
70
  },
71
+ {
72
+ fingerprint: [
73
+ {type: 'Router', manufacturerName: 'AwoX', modelID: 'TLSR82xx', endpoints: [
74
+ {ID: 1, profileID: 260, deviceID: 2028, inputClusters: [0, 3, 4, 4096], outputClusters: [0, 3, 4, 5, 6, 8, 768, 4096]},
75
+ {ID: 3, profileID: 4751, deviceID: 2048, inputClusters: [65360, 65361], outputClusters: [65360, 65361]},
76
+ ]},
77
+ ],
78
+ model: '33952',
79
+ vendor: 'AwoX',
80
+ description: 'Remote controller',
81
+ fromZigbee: [fz.command_on, fzLocal.colors, fzLocal.refresh, fzLocal.refreshColored, fz.command_off,
82
+ fz.command_step, fz.command_move, fz.command_stop, fz.command_recall, fz.command_step_color_temperature],
83
+ toZigbee: [],
84
+ exposes: [e.action(['on', 'off', 'red', 'refresh', 'refresh_colored', 'blue', 'yellow',
85
+ 'green', 'brightness_step_up', 'brightness_step_down', 'brightness_move_up', 'brightness_move_down', 'brightness_stop',
86
+ 'recall_1', 'color_temperature_step_up', 'color_temperature_step_down'])],
87
+ },
11
88
  {
12
89
  fingerprint: [
13
90
  {type: 'Router', manufacturerName: 'AwoX', modelID: 'TLSR82xx', endpoints: [
@@ -15,6 +15,18 @@ module.exports = [
15
15
  await reporting.onOff(endpoint);
16
16
  },
17
17
  },
18
+ {
19
+ zigbeeModel: ['43078'],
20
+ model: '43078',
21
+ vendor: 'Enbrighten',
22
+ description: 'Zigbee in-wall smart switch',
23
+ extend: extend.switch(),
24
+ configure: async (device, coordinatorEndpoint, logger) => {
25
+ const endpoint = device.getEndpoint(1);
26
+ await reporting.bind(endpoint, coordinatorEndpoint, ['genOnOff']);
27
+ await reporting.onOff(endpoint);
28
+ },
29
+ },
18
30
  {
19
31
  zigbeeModel: ['43080'],
20
32
  model: '43080',
package/devices/hive.js CHANGED
@@ -496,4 +496,18 @@ module.exports = [
496
496
  },
497
497
  exposes: [],
498
498
  },
499
+ {
500
+ zigbeeModel: ['SLT6'],
501
+ model: 'SLT6',
502
+ vendor: 'Hive',
503
+ description: 'Heating thermostat remote control',
504
+ fromZigbee: [fz.battery],
505
+ toZigbee: [],
506
+ exposes: [e.battery()],
507
+ configure: async (device, coordinatorEndpoint, logger) => {
508
+ const endpoint = device.getEndpoint(9);
509
+ await reporting.bind(endpoint, coordinatorEndpoint, ['genPowerCfg']);
510
+ await reporting.batteryPercentageRemaining(endpoint);
511
+ },
512
+ },
499
513
  ];
package/devices/ikea.js CHANGED
@@ -285,6 +285,13 @@ module.exports = [
285
285
  description: 'TRADFRI LED bulb E27 1055 lumen, dimmable, white spectrum, opal white',
286
286
  extend: tradfriExtend.light_onoff_brightness_colortemp(),
287
287
  },
288
+ {
289
+ zigbeeModel: ['TRADFRIbulbE27WSglobeclear806lm'],
290
+ model: 'LED2004G8',
291
+ vendor: 'IKEA',
292
+ description: 'TRADFRI LED bulb E27 806 lumen, dimmable, white spectrum, clear',
293
+ extend: tradfriExtend.light_onoff_brightness_colortemp(),
294
+ },
288
295
  {
289
296
  zigbeeModel: ['TRADFRI bulb E27 opal 470lm', 'TRADFRI bulb E27 W opal 470lm', 'TRADFRIbulbT120E27WSopal470lm'],
290
297
  model: 'LED1937T5_E27',
package/devices/lds.js ADDED
@@ -0,0 +1,11 @@
1
+ const extend = require('../lib/extend');
2
+
3
+ module.exports = [
4
+ {
5
+ zigbeeModel: ['ZBT-RGBWLight-A0000'],
6
+ model: 'ZBT-RGBWLight-A0000',
7
+ vendor: 'LDS',
8
+ description: 'Ynoa smart LED E27',
9
+ extend: extend.light_onoff_brightness_colortemp_color({colorTempRange: [153, 555]}),
10
+ },
11
+ ];
@@ -313,7 +313,7 @@ module.exports = [
313
313
  e.power().withAccess(ea.STATE_GET)],
314
314
  configure: async (device, coordinatorEndpoint, logger) => {
315
315
  const endpoint = device.getEndpoint(1);
316
- await reporting.bind(endpoint, coordinatorEndpoint, ['genOnOff', 'haElectricalMeasurement', 64576]);
316
+ await reporting.bind(endpoint, coordinatorEndpoint, ['genOnOff', 'haElectricalMeasurement', 'manuSpecificLegrandDevices2']);
317
317
  await reporting.onOff(endpoint);
318
318
  await reporting.readEletricalMeasurementMultiplierDivisors(endpoint);
319
319
  await reporting.activePower(endpoint);
package/devices/lixee.js CHANGED
@@ -443,19 +443,21 @@ function getCurrentConfig(device, options, logger=console) {
443
443
  .filter((e) => e.linkyMode == linkyMode && (e.linkyPhase == linkyPhase || e.linkyPhase == linkyPhaseDef.all) && (linkyProduction || !e.onlyProducer));
444
444
 
445
445
  // Filter even more, based on our current tarif
446
- let currentTarf;
446
+ let currentTarf = '';
447
447
 
448
- try {
449
- // Try to remove atributes which doesn't match current tarif
450
- currentTarf = endpoint.clusters.liXeePrivate.attributes.currentTarif.replace(/\0/g, '');
451
- } catch (error) {
452
- currentTarf = '';
453
- if (options && options.hasOwnProperty('tarif') && options['tarif'] != 'auto') {
454
- currentTarf = Object.entries(tarifsDef).find(( [k, v] ) => (v.fname == options['tarif']))[1].currentTarf;
448
+ if (options && options.hasOwnProperty('tarif') && options['tarif'] != 'auto') {
449
+ currentTarf = Object.entries(tarifsDef).find(( [k, v] ) => (v.fname == options['tarif']))[1].currentTarf;
450
+ } else {
451
+ try {
452
+ const lixAtts = endpoint.clusters[clustersDef._0xFF66].attributes;
453
+ lixAtts.raiseIfEmpty;
454
+ currentTarf = fzLocal.lixee_private_fz.convert({}, {data: lixAtts}).current_tarif;
455
+ } catch (error) {
456
+ logger.warn(`Not able to detect the current tarif. Not filtering any expose...`);
455
457
  }
456
458
  }
457
459
 
458
- // logger.debug(`zlinky config: ` + linkyMode + `, `+ linkyPhase + `, `+ linkyProduction.toString() +`, `+ currentTarf);
460
+ logger.debug(`zlinky config: ` + linkyMode + `, `+ linkyPhase + `, `+ linkyProduction.toString() +`, `+ currentTarf);
459
461
 
460
462
  switch (currentTarf) {
461
463
  case linkyMode == linkyModeDef.legacy && tarifsDef.histo_BASE.currentTarf:
@@ -481,7 +483,7 @@ function getCurrentConfig(device, options, logger=console) {
481
483
  return myExpose;
482
484
  }
483
485
  const definition = {
484
- zigbeeModel: ['ZLinky_TIC'],
486
+ zigbeeModel: ['ZLinky_TIC', 'ZLinky_TIC\u0000'],
485
487
  model: 'ZLinky_TIC',
486
488
  vendor: 'LiXee',
487
489
  description: 'Lixee ZLinky',
@@ -525,13 +527,15 @@ const definition = {
525
527
  clustersDef._0xFF66, /* liXeePrivate */
526
528
  ]);
527
529
 
530
+ await endpoint.read('liXeePrivate', ['linkyMode', 'currentTarif'], {manufacturerCode: null});
531
+
528
532
  const configReportings = [];
529
533
  const suscribeNew = getCurrentConfig(device, options, logger).filter((e) => e.reportable);
530
534
 
531
535
  const unsuscribe = endpoint.configuredReportings
532
536
  .filter((e) => !suscribeNew.some((r) => e.cluster.name == r.cluster && e.attribute.name == r.att));
533
537
  // Unsuscribe reports that doesn't correspond with the current config
534
- (await Promise.allSettled(unsuscribe.map((e) => endpoint.configureReporting(e.cluster.name, reporting.payload(e.attribute.name, e.minimumReportInterval, 65535, e.reportableChange)))))
538
+ (await Promise.allSettled(unsuscribe.map((e) => endpoint.configureReporting(e.cluster.name, reporting.payload(e.attribute.name, e.minimumReportInterval, 65535, e.reportableChange), {manufacturerCode: null}))))
535
539
  .filter((e) => e.status == 'rejected')
536
540
  .forEach((e) => {
537
541
  throw e.reason;
@@ -550,7 +554,8 @@ const definition = {
550
554
  }
551
555
  configReportings.push(endpoint
552
556
  .configureReporting(
553
- e.cluster, reporting.payload(params.att, params.min, params.max, params.change)),
557
+ e.cluster, reporting.payload(params.att, params.min, params.max, params.change),
558
+ {manufacturerCode: null}),
554
559
  );
555
560
  }
556
561
  (await Promise.allSettled(configReportings))
@@ -573,8 +578,7 @@ const definition = {
573
578
  .filter((e) => !endpoint.configuredReportings.some((r) => r.cluster.name == e.cluster && r.attribute.name == e.att));
574
579
  for (const e of currentExposes) {
575
580
  await endpoint
576
- .read(e.cluster, [e.att])
577
- .catch((err) => { }); // TODO: Ignore reads error?
581
+ .read(e.cluster, [e.att], {manufacturerCode: null});
578
582
  }
579
583
  }, seconds * 1000);
580
584
  globalStore.putValue(device, 'interval', interval);
package/devices/meazon.js CHANGED
@@ -13,7 +13,7 @@ module.exports = [
13
13
  vendor: 'Meazon',
14
14
  description: 'Bizy plug meter',
15
15
  fromZigbee: [fz.command_on, fz.legacy.genOnOff_cmdOn, fz.command_off, fz.legacy.genOnOff_cmdOff, fz.on_off, fz.meazon_meter],
16
- exposes: [e.switch(), e.power(), e.voltage(), e.current()],
16
+ exposes: [e.switch(), e.power(), e.voltage(), e.current(), e.energy()],
17
17
  toZigbee: [tz.on_off],
18
18
  configure: async (device, coordinatorEndpoint, logger) => {
19
19
  const endpoint = device.getEndpoint(10);
@@ -1,5 +1,4 @@
1
1
  const exposes = require('../lib/exposes');
2
- const fz = {...require('../converters/fromZigbee'), legacy: require('../lib/legacy').fromZigbee};
3
2
  const tz = require('../converters/toZigbee');
4
3
  const e = exposes.presets;
5
4
  const ea = exposes.access;
@@ -12,8 +11,11 @@ module.exports = [
12
11
  model: 'FUT039Z',
13
12
  vendor: 'Miboxer',
14
13
  description: 'RGB+CCT LED controller',
15
- toZigbee: [tz.on_off, tz.tuya_led_control, tz.tuya_do_not_disturb, tz.tuya_color_power_on_behavior],
16
- fromZigbee: [fz.on_off, fz.tuya_led_controller, fz.brightness, fz.ignore_basic_report],
14
+ toZigbee: extend.light_onoff_brightness_colortemp_color().toZigbee.concat([
15
+ tz.tuya_do_not_disturb, tz.tuya_color_power_on_behavior,
16
+ ]),
17
+ meta: {applyRedFix: true, enhancedHue: false},
18
+ fromZigbee: extend.light_onoff_brightness_colortemp_color().fromZigbee,
17
19
  exposes: [e.light_brightness_colortemp_colorhs([153, 500]).removeFeature('color_temp_startup'),
18
20
  exposes.binary('do_not_disturb', ea.STATE_SET, true, false)
19
21
  .withDescription('Do not disturb mode'),
@@ -31,7 +33,8 @@ module.exports = [
31
33
  onEvent: tuya.onEventSetTime,
32
34
  },
33
35
  {
34
- fingerprint: [{modelID: 'TS0502B', manufacturerName: '_TZ3210_frm6149r'}],
36
+ fingerprint: [{modelID: 'TS0502B', manufacturerName: '_TZ3210_frm6149r'},
37
+ {modelID: 'TS0502B', manufacturerName: '_TZ3210_jtifm80b'}],
35
38
  model: 'FUT035Z',
36
39
  description: 'Dual white LED controller',
37
40
  vendor: 'Miboxer',
@@ -45,7 +45,7 @@ module.exports = [
45
45
  },
46
46
  {
47
47
  zigbeeModel: ['ZBT-ExtendedColor'],
48
- model: '404000/404005/404012',
48
+ model: '404000/404005/404012/404019',
49
49
  vendor: 'Müller Licht',
50
50
  description: 'Tint LED bulb GU10/E14/E27 350/470/806 lumen, dimmable, color, opal white',
51
51
  extend: extend.light_onoff_brightness_colortemp_color({colorTempRange: [153, 556], supportsHS: true}),
package/devices/nous.js CHANGED
@@ -16,6 +16,31 @@ module.exports = [
16
16
  toZigbee: [],
17
17
  exposes: [e.temperature(), e.humidity(), e.battery()],
18
18
  },
19
+ {
20
+ fingerprint: [{modelID: 'TS0601', manufacturerName: '_TZE200_lve3dvpy'}],
21
+ model: 'SZ-T04',
22
+ vendor: 'Nous',
23
+ description: 'Temperature and humidity sensor with clock',
24
+ fromZigbee: [fz.nous_lcd_temperature_humidity_sensor, fz.ignore_tuya_set_time],
25
+ toZigbee: [tz.nous_lcd_temperature_humidity_sensor],
26
+ onEvent: tuya.onEventSetLocalTime,
27
+ configure: async (device, coordinatorEndpoint, logger) => {
28
+ const endpoint = device.getEndpoint(1);
29
+ await reporting.bind(endpoint, coordinatorEndpoint, ['genBasic']);
30
+ },
31
+ exposes: [
32
+ e.temperature(), e.humidity(), e.battery(),
33
+ exposes.enum('temperature_unit_convert', ea.STATE_SET, ['celsius', 'fahrenheit']).withDescription('Current display unit'),
34
+ exposes.enum('temperature_alarm', ea.STATE, ['canceled', 'lower_alarm', 'upper_alarm'])
35
+ .withDescription('Temperature alarm status'),
36
+ exposes.numeric('max_temperature', ea.STATE_SET).withUnit('°C').withValueMin(-20).withValueMax(60)
37
+ .withDescription('Alarm temperature max'),
38
+ exposes.numeric('min_temperature', ea.STATE_SET).withUnit('°C').withValueMin(-20).withValueMax(60)
39
+ .withDescription('Alarm temperature min'),
40
+ exposes.numeric('temperature_sensitivity', ea.STATE_SET).withUnit('°C').withValueMin(0.1).withValueMax(50).withValueStep(0.1)
41
+ .withDescription('Temperature sensitivity'),
42
+ ],
43
+ },
19
44
  {
20
45
  fingerprint: [{modelID: 'TS0601', manufacturerName: '_TZE200_nnrfa68v'}],
21
46
  model: 'E6',
@@ -88,6 +88,13 @@ module.exports = [
88
88
  description: 'Amaris LED panels',
89
89
  extend: extend.light_onoff_brightness_colortemp_color(),
90
90
  },
91
+ {
92
+ zigbeeModel: ['371232040'],
93
+ model: '371232040',
94
+ vendor: 'Paulmann',
95
+ description: 'LED panels',
96
+ extend: extend.light_onoff_brightness_colortemp_color({colorTempRange: [153, 350]}),
97
+ },
91
98
  {
92
99
  zigbeeModel: ['500.45'],
93
100
  model: '500.45',
@@ -2465,7 +2465,7 @@ module.exports = [
2465
2465
  ota: ota.zigbeeOTA,
2466
2466
  },
2467
2467
  {
2468
- zigbeeModel: ['5309230P6', '5309231P6'],
2468
+ zigbeeModel: ['5309230P6', '5309231P6', '929003045701_01', '929003045701_02'],
2469
2469
  model: '5309230P6',
2470
2470
  vendor: 'Philips',
2471
2471
  description: 'Hue White ambiance Runner double spotlight',
@@ -1,7 +1,7 @@
1
- const fz = require('zigbee-herdsman-converters/converters/fromZigbee');
2
- const tz = require('zigbee-herdsman-converters/converters/toZigbee');
3
- const exposes = require('zigbee-herdsman-converters/lib/exposes');
4
- const reporting = require('zigbee-herdsman-converters/lib/reporting');
1
+ const fz = require('../converters/fromZigbee');
2
+ const tz = require('../converters/toZigbee');
3
+ const exposes = require('../lib/exposes');
4
+ const reporting = require('../lib/reporting');
5
5
  const e = exposes.presets;
6
6
  const ea = exposes.access;
7
7
 
package/devices/slv.js ADDED
@@ -0,0 +1,20 @@
1
+ const extend = require('../lib/extend');
2
+
3
+ module.exports = [
4
+ {
5
+ zigbeeModel: ['1001248', 'ZBT-ColorTemperature-Panel'],
6
+ model: '1001248',
7
+ vendor: 'SLV',
8
+ description: 'VALETO CCT LED driver',
9
+ extend: extend.light_onoff_brightness_colortemp({colorTempRange: [153, 370]}),
10
+ },
11
+ {
12
+ zigbeeModel: ['1002994'],
13
+ model: '1002994',
14
+ vendor: 'SLV',
15
+ description: 'VALETO remote (binds to device)',
16
+ fromZigbee: [],
17
+ toZigbee: [],
18
+ exposes: [],
19
+ },
20
+ ];
package/devices/sonoff.js CHANGED
@@ -78,7 +78,7 @@ module.exports = [
78
78
  vendor: 'SONOFF',
79
79
  whiteLabel: [{vendor: 'eWeLink', model: 'RHK07'}],
80
80
  description: 'Wireless button',
81
- exposes: [e.battery(), e.action(['single', 'double', 'long'])],
81
+ exposes: [e.battery(), e.action(['single', 'double', 'long']), e.battery_voltage()],
82
82
  fromZigbee: [fz.ewelink_action, fz.battery],
83
83
  toZigbee: [],
84
84
  configure: async (device, coordinatorEndpoint, logger) => {
@@ -144,7 +144,7 @@ module.exports = [
144
144
  await reporting.batteryVoltage(endpoint);
145
145
  await reporting.batteryPercentageRemaining(endpoint);
146
146
  },
147
- exposes: [e.occupancy(), e.battery_low(), e.tamper(), e.battery()],
147
+ exposes: [e.occupancy(), e.battery_low(), e.tamper(), e.battery(), e.battery_voltage()],
148
148
  },
149
149
  {
150
150
  zigbeeModel: ['S26R2ZB'],
@@ -36,4 +36,11 @@ module.exports = [
36
36
  await reporting.onOff(endpoint);
37
37
  },
38
38
  },
39
+ {
40
+ zigbeeModel: ['S32053'],
41
+ model: 'S32053',
42
+ vendor: 'The Light Group',
43
+ description: 'SLC SmartOne CV led dimmable driver',
44
+ extend: extend.light_onoff_brightness(),
45
+ },
39
46
  ];