zigbee-herdsman-converters 14.0.661 → 14.0.663

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.
@@ -3420,6 +3420,12 @@ const converters = {
3420
3420
  return tuya.sendDataPointRaw(entity, tuya.dataPoints.moesSchedule, payload);
3421
3421
  },
3422
3422
  },
3423
+ moesS_thermostat_system_mode: {
3424
+ key: ['system_mode'],
3425
+ convertSet: async (entity, key, value, meta) => {
3426
+ return {state: {system_mode: 'heat'}};
3427
+ },
3428
+ },
3423
3429
  moesS_thermostat_preset: {
3424
3430
  key: ['preset'],
3425
3431
  convertSet: async (entity, key, value, meta) => {
@@ -0,0 +1,28 @@
1
+ const exposes = require('../lib/exposes');
2
+ const fz = require('../converters/fromZigbee');
3
+ const reporting = require('../lib/reporting');
4
+ const e = exposes.presets;
5
+
6
+ module.exports = [
7
+ {
8
+ fingerprint: [{modelID: 'TS0201', manufacturerName: '_TYZB01_ujfk3xd9'}],
9
+ model: 'M423-9E',
10
+ vendor: 'Akuvox',
11
+ description: 'Smart temperature & humidity Sensor',
12
+ exposes: [e.battery(), e.temperature(), e.humidity()],
13
+ fromZigbee: [fz.temperature, fz.humidity, fz.battery],
14
+ toZigbee: [],
15
+ meta: {battery: {voltageToPercentage: '3V_2500'}},
16
+ configure: async (device, coordinatorEndpoint, logger) => {
17
+ const endpoint1 = device.getEndpoint(1);
18
+ await reporting.bind(endpoint1, coordinatorEndpoint, ['msTemperatureMeasurement', 'genPowerCfg']);
19
+ await endpoint1.read('genPowerCfg', ['batteryPercentageRemaining']);
20
+ const endpoint2 = device.getEndpoint(2);
21
+ await reporting.bind(endpoint2, coordinatorEndpoint, ['msRelativeHumidity']);
22
+ await reporting.temperature(endpoint1);
23
+ await reporting.humidity(endpoint2);
24
+ await reporting.batteryVoltage(endpoint1);
25
+ await reporting.batteryPercentageRemaining(endpoint1);
26
+ },
27
+ },
28
+ ];
@@ -31,4 +31,17 @@ module.exports = [
31
31
  extend: extend.light_onoff_brightness(),
32
32
  ota: ota.zigbeeOTA,
33
33
  },
34
+ {
35
+ zigbeeModel: ['FLS-A lp (1-10V)'],
36
+ model: 'BN-600078',
37
+ vendor: 'Dresden Elektronik',
38
+ description: 'Zigbee controller for 1-10V/PWM',
39
+ extend: extend.light_onoff_brightness(),
40
+ exposes: [e.light_brightness().withEndpoint('l1'), e.light_brightness().withEndpoint('l2'),
41
+ e.light_brightness().withEndpoint('l3'), e.light_brightness().withEndpoint('l4')],
42
+ endpoint: (device) => {
43
+ return {'l1': 11, 'l2': 12, 'l3': 13, 'l4': 14};
44
+ },
45
+ meta: {multiEndpoint: true, disableDefaultResponse: true},
46
+ },
34
47
  ];
@@ -21,6 +21,10 @@ module.exports = [
21
21
  await reporting.onOff(endpoint);
22
22
  await reporting.brightness(endpoint);
23
23
  await reporting.fanMode(endpoint);
24
+
25
+ // Has Unknown power source, force it here.
26
+ device.powerSource = 'Mains (single phase)';
27
+ device.save();
24
28
  },
25
29
  },
26
30
  {
package/devices/innr.js CHANGED
@@ -1,10 +1,11 @@
1
1
  const exposes = require('../lib/exposes');
2
- const fz = {...require('../converters/fromZigbee'), legacy: require('../lib/legacy').fromZigbee};
2
+ const fz = require('../converters/fromZigbee');
3
3
  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
7
  const ea = exposes.access;
8
+ const ota = require('../lib/ota');
8
9
 
9
10
  module.exports = [
10
11
  {
@@ -591,6 +592,7 @@ module.exports = [
591
592
  // Gives UNSUPPORTED_ATTRIBUTE on reporting.readMeteringMultiplierDivisor.
592
593
  endpoint.saveClusterAttributeKeyValue('seMetering', {multiplier: 1, divisor: 100});
593
594
  },
595
+ ota: ota.zigbeeOTA,
594
596
  exposes: [e.power(), e.current(), e.voltage().withAccess(ea.STATE), e.switch(), e.energy()],
595
597
  },
596
598
  {
@@ -25,25 +25,40 @@ const buttonLookup = {
25
25
  };
26
26
 
27
27
  const ledEffects = {
28
- 'off': 0,
29
- 'solid': 1,
30
- 'fast_blink': 2,
31
- 'slow_blink': 3,
32
- 'pulse': 4,
33
- 'chase': 5,
34
- 'open_close': 6,
35
- 'small_to_big': 7,
36
- 'clear_effect': 255,
28
+ off: 0,
29
+ solid: 1,
30
+ fast_blink: 2,
31
+ slow_blink: 3,
32
+ pulse: 4,
33
+ chase: 5,
34
+ open_close: 6,
35
+ small_to_big: 7,
36
+ aurora: 8,
37
+ slow_falling: 9,
38
+ medium_falling: 10,
39
+ fast_falling: 11,
40
+ slow_rising: 12,
41
+ medium_rising: 13,
42
+ fast_rising: 14,
43
+ medium_blink: 15,
44
+ slow_chase: 16,
45
+ fast_chase: 17,
46
+ fast_siren: 18,
47
+ slow_siren: 19,
48
+ clear_effect: 255,
37
49
  };
38
50
 
39
51
  const individualLedEffects = {
40
- 'off': 0,
41
- 'solid': 1,
42
- 'fast_blink': 2,
43
- 'slow_blink': 3,
44
- 'pulse': 4,
45
- 'chase': 5,
46
- 'clear_effect': 255,
52
+ off: 0,
53
+ solid: 1,
54
+ fast_blink: 2,
55
+ slow_blink: 3,
56
+ pulse: 4,
57
+ chase: 5,
58
+ falling: 6,
59
+ rising: 7,
60
+ aurora: 8,
61
+ clear_effect: 255,
47
62
  };
48
63
 
49
64
  const UINT8 = 32;
@@ -629,8 +644,20 @@ const ATTRIBUTES = {
629
644
  dataType: BOOLEAN,
630
645
  min: 0,
631
646
  max: 1,
632
- description: 'Audible Click in On/Off mode.',
633
- values: {'Enabled (Default)': 1, 'Disabled': 0},
647
+ description:
648
+ 'In neutral on/off setups, the default is to have a clicking sound to notify you that the relay ' +
649
+ 'is open or closed. You may disable this sound by creating a, “simulated” on/off where the switch ' +
650
+ 'only will turn onto 100 or off to 0.',
651
+ values: {'Disabled (Click Sound On)': 0, 'Enabled (Click Sound Off)': 1},
652
+ displayType: 'enum',
653
+ },
654
+ doubleTapClearNotifications: {
655
+ ID: 262,
656
+ dataType: BOOLEAN,
657
+ min: 0,
658
+ max: 1,
659
+ description: 'Double-Tap the Config button to clear notifications.',
660
+ values: {'Enabled (Default)': 0, 'Disabled': 1},
634
661
  displayType: 'enum',
635
662
  },
636
663
  };
@@ -656,12 +683,11 @@ tzLocal.inovelli_vzw31sn_parameters = {
656
683
  manufacturerCode: INOVELLI,
657
684
  });
658
685
 
686
+ meta.state[key] = value;
687
+
659
688
  return {
660
689
  state: {
661
- [key]:
662
- ATTRIBUTES[key].displayType === 'enum' ?
663
- ATTRIBUTES[key].values[value] :
664
- value,
690
+ [key]: value,
665
691
  },
666
692
  };
667
693
  },
@@ -1057,12 +1083,24 @@ const exposesList = [
1057
1083
  .enum('effect', ea.SET_STATE, [
1058
1084
  'off',
1059
1085
  'solid',
1060
- 'chase',
1061
1086
  'fast_blink',
1062
1087
  'slow_blink',
1063
1088
  'pulse',
1089
+ 'chase',
1064
1090
  'open_close',
1065
1091
  'small_to_big',
1092
+ 'aurora',
1093
+ 'slow_falling',
1094
+ 'medium_falling',
1095
+ 'fast_falling',
1096
+ 'slow_rising',
1097
+ 'medium_rising',
1098
+ 'fast_rising',
1099
+ 'medium_blink',
1100
+ 'slow_chase',
1101
+ 'fast_chase',
1102
+ 'fast_siren',
1103
+ 'slow_siren',
1066
1104
  'clear_effect',
1067
1105
  ])
1068
1106
  .withDescription('Animation Effect to use for the LEDs'),
@@ -1110,6 +1148,9 @@ const exposesList = [
1110
1148
  'slow_blink',
1111
1149
  'pulse',
1112
1150
  'chase',
1151
+ 'falling',
1152
+ 'rising',
1153
+ 'aurora',
1113
1154
  'clear_effect',
1114
1155
  ])
1115
1156
  .withDescription('Animation Effect to use for the LED'),
@@ -1247,7 +1288,11 @@ module.exports = [
1247
1288
  await reporting.bind(endpoint, coordinatorEndpoint, [
1248
1289
  'seMetering',
1249
1290
  'haElectricalMeasurement',
1291
+ 'genOnOff',
1292
+ 'genLevelCtrl',
1250
1293
  ]);
1294
+ await reporting.onOff(endpoint);
1295
+
1251
1296
  // Bind for Button Event Reporting
1252
1297
  const endpoint2 = device.getEndpoint(2);
1253
1298
  await reporting.bind(endpoint2, coordinatorEndpoint, [
@@ -21,6 +21,9 @@ module.exports = [
21
21
  const endpoint = device.getEndpoint(1);
22
22
  await reporting.bind(endpoint, coordinatorEndpoint, ['genOnOff']);
23
23
  await reporting.onOff(endpoint);
24
+ // Has Unknown power source, force it here.
25
+ device.powerSource = 'Mains (single phase)';
26
+ device.save();
24
27
  },
25
28
  },
26
29
  {
@@ -68,7 +71,7 @@ module.exports = [
68
71
  model: 'AC33905',
69
72
  vendor: 'LEDVANCE',
70
73
  description: 'SMART+ spot GU10 tunable white',
71
- extend: extend.ledvance.light_onoff_brightness_colortemp_color({colorTempRange: [153, 370]}),
74
+ extend: extend.ledvance.light_onoff_brightness_colortemp({colorTempRange: [153, 370]}),
72
75
  ota: ota.ledvance,
73
76
  },
74
77
  {
@@ -87,6 +90,14 @@ module.exports = [
87
90
  extend: extend.ledvance.light_onoff_brightness_colortemp({colorTempRange: [153, 370]}),
88
91
  ota: ota.ledvance,
89
92
  },
93
+ {
94
+ zigbeeModel: ['B40S TW'],
95
+ model: 'AC33901',
96
+ vendor: 'LEDVANCE',
97
+ description: 'SMART+ Classic B40 E14 Tunable white',
98
+ extend: extend.ledvance.light_onoff_brightness_colortemp({colorTempRange: [153, 370]}),
99
+ ota: ota.ledvance,
100
+ },
90
101
  {
91
102
  zigbeeModel: ['FLEX RGBW Z3'],
92
103
  model: '4058075208339',
@@ -3,9 +3,24 @@ const fz = {...require('../converters/fromZigbee'), legacy: require('../lib/lega
3
3
  const tz = require('../converters/toZigbee');
4
4
  const reporting = require('../lib/reporting');
5
5
  const extend = require('../lib/extend');
6
+ const utils = require('../lib/utils');
6
7
  const e = exposes.presets;
7
8
  const ea = exposes.access;
8
9
 
10
+ const fzLocal = {
11
+ on_off_via_brightness: {
12
+ cluster: 'genLevelCtrl',
13
+ type: ['attributeReport', 'readResponse'],
14
+ convert: (model, msg, publish, options, meta) => {
15
+ if (msg.data.hasOwnProperty('currentLevel')) {
16
+ const currentLevel = Number(msg.data['currentLevel']);
17
+ const property = utils.postfixWithEndpointName('state', msg, model, meta);
18
+ return {[property]: currentLevel > 0 ? 'ON' : 'OFF'};
19
+ }
20
+ },
21
+ },
22
+ };
23
+
9
24
  module.exports = [
10
25
  {
11
26
  zigbeeModel: ['DL15S'],
@@ -91,21 +106,24 @@ module.exports = [
91
106
  model: 'ZS057-D0Z',
92
107
  vendor: 'Leviton',
93
108
  description: 'Wall switch, 0-10V dimmer, 120-277V, Lumina™ RF',
109
+ meta: {disableDefaultResponse: true},
94
110
  extend: extend.light_onoff_brightness({disableEffect: true, noConfigure: true}),
95
- fromZigbee: [fz.brightness, fz.identify, fz.lighting_ballast_configuration, fz.level_config],
96
- toZigbee: [tz.light_onoff_brightness, tz.ballast_config, tz.level_config],
111
+ fromZigbee: [fz.on_off, fzLocal.on_off_via_brightness, fz.lighting_ballast_configuration],
112
+ toZigbee: [tz.light_onoff_brightness, tz.ballast_config],
97
113
  exposes: [e.light_brightness(),
114
+ // Note: ballast_power_on_level used to be here, but it does't appear to work properly with this device
115
+ // If set, it's reset back to 0 when the device is turned off then back to 32 when turned on
98
116
  exposes.numeric('ballast_minimum_level', ea.ALL).withValueMin(1).withValueMax(254)
99
117
  .withDescription('Specifies the minimum brightness value'),
100
118
  exposes.numeric('ballast_maximum_level', ea.ALL).withValueMin(1).withValueMax(254)
101
- .withDescription('Specifies the maximum brightness value'),
102
- exposes.numeric('ballast_power_on_level', ea.ALL).withValueMin(1).withValueMax(254)
103
- .withDescription('Specifies the initialisation light level. Can not be set lower than "ballast_minimum_level"')],
119
+ .withDescription('Specifies the maximum brightness value')],
104
120
  configure: async (device, coordinatorEndpoint, logger) => {
105
- await extend.light_onoff_brightness().configure(device, coordinatorEndpoint, logger);
106
121
  const endpoint = device.getEndpoint(1);
107
122
  await reporting.bind(endpoint, coordinatorEndpoint, ['genOnOff', 'genLevelCtrl', 'lightingBallastCfg']);
108
- await reporting.onOff(endpoint);
123
+ // This device doesn't reliably report state changes - make it chatty to compensate for that
124
+ // This feels like a hack - hopefully there is a better fix at some point
125
+ await reporting.onOff(endpoint, {max: 5});
126
+ await reporting.brightness(endpoint, {max: 5});
109
127
  },
110
128
  },
111
129
  ];
package/devices/lidl.js CHANGED
@@ -399,27 +399,29 @@ module.exports = [
399
399
  model: 'HG08673-FR',
400
400
  vendor: 'Lidl',
401
401
  description: 'Silvercrest smart plug FR with power monitoring',
402
- ota: ota.zigbeeOTA, // Even though it's a Lidl Device it supports Tuya OTA
402
+ ota: ota.zigbeeOTA,
403
403
  fromZigbee: [fz.on_off, fzLocal.electrical_measurement_skip_duplicate, fzLocal.metering_skip_duplicate, fz.ignore_basic_report,
404
404
  fz.tuya_switch_power_outage_memory, fz.ts011f_plug_indicator_mode, fz.ts011f_plug_child_mode],
405
405
  toZigbee: [tz.on_off, tz.tuya_switch_power_outage_memory, tz.ts011f_plug_indicator_mode, tz.ts011f_plug_child_mode],
406
406
  configure: async (device, coordinatorEndpoint, logger) => {
407
407
  const endpoint = device.getEndpoint(1);
408
- await endpoint.read('genBasic', ['manufacturerName', 'zclVersion', 'appVersion', 'modelId', 'powerSource', 0xfffe]);
409
- await reporting.bind(endpoint, coordinatorEndpoint, ['genOnOff', 'haElectricalMeasurement', 'seMetering']);
408
+ await tuya.configureMagicPacket(device, coordinatorEndpoint, logger);
409
+ await reporting.bind(endpoint, coordinatorEndpoint, ['genOnOff', 'haElectricalMeasurement']);
410
410
  await reporting.rmsVoltage(endpoint, {change: 5});
411
411
  await reporting.rmsCurrent(endpoint, {change: 50});
412
412
  await reporting.activePower(endpoint, {change: 10});
413
- await reporting.currentSummDelivered(endpoint);
413
+ // Energy reporting (currentSummDelivered) doesn't work; requires polling: https://github.com/Koenkk/zigbee2mqtt/issues/14356
414
414
  endpoint.saveClusterAttributeKeyValue('haElectricalMeasurement', {acCurrentDivisor: 1000, acCurrentMultiplier: 1});
415
415
  endpoint.saveClusterAttributeKeyValue('seMetering', {divisor: 100, multiplier: 1});
416
416
  device.save();
417
417
  },
418
+ options: [exposes.options.measurement_poll_interval().withDescription('Only the energy value is polled for this device.')],
418
419
  exposes: [e.switch(), e.power(), e.current(), e.voltage().withAccess(ea.STATE),
419
420
  e.energy(), exposes.enum('power_outage_memory', ea.ALL, ['on', 'off', 'restore'])
420
421
  .withDescription('Recover state after power outage'),
421
422
  exposes.enum('indicator_mode', ea.ALL, ['off', 'off/on', 'on/off', 'on'])
422
423
  .withDescription('Plug LED indicator mode'), e.child_lock()],
424
+ onEvent: (type, data, device, options) => tuya.onEventMeasurementPoll(type, data, device, options, false, true),
423
425
  },
424
426
  {
425
427
  fingerprint: [{modelID: 'TS004F', manufacturerName: '_TZ3000_rco1yzb1'}],
@@ -50,8 +50,11 @@ module.exports = [
50
50
  onEvent: tuya.onEventSetTime,
51
51
  },
52
52
  {
53
- fingerprint: [{modelID: 'TS0502B', manufacturerName: '_TZ3210_frm6149r'},
54
- {modelID: 'TS0502B', manufacturerName: '_TZ3210_jtifm80b'}],
53
+ fingerprint: [
54
+ {modelID: 'TS0502B', manufacturerName: '_TZ3210_frm6149r'},
55
+ {modelID: 'TS0502B', manufacturerName: '_TZ3210_jtifm80b'},
56
+ {modelID: 'TS0502B', manufacturerName: '_TZ3210_xwqng7ol'},
57
+ ],
55
58
  model: 'FUT035Z',
56
59
  description: 'Dual white LED controller',
57
60
  vendor: 'Miboxer',
package/devices/moes.js CHANGED
@@ -299,7 +299,8 @@ module.exports = [
299
299
  tz.moesS_thermostat_boost_heating, tz.moesS_thermostat_boostHeatingCountdownTimeSet,
300
300
  tz.moesS_thermostat_eco_temperature, tz.moesS_thermostat_max_temperature,
301
301
  tz.moesS_thermostat_min_temperature, tz.moesS_thermostat_moesSecoMode,
302
- tz.moesS_thermostat_preset, tz.moesS_thermostat_schedule_programming],
302
+ tz.moesS_thermostat_preset, tz.moesS_thermostat_schedule_programming,
303
+ tz.moesS_thermostat_system_mode],
303
304
  exposes: [
304
305
  e.battery(), e.child_lock(), e.eco_mode(),
305
306
  e.eco_temperature().withValueMin(5), e.max_temperature().withValueMax(45), e.min_temperature().withValueMin(5),
@@ -308,7 +309,7 @@ module.exports = [
308
309
  exposes.climate()
309
310
  .withLocalTemperature(ea.STATE).withSetpoint('current_heating_setpoint', 5, 35, 1, ea.STATE_SET)
310
311
  .withLocalTemperatureCalibration(-9, 9, 1, ea.STATE_SET)
311
- .withSystemMode(['heat'], ea.STATE)
312
+ .withSystemMode(['heat'], ea.STATE_SET)
312
313
  .withRunningState(['idle', 'heat'], ea.STATE)
313
314
  .withPreset(['programming', 'manual', 'temporary_manual', 'holiday'],
314
315
  'MANUAL MODE ☝ - In this mode, the device executes manual temperature setting. '+
package/devices/nue_3a.js CHANGED
@@ -99,7 +99,7 @@ module.exports = [
99
99
  exposes: [e.action(['recall_*']), e.switch()],
100
100
  },
101
101
  {
102
- zigbeeModel: ['LXN56-DC27LX1.1', 'LXN56-DS27LX1.1'],
102
+ zigbeeModel: ['LXN56-DC27LX1.1', 'LXN56-DS27LX1.1', 'LXN56-DS27LX1.3'],
103
103
  model: 'LXZB-02A',
104
104
  vendor: 'Nue / 3A',
105
105
  description: 'Smart light controller',
@@ -159,7 +159,7 @@ module.exports = [
159
159
  },
160
160
  },
161
161
  {
162
- zigbeeModel: ['FB56+ZSC05HG1.0', 'FNB56-ZBW01LX1.2', 'LXN56-DS27LX1.3', 'LXN60-DS27LX1.3'],
162
+ zigbeeModel: ['FB56+ZSC05HG1.0', 'FNB56-ZBW01LX1.2', 'LXN60-DS27LX1.3'],
163
163
  model: 'HGZB-04D / HGZB-4D-UK',
164
164
  vendor: 'Nue / 3A',
165
165
  description: 'Smart dimmer wall switch',
@@ -1634,6 +1634,16 @@ module.exports = [
1634
1634
  ...hueExtend.light_onoff_brightness_colortemp_color({colorTempRange: [153, 500]}).exposes],
1635
1635
  extend: hueExtend.light_onoff_brightness_colortemp_color({colorTempRange: [153, 500]}),
1636
1636
  },
1637
+ {
1638
+ zigbeeModel: ['915005987601'],
1639
+ model: '915005987601',
1640
+ vendor: 'Philips',
1641
+ description: 'Hue Gradient Signe floor lamp (black)',
1642
+ toZigbee: [tzLocal.gradient_scene, ...hueExtend.light_onoff_brightness_colortemp_color({colorTempRange: [153, 500]}).toZigbee],
1643
+ exposes: [exposes.enum('gradient_scene', ea.SET, Object.keys(gradientScenes)),
1644
+ ...hueExtend.light_onoff_brightness_colortemp_color({colorTempRange: [153, 500]}).exposes],
1645
+ extend: hueExtend.light_onoff_brightness_colortemp_color({colorTempRange: [153, 500]}),
1646
+ },
1637
1647
  {
1638
1648
  zigbeeModel: ['LCT020'],
1639
1649
  model: '4080148P7',
package/devices/sinope.js CHANGED
@@ -249,7 +249,7 @@ module.exports = [
249
249
  .withFeature(exposes.numeric('r', ea.ALL))
250
250
  .withFeature(exposes.numeric('g', ea.ALL))
251
251
  .withFeature(exposes.numeric('b', ea.ALL))
252
- .withDescription('Control status LED intensity when load ON'),
252
+ .withDescription('Control status LED color when load ON'),
253
253
  exposes.composite('led_color_off', 'led_color_off')
254
254
  .withFeature(exposes.numeric('r', ea.ALL))
255
255
  .withFeature(exposes.numeric('g', ea.ALL))
@@ -280,7 +280,7 @@ module.exports = [
280
280
  .withFeature(exposes.numeric('r', ea.ALL))
281
281
  .withFeature(exposes.numeric('g', ea.ALL))
282
282
  .withFeature(exposes.numeric('b', ea.ALL))
283
- .withDescription('Control status LED intensity when load ON'),
283
+ .withDescription('Control status LED color when load ON'),
284
284
  exposes.composite('led_color_off', 'led_color_off')
285
285
  .withFeature(exposes.numeric('r', ea.ALL))
286
286
  .withFeature(exposes.numeric('g', ea.ALL))
@@ -5,7 +5,51 @@ const reporting = require('../lib/reporting');
5
5
  const e = exposes.presets;
6
6
  const constants = require('../lib/constants');
7
7
 
8
+ const fzLocal = {
9
+ power: {
10
+ cluster: 'hvacThermostat',
11
+ type: ['attributeReport', 'readResponse'],
12
+ convert: (model, msg, publish, options, meta) => {
13
+ if (msg.data.hasOwnProperty('16392')) {
14
+ return {power: msg.data['16392']};
15
+ }
16
+ },
17
+ },
18
+ energy: {
19
+ cluster: 'hvacThermostat',
20
+ type: ['attributeReport', 'readResponse'],
21
+ convert: (model, msg, publish, options, meta) => {
22
+ if (msg.data.hasOwnProperty('16393')) {
23
+ return {energy: parseFloat(msg.data['16393']) / 1000};
24
+ }
25
+ },
26
+ },
27
+ };
28
+
8
29
  module.exports = [
30
+ {
31
+ zigbeeModel: ['HT402'],
32
+ model: 'HT402',
33
+ vendor: 'Stelpro',
34
+ description: 'Hilo thermostat',
35
+ fromZigbee: [fz.stelpro_thermostat, fz.hvac_user_interface, fzLocal.power, fzLocal.energy],
36
+ toZigbee: [tz.thermostat_local_temperature, tz.thermostat_occupancy, tz.thermostat_occupied_heating_setpoint,
37
+ tz.thermostat_temperature_display_mode, tz.thermostat_keypad_lockout, tz.thermostat_system_mode,
38
+ tz.thermostat_running_state, tz.stelpro_thermostat_outdoor_temperature],
39
+ exposes: [e.local_temperature(), e.keypad_lockout(), e.power(), e.energy(),
40
+ exposes.climate().withSetpoint('occupied_heating_setpoint', 5, 30, 0.5).withLocalTemperature()
41
+ .withSystemMode(['heat']).withRunningState(['idle', 'heat'])],
42
+ configure: async (device, coordinatorEndpoint, logger) => {
43
+ const endpoint = device.getEndpoint(25);
44
+ const binds = ['genBasic', 'genIdentify', 'genGroups', 'hvacThermostat', 'hvacUserInterfaceCfg', 'msTemperatureMeasurement'];
45
+ await reporting.bind(endpoint, coordinatorEndpoint, binds);
46
+ await reporting.thermostatTemperature(endpoint);
47
+ await reporting.thermostatOccupiedHeatingSetpoint(endpoint);
48
+ await reporting.thermostatSystemMode(endpoint);
49
+ await reporting.thermostatPIHeatingDemand(endpoint);
50
+ await reporting.thermostatKeypadLockMode(endpoint);
51
+ },
52
+ },
9
53
  {
10
54
  zigbeeModel: ['ST218'],
11
55
  model: 'ST218',
package/devices/tuya.js CHANGED
@@ -840,10 +840,7 @@ module.exports = [
840
840
  return {'l1': 1, 'l2': 2};
841
841
  },
842
842
  meta: {multiEndpoint: true},
843
- configure: async (device, coordinatorEndpoint, logger) => {
844
- const endpoint = device.getEndpoint(1);
845
- await endpoint.read('genBasic', ['manufacturerName', 'zclVersion', 'appVersion', 'modelId', 'powerSource', 0xfffe]);
846
- },
843
+ configure: tuya.configureMagicPacket,
847
844
  },
848
845
  {
849
846
  fingerprint: [{modelID: 'TS011F', manufacturerName: '_TZ3000_rk2yzt0u'},
@@ -1085,10 +1082,7 @@ module.exports = [
1085
1082
  exposes.enum('sensitivity', ea.ALL, ['low', 'medium', 'high']).withDescription('PIR sensor sensitivity'),
1086
1083
  exposes.enum('keep_time', ea.ALL, [30, 60, 120]).withDescription('PIR keep time in seconds'),
1087
1084
  ],
1088
- configure: async (device, coordinatorEndpoint, logger) => {
1089
- const endpoint = device.getEndpoint(1);
1090
- await endpoint.read('genBasic', ['manufacturerName', 'zclVersion', 'appVersion', 'modelId', 'powerSource', 0xfffe]);
1091
- },
1085
+ configure: tuya.configureMagicPacket,
1092
1086
  },
1093
1087
  {
1094
1088
  fingerprint: [{modelID: 'TS0202', manufacturerName: '_TZ3040_msl6wxk9'}],
@@ -1101,10 +1095,7 @@ module.exports = [
1101
1095
  exposes.enum('sensitivity', ea.ALL, ['low', 'medium', 'high']).withDescription('PIR sensor sensitivity'),
1102
1096
  exposes.enum('keep_time', ea.ALL, [30, 60, 120]).withDescription('PIR keep time in seconds'),
1103
1097
  ],
1104
- configure: async (device, coordinatorEndpoint, logger) => {
1105
- const endpoint = device.getEndpoint(1);
1106
- await endpoint.read('genBasic', ['manufacturerName', 'zclVersion', 'appVersion', 'modelId', 'powerSource', 0xfffe]);
1107
- },
1098
+ configure: tuya.configureMagicPacket,
1108
1099
  },
1109
1100
  {
1110
1101
  fingerprint: tuya.fingerprint('TS0202', ['_TZ3000_mcxw5ehu', '_TZ3040_6ygjfyll']),
@@ -1593,10 +1584,7 @@ module.exports = [
1593
1584
  fromZigbee: [fzLocal.TS0201_battery, fz.temperature, fzLocal.TS0201_humidity],
1594
1585
  toZigbee: [],
1595
1586
  exposes: [e.battery(), e.temperature(), e.humidity(), e.battery_voltage()],
1596
- configure: async (device, coordinatorEndpoint, logger) => {
1597
- const endpoint = device.getEndpoint(1);
1598
- await endpoint.read('genBasic', ['manufacturerName', 'zclVersion', 'appVersion', 'modelId', 'powerSource', 0xfffe]);
1599
- },
1587
+ configure: tuya.configureMagicPacket,
1600
1588
  },
1601
1589
  {
1602
1590
  fingerprint: [
@@ -1611,10 +1599,7 @@ module.exports = [
1611
1599
  fromZigbee: [fzLocal.TS0201_battery, fz.temperature, fz.humidity],
1612
1600
  toZigbee: [],
1613
1601
  exposes: [e.battery(), e.temperature(), e.humidity(), e.battery_voltage()],
1614
- configure: async (device, coordinatorEndpoint, logger) => {
1615
- const endpoint = device.getEndpoint(1);
1616
- await endpoint.read('genBasic', ['manufacturerName', 'zclVersion', 'appVersion', 'modelId', 'powerSource', 0xfffe]);
1617
- },
1602
+ configure: tuya.configureMagicPacket,
1618
1603
  },
1619
1604
  {
1620
1605
  fingerprint: tuya.fingerprint('TS0201', ['_TZ3000_dowj6gyi', '_TZ3000_8ybe88nf']),
@@ -1624,10 +1609,7 @@ module.exports = [
1624
1609
  fromZigbee: [fzLocal.TS0201_battery, fz.temperature, fz.humidity],
1625
1610
  toZigbee: [],
1626
1611
  exposes: [e.battery(), e.temperature(), e.humidity(), e.battery_voltage()],
1627
- configure: async (device, coordinatorEndpoint, logger) => {
1628
- const endpoint = device.getEndpoint(1);
1629
- await endpoint.read('genBasic', ['manufacturerName', 'zclVersion', 'appVersion', 'modelId', 'powerSource', 0xfffe]);
1630
- },
1612
+ configure: tuya.configureMagicPacket,
1631
1613
  },
1632
1614
  {
1633
1615
  fingerprint: [{modelID: 'SM0201', manufacturerName: '_TYZB01_cbiezpds'}],
@@ -1653,9 +1635,8 @@ module.exports = [
1653
1635
  return {'l1': 1, 'l2': 2, 'l3': 3, 'l4': 4};
1654
1636
  },
1655
1637
  meta: {multiEndpoint: true},
1656
- configure: async (device, coordinatorEndpoint) => {
1657
- await device.getEndpoint(1).read('genBasic',
1658
- ['manufacturerName', 'zclVersion', 'appVersion', 'modelId', 'powerSource', 0xfffe]);
1638
+ configure: async (device, coordinatorEndpoint, logger) => {
1639
+ await tuya.configureMagicPacket(device, coordinatorEndpoint, logger);
1659
1640
  for (const endpointID of [1, 2, 3, 4]) {
1660
1641
  const endpoint = device.getEndpoint(endpointID);
1661
1642
  await reporting.bind(endpoint, coordinatorEndpoint, ['genOnOff']);
@@ -1793,8 +1774,8 @@ module.exports = [
1793
1774
  fromZigbee: [fz.on_off, fz.electrical_measurement, fz.metering, fz.ignore_basic_report, fz.tuya_switch_power_outage_memory],
1794
1775
  toZigbee: [tz.on_off, tz.tuya_switch_power_outage_memory],
1795
1776
  configure: async (device, coordinatorEndpoint, logger) => {
1777
+ await tuya.configureMagicPacket(device, coordinatorEndpoint, logger);
1796
1778
  const endpoint = device.getEndpoint(1);
1797
- await endpoint.read('genBasic', ['manufacturerName', 'zclVersion', 'appVersion', 'modelId', 'powerSource', 0xfffe]);
1798
1779
  await reporting.bind(endpoint, coordinatorEndpoint, ['genOnOff', 'haElectricalMeasurement', 'seMetering']);
1799
1780
  await reporting.rmsVoltage(endpoint, {change: 5});
1800
1781
  await reporting.rmsCurrent(endpoint, {change: 50});
@@ -1812,20 +1793,22 @@ module.exports = [
1812
1793
  model: 'TS000F_power',
1813
1794
  description: 'Switch with power monitoring',
1814
1795
  vendor: 'TuYa',
1815
- fromZigbee: [fz.on_off, fz.electrical_measurement, fz.metering, fz.ignore_basic_report],
1816
- toZigbee: [tz.on_off],
1796
+ fromZigbee: [fz.on_off, fz.electrical_measurement, fz.metering, fz.ignore_basic_report, fz.moes_power_on_behavior,
1797
+ fz.tuya_switch_type],
1798
+ toZigbee: [tz.on_off, tz.moes_power_on_behavior, tz.tuya_switch_type],
1817
1799
  configure: async (device, coordinatorEndpoint, logger) => {
1818
1800
  const endpoint = device.getEndpoint(1);
1819
1801
  await tuya.configureMagicPacket(device, coordinatorEndpoint, logger);
1820
- await reporting.bind(endpoint, coordinatorEndpoint, ['genOnOff', 'haElectricalMeasurement', 'seMetering']);
1802
+ await reporting.bind(endpoint, coordinatorEndpoint, ['genOnOff', 'haElectricalMeasurement']);
1821
1803
  await reporting.rmsVoltage(endpoint, {change: 5});
1822
1804
  await reporting.activePower(endpoint, {change: 10});
1823
- await reporting.currentSummDelivered(endpoint);
1824
1805
  endpoint.saveClusterAttributeKeyValue('seMetering', {divisor: 100, multiplier: 1});
1825
1806
  device.save();
1826
1807
  },
1808
+ options: [exposes.options.measurement_poll_interval().withDescription('Only the energy value is polled for this device.')],
1809
+ onEvent: (type, data, device, options) => tuya.onEventMeasurementPoll(type, data, device, options, false, true),
1827
1810
  whiteLabel: [{vendor: 'Aubess', model: 'WDH02'}],
1828
- exposes: [e.switch(), e.power(), e.voltage().withAccess(ea.STATE), e.energy()],
1811
+ exposes: [e.switch(), e.power(), e.voltage().withAccess(ea.STATE), e.energy(), e.power_on_behavior(), e.switch_type_2()],
1829
1812
  },
1830
1813
  {
1831
1814
  zigbeeModel: ['TS0001'],
@@ -1898,8 +1881,7 @@ module.exports = [
1898
1881
  },
1899
1882
  meta: {multiEndpoint: true},
1900
1883
  configure: async (device, coordinatorEndpoint, logger) => {
1901
- await device.getEndpoint(1).read('genBasic',
1902
- ['manufacturerName', 'zclVersion', 'appVersion', 'modelId', 'powerSource', 0xfffe]);
1884
+ await tuya.configureMagicPacket(device, coordinatorEndpoint, logger);
1903
1885
  await reporting.bind(device.getEndpoint(1), coordinatorEndpoint, ['genOnOff']);
1904
1886
  await reporting.bind(device.getEndpoint(2), coordinatorEndpoint, ['genOnOff']);
1905
1887
  },
@@ -1946,8 +1928,7 @@ module.exports = [
1946
1928
  },
1947
1929
  meta: {multiEndpoint: true},
1948
1930
  configure: async (device, coordinatorEndpoint, logger) => {
1949
- await device.getEndpoint(1).read('genBasic',
1950
- ['manufacturerName', 'zclVersion', 'appVersion', 'modelId', 'powerSource', 0xfffe]);
1931
+ await tuya.configureMagicPacket(device, coordinatorEndpoint, logger);
1951
1932
  await reporting.bind(device.getEndpoint(1), coordinatorEndpoint, ['genOnOff']);
1952
1933
  await reporting.bind(device.getEndpoint(2), coordinatorEndpoint, ['genOnOff']);
1953
1934
  await reporting.bind(device.getEndpoint(3), coordinatorEndpoint, ['genOnOff']);
@@ -1974,8 +1955,7 @@ module.exports = [
1974
1955
  },
1975
1956
  meta: {multiEndpoint: true},
1976
1957
  configure: async (device, coordinatorEndpoint, logger) => {
1977
- await device.getEndpoint(1).read('genBasic',
1978
- ['manufacturerName', 'zclVersion', 'appVersion', 'modelId', 'powerSource', 0xfffe]);
1958
+ await tuya.configureMagicPacket(device, coordinatorEndpoint, logger);
1979
1959
  await reporting.bind(device.getEndpoint(1), coordinatorEndpoint, ['genOnOff']);
1980
1960
  await reporting.bind(device.getEndpoint(2), coordinatorEndpoint, ['genOnOff']);
1981
1961
  await reporting.bind(device.getEndpoint(3), coordinatorEndpoint, ['genOnOff']);
@@ -2375,8 +2355,8 @@ module.exports = [
2375
2355
  fz.tuya_switch_power_outage_memory, fz.ts011f_plug_indicator_mode, fz.ts011f_plug_child_mode],
2376
2356
  toZigbee: [tz.on_off, tz.tuya_switch_power_outage_memory, tz.ts011f_plug_indicator_mode, tz.ts011f_plug_child_mode],
2377
2357
  configure: async (device, coordinatorEndpoint, logger) => {
2358
+ await tuya.configureMagicPacket(device, coordinatorEndpoint, logger);
2378
2359
  const endpoint = device.getEndpoint(1);
2379
- await endpoint.read('genBasic', ['manufacturerName', 'zclVersion', 'appVersion', 'modelId', 'powerSource', 0xfffe]);
2380
2360
  await reporting.bind(endpoint, coordinatorEndpoint, ['genOnOff', 'haElectricalMeasurement', 'seMetering']);
2381
2361
  await reporting.rmsVoltage(endpoint, {change: 5});
2382
2362
  await reporting.rmsCurrent(endpoint, {change: 50});
@@ -2429,14 +2409,8 @@ module.exports = [
2429
2409
  fz.tuya_switch_power_outage_memory, fz.ts011f_plug_indicator_mode, fz.ts011f_plug_child_mode],
2430
2410
  toZigbee: [tz.on_off, tz.tuya_switch_power_outage_memory, tz.ts011f_plug_indicator_mode, tz.ts011f_plug_child_mode],
2431
2411
  configure: async (device, coordinatorEndpoint, logger) => {
2412
+ await tuya.configureMagicPacket(device, coordinatorEndpoint, logger);
2432
2413
  const endpoint = device.getEndpoint(1);
2433
- // Enables reporting of physical state changes
2434
- // https://github.com/Koenkk/zigbee2mqtt/issues/9057#issuecomment-1007742130
2435
- try {
2436
- await endpoint.read('genBasic', ['manufacturerName', 'zclVersion', 'appVersion', 'modelId', 'powerSource', 0xfffe]);
2437
- } catch (e) {
2438
- // Sometimes can fail: https://github.com/Koenkk/zigbee2mqtt/issues/12760#issuecomment-1165435220
2439
- }
2440
2414
  endpoint.saveClusterAttributeKeyValue('haElectricalMeasurement', {acCurrentDivisor: 1000, acCurrentMultiplier: 1});
2441
2415
  endpoint.saveClusterAttributeKeyValue('seMetering', {divisor: 100, multiplier: 1});
2442
2416
  device.save();
@@ -2680,8 +2654,7 @@ module.exports = [
2680
2654
  },
2681
2655
  meta: {multiEndpoint: true},
2682
2656
  configure: async (device, coordinatorEndpoint, logger) => {
2683
- await device.getEndpoint(1).read('genBasic',
2684
- ['manufacturerName', 'zclVersion', 'appVersion', 'modelId', 'powerSource', 0xfffe]);
2657
+ await tuya.configureMagicPacket(device, coordinatorEndpoint, logger);
2685
2658
  await reporting.bind(device.getEndpoint(1), coordinatorEndpoint, ['genOnOff']);
2686
2659
  await reporting.bind(device.getEndpoint(2), coordinatorEndpoint, ['genOnOff']);
2687
2660
  device.powerSource = 'Mains (single phase)';
@@ -2734,8 +2707,7 @@ module.exports = [
2734
2707
  whiteLabel: [{vendor: 'TUYATEC', model: 'GDKES-03TZXD'}],
2735
2708
  meta: {multiEndpoint: true},
2736
2709
  configure: async (device, coordinatorEndpoint, logger) => {
2737
- await device.getEndpoint(1).read('genBasic',
2738
- ['manufacturerName', 'zclVersion', 'appVersion', 'modelId', 'powerSource', 0xfffe]);
2710
+ await tuya.configureMagicPacket(device, coordinatorEndpoint, logger);
2739
2711
  try {
2740
2712
  for (const ID of [1, 2, 3]) {
2741
2713
  const endpoint = device.getEndpoint(ID);
@@ -2856,8 +2828,7 @@ module.exports = [
2856
2828
  },
2857
2829
  meta: {multiEndpoint: true},
2858
2830
  configure: async (device, coordinatorEndpoint, logger) => {
2859
- await device.getEndpoint(1).read('genBasic',
2860
- ['manufacturerName', 'zclVersion', 'appVersion', 'modelId', 'powerSource', 0xfffe]);
2831
+ await tuya.configureMagicPacket(device, coordinatorEndpoint, logger);
2861
2832
  await reporting.bind(device.getEndpoint(1), coordinatorEndpoint, ['genOnOff']);
2862
2833
  await reporting.bind(device.getEndpoint(2), coordinatorEndpoint, ['genOnOff']);
2863
2834
  await reporting.bind(device.getEndpoint(3), coordinatorEndpoint, ['genOnOff']);
@@ -3027,10 +2998,7 @@ module.exports = [
3027
2998
  fromZigbee: [fz.battery, fz.illuminance, fzLocal.TS0222],
3028
2999
  toZigbee: [],
3029
3000
  exposes: [e.battery(), e.illuminance(), e.illuminance_lux()],
3030
- configure: async (device, coordinatorEndpoint, logger) => {
3031
- const endpoint = device.getEndpoint(1);
3032
- await endpoint.read('genBasic', ['manufacturerName', 'zclVersion', 'appVersion', 'modelId', 'powerSource', 0xfffe]);
3033
- },
3001
+ configure: tuya.configureMagicPacket,
3034
3002
  },
3035
3003
  {
3036
3004
  fingerprint: [{modelID: 'TS0210', manufacturerName: '_TYZB01_3zv6oleo'},
@@ -3132,7 +3100,7 @@ module.exports = [
3132
3100
  configure: async (device, coordinatorEndpoint, logger) => {
3133
3101
  const endpoint = device.getEndpoint(1);
3134
3102
  // Enables reporting of measurement state changes
3135
- await endpoint.read('genBasic', ['manufacturerName', 'zclVersion', 'appVersion', 'modelId', 'powerSource', 0xfffe]);
3103
+ await tuya.configureMagicPacket(device, coordinatorEndpoint, logger);
3136
3104
  await reporting.bind(endpoint, coordinatorEndpoint, ['genBasic', 'genPowerCfg',
3137
3105
  'msTemperatureMeasurement', 'msIlluminanceMeasurement', 'msRelativeHumidity', 'manuSpecificTuya_2']);
3138
3106
  },
package/lib/exposes.js CHANGED
@@ -507,7 +507,7 @@ module.exports = {
507
507
  no_position_support: () => new Binary('no_position_support', access.SET, true, false).withDescription('Set to true when your device only reports position 0, 100 and 50 (in this case your device has an older firmware) (default false).'),
508
508
  transition: () => new Numeric(`transition`, access.SET).withValueMin(0).withDescription('Controls the transition time (in seconds) of on/off, brightness, color temperature (if applicable) and color (if applicable) changes. Defaults to `0` (no transition).'),
509
509
  legacy: () => new Binary(`legacy`, access.SET, true, false).withDescription(`Set to false to disable the legacy integration (highly recommended), will change structure of the published payload (default true).`),
510
- measurement_poll_interval: () => new Numeric(`measurement_poll_interval`, access.SET).withValueMin(-1).withDescription(`This device does not support reporting electric measurements so it is polled instead. The default poll interval is 60 seconds, set to -1 to disable.`),
510
+ measurement_poll_interval: (extraNote='') => new Numeric(`measurement_poll_interval`, access.SET).withValueMin(-1).withDescription(`This device does not support reporting electric measurements so it is polled instead. The default poll interval is 60 seconds, set to -1 to disable.${extraNote}`),
511
511
  illuminance_below_threshold_check: () => new Binary(`illuminance_below_threshold_check`, access.SET, true, false).withDescription(`Set to false to also send messages when illuminance is above threshold in night mode (default true).`),
512
512
  },
513
513
  presets: {
package/lib/tuya.js CHANGED
@@ -243,7 +243,7 @@ function convertDecimalValueTo2ByteHexArray(value) {
243
243
  return [chunk1, chunk2].map((hexVal) => parseInt(hexVal, 16));
244
244
  }
245
245
 
246
- async function onEventMeasurementPoll(type, data, device, options) {
246
+ async function onEventMeasurementPoll(type, data, device, options, electricalMeasurement=true, metering=false) {
247
247
  const endpoint = device.getEndpoint(1);
248
248
  if (type === 'stop') {
249
249
  clearInterval(globalStore.getValue(device, 'interval'));
@@ -253,7 +253,12 @@ async function onEventMeasurementPoll(type, data, device, options) {
253
253
  if (seconds === -1) return;
254
254
  const interval = setInterval(async () => {
255
255
  try {
256
- await endpoint.read('haElectricalMeasurement', ['rmsVoltage', 'rmsCurrent', 'activePower']);
256
+ if (electricalMeasurement) {
257
+ await endpoint.read('haElectricalMeasurement', ['rmsVoltage', 'rmsCurrent', 'activePower']);
258
+ }
259
+ if (metering) {
260
+ await endpoint.read('seMetering', ['currentSummDelivered']);
261
+ }
257
262
  } catch (error) {/* Do nothing*/}
258
263
  }, seconds*1000);
259
264
  globalStore.putValue(device, 'interval', interval);
@@ -1170,8 +1175,18 @@ const skip = {
1170
1175
  };
1171
1176
 
1172
1177
  const configureMagicPacket = async (device, coordinatorEndpoint, logger) => {
1173
- const endpoint = device.endpoints[0];
1174
- await endpoint.read('genBasic', ['manufacturerName', 'zclVersion', 'appVersion', 'modelId', 'powerSource', 0xfffe]);
1178
+ try {
1179
+ const endpoint = device.endpoints[0];
1180
+ await endpoint.read('genBasic', ['manufacturerName', 'zclVersion', 'appVersion', 'modelId', 'powerSource', 0xfffe]);
1181
+ } catch (e) {
1182
+ // Fails for some TuYa devices with UNSUPPORTED_ATTRIBUTE, ignore that.
1183
+ // e.g. https://github.com/Koenkk/zigbee2mqtt/issues/14857
1184
+ if (e.message.includes('UNSUPPORTED_ATTRIBUTE')) {
1185
+ logger.debug('TuYa configureMagicPacket failed, ignoring...');
1186
+ } else {
1187
+ throw e;
1188
+ }
1189
+ }
1175
1190
  };
1176
1191
 
1177
1192
  const fingerprint = (modelID, manufacturerNames) => {
@@ -1231,7 +1246,7 @@ const valueConverter = {
1231
1246
  onOff: valueConverterBasic.lookup({'ON': true, 'OFF': false}),
1232
1247
  powerOnBehavior: valueConverterBasic.lookup({'off': 0, 'on': 1, 'previous': 2}),
1233
1248
  lightType: valueConverterBasic.lookup({'led': 0, 'incandescent': 1, 'halogen': 2}),
1234
- countdown: valueConverterBasic.raw,
1249
+ countdown: valueConverterBasic.raw(),
1235
1250
  scale0_254to0_1000: valueConverterBasic.scale(0, 254, 0, 1000),
1236
1251
  scale0_1to0_1000: valueConverterBasic.scale(0, 1, 0, 1000),
1237
1252
  divideBy100: valueConverterBasic.divideBy(100),
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "zigbee-herdsman-converters",
3
- "version": "14.0.661",
3
+ "version": "14.0.663",
4
4
  "description": "Collection of device converters to be used with zigbee-herdsman",
5
5
  "main": "index.js",
6
6
  "files": [