zigbee-herdsman-converters 14.0.507 → 14.0.510

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.
package/README.md CHANGED
@@ -4,7 +4,7 @@
4
4
  Collection of device converters to be used with zigbee-herdsman.
5
5
 
6
6
  ## Contributing
7
- See [Zigbee2MQTT how to support new devices](http://www.zigbee2mqtt.io/how_tos/how_to_support_new_devices.html).
7
+ See [Zigbee2MQTT how to support new devices](https://www.zigbee2mqtt.io/advanced/support-new-devices/01_support_new_devices.html).
8
8
 
9
9
  ## Submitting a pull request
10
10
  If you'd like to submit a pull request, you should run the following commands to ensure your changes will pass the tests:
@@ -1693,10 +1693,10 @@ const converters = {
1693
1693
  result.temperature_display = lookup[data[0x1008]];
1694
1694
  }
1695
1695
  if (data.hasOwnProperty(0x1009)) { // WindowOpenCheck
1696
- result.window_open_check = data[0x1009];
1696
+ result.window_open_check = data[0x1009] / 2;
1697
1697
  }
1698
1698
  if (data.hasOwnProperty(0x100A)) { // Hysterersis
1699
- result.hysterersis = data[0x100A];
1699
+ result.hysterersis = precisionRound(data[0x100A], 2) / 10;
1700
1700
  }
1701
1701
  if (data.hasOwnProperty(0x100B)) { // DisplayAutoOffEnable
1702
1702
  const lookup = {0: 'enable', 1: 'disable'};
@@ -1909,34 +1909,57 @@ const converters = {
1909
1909
  },
1910
1910
  nous_lcd_temperature_humidity_sensor: {
1911
1911
  cluster: 'manuSpecificTuya',
1912
- type: ['commandDataResponse'],
1912
+ type: ['commandDataResponse', 'commandDataReport'],
1913
1913
  options: [exposes.options.precision('temperature'), exposes.options.calibration('temperature'),
1914
1914
  exposes.options.precision('humidity'), exposes.options.calibration('humidity')],
1915
1915
  convert: (model, msg, publish, options, meta) => {
1916
- const dpValue = tuya.firstDpValue(msg, meta, 'nous_lcd_temperature_humidity_sensor');
1917
- const dp = dpValue.dp;
1918
- const value = tuya.getDataValue(dpValue);
1919
- switch (dp) {
1920
- case tuya.dataPoints.nousTemperature:
1921
- return {temperature: calibrateAndPrecisionRoundOptions(value / 10, options, 'temperature')};
1922
- case tuya.dataPoints.nousHumidity:
1923
- return {humidity: calibrateAndPrecisionRoundOptions(value, options, 'humidity')};
1924
- case tuya.dataPoints.nousBattery:
1925
- return {battery: value};
1926
- case tuya.dataPoints.nousTempUnitConvert:
1927
- return {temperature_unit_convert: {0x00: 'celsius', 0x01: 'fahrenheit'}[value]};
1928
- case tuya.dataPoints.nousMaxTemp:
1929
- return {max_temperature: calibrateAndPrecisionRoundOptions(value / 10, options, 'temperature')};
1930
- case tuya.dataPoints.nousMinTemp:
1931
- return {min_temperature: calibrateAndPrecisionRoundOptions(value / 10, options, 'temperature')};
1932
- case tuya.dataPoints.nousTempAlarm:
1933
- return {temperature_alarm: {0x00: 'canceled', 0x01: 'lower_alarm', 0x02: 'upper_alarm'}[value]};
1934
- case tuya.dataPoints.nousTempSensitivity:
1935
- return {temperature_sensitivity: calibrateAndPrecisionRoundOptions(value / 10, options, 'temperature')};
1936
- default:
1937
- meta.logger.warn(`zigbee-herdsman-converters:nous_lcd_temperature_humidity_sensor: NOT RECOGNIZED ` +
1938
- `DP #${dp} with data ${JSON.stringify(dpValue)}`);
1916
+ const result = {};
1917
+ for (const dpValue of msg.data.dpValues) {
1918
+ const dp = dpValue.dp;
1919
+ const value = tuya.getDataValue(dpValue);
1920
+ switch (dp) {
1921
+ case tuya.dataPoints.nousTemperature:
1922
+ result.temperature = calibrateAndPrecisionRoundOptions(value / 10, options, 'temperature');
1923
+ break;
1924
+ case tuya.dataPoints.nousHumidity:
1925
+ result.humidity = calibrateAndPrecisionRoundOptions(value, options, 'humidity');
1926
+ break;
1927
+ case tuya.dataPoints.nousBattery:
1928
+ result.battery = value;
1929
+ break;
1930
+ case tuya.dataPoints.nousTempUnitConvert:
1931
+ result.temperature_unit_convert = {0x00: 'celsius', 0x01: 'fahrenheit'}[value];
1932
+ break;
1933
+ case tuya.dataPoints.nousMaxTemp:
1934
+ result.max_temperature = calibrateAndPrecisionRoundOptions(value / 10, options, 'temperature');
1935
+ break;
1936
+ case tuya.dataPoints.nousMinTemp:
1937
+ result.min_temperature = calibrateAndPrecisionRoundOptions(value / 10, options, 'temperature');
1938
+ break;
1939
+ case tuya.dataPoints.nousMaxHumi:
1940
+ result.max_humidity = calibrateAndPrecisionRoundOptions(value / 10, options, 'humidity');
1941
+ break;
1942
+ case tuya.dataPoints.nousMinHumi:
1943
+ result.min_humidity = calibrateAndPrecisionRoundOptions(value / 10, options, 'humidity');
1944
+ break;
1945
+ case tuya.dataPoints.nousTempAlarm:
1946
+ result.temperature_alarm = {0x00: 'canceled', 0x01: 'lower_alarm', 0x02: 'upper_alarm'}[value];
1947
+ break;
1948
+ case tuya.dataPoints.nousHumiAlarm:
1949
+ result.humidity_alarm = {0x00: 'canceled', 0x01: 'lower_alarm', 0x02: 'upper_alarm'}[value];
1950
+ break;
1951
+ case tuya.dataPoints.nousTempSensitivity:
1952
+ result.temperature_sensitivity = calibrateAndPrecisionRoundOptions(value / 10, options, 'temperature');
1953
+ break;
1954
+ case tuya.dataPoints.nousReportInterval:
1955
+ result.report_interval = value;
1956
+ break;
1957
+ default:
1958
+ meta.logger.warn(`zigbee-herdsman-converters:nous_lcd_temperature_humidity_sensor: NOT RECOGNIZED ` +
1959
+ `DP #${dp} with data ${JSON.stringify(dpValue)}`);
1960
+ }
1939
1961
  }
1962
+ return result;
1940
1963
  },
1941
1964
  },
1942
1965
  tuya_illuminance_temperature_humidity_sensor: {
@@ -5385,7 +5408,7 @@ const converters = {
5385
5408
  payload.device_mode = 'unknown';
5386
5409
  }
5387
5410
  }
5388
- if (msg.data.hasOwnProperty('1')) payload.permanent_led = msg.data['1'] === 0x00 ? 'OFF' : 'ON';
5411
+ if (msg.data.hasOwnProperty('1')) payload.led_when_off = msg.data['1'] === 0x00 ? 'OFF' : 'ON';
5389
5412
  if (msg.data.hasOwnProperty('2')) payload.led_when_on = msg.data['2'] === 0x00 ? 'OFF' : 'ON';
5390
5413
  return payload;
5391
5414
  },
@@ -7168,6 +7191,22 @@ const converters = {
7168
7191
  }
7169
7192
  },
7170
7193
  },
7194
+ tuya_relay_din_led_indicator: {
7195
+ cluster: 'genOnOff',
7196
+ type: ['attributeReport', 'readResponse'],
7197
+ convert: (model, msg, publish, options, meta) => {
7198
+ const property = 0x8001;
7199
+
7200
+ if (msg.data.hasOwnProperty(property)) {
7201
+ const dict = {0x00: 'off', 0x01: 'on_off', 0x02: 'off_on'};
7202
+ const value = msg.data[property];
7203
+
7204
+ if (dict.hasOwnProperty(value)) {
7205
+ return {[postfixWithEndpointName('indicator_mode', msg, model)]: dict[value]};
7206
+ }
7207
+ }
7208
+ },
7209
+ },
7171
7210
  ias_keypad: {
7172
7211
  cluster: 'ssIasZone',
7173
7212
  type: 'commandStatusChangeNotification',
@@ -2531,6 +2531,17 @@ const converters = {
2531
2531
  return {state: {power_outage_memory: value}};
2532
2532
  },
2533
2533
  },
2534
+ tuya_relay_din_led_indicator: {
2535
+ key: ['indicator_mode'],
2536
+ convertSet: async (entity, key, value, meta) => {
2537
+ value = value.toLowerCase();
2538
+ const lookup = {'off': 0x00, 'on_off': 0x01, 'off_on': 0x02};
2539
+ utils.validateValue(value, Object.keys(lookup));
2540
+ const payload = lookup[value];
2541
+ await entity.write('genOnOff', {0x8001: {value: payload, type: 0x30}});
2542
+ return {state: {indicator_mode: value}};
2543
+ },
2544
+ },
2534
2545
  kmpcil_res005_on_off: {
2535
2546
  key: ['state'],
2536
2547
  convertSet: async (entity, key, value, meta) => {
@@ -3062,10 +3073,10 @@ const converters = {
3062
3073
  const payload = {0x1008: {value: lookup[value], type: herdsman.Zcl.DataType.enum8}};
3063
3074
  await entity.write('hvacThermostat', payload, manufacturerOptions.sunricher);
3064
3075
  } else if (key==='window_open_check') {
3065
- const payload = {0x1009: {value: Math.round(value * 10), type: 0x20}};
3076
+ const payload = {0x1009: {value: value * 2, type: 0x20}};
3066
3077
  await entity.write('hvacThermostat', payload, manufacturerOptions.sunricher);
3067
3078
  } else if (key==='hysterersis') {
3068
- const payload = {0x100A: {value: Math.round(value * 10), type: 0x20}};
3079
+ const payload = {0x100A: {value: value* 10, type: 0x20}};
3069
3080
  await entity.write('hvacThermostat', payload, manufacturerOptions.sunricher);
3070
3081
  } else if (key==='display_auto_off_enabled') {
3071
3082
  const lookup = {'enable': 0, 'disabled': 1};
@@ -4839,13 +4850,13 @@ const converters = {
4839
4850
  },
4840
4851
  legrand_settingAlwaysEnableLed: {
4841
4852
  // connected power outlet is on attribute 2 and not 1
4842
- key: ['permanent_led'],
4853
+ key: ['led_when_off'],
4843
4854
  convertSet: async (entity, key, value, meta) => {
4844
4855
  // enable or disable the LED (blue) when permitJoin=false (LED off)
4845
4856
  const enableLedIfOn = value === 'ON' || (value === 'OFF' ? false : !!value);
4846
4857
  const payload = {1: {value: enableLedIfOn, type: 16}};
4847
4858
  await entity.write('manuSpecificLegrandDevices', payload, manufacturerOptions.legrand);
4848
- return {state: {'permanent_led': value}};
4859
+ return {state: {'led_when_off': value}};
4849
4860
  },
4850
4861
  convertGet: async (entity, key, meta) => {
4851
4862
  await entity.read('manuSpecificLegrandDevices', [0x0001], manufacturerOptions.legrand);
@@ -18,6 +18,17 @@ const tzLocal = {
18
18
  return {state: {backlight_led: state.toUpperCase()}};
19
19
  },
20
20
  },
21
+ backlight_brightness: {
22
+ key: ['brightness'],
23
+ options: [exposes.options.transition()],
24
+ convertSet: async (entity, key, value, meta) => {
25
+ await entity.command('genLevelCtrl', 'moveToLevel', {level: value, transtime: 0}, utils.getOptions(meta.mapped, entity));
26
+ return {state: {brightness: value}};
27
+ },
28
+ convertGet: async (entity, key, meta) => {
29
+ await entity.read('genLevelCtrl', ['currentLevel']);
30
+ },
31
+ },
21
32
  };
22
33
 
23
34
  const disableBatteryRotaryDimmerReporting = async (endpoint) => {
@@ -181,12 +192,12 @@ module.exports = [
181
192
  model: 'AU-A1ZBDSS',
182
193
  vendor: 'Aurora Lighting',
183
194
  description: 'Double smart socket UK',
184
- fromZigbee: [fz.identify, fz.on_off, fz.electrical_measurement],
195
+ fromZigbee: [fz.identify, fz.on_off, fz.electrical_measurement, fz.brightness],
185
196
  exposes: [e.switch().withEndpoint('left'), e.switch().withEndpoint('right'),
186
197
  e.power().withEndpoint('left'), e.power().withEndpoint('right'),
187
198
  exposes.numeric('brightness', ea.ALL).withValueMin(0).withValueMax(254)
188
199
  .withDescription('Brightness of this backlight LED')],
189
- toZigbee: [tz.light_onoff_brightness],
200
+ toZigbee: [tzLocal.backlight_brightness, tz.on_off],
190
201
  meta: {multiEndpoint: true},
191
202
  endpoint: (device) => {
192
203
  return {'left': 1, 'right': 2};
@@ -16,7 +16,7 @@ module.exports = [
16
16
  toZigbee: [tz.on_off, tz.legrand_settingAlwaysEnableLed, tz.legrand_settingEnableLedIfOn, tz.legrand_identify],
17
17
  exposes: [
18
18
  e.switch(), e.action(['identify', 'on', 'off']),
19
- exposes.binary('permanent_led', ea.ALL, 'ON', 'OFF').withDescription('Enable or disable the permanent blue LED'),
19
+ exposes.binary('led_when_off', ea.ALL, 'ON', 'OFF').withDescription('Enables the LED when the light is off'),
20
20
  exposes.binary('led_when_on', ea.ALL, 'ON', 'OFF').withDescription('Enables the LED when the light is on'),
21
21
  ],
22
22
  configure: async (device, coordinatorEndpoint, logger) => {
@@ -39,7 +39,7 @@ module.exports = [
39
39
  exposes.numeric('ballast_maximum_level', ea.ALL).withValueMin(1).withValueMax(254)
40
40
  .withDescription('Specifies the maximum brightness value'),
41
41
  exposes.binary('device_mode', ea.ALL, 'dimmer_on', 'dimmer_off').withDescription('Allow the device to change brightness'),
42
- exposes.binary('permanent_led', ea.ALL, 'ON', 'OFF').withDescription('Enable or disable the permanent blue LED'),
42
+ exposes.binary('led_when_off', ea.ALL, 'ON', 'OFF').withDescription('Enables the LED when the light is off'),
43
43
  exposes.binary('led_when_on', ea.ALL, 'ON', 'OFF').withDescription('Enables the LED when the light is on')],
44
44
  configure: async (device, coordinatorEndpoint, logger) => {
45
45
  await extend.light_onoff_brightness().configure(device, coordinatorEndpoint, logger);
@@ -315,6 +315,13 @@ module.exports = [
315
315
  extend: gledoptoExtend.light_onoff_brightness_colortemp_color(),
316
316
  meta: {disableDefaultResponse: true},
317
317
  },
318
+ {
319
+ zigbeeModel: ['GL-B-002P'],
320
+ model: 'GL-B-002P',
321
+ vendor: 'Gledopto',
322
+ description: 'Zigbee smart filament LED bulb',
323
+ extend: extend.light_onoff_brightness_colortemp_color({colorTempRange: [158, 495]}),
324
+ },
318
325
  {
319
326
  zigbeeModel: ['GL-MC-001P'],
320
327
  model: 'GL-MC-001P',
package/devices/heiman.js CHANGED
@@ -287,7 +287,7 @@ module.exports = [
287
287
  description: 'Smart motion sensor',
288
288
  fromZigbee: [fz.ias_occupancy_alarm_1, fz.battery],
289
289
  toZigbee: [],
290
- exposes: [e.occupancy(), e.battery_low(), e.battery(), e.battery_voltage()],
290
+ exposes: [e.occupancy(), e.battery_low(), e.battery(), e.battery_voltage(), e.tamper()],
291
291
  meta: {battery: {voltageToPercentage: '3V_2500'}},
292
292
  configure: async (device, coordinatorEndpoint, logger) => {
293
293
  const endpoint = device.getEndpoint(1);
@@ -41,7 +41,8 @@ module.exports = [
41
41
  exposes: [e.cover_position().setAccess('state', ea.ALL), e.temperature(), e.battery(), e.pressure()],
42
42
  },
43
43
  {
44
- zigbeeModel: ['SV02-410-MP-1.3', 'SV02-412-MP-1.3', 'SV02-610-MP-1.3', 'SV02-612-MP-1.3', 'SV02-410-MP-1.0', 'SV02-410-MP-1.2'],
44
+ zigbeeModel: ['SV02-410-MP-1.3', 'SV02-412-MP-1.3', 'SV02-610-MP-1.3', 'SV02-612-MP-1.2', 'SV02-612-MP-1.3', 'SV02-410-MP-1.0',
45
+ 'SV02-410-MP-1.2'],
45
46
  model: 'SV02',
46
47
  vendor: 'Keen Home',
47
48
  description: 'Smart vent',
@@ -20,6 +20,21 @@ module.exports = [
20
20
  },
21
21
  exposes: [e.lock(), e.battery(), e.lock_action(), e.lock_action_source_name(), e.lock_action_source_user()],
22
22
  },
23
+ {
24
+ zigbeeModel: ['SMARTCODE_CONVERT_GEN1_W3'],
25
+ model: '99140-139',
26
+ vendor: 'Kwikset',
27
+ description: 'Home connect smart lock conversion kit',
28
+ fromZigbee: [fz.lock, fz.lock_operation_event, fz.battery],
29
+ toZigbee: [tz.lock],
30
+ configure: async (device, coordinatorEndpoint, logger) => {
31
+ const endpoint = device.getEndpoint(2);
32
+ await reporting.bind(endpoint, coordinatorEndpoint, ['closuresDoorLock', 'genPowerCfg']);
33
+ await reporting.lockState(endpoint);
34
+ await reporting.batteryPercentageRemaining(endpoint);
35
+ },
36
+ exposes: [e.lock(), e.battery(), e.lock_action(), e.lock_action_source_name(), e.lock_action_source_user()],
37
+ },
23
38
  {
24
39
  zigbeeModel: ['SMARTCODE_DEADBOLT_10_L'],
25
40
  model: '99140-002',
@@ -182,7 +182,7 @@ module.exports = [
182
182
  exposes.numeric('ballast_maximum_level', ea.ALL).withValueMin(1).withValueMax(254)
183
183
  .withDescription('Specifies the maximum brightness value'),
184
184
  exposes.binary('device_mode', ea.ALL, 'dimmer_on', 'dimmer_off').withDescription('Allow the device to change brightness'),
185
- exposes.binary('permanent_led', ea.ALL, 'ON', 'OFF').withDescription('Enable or disable the permanent blue LED'),
185
+ exposes.binary('led_when_off', ea.ALL, 'ON', 'OFF').withDescription('Enable the LED when the light is off'),
186
186
  exposes.binary('led_when_on', ea.ALL, 'ON', 'OFF').withDescription('Enables the LED when the light is on')],
187
187
  configure: async (device, coordinatorEndpoint, logger) => {
188
188
  await extend.light_onoff_brightness().configure(device, coordinatorEndpoint, logger);
@@ -328,7 +328,7 @@ module.exports = [
328
328
  toZigbee: [tz.on_off, tz.legrand_settingAlwaysEnableLed, tz.legrand_settingEnableLedIfOn],
329
329
  exposes: [e.switch().withEndpoint('left'),
330
330
  e.switch().withEndpoint('right'),
331
- exposes.binary('permanent_led', ea.ALL, 'ON', 'OFF').withDescription('Enable or disable the permanent blue LED'),
331
+ exposes.binary('led_when_off', ea.ALL, 'ON', 'OFF').withDescription('Enable the LED when the light is off'),
332
332
  exposes.binary('led_when_on', ea.ALL, 'ON', 'OFF').withDescription('Enables the LED when the light is on')],
333
333
  meta: {multiEndpoint: true},
334
334
  configure: async (device, coordinatorEndpoint, logger) => {
package/devices/namron.js CHANGED
@@ -276,7 +276,7 @@ module.exports = [
276
276
  exposes.climate()
277
277
  .withSetpoint('occupied_heating_setpoint', 0, 40, 0.1)
278
278
  .withLocalTemperature()
279
- .withLocalTemperatureCalibration(-30, 30, 0.1)
279
+ .withLocalTemperatureCalibration(-3, 3, 0.1)
280
280
  .withSystemMode(['off', 'auto', 'heat'])
281
281
  .withRunningState(['idle', 'heat']),
282
282
  exposes.binary('away_mode', ea.ALL, 'ON', 'OFF')
@@ -308,16 +308,16 @@ module.exports = [
308
308
  .withDescription('The temperature on the display. Default: Room Temperature.'),
309
309
  exposes.numeric('window_open_check', ea.ALL)
310
310
  .withUnit('°C')
311
- .withValueMin(3).withValueMax(8).withValueStep(0.5)
312
- .withDescription('The threshold to detect window open, between 3 and 8 in 0.5 °C. Default: 0 (disabled).'),
311
+ .withValueMin(1.5).withValueMax(4).withValueStep(0.5)
312
+ .withDescription('The threshold to detect window open, between 1.5 and 4 in 0.5 °C. Default: 0 (disabled).'),
313
313
  exposes.numeric('hysterersis', ea.ALL)
314
314
  .withUnit('°C')
315
- .withValueMin(5).withValueMax(20).withValueStep(0.1)
316
- .withDescription('Hysteresis setting, between 5 and 20 in 0.1 °C. Default: 5.'),
315
+ .withValueMin(0.5).withValueMax(2).withValueStep(0.1)
316
+ .withDescription('Hysteresis setting, between 0.5 and 2 in 0.1 °C. Default: 0.5.'),
317
317
  exposes.enum('display_auto_off_enabled', ea.ALL, ['enable', 'disabled']),
318
318
  exposes.numeric('alarm_airtemp_overvalue', ea.ALL)
319
319
  .withUnit('°C')
320
- .withValueMin(20).withValueMax(60).withValueStep(1)
320
+ .withValueMin(20).withValueMax(60)
321
321
  .withDescription('Room temperature alarm threshold, between 20 and 60 in °C. 0 means disabled. Default: 45.'),
322
322
  ],
323
323
  configure: async (device, coordinatorEndpoint, logger) => {
package/devices/nous.js CHANGED
@@ -17,7 +17,7 @@ module.exports = [
17
17
  exposes: [e.temperature(), e.humidity(), e.battery()],
18
18
  },
19
19
  {
20
- fingerprint: [{modelID: 'TS0601', manufacturerName: '_TZE200_lve3dvpy'}],
20
+ fingerprint: [{modelID: 'TS0601', manufacturerName: '_TZE200_lve3dvpy'}, {modelID: 'TS0601', manufacturerName: '_TZE200_c7emyjom'}],
21
21
  model: 'SZ-T04',
22
22
  vendor: 'Nous',
23
23
  description: 'Temperature and humidity sensor with clock',
@@ -2258,6 +2258,20 @@ module.exports = [
2258
2258
  },
2259
2259
  ota: ota.zigbeeOTA,
2260
2260
  },
2261
+ {
2262
+ zigbeeModel: ['LOM011'],
2263
+ model: '8719514342361',
2264
+ vendor: 'Philips',
2265
+ description: 'Hue smart plug - AU',
2266
+ extend: extend.switch(),
2267
+ toZigbee: [tz.on_off].concat([tz.hue_power_on_behavior, tz.hue_power_on_error]),
2268
+ configure: async (device, coordinatorEndpoint, logger) => {
2269
+ const endpoint = device.getEndpoint(11);
2270
+ await reporting.bind(endpoint, coordinatorEndpoint, ['genOnOff']);
2271
+ await reporting.onOff(endpoint);
2272
+ },
2273
+ ota: ota.zigbeeOTA,
2274
+ },
2261
2275
  {
2262
2276
  zigbeeModel: ['LOM006'],
2263
2277
  model: '9290024426',
package/devices/rtx.js CHANGED
@@ -6,7 +6,8 @@ const ea = exposes.access;
6
6
 
7
7
  module.exports = [
8
8
  {
9
- fingerprint: [{modelID: 'TS0601', manufacturerName: '_TZE200_akjefhj5'}, {modelID: 'TS0601', manufacturerName: '_TZE200_2wg5qrjy'}],
9
+ fingerprint: [{modelID: 'TS0601', manufacturerName: '_TZE200_akjefhj5'}, {modelID: 'TS0601', manufacturerName: '_TZE200_2wg5qrjy'},
10
+ {modelID: 'TS0601', manufacturerName: '_TZE200_81isopgh'}],
10
11
  model: 'ZVG1',
11
12
  vendor: 'RTX',
12
13
  description: 'Zigbee smart water valve',
package/devices/tuya.js CHANGED
@@ -1417,11 +1417,12 @@ module.exports = [
1417
1417
  .withDescription('Plug LED indicator mode'), e.child_lock()],
1418
1418
  },
1419
1419
  {
1420
- fingerprint: [].concat(...TS011Fplugs.map((manufacturerName) => {
1421
- return [69, 68, 65, 64, 74].map((applicationVersion) => {
1422
- return {modelID: 'TS011F', manufacturerName, applicationVersion};
1423
- });
1424
- })),
1420
+ fingerprint: [{modelID: 'TS011F', manufacturerName: '_TZ3000_gjnozsaz', applicationVersion: 74}]
1421
+ .concat(...TS011Fplugs.map((manufacturerName) => {
1422
+ return [69, 68, 65, 64].map((applicationVersion) => {
1423
+ return {modelID: 'TS011F', manufacturerName, applicationVersion};
1424
+ });
1425
+ })),
1425
1426
  model: 'TS011F_plug_3',
1426
1427
  description: 'Smart plug (with power monitoring by polling)',
1427
1428
  vendor: 'TuYa',
@@ -1928,8 +1929,9 @@ module.exports = [
1928
1929
  model: 'TS011F_din_smart_relay',
1929
1930
  description: 'Din smart relay (with power monitoring)',
1930
1931
  vendor: 'TuYa',
1931
- fromZigbee: [fz.on_off, fz.electrical_measurement, fz.metering, fz.ignore_basic_report, fz.tuya_switch_power_outage_memory],
1932
- toZigbee: [tz.on_off, tz.tuya_switch_power_outage_memory],
1932
+ fromZigbee: [fz.on_off, fz.electrical_measurement, fz.metering, fz.ignore_basic_report, fz.tuya_switch_power_outage_memory,
1933
+ fz.tuya_relay_din_led_indicator],
1934
+ toZigbee: [tz.on_off, tz.tuya_switch_power_outage_memory, tz.tuya_relay_din_led_indicator],
1933
1935
  whiteLabel: [{vendor: 'MatSee Plus', model: 'ATMS1602Z'}],
1934
1936
  configure: async (device, coordinatorEndpoint, logger) => {
1935
1937
  const endpoint = device.getEndpoint(1);
@@ -1944,7 +1946,27 @@ module.exports = [
1944
1946
  },
1945
1947
  exposes: [e.switch(), e.power(), e.current(), e.voltage().withAccess(ea.STATE),
1946
1948
  e.energy(), exposes.enum('power_outage_memory', ea.STATE_SET, ['on', 'off', 'restore'])
1947
- .withDescription('Recover state after power outage')],
1949
+ .withDescription('Recover state after power outage'),
1950
+ exposes.enum('indicator_mode', ea.STATE_SET, ['off', 'on_off', 'off_on'])
1951
+ .withDescription('Relay LED indicator mode')],
1952
+ },
1953
+ {
1954
+ fingerprint: [{modelID: 'TS011F', manufacturerName: '_TZ3000_7issjl2q'}],
1955
+ model: 'ATMS1601Z',
1956
+ description: 'Din smart relay (without power monitoring)',
1957
+ vendor: 'TuYa',
1958
+ fromZigbee: [fz.on_off, fz.ignore_basic_report, fz.tuya_switch_power_outage_memory, fz.tuya_relay_din_led_indicator],
1959
+ toZigbee: [tz.on_off, tz.tuya_switch_power_outage_memory, tz.tuya_relay_din_led_indicator],
1960
+ configure: async (device, coordinatorEndpoint, logger) => {
1961
+ const endpoint = device.getEndpoint(1);
1962
+ await reporting.bind(endpoint, coordinatorEndpoint, ['genOnOff']);
1963
+ device.save();
1964
+ },
1965
+ exposes: [e.switch(),
1966
+ exposes.enum('power_outage_memory', ea.STATE_SET, ['on', 'off', 'restore'])
1967
+ .withDescription('Recover state after power outage'),
1968
+ exposes.enum('indicator_mode', ea.STATE_SET, ['off', 'on_off', 'off_on'])
1969
+ .withDescription('Relay LED indicator mode')],
1948
1970
  },
1949
1971
  {
1950
1972
  fingerprint: [{modelID: 'TS0601', manufacturerName: '_TZE200_nklqjk62'}],
@@ -2262,7 +2284,8 @@ module.exports = [
2262
2284
  },
2263
2285
  {
2264
2286
  fingerprint: [{modelID: 'TS0601', manufacturerName: '_TZE200_ikvncluo'},
2265
- {modelID: 'TS0601', manufacturerName: '_TZE200_lyetpprm'}],
2287
+ {modelID: 'TS0601', manufacturerName: '_TZE200_lyetpprm'},
2288
+ {modelID: 'TS0601', manufacturerName: '_TZE200_ztc6ggyl'}],
2266
2289
  model: 'TS0601_smart_human_presense_sensor',
2267
2290
  vendor: 'TuYa',
2268
2291
  description: 'Smart Human presence sensor',
@@ -2317,4 +2340,14 @@ module.exports = [
2317
2340
  .withDescription('Alarm humidity min'),
2318
2341
  ],
2319
2342
  },
2343
+ {
2344
+ fingerprint: [{modelID: 'TS0601', manufacturerName: '_TZE200_qoy0ekbd'}],
2345
+ model: 'CX-0726',
2346
+ vendor: 'TuYa',
2347
+ description: 'Temperature & humidity LCD sensor',
2348
+ fromZigbee: [fz.tuya_temperature_humidity_sensor, fz.ignore_tuya_set_time],
2349
+ toZigbee: [],
2350
+ onEvent: tuya.onEventSetLocalTime,
2351
+ exposes: [e.temperature(), e.humidity(), e.battery()],
2352
+ },
2320
2353
  ];
package/devices/xiaomi.js CHANGED
@@ -922,7 +922,8 @@ module.exports = [
922
922
  description: 'Aqara P1 human body movement and illuminance sensor',
923
923
  fromZigbee: [fz.aqara_occupancy_illuminance, fz.aqara_opple, fz.battery],
924
924
  toZigbee: [tz.aqara_detection_interval, tz.aqara_motion_sensitivity],
925
- exposes: [e.occupancy(), e.illuminance().withUnit('lx').withDescription('Measured illuminance in lux'),
925
+ exposes: [e.occupancy(), e.illuminance_lux().withProperty('illuminance'),
926
+ e.illuminance().withUnit('lx').withDescription('Measured illuminance in lux'),
926
927
  exposes.enum('motion_sensitivity', ea.ALL, ['low', 'medium', 'high']),
927
928
  exposes.numeric('detection_interval', ea.ALL).withValueMin(2).withValueMax(65535).withUnit('s')
928
929
  .withDescription('Time interval for detecting actions'), e.temperature(), e.battery()],
@@ -1360,7 +1361,7 @@ module.exports = [
1360
1361
  await device.getEndpoint(1).read('genAnalogOutput', ['presentValue']);
1361
1362
  }
1362
1363
  },
1363
- exposes: [e.cover_position().setAccess('state', ea.ALL), e.battery().withAccess(ea.STATE_GET),
1364
+ exposes: [e.cover_position().setAccess('state', ea.ALL), e.battery().withAccess(ea.STATE_GET), e.temperature(),
1364
1365
  exposes.binary('charging_status', ea.STATE_GET, true, false)
1365
1366
  .withDescription('The current charging status.'),
1366
1367
  exposes.enum('motor_state', ea.STATE, ['declining', 'rising', 'pause', 'blocked'])
@@ -75,6 +75,30 @@ module.exports = [
75
75
  await reporting.bind(device.getEndpoint(3), coordinatorEndpoint, ['genOnOff']);
76
76
  },
77
77
  },
78
+ {
79
+ fingerprint: [{modelID: 'TS0003', manufacturerName: '_TZ3000_vjhcenzo'}],
80
+ model: 'TB25',
81
+ vendor: 'Zemismart',
82
+ description: 'Smart light switch and socket - 2 gang with neutral wire',
83
+ toZigbee: extend.switch().toZigbee.concat([tz.moes_power_on_behavior]),
84
+ fromZigbee: extend.switch().fromZigbee.concat([fz.moes_power_on_behavior]),
85
+ exposes: [e.switch().withEndpoint('left'), e.switch().withEndpoint('center'), e.switch().withEndpoint('right'),
86
+ exposes.enum('power_on_behavior', ea.ALL, ['on', 'off', 'previous']),
87
+ ],
88
+ endpoint: () => {
89
+ return {'left': 1, 'center': 2, 'right': 3};
90
+ },
91
+ meta: {multiEndpoint: true},
92
+ configure: async (device, coordinatorEndpoint) => {
93
+ await device.getEndpoint(1).read('genBasic',
94
+ ['manufacturerName', 'zclVersion', 'appVersion', 'modelId', 'powerSource', 0xfffe]);
95
+ for (const endpointID of [1, 2, 3]) {
96
+ const endpoint = device.getEndpoint(endpointID);
97
+ await reporting.bind(endpoint, coordinatorEndpoint, ['genOnOff']);
98
+ await reporting.onOff(endpoint);
99
+ }
100
+ },
101
+ },
78
102
  {
79
103
  zigbeeModel: ['LXN56-SS27LX1.1'],
80
104
  model: 'LXN56-SS27LX1.1',
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "zigbee-herdsman-converters",
3
- "version": "14.0.507",
3
+ "version": "14.0.510",
4
4
  "description": "Collection of device converters to be used with zigbee-herdsman",
5
5
  "main": "index.js",
6
6
  "files": [