zigbee-herdsman-converters 14.0.327 → 14.0.331

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
  },
@@ -3837,7 +3841,7 @@ const converters = {
3837
3841
  return {'local_temperature_calibration': ( value/10 ).toFixed(1)};
3838
3842
  case tuya.dataPoints.haozeeValvePosition:
3839
3843
  // valve position
3840
- return {'position': value};
3844
+ return {'position': ( value/10 ).toFixed(1)};
3841
3845
  case tuya.dataPoints.haozeeMinTemp:
3842
3846
  // lower limit temperature
3843
3847
  return {'min_temperature': ( value/10 ).toFixed(1)};
@@ -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) => {
@@ -2808,11 +2822,21 @@ const converters = {
2808
2822
  const presetLookup = {'auto': 0, 'manual': 1, 'holiday': 3};
2809
2823
  await tuya.sendDataPointEnum(entity, tuya.dataPoints.tvMode, presetLookup[value]);
2810
2824
  return {state: {preset: value}};}
2811
- case 'frost_protection':
2812
- await tuya.sendDataPointBool(entity, tuya.dataPoints.tvFrostDetection, value === 'ON');
2813
- break;
2814
2825
  case 'heating_stop':
2815
- await tuya.sendDataPointBool(entity, tuya.dataPoints.tvHeatingStop, value === 'ON');
2826
+ if (value == 'ON') {
2827
+ await tuya.sendDataPointBool(entity, tuya.dataPoints.tvHeatingStop, 1);
2828
+ } else {
2829
+ await tuya.sendDataPointBool(entity, tuya.dataPoints.tvHeatingStop, 0);
2830
+ await tuya.sendDataPointEnum(entity, tuya.dataPoints.tvMode, 1 /* manual */);
2831
+ }
2832
+ break;
2833
+ case 'frost_protection':
2834
+ if (value == 'ON') {
2835
+ await tuya.sendDataPointBool(entity, tuya.dataPoints.tvFrostDetection, 1);
2836
+ } else {
2837
+ await tuya.sendDataPointBool(entity, tuya.dataPoints.tvFrostDetection, 0);
2838
+ await tuya.sendDataPointEnum(entity, tuya.dataPoints.tvMode, 1 /* manual */);
2839
+ }
2816
2840
  break;
2817
2841
  case 'window_detection':
2818
2842
  await tuya.sendDataPointBool(entity, tuya.dataPoints.tvWindowDetection, value === 'ON');
@@ -2845,7 +2869,7 @@ const converters = {
2845
2869
  await tuya.sendDataPointValue(entity, tuya.dataPoints.tvOpenWindowTemp, value * 10);
2846
2870
  break;
2847
2871
  case 'holiday_mode_date':
2848
- await tuya.sendDataPointBitmap(entity, tuya.dataPoints.tvWorkingDayTimetvHolidayMode, value);
2872
+ await tuya.sendDataPointBitmap(entity, tuya.dataPoints.tvHolidayMode, value);
2849
2873
  break;
2850
2874
 
2851
2875
  case 'online':
@@ -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/girier.js CHANGED
@@ -6,7 +6,10 @@ const extend = require('../lib/extend');
6
6
 
7
7
  module.exports = [
8
8
  {
9
- fingerprint: [{modelID: 'TS0001', manufacturerName: '_TZ3000_majwnphg'}],
9
+ fingerprint: [
10
+ {modelID: 'TS0001', manufacturerName: '_TZ3000_majwnphg'},
11
+ {modelID: 'TS0001', manufacturerName: '_TZ3000_6axxqqi2'},
12
+ ],
10
13
  model: 'JR-ZDS01',
11
14
  vendor: 'Girier',
12
15
  description: '1 gang mini switch',
@@ -464,7 +464,7 @@ module.exports = [
464
464
  vendor: 'Gledopto',
465
465
  ota: ota.zigbeeOTA,
466
466
  description: 'Zigbee 12W Downlight RGB+CCT (pro)',
467
- extend: gledoptoExtend.light_onoff_brightness_colortemp_color(),
467
+ extend: gledoptoExtend.light_onoff_brightness_colortemp_color({colorTempRange: [158, 495]}),
468
468
  },
469
469
  {
470
470
  zigbeeModel: ['GL-D-006P'],
package/devices/ikea.js CHANGED
@@ -354,7 +354,7 @@ module.exports = [
354
354
  model: 'LED1624G9',
355
355
  vendor: 'IKEA',
356
356
  description: 'TRADFRI LED bulb E14/E26/E27 600 lumen, dimmable, color, opal white',
357
- extend: tradfriExtend.light_onoff_brightness_colortemp_color(),
357
+ extend: tradfriExtend.light_onoff_brightness_colortemp_color({colorTempRange: [250, 454]}),
358
358
  meta: {supportsHueAndSaturation: false},
359
359
  },
360
360
  {
@@ -376,7 +376,7 @@ module.exports = [
376
376
  model: 'LED1732G11',
377
377
  vendor: 'IKEA',
378
378
  description: 'TRADFRI LED bulb E27 1000 lumen, dimmable, white spectrum, opal white',
379
- extend: tradfriExtend.light_onoff_brightness_colortemp(),
379
+ extend: tradfriExtend.light_onoff_brightness_colortemp({colorTempRange: [250, 454]}),
380
380
  },
381
381
  {
382
382
  zigbeeModel: ['TRADFRI bulb E27 WW 806lm', 'TRADFRI bulb E26 WW 806lm'],
@@ -753,11 +753,11 @@ module.exports = [
753
753
  extend: tradfriExtend.light_onoff_brightness_colortemp(),
754
754
  },
755
755
  {
756
- zigbeeModel: ['TRADFRI bulb GU10 CWS 345lm'],
756
+ zigbeeModel: ['TRADFRI bulb GU10 CWS 345lm', 'TRADFRI bulb GU10 CWS 380lm'],
757
757
  model: 'LED1923R5',
758
758
  vendor: 'IKEA',
759
759
  description: 'TRADFRI LED bulb GU10 345 lumen, dimmable, white spectrum, color spectrum',
760
- extend: tradfriExtend.light_onoff_brightness_colortemp_color(),
760
+ extend: tradfriExtend.light_onoff_brightness_colortemp_color({colorTempRange: [250, 454]}),
761
761
  },
762
762
  {
763
763
  zigbeeModel: ['TRADFRI bulb E14 CWS 470lm', 'TRADFRI bulb E12 CWS 450lm'],
package/devices/innr.js CHANGED
@@ -220,7 +220,7 @@ module.exports = [
220
220
  model: 'RS 228 T',
221
221
  vendor: 'Innr',
222
222
  description: 'GU10 spot 350 lm, dimmable, white spectrum',
223
- extend: extend.light_onoff_brightness_colortemp({colorTempRange: [153, 555]}),
223
+ extend: extend.light_onoff_brightness_colortemp({colorTempRange: [200, 454]}),
224
224
  meta: {applyRedFix: true, turnsOffAtBrightness1: true},
225
225
  },
226
226
  {
@@ -31,7 +31,7 @@ module.exports = [
31
31
  model: 'AC25697',
32
32
  vendor: 'LEDVANCE',
33
33
  description: 'SMART+ CLASSIC MULTICOLOUR 60 10W E27',
34
- extend: extend.ledvance.light_onoff_brightness_colortemp_color(),
34
+ extend: extend.ledvance.light_onoff_brightness_colortemp_color({colorTempRange: [153, 500]}),
35
35
  ota: ota.ledvance,
36
36
  },
37
37
  {
package/devices/lidl.js CHANGED
@@ -553,7 +553,7 @@ module.exports = [
553
553
  model: 'HG06492B',
554
554
  vendor: 'Lidl',
555
555
  description: 'Livarno Lux E14 candle CCT',
556
- ...extend.light_onoff_brightness_colortemp({disableColorTempStartup: true}),
556
+ ...extend.light_onoff_brightness_colortemp({disableColorTempStartup: true, colorTempRange: [153, 500]}),
557
557
  configure: async (device, coordinatorEndpoint, logger) => {
558
558
  device.getEndpoint(1).saveClusterAttributeKeyValue('lightingColorCtrl', {colorCapabilities: 16});
559
559
  },
@@ -624,7 +624,7 @@ module.exports = [
624
624
  fingerprint: [{modelID: 'TS0501A', manufacturerName: '_TZ3000_nosnx7im'}],
625
625
  model: 'HG06463B',
626
626
  vendor: 'Lidl',
627
- description: 'Livarno Lux E27 G30 filament bulb',
627
+ description: 'Livarno Lux E27 G95 filament bulb',
628
628
  extend: extend.light_onoff_brightness({disableEffect: true}),
629
629
  meta: {turnsOffAtBrightness1: false},
630
630
  },
@@ -142,7 +142,7 @@ module.exports = [
142
142
  {
143
143
  zigbeeModel: ['ZB-RGBCW'],
144
144
  fingerprint: [{modelID: 'ZB-CL01', manufacturerName: 'eWeLight'}, {modelID: 'ZB-CL01', manufacturerName: 'eWeLink'},
145
- {modelID: 'ZB-CL02', manufacturerName: 'eWeLight'}],
145
+ {modelID: 'ZB-CL02', manufacturerName: 'eWeLight'}, {modelID: 'ZB-CL01', manufacturerName: 'eWeLi\u0001\u0000\u0010'}],
146
146
  model: 'ZB-RGBCW',
147
147
  vendor: 'Lonsonho',
148
148
  description: 'Zigbee 3.0 LED-bulb, RGBW LED',
package/devices/osram.js CHANGED
@@ -126,7 +126,7 @@ module.exports = [
126
126
  model: 'AA70155',
127
127
  vendor: 'OSRAM',
128
128
  description: 'LIGHTIFY LED A19 tunable white / Classic A60 TW',
129
- extend: extend.ledvance.light_onoff_brightness_colortemp(),
129
+ extend: extend.ledvance.light_onoff_brightness_colortemp({colorTempRange: [153, 370]}),
130
130
  ota: ota.ledvance,
131
131
  },
132
132
  {
@@ -134,7 +134,7 @@ module.exports = [
134
134
  model: 'AA68199',
135
135
  vendor: 'OSRAM',
136
136
  description: 'LIGHTIFY LED PAR16 50 GU10 tunable white',
137
- extend: extend.ledvance.light_onoff_brightness_colortemp(),
137
+ extend: extend.ledvance.light_onoff_brightness_colortemp({colorTempRange: [153, 370]}),
138
138
  ota: ota.ledvance,
139
139
  },
140
140
  {
@@ -142,7 +142,7 @@ module.exports = [
142
142
  model: '4058075148338',
143
143
  vendor: 'OSRAM',
144
144
  description: 'LIGHTIFY LED PAR16 50 GU10 tunable white',
145
- extend: extend.ledvance.light_onoff_brightness_colortemp(),
145
+ extend: extend.ledvance.light_onoff_brightness_colortemp({colorTempRange: [153, 370]}),
146
146
  ota: ota.ledvance,
147
147
  },
148
148
  {
@@ -228,7 +228,7 @@ module.exports = [
228
228
  model: '4052899926110',
229
229
  vendor: 'OSRAM',
230
230
  description: 'Flex RGBW',
231
- extend: extend.ledvance.light_onoff_brightness_colortemp_color(),
231
+ extend: extend.ledvance.light_onoff_brightness_colortemp_color({colorTempRange: [125, 666]}),
232
232
  ota: ota.ledvance,
233
233
  },
234
234
  {
@@ -278,7 +278,7 @@ module.exports = [
278
278
  model: 'AB35996',
279
279
  vendor: 'OSRAM',
280
280
  description: 'Smart+ Spot GU10 Multicolor',
281
- extend: extend.ledvance.light_onoff_brightness_colortemp_color(),
281
+ extend: extend.ledvance.light_onoff_brightness_colortemp_color({colorTempRange: [125, 666]}),
282
282
  ota: ota.ledvance,
283
283
  },
284
284
  {
@@ -318,7 +318,7 @@ module.exports = [
318
318
  model: 'AC03648',
319
319
  vendor: 'OSRAM',
320
320
  description: 'SMART+ spot GU5.3 tunable white',
321
- extend: extend.ledvance.light_onoff_brightness_colortemp(),
321
+ extend: extend.ledvance.light_onoff_brightness_colortemp({colorTempRange: [153, 370]}),
322
322
  ota: ota.ledvance,
323
323
  },
324
324
  {
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,
@@ -404,6 +404,15 @@ module.exports = [
404
404
  extend: hueExtend.light_onoff_brightness_colortemp_color(),
405
405
  ota: ota.zigbeeOTA,
406
406
  },
407
+ {
408
+ zigbeeModel: ['1740193P0'],
409
+ model: '1740193P0',
410
+ vendor: 'Philips',
411
+ description: 'Hue Lucca wall light',
412
+ meta: {turnsOffAtBrightness1: true},
413
+ extend: hueExtend.light_onoff_brightness(),
414
+ ota: ota.zigbeeOTA,
415
+ },
407
416
  {
408
417
  zigbeeModel: ['1740293P0'],
409
418
  model: '1740293P0',
@@ -848,7 +857,7 @@ module.exports = [
848
857
  vendor: 'Philips',
849
858
  description: 'Hue white ambiance E14',
850
859
  meta: {turnsOffAtBrightness1: true},
851
- extend: hueExtend.light_onoff_brightness_colortemp(),
860
+ extend: hueExtend.light_onoff_brightness_colortemp({colorTempRange: [153, 454]}),
852
861
  ota: ota.zigbeeOTA,
853
862
  },
854
863
  {
@@ -1203,7 +1212,7 @@ module.exports = [
1203
1212
  ota: ota.zigbeeOTA,
1204
1213
  },
1205
1214
  {
1206
- zigbeeModel: ['4096730P6'],
1215
+ zigbeeModel: ['4096730P6', '929003055601'],
1207
1216
  model: '4096730P6',
1208
1217
  vendor: 'Philips',
1209
1218
  description: 'Hue Cher ceiling light',
@@ -1887,7 +1896,7 @@ module.exports = [
1887
1896
  ota: ota.zigbeeOTA,
1888
1897
  },
1889
1898
  {
1890
- zigbeeModel: ['LOM003'],
1899
+ zigbeeModel: ['LOM003', 'LOM009'],
1891
1900
  model: '8718699689308',
1892
1901
  vendor: 'Philips',
1893
1902
  description: 'Hue smart plug - UK',
@@ -1942,6 +1951,20 @@ module.exports = [
1942
1951
  },
1943
1952
  ota: ota.zigbeeOTA,
1944
1953
  },
1954
+ {
1955
+ zigbeeModel: ['LOM008'],
1956
+ model: '9290030509',
1957
+ vendor: 'Philips',
1958
+ description: 'Hue smart plug - EU',
1959
+ extend: extend.switch(),
1960
+ toZigbee: [tz.on_off].concat([tz.hue_power_on_behavior, tz.hue_power_on_error]),
1961
+ configure: async (device, coordinatorEndpoint, logger) => {
1962
+ const endpoint = device.getEndpoint(11);
1963
+ await reporting.bind(endpoint, coordinatorEndpoint, ['genOnOff']);
1964
+ await reporting.onOff(endpoint);
1965
+ },
1966
+ ota: ota.zigbeeOTA,
1967
+ },
1945
1968
  {
1946
1969
  zigbeeModel: ['LLC014'],
1947
1970
  model: '7099860PH',
@@ -2419,4 +2442,21 @@ module.exports = [
2419
2442
  extend: hueExtend.light_onoff_brightness(),
2420
2443
  ota: ota.zigbeeOTA,
2421
2444
  },
2445
+ {
2446
+ zigbeeModel: ['LCD003'],
2447
+ model: '8719514344723',
2448
+ vendor: 'Philips',
2449
+ description: 'Akari downlight',
2450
+ extend: hueExtend.light_onoff_brightness_colortemp_color({colorTempRange: [153, 500]}),
2451
+ meta: {turnsOffAtBrightness1: true},
2452
+ ota: ota.zigbeeOTA,
2453
+ },
2454
+ {
2455
+ zigbeeModel: ['LWE004'],
2456
+ model: '8719514302235',
2457
+ vendor: 'Philips',
2458
+ description: 'Hue White Filament Bulb E14',
2459
+ extend: hueExtend.light_onoff_brightness(),
2460
+ ota: ota.zigbeeOTA,
2461
+ },
2422
2462
  ];
@@ -273,6 +273,7 @@ module.exports = [
273
273
  endpoint: (device) => {
274
274
  return {'l1': 3, 's1': 21, 's2': 22, 's3': 23, 's4': 24};
275
275
  },
276
+ meta: {multiEndpoint: true},
276
277
  exposes: [e.light_brightness().withLevelConfig().withEndpoint('l1'),
277
278
  exposes.numeric('ballast_minimum_level', ea.ALL).withValueMin(1).withValueMax(254)
278
279
  .withDescription('Specifies the minimum light output of the ballast')
package/devices/tuya.js CHANGED
@@ -820,7 +820,7 @@ module.exports = [
820
820
  exposes.binary('online', ea.STATE_SET, 'ON', 'OFF').withDescription('Is the device online'),
821
821
  exposes.numeric('holiday_mode_date', ea.STATE_SET).withDescription('The holiday mode( ⛱ ) will '+
822
822
  'automatically start at the set time starting point and run the holiday temperature.'),
823
- exposes.composite('programming', 'programming').withDescription('Auto Mode ⏱ - In this mode,'+
823
+ exposes.composite('programming').withDescription('Auto Mode ⏱ - In this mode,'+
824
824
  ' the device executes a preset week programming temperature time and temperature. ')
825
825
  .withFeature(exposes.text('schedule_monday', ea.STATE))
826
826
  .withFeature(exposes.text('schedule_tuesday', ea.STATE))
@@ -969,49 +969,6 @@ module.exports = [
969
969
  description: 'Smart water/gas valve',
970
970
  extend: extend.switch(),
971
971
  },
972
- {
973
- fingerprint: [
974
- {modelID: 'TS011F', manufacturerName: '_TZ3000_dpo1ysak', applicationVersion: 69},
975
- {modelID: 'TS011F', manufacturerName: '_TZ3000_cphmq0q7', applicationVersion: 69},
976
- {modelID: 'TS011F', manufacturerName: '_TZ3000_5f43h46b', applicationVersion: 69},
977
- {modelID: 'TS011F', manufacturerName: '_TZ3000_dpo1ysak', applicationVersion: 68},
978
- {modelID: 'TS011F', manufacturerName: '_TZ3000_cphmq0q7', applicationVersion: 68},
979
- {modelID: 'TS011F', manufacturerName: '_TZ3000_5f43h46b', applicationVersion: 68},
980
- ],
981
- model: 'TS011F_plug_3',
982
- description: 'Smart plug (with power monitoring by polling)',
983
- vendor: 'TuYa',
984
- whiteLabel: [{vendor: 'VIKEFON', model: 'TS011F'}],
985
- fromZigbee: [fz.on_off, fz.electrical_measurement, fz.metering, fz.ignore_basic_report, fz.tuya_switch_power_outage_memory],
986
- toZigbee: [tz.on_off, tz.tuya_switch_power_outage_memory],
987
- configure: async (device, coordinatorEndpoint, logger) => {
988
- const endpoint = device.getEndpoint(1);
989
- await reporting.bind(endpoint, coordinatorEndpoint, ['genOnOff']);
990
- endpoint.saveClusterAttributeKeyValue('haElectricalMeasurement', {acCurrentDivisor: 1000, acCurrentMultiplier: 1});
991
- endpoint.saveClusterAttributeKeyValue('seMetering', {divisor: 100, multiplier: 1});
992
- device.save();
993
- },
994
- options: [exposes.options.measurement_poll_interval()],
995
- exposes: [e.switch(), e.power(), e.current(), e.voltage().withAccess(ea.STATE),
996
- e.energy(), exposes.enum('power_outage_memory', ea.STATE_SET, ['on', 'off', 'restore'])
997
- .withDescription('Recover state after power outage')],
998
- onEvent: (type, data, device, options) => {
999
- const endpoint = device.getEndpoint(1);
1000
- if (type === 'stop') {
1001
- clearInterval(globalStore.getValue(device, 'interval'));
1002
- globalStore.clearValue(device, 'interval');
1003
- } else if (!globalStore.hasValue(device, 'interval')) {
1004
- const seconds = options && options.measurement_poll_interval ? options.measurement_poll_interval : 60;
1005
- const interval = setInterval(async () => {
1006
- try {
1007
- await endpoint.read('haElectricalMeasurement', ['rmsVoltage', 'rmsCurrent', 'activePower']);
1008
- await endpoint.read('seMetering', ['currentSummDelivered']);
1009
- } catch (error) {/* Do nothing*/}
1010
- }, seconds*1000);
1011
- globalStore.putValue(device, 'interval', interval);
1012
- }
1013
- },
1014
- },
1015
972
  {
1016
973
  fingerprint: [{modelID: 'TS011F', manufacturerName: '_TZ3000_cphmq0q7'},
1017
974
  {modelID: 'TS011F', manufacturerName: '_TZ3000_ew3ldmgx'},
@@ -1057,6 +1014,51 @@ module.exports = [
1057
1014
  exposes: [e.switch(), exposes.enum('power_outage_memory', ea.STATE_SET, ['on', 'off', 'restore'])
1058
1015
  .withDescription('Recover state after power outage')],
1059
1016
  },
1017
+ {
1018
+ fingerprint: [
1019
+ {modelID: 'TS011F', manufacturerName: '_TZ3000_dpo1ysak', applicationVersion: 69},
1020
+ {modelID: 'TS011F', manufacturerName: '_TZ3000_cphmq0q7', applicationVersion: 69},
1021
+ {modelID: 'TS011F', manufacturerName: '_TZ3000_5f43h46b', applicationVersion: 69},
1022
+ {modelID: 'TS011F', manufacturerName: '_TZ3000_dpo1ysak', applicationVersion: 68},
1023
+ {modelID: 'TS011F', manufacturerName: '_TZ3000_cphmq0q7', applicationVersion: 68},
1024
+ {modelID: 'TS011F', manufacturerName: '_TZ3000_5f43h46b', applicationVersion: 68},
1025
+ {modelID: 'TS011F', manufacturerName: '_TZ3000_ps3dmato', applicationVersion: 69},
1026
+ {modelID: 'TS011F', manufacturerName: '_TZ3000_w0qqde0g', applicationVersion: 68},
1027
+ ],
1028
+ model: 'TS011F_plug_3',
1029
+ description: 'Smart plug (with power monitoring by polling)',
1030
+ vendor: 'TuYa',
1031
+ whiteLabel: [{vendor: 'VIKEFON', model: 'TS011F'}],
1032
+ fromZigbee: [fz.on_off, fz.electrical_measurement, fz.metering, fz.ignore_basic_report, fz.tuya_switch_power_outage_memory],
1033
+ toZigbee: [tz.on_off, tz.tuya_switch_power_outage_memory],
1034
+ configure: async (device, coordinatorEndpoint, logger) => {
1035
+ const endpoint = device.getEndpoint(1);
1036
+ await reporting.bind(endpoint, coordinatorEndpoint, ['genOnOff']);
1037
+ endpoint.saveClusterAttributeKeyValue('haElectricalMeasurement', {acCurrentDivisor: 1000, acCurrentMultiplier: 1});
1038
+ endpoint.saveClusterAttributeKeyValue('seMetering', {divisor: 100, multiplier: 1});
1039
+ device.save();
1040
+ },
1041
+ options: [exposes.options.measurement_poll_interval()],
1042
+ exposes: [e.switch(), e.power(), e.current(), e.voltage().withAccess(ea.STATE),
1043
+ e.energy(), exposes.enum('power_outage_memory', ea.STATE_SET, ['on', 'off', 'restore'])
1044
+ .withDescription('Recover state after power outage')],
1045
+ onEvent: (type, data, device, options) => {
1046
+ const endpoint = device.getEndpoint(1);
1047
+ if (type === 'stop') {
1048
+ clearInterval(globalStore.getValue(device, 'interval'));
1049
+ globalStore.clearValue(device, 'interval');
1050
+ } else if (!globalStore.hasValue(device, 'interval')) {
1051
+ const seconds = options && options.measurement_poll_interval ? options.measurement_poll_interval : 60;
1052
+ const interval = setInterval(async () => {
1053
+ try {
1054
+ await endpoint.read('haElectricalMeasurement', ['rmsVoltage', 'rmsCurrent', 'activePower']);
1055
+ await endpoint.read('seMetering', ['currentSummDelivered']);
1056
+ } catch (error) {/* Do nothing*/}
1057
+ }, seconds*1000);
1058
+ globalStore.putValue(device, 'interval', interval);
1059
+ }
1060
+ },
1061
+ },
1060
1062
  {
1061
1063
  zigbeeModel: ['5p1vj8r'],
1062
1064
  fingerprint: [{modelID: 'TS0601', manufacturerName: '_TZE200_t5p1vj8r'}, {modelID: 'TS0601', manufacturerName: '_TZE200_uebojraa'}],
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.331",
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.331",
4
4
  "description": "Collection of device converters to be used with zigbee-herdsman",
5
5
  "main": "index.js",
6
6
  "files": [