zigbee-herdsman-converters 14.0.647 → 14.0.649

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.
@@ -1588,12 +1588,6 @@ const converters = {
1588
1588
  type: ['attributeReport', 'readResponse'],
1589
1589
  convert: (model, msg, publish, options, meta) => {
1590
1590
  const result = {};
1591
- if (msg.data.hasOwnProperty('physicalMinLevel')) {
1592
- result['ballast_physical_minimum_level'] = msg.data.physicalMinLevel;
1593
- }
1594
- if (msg.data.hasOwnProperty('physicalMaxLevel')) {
1595
- result['ballast_physical_maximum_level'] = msg.data.physicalMaxLevel;
1596
- }
1597
1591
  if (msg.data.hasOwnProperty('ballastStatus')) {
1598
1592
  const ballastStatus = msg.data.ballastStatus;
1599
1593
  result['ballast_status_non_operational'] = ballastStatus & 1 ? true : false;
@@ -1961,10 +1955,10 @@ const converters = {
1961
1955
  result.min_temperature = calibrateAndPrecisionRoundOptions(value / 10, options, 'temperature');
1962
1956
  break;
1963
1957
  case tuya.dataPoints.nousMaxHumi:
1964
- result.max_humidity = calibrateAndPrecisionRoundOptions(value / 10, options, 'humidity');
1958
+ result.max_humidity = calibrateAndPrecisionRoundOptions(value, options, 'humidity');
1965
1959
  break;
1966
1960
  case tuya.dataPoints.nousMinHumi:
1967
- result.min_humidity = calibrateAndPrecisionRoundOptions(value / 10, options, 'humidity');
1961
+ result.min_humidity = calibrateAndPrecisionRoundOptions(value, options, 'humidity');
1968
1962
  break;
1969
1963
  case tuya.dataPoints.nousTempAlarm:
1970
1964
  result.temperature_alarm = {0x00: 'canceled', 0x01: 'lower_alarm', 0x02: 'upper_alarm'}[value];
@@ -1975,8 +1969,14 @@ const converters = {
1975
1969
  case tuya.dataPoints.nousTempSensitivity:
1976
1970
  result.temperature_sensitivity = calibrateAndPrecisionRoundOptions(value / 10, options, 'temperature');
1977
1971
  break;
1978
- case tuya.dataPoints.nousReportInterval:
1979
- result.report_interval = value;
1972
+ case tuya.dataPoints.nousHumiSensitivity:
1973
+ result.humidity_sensitivity = calibrateAndPrecisionRoundOptions(value, options, 'humidity');
1974
+ break;
1975
+ case tuya.dataPoints.nousTempReportInterval:
1976
+ result.temperature_report_interval = value;
1977
+ break;
1978
+ case tuya.dataPoints.nousHumiReportInterval:
1979
+ result.humidity_report_interval = value;
1980
1980
  break;
1981
1981
  default:
1982
1982
  meta.logger.warn(`zigbee-herdsman-converters:nous_lcd_temperature_humidity_sensor: NOT RECOGNIZED ` +
@@ -578,8 +578,6 @@ const converters = {
578
578
  },
579
579
  ballast_config: {
580
580
  key: ['ballast_config',
581
- 'ballast_physical_minimum_level',
582
- 'ballast_physical_maximum_level',
583
581
  'ballast_minimum_level',
584
582
  'ballast_maximum_level',
585
583
  'ballast_power_on_level'],
@@ -607,8 +605,6 @@ const converters = {
607
605
  convertGet: async (entity, key, meta) => {
608
606
  let result = {};
609
607
  for (const attrName of [
610
- 'physical_min_level',
611
- 'physical_max_level',
612
608
  'ballast_status',
613
609
  'min_level',
614
610
  'max_level',
@@ -2211,7 +2207,7 @@ const converters = {
2211
2207
  xiaomi_switch_power_outage_memory: {
2212
2208
  key: ['power_outage_memory'],
2213
2209
  convertSet: async (entity, key, value, meta) => {
2214
- if (['SP-EUC01', 'ZNCZ04LM', 'ZNCZ15LM', 'QBCZ14LM', 'QBCZ15LM', 'SSM-U01', 'SSM-U02', 'DLKZMK11LM', 'DLKZMK12LM',
2210
+ if (['SP-EUC01', 'ZNCZ04LM', 'ZNCZ12LM', 'ZNCZ15LM', 'QBCZ14LM', 'QBCZ15LM', 'SSM-U01', 'SSM-U02', 'DLKZMK11LM', 'DLKZMK12LM',
2215
2211
  'WS-EUK01', 'WS-EUK02', 'WS-EUK03', 'WS-EUK04', 'QBKG19LM', 'QBKG20LM', 'QBKG25LM', 'QBKG26LM',
2216
2212
  'QBKG31LM', 'QBKG34LM', 'QBKG38LM', 'QBKG39LM', 'QBKG40LM', 'QBKG41LM', 'ZNDDMK11LM', 'ZNLDP13LM',
2217
2213
  ].includes(meta.mapped.model)) {
@@ -2235,7 +2231,7 @@ const converters = {
2235
2231
  return {state: {power_outage_memory: value}};
2236
2232
  },
2237
2233
  convertGet: async (entity, key, meta) => {
2238
- if (['SP-EUC01', 'ZNCZ04LM', 'ZNCZ15LM', 'QBCZ14LM', 'QBCZ15LM', 'SSM-U01', 'SSM-U02', 'DLKZMK11LM', 'DLKZMK12LM',
2234
+ if (['SP-EUC01', 'ZNCZ04LM', 'ZNCZ12LM', 'ZNCZ15LM', 'QBCZ14LM', 'QBCZ15LM', 'SSM-U01', 'SSM-U02', 'DLKZMK11LM', 'DLKZMK12LM',
2239
2235
  'WS-EUK01', 'WS-EUK02', 'WS-EUK03', 'WS-EUK04', 'QBKG19LM', 'QBKG20LM', 'QBKG25LM', 'QBKG26LM',
2240
2236
  'QBKG31LM', 'QBKG34LM', 'QBKG38LM', 'QBKG39LM', 'QBKG40LM', 'QBKG41LM', 'ZNDDMK11LM', 'ZNLDP13LM',
2241
2237
  ].includes(meta.mapped.model)) {
@@ -2264,7 +2260,7 @@ const converters = {
2264
2260
  xiaomi_auto_off: {
2265
2261
  key: ['auto_off'],
2266
2262
  convertSet: async (entity, key, value, meta) => {
2267
- if (['ZNCZ04LM'].includes(meta.mapped.model)) {
2263
+ if (['ZNCZ04LM', 'ZNCZ12LM'].includes(meta.mapped.model)) {
2268
2264
  await entity.write('aqaraOpple', {0x0202: {value: value ? 1 : 0, type: 0x10}}, manufacturerOptions.xiaomi);
2269
2265
  } else if (['ZNCZ11LM'].includes(meta.mapped.model)) {
2270
2266
  const payload = value ?
@@ -2347,7 +2343,7 @@ const converters = {
2347
2343
  xiaomi_led_disabled_night: {
2348
2344
  key: ['led_disabled_night'],
2349
2345
  convertSet: async (entity, key, value, meta) => {
2350
- if (['ZNCZ04LM', 'ZNCZ15LM', 'QBCZ14LM', 'QBCZ15LM', 'QBKG19LM', 'QBKG20LM', 'QBKG25LM', 'QBKG26LM',
2346
+ if (['ZNCZ04LM', 'ZNCZ12LM', 'ZNCZ15LM', 'QBCZ14LM', 'QBCZ15LM', 'QBKG19LM', 'QBKG20LM', 'QBKG25LM', 'QBKG26LM',
2351
2347
  'QBKG31LM', 'QBKG34LM', 'DLKZMK11LM', 'SSM-U01', 'WS-EUK01', 'WS-EUK02',
2352
2348
  'WS-EUK03', 'WS-EUK04'].includes(meta.mapped.model)) {
2353
2349
  await entity.write('aqaraOpple', {0x0203: {value: value ? 1 : 0, type: 0x10}}, manufacturerOptions.xiaomi);
@@ -2363,7 +2359,7 @@ const converters = {
2363
2359
  return {state: {led_disabled_night: value}};
2364
2360
  },
2365
2361
  convertGet: async (entity, key, meta) => {
2366
- if (['ZNCZ04LM', 'ZNCZ15LM', 'QBCZ15LM', 'QBCZ14LM', 'QBKG19LM', 'QBKG20LM', 'QBKG25LM', 'QBKG26LM',
2362
+ if (['ZNCZ04LM', 'ZNCZ12LM', 'ZNCZ15LM', 'QBCZ15LM', 'QBCZ14LM', 'QBKG19LM', 'QBKG20LM', 'QBKG25LM', 'QBKG26LM',
2367
2363
  'QBKG31LM', 'QBKG34LM', 'DLKZMK11LM', 'SSM-U01', 'WS-EUK01', 'WS-EUK02',
2368
2364
  'WS-EUK03', 'WS-EUK04'].includes(meta.mapped.model)) {
2369
2365
  await entity.read('aqaraOpple', [0x0203], manufacturerOptions.xiaomi);
@@ -4261,6 +4257,7 @@ const converters = {
4261
4257
  convertSet: async (entity, key, value, meta) => {
4262
4258
  const payload = {0x4000: {value, type: 0x30}};
4263
4259
  await entity.write('hvacThermostat', payload, manufacturerOptions.eurotronic);
4260
+ return {state: {[key]: value}};
4264
4261
  },
4265
4262
  convertGet: async (entity, key, meta) => {
4266
4263
  await entity.read('hvacThermostat', [0x4000], manufacturerOptions.eurotronic);
@@ -5448,8 +5445,8 @@ const converters = {
5448
5445
  },
5449
5446
  nous_lcd_temperature_humidity_sensor: {
5450
5447
  key: [
5451
- 'min_temperature', 'max_temperature', 'temperature_sensitivity', 'temperature_unit_convert',
5452
- 'min_humidity', 'max_humidity', 'report_interval',
5448
+ 'min_temperature', 'max_temperature', 'temperature_sensitivity', 'temperature_unit_convert', 'temperature_report_interval',
5449
+ 'min_humidity', 'max_humidity', 'humidity_sensitivity', 'humidity_report_interval',
5453
5450
  ],
5454
5451
  convertSet: async (entity, key, value, meta) => {
5455
5452
  switch (key) {
@@ -5465,14 +5462,20 @@ const converters = {
5465
5462
  case 'temperature_sensitivity':
5466
5463
  await tuya.sendDataPointValue(entity, tuya.dataPoints.nousTempSensitivity, Math.round(value * 10));
5467
5464
  break;
5465
+ case 'humidity_sensitivity':
5466
+ await tuya.sendDataPointValue(entity, tuya.dataPoints.nousHumiSensitivity, value);
5467
+ break;
5468
5468
  case 'min_humidity':
5469
- await tuya.sendDataPointValue(entity, tuya.dataPoints.nousMinHumi, Math.round(value * 10));
5469
+ await tuya.sendDataPointValue(entity, tuya.dataPoints.nousMinHumi, Math.round(value));
5470
5470
  break;
5471
5471
  case 'max_humidity':
5472
- await tuya.sendDataPointValue(entity, tuya.dataPoints.nousMaxHumi, Math.round(value * 10));
5472
+ await tuya.sendDataPointValue(entity, tuya.dataPoints.nousMaxHumi, Math.round(value));
5473
+ break;
5474
+ case 'temperature_report_interval':
5475
+ await tuya.sendDataPointValue(entity, tuya.dataPoints.nousTempReportInterval, value);
5473
5476
  break;
5474
- case 'report_interval':
5475
- await tuya.sendDataPointValue(entity, tuya.dataPoints.nousReportInterval, value);
5477
+ case 'humidity_report_interval':
5478
+ await tuya.sendDataPointValue(entity, tuya.dataPoints.nousHumiReportInterval, value);
5476
5479
  break;
5477
5480
  default: // Unknown key
5478
5481
  meta.logger.warn(`Unhandled key ${key}`);
@@ -25,35 +25,29 @@ const develcoLedControlMap = {
25
25
  0xFF: 'both',
26
26
  };
27
27
 
28
+ // develco specific convertors
29
+ const develco = {
30
+ configure: {
31
+ read_sw_hw_version: async (device, logger) => {
32
+ for (const ep of device.endpoints) {
33
+ if (ep.supportsInputCluster('genBasic')) {
34
+ try {
35
+ const data = await ep.read('genBasic', ['develcoPrimarySwVersion', 'develcoPrimaryHwVersion'],
36
+ manufacturerOptions);
28
37
 
29
- const fwOnEvent = async (type, data, device, options, state) => {
30
- /**
31
- * Develco devices have a manufacturer specific field on genBasic
32
- * for sw and hw versions.
33
- *
34
- * We read those during deviceInterview
35
- * so that this information is usable during configure() calls
36
- * to skip some features on older devices that might cause
37
- * timeouts and other issues.
38
- */
39
- if (type === 'deviceInterview') { // WARN: also reading on deviceAnnounce hits a timeout!
40
- try {
41
- const data = await device.endpoints[0].read('genBasic', ['develcoPrimarySwVersion', 'develcoPrimaryHwVersion'],
42
- manufacturerOptions);
43
-
44
- if (data.hasOwnProperty('develcoPrimarySwVersion')) {
45
- device.softwareBuildID = data.develcoPrimarySwVersion.join('.');
46
- }
38
+ if (data.hasOwnProperty('develcoPrimarySwVersion')) {
39
+ device.softwareBuildID = data.develcoPrimarySwVersion.join('.');
40
+ }
47
41
 
48
- if (data.hasOwnProperty('develcoPrimaryHwVersion')) {
49
- device.hardwareVersion = data.develcoPrimaryHwVersion.join('.');
42
+ if (data.hasOwnProperty('develcoPrimaryHwVersion')) {
43
+ device.hardwareVersion = data.develcoPrimaryHwVersion.join('.');
44
+ }
45
+ } catch (error) {/* catch timeouts of sleeping devices */}
46
+ break;
47
+ }
50
48
  }
51
- } catch (error) {/* catch timeouts of sleeping devices */}
52
- }
53
- };
54
-
55
- // develco specific convertors
56
- const develco = {
49
+ },
50
+ },
57
51
  fz: {
58
52
  // SPLZB-134 and SPLZB-131 reports strange values sometimes
59
53
  // https://github.com/Koenkk/zigbee2mqtt/issues/13329
@@ -406,11 +400,11 @@ module.exports = [
406
400
  await reporting.instantaneousDemand(endpoint);
407
401
  await reporting.currentSummDelivered(endpoint);
408
402
  await reporting.currentSummReceived(endpoint);
403
+ await develco.configure.read_sw_hw_version(device, logger);
409
404
  },
410
405
  exposes: [e.power(), e.energy(), e.current(), e.voltage(), e.current_phase_b(), e.voltage_phase_b(), e.current_phase_c(),
411
406
  e.voltage_phase_c()],
412
407
  onEvent: async (type, data, device) => {
413
- fwOnEvent(type, data, device);
414
408
  if (type === 'message' && data.type === 'attributeReport' && data.cluster === 'seMetering' && data.data['divisor']) {
415
409
  // Device sends wrong divisior (512) while it should be fixed to 1000
416
410
  // https://github.com/Koenkk/zigbee-herdsman-converters/issues/3066
@@ -427,7 +421,6 @@ module.exports = [
427
421
  fz.ias_enroll, fz.ias_wd, develco.fz.fault_status],
428
422
  toZigbee: [tz.warning, tz.ias_max_duration, tz.warning_simple],
429
423
  ota: ota.zigbeeOTA,
430
- onEvent: fwOnEvent,
431
424
  meta: {battery: {voltageToPercentage: '3V_2500'}},
432
425
  configure: async (device, coordinatorEndpoint, logger) => {
433
426
  const endpoint = device.getEndpoint(35);
@@ -441,6 +434,8 @@ module.exports = [
441
434
  const endpoint2 = device.getEndpoint(38);
442
435
  await reporting.bind(endpoint2, coordinatorEndpoint, ['msTemperatureMeasurement']);
443
436
  await reporting.temperature(endpoint2, {min: constants.repInterval.MINUTE, max: constants.repInterval.MINUTES_10, change: 10});
437
+
438
+ await develco.configure.read_sw_hw_version(device, logger);
444
439
  },
445
440
  endpoint: (device) => {
446
441
  return {default: 35};
@@ -461,7 +456,6 @@ module.exports = [
461
456
  fz.ias_enroll, fz.ias_wd, develco.fz.fault_status],
462
457
  toZigbee: [tz.warning, tz.ias_max_duration, tz.warning_simple],
463
458
  meta: {battery: {voltageToPercentage: '3V_2500'}},
464
- onEvent: fwOnEvent,
465
459
  configure: async (device, coordinatorEndpoint, logger) => {
466
460
  const endpoint = device.getEndpoint(35);
467
461
 
@@ -474,6 +468,8 @@ module.exports = [
474
468
  const endpoint2 = device.getEndpoint(38);
475
469
  await reporting.bind(endpoint2, coordinatorEndpoint, ['msTemperatureMeasurement']);
476
470
  await reporting.temperature(endpoint2, {min: constants.repInterval.MINUTE, max: constants.repInterval.MINUTES_10, change: 10});
471
+
472
+ await develco.configure.read_sw_hw_version(device, logger);
477
473
  },
478
474
  endpoint: (device) => {
479
475
  return {default: 35};
@@ -501,6 +497,8 @@ module.exports = [
501
497
  await reporting.bind(endpoint38, coordinatorEndpoint, ['msTemperatureMeasurement']);
502
498
  await reporting.batteryVoltage(endpoint35);
503
499
  await reporting.temperature(endpoint38);
500
+
501
+ await develco.configure.read_sw_hw_version(device, logger);
504
502
  },
505
503
  },
506
504
  {
@@ -531,7 +529,6 @@ module.exports = [
531
529
  develco.fz.led_control, develco.fz.ias_occupancy_timeout,
532
530
  ],
533
531
  toZigbee: [develco.tz.led_control, develco.tz.ias_occupancy_timeout],
534
- onEvent: fwOnEvent,
535
532
  exposes: (device, options) => {
536
533
  const dynExposes = [];
537
534
  dynExposes.push(e.occupancy());
@@ -571,6 +568,7 @@ module.exports = [
571
568
  await reporting.batteryVoltage(endpoint35, {min: constants.repInterval.HOUR, max: 43200, change: 100});
572
569
 
573
570
  // zigbee2mqtt#14277 some features are not available on older firmwares
571
+ await develco.configure.read_sw_hw_version(device, logger);
574
572
  if (device && device.softwareBuildID && device.softwareBuildID.split('.')[0] >= 3) {
575
573
  await endpoint35.read('ssIasZone', ['develcoAlarmOffDelay'], manufacturerOptions);
576
574
  }
@@ -694,6 +692,8 @@ module.exports = [
694
692
  await reporting.temperature(endpoint, {min: constants.repInterval.MINUTE, max: constants.repInterval.MINUTES_10, change: 10});
695
693
  await reporting.humidity(endpoint, {min: constants.repInterval.MINUTE, max: constants.repInterval.MINUTES_10, change: 300});
696
694
  await reporting.batteryVoltage(endpoint, {min: constants.repInterval.HOUR, max: 43200, change: 100});
695
+
696
+ await develco.configure.read_sw_hw_version(device, logger);
697
697
  },
698
698
  },
699
699
  {
@@ -703,7 +703,6 @@ module.exports = [
703
703
  description: 'Customizable siren',
704
704
  fromZigbee: [fz.temperature, fz.battery, fz.ias_enroll, fz.ias_wd, fz.ias_siren],
705
705
  toZigbee: [tz.warning, tz.warning_simple, tz.ias_max_duration, tz.squawk],
706
- onEvent: fwOnEvent,
707
706
  meta: {battery: {voltageToPercentage: '3V_2500'}},
708
707
  configure: async (device, coordinatorEndpoint, logger) => {
709
708
  const endpoint = device.getEndpoint(43);
@@ -714,6 +713,8 @@ module.exports = [
714
713
 
715
714
  const endpoint2 = device.getEndpoint(1);
716
715
  await reporting.bind(endpoint2, coordinatorEndpoint, ['genOnOff']);
716
+
717
+ await develco.configure.read_sw_hw_version(device, logger);
717
718
  },
718
719
  endpoint: (device) => {
719
720
  return {default: 43};
@@ -769,7 +770,6 @@ module.exports = [
769
770
  description: 'IO module',
770
771
  fromZigbee: [fz.on_off, develco.fz.input],
771
772
  toZigbee: [tz.on_off, develco.tz.input],
772
- onEvent: fwOnEvent,
773
773
  meta: {multiEndpoint: true},
774
774
  exposes: [
775
775
  exposes.binary('input', ea.STATE_GET, true, false).withEndpoint('l1').withDescription('State of input 1'),
@@ -803,6 +803,8 @@ module.exports = [
803
803
  const ep7 = device.getEndpoint(117);
804
804
  await reporting.bind(ep7, coordinatorEndpoint, ['genOnOff']);
805
805
  await reporting.onOff(ep7);
806
+
807
+ await develco.configure.read_sw_hw_version(device, logger);
806
808
  },
807
809
 
808
810
  endpoint: (device) => {
@@ -20,7 +20,7 @@ module.exports = [
20
20
  model: '10011723',
21
21
  vendor: 'HORNBACH',
22
22
  description: 'FLAIR Viyu Smart LED bulb CCT E27',
23
- extend: extend.light_onoff_brightness_colortemp(),
23
+ extend: extend.light_onoff_brightness_colortemp({colorTempRange: [153, 370]}),
24
24
  },
25
25
  {
26
26
  zigbeeModel: ['VIYU-C35-470-CCT-10011722'],
package/devices/immax.js CHANGED
@@ -23,7 +23,7 @@ module.exports = [
23
23
  model: '07089L',
24
24
  vendor: 'Immax',
25
25
  description: 'NEO SMART LED E27 5W',
26
- extend: extend.light_onoff_brightness_colortemp(),
26
+ extend: extend.light_onoff_brightness_colortemp({colorTempRange: [153, 370]}),
27
27
  },
28
28
  {
29
29
  zigbeeModel: ['E27-filament-Dim-ZB3.0'],
@@ -92,7 +92,7 @@ module.exports = [
92
92
  await reporting.readEletricalMeasurementMultiplierDivisors(endpoint);
93
93
  await reporting.readMeteringMultiplierDivisor(endpoint);
94
94
  await reporting.currentSummDelivered(endpoint);
95
- await reporting.activePower(endpoint);
95
+ await reporting.activePower(endpoint, {change: 5});
96
96
  },
97
97
  exposes: [e.switch(), e.power(), e.energy()],
98
98
  },
@@ -100,11 +100,7 @@ module.exports = [
100
100
  exposes.numeric('ballast_maximum_level', ea.ALL).withValueMin(1).withValueMax(254)
101
101
  .withDescription('Specifies the maximum brightness value'),
102
102
  exposes.numeric('ballast_power_on_level', ea.ALL).withValueMin(1).withValueMax(254)
103
- .withDescription('Specifies the initialisation light level. Can not be set lower than "ballast_minimum_level"'),
104
- exposes.numeric('ballast_physical_minimum_level', ea.ALL).withValueMin(1).withValueMax(254)
105
- .withDescription('Specifies the minimum light output the ballast can achieve.'),
106
- exposes.numeric('ballast_physical_maximum_level', ea.ALL).withValueMin(1).withValueMax(254)
107
- .withDescription('Specifies the maximum light output the ballast can achieve.')],
103
+ .withDescription('Specifies the initialisation light level. Can not be set lower than "ballast_minimum_level"')],
108
104
  configure: async (device, coordinatorEndpoint, logger) => {
109
105
  await extend.light_onoff_brightness().configure(device, coordinatorEndpoint, logger);
110
106
  const endpoint = device.getEndpoint(1);
package/devices/nodon.js CHANGED
@@ -21,6 +21,21 @@ module.exports = [
21
21
  },
22
22
  exposes: [e.cover_position()],
23
23
  },
24
+ {
25
+ zigbeeModel: ['SIN-4-RS-20_PRO'],
26
+ model: 'SIN-4-RS-20_PRO',
27
+ vendor: 'NodOn',
28
+ description: 'Roller shutter controller',
29
+ fromZigbee: [fz.cover_position_tilt],
30
+ toZigbee: [tz.cover_state, tz.cover_position_tilt],
31
+ configure: async (device, coordinatorEndpoint, logger) => {
32
+ const endpoint = device.getEndpoint(1);
33
+ await reporting.bind(endpoint, coordinatorEndpoint, ['genPowerCfg', 'closuresWindowCovering']);
34
+ await reporting.currentPositionLiftPercentage(endpoint);
35
+ await reporting.currentPositionTiltPercentage(endpoint);
36
+ },
37
+ exposes: [e.cover_position()],
38
+ },
24
39
  {
25
40
  zigbeeModel: ['SIN-4-1-20'],
26
41
  model: 'SIN-4-1-20',
package/devices/nous.js CHANGED
@@ -32,6 +32,10 @@ module.exports = [
32
32
  },
33
33
  exposes: [
34
34
  e.temperature(), e.humidity(), e.battery(),
35
+ exposes.numeric('temperature_report_interval', ea.STATE_SET).withUnit('min').withValueMin(5).withValueMax(120).withValueStep(5)
36
+ .withDescription('Temperature Report interval'),
37
+ exposes.numeric('humidity_report_interval', ea.STATE_SET).withUnit('min').withValueMin(5).withValueMax(120).withValueStep(5)
38
+ .withDescription('Humidity Report interval'),
35
39
  exposes.enum('temperature_unit_convert', ea.STATE_SET, ['celsius', 'fahrenheit']).withDescription('Current display unit'),
36
40
  exposes.enum('temperature_alarm', ea.STATE, ['canceled', 'lower_alarm', 'upper_alarm'])
37
41
  .withDescription('Temperature alarm status'),
@@ -41,6 +45,14 @@ module.exports = [
41
45
  .withDescription('Alarm temperature min'),
42
46
  exposes.numeric('temperature_sensitivity', ea.STATE_SET).withUnit('°C').withValueMin(0.1).withValueMax(50).withValueStep(0.1)
43
47
  .withDescription('Temperature sensitivity'),
48
+ exposes.enum('humidity_alarm', ea.STATE, ['canceled', 'lower_alarm', 'upper_alarm'])
49
+ .withDescription('Humidity alarm status'),
50
+ exposes.numeric('max_humidity', ea.STATE_SET).withUnit('%').withValueMin(0).withValueMax(100)
51
+ .withDescription('Alarm humidity max'),
52
+ exposes.numeric('min_humidity', ea.STATE_SET).withUnit('%').withValueMin(0).withValueMax(100)
53
+ .withDescription('Alarm humidity min'),
54
+ exposes.numeric('humidity_sensitivity', ea.STATE_SET).withUnit('%').withValueMin(1).withValueMax(100).withValueStep(1)
55
+ .withDescription('Humidity sensitivity'),
44
56
  ],
45
57
  },
46
58
  {
@@ -247,7 +247,6 @@ module.exports = [
247
247
  vendor: 'Perenio',
248
248
  description: 'Flood alarm device',
249
249
  fromZigbee: [fz.ias_water_leak_alarm_1, fz.ignore_basic_report, fz.battery],
250
- meta: {battery: {dontDividePercentage: true}},
251
250
  toZigbee: [],
252
251
  configure: async (device, coordinatorEndpoint, logger) => {
253
252
  const endpoint = device.getEndpoint(1);
@@ -2862,4 +2862,11 @@ module.exports = [
2862
2862
  description: 'Hue white ambiance Buckram double spotlight with Bluetooth',
2863
2863
  extend: hueExtend.light_onoff_brightness_colortemp({colorTempRange: [153, 454]}),
2864
2864
  },
2865
+ {
2866
+ zigbeeModel: ['4090131P9'],
2867
+ model: '8718696174548',
2868
+ vendor: 'Philips',
2869
+ description: ' Hue Sana wall lamp with Bluetooth white',
2870
+ extend: hueExtend.light_onoff_brightness_colortemp_color({colorTempRange: [153, 500]}),
2871
+ },
2865
2872
  ];
@@ -537,6 +537,40 @@ module.exports = [
537
537
  }]);
538
538
  },
539
539
  },
540
+ {
541
+ zigbeeModel: ['PMM-300Z3'],
542
+ model: 'PMM-300Z3',
543
+ vendor: 'ShinaSystem',
544
+ description: 'SiHAS 3phase energy monitor',
545
+ fromZigbee: [fz.electrical_measurement, fz.metering, fz.temperature],
546
+ toZigbee: [tz.metering_power, tz.currentsummdelivered, tz.frequency, tz.powerfactor, tz.acvoltage, tz.accurrent, tz.temperature],
547
+ exposes: [e.power().withAccess(ea.STATE_GET), e.energy().withAccess(ea.STATE_GET),
548
+ e.current().withAccess(ea.STATE_GET), e.voltage().withAccess(ea.STATE_GET),
549
+ e.temperature().withAccess(ea.STATE_GET).withDescription('temperature of device internal mcu'),
550
+ exposes.numeric('power_factor', ea.STATE_GET).withDescription('Measured electrical power factor'),
551
+ exposes.numeric('ac_frequency', ea.STATE_GET).withUnit('Hz').withDescription('Measured electrical ac frequency')],
552
+ configure: async (device, coordinatorEndpoint, logger) => {
553
+ const endpoint = device.getEndpoint(1);
554
+ await reporting.bind(endpoint, coordinatorEndpoint, ['haElectricalMeasurement', 'seMetering', 'msTemperatureMeasurement']);
555
+ await endpoint.read('haElectricalMeasurement', ['acVoltageMultiplier', 'acVoltageDivisor', 'acCurrentMultiplier',
556
+ 'acCurrentDivisor']);
557
+ await endpoint.read('seMetering', ['multiplier', 'divisor']);
558
+ // await reporting.activePower(endpoint, {min: 1, max: 600, change: 5}); // no need, duplicate for power value.
559
+ await reporting.instantaneousDemand(endpoint, {min: 1, max: 600, change: 5});
560
+ await reporting.powerFactor(endpoint, {min: 10, max: 600, change: 1});
561
+ await reporting.rmsVoltage(endpoint, {min: 5, max: 600, change: 1});
562
+ await reporting.rmsCurrent(endpoint, {min: 5, max: 600, change: 1});
563
+ await reporting.currentSummDelivered(endpoint, {min: 1, max: 600, change: 5});
564
+ await reporting.temperature(endpoint, {min: 20, max: 300, change: 10});
565
+ endpoint.saveClusterAttributeKeyValue('haElectricalMeasurement', {acFrequencyMultiplier: 1, acFrequencyDivisor: 10});
566
+ await endpoint.configureReporting('haElectricalMeasurement', [{
567
+ attribute: 'acFrequency',
568
+ minimumReportInterval: 10,
569
+ maximumReportInterval: 600,
570
+ reportableChange: 3,
571
+ }]);
572
+ },
573
+ },
540
574
  {
541
575
  zigbeeModel: ['DLM-300Z'],
542
576
  model: 'DLM-300Z',
package/devices/sprut.js CHANGED
@@ -273,10 +273,10 @@ module.exports = [
273
273
  .withDescription('The minimum noise level at which the detector will work (default: 50)'),
274
274
  e.enum('co2_autocalibration', ea.ALL, switchActionValues)
275
275
  .withDescription('Automatic calibration of the CO2 sensor. If ON, the CO2 sensor will automatically calibrate '+
276
- 'every 7 days.'),
276
+ 'every 7 days. (MH-Z19B sensor)'),
277
277
  e.enum('co2_manual_calibration', ea.ALL, switchActionValues)
278
278
  .withDescription('Ventilate the room for 20 minutes, turn on manual calibration, and turn it off after one second. '+
279
- 'After about 5 minutes the CO2 sensor will show 400ppm. Calibration completed'),
279
+ 'After about 5 minutes the CO2 sensor will show 400ppm. Calibration completed. (MH-Z19B sensor)'),
280
280
  e.enum('th_heater', ea.ALL, switchActionValues)
281
281
  .withDescription('Turn on when working in conditions of high humidity (more than 70 %, RH) or condensation, '+
282
282
  'if the sensor shows 0 or 100 %.'),
@@ -307,14 +307,6 @@ module.exports = [
307
307
 
308
308
  // buzzer
309
309
  await device.getEndpoint(4).read('genOnOff', ['onOff']);
310
-
311
- // Read data at start
312
- await endpoint1.read('msTemperatureMeasurement', ['measuredValue']);
313
- await endpoint1.read('msIlluminanceMeasurement', ['measuredValue']);
314
- await endpoint1.read('msRelativeHumidity', ['measuredValue']);
315
- await endpoint1.read('msOccupancySensing', ['occupancy']);
316
- await endpoint1.read('sprutNoise', ['noise']);
317
- await endpoint1.read('sprutNoise', ['noiseDetected']);
318
310
  },
319
311
  endpoint: (device) => {
320
312
  return {'default': 1, 'l1': 2, 'l2': 3, 'l3': 4};
package/devices/tuya.js CHANGED
@@ -22,7 +22,7 @@ const TS011Fplugs = ['_TZ3000_5f43h46b', '_TZ3000_cphmq0q7', '_TZ3000_dpo1ysak',
22
22
  '_TZ3000_zloso4jk', '_TZ3000_r6buo8ba', '_TZ3000_iksasdbv', '_TZ3000_idrffznf', '_TZ3000_okaz9tjs', '_TZ3210_q7oryllx',
23
23
  '_TZ3000_ss98ec5d', '_TZ3000_gznh2xla', '_TZ3000_hdopuwv6', '_TZ3000_gvn91tmx', '_TZ3000_dksbtrzs', '_TZ3000_b28wrpvx',
24
24
  '_TZ3000_aim0ztek', '_TZ3000_mlswgkc3', '_TZ3000_7dndcnnb', '_TZ3000_waho4jtj', '_TZ3000_nmsciidq', '_TZ3000_jtgxgmks',
25
- '_TZ3000_rdfh8cfs', '_TZ3000_yujkchbz'];
25
+ '_TZ3000_rdfh8cfs', '_TZ3000_yujkchbz', '_TZ3000_fgwhjm9j'];
26
26
 
27
27
  const tzLocal = {
28
28
  SA12IZL_silence_siren: {
@@ -1657,7 +1657,8 @@ module.exports = [
1657
1657
  model: 'TS0042',
1658
1658
  vendor: 'TuYa',
1659
1659
  description: 'Wireless switch with 2 buttons',
1660
- whiteLabel: [{vendor: 'Smart9', model: 'S9TSZGB'}, {vendor: 'Lonsonho', model: 'TS0042'}],
1660
+ whiteLabel: [{vendor: 'Smart9', model: 'S9TSZGB'}, {vendor: 'Lonsonho', model: 'TS0042'},
1661
+ {vendor: 'ClickSmart+', model: 'CSPGM2075PW'}],
1661
1662
  exposes: [e.battery(), e.action(['1_single', '1_double', '1_hold', '2_single', '2_double', '2_hold'])],
1662
1663
  fromZigbee: [fz.tuya_on_off_action, fz.battery],
1663
1664
  toZigbee: [],
@@ -2989,7 +2990,9 @@ module.exports = [
2989
2990
  exposes: [e.battery(), e.vibration(), exposes.enum('sensitivity', exposes.access.STATE_SET, ['low', 'medium', 'high'])],
2990
2991
  },
2991
2992
  {
2992
- fingerprint: [{modelID: 'TS011F', manufacturerName: '_TZ3000_8bxrzyxz'}, {modelID: 'TS011F', manufacturerName: '_TZ3000_ky0fq4ho'}],
2993
+ fingerprint: [{modelID: 'TS011F', manufacturerName: '_TZ3000_8bxrzyxz'},
2994
+ {modelID: 'TS011F', manufacturerName: '_TZ3000_ky0fq4ho'},
2995
+ {modelID: 'TS011F', manufacturerName: '_TZ3000_qeuvnohg'}],
2993
2996
  model: 'TS011F_din_smart_relay',
2994
2997
  description: 'Din smart relay (with power monitoring)',
2995
2998
  vendor: 'TuYa',
@@ -3391,8 +3394,8 @@ module.exports = [
3391
3394
  },
3392
3395
  exposes: [
3393
3396
  e.temperature(), e.humidity(), e.battery(),
3394
- exposes.numeric('report_interval', ea.STATE_SET).withUnit('min').withValueMin(5).withValueMax(60).withValueStep(5)
3395
- .withDescription('Report interval'),
3397
+ exposes.numeric('temperature_report_interval', ea.STATE_SET).withUnit('min').withValueMin(5).withValueMax(60).withValueStep(5)
3398
+ .withDescription('Temperature Report interval'),
3396
3399
  exposes.enum('temperature_unit_convert', ea.STATE_SET, ['celsius', 'fahrenheit']).withDescription('Current display unit'),
3397
3400
  exposes.enum('temperature_alarm', ea.STATE, ['canceled', 'lower_alarm', 'upper_alarm'])
3398
3401
  .withDescription('Temperature alarm status'),
package/devices/ubisys.js CHANGED
@@ -671,10 +671,6 @@ module.exports = [
671
671
  ubisys.tz.dimmer_setup_genLevelCtrl, ubisys.tz.configure_device_setup, tz.ignore_transition, tz.light_brightness_move,
672
672
  tz.light_brightness_step],
673
673
  exposes: [e.light_brightness().withLevelConfig(), e.power(),
674
- exposes.numeric('ballast_physical_minimum_level', ea.ALL).withValueMin(1).withValueMax(254)
675
- .withDescription('Specifies the minimum light output the ballast can achieve.'),
676
- exposes.numeric('ballast_physical_maximum_level', ea.ALL).withValueMin(1).withValueMax(254)
677
- .withDescription('Specifies the maximum light output the ballast can achieve.'),
678
674
  exposes.numeric('ballast_minimum_level', ea.ALL).withValueMin(1).withValueMax(254)
679
675
  .withDescription('Specifies the minimum light output of the ballast'),
680
676
  exposes.numeric('ballast_maximum_level', ea.ALL).withValueMin(1).withValueMax(254)
package/devices/xiaomi.js CHANGED
@@ -1371,10 +1371,16 @@ module.exports = [
1371
1371
  model: 'ZNCZ12LM',
1372
1372
  description: 'Mi power plug ZigBee US',
1373
1373
  vendor: 'Xiaomi',
1374
- fromZigbee: [fz.on_off, fz.xiaomi_power, fz.xiaomi_basic, fz.ignore_occupancy_report, fz.ignore_illuminance_report],
1375
- toZigbee: [tz.on_off, tz.xiaomi_power],
1376
- exposes: [e.switch(), e.power().withAccess(ea.STATE_GET), e.energy(), e.device_temperature().withAccess(ea.STATE),
1377
- e.voltage().withAccess(ea.STATE)],
1374
+ fromZigbee: [fz.on_off, fz.xiaomi_power, fz.aqara_opple, fz.xiaomi_basic, fz.ignore_occupancy_report, fz.ignore_illuminance_report],
1375
+ toZigbee: [tz.on_off, tz.xiaomi_power, tz.xiaomi_switch_power_outage_memory, tz.xiaomi_auto_off, tz.xiaomi_led_disabled_night,
1376
+ tz.xiaomi_overload_protection],
1377
+ exposes: [
1378
+ e.switch(), e.power().withAccess(ea.STATE_GET), e.energy(), e.device_temperature().withAccess(ea.STATE),
1379
+ e.voltage().withAccess(ea.STATE), e.current(), e.consumer_connected(), e.led_disabled_night(),
1380
+ e.power_outage_memory(), exposes.binary('auto_off', ea.STATE_SET, true, false)
1381
+ .withDescription('Turn the device automatically off when attached device consumes less than 2W for 20 minutes'),
1382
+ exposes.numeric('overload_protection', exposes.access.ALL).withValueMin(100).withValueMax(2300).withUnit('W')
1383
+ .withDescription('Maximum allowed load, turns off if exceeded')],
1378
1384
  ota: ota.zigbeeOTA,
1379
1385
  },
1380
1386
  {
@@ -235,7 +235,7 @@ module.exports = [
235
235
  },
236
236
  },
237
237
  {
238
- fingerprint: [{modelID: 'TS0601', manufacturerName: '_TZE200_9mahtqtg'}],
238
+ fingerprint: [{modelID: 'TS0601', manufacturerName: '_TZE200_9mahtqtg'}, {modelID: 'TS0601', manufacturerName: '_TZE200_r731zlxk'}],
239
239
  model: 'TB26-6',
240
240
  vendor: 'Zemismart',
241
241
  description: '6-gang smart wall switch',
package/lib/tuya.js CHANGED
@@ -741,8 +741,10 @@ const dataPoints = {
741
741
  nousMinHumi: 13,
742
742
  nousTempAlarm: 14,
743
743
  nousHumiAlarm: 15,
744
+ nousHumiSensitivity: 20,
744
745
  nousTempSensitivity: 19,
745
- nousReportInterval: 17,
746
+ nousTempReportInterval: 17,
747
+ nousHumiReportInterval: 18,
746
748
  // TUYA Temperature and Humidity Sensor
747
749
  tthTemperature: 1,
748
750
  tthHumidity: 2,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "zigbee-herdsman-converters",
3
- "version": "14.0.647",
3
+ "version": "14.0.649",
4
4
  "description": "Collection of device converters to be used with zigbee-herdsman",
5
5
  "main": "index.js",
6
6
  "files": [
@@ -38,7 +38,7 @@
38
38
  "buffer-crc32": "^0.2.13",
39
39
  "https-proxy-agent": "^5.0.1",
40
40
  "tar-stream": "^2.2.0",
41
- "zigbee-herdsman": "^0.14.64"
41
+ "zigbee-herdsman": "^0.14.66"
42
42
  },
43
43
  "devDependencies": {
44
44
  "eslint": "*",