zigbee-herdsman-converters 14.0.372 → 14.0.376

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.
@@ -3672,7 +3672,7 @@ const converters = {
3672
3672
  case tuya.dataPoints.moesSboostHeatingCountdown:
3673
3673
  return {boost_heating_countdown: value};
3674
3674
  case tuya.dataPoints.moesSreset:
3675
- break;
3675
+ return {valve_state: value ? 'CLOSED' : 'OPEN'};
3676
3676
  case tuya.dataPoints.moesSwindowDetectionFunktion_A2:
3677
3677
  return {window_detection: value ? 'ON' : 'OFF'};
3678
3678
  case tuya.dataPoints.moesSwindowDetection:
@@ -4136,6 +4136,51 @@ const converters = {
4136
4136
  }
4137
4137
  },
4138
4138
  },
4139
+ evanell_thermostat: {
4140
+ cluster: 'manuSpecificTuya',
4141
+ type: ['commandDataResponse', 'commandDataReport'],
4142
+ convert: (model, msg, publish, options, meta) => {
4143
+ const result = {};
4144
+ for (const dpValue of msg.data.dpValues) {
4145
+ const value = tuya.getDataValue(dpValue);
4146
+ switch (dpValue.dp) {
4147
+ case tuya.dataPoints.evanellChildLock:
4148
+ result.child_lock = value ? 'LOCK' : 'UNLOCK';
4149
+ break;
4150
+ case tuya.dataPoints.evanellBattery:
4151
+ result.battery = value;
4152
+ break;
4153
+ case tuya.dataPoints.evanellHeatingSetpoint:
4154
+ result.current_heating_setpoint = value/10;
4155
+ break;
4156
+ case tuya.dataPoints.evanellLocalTemp:
4157
+ result.local_temperature = value/10;
4158
+ break;
4159
+ case tuya.dataPoints.evanellMode:
4160
+ switch (value) {
4161
+ case 0: // manual
4162
+ result.system_mode = 'auto';
4163
+ break;
4164
+ case 2: // away
4165
+ result.system_mode = 'heat';
4166
+ break;
4167
+ case 3: // auto
4168
+ result.system_mode = 'off';
4169
+ break;
4170
+ default:
4171
+ meta.logger.warn('zigbee-herdsman-converters:evanell_thermostat: ' +
4172
+ `Mode ${value} is not recognized.`);
4173
+ break;
4174
+ }
4175
+ break;
4176
+ default:
4177
+ meta.logger.warn(`zigbee-herdsman-converters:evanell_thermostat: NOT RECOGNIZED ` +
4178
+ `DP #${dpValue.dp} with data ${JSON.stringify(dpValue)}`);
4179
+ }
4180
+ }
4181
+ return result;
4182
+ },
4183
+ },
4139
4184
  etop_thermostat: {
4140
4185
  cluster: 'manuSpecificTuya',
4141
4186
  type: ['commandDataResponse', 'commandDataReport'],
@@ -5160,7 +5205,7 @@ const converters = {
5160
5205
  if (msg.data.hasOwnProperty('0')) payload.detection_period = msg.data['0'];
5161
5206
  if (msg.data.hasOwnProperty('4')) payload.mode_switch = {4: 'anti_flicker_mode', 1: 'quick_mode'}[msg.data['4']];
5162
5207
  if (msg.data.hasOwnProperty('10')) payload.switch_type = {1: 'toggle', 2: 'momentary'}[msg.data['10']];
5163
- if (msg.data.hasOwnProperty('258')) payload.occupancy_timeout = msg.data['258'];
5208
+ if (msg.data.hasOwnProperty('258')) payload.detection_interval = msg.data['258'];
5164
5209
  if (msg.data.hasOwnProperty('268')) payload.motion_sensitivity = {1: 'low', 2: 'medium', 3: 'high'}[msg.data['268']];
5165
5210
  if (msg.data.hasOwnProperty('512')) {
5166
5211
  if (['ZNCZ15LM', 'QBCZ14LM', 'QBCZ15LM'].includes(model.model)) {
@@ -5321,7 +5366,7 @@ const converters = {
5321
5366
  if (msg.data.hasOwnProperty('illuminance')) {
5322
5367
  // The occupancy sensor only sends a message when motion detected.
5323
5368
  // Therefore we need to publish the no_motion detected by ourselves.
5324
- const timeout = meta && meta.state && meta.state.hasOwnProperty('occupancy_timeout') ? meta.state.occupancy_timeout : 60;
5369
+ const timeout = meta && meta.state && meta.state.hasOwnProperty('detection_interval') ? meta.state.detection_interval : 60;
5325
5370
 
5326
5371
  // Stop existing timers because motion is detected and set a new one.
5327
5372
  globalStore.getValue(msg.endpoint, 'timers', []).forEach((t) => clearTimeout(t));
@@ -5355,7 +5400,7 @@ const converters = {
5355
5400
 
5356
5401
  // The occupancy sensor only sends a message when motion detected.
5357
5402
  // Therefore we need to publish the no_motion detected by ourselves.
5358
- const timeout = meta && meta.state && meta.state.hasOwnProperty('occupancy_timeout') ? meta.state.occupancy_timeout : 60;
5403
+ const timeout = meta && meta.state && meta.state.hasOwnProperty('detection_interval') ? meta.state.detection_interval : 60;
5359
5404
 
5360
5405
  // Stop existing timers because motion is detected and set a new one.
5361
5406
  globalStore.getValue(msg.endpoint, 'timers', []).forEach((t) => clearTimeout(t));
@@ -7538,19 +7583,25 @@ const converters = {
7538
7583
  cluster: 'manuSpecificTuya',
7539
7584
  type: ['commandGetData', 'commandDataResponse', 'raw'],
7540
7585
  convert: (model, msg, publish, options, meta) => {
7541
- const dp = msg.data.dp;
7542
- const value = tuya.getDataValue(msg.data.datatype, msg.data.data);
7543
- switch (dp) {
7544
- case tuya.dataPoints.state:
7545
- return {contact: Boolean(value)};
7546
- case tuya.dataPoints.thitBatteryPercentage:
7547
- return {battery: value};
7548
- case tuya.dataPoints.tuyaVibration:
7549
- return {vibration: Boolean(value)};
7550
- default:
7551
- meta.logger.warn(`zigbee-herdsman-converters:tuya_smart_vibration_sensor: NOT RECOGNIZED ` +
7552
- `DP #${dp} with data ${JSON.stringify(msg.data)}`);
7586
+ const result = {};
7587
+ for (const dpValue of msg.data.dpValues) {
7588
+ const value = tuya.getDataValue(dpValue);
7589
+ switch (dpValue.dp) {
7590
+ case tuya.dataPoints.state:
7591
+ result.contact = Boolean(value);
7592
+ break;
7593
+ case tuya.dataPoints.thitBatteryPercentage:
7594
+ result.battery = value;
7595
+ break;
7596
+ case tuya.dataPoints.tuyaVibration:
7597
+ result.vibration = Boolean(value);
7598
+ break;
7599
+ default:
7600
+ meta.logger.warn(`zigbee-herdsman-converters:tuya_smart_vibration_sensor: NOT RECOGNIZED ` +
7601
+ `DP #${dpValue.dp} with data ${JSON.stringify(dpValue)}`);
7602
+ }
7553
7603
  }
7604
+ return result;
7554
7605
  },
7555
7606
  },
7556
7607
  moes_thermostat_tv: {
@@ -1915,6 +1915,8 @@ const converters = {
1915
1915
  }
1916
1916
  }
1917
1917
  }
1918
+
1919
+ return {state: {hue_power_on_behavior: value}};
1918
1920
  },
1919
1921
  },
1920
1922
  hue_power_on_error: {
@@ -2076,12 +2078,12 @@ const converters = {
2076
2078
  await entity.read('aqaraOpple', [0x0000], manufacturerOptions.xiaomi);
2077
2079
  },
2078
2080
  },
2079
- aqara_occupancy_timeout: {
2080
- key: ['occupancy_timeout'],
2081
+ aqara_detection_interval: {
2082
+ key: ['detection_interval'],
2081
2083
  convertSet: async (entity, key, value, meta) => {
2082
2084
  value *= 1;
2083
2085
  await entity.write('aqaraOpple', {0x0102: {value: [value], type: 0x20}}, manufacturerOptions.xiaomi);
2084
- return {state: {occupancy_timeout: value}};
2086
+ return {state: {detection_interval: value}};
2085
2087
  },
2086
2088
  convertGet: async (entity, key, meta) => {
2087
2089
  await entity.read('aqaraOpple', [0x0102], manufacturerOptions.xiaomi);
@@ -5409,6 +5411,35 @@ const converters = {
5409
5411
  await tuya.sendDataPointValue(entity, tuya.dataPoints.saswellTempCalibration, value);
5410
5412
  },
5411
5413
  },
5414
+ evanell_thermostat_current_heating_setpoint: {
5415
+ key: ['current_heating_setpoint'],
5416
+ convertSet: async (entity, key, value, meta) => {
5417
+ const temp = Math.round(value * 10);
5418
+ await tuya.sendDataPointValue(entity, tuya.dataPoints.evanellHeatingSetpoint, temp);
5419
+ },
5420
+ },
5421
+ evanell_thermostat_system_mode: {
5422
+ key: ['system_mode'],
5423
+ convertSet: async (entity, key, value, meta) => {
5424
+ switch (value) {
5425
+ case 'off':
5426
+ await tuya.sendDataPointEnum(entity, tuya.dataPoints.evanellMode, 3 /* off */);
5427
+ break;
5428
+ case 'heat':
5429
+ await tuya.sendDataPointEnum(entity, tuya.dataPoints.evanellMode, 2 /* manual */);
5430
+ break;
5431
+ case 'auto':
5432
+ await tuya.sendDataPointEnum(entity, tuya.dataPoints.evanellMode, 0 /* auto */);
5433
+ break;
5434
+ }
5435
+ },
5436
+ },
5437
+ evanell_thermostat_child_lock: {
5438
+ key: ['child_lock'],
5439
+ convertSet: async (entity, key, value, meta) => {
5440
+ await tuya.sendDataPointBool(entity, tuya.dataPoints.evanellChildLock, value === 'LOCK');
5441
+ },
5442
+ },
5412
5443
  silvercrest_smart_led_string: {
5413
5444
  key: ['color', 'brightness', 'effect'],
5414
5445
  convertSet: async (entity, key, value, meta) => {
@@ -30,19 +30,22 @@ module.exports = [
30
30
  vendor: 'BTicino',
31
31
  description: 'Dimmer switch with neutral',
32
32
  extend: extend.light_onoff_brightness({noConfigure: true}),
33
- exposes: [
34
- e.light_brightness(),
33
+ fromZigbee: [fz.brightness, fz.identify, fz.on_off, fz.lighting_ballast_configuration],
34
+ toZigbee: [tz.light_onoff_brightness, tz.legrand_settingAlwaysEnableLed, tz.legrand_settingEnableLedIfOn,
35
+ tz.legrand_settingEnableDimmer, tz.legrand_identify, tz.ballast_config],
36
+ exposes: [e.light_brightness(),
37
+ exposes.numeric('ballast_minimum_level', ea.ALL).withValueMin(1).withValueMax(254)
38
+ .withDescription('Specifies the minimum brightness value'),
39
+ exposes.numeric('ballast_maximum_level', ea.ALL).withValueMin(1).withValueMax(254)
40
+ .withDescription('Specifies the maximum brightness value'),
35
41
  exposes.binary('dimmer_enabled', ea.STATE_SET, 'ON', 'OFF').withDescription('Allow the device to change brightness'),
36
42
  exposes.binary('permanent_led', ea.STATE_SET, 'ON', 'OFF').withDescription('Enable or disable the permanent blue LED'),
37
- exposes.binary('led_when_on', ea.STATE_SET, 'ON', 'OFF').withDescription('Enables the LED when the light is on'),
38
- ],
39
- fromZigbee: [fz.brightness, fz.identify, fz.on_off],
40
- toZigbee: [tz.light_onoff_brightness, tz.legrand_settingAlwaysEnableLed, tz.legrand_settingEnableLedIfOn,
41
- tz.legrand_settingEnableDimmer, tz.legrand_identify],
43
+ exposes.binary('led_when_on', ea.STATE_SET, 'ON', 'OFF').withDescription('Enables the LED when the light is on')],
42
44
  configure: async (device, coordinatorEndpoint, logger) => {
43
45
  await extend.light_onoff_brightness().configure(device, coordinatorEndpoint, logger);
44
46
  const endpoint = device.getEndpoint(1);
45
- await reporting.bind(endpoint, coordinatorEndpoint, ['genIdentify', 'genOnOff', 'genLevelCtrl', 'genBinaryInput']);
47
+ await reporting.bind(endpoint, coordinatorEndpoint, ['genIdentify', 'genOnOff', 'genLevelCtrl',
48
+ 'genBinaryInput', 'lightingBallastCfg']);
46
49
  await reporting.onOff(endpoint);
47
50
  await reporting.brightness(endpoint);
48
51
  },
@@ -70,7 +73,7 @@ module.exports = [
70
73
  {
71
74
  zigbeeModel: ['Bticino Din power consumption module '],
72
75
  model: 'F20T60A',
73
- description: 'DIN power consumption module',
76
+ description: 'DIN power consumption module (same as Legrand 412015)',
74
77
  vendor: 'BTicino',
75
78
  extend: extend.switch(),
76
79
  fromZigbee: [fz.identify, fz.on_off, fz.electrical_measurement, fz.legrand_device_mode, fz.ignore_basic_report, fz.ignore_genOta],
@@ -0,0 +1,29 @@
1
+ const exposes = require('../lib/exposes');
2
+ const fz = require('../converters/fromZigbee');
3
+ const tz = require('../converters/toZigbee');
4
+ const tuya = require('../lib/tuya');
5
+ const reporting = require('../lib/reporting');
6
+ const e = exposes.presets;
7
+ const ea = exposes.access;
8
+
9
+ module.exports = [
10
+ {
11
+ fingerprint: [{modelID: 'TS0601', manufacturerName: '_TZE200_dmfguuli'}],
12
+ model: 'EZ200',
13
+ vendor: 'Evanell',
14
+ description: 'Thermostatic radiator valve',
15
+ fromZigbee: [fz.evanell_thermostat],
16
+ toZigbee: [tz.evanell_thermostat_current_heating_setpoint, tz.evanell_thermostat_system_mode,
17
+ tz.evanell_thermostat_child_lock],
18
+ onEvent: tuya.onEventSetTime,
19
+ configure: async (device, coordinatorEndpoint, logger) => {
20
+ const endpoint = device.getEndpoint(1);
21
+ await reporting.bind(endpoint, coordinatorEndpoint, ['genBasic']);
22
+ },
23
+ exposes: [e.child_lock(), e.battery(),
24
+ exposes.climate()
25
+ .withSetpoint('current_heating_setpoint', 5, 30, 0.5, ea.STATE_SET).withLocalTemperature(ea.STATE)
26
+ .withSystemMode(['off', 'heat', 'auto'], ea.STATE_SET),
27
+ ],
28
+ },
29
+ ];
package/devices/iris.js CHANGED
@@ -3,6 +3,7 @@ const fz = {...require('../converters/fromZigbee'), legacy: require('../lib/lega
3
3
  const tz = require('../converters/toZigbee');
4
4
  const reporting = require('../lib/reporting');
5
5
  const e = exposes.presets;
6
+ const extend = require('../lib/extend');
6
7
 
7
8
  module.exports = [
8
9
  {
@@ -18,6 +19,8 @@ module.exports = [
18
19
  await reporting.bind(endpoint, coordinatorEndpoint, ['msTemperatureMeasurement', 'genPowerCfg']);
19
20
  await reporting.temperature(endpoint);
20
21
  await reporting.batteryVoltage(endpoint);
22
+ device.powerSource = 'Battery';
23
+ device.save();
21
24
  },
22
25
  exposes: [e.contact(), e.battery_low(), e.tamper(), e.temperature(), e.battery()],
23
26
  },
@@ -144,4 +147,18 @@ module.exports = [
144
147
  },
145
148
  exposes: [e.switch(), e.battery()],
146
149
  },
150
+ {
151
+ zigbeeModel: ['1113-S'],
152
+ model: 'iL03_1',
153
+ vendor: 'Iris',
154
+ description: 'Smart plug',
155
+ extend: extend.switch(),
156
+ configure: async (device, coordinatorEndpoint, logger) => {
157
+ const endpoint = device.getEndpoint(1);
158
+ await reporting.bind(endpoint, coordinatorEndpoint, ['genOnOff']);
159
+ await reporting.onOff(endpoint);
160
+ device.powerSource = 'Mains (single phase)';
161
+ device.save();
162
+ },
163
+ },
147
164
  ];
@@ -0,0 +1,18 @@
1
+ const reporting = require('../lib/reporting');
2
+ const extend = require('../lib/extend');
3
+
4
+ module.exports = [
5
+ {
6
+ zigbeeModel: ['35938'],
7
+ model: 'ZB3102',
8
+ vendor: 'Jasco Products',
9
+ description: 'Zigbee plug-in smart dimmer',
10
+ extend: extend.light_onoff_brightness({noConfigure: true}),
11
+ configure: async (device, coordinatorEndpoint, logger) => {
12
+ await extend.light_onoff_brightness().configure(device, coordinatorEndpoint, logger);
13
+ const endpoint = device.getEndpoint(1);
14
+ await reporting.bind(endpoint, coordinatorEndpoint, ['genOnOff']);
15
+ await reporting.onOff(endpoint);
16
+ },
17
+ },
18
+ ];
@@ -19,7 +19,7 @@ module.exports = [
19
19
  zigbeeModel: [' Contactor\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000'+
20
20
  '\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000'],
21
21
  model: 'FC80CC',
22
- description: 'Legrand (or Bticino) DIN contactor module (note: Legrand 412171 may be similar to Bticino FC80CC)',
22
+ description: 'Legrand (or Bticino) DIN contactor module',
23
23
  vendor: 'Legrand',
24
24
  extend: extend.switch(),
25
25
  fromZigbee: [fz.identify, fz.on_off, fz.electrical_measurement, fz.legrand_device_mode, fz.ignore_basic_report, fz.ignore_genOta],
package/devices/lidl.js CHANGED
@@ -667,7 +667,7 @@ module.exports = [
667
667
  fingerprint: [{modelID: 'TS0101', manufacturerName: '_TZ3000_pnzfdr9y'}],
668
668
  model: 'HG06619',
669
669
  vendor: 'Lidl',
670
- description: 'Silvercrest oudoor plug',
670
+ description: 'Silvercrest outdoor plug',
671
671
  extend: extend.switch(),
672
672
  configure: async (device, coordinatorEndpoint, logger) => {
673
673
  const endpoint = device.getEndpoint(1);
package/devices/moes.js CHANGED
@@ -206,7 +206,7 @@ module.exports = [
206
206
  tz.moesS_thermostat_system_mode, tz.moesS_thermostat_schedule_programming],
207
207
  exposes: [
208
208
  e.battery(), e.child_lock(), e.eco_mode(), e.eco_temperature(), e.max_temperature(), e.min_temperature(),
209
- e.position(), e.window_detection(),
209
+ e.valve_state(), e.position(), e.window_detection(),
210
210
  exposes.binary('window', ea.STATE, 'CLOSED', 'OPEN').withDescription('Window status closed or open '),
211
211
  exposes.climate()
212
212
  .withLocalTemperature(ea.STATE).withSetpoint('current_heating_setpoint', 5, 35, 0.5, ea.STATE_SET)
package/devices/osram.js CHANGED
@@ -390,14 +390,15 @@ module.exports = [
390
390
  ota: ota.ledvance,
391
391
  },
392
392
  {
393
- zigbeeModel: ['Zigbee 3.0 DALI CONV LI'],
393
+ zigbeeModel: ['Zigbee 3.0 DALI CONV LI', 'Zigbee 3.0 DALI CONV LI\u0000'],
394
394
  model: '4062172044776_1',
395
395
  vendor: 'OSRAM',
396
396
  description: 'Zigbee 3.0 DALI CONV LI dimmer for DALI-based luminaires (only one device)',
397
397
  extend: extend.ledvance.light_onoff_brightness(),
398
398
  },
399
399
  {
400
- fingerprint: [{modelID: 'Zigbee 3.0 DALI CONV LI', endpoints: [{ID: 10}, {ID: 25}, {ID: 242}]}],
400
+ fingerprint: [{modelID: 'Zigbee 3.0 DALI CONV LI', endpoints: [{ID: 10}, {ID: 25}, {ID: 242}]},
401
+ {modelID: 'Zigbee 3.0 DALI CONV LI\u0000', endpoints: [{ID: 10}, {ID: 25}, {ID: 242}]}],
401
402
  model: '4062172044776_2',
402
403
  vendor: 'OSRAM',
403
404
  description: 'Zigbee 3.0 DALI CONV LI dimmer for DALI-based luminaires (one device and pushbutton)',
@@ -410,7 +411,8 @@ module.exports = [
410
411
  },
411
412
  },
412
413
  {
413
- fingerprint: [{modelID: 'Zigbee 3.0 DALI CONV LI', endpoints: [{ID: 10}, {ID: 11}, {ID: 242}]}],
414
+ fingerprint: [{modelID: 'Zigbee 3.0 DALI CONV LI', endpoints: [{ID: 10}, {ID: 11}, {ID: 242}]},
415
+ {modelID: 'Zigbee 3.0 DALI CONV LI\u0000', endpoints: [{ID: 10}, {ID: 11}, {ID: 242}]}],
414
416
  model: '4062172044776_3',
415
417
  vendor: 'OSRAM',
416
418
  description: 'Zigbee 3.0 DALI CONV LI dimmer for DALI-based luminaires (with two devices)',
@@ -430,7 +432,8 @@ module.exports = [
430
432
  },
431
433
  },
432
434
  {
433
- fingerprint: [{modelID: 'Zigbee 3.0 DALI CONV LI', endpoints: [{ID: 10}, {ID: 11}, {ID: 25}, {ID: 242}]}],
435
+ fingerprint: [{modelID: 'Zigbee 3.0 DALI CONV LI', endpoints: [{ID: 10}, {ID: 11}, {ID: 25}, {ID: 242}]},
436
+ {modelID: 'Zigbee 3.0 DALI CONV LI\u0000', endpoints: [{ID: 10}, {ID: 11}, {ID: 25}, {ID: 242}]}],
434
437
  model: '4062172044776_4',
435
438
  vendor: 'OSRAM',
436
439
  description: 'Zigbee 3.0 DALI CONV LI dimmer for DALI-based luminaires (with two devices and pushbutton)',
@@ -35,7 +35,7 @@ module.exports = [
35
35
  vendor: 'Philips',
36
36
  description: 'Centura recessed spotlight',
37
37
  meta: {turnsOffAtBrightness1: true},
38
- extend: hueExtend.light_onoff_brightness_colortemp({colorTempRange: [153, 500]}),
38
+ extend: hueExtend.light_onoff_brightness_colortemp_color({colorTempRange: [153, 500]}),
39
39
  ota: ota.zigbeeOTA,
40
40
  },
41
41
  {
@@ -2574,4 +2574,13 @@ module.exports = [
2574
2574
  extend: hueExtend.light_onoff_brightness(),
2575
2575
  ota: ota.zigbeeOTA,
2576
2576
  },
2577
+ {
2578
+ zigbeeModel: ['LWA019'],
2579
+ model: '9290024691',
2580
+ vendor: 'Philips',
2581
+ description: 'Hue white single filament bulb A19 E26 with Bluetooth (1100 Lumen)',
2582
+ meta: {turnsOffAtBrightness1: true},
2583
+ extend: hueExtend.light_onoff_brightness(),
2584
+ ota: ota.zigbeeOTA,
2585
+ },
2577
2586
  ];
package/devices/tuya.js CHANGED
@@ -209,6 +209,7 @@ module.exports = [
209
209
  fingerprint: [{modelID: 'TS0202', manufacturerName: '_TYZB01_ef5xlc9q'},
210
210
  {modelID: 'TS0202', manufacturerName: '_TYZB01_vwqnz1sn'},
211
211
  {modelID: 'TS0202', manufacturerName: '_TYZB01_2b8f6cio'},
212
+ {modelID: 'TS0202', manufacturerName: '_TZE200_bq5c8xfe'},
212
213
  {modelID: 'TS0202', manufacturerName: '_TYZB01_dl7cejts'},
213
214
  {modelID: 'TS0202', manufacturerName: '_TYZB01_qjqgmqxr'},
214
215
  {modelID: 'TS0202', manufacturerName: '_TZ3000_mmtwjmaq'},
@@ -222,7 +223,7 @@ module.exports = [
222
223
  model: 'TS0202',
223
224
  vendor: 'TuYa',
224
225
  description: 'Motion sensor',
225
- whiteLabel: [{vendor: 'Mercator Ikuü', model: 'SMA02P'}],
226
+ whiteLabel: [{vendor: 'Mercator Ikuü', model: 'SMA02P'}, {vendor: 'TuYa ', model: 'TY-ZPR06'}],
226
227
  fromZigbee: [fz.ias_occupancy_alarm_1, fz.battery, fz.ignore_basic_report, fz.ias_occupancy_alarm_1_report],
227
228
  toZigbee: [],
228
229
  exposes: [e.occupancy(), e.battery_low(), e.tamper(), e.battery()],
@@ -1142,7 +1143,9 @@ module.exports = [
1142
1143
  toZigbee: [tz.on_off, tz.tuya_switch_power_outage_memory],
1143
1144
  configure: async (device, coordinatorEndpoint, logger) => {
1144
1145
  const endpoint = device.getEndpoint(1);
1145
- await reporting.bind(endpoint, coordinatorEndpoint, ['genOnOff']);
1146
+ // Enables reporting of physical state changes
1147
+ // https://github.com/Koenkk/zigbee2mqtt/issues/9057#issuecomment-1007742130
1148
+ await endpoint.read('genBasic', ['manufacturerName', 'zclVersion', 'appVersion', 'modelId', 'powerSource', 0xfffe]);
1146
1149
  endpoint.saveClusterAttributeKeyValue('haElectricalMeasurement', {acCurrentDivisor: 1000, acCurrentMultiplier: 1});
1147
1150
  endpoint.saveClusterAttributeKeyValue('seMetering', {divisor: 100, multiplier: 1});
1148
1151
  device.save();
@@ -1658,7 +1661,10 @@ module.exports = [
1658
1661
  toZigbee: [],
1659
1662
  configure: async (device, coordinatorEndpoint, logger) => {
1660
1663
  const endpoint = device.getEndpoint(1);
1661
- await reporting.bind(endpoint, coordinatorEndpoint, ['genBasic', 'genPowerCfg']);
1664
+ // Enables reporting of measurement state changes
1665
+ await endpoint.read('genBasic', ['manufacturerName', 'zclVersion', 'appVersion', 'modelId', 'powerSource', 0xfffe]);
1666
+ await reporting.bind(endpoint, coordinatorEndpoint, ['genBasic', 'genPowerCfg',
1667
+ 'msTemperatureMeasurement', 'msIlluminanceMeasurement', 'msRelativeHumidity', 'manuSpecificTuya_2']);
1662
1668
  },
1663
1669
  exposes: [e.temperature(), e.humidity(), e.battery(), e.illuminance(), e.illuminance_lux(),
1664
1670
  exposes.numeric('alarm_temperature_max', ea.STATE).withUnit('°C').withDescription('Alarm temperature max'),
package/devices/xiaomi.js CHANGED
@@ -875,10 +875,10 @@ module.exports = [
875
875
  vendor: 'Xiaomi',
876
876
  description: 'Aqara T1 human body movement and illuminance sensor',
877
877
  fromZigbee: [fz.RTCGQ12LM_occupancy_illuminance, fz.aqara_opple, fz.battery],
878
- toZigbee: [tz.aqara_occupancy_timeout],
878
+ toZigbee: [tz.aqara_detection_interval],
879
879
  exposes: [e.occupancy(), e.illuminance().withUnit('lx').withDescription('Measured illuminance in lux'),
880
- exposes.numeric('occupancy_timeout', ea.ALL).withValueMin(2).withValueMax(65535).withUnit('s')
881
- .withDescription('Time in seconds till occupancy goes to false'), e.battery()],
880
+ exposes.numeric('detection_interval', ea.ALL).withValueMin(2).withValueMax(65535).withUnit('s')
881
+ .withDescription('Time interval for detecting actions'), e.battery()],
882
882
  meta: {battery: {voltageToPercentage: '3V_2100'}},
883
883
  configure: async (device, coordinatorEndpoint, logger) => {
884
884
  const endpoint = device.getEndpoint(1);
@@ -892,10 +892,10 @@ module.exports = [
892
892
  vendor: 'Xiaomi',
893
893
  description: 'Aqara high precision motion sensor',
894
894
  fromZigbee: [fz.RTCGQ13LM_occupancy, fz.aqara_opple, fz.battery],
895
- toZigbee: [tz.aqara_occupancy_timeout, tz.RTCGQ13LM_motion_sensitivity],
895
+ toZigbee: [tz.aqara_detection_interval, tz.RTCGQ13LM_motion_sensitivity],
896
896
  exposes: [e.occupancy(), exposes.enum('motion_sensitivity', ea.ALL, ['low', 'medium', 'high']),
897
- exposes.numeric('occupancy_timeout', ea.ALL).withValueMin(2).withValueMax(65535).withUnit('s')
898
- .withDescription('Time in seconds till occupancy goes to false'), e.battery()],
897
+ exposes.numeric('detection_interval', ea.ALL).withValueMin(2).withValueMax(65535).withUnit('s')
898
+ .withDescription('Time interval for detecting actions'), e.battery()],
899
899
  meta: {battery: {voltageToPercentage: '3V_2100'}},
900
900
  configure: async (device, coordinatorEndpoint, logger) => {
901
901
  const endpoint = device.getEndpoint(1);
@@ -12,11 +12,15 @@ const fzLocal = {
12
12
  type: ['commandGetData', 'commandSetDataResponse', 'commandDataResponse'],
13
13
  convert: (model, msg, publish, options, meta) => {
14
14
  const dpValue = tuya.firstDpValue(msg, meta, 'ZMRM02');
15
- const button = dpValue.dp;
16
- const actionValue = tuya.getDataValue(dpValue);
17
- const lookup = {0: 'single', 1: 'double', 2: 'hold'};
18
- const action = lookup[actionValue];
19
- return {action: `button_${button}_${action}`};
15
+ if (dpValue.dp === 10) {
16
+ return {battery: tuya.getDataValue(dpValue)};
17
+ } else {
18
+ const button = dpValue.dp;
19
+ const actionValue = tuya.getDataValue(dpValue);
20
+ const lookup = {0: 'single', 1: 'double', 2: 'hold'};
21
+ const action = lookup[actionValue];
22
+ return {action: `button_${button}_${action}`};
23
+ }
20
24
  },
21
25
  },
22
26
  };
@@ -90,7 +94,7 @@ module.exports = [
90
94
  fromZigbee: [fzLocal.ZMRM02],
91
95
  toZigbee: [],
92
96
  onEvent: tuya.onEventSetTime,
93
- exposes: [e.action([
97
+ exposes: [e.battery(), e.action([
94
98
  'button_1_hold', 'button_1_single', 'button_1_double',
95
99
  'button_2_hold', 'button_2_single', 'button_2_double',
96
100
  'button_3_hold', 'button_3_single', 'button_3_double',
package/lib/exposes.js CHANGED
@@ -557,7 +557,7 @@ module.exports = {
557
557
  linkquality: () => new Numeric('linkquality', access.STATE).withUnit('lqi').withDescription('Link quality (signal strength)').withValueMin(0).withValueMax(255),
558
558
  local_temperature: () => new Numeric('local_temperature', access.STATE_GET).withUnit('°C').withDescription('Current temperature measured on the device'),
559
559
  lock: () => new Lock().withState('state', 'LOCK', 'UNLOCK', 'State of the lock').withLockState('lock_state', 'Actual state of the lock'),
560
- max_temperature: () => new Numeric('max_temperature', access.STATE_SET).withUnit('°C').withDescription('Maximum temperature').withValueMin(15).withValueMax(70),
560
+ max_temperature: () => new Numeric('max_temperature', access.STATE_SET).withUnit('°C').withDescription('Maximum temperature').withValueMin(15).withValueMax(35),
561
561
  max_temperature_limit: () => new Numeric('max_temperature_limit', access.STATE_SET).withUnit('°C').withDescription('Maximum temperature limit').withValueMin(0).withValueMax(35),
562
562
  min_temperature: () => new Numeric('min_temperature', access.STATE_SET).withUnit('°C').withDescription('Minimum temperature').withValueMin(1).withValueMax(15),
563
563
  noise: () => new Numeric('noise', access.STATE).withUnit('dBA').withDescription('The measured noise value'),
@@ -585,6 +585,7 @@ module.exports = {
585
585
  tamper: () => new Binary('tamper', access.STATE, true, false).withDescription('Indicates whether the device is tampered'),
586
586
  temperature: () => new Numeric('temperature', access.STATE).withUnit('°C').withDescription('Measured temperature value'),
587
587
  test: () => new Binary('test', access.STATE, true, false).withDescription('Indicates whether the device is being tested'),
588
+ valve_state: () => new Binary('valve_state', access.STATE, 'OPEN', 'CLOSED').withDescription('Valve state if open or closed'),
588
589
  valve_detection: () => new Switch().withState('valve_detection', true).setAccess('state', access.STATE_SET),
589
590
  vibration: () => new Binary('vibration', access.STATE, true, false).withDescription('Indicates whether the device detected vibration'),
590
591
  voc: () => new Numeric('voc', access.STATE).withUnit('ppb').withDescription('Measured VOC value'),
package/lib/tuya.js CHANGED
@@ -85,10 +85,6 @@ async function onEventMeasurementPoll(type, data, device, options) {
85
85
  const interval = setInterval(async () => {
86
86
  try {
87
87
  await endpoint.read('haElectricalMeasurement', ['rmsVoltage', 'rmsCurrent', 'activePower']);
88
- await endpoint.read('seMetering', ['currentSummDelivered']);
89
- if (device.manufacturerName === '_TZ3000_u5u4cakc') {
90
- await endpoint.read('genOnOff', ['onOff']);
91
- }
92
88
  } catch (error) {/* Do nothing*/}
93
89
  }, seconds*1000);
94
90
  globalStore.putValue(device, 'interval', interval);
@@ -535,6 +531,12 @@ const dataPoints = {
535
531
  // TUYA WLS-100z Water Leak Sensor
536
532
  wlsWaterLeak: 1,
537
533
  wlsBatteryPercentage: 4,
534
+ // Evanell
535
+ evanellMode: 2,
536
+ evanellHeatingSetpoint: 4,
537
+ evanellLocalTemp: 5,
538
+ evanellBattery: 6,
539
+ evanellChildLock: 8,
538
540
  };
539
541
 
540
542
  const thermostatWeekFormat = {
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "zigbee-herdsman-converters",
3
- "version": "14.0.372",
3
+ "version": "14.0.376",
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.372",
3
+ "version": "14.0.376",
4
4
  "description": "Collection of device converters to be used with zigbee-herdsman",
5
5
  "main": "index.js",
6
6
  "files": [