zigbee-herdsman-converters 14.0.327 → 14.0.328

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.
@@ -128,6 +128,10 @@ const converters = {
128
128
  value = value < -250 ? 0 : value;
129
129
  result[postfixWithEndpointName('abs_max_heat_setpoint_limit', msg, model)] = value;
130
130
  }
131
+ if (msg.data.hasOwnProperty('acLouverPosition')) {
132
+ result[postfixWithEndpointName('ac_louver_position', msg, model)] =
133
+ constants.thermostatAcLouverPositions[msg.data['acLouverPosition']];
134
+ }
131
135
  return result;
132
136
  },
133
137
  },
@@ -4862,7 +4866,7 @@ const converters = {
4862
4866
  }
4863
4867
  },
4864
4868
  },
4865
- xiaomi_switch_opple_basic: {
4869
+ aqara_opple: {
4866
4870
  cluster: 'aqaraOpple',
4867
4871
  type: ['attributeReport', 'readResponse'],
4868
4872
  options: [exposes.options.precision('temperature'), exposes.options.calibration('temperature')],
@@ -4872,11 +4876,9 @@ const converters = {
4872
4876
  const data = msg.data['247'];
4873
4877
  // Xiaomi struct parsing
4874
4878
  const length = data.length;
4875
- // if (meta.logger) meta.logger.debug(`${model.zigbeeModel}: Xiaomi struct: length ${length}`);
4876
4879
  for (let i=0; i < length; i++) {
4877
4880
  const index = data[i];
4878
4881
  let value = null;
4879
- // if (meta.logger) meta.logger.debug(`${model.zigbeeModel}: pos=${i}, ind=${data[i]}, vtype=${data[i+1]}`);
4880
4882
  switch (data[i+1]) {
4881
4883
  case 16:
4882
4884
  // 0x10 ZclBoolean
@@ -4936,7 +4938,11 @@ const converters = {
4936
4938
  default:
4937
4939
  if (meta.logger) meta.logger.debug(`${model.zigbeeModel}: unknown vtype=${data[i+1]}, pos=${i+1}`);
4938
4940
  }
4939
- if (index === 3) payload.temperature = calibrateAndPrecisionRoundOptions(value, options, 'temperature'); // 0x03
4941
+
4942
+ if (index == 1) {
4943
+ payload.voltage = value;
4944
+ payload.battery = batteryVoltageToPercentage(value, '3V_2100');
4945
+ } else if (index === 3) payload.temperature = calibrateAndPrecisionRoundOptions(value, options, 'temperature'); // 0x03
4940
4946
  else if (index === 100) payload.state = value === 1 ? 'ON' : 'OFF'; // 0x64
4941
4947
  else if (index === 149) {
4942
4948
  payload.energy = precisionRound(value, 2); // 0x95
@@ -4948,34 +4954,26 @@ const converters = {
4948
4954
  else if (meta.logger) meta.logger.debug(`${model.zigbeeModel}: unknown index ${index} with value ${value}`);
4949
4955
  }
4950
4956
  }
4951
- if (msg.data.hasOwnProperty('4')) {
4952
- const lookup = {4: 'anti_flicker_mode', 1: 'quick_mode'};
4953
- payload.mode_switch = lookup[msg.data['4']];
4954
- }
4955
- if (msg.data.hasOwnProperty('10')) {
4956
- const lookup = {1: 'toggle', 2: 'momentary'};
4957
- payload.switch_type = lookup[msg.data['10']];
4958
- }
4957
+
4958
+ if (msg.data.hasOwnProperty('0')) payload.detection_period = msg.data['0'];
4959
+ if (msg.data.hasOwnProperty('4')) payload.mode_switch = {4: 'anti_flicker_mode', 1: 'quick_mode'}[msg.data['4']];
4960
+ if (msg.data.hasOwnProperty('10')) payload.switch_type = {1: 'toggle', 2: 'momentary'}[msg.data['10']];
4961
+ if (msg.data.hasOwnProperty('268')) payload.motion_sensitivity = {1: 'low', 2: 'medium', 3: 'high'}[msg.data['268']];
4959
4962
  if (msg.data.hasOwnProperty('512')) {
4960
4963
  if (['ZNCZ15LM', 'QBCZ14LM', 'QBCZ15LM'].includes(model.model)) {
4961
4964
  payload.button_lock = msg.data['512'] === 1 ? 'OFF' : 'ON';
4962
4965
  } else {
4963
- const mappingMode = {
4964
- 0x01: 'control_relay',
4965
- 0x00: 'decoupled',
4966
- };
4967
- const mode = mappingMode[msg.data['512']];
4968
- const payload = {};
4966
+ const mode = {0x01: 'control_relay', 0x00: 'decoupled'}[msg.data['512']];
4969
4967
  payload[postfixWithEndpointName('operation_mode', msg, model)] = mode;
4970
- return payload;
4971
4968
  }
4972
4969
  }
4973
- if (msg.data.hasOwnProperty('513')) payload.power_outage_memory = msg.data['513'] === 1; // 0x0201
4974
- if (msg.data.hasOwnProperty('514')) payload.auto_off = msg.data['514'] === 1; // 0x0202
4975
- if (msg.data.hasOwnProperty('515')) payload.led_disabled_night = msg.data['515'] === 1; // 0x0203
4976
- if (msg.data.hasOwnProperty('519')) payload.consumer_connected = msg.data['519'] === 1; // 0x0207
4977
- if (msg.data.hasOwnProperty('523')) payload.overload_protection = precisionRound(msg.data['523'], 2); // 0x020B
4978
- if (msg.data.hasOwnProperty('550')) payload.button_switch_mode = msg.data['550'] === 1 ? 'relay_and_usb' : 'relay'; // 0x0226
4970
+ if (msg.data.hasOwnProperty('513')) payload.power_outage_memory = msg.data['513'] === 1;
4971
+ if (msg.data.hasOwnProperty('514')) payload.auto_off = msg.data['514'] === 1;
4972
+ if (msg.data.hasOwnProperty('515')) payload.led_disabled_night = msg.data['515'] === 1;
4973
+ if (msg.data.hasOwnProperty('519')) payload.consumer_connected = msg.data['519'] === 1;
4974
+ if (msg.data.hasOwnProperty('523')) payload.overload_protection = precisionRound(msg.data['523'], 2);
4975
+ if (msg.data.hasOwnProperty('550')) payload.button_switch_mode = msg.data['550'] === 1 ? 'relay_and_usb' : 'relay';
4976
+ if (msg.data['mode'] !== undefined) payload.operation_mode = ['command', 'event'][msg.data['mode']];
4979
4977
  return payload;
4980
4978
  },
4981
4979
  },
@@ -5047,11 +5045,11 @@ const converters = {
5047
5045
  let buttonLookup = null;
5048
5046
  if (['WXKG02LM_rev2', 'WXKG07LM', 'WXKG17LM'].includes(model.model)) buttonLookup = {1: 'left', 2: 'right', 3: 'both'};
5049
5047
  if (['QBKG12LM', 'QBKG24LM'].includes(model.model)) buttonLookup = {5: 'left', 6: 'right', 7: 'both'};
5050
- if (['QBKG25LM', 'QBKG26LM'].includes(model.model)) buttonLookup = {41: 'left', 42: 'center', 43: 'right'};
5048
+ if (['QBKG25LM'].includes(model.model)) buttonLookup = {41: 'left', 42: 'center', 43: 'right'};
5051
5049
  if (['QBKG39LM', 'QBKG41LM', 'WS-EUK02', 'WS-EUK04', 'QBKG20LM', 'QBKG31LM'].includes(model.model)) {
5052
5050
  buttonLookup = {41: 'left', 42: 'right', 51: 'both'};
5053
5051
  }
5054
- if (['QBKG34LM'].includes(model.model)) {
5052
+ if (['QBKG26LM', 'QBKG34LM'].includes(model.model)) {
5055
5053
  buttonLookup = {
5056
5054
  41: 'left', 42: 'center', 43: 'right',
5057
5055
  51: 'left_center', 52: 'left_right', 53: 'center_right',
@@ -5415,23 +5413,6 @@ const converters = {
5415
5413
  return payload;
5416
5414
  },
5417
5415
  },
5418
- xiaomi_operation_mode_opple: {
5419
- cluster: 'aqaraOpple',
5420
- type: ['attributeReport', 'readResponse'],
5421
- convert: (model, msg, publish, options, meta) => {
5422
- if (!msg.data.hasOwnProperty('512')) {
5423
- return;
5424
- }
5425
- const mappingMode = {
5426
- 0x01: 'control_relay',
5427
- 0x00: 'decoupled',
5428
- };
5429
- const mode = mappingMode[msg.data['512']];
5430
- const payload = {};
5431
- payload[postfixWithEndpointName('operation_mode', msg, model)] = mode;
5432
- return payload;
5433
- },
5434
- },
5435
5416
  qlwz_letv8key_switch: {
5436
5417
  cluster: 'genMultistateInput',
5437
5418
  type: ['attributeReport', 'readResponse'],
@@ -5445,27 +5426,6 @@ const converters = {
5445
5426
  }
5446
5427
  },
5447
5428
  },
5448
- aqara_opple_report: {
5449
- cluster: 'aqaraOpple',
5450
- type: ['attributeReport', 'readResponse'],
5451
- convert: (model, msg, publish, options, meta) => {
5452
- // it is like xiaomi_battery_3v, but not parsed
5453
- // https://github.com/Koenkk/zigbee-herdsman/blob/master/src/zcl/buffaloZcl.ts#L93
5454
- // data: { '247': <Buffer 01 21 b8 0b 03 28 19 04 21 a8 13 05 21 44 01 06 24 02
5455
- // 00 00 00 00 08 21 11 01 0a 21 00 00 0c 20 01 64 10 00> }
5456
- if (msg.data['247']) {
5457
- const voltage = msg.data['247'][2] + msg.data['247'][3]*256;
5458
- if (voltage) {
5459
- return {battery: batteryVoltageToPercentage(voltage, '3V_2100'), voltage: voltage};
5460
- }
5461
- }
5462
-
5463
- if (msg.data['mode'] !== undefined) {
5464
- const lookup = ['command', 'event'];
5465
- return {operation_mode: lookup[msg.data['mode']]};
5466
- }
5467
- },
5468
- },
5469
5429
  aqara_opple_multistate: {
5470
5430
  cluster: 'genMultistateInput',
5471
5431
  type: ['attributeReport', 'readResponse'],
@@ -5576,26 +5536,6 @@ const converters = {
5576
5536
  return result;
5577
5537
  },
5578
5538
  },
5579
- xiaomi_switch_type: {
5580
- cluster: 'aqaraOpple',
5581
- type: ['attributeReport', 'readResponse'],
5582
- convert: (model, msg, publish, options, meta) => {
5583
- if (msg.data.hasOwnProperty(0x000A)) {
5584
- const lookup = {1: 'toggle', 2: 'momentary'};
5585
- return {switch_type: lookup[msg.data[0x000A]]};
5586
- }
5587
- },
5588
- },
5589
- xiaomi_switch_power_outage_memory: {
5590
- cluster: 'aqaraOpple',
5591
- type: ['attributeReport', 'readResponse'],
5592
- convert: (model, msg, publish, options, meta) => {
5593
- if (msg.data.hasOwnProperty(0x0201)) {
5594
- const lookup = [false, true];
5595
- return {power_outage_memory: lookup[msg.data[0x0201]]};
5596
- }
5597
- },
5598
- },
5599
5539
  keen_home_smart_vent_pressure: {
5600
5540
  cluster: 'msPressureMeasurement',
5601
5541
  type: ['attributeReport', 'readResponse'],
@@ -6489,16 +6429,6 @@ const converters = {
6489
6429
  }
6490
6430
  },
6491
6431
  },
6492
- RTCGQ13LM_motion_sensitivity: {
6493
- cluster: 'aqaraOpple',
6494
- type: ['attributeReport', 'readResponse'],
6495
- convert: (model, msg, publish, options, meta) => {
6496
- if (msg.data.hasOwnProperty(0x010c)) {
6497
- const lookup = {1: 'low', 2: 'medium', 3: 'high'};
6498
- return {motion_sensitivity: lookup[msg.data[0x010c]]};
6499
- }
6500
- },
6501
- },
6502
6432
  CCTSwitch_D0001_levelctrl: {
6503
6433
  cluster: 'genLevelCtrl',
6504
6434
  options: [exposes.options.legacy()],
@@ -7226,15 +7156,6 @@ const converters = {
7226
7156
  return {voc: msg.data.presentValue};
7227
7157
  },
7228
7158
  },
7229
- GZCGQ11LM_detection_period: {
7230
- cluster: 'aqaraOpple',
7231
- type: ['attributeReport', 'readResponse'],
7232
- convert: (model, msg, publish, options, meta) => {
7233
- if (msg.data.hasOwnProperty(0x0000)) {
7234
- return {detection_period: msg.data[0x0000]};
7235
- }
7236
- },
7237
- },
7238
7159
  heiman_doorbell_button: {
7239
7160
  cluster: 'ssIasZone',
7240
7161
  type: 'commandStatusChangeNotification',
@@ -1364,6 +1364,20 @@ const converters = {
1364
1364
  await entity.read('hvacThermostat', ['maxHeatSetpointLimit']);
1365
1365
  },
1366
1366
  },
1367
+ thermostat_ac_louver_position: {
1368
+ key: ['ac_louver_position'],
1369
+ convertSet: async (entity, key, value, meta) => {
1370
+ let acLouverPosition = utils.getKey(constants.thermostatAcLouverPositions, value, undefined, Number);
1371
+ if (acLouverPosition === undefined) {
1372
+ acLouverPosition = utils.getKey(constants.thermostatAcLouverPositions, value, value, Number);
1373
+ }
1374
+ await entity.write('hvacThermostat', {acLouverPosition});
1375
+ return {state: {ac_louver_position: value}};
1376
+ },
1377
+ convertGet: async (entity, key, meta) => {
1378
+ await entity.read('hvacThermostat', ['acLouverPosition']);
1379
+ },
1380
+ },
1367
1381
  electrical_measurement_power: {
1368
1382
  key: ['power'],
1369
1383
  convertGet: async (entity, key, meta) => {
@@ -1,10 +1,29 @@
1
1
  const exposes = require('../lib/exposes');
2
2
  const fz = {...require('../converters/fromZigbee'), legacy: require('../lib/legacy').fromZigbee};
3
+ const tz = require('../converters/toZigbee');
3
4
  const reporting = require('../lib/reporting');
4
5
  const extend = require('../lib/extend');
5
6
  const e = exposes.presets;
6
7
 
7
8
  module.exports = [
9
+ {
10
+ zigbeeModel: ['AD-SmartPlug3001'],
11
+ model: '81848',
12
+ vendor: 'AduroSmart',
13
+ description: 'ERIA smart plug (with power measurements)',
14
+ fromZigbee: [fz.on_off, fz.electrical_measurement],
15
+ toZigbee: [tz.on_off],
16
+ exposes: [e.switch(), e.power(), e.current(), e.voltage()],
17
+ configure: async (device, coordinatorEndpoint, logger) => {
18
+ const endpoint = device.getEndpoint(1);
19
+ await reporting.bind(endpoint, coordinatorEndpoint, ['genOnOff', 'haElectricalMeasurement']);
20
+ await reporting.onOff(endpoint);
21
+ await reporting.readEletricalMeasurementMultiplierDivisors(endpoint);
22
+ await reporting.rmsVoltage(endpoint);
23
+ await reporting.rmsCurrent(endpoint);
24
+ await reporting.activePower(endpoint);
25
+ },
26
+ },
8
27
  {
9
28
  zigbeeModel: ['ZLL-ExtendedColo', 'ZLL-ExtendedColor', 'AD-RGBW3001'],
10
29
  model: '81809/81813',
package/devices/owon.js CHANGED
@@ -59,4 +59,28 @@ module.exports = [
59
59
  device.save();
60
60
  },
61
61
  },
62
+ {
63
+ zigbeeModel: ['AC201'],
64
+ model: 'AC201',
65
+ vendor: 'OWON',
66
+ description: 'HVAC controller/IR blaster',
67
+ fromZigbee: [fz.fan, fz.thermostat],
68
+ toZigbee: [tz.fan_mode, tz.thermostat_system_mode, tz.thermostat_occupied_heating_setpoint,
69
+ tz.thermostat_occupied_cooling_setpoint, tz.thermostat_ac_louver_position, tz.thermostat_local_temperature],
70
+ exposes: [exposes.climate().withSystemMode(['off', 'heat', 'cool', 'auto', 'dry', 'fan_only'])
71
+ .withSetpoint('occupied_heating_setpoint', 8, 30, 1).withSetpoint('occupied_cooling_setpoint', 8, 30, 1)
72
+ .withAcLouverPosition(['fully_open', 'fully_closed', 'half_open', 'quarter_open', 'three_quarters_open'])
73
+ .withLocalTemperature(), e.fan().withModes(['low', 'medium', 'high', 'on', 'auto'])],
74
+ configure: async (device, coordinatorEndpoint, logger) => {
75
+ const endpoint = device.getEndpoint(1);
76
+ await reporting.bind(endpoint, coordinatorEndpoint, ['hvacFanCtrl']);
77
+ await reporting.fanMode(endpoint);
78
+ await reporting.bind(endpoint, coordinatorEndpoint, ['hvacThermostat']);
79
+ await reporting.thermostatOccupiedHeatingSetpoint(endpoint);
80
+ await reporting.thermostatOccupiedHeatingSetpoint(endpoint);
81
+ await reporting.thermostatTemperature(endpoint, {min: 60, max: 600, change: 0.1});
82
+ await reporting.thermostatSystemMode(endpoint);
83
+ await reporting.thermostatAcLouverPosition(endpoint);
84
+ },
85
+ },
62
86
  ];
@@ -252,10 +252,10 @@ module.exports = [
252
252
  ota: ota.zigbeeOTA,
253
253
  },
254
254
  {
255
- zigbeeModel: ['4090330P9_01', '4090330P9_02'],
255
+ zigbeeModel: ['4090330P9_01', '4090330P9_02', '929003052501_01', '929003052501_02'],
256
256
  model: '4090330P9',
257
257
  vendor: 'Philips',
258
- description: 'Hue Ensis',
258
+ description: 'Hue Ensis (black)',
259
259
  meta: {turnsOffAtBrightness1: true},
260
260
  extend: hueExtend.light_onoff_brightness_colortemp_color({colorTempRange: [153, 500]}),
261
261
  ota: ota.zigbeeOTA,
@@ -1887,7 +1887,7 @@ module.exports = [
1887
1887
  ota: ota.zigbeeOTA,
1888
1888
  },
1889
1889
  {
1890
- zigbeeModel: ['LOM003'],
1890
+ zigbeeModel: ['LOM003', 'LOM009'],
1891
1891
  model: '8718699689308',
1892
1892
  vendor: 'Philips',
1893
1893
  description: 'Hue smart plug - UK',
@@ -1942,6 +1942,20 @@ module.exports = [
1942
1942
  },
1943
1943
  ota: ota.zigbeeOTA,
1944
1944
  },
1945
+ {
1946
+ zigbeeModel: ['LOM008'],
1947
+ model: '9290030509',
1948
+ vendor: 'Philips',
1949
+ description: 'Hue smart plug - EU',
1950
+ extend: extend.switch(),
1951
+ toZigbee: [tz.on_off].concat([tz.hue_power_on_behavior, tz.hue_power_on_error]),
1952
+ configure: async (device, coordinatorEndpoint, logger) => {
1953
+ const endpoint = device.getEndpoint(11);
1954
+ await reporting.bind(endpoint, coordinatorEndpoint, ['genOnOff']);
1955
+ await reporting.onOff(endpoint);
1956
+ },
1957
+ ota: ota.zigbeeOTA,
1958
+ },
1945
1959
  {
1946
1960
  zigbeeModel: ['LLC014'],
1947
1961
  model: '7099860PH',
package/devices/tuya.js CHANGED
@@ -977,6 +977,8 @@ module.exports = [
977
977
  {modelID: 'TS011F', manufacturerName: '_TZ3000_dpo1ysak', applicationVersion: 68},
978
978
  {modelID: 'TS011F', manufacturerName: '_TZ3000_cphmq0q7', applicationVersion: 68},
979
979
  {modelID: 'TS011F', manufacturerName: '_TZ3000_5f43h46b', applicationVersion: 68},
980
+ {modelID: 'TS011F', manufacturerName: '_TZ3000_ps3dmato', applicationVersion: 69},
981
+ {modelID: 'TS011F', manufacturerName: '_TZ3000_w0qqde0g', applicationVersion: 68},
980
982
  ],
981
983
  model: 'TS011F_plug_3',
982
984
  description: 'Smart plug (with power monitoring by polling)',
package/devices/xiaomi.js CHANGED
@@ -45,7 +45,7 @@ module.exports = [
45
45
  model: 'MCCGQ14LM',
46
46
  vendor: 'Xiaomi',
47
47
  description: 'Aqara E1 door & window contact sensor',
48
- fromZigbee: [fz.ias_contact_alarm_1, fz.aqara_opple_report],
48
+ fromZigbee: [fz.ias_contact_alarm_1, fz.aqara_opple],
49
49
  toZigbee: [],
50
50
  exposes: [e.contact(), e.battery(), e.battery_voltage()],
51
51
  },
@@ -294,7 +294,7 @@ module.exports = [
294
294
  .withDescription('Decoupled mode for left button').withEndpoint('left'),
295
295
  exposes.enum('operation_mode', ea.ALL, ['control_relay', 'decoupled'])
296
296
  .withDescription('Decoupled mode for right button').withEndpoint('right')],
297
- fromZigbee: [fz.on_off, fz.xiaomi_power, fz.xiaomi_operation_mode_opple, fz.xiaomi_multistate_action],
297
+ fromZigbee: [fz.on_off, fz.xiaomi_power, fz.aqara_opple, fz.xiaomi_multistate_action],
298
298
  toZigbee: [tz.on_off, tz.xiaomi_power, tz.xiaomi_switch_operation_mode_opple, tz.xiaomi_switch_power_outage_memory],
299
299
  meta: {multiEndpoint: true},
300
300
  endpoint: (device) => {
@@ -311,7 +311,7 @@ module.exports = [
311
311
  model: 'WS-EUK01',
312
312
  vendor: 'Xiaomi',
313
313
  description: 'Aqara smart wall switch H1 EU (no neutral, single rocker)',
314
- fromZigbee: [fz.on_off, fz.xiaomi_multistate_action, fz.xiaomi_switch_opple_basic],
314
+ fromZigbee: [fz.on_off, fz.xiaomi_multistate_action, fz.aqara_opple],
315
315
  toZigbee: [tz.on_off, tz.xiaomi_switch_operation_mode_opple, tz.xiaomi_switch_power_outage_memory],
316
316
  exposes: [e.switch(), e.action(['single', 'double']), e.power_outage_memory(),
317
317
  exposes.enum('operation_mode', ea.ALL, ['control_relay', 'decoupled']).withDescription('Decoupled mode')],
@@ -328,8 +328,7 @@ module.exports = [
328
328
  model: 'WS-EUK02',
329
329
  vendor: 'Xiaomi',
330
330
  description: 'Aqara smart wall switch H1 EU (no neutral, double rocker)',
331
- fromZigbee: [fz.on_off, fz.xiaomi_multistate_action, fz.xiaomi_switch_opple_basic,
332
- fz.xiaomi_operation_mode_opple],
331
+ fromZigbee: [fz.on_off, fz.xiaomi_multistate_action, fz.aqara_opple],
333
332
  toZigbee: [tz.on_off, tz.xiaomi_switch_operation_mode_opple, tz.xiaomi_switch_power_outage_memory],
334
333
  meta: {multiEndpoint: true},
335
334
  endpoint: (_device) => {
@@ -354,7 +353,7 @@ module.exports = [
354
353
  model: 'WS-EUK03',
355
354
  vendor: 'Xiaomi',
356
355
  description: 'Aqara smart wall switch H1 EU (with neutral, single rocker)',
357
- fromZigbee: [fz.on_off, fz.xiaomi_power, fz.xiaomi_multistate_action, fz.xiaomi_switch_opple_basic, fz.xiaomi_operation_mode_opple],
356
+ fromZigbee: [fz.on_off, fz.xiaomi_power, fz.xiaomi_multistate_action, fz.aqara_opple],
358
357
  toZigbee: [tz.on_off, tz.xiaomi_power, tz.xiaomi_switch_operation_mode_opple, tz.xiaomi_switch_power_outage_memory],
359
358
  exposes: [e.switch(), e.action(['single', 'double']), e.power().withAccess(ea.STATE_GET), e.energy(),
360
359
  e.power_outage_memory(), e.temperature().withAccess(ea.STATE),
@@ -372,7 +371,7 @@ module.exports = [
372
371
  model: 'WS-EUK04',
373
372
  vendor: 'Xiaomi',
374
373
  description: 'Aqara smart wall switch H1 EU (with neutral, double rocker)',
375
- fromZigbee: [fz.on_off, fz.xiaomi_power, fz.xiaomi_multistate_action, fz.xiaomi_switch_opple_basic, fz.xiaomi_operation_mode_opple],
374
+ fromZigbee: [fz.on_off, fz.xiaomi_power, fz.xiaomi_multistate_action, fz.aqara_opple],
376
375
  toZigbee: [tz.on_off, tz.xiaomi_power, tz.xiaomi_switch_operation_mode_opple, tz.xiaomi_switch_power_outage_memory],
377
376
  meta: {multiEndpoint: true},
378
377
  endpoint: (device) => {
@@ -576,7 +575,7 @@ module.exports = [
576
575
  model: 'QBKG25LM',
577
576
  vendor: 'Xiaomi',
578
577
  description: 'Aqara D1 3 gang smart wall switch (no neutral wire)',
579
- fromZigbee: [fz.on_off, fz.legacy.QBKG25LM_click, fz.xiaomi_operation_mode_opple, fz.xiaomi_switch_opple_basic],
578
+ fromZigbee: [fz.on_off, fz.legacy.QBKG25LM_click, fz.aqara_opple],
580
579
  toZigbee: [tz.on_off, tz.xiaomi_switch_operation_mode_opple, tz.xiaomi_switch_power_outage_memory, tz.xiaomi_led_disabled_night,
581
580
  tz.aqara_switch_mode_switch],
582
581
  meta: {multiEndpoint: true},
@@ -631,9 +630,11 @@ module.exports = [
631
630
  e.power().withAccess(ea.STATE), e.action([
632
631
  'hold_left', 'single_left', 'double_left', 'triple_left', 'release_left',
633
632
  'hold_center', 'single_center', 'double_center', 'triple_center', 'release_center',
634
- 'hold_right', 'single_right', 'double_right', 'triple_right', 'release_right']),
633
+ 'hold_right', 'single_right', 'double_right', 'triple_right', 'release_right',
634
+ 'single_left_center', 'double_left_center', 'single_left_right', 'double_left_right',
635
+ 'single_center_right', 'double_center_right', 'single_all', 'double_all']),
635
636
  ],
636
- fromZigbee: [fz.on_off, fz.xiaomi_operation_mode_opple, fz.xiaomi_multistate_action, fz.xiaomi_power],
637
+ fromZigbee: [fz.on_off, fz.aqara_opple, fz.xiaomi_multistate_action, fz.xiaomi_power],
637
638
  toZigbee: [tz.on_off, tz.xiaomi_switch_operation_mode_opple],
638
639
  meta: {multiEndpoint: true},
639
640
  endpoint: (device) => {
@@ -703,7 +704,7 @@ module.exports = [
703
704
  model: 'QBKG19LM',
704
705
  vendor: 'Xiaomi',
705
706
  description: 'Aqara smart wall switch T1 (with neutral, single rocker)',
706
- fromZigbee: [fz.on_off, fz.xiaomi_power, fz.xiaomi_multistate_action, fz.xiaomi_switch_opple_basic],
707
+ fromZigbee: [fz.on_off, fz.xiaomi_power, fz.xiaomi_multistate_action, fz.aqara_opple],
707
708
  toZigbee: [tz.on_off, tz.xiaomi_switch_operation_mode_opple, tz.xiaomi_switch_power_outage_memory,
708
709
  tz.xiaomi_led_disabled_night],
709
710
  exposes: [
@@ -724,7 +725,7 @@ module.exports = [
724
725
  model: 'QBKG20LM',
725
726
  vendor: 'Xiaomi',
726
727
  description: 'Aqara smart wall switch T1 (with neutral, double rocker)',
727
- fromZigbee: [fz.on_off, fz.xiaomi_power, fz.xiaomi_multistate_action, fz.xiaomi_switch_opple_basic],
728
+ fromZigbee: [fz.on_off, fz.xiaomi_power, fz.xiaomi_multistate_action, fz.aqara_opple],
728
729
  toZigbee: [tz.on_off, tz.xiaomi_switch_operation_mode_opple, tz.xiaomi_switch_power_outage_memory,
729
730
  tz.xiaomi_led_disabled_night],
730
731
  meta: {multiEndpoint: true},
@@ -755,7 +756,7 @@ module.exports = [
755
756
  model: 'QBKG34LM',
756
757
  vendor: 'Xiaomi',
757
758
  description: 'Aqara smart wall switch T1 (with neutral, three rocker)',
758
- fromZigbee: [fz.on_off, fz.xiaomi_power, fz.xiaomi_multistate_action, fz.xiaomi_switch_opple_basic],
759
+ fromZigbee: [fz.on_off, fz.xiaomi_power, fz.xiaomi_multistate_action, fz.aqara_opple],
759
760
  toZigbee: [tz.on_off, tz.xiaomi_switch_operation_mode_opple, tz.xiaomi_switch_power_outage_memory,
760
761
  tz.xiaomi_led_disabled_night],
761
762
  meta: {multiEndpoint: true},
@@ -870,7 +871,7 @@ module.exports = [
870
871
  model: 'RTCGQ13LM',
871
872
  vendor: 'Xiaomi',
872
873
  description: 'Aqara high precision motion sensor',
873
- fromZigbee: [fz.occupancy, fz.occupancy_timeout, fz.RTCGQ13LM_motion_sensitivity, fz.battery],
874
+ fromZigbee: [fz.occupancy, fz.occupancy_timeout, fz.aqara_opple, fz.battery],
874
875
  toZigbee: [tz.occupancy_timeout, tz.RTCGQ13LM_motion_sensitivity],
875
876
  exposes: [e.occupancy(), exposes.enum('motion_sensitivity', exposes.access.ALL, ['low', 'medium', 'high']),
876
877
  exposes.numeric('occupancy_timeout', exposes.access.ALL).withValueMin(0).withValueMax(65535).withUnit('s')
@@ -963,7 +964,7 @@ module.exports = [
963
964
  model: 'ZNCZ04LM',
964
965
  description: 'Mi power plug ZigBee EU',
965
966
  vendor: 'Xiaomi',
966
- fromZigbee: [fz.on_off, fz.xiaomi_power, fz.xiaomi_switch_opple_basic, fz.ignore_occupancy_report, fz.ignore_illuminance_report,
967
+ fromZigbee: [fz.on_off, fz.xiaomi_power, fz.aqara_opple, fz.ignore_occupancy_report, fz.ignore_illuminance_report,
967
968
  fz.ignore_time_read],
968
969
  toZigbee: [tz.on_off, tz.xiaomi_power, tz.xiaomi_switch_power_outage_memory, tz.xiaomi_auto_off, tz.xiaomi_led_disabled_night,
969
970
  tz.xiaomi_overload_protection],
@@ -992,7 +993,7 @@ module.exports = [
992
993
  description: 'Aqara EU smart plug',
993
994
  vendor: 'Xiaomi',
994
995
  fromZigbee: [fz.on_off, fz.xiaomi_switch_basic, fz.electrical_measurement, fz.metering,
995
- fz.xiaomi_switch_opple_basic, fz.xiaomi_power, fz.device_temperature],
996
+ fz.aqara_opple, fz.xiaomi_power, fz.device_temperature],
996
997
  toZigbee: [tz.on_off],
997
998
  configure: async (device, coordinatorEndpoint, logger) => {
998
999
  const endpoint = device.getEndpoint(1);
@@ -1280,7 +1281,7 @@ module.exports = [
1280
1281
  model: 'WXCJKG11LM',
1281
1282
  vendor: 'Xiaomi',
1282
1283
  description: 'Aqara Opple switch 1 band',
1283
- fromZigbee: [fz.aqara_opple_on, fz.aqara_opple_off, fz.battery, fz.aqara_opple_multistate, fz.aqara_opple_report],
1284
+ fromZigbee: [fz.aqara_opple_on, fz.aqara_opple_off, fz.battery, fz.aqara_opple_multistate, fz.aqara_opple],
1284
1285
  exposes: [e.battery(), e.action([
1285
1286
  'button_1_hold', 'button_1_release', 'button_1_single', 'button_1_double', 'button_1_triple',
1286
1287
  'button_2_hold', 'button_2_release', 'button_2_single', 'button_2_double', 'button_2_triple',
@@ -1300,7 +1301,7 @@ module.exports = [
1300
1301
  vendor: 'Xiaomi',
1301
1302
  description: 'Aqara Opple switch 2 bands',
1302
1303
  fromZigbee: [fz.aqara_opple_on, fz.aqara_opple_off, fz.aqara_opple_step, fz.aqara_opple_step_color_temp, fz.battery,
1303
- fz.aqara_opple_multistate, fz.aqara_opple_report],
1304
+ fz.aqara_opple_multistate, fz.aqara_opple],
1304
1305
  exposes: [e.battery(), e.action([
1305
1306
  'button_1_hold', 'button_1_release', 'button_1_single', 'button_1_double', 'button_1_triple',
1306
1307
  'button_2_hold', 'button_2_release', 'button_2_single', 'button_2_double', 'button_2_triple',
@@ -1324,7 +1325,7 @@ module.exports = [
1324
1325
  vendor: 'Xiaomi',
1325
1326
  description: 'Aqara Opple switch 3 bands',
1326
1327
  fromZigbee: [fz.aqara_opple_on, fz.aqara_opple_off, fz.aqara_opple_step, fz.aqara_opple_move, fz.aqara_opple_stop,
1327
- fz.aqara_opple_step_color_temp, fz.aqara_opple_move_color_temp, fz.battery, fz.aqara_opple_multistate, fz.aqara_opple_report],
1328
+ fz.aqara_opple_step_color_temp, fz.aqara_opple_move_color_temp, fz.battery, fz.aqara_opple_multistate, fz.aqara_opple],
1328
1329
  exposes: [e.battery(), e.action([
1329
1330
  'button_1_hold', 'button_1_release', 'button_1_single', 'button_1_double', 'button_1_triple',
1330
1331
  'button_2_hold', 'button_2_release', 'button_2_single', 'button_2_double', 'button_2_triple',
@@ -1379,8 +1380,7 @@ module.exports = [
1379
1380
  model: 'SSM-U01',
1380
1381
  vendor: 'Xiaomi',
1381
1382
  description: 'Aqara single switch module T1 (with neutral)',
1382
- fromZigbee: [fz.on_off, fz.metering, fz.electrical_measurement, fz.device_temperature, fz.xiaomi_switch_type,
1383
- fz.xiaomi_switch_power_outage_memory],
1383
+ fromZigbee: [fz.on_off, fz.metering, fz.electrical_measurement, fz.device_temperature, fz.aqara_opple],
1384
1384
  exposes: [e.switch(), e.energy(), e.power(), e.device_temperature(), e.power_outage_memory(), e.switch_type()],
1385
1385
  toZigbee: [tz.xiaomi_switch_type, tz.on_off, tz.xiaomi_switch_power_outage_memory],
1386
1386
  configure: async (device, coordinatorEndpoint, logger) => {
@@ -1402,7 +1402,7 @@ module.exports = [
1402
1402
  model: 'DLKZMK11LM',
1403
1403
  vendor: 'Xiaomi',
1404
1404
  description: 'Aqara single switch module T1 (with neutral)',
1405
- fromZigbee: [fz.on_off, fz.xiaomi_power, fz.xiaomi_switch_type, fz.xiaomi_switch_opple_basic],
1405
+ fromZigbee: [fz.on_off, fz.xiaomi_power, fz.aqara_opple],
1406
1406
  toZigbee: [tz.on_off, tz.xiaomi_power, tz.xiaomi_switch_type, tz.xiaomi_switch_power_outage_memory, tz.xiaomi_led_disabled_night],
1407
1407
  exposes: [e.switch(), e.power().withAccess(ea.STATE_GET), e.energy(), e.temperature().withAccess(ea.STATE),
1408
1408
  e.voltage().withAccess(ea.STATE), e.power_outage_memory(), e.led_disabled_night(), e.switch_type()],
@@ -1416,7 +1416,7 @@ module.exports = [
1416
1416
  model: 'SSM-U02',
1417
1417
  vendor: 'Xiaomi',
1418
1418
  description: 'Aqara single switch module T1 (without neutral). Doesn\'t work as a router and doesn\'t support power meter',
1419
- fromZigbee: [fz.on_off, fz.xiaomi_switch_type, fz.xiaomi_switch_power_outage_memory],
1419
+ fromZigbee: [fz.on_off, fz.aqara_opple],
1420
1420
  exposes: [e.switch(), e.power_outage_memory(), e.switch_type()],
1421
1421
  toZigbee: [tz.xiaomi_switch_type, tz.on_off, tz.xiaomi_switch_power_outage_memory],
1422
1422
  configure: async (device, coordinatorEndpoint, logger) => {
@@ -1432,7 +1432,7 @@ module.exports = [
1432
1432
  model: 'DLKZMK12LM',
1433
1433
  vendor: 'Xiaomi',
1434
1434
  description: 'Aqara single switch module T1 (without neutral). Doesn\'t work as a router and doesn\'t support power meter',
1435
- fromZigbee: [fz.on_off, fz.xiaomi_switch_type, fz.xiaomi_switch_power_outage_memory],
1435
+ fromZigbee: [fz.on_off, fz.aqara_opple],
1436
1436
  exposes: [e.switch(), e.power_outage_memory(), e.switch_type()],
1437
1437
  toZigbee: [tz.xiaomi_switch_type, tz.on_off, tz.xiaomi_switch_power_outage_memory],
1438
1438
  configure: async (device, coordinatorEndpoint, logger) => {
@@ -1502,7 +1502,7 @@ module.exports = [
1502
1502
  model: 'WRS-R02',
1503
1503
  vendor: 'Xiaomi',
1504
1504
  description: 'Aqara wireless remote switch H1 (double rocker)',
1505
- fromZigbee: [fz.battery, fz.aqara_opple_multistate, fz.aqara_opple_report, fz.command_toggle],
1505
+ fromZigbee: [fz.battery, fz.aqara_opple_multistate, fz.aqara_opple, fz.command_toggle],
1506
1506
  exposes: [
1507
1507
  e.battery(), e.action([
1508
1508
  'button_1_hold', 'button_1_release', 'button_1_single', 'button_1_double', 'button_1_triple',
@@ -1535,7 +1535,7 @@ module.exports = [
1535
1535
  model: 'QBKG38LM',
1536
1536
  vendor: 'Xiaomi',
1537
1537
  description: 'Aqara E1 1 gang switch (without neutral)',
1538
- fromZigbee: [fz.on_off, fz.xiaomi_multistate_action, fz.xiaomi_switch_opple_basic],
1538
+ fromZigbee: [fz.on_off, fz.xiaomi_multistate_action, fz.aqara_opple],
1539
1539
  toZigbee: [tz.on_off, tz.xiaomi_switch_operation_mode_opple, tz.xiaomi_switch_power_outage_memory,
1540
1540
  tz.aqara_switch_mode_switch],
1541
1541
  exposes: [e.switch(), e.power_outage_memory(), e.action(['single', 'double']),
@@ -1554,7 +1554,7 @@ module.exports = [
1554
1554
  model: 'QBKG39LM',
1555
1555
  vendor: 'Xiaomi',
1556
1556
  description: 'Aqara E1 2 gang switch (without neutral)',
1557
- fromZigbee: [fz.on_off, fz.xiaomi_multistate_action, fz.xiaomi_switch_opple_basic],
1557
+ fromZigbee: [fz.on_off, fz.xiaomi_multistate_action, fz.aqara_opple],
1558
1558
  toZigbee: [tz.on_off, tz.xiaomi_switch_operation_mode_opple, tz.xiaomi_switch_power_outage_memory,
1559
1559
  tz.aqara_switch_mode_switch],
1560
1560
  meta: {multiEndpoint: true},
@@ -1606,7 +1606,7 @@ module.exports = [
1606
1606
  model: 'QBKG41LM',
1607
1607
  vendor: 'Xiaomi',
1608
1608
  description: 'Aqara E1 2 gang switch (with neutral)',
1609
- fromZigbee: [fz.on_off, fz.xiaomi_multistate_action, fz.xiaomi_switch_opple_basic],
1609
+ fromZigbee: [fz.on_off, fz.xiaomi_multistate_action, fz.aqara_opple],
1610
1610
  toZigbee: [tz.on_off, tz.xiaomi_switch_operation_mode_opple, tz.xiaomi_switch_power_outage_memory],
1611
1611
  meta: {multiEndpoint: true},
1612
1612
  endpoint: (device) => {
@@ -1634,7 +1634,7 @@ module.exports = [
1634
1634
  model: 'ZNCZ15LM',
1635
1635
  vendor: 'Xiaomi',
1636
1636
  description: 'Aqara T1 power plug ZigBee',
1637
- fromZigbee: [fz.on_off, fz.xiaomi_power, fz.xiaomi_switch_opple_basic],
1637
+ fromZigbee: [fz.on_off, fz.xiaomi_power, fz.aqara_opple],
1638
1638
  toZigbee: [tz.on_off, tz.xiaomi_switch_power_outage_memory, tz.xiaomi_led_disabled_night,
1639
1639
  tz.xiaomi_overload_protection, tz.xiaomi_socket_button_lock],
1640
1640
  exposes: [e.switch(), e.power().withAccess(ea.STATE), e.energy(), e.temperature().withAccess(ea.STATE),
@@ -1651,7 +1651,7 @@ module.exports = [
1651
1651
  model: 'QBKG40LM',
1652
1652
  vendor: 'Xiaomi',
1653
1653
  description: 'Aqara E1 1 gang switch (with neutral)',
1654
- fromZigbee: [fz.on_off, fz.xiaomi_multistate_action, fz.xiaomi_switch_opple_basic],
1654
+ fromZigbee: [fz.on_off, fz.xiaomi_multistate_action, fz.aqara_opple],
1655
1655
  toZigbee: [tz.on_off, tz.xiaomi_switch_operation_mode_opple, tz.xiaomi_switch_power_outage_memory],
1656
1656
  exposes: [e.switch(), e.action(['single', 'double']), e.power_outage_memory(),
1657
1657
  exposes.enum('operation_mode', ea.ALL, ['control_relay', 'decoupled']).withDescription('Decoupled mode')],
@@ -1667,7 +1667,7 @@ module.exports = [
1667
1667
  vendor: 'Xiaomi',
1668
1668
  description: 'Aqara T1 wireless mini switch',
1669
1669
  meta: {battery: {voltageToPercentage: '3V_2500'}},
1670
- fromZigbee: [fz.battery, fz.aqara_opple_multistate, fz.aqara_opple_report],
1670
+ fromZigbee: [fz.battery, fz.aqara_opple_multistate, fz.aqara_opple],
1671
1671
  toZigbee: [],
1672
1672
  exposes: [e.battery(), e.battery_voltage(), e.action(['single', 'double', 'triple', 'quintuple', 'hold', 'release', 'many'])],
1673
1673
  configure: async (device, coordinatorEndpoint, logger) => {
@@ -1680,7 +1680,7 @@ module.exports = [
1680
1680
  model: 'GZCGQ11LM',
1681
1681
  vendor: 'Xiaomi',
1682
1682
  description: 'Aqara T1 light intensity sensor',
1683
- fromZigbee: [fz.battery, fz.illuminance, fz.GZCGQ11LM_detection_period, fz.aqara_opple_report],
1683
+ fromZigbee: [fz.battery, fz.illuminance, fz.aqara_opple],
1684
1684
  toZigbee: [tz.GZCGQ11LM_detection_period],
1685
1685
  meta: {battery: {voltageToPercentage: '3V_2500'}},
1686
1686
  exposes: [e.battery(), e.battery_voltage(), e.illuminance(), e.illuminance_lux(),
@@ -1697,7 +1697,7 @@ module.exports = [
1697
1697
  model: 'QBCZ15LM',
1698
1698
  vendor: 'Xiaomi',
1699
1699
  description: 'Aqara smart wall outlet H1 usb',
1700
- fromZigbee: [fz.on_off, fz.xiaomi_power, fz.xiaomi_switch_opple_basic],
1700
+ fromZigbee: [fz.on_off, fz.xiaomi_power, fz.aqara_opple],
1701
1701
  toZigbee: [tz.on_off, tz.xiaomi_switch_power_outage_memory, tz.xiaomi_led_disabled_night,
1702
1702
  tz.xiaomi_button_switch_mode, tz.xiaomi_overload_protection, tz.xiaomi_socket_button_lock],
1703
1703
  meta: {multiEndpoint: true},
@@ -1736,7 +1736,7 @@ module.exports = [
1736
1736
  model: 'QBCZ14LM',
1737
1737
  vendor: 'Xiaomi',
1738
1738
  description: 'Aqara smart wall outlet T1',
1739
- fromZigbee: [fz.on_off, fz.xiaomi_power, fz.xiaomi_switch_opple_basic],
1739
+ fromZigbee: [fz.on_off, fz.xiaomi_power, fz.aqara_opple],
1740
1740
  toZigbee: [tz.on_off, tz.xiaomi_switch_power_outage_memory, tz.xiaomi_led_disabled_night,
1741
1741
  tz.xiaomi_overload_protection, tz.xiaomi_socket_button_lock],
1742
1742
  exposes: [
@@ -1764,8 +1764,7 @@ module.exports = [
1764
1764
  exposes.numeric('action_rotation_percent_speed', ea.STATE).withUnit('%').withDescription('Rotation percent speed'),
1765
1765
  exposes.numeric('action_rotation_time', ea.STATE).withUnit('ms').withDescription('Rotation time'),
1766
1766
  ],
1767
- fromZigbee: [fz.xiaomi_on_off_action, fz.xiaomi_multistate_action, fz.xiaomi_battery, fz.aqara_opple_report,
1768
- fz.aqara_knob_rotation],
1767
+ fromZigbee: [fz.xiaomi_on_off_action, fz.xiaomi_multistate_action, fz.xiaomi_battery, fz.aqara_opple, fz.aqara_knob_rotation],
1769
1768
  toZigbee: [tz.aqara_opple_operation_mode],
1770
1769
  onEvent: preventReset,
1771
1770
  configure: async (device, coordinatorEndpoint, logger) => {
@@ -1784,7 +1783,7 @@ module.exports = [
1784
1783
  // eslint-disable-next-line max-len
1785
1784
  exposes.enum('click_mode', ea.SET, ['fast', 'multi']).withDescription('Click mode, fast: only supports single click which will be send immediately after clicking, multi: supports more events like double and hold'),
1786
1785
  ],
1787
- fromZigbee: [fz.xiaomi_multistate_action, fz.aqara_opple_report],
1786
+ fromZigbee: [fz.xiaomi_multistate_action, fz.aqara_opple],
1788
1787
  toZigbee: [tz.xiaomi_switch_click_mode],
1789
1788
  onEvent: preventReset,
1790
1789
  configure: async (device, coordinatorEndpoint, logger) => {
package/lib/constants.js CHANGED
@@ -68,6 +68,15 @@ const thermostatRunningStates = {
68
68
  22: 'cool',
69
69
  };
70
70
 
71
+ const thermostatAcLouverPositions = {
72
+ 0: 'fully_closed',
73
+ 1: 'fully_closed',
74
+ 2: 'fully_open',
75
+ 3: 'quarter_open',
76
+ 4: 'half_open',
77
+ 5: 'three_quarters_open',
78
+ };
79
+
71
80
  const fanMode = {
72
81
  'off': 0,
73
82
  'low': 1,
@@ -241,6 +250,7 @@ module.exports = {
241
250
  thermostatSystemModes,
242
251
  thermostatRunningStates,
243
252
  thermostatRunningMode,
253
+ thermostatAcLouverPositions,
244
254
  dayOfWeek,
245
255
  fanMode,
246
256
  temperatureDisplayMode,
package/lib/exposes.js CHANGED
@@ -425,6 +425,14 @@ class Climate extends Base {
425
425
  this.features.push(new Numeric('pi_heating_demand', access).withValueMin(0).withValueMax(100).withUnit('%').withDescription('Position of the valve (= demanded heat) where 0% is fully closed and 100% is fully open'));
426
426
  return this;
427
427
  }
428
+
429
+ withAcLouverPosition(positions, access=a.ALL) {
430
+ assert(!this.endpoint, 'Cannot add feature after adding endpoint');
431
+ const allowed = ['fully_open', 'fully_closed', 'half_open', 'quarter_open', 'three_quarters_open'];
432
+ positions.forEach((m) => assert(allowed.includes(m)));
433
+ this.features.push(new Enum('ac_louver_position', access, positions).withDescription('Ac louver position of this device'));
434
+ return this;
435
+ }
428
436
  }
429
437
  /**
430
438
  * The access property is a 3-bit bitmask.
package/lib/reporting.js CHANGED
@@ -163,6 +163,10 @@ module.exports = {
163
163
  const p = payload('tempSetpointHoldDuration', 0, repInterval.HOUR, 10, overrides);
164
164
  await endpoint.configureReporting('hvacThermostat', p);
165
165
  },
166
+ thermostatAcLouverPosition: async (endpoint, overrides) => {
167
+ const p = payload('acLouverPosition', 0, repInterval.HOUR, null, overrides);
168
+ await endpoint.configureReporting('hvacThermostat', p);
169
+ },
166
170
  presentValue: async (endpoint, overrides) => {
167
171
  const p = payload('presentValue', 10, repInterval.MINUTE, 1, overrides);
168
172
  await endpoint.configureReporting('genBinaryInput', p);
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "zigbee-herdsman-converters",
3
- "version": "14.0.327",
3
+ "version": "14.0.328",
4
4
  "lockfileVersion": 1,
5
5
  "requires": true,
6
6
  "dependencies": {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "zigbee-herdsman-converters",
3
- "version": "14.0.327",
3
+ "version": "14.0.328",
4
4
  "description": "Collection of device converters to be used with zigbee-herdsman",
5
5
  "main": "index.js",
6
6
  "files": [