zigbee-herdsman-converters 14.0.477 → 14.0.480

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.
@@ -4272,6 +4272,55 @@ const converters = {
4272
4272
  }
4273
4273
  },
4274
4274
  },
4275
+ connecte_thermostat: {
4276
+ cluster: 'manuSpecificTuya',
4277
+ type: ['commandDataResponse', 'commandDataReport'],
4278
+ convert: (model, msg, publish, options, meta) => {
4279
+ const dpValue = tuya.firstDpValue(msg, meta, 'connecte_thermostat');
4280
+ const dp = dpValue.dp;
4281
+ const value = tuya.getDataValue(dpValue);
4282
+
4283
+ switch (dp) {
4284
+ case tuya.dataPoints.connecteState:
4285
+ return {state: value ? 'ON' : 'OFF'};
4286
+ case tuya.dataPoints.connecteMode:
4287
+ switch (value) {
4288
+ case 0: // manual
4289
+ return {system_mode: 'heat', away_mode: 'OFF'};
4290
+ case 1: // home (auto)
4291
+ return {system_mode: 'auto', away_mode: 'OFF'};
4292
+ case 2: // away (auto)
4293
+ return {system_mode: 'auto', away_mode: 'ON'};
4294
+ }
4295
+ break;
4296
+ case tuya.dataPoints.connecteHeatingSetpoint:
4297
+ return {current_heating_setpoint: value};
4298
+ case tuya.dataPoints.connecteLocalTemp:
4299
+ return {local_temperature: value};
4300
+ case tuya.dataPoints.connecteTempCalibration:
4301
+ return {local_temperature_calibration: value};
4302
+ case tuya.dataPoints.connecteChildLock:
4303
+ return {child_lock: value ? 'LOCK' : 'UNLOCK'};
4304
+ case tuya.dataPoints.connecteTempFloor:
4305
+ return {external_temperature: value};
4306
+ case tuya.dataPoints.connecteSensorType:
4307
+ return {sensor: {0: 'internal', 1: 'external', 2: 'both'}[value]};
4308
+ case tuya.dataPoints.connecteHysteresis:
4309
+ return {hysteresis: value};
4310
+ case tuya.dataPoints.connecteRunningState:
4311
+ return {running_state: value ? 'heat' : 'idle'};
4312
+ case tuya.dataPoints.connecteTempProgram:
4313
+ break;
4314
+ case tuya.dataPoints.connecteOpenWindow:
4315
+ return {window_detection: value ? 'ON' : 'OFF'};
4316
+ case tuya.dataPoints.connecteMaxProtectTemp:
4317
+ return {max_temperature_protection: value};
4318
+ default:
4319
+ meta.logger.warn(`zigbee-herdsman-converters:connecte_thermostat: Unrecognized DP #${
4320
+ dp} with data ${JSON.stringify(dpValue)}`);
4321
+ }
4322
+ },
4323
+ },
4275
4324
  saswell_thermostat: {
4276
4325
  cluster: 'manuSpecificTuya',
4277
4326
  type: ['commandDataResponse', 'commandDataReport'],
@@ -5477,7 +5526,7 @@ const converters = {
5477
5526
  return payload;
5478
5527
  },
5479
5528
  },
5480
- RTCGQ12LM_occupancy_illuminance: {
5529
+ aqara_occupancy_illuminance: {
5481
5530
  // This is for occupancy sensor that only send a message when motion detected,
5482
5531
  // but do not send a motion stop.
5483
5532
  // Therefore we need to publish the no_motion detected by ourselves.
@@ -5490,7 +5539,7 @@ const converters = {
5490
5539
  // The occupancy sensor only sends a message when motion detected.
5491
5540
  // Therefore we need to publish the no_motion detected by ourselves.
5492
5541
  let timeout = meta && meta.state && meta.state.hasOwnProperty('detection_interval') ?
5493
- meta.state.detection_interval : 60;
5542
+ meta.state.detection_interval : ['RTCGQ14LM'].includes(model.model) ? 30 : 60;
5494
5543
  timeout = options && options.hasOwnProperty('occupancy_timeout') && options.occupancy_timeout >= timeout ?
5495
5544
  options.occupancy_timeout : timeout + 2;
5496
5545
 
@@ -3005,6 +3005,68 @@ const converters = {
3005
3005
  await entity.read('closuresWindowCovering', [isPosition ? 'currentPositionLiftPercentage' : 'currentPositionTiltPercentage']);
3006
3006
  },
3007
3007
  },
3008
+ connecte_thermostat: {
3009
+ key: [
3010
+ 'child_lock', 'current_heating_setpoint', 'local_temperature_calibration', 'max_temperature_protection', 'window_detection',
3011
+ 'hysteresis', 'state', 'away_mode', 'sensor', 'system_mode',
3012
+ ],
3013
+ convertSet: async (entity, key, value, meta) => {
3014
+ switch (key) {
3015
+ case 'state':
3016
+ await tuya.sendDataPointBool(entity, tuya.dataPoints.connecteState, value === 'ON');
3017
+ break;
3018
+ case 'child_lock':
3019
+ await tuya.sendDataPointBool(entity, tuya.dataPoints.connecteChildLock, value === 'LOCK');
3020
+ break;
3021
+ case 'local_temperature_calibration':
3022
+ if (value < 0) value = 0xFFFFFFFF + value + 1;
3023
+ await tuya.sendDataPointValue(entity, tuya.dataPoints.connecteTempCalibration, value);
3024
+ break;
3025
+ case 'hysteresis':
3026
+ // value = Math.round(value * 10);
3027
+ await tuya.sendDataPointValue(entity, tuya.dataPoints.connecteHysteresis, value);
3028
+ break;
3029
+ case 'max_temperature_protection':
3030
+ await tuya.sendDataPointValue(entity, tuya.dataPoints.connecteMaxProtectTemp, Math.round(value));
3031
+ break;
3032
+ case 'current_heating_setpoint':
3033
+ await tuya.sendDataPointValue(entity, tuya.dataPoints.connecteHeatingSetpoint, value);
3034
+ break;
3035
+ case 'sensor':
3036
+ await tuya.sendDataPointEnum(
3037
+ entity,
3038
+ tuya.dataPoints.connecteSensorType,
3039
+ {'internal': 0, 'external': 1, 'both': 2}[value]);
3040
+ break;
3041
+ case 'system_mode':
3042
+ switch (value) {
3043
+ case 'heat':
3044
+ await tuya.sendDataPointEnum(entity, tuya.dataPoints.connecteMode, 0 /* manual */);
3045
+ break;
3046
+ case 'auto':
3047
+ await tuya.sendDataPointEnum(entity, tuya.dataPoints.connecteMode, 1 /* auto */);
3048
+ break;
3049
+ }
3050
+ break;
3051
+ case 'away_mode':
3052
+ switch (value) {
3053
+ case 'ON':
3054
+ await tuya.sendDataPointEnum(entity, tuya.dataPoints.connecteMode, 2 /* auto */);
3055
+ break;
3056
+ case 'OFF':
3057
+ await tuya.sendDataPointEnum(entity, tuya.dataPoints.connecteMode, 0 /* manual */);
3058
+ break;
3059
+ }
3060
+ break;
3061
+ case 'window_detection':
3062
+ await tuya.sendDataPointBool(entity, tuya.dataPoints.connecteOpenWindow, value === 'ON');
3063
+ break;
3064
+ default: // Unknown key
3065
+ throw new Error(`Unhandled key toZigbee.connecte_thermostat ${key}`);
3066
+ }
3067
+ },
3068
+ },
3069
+
3008
3070
  moes_thermostat_child_lock: {
3009
3071
  key: ['child_lock'],
3010
3072
  convertSet: async (entity, key, value, meta) => {
@@ -6311,16 +6373,13 @@ const converters = {
6311
6373
  convertSet: async (entity, key, value, meta) => {
6312
6374
  switch (key) {
6313
6375
  case 'ext_switch_type':
6314
- meta.logger.debug(`toZigbee.ZB006X_settings: Send key/value [${key}|${value}]`);
6315
6376
  await tuya.sendDataPointEnum(entity, 103, {'unknown': 0, 'toggle_sw': 1,
6316
6377
  'momentary_sw': 2, 'rotary_sw': 3, 'auto_config': 4}[value]);
6317
6378
  break;
6318
6379
  case 'load_detection_mode':
6319
- meta.logger.debug(`toZigbee.ZB006X_settings: Send key/value [${key}|${value}]`);
6320
6380
  await tuya.sendDataPointEnum(entity, 105, {'none': 0, 'first_power_on': 1, 'every_power_on': 2}[value]);
6321
6381
  break;
6322
6382
  case 'control_mode':
6323
- meta.logger.debug(`toZigbee.ZB006X_settings: Send key/value [${key}|${value}]`);
6324
6383
  await tuya.sendDataPointEnum(entity, 109, {'local': 0, 'remote': 1, 'both': 2}[value]);
6325
6384
  break;
6326
6385
  default: // Unknown key
@@ -0,0 +1,50 @@
1
+ const exposes = require('../lib/exposes');
2
+ const fz = {...require('../converters/fromZigbee'), legacy: require('../lib/legacy').fromZigbee};
3
+ const tz = require('../converters/toZigbee');
4
+ const tuya = require('../lib/tuya');
5
+ const e = exposes.presets;
6
+ const ea = exposes.access;
7
+
8
+ module.exports = [
9
+ {
10
+ fingerprint: [{modelID: 'TS0601', manufacturerName: '_TZE200_4hbx5cvx'}],
11
+ model: '4500994',
12
+ vendor: 'Connecte',
13
+ description: 'Smart thermostat',
14
+ fromZigbee: [fz.connecte_thermostat],
15
+ toZigbee: [tz.connecte_thermostat],
16
+ onEvent: tuya.onEventSetTime,
17
+ configure: async (device, coordinatorEndpoint, logger) => {
18
+ const endpoint = device.getEndpoint(1);
19
+ // Do a "magic" read on the basic cluster to trigger the thermostat start reporting.
20
+ await endpoint.read('genBasic', ['manufacturerName', 'zclVersion', 'appVersion', 'modelId', 'powerSource', 0xfffe]);
21
+ },
22
+ exposes: [
23
+ exposes.binary('state', ea.STATE_SET, 'ON', 'OFF')
24
+ .withDescription('On/off state of the switch'),
25
+ e.child_lock(),
26
+ e.window_detection(),
27
+ exposes.climate()
28
+ .withSetpoint('current_heating_setpoint', 5, 35, 1, ea.STATE_SET)
29
+ .withLocalTemperature(ea.STATE)
30
+ .withLocalTemperatureCalibration(-9, 9, 1, ea.STATE_SET)
31
+ .withSystemMode(['heat', 'auto'], ea.STATE_SET)
32
+ .withRunningState(['idle', 'heat'], ea.STATE)
33
+ .withAwayMode()
34
+ .withSensor(['internal', 'external', 'both']),
35
+ exposes.numeric('external_temperature', ea.STATE)
36
+ .withUnit('°C')
37
+ .withDescription('Current temperature measured on the external sensor (floor)'),
38
+ exposes.numeric('hysteresis', ea.STATE_SET)
39
+ .withDescription('The difference between the temperature at which the thermostat switches off, ' +
40
+ 'and the temperature at which it switches on again.')
41
+ .withValueMin(1)
42
+ .withValueMax(9),
43
+ exposes.numeric('max_temperature_protection', ea.STATE_SET)
44
+ .withUnit('°C')
45
+ .withDescription('Max guarding temperature')
46
+ .withValueMin(20)
47
+ .withValueMax(95),
48
+ ],
49
+ },
50
+ ];
package/devices/fantem.js CHANGED
@@ -13,15 +13,18 @@ module.exports = [
13
13
  vendor: 'Fantem',
14
14
  description: 'Smart dimmer module without neutral',
15
15
  extend: extend.light_onoff_brightness({noConfigure: true}),
16
- fromZigbee: [...extend.light_onoff_brightness({noConfigure: true}).fromZigbee, fz.ZB006X_settings],
16
+ fromZigbee: [...extend.light_onoff_brightness({noConfigure: true}).fromZigbee, fz.command_on, fz.command_off,
17
+ fz.command_move, fz.command_stop, fz.ZB006X_settings],
17
18
  toZigbee: [...extend.light_onoff_brightness({noConfigure: true}).toZigbee, tz.ZB006X_settings],
18
19
  exposes: [e.light_brightness(),
20
+ e.action(['on', 'off', 'brightness_move_down', 'brightness_move_up', 'brightness_stop']),
19
21
  exposes.enum('ext_switch_type', ea.STATE_SET, ['unknown', 'toggle_sw', 'momentary_sw', 'rotary_sw', 'auto_config'])
20
22
  .withDescription('External switch type'),
21
23
  exposes.enum('load_detection_mode', ea.STATE_SET, ['none', 'first_power_on', 'every_power_on'])
22
24
  .withDescription('Load detection mode'),
23
25
  exposes.enum('control_mode', ea.STATE_SET, ['local', 'remote', 'both']).withDescription('Control mode'),
24
26
  ],
27
+ meta: {disableActionGroup: true},
25
28
  configure: async (device, coordinatorEndpoint, logger) => {
26
29
  await extend.light_onoff_brightness().configure(device, coordinatorEndpoint, logger);
27
30
  const endpoint = device.getEndpoint(1);
package/devices/innr.js CHANGED
@@ -159,6 +159,14 @@ module.exports = [
159
159
  extend: extend.light_onoff_brightness_colortemp_color({colorTempRange: [153, 555], supportsHS: true}),
160
160
  meta: {applyRedFix: true, turnsOffAtBrightness1: true},
161
161
  },
162
+ {
163
+ zigbeeModel: ['BY 286 C'],
164
+ model: 'BY 286 C',
165
+ vendor: 'Innr',
166
+ description: 'B22 bulb RGBW',
167
+ extend: extend.light_onoff_brightness_colortemp_color({colorTempRange: [153, 555], supportsHS: true}),
168
+ meta: {applyRedFix: true, turnsOffAtBrightness1: true},
169
+ },
162
170
  {
163
171
  zigbeeModel: ['RB 165'],
164
172
  model: 'RB 165',
package/devices/lidl.js CHANGED
@@ -496,6 +496,17 @@ module.exports = [
496
496
  device.getEndpoint(1).saveClusterAttributeKeyValue('lightingColorCtrl', {colorCapabilities: 29});
497
497
  },
498
498
  },
499
+ {
500
+ fingerprint: [{modelID: 'TS0504B', manufacturerName: '_TZ3210_sroezl0s'}],
501
+ model: '14153806L',
502
+ vendor: 'Lidl',
503
+ description: 'Livarno smart LED ceiling light',
504
+ ...extend.light_onoff_brightness_colortemp_color({disableColorTempStartup: true, colorTempRange: [153, 500]}),
505
+ meta: {applyRedFix: true, enhancedHue: false},
506
+ configure: async (device, coordinatorEndpoint, logger) => {
507
+ device.getEndpoint(1).saveClusterAttributeKeyValue('lightingColorCtrl', {colorCapabilities: 29});
508
+ },
509
+ },
499
510
  {
500
511
  fingerprint: [{modelID: 'TS0505B', manufacturerName: '_TZ3210_r0xgkft5'}],
501
512
  model: '14156506L',
@@ -4,6 +4,7 @@ const tz = require('../converters/toZigbee');
4
4
  const constants = require('../lib/constants');
5
5
  const reporting = require('../lib/reporting');
6
6
  const extend = require('../lib/extend');
7
+ const utils = require('../lib/utils');
7
8
  const e = exposes.presets;
8
9
  const ea = exposes.access;
9
10
 
@@ -17,6 +18,67 @@ const tzLocal = {
17
18
  },
18
19
  };
19
20
 
21
+ const fzLocal = {
22
+ schneider_powertag: {
23
+ cluster: 'greenPower',
24
+ type: ['commandNotification', 'commandCommisioningNotification'],
25
+ convert: async (model, msg, publish, options, meta) => {
26
+ if (msg.type !== 'commandNotification') {
27
+ return;
28
+ }
29
+
30
+ const commandID = msg.data.commandID;
31
+ if (utils.hasAlreadyProcessedMessage(msg, msg.data.frameCounter, `${msg.device.ieeeAddr}_${commandID}`)) return;
32
+
33
+ const rxAfterTx = (msg.data.options & (1<<11));
34
+ const ret = {};
35
+
36
+ switch (commandID) {
37
+ case 0xA1:
38
+ Object.entries(msg.data.commandFrame.attributes).forEach(([attr, val]) => {
39
+ switch (attr) {
40
+ case 'totalActivePower':
41
+ ret['power'] = val;
42
+ break;
43
+ case 'currentSummDelivered':
44
+ ret['energy'] = ((parseInt(val[0]) << 32) + parseInt(val[1])) / 1000.0;
45
+ break;
46
+ }
47
+ });
48
+
49
+ break;
50
+ case 0xA3:
51
+ // Should handle this cluster as well
52
+ break;
53
+ }
54
+
55
+ if (rxAfterTx) {
56
+ // Send Schneider specific ACK to make PowerTag happy
57
+ const networkParameters = await msg.device.zh.getNetworkParameters();
58
+ const payload = {
59
+ options: 0b000,
60
+ tempMaster: msg.data.gppNwkAddr,
61
+ tempMasterTx: networkParameters.channel - 11,
62
+ srcID: msg.data.srcID,
63
+ gpdCmd: 0xFE,
64
+ gpdPayload: {
65
+ commandID: 0xFE,
66
+ buffer: Buffer.alloc(1), // I hope it's zero initialised
67
+ },
68
+ };
69
+
70
+ await msg.endpoint.commandResponse('greenPower', 'response', payload,
71
+ {
72
+ srcEndpoint: 242,
73
+ disableDefaultResponse: true,
74
+ });
75
+ }
76
+
77
+ return ret;
78
+ },
79
+ },
80
+ };
81
+
20
82
  module.exports = [
21
83
  {
22
84
  zigbeeModel: ['PUCK/SHUTTER/1'],
@@ -714,4 +776,22 @@ module.exports = [
714
776
  await reporting.onOff(endpoint2);
715
777
  },
716
778
  },
779
+ {
780
+ zigbeeModel: ['CCT592011_AS'],
781
+ model: 'CCT592011',
782
+ vendor: 'Schneider Electric',
783
+ description: 'Wiser water leakage sensor',
784
+ fromZigbee: [fz.ias_water_leak_alarm_1],
785
+ toZigbee: [],
786
+ exposes: [e.battery_low(), e.water_leak(), e.tamper()],
787
+ },
788
+ {
789
+ fingerprint: [{modelID: 'GreenPower_254', ieeeAddr: /^0x00000000e.......$/}],
790
+ model: 'A9MEM1570',
791
+ vendor: 'Schneider Electric',
792
+ description: 'PowerTag power sensor',
793
+ fromZigbee: [fzLocal.schneider_powertag],
794
+ toZigbee: [],
795
+ exposes: [e.power(), e.energy()],
796
+ },
717
797
  ];
package/devices/tuya.js CHANGED
@@ -178,6 +178,15 @@ module.exports = [
178
178
  exposes: [e.temperature(), e.humidity(), e.co2(), e.voc(), e.formaldehyd().withUnit('ppm'),
179
179
  e.pm25().withValueMin(0).withValueMax(999).withValueStep(1)],
180
180
  },
181
+ {
182
+ fingerprint: [{modelID: 'TS0601', manufacturerName: '_TZE200_ogkdpgy2'}],
183
+ model: 'TS0601_co2_sensor',
184
+ vendor: 'TuYa',
185
+ description: 'NDIR co2 sensor',
186
+ fromZigbee: [fz.tuya_air_quality],
187
+ toZigbee: [],
188
+ exposes: [e.co2()],
189
+ },
181
190
  {
182
191
  fingerprint: [{modelID: 'TS0601', manufacturerName: '_TZE200_7bztmfm1'}],
183
192
  model: 'TS0601_smart_CO_air_box',
@@ -272,6 +281,7 @@ module.exports = [
272
281
  {modelID: 'TS0505B', manufacturerName: '_TZ3210_leyz4rju'},
273
282
  {modelID: 'TS0505B', manufacturerName: '_TZ3210_jd3z4yig'},
274
283
  {modelID: 'TS0505B', manufacturerName: '_TZ3210_dgdjiw1c'},
284
+ {modelID: 'TS0505B', manufacturerName: '_TZ3210_mzdax7ha'},
275
285
  {modelID: 'TS0505B', manufacturerName: '_TZ3210_a4s41wm4'},
276
286
  {modelID: 'TS0505B', manufacturerName: '_TZ3210_qxenlrin'}],
277
287
  model: 'TS0505B',
@@ -301,7 +311,6 @@ module.exports = [
301
311
  {
302
312
  fingerprint: [{modelID: 'TS0504B', manufacturerName: '_TZ3000_ukuvyhaa'},
303
313
  {modelID: 'TS0504B', manufacturerName: '_TZ3210_bfvybixd'},
304
- {modelID: 'TS0504B', manufacturerName: '_TZ3210_sroezl0s'},
305
314
  {modelID: 'TS0504B', manufacturerName: '_TZ3210_i2i0bsnv'},
306
315
  {modelID: 'TS0504B', manufacturerName: '_TZ3210_1elppmba'}],
307
316
  model: 'TS0504B',
@@ -1391,7 +1400,7 @@ module.exports = [
1391
1400
  },
1392
1401
  {
1393
1402
  fingerprint: [].concat(...TS011Fplugs.map((manufacturerName) => {
1394
- return [69, 68, 65, 64].map((applicationVersion) => {
1403
+ return [69, 68, 65, 64, 74].map((applicationVersion) => {
1395
1404
  return {modelID: 'TS011F', manufacturerName, applicationVersion};
1396
1405
  });
1397
1406
  })),
package/devices/xiaomi.js CHANGED
@@ -874,7 +874,7 @@ module.exports = [
874
874
  model: 'RTCGQ12LM',
875
875
  vendor: 'Xiaomi',
876
876
  description: 'Aqara T1 human body movement and illuminance sensor',
877
- fromZigbee: [fz.RTCGQ12LM_occupancy_illuminance, fz.aqara_opple, fz.battery],
877
+ fromZigbee: [fz.aqara_occupancy_illuminance, fz.aqara_opple, fz.battery],
878
878
  toZigbee: [tz.aqara_detection_interval],
879
879
  exposes: [e.occupancy(), e.illuminance().withUnit('lx').withDescription('Measured illuminance in lux'),
880
880
  exposes.numeric('detection_interval', ea.ALL).withValueMin(2).withValueMax(65535).withUnit('s')
@@ -906,6 +906,27 @@ module.exports = [
906
906
  },
907
907
  ota: ota.zigbeeOTA,
908
908
  },
909
+ {
910
+ zigbeeModel: ['lumi.motion.ac02'],
911
+ model: 'RTCGQ14LM',
912
+ vendor: 'Xiaomi',
913
+ whiteLabel: [{vendor: 'Xiaomi', model: 'MS-S02'}],
914
+ description: 'Aqara P1 human body movement and illuminance sensor',
915
+ fromZigbee: [fz.aqara_occupancy_illuminance, fz.aqara_opple, fz.battery],
916
+ toZigbee: [tz.aqara_detection_interval, tz.aqara_motion_sensitivity],
917
+ exposes: [e.occupancy(), e.illuminance().withUnit('lx').withDescription('Measured illuminance in lux'),
918
+ exposes.enum('motion_sensitivity', ea.ALL, ['low', 'medium', 'high']),
919
+ exposes.numeric('detection_interval', ea.ALL).withValueMin(2).withValueMax(65535).withUnit('s')
920
+ .withDescription('Time interval for detecting actions'), e.temperature(), e.battery()],
921
+ meta: {battery: {voltageToPercentage: '3V_2850_3000_log'}},
922
+ configure: async (device, coordinatorEndpoint, logger) => {
923
+ const endpoint = device.getEndpoint(1);
924
+ await endpoint.read('genPowerCfg', ['batteryVoltage']);
925
+ await endpoint.read('aqaraOpple', [0x0102], {manufacturerCode: 0x115f});
926
+ await endpoint.read('aqaraOpple', [0x010c], {manufacturerCode: 0x115f});
927
+ },
928
+ ota: ota.zigbeeOTA,
929
+ },
909
930
  {
910
931
  zigbeeModel: ['lumi.motion.ac01'],
911
932
  model: 'RTCZCGQ11LM',
package/lib/tuya.js CHANGED
@@ -645,6 +645,20 @@ const dataPoints = {
645
645
  // Moes switch with optional neutral
646
646
  moesSwitchPowerOnBehavior: 14,
647
647
  moesSwitchIndicateLight: 15,
648
+ // Connecte thermostat
649
+ connecteState: 1,
650
+ connecteMode: 2,
651
+ connecteHeatingSetpoint: 16,
652
+ connecteLocalTemp: 24,
653
+ connecteTempCalibration: 28,
654
+ connecteChildLock: 30,
655
+ connecteTempFloor: 101,
656
+ connecteSensorType: 102,
657
+ connecteHysteresis: 103,
658
+ connecteRunningState: 104,
659
+ connecteTempProgram: 105,
660
+ connecteOpenWindow: 106,
661
+ connecteMaxProtectTemp: 107,
648
662
  };
649
663
 
650
664
  const thermostatWeekFormat = {
package/lib/xiaomi.js CHANGED
@@ -238,7 +238,7 @@ const numericAttributes2Payload = (msg, meta, model, options, dataObject) => {
238
238
  mapping = 'right';
239
239
  }
240
240
  payload[`state_${mapping}`] = value === 1 ? 'ON' : 'OFF';
241
- } else if (['RTCGQ12LM'].includes(model.model)) {
241
+ } else if (['RTCGQ12LM', 'RTCGQ14LM'].includes(model.model)) {
242
242
  payload.illuminance = calibrateAndPrecisionRoundOptions(value, options, 'illuminance');
243
243
  } else if (['WSDCGQ01LM', 'WSDCGQ11LM'].includes(model.model)) {
244
244
  // https://github.com/Koenkk/zigbee2mqtt/issues/798
@@ -277,6 +277,13 @@ const numericAttributes2Payload = (msg, meta, model, options, dataObject) => {
277
277
  payload.motion_sensitivity = {1: 'low', 2: 'medium', 3: 'high'}[value];
278
278
  } else if (['RTCZCGQ11LM'].includes(model.model)) {
279
279
  payload.approach_distance = {0: 'far', 1: 'medium', 2: 'near'}[value];
280
+ } else if (['RTCGQ14LM'].includes(model.model)) {
281
+ payload.detection_interval = value;
282
+ }
283
+ break;
284
+ case '106':
285
+ if (['RTCGQ14LM'].includes(model.model)) {
286
+ payload.motion_sensitivity = {1: 'low', 2: 'medium', 3: 'high'}[value];
280
287
  }
281
288
  break;
282
289
  case '149':
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "zigbee-herdsman-converters",
3
- "version": "14.0.477",
3
+ "version": "14.0.480",
4
4
  "description": "Collection of device converters to be used with zigbee-herdsman",
5
5
  "main": "index.js",
6
6
  "files": [