zigbee-herdsman-converters 14.0.414 → 14.0.418

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.
@@ -423,9 +423,12 @@ const converters = {
423
423
  // This is for occupancy sensor that send motion start AND stop messages
424
424
  cluster: 'msOccupancySensing',
425
425
  type: ['attributeReport', 'readResponse'],
426
+ options: [exposes.options.no_occupancy_since()],
426
427
  convert: (model, msg, publish, options, meta) => {
427
428
  if (msg.data.hasOwnProperty('occupancy')) {
428
- return {occupancy: (msg.data.occupancy % 2) > 0};
429
+ const payload = {occupancy: (msg.data.occupancy % 2) > 0};
430
+ utils.noOccupancySince(msg.endpoint, payload, options, publish);
431
+ return payload;
429
432
  }
430
433
  },
431
434
  },
@@ -449,32 +452,19 @@ const converters = {
449
452
  options.occupancy_timeout : 90;
450
453
 
451
454
  // Stop existing timers because motion is detected and set a new one.
452
- globalStore.getValue(msg.endpoint, 'timers', []).forEach((t) => clearTimeout(t));
453
- globalStore.putValue(msg.endpoint, 'timers', []);
455
+ clearTimeout(globalStore.getValue(msg.endpoint, 'occupancy_timer', null));
454
456
 
455
457
  if (timeout !== 0) {
456
458
  const timer = setTimeout(() => {
457
459
  publish({occupancy: false});
458
460
  }, timeout * 1000);
459
461
 
460
- globalStore.getValue(msg.endpoint, 'timers').push(timer);
461
- }
462
-
463
- // No occupancy since
464
- if (options && options.no_occupancy_since) {
465
- options.no_occupancy_since.forEach((since) => {
466
- const timer = setTimeout(() => {
467
- publish({no_occupancy_since: since});
468
- }, since * 1000);
469
- globalStore.getValue(msg.endpoint, 'timers').push(timer);
470
- });
462
+ globalStore.putValue(msg.endpoint, 'occupancy_timer', timer);
471
463
  }
472
464
 
473
- if (options && options.no_occupancy_since) {
474
- return {occupancy: true, no_occupancy_since: 0};
475
- } else {
476
- return {occupancy: true};
477
- }
465
+ const payload = {occupancy: true};
466
+ utils.noOccupancySince(msg.endpoint, payload, options, publish);
467
+ return payload;
478
468
  },
479
469
  },
480
470
  occupancy_timeout: {
@@ -5362,7 +5352,7 @@ const converters = {
5362
5352
  payload.voltage = value;
5363
5353
  payload.battery = batteryVoltageToPercentage(value, '3V_2100');
5364
5354
  } else if (index === 3) {
5365
- if (!['WXCJKG11LM ', 'WXCJKG12LM', 'WXCJKG13LM'].includes(model.model)) {
5355
+ if (!['WXCJKG11LM', 'WXCJKG12LM', 'WXCJKG13LM'].includes(model.model)) {
5366
5356
  payload.temperature = calibrateAndPrecisionRoundOptions(value, options, 'temperature'); // 0x03
5367
5357
  }
5368
5358
  } else if (index === 5) {
@@ -5373,7 +5363,7 @@ const converters = {
5373
5363
  payload[`state_${mapping}`] = value === 1 ? 'ON' : 'OFF';
5374
5364
  } else if (['WXKG14LM', 'WXKG16LM', 'WXKG17LM'].includes(model.model)) {
5375
5365
  payload.click_mode = {1: 'fast', 2: 'multi'}[value];
5376
- } else if (['WXCJKG11LM ', 'WXCJKG12LM', 'WXCJKG13LM'].includes(model.model)) {
5366
+ } else if (['WXCJKG11LM', 'WXCJKG12LM', 'WXCJKG13LM'].includes(model.model)) {
5377
5367
  // We don't know what the value means for these devices.
5378
5368
  // https://github.com/Koenkk/zigbee2mqtt/issues/11126
5379
5369
  } else {
package/devices/adeo.js CHANGED
@@ -6,6 +6,13 @@ const tz = require('../converters/toZigbee');
6
6
  const e = exposes.presets;
7
7
 
8
8
  module.exports = [
9
+ {
10
+ zigbeeModel: ['ZBEK-12'],
11
+ model: 'IA-CDZFB2AA007NA-MZN-01',
12
+ vendor: 'ADEO',
13
+ description: 'ENKI LEXMAN E27 LED white',
14
+ extend: extend.light_onoff_brightness_colortemp({colorTempRange: [153, 454]}),
15
+ },
9
16
  {
10
17
  zigbeeModel: ['LDSENK01F'],
11
18
  model: 'LDSENK01F',
@@ -39,7 +39,8 @@ module.exports = [
39
39
  description: 'Power plug',
40
40
  fromZigbee: [fz.on_off, fz.electrical_measurement, fz.metering, fz.device_temperature],
41
41
  toZigbee: [tz.on_off],
42
- exposes: [e.switch(), e.power(), e.current(), e.voltage(), e.energy(), e.device_temperature()],
42
+ exposes: [e.switch(), e.power(), e.current(), e.voltage(), e.energy(), e.device_temperature(), e.ac_frequency()],
43
+ options: [exposes.options.precision(`ac_frequency`)],
43
44
  configure: async (device, coordinatorEndpoint, logger) => {
44
45
  const endpoint = device.getEndpoint(2);
45
46
  await reporting.bind(endpoint, coordinatorEndpoint, ['genOnOff', 'haElectricalMeasurement', 'seMetering', 'genDeviceTempCfg']);
@@ -52,6 +53,7 @@ module.exports = [
52
53
  await reporting.readMeteringMultiplierDivisor(endpoint);
53
54
  await reporting.currentSummDelivered(endpoint, {change: [0, 20]}); // Limit reports to once every 5m, or 0.02kWh
54
55
  await reporting.instantaneousDemand(endpoint, {min: constants.repInterval.MINUTES_5, change: 10});
56
+ await reporting.acFrequency(endpoint);
55
57
  },
56
58
  endpoint: (device) => {
57
59
  return {default: 2};
package/devices/ecodim.js CHANGED
@@ -40,7 +40,7 @@ module.exports = [
40
40
  ]},
41
41
  ],
42
42
  zigbeeModel: ['Dimmer-Switch-ZB3.0'],
43
- model: 'Eco-Dim.07',
43
+ model: 'Eco-Dim.07/Eco-Dim.10',
44
44
  vendor: 'EcoDim',
45
45
  description: 'Zigbee & Z-wave dimmer',
46
46
  extend: extend.light_onoff_brightness({noConfigure: true, disableEffect: true}),
@@ -6,7 +6,8 @@ const ea = exposes.access;
6
6
 
7
7
  module.exports = [
8
8
  {
9
- fingerprint: [{modelID: 'TS0601', manufacturerName: '_TZE200_wt9agwf3'}],
9
+ fingerprint: [{modelID: 'TS0601', manufacturerName: '_TZE200_wt9agwf3'},
10
+ {modelID: 'TS0601', manufacturerName: '_TZE200_5uodvhgc'}],
10
11
  model: 'FK_V02',
11
12
  vendor: 'FrankEver',
12
13
  description: 'Zigbee smart water valve',
@@ -267,6 +267,7 @@ module.exports = [
267
267
  vendor: 'Gledopto',
268
268
  ota: ota.zigbeeOTA,
269
269
  description: 'Zigbee LED Controller RGB+CCT (pro)',
270
+ whiteLabel: [{vendor: 'Gledopto', model: 'GL-C-001P'}],
270
271
  extend: gledoptoExtend.light_onoff_brightness_colortemp_color({colorTempRange: [158, 495], noConfigure: true}),
271
272
  meta: {disableDefaultResponse: true},
272
273
  configure: async (device, coordinatorEndpoint, logger) => {
@@ -568,6 +569,14 @@ module.exports = [
568
569
  description: 'Zigbee 10W Floodlight RGB+CCT (pro)',
569
570
  extend: gledoptoExtend.light_onoff_brightness_colortemp_color(),
570
571
  },
572
+ {
573
+ zigbeeModel: ['GL-FL-001P'],
574
+ model: 'GL-FL-001P',
575
+ vendor: 'Gledopto',
576
+ ota: ota.zigbeeOTA,
577
+ description: 'Zigbee 10W Floodlight RGB+CCT 12V Low Voltage (pro)',
578
+ extend: gledoptoExtend.light_onoff_brightness_colortemp_color({colorTempRange: [158, 495]}),
579
+ },
571
580
  {
572
581
  zigbeeModel: ['GL-FL-005TZ'],
573
582
  model: 'GL-FL-005TZ',
package/devices/heiman.js CHANGED
@@ -398,7 +398,7 @@ module.exports = [
398
398
  exposes: [e.temperature(), e.humidity(), e.battery()],
399
399
  },
400
400
  {
401
- fingerprint: [{modelID: 'SOS-EM', manufacturerName: 'HEIMAN'}],
401
+ fingerprint: [{modelID: 'SOS-EM', manufacturerName: 'HEIMAN'}, {modelID: 'SOS-EF-3.0', manufacturerName: 'HEIMAN'}],
402
402
  model: 'HS1EB/HS1EB-E',
403
403
  vendor: 'HEIMAN',
404
404
  description: 'Smart emergency button',
@@ -83,4 +83,22 @@ module.exports = [
83
83
  },
84
84
  exposes: [e.lock(), e.battery()],
85
85
  },
86
+ {
87
+ zigbeeModel: ['SMARTCODE_LEVER_5'],
88
+ model: '99120-021',
89
+ vendor: 'Kwikset',
90
+ description: '912 SmartCode traditional electronic lever',
91
+ fromZigbee: [fz.lock, fz.lock_operation_event, fz.battery, fz.lock_programming_event, fz.lock_pin_code_response],
92
+ toZigbee: [tz.lock, tz.pincode_lock],
93
+ meta: {pinCodeCount: 30},
94
+ configure: async (device, coordinatorEndpoint, logger) => {
95
+ const endpoint = device.getEndpoint(2);
96
+ console.log(device);
97
+ console.log(endpoint.clusters);
98
+ await reporting.bind(endpoint, coordinatorEndpoint, ['closuresDoorLock', 'genPowerCfg']);
99
+ await reporting.lockState(endpoint);
100
+ await reporting.batteryPercentageRemaining(endpoint);
101
+ },
102
+ exposes: [e.lock(), e.battery(), e.pincode()],
103
+ },
86
104
  ];
package/devices/lixee.js CHANGED
@@ -295,19 +295,19 @@ const clustersDef = {
295
295
  const exposedData = [
296
296
  // Historique
297
297
  {cluster: clustersDef._0x0702, att: 'meterSerialNumber', reportable: false, onlyProducer: false, linkyPhase: linkyPhaseDef.single, linkyMode: linkyModeDef.legacy, exposes: exposes.text('ADCO', ea.STATE).withProperty('meter_serial_number').withDescription('Serial Number')},
298
- {cluster: clustersDef._0x0702, att: 'currentSummDelivered', reportable: true, reportChange: 100, onlyProducer: false, linkyPhase: linkyPhaseDef.single, linkyMode: linkyModeDef.legacy, exposes: exposes.numeric('BASE', ea.STATE).withUnit('kWh').withProperty('current_summ_delivered').withDescription('Base index')},
298
+ {cluster: clustersDef._0x0702, att: 'currentSummDelivered', reportable: true, report: {change: 100}, onlyProducer: false, linkyPhase: linkyPhaseDef.single, linkyMode: linkyModeDef.legacy, exposes: exposes.numeric('BASE', ea.STATE).withUnit('kWh').withProperty('current_summ_delivered').withDescription('Base index')},
299
299
  {cluster: clustersDef._0xFF66, att: 'currentTarif', reportable: false, onlyProducer: false, linkyPhase: linkyPhaseDef.single, linkyMode: linkyModeDef.legacy, exposes: exposes.text('OPTARIF', ea.STATE).withProperty('current_tarif').withDescription('Tarif option')},
300
300
  {cluster: clustersDef._0x0B01, att: 'availablePower', reportable: false, onlyProducer: false, linkyPhase: linkyPhaseDef.single, linkyMode: linkyModeDef.legacy, exposes: exposes.numeric('ISOUSC', ea.STATE).withUnit('A').withProperty('available_power').withDescription('Subscribed intensity level')},
301
- {cluster: clustersDef._0x0702, att: 'currentTier1SummDelivered', reportable: false, reportChange: 100, onlyProducer: false, linkyPhase: linkyPhaseDef.single, linkyMode: linkyModeDef.legacy, exposes: exposes.numeric('HCHC', ea.STATE).withUnit('kWh').withProperty('current_tier1_summ_delivered').withDescription('HCHC index')},
302
- {cluster: clustersDef._0x0702, att: 'currentTier2SummDelivered', reportable: false, reportChange: 100, onlyProducer: false, linkyPhase: linkyPhaseDef.single, linkyMode: linkyModeDef.legacy, exposes: exposes.numeric('HCHP', ea.STATE).withUnit('kWh').withProperty('current_tier2_summ_delivered').withDescription('HCHP index')},
303
- {cluster: clustersDef._0x0702, att: 'currentTier1SummDelivered', reportable: false, reportChange: 100, onlyProducer: false, linkyPhase: linkyPhaseDef.single, linkyMode: linkyModeDef.legacy, exposes: exposes.numeric('EJPHN', ea.STATE).withUnit('kWh').withProperty('current_tier1_summ_delivered').withDescription('EJPHN index')},
304
- {cluster: clustersDef._0x0702, att: 'currentTier2SummDelivered', reportable: false, reportChange: 100, onlyProducer: false, linkyPhase: linkyPhaseDef.single, linkyMode: linkyModeDef.legacy, exposes: exposes.numeric('EJPHPM', ea.STATE).withUnit('kWh').withProperty('current_tier2_summ_delivered').withDescription('EJPHPM index')},
305
- {cluster: clustersDef._0x0702, att: 'currentTier1SummDelivered', reportable: false, reportChange: 100, onlyProducer: false, linkyPhase: linkyPhaseDef.single, linkyMode: linkyModeDef.legacy, exposes: exposes.numeric('BBRHCJB', ea.STATE).withUnit('kWh').withProperty('current_tier1_summ_delivered').withDescription('BBRHCJB index')},
306
- {cluster: clustersDef._0x0702, att: 'currentTier2SummDelivered', reportable: false, reportChange: 100, onlyProducer: false, linkyPhase: linkyPhaseDef.single, linkyMode: linkyModeDef.legacy, exposes: exposes.numeric('BBRHPJB', ea.STATE).withUnit('kWh').withProperty('current_tier2_summ_delivered').withDescription('BBRHPJB index')},
307
- {cluster: clustersDef._0x0702, att: 'currentTier3SummDelivered', reportable: false, reportChange: 100, onlyProducer: false, linkyPhase: linkyPhaseDef.single, linkyMode: linkyModeDef.legacy, exposes: exposes.numeric('BBRHCJW', ea.STATE).withUnit('kWh').withProperty('current_tier3_summ_delivered').withDescription('BBRHCJW index')},
308
- {cluster: clustersDef._0x0702, att: 'currentTier4SummDelivered', reportable: false, reportChange: 100, onlyProducer: false, linkyPhase: linkyPhaseDef.single, linkyMode: linkyModeDef.legacy, exposes: exposes.numeric('BBRHPJW', ea.STATE).withUnit('kWh').withProperty('current_tier4_summ_delivered').withDescription('BBRHPJW index')},
309
- {cluster: clustersDef._0x0702, att: 'currentTier5SummDelivered', reportable: false, reportChange: 100, onlyProducer: false, linkyPhase: linkyPhaseDef.single, linkyMode: linkyModeDef.legacy, exposes: exposes.numeric('BBRHCJR', ea.STATE).withUnit('kWh').withProperty('current_tier5_summ_delivered').withDescription('BBRHCJR index')},
310
- {cluster: clustersDef._0x0702, att: 'currentTier6SummDelivered', reportable: false, reportChange: 100, onlyProducer: false, linkyPhase: linkyPhaseDef.single, linkyMode: linkyModeDef.legacy, exposes: exposes.numeric('BBRHPJR', ea.STATE).withUnit('kWh').withProperty('current_tier6_summ_delivered').withDescription('BBRHPJR index')},
301
+ {cluster: clustersDef._0x0702, att: 'currentTier1SummDelivered', reportable: false, report: {change: 100, min: 60}, onlyProducer: false, linkyPhase: linkyPhaseDef.single, linkyMode: linkyModeDef.legacy, exposes: exposes.numeric('HCHC', ea.STATE).withUnit('kWh').withProperty('current_tier1_summ_delivered').withDescription('HCHC index')},
302
+ {cluster: clustersDef._0x0702, att: 'currentTier2SummDelivered', reportable: false, report: {change: 100, min: 60}, onlyProducer: false, linkyPhase: linkyPhaseDef.single, linkyMode: linkyModeDef.legacy, exposes: exposes.numeric('HCHP', ea.STATE).withUnit('kWh').withProperty('current_tier2_summ_delivered').withDescription('HCHP index')},
303
+ {cluster: clustersDef._0x0702, att: 'currentTier1SummDelivered', reportable: false, report: {change: 100, min: 60}, onlyProducer: false, linkyPhase: linkyPhaseDef.single, linkyMode: linkyModeDef.legacy, exposes: exposes.numeric('EJPHN', ea.STATE).withUnit('kWh').withProperty('current_tier1_summ_delivered').withDescription('EJPHN index')},
304
+ {cluster: clustersDef._0x0702, att: 'currentTier2SummDelivered', reportable: false, report: {change: 100, min: 60}, onlyProducer: false, linkyPhase: linkyPhaseDef.single, linkyMode: linkyModeDef.legacy, exposes: exposes.numeric('EJPHPM', ea.STATE).withUnit('kWh').withProperty('current_tier2_summ_delivered').withDescription('EJPHPM index')},
305
+ {cluster: clustersDef._0x0702, att: 'currentTier1SummDelivered', reportable: false, report: {change: 100, min: 60}, onlyProducer: false, linkyPhase: linkyPhaseDef.single, linkyMode: linkyModeDef.legacy, exposes: exposes.numeric('BBRHCJB', ea.STATE).withUnit('kWh').withProperty('current_tier1_summ_delivered').withDescription('BBRHCJB index')},
306
+ {cluster: clustersDef._0x0702, att: 'currentTier2SummDelivered', reportable: false, report: {change: 100, min: 60}, onlyProducer: false, linkyPhase: linkyPhaseDef.single, linkyMode: linkyModeDef.legacy, exposes: exposes.numeric('BBRHPJB', ea.STATE).withUnit('kWh').withProperty('current_tier2_summ_delivered').withDescription('BBRHPJB index')},
307
+ {cluster: clustersDef._0x0702, att: 'currentTier3SummDelivered', reportable: false, report: {change: 100, min: 60}, onlyProducer: false, linkyPhase: linkyPhaseDef.single, linkyMode: linkyModeDef.legacy, exposes: exposes.numeric('BBRHCJW', ea.STATE).withUnit('kWh').withProperty('current_tier3_summ_delivered').withDescription('BBRHCJW index')},
308
+ {cluster: clustersDef._0x0702, att: 'currentTier4SummDelivered', reportable: false, report: {change: 100, min: 60}, onlyProducer: false, linkyPhase: linkyPhaseDef.single, linkyMode: linkyModeDef.legacy, exposes: exposes.numeric('BBRHPJW', ea.STATE).withUnit('kWh').withProperty('current_tier4_summ_delivered').withDescription('BBRHPJW index')},
309
+ {cluster: clustersDef._0x0702, att: 'currentTier5SummDelivered', reportable: false, report: {change: 100, min: 60}, onlyProducer: false, linkyPhase: linkyPhaseDef.single, linkyMode: linkyModeDef.legacy, exposes: exposes.numeric('BBRHCJR', ea.STATE).withUnit('kWh').withProperty('current_tier5_summ_delivered').withDescription('BBRHCJR index')},
310
+ {cluster: clustersDef._0x0702, att: 'currentTier6SummDelivered', reportable: false, report: {change: 100, min: 60}, onlyProducer: false, linkyPhase: linkyPhaseDef.single, linkyMode: linkyModeDef.legacy, exposes: exposes.numeric('BBRHPJR', ea.STATE).withUnit('kWh').withProperty('current_tier6_summ_delivered').withDescription('BBRHPJR index')},
311
311
  {cluster: clustersDef._0x0B04, att: 'rmsCurrent', reportable: true, onlyProducer: false, linkyPhase: linkyPhaseDef.single, linkyMode: linkyModeDef.legacy, exposes: exposes.numeric('IINST', ea.STATE).withUnit('A').withProperty('rms_current').withDescription('RMS current')},
312
312
  {cluster: clustersDef._0x0B04, att: 'rmsCurrent', reportable: true, onlyProducer: false, linkyPhase: linkyPhaseDef.three, linkyMode: linkyModeDef.legacy, exposes: exposes.numeric('IINST1', ea.STATE).withUnit('A').withProperty('rms_current').withDescription('RMS current (phase 1)')},
313
313
  {cluster: clustersDef._0x0B04, att: 'rmsCurrentPhB', reportable: true, onlyProducer: false, linkyPhase: linkyPhaseDef.three, linkyMode: linkyModeDef.legacy, exposes: exposes.numeric('IINST2', ea.STATE).withUnit('A').withProperty('rms_current_ph_b').withDescription('RMS current (phase 2)')},
@@ -333,22 +333,22 @@ const exposedData = [
333
333
  {cluster: clustersDef._0xFF66, att: 'currentIndexTarif', reportable: false, onlyProducer: false, linkyPhase: linkyPhaseDef.single, linkyMode: linkyModeDef.standard, exposes: exposes.numeric('NTARF', ea.STATE).withProperty('current_index_tarif').withDescription('Current tariff index number')},
334
334
  {cluster: clustersDef._0x0B01, att: 'softwareRevision', reportable: false, onlyProducer: false, linkyPhase: linkyPhaseDef.single, linkyMode: linkyModeDef.standard, exposes: exposes.numeric('VTIC', ea.STATE).withProperty('software_revision').withDescription('Customer tele-information protocol version')},
335
335
  {cluster: clustersDef._0xFF66, att: 'currentDate', reportable: false, onlyProducer: false, linkyPhase: linkyPhaseDef.single, linkyMode: linkyModeDef.standard, exposes: exposes.text('DATE', ea.STATE).withProperty('current_date').withDescription('Current date and time')},
336
- {cluster: clustersDef._0x0702, att: 'currentSummDelivered', reportable: true, reportChange: 100, onlyProducer: false, linkyPhase: linkyPhaseDef.single, linkyMode: linkyModeDef.standard, exposes: exposes.numeric('EAST', ea.STATE).withUnit('kWh').withProperty('current_summ_delivered').withDescription('Total active power delivered')},
337
- {cluster: clustersDef._0x0702, att: 'currentTier1SummDelivered', reportable: true, reportChange: 100, onlyProducer: false, linkyPhase: linkyPhaseDef.single, linkyMode: linkyModeDef.standard, exposes: exposes.numeric('EASF01', ea.STATE).withUnit('kWh').withProperty('current_tier1_summ_delivered').withDescription('Total provider active power delivered (index 01)')},
338
- {cluster: clustersDef._0x0702, att: 'currentTier2SummDelivered', reportable: true, reportChange: 100, onlyProducer: false, linkyPhase: linkyPhaseDef.single, linkyMode: linkyModeDef.standard, exposes: exposes.numeric('EASF02', ea.STATE).withUnit('kWh').withProperty('current_tier2_summ_delivered').withDescription('Total provider active power delivered (index 02)')},
339
- {cluster: clustersDef._0x0702, att: 'currentTier3SummDelivered', reportable: true, reportChange: 100, onlyProducer: false, linkyPhase: linkyPhaseDef.single, linkyMode: linkyModeDef.standard, exposes: exposes.numeric('EASF03', ea.STATE).withUnit('kWh').withProperty('current_tier3_summ_delivered').withDescription('Total provider active power delivered (index 03)')},
340
- {cluster: clustersDef._0x0702, att: 'currentTier4SummDelivered', reportable: false, reportChange: 100, onlyProducer: false, linkyPhase: linkyPhaseDef.single, linkyMode: linkyModeDef.standard, exposes: exposes.numeric('EASF04', ea.STATE).withUnit('kWh').withProperty('current_tier4_summ_delivered').withDescription('Total provider active power delivered (index 04)')},
341
- {cluster: clustersDef._0x0702, att: 'currentTier5SummDelivered', reportable: false, reportChange: 100, onlyProducer: false, linkyPhase: linkyPhaseDef.single, linkyMode: linkyModeDef.standard, exposes: exposes.numeric('EASF05', ea.STATE).withUnit('kWh').withProperty('current_tier5_summ_delivered').withDescription('Total provider active power delivered (index 05)')},
342
- {cluster: clustersDef._0x0702, att: 'currentTier6SummDelivered', reportable: false, reportChange: 100, onlyProducer: false, linkyPhase: linkyPhaseDef.single, linkyMode: linkyModeDef.standard, exposes: exposes.numeric('EASF06', ea.STATE).withUnit('kWh').withProperty('current_tier6_summ_delivered').withDescription('Total provider active power delivered (index 06)')},
343
- {cluster: clustersDef._0x0702, att: 'currentTier7SummDelivered', reportable: false, reportChange: 100, onlyProducer: false, linkyPhase: linkyPhaseDef.single, linkyMode: linkyModeDef.standard, exposes: exposes.numeric('EASF07', ea.STATE).withUnit('kWh').withProperty('current_tier7_summ_delivered').withDescription('Total provider active power delivered (index 07)')},
344
- {cluster: clustersDef._0x0702, att: 'currentTier8SummDelivered', reportable: false, reportChange: 100, onlyProducer: false, linkyPhase: linkyPhaseDef.single, linkyMode: linkyModeDef.standard, exposes: exposes.numeric('EASF08', ea.STATE).withUnit('kWh').withProperty('current_tier8_summ_delivered').withDescription('Total provider active power delivered (index 08)')},
345
- {cluster: clustersDef._0x0702, att: 'currentTier9SummDelivered', reportable: false, reportChange: 100, onlyProducer: false, linkyPhase: linkyPhaseDef.single, linkyMode: linkyModeDef.standard, exposes: exposes.numeric('EASF09', ea.STATE).withUnit('kWh').withProperty('current_tier9_summ_delivered').withDescription('Total provider active power delivered (index 09)')},
346
- {cluster: clustersDef._0x0702, att: 'currentTier10SummDelivered', reportable: false, reportChange: 100, onlyProducer: false, linkyPhase: linkyPhaseDef.single, linkyMode: linkyModeDef.standard, exposes: exposes.numeric('EASF10', ea.STATE).withUnit('kWh').withProperty('current_tier10_summ_delivered').withDescription('Total provider active power delivered (index 10)')},
347
- {cluster: clustersDef._0xFF66, att: 'activeEnerfyOutD01', reportable: true, reportChange: 100, onlyProducer: false, linkyPhase: linkyPhaseDef.single, linkyMode: linkyModeDef.standard, exposes: exposes.numeric('EASD01', ea.STATE).withUnit('kWh').withProperty('active_enerfy_out_d01').withDescription('Active energy withdrawn Distributor (index 01)')},
348
- {cluster: clustersDef._0xFF66, att: 'activeEnerfyOutD02', reportable: false, reportChange: 100, onlyProducer: false, linkyPhase: linkyPhaseDef.single, linkyMode: linkyModeDef.standard, exposes: exposes.numeric('EASD02', ea.STATE).withUnit('kWh').withProperty('active_enerfy_out_d02').withDescription('Active energy withdrawn Distributor (index 02)')},
349
- {cluster: clustersDef._0xFF66, att: 'activeEnerfyOutD03', reportable: false, reportChange: 100, onlyProducer: false, linkyPhase: linkyPhaseDef.single, linkyMode: linkyModeDef.standard, exposes: exposes.numeric('EASD03', ea.STATE).withUnit('kWh').withProperty('active_enerfy_out_d03').withDescription('Active energy withdrawn Distributor (index 03)')},
350
- {cluster: clustersDef._0xFF66, att: 'activeEnerfyOutD04', reportable: false, reportChange: 100, onlyProducer: false, linkyPhase: linkyPhaseDef.single, linkyMode: linkyModeDef.standard, exposes: exposes.numeric('EASD04', ea.STATE).withUnit('kWh').withProperty('active_enerfy_out_d04').withDescription('Active energy withdrawn Distributor (index 04)')},
351
- {cluster: clustersDef._0x0702, att: 'currentSummReceived', reportable: true, reportChange: 100, onlyProducer: true, linkyPhase: linkyPhaseDef.single, linkyMode: linkyModeDef.standard, exposes: exposes.numeric('EAIT', ea.STATE).withUnit('kWh').withProperty('current_summ_received').withDescription('Total active power injected')},
336
+ {cluster: clustersDef._0x0702, att: 'currentSummDelivered', reportable: true, report: {change: 100}, onlyProducer: false, linkyPhase: linkyPhaseDef.single, linkyMode: linkyModeDef.standard, exposes: exposes.numeric('EAST', ea.STATE).withUnit('kWh').withProperty('current_summ_delivered').withDescription('Total active power delivered')},
337
+ {cluster: clustersDef._0x0702, att: 'currentTier1SummDelivered', reportable: true, report: {change: 100, min: 60}, onlyProducer: false, linkyPhase: linkyPhaseDef.single, linkyMode: linkyModeDef.standard, exposes: exposes.numeric('EASF01', ea.STATE).withUnit('kWh').withProperty('current_tier1_summ_delivered').withDescription('Total provider active power delivered (index 01)')},
338
+ {cluster: clustersDef._0x0702, att: 'currentTier2SummDelivered', reportable: true, report: {change: 100, min: 60}, onlyProducer: false, linkyPhase: linkyPhaseDef.single, linkyMode: linkyModeDef.standard, exposes: exposes.numeric('EASF02', ea.STATE).withUnit('kWh').withProperty('current_tier2_summ_delivered').withDescription('Total provider active power delivered (index 02)')},
339
+ {cluster: clustersDef._0x0702, att: 'currentTier3SummDelivered', reportable: true, report: {change: 100, min: 60}, onlyProducer: false, linkyPhase: linkyPhaseDef.single, linkyMode: linkyModeDef.standard, exposes: exposes.numeric('EASF03', ea.STATE).withUnit('kWh').withProperty('current_tier3_summ_delivered').withDescription('Total provider active power delivered (index 03)')},
340
+ {cluster: clustersDef._0x0702, att: 'currentTier4SummDelivered', reportable: false, report: {change: 100, min: 60}, onlyProducer: false, linkyPhase: linkyPhaseDef.single, linkyMode: linkyModeDef.standard, exposes: exposes.numeric('EASF04', ea.STATE).withUnit('kWh').withProperty('current_tier4_summ_delivered').withDescription('Total provider active power delivered (index 04)')},
341
+ {cluster: clustersDef._0x0702, att: 'currentTier5SummDelivered', reportable: false, report: {change: 100, min: 60}, onlyProducer: false, linkyPhase: linkyPhaseDef.single, linkyMode: linkyModeDef.standard, exposes: exposes.numeric('EASF05', ea.STATE).withUnit('kWh').withProperty('current_tier5_summ_delivered').withDescription('Total provider active power delivered (index 05)')},
342
+ {cluster: clustersDef._0x0702, att: 'currentTier6SummDelivered', reportable: false, report: {change: 100, min: 60}, onlyProducer: false, linkyPhase: linkyPhaseDef.single, linkyMode: linkyModeDef.standard, exposes: exposes.numeric('EASF06', ea.STATE).withUnit('kWh').withProperty('current_tier6_summ_delivered').withDescription('Total provider active power delivered (index 06)')},
343
+ {cluster: clustersDef._0x0702, att: 'currentTier7SummDelivered', reportable: false, report: {change: 100, min: 60}, onlyProducer: false, linkyPhase: linkyPhaseDef.single, linkyMode: linkyModeDef.standard, exposes: exposes.numeric('EASF07', ea.STATE).withUnit('kWh').withProperty('current_tier7_summ_delivered').withDescription('Total provider active power delivered (index 07)')},
344
+ {cluster: clustersDef._0x0702, att: 'currentTier8SummDelivered', reportable: false, report: {change: 100, min: 60}, onlyProducer: false, linkyPhase: linkyPhaseDef.single, linkyMode: linkyModeDef.standard, exposes: exposes.numeric('EASF08', ea.STATE).withUnit('kWh').withProperty('current_tier8_summ_delivered').withDescription('Total provider active power delivered (index 08)')},
345
+ {cluster: clustersDef._0x0702, att: 'currentTier9SummDelivered', reportable: false, report: {change: 100, min: 60}, onlyProducer: false, linkyPhase: linkyPhaseDef.single, linkyMode: linkyModeDef.standard, exposes: exposes.numeric('EASF09', ea.STATE).withUnit('kWh').withProperty('current_tier9_summ_delivered').withDescription('Total provider active power delivered (index 09)')},
346
+ {cluster: clustersDef._0x0702, att: 'currentTier10SummDelivered', reportable: false, report: {change: 100, min: 60}, onlyProducer: false, linkyPhase: linkyPhaseDef.single, linkyMode: linkyModeDef.standard, exposes: exposes.numeric('EASF10', ea.STATE).withUnit('kWh').withProperty('current_tier10_summ_delivered').withDescription('Total provider active power delivered (index 10)')},
347
+ {cluster: clustersDef._0xFF66, att: 'activeEnerfyOutD01', reportable: true, report: {change: 100}, onlyProducer: false, linkyPhase: linkyPhaseDef.single, linkyMode: linkyModeDef.standard, exposes: exposes.numeric('EASD01', ea.STATE).withUnit('kWh').withProperty('active_enerfy_out_d01').withDescription('Active energy withdrawn Distributor (index 01)')},
348
+ {cluster: clustersDef._0xFF66, att: 'activeEnerfyOutD02', reportable: false, report: {change: 100}, onlyProducer: false, linkyPhase: linkyPhaseDef.single, linkyMode: linkyModeDef.standard, exposes: exposes.numeric('EASD02', ea.STATE).withUnit('kWh').withProperty('active_enerfy_out_d02').withDescription('Active energy withdrawn Distributor (index 02)')},
349
+ {cluster: clustersDef._0xFF66, att: 'activeEnerfyOutD03', reportable: false, report: {change: 100}, onlyProducer: false, linkyPhase: linkyPhaseDef.single, linkyMode: linkyModeDef.standard, exposes: exposes.numeric('EASD03', ea.STATE).withUnit('kWh').withProperty('active_enerfy_out_d03').withDescription('Active energy withdrawn Distributor (index 03)')},
350
+ {cluster: clustersDef._0xFF66, att: 'activeEnerfyOutD04', reportable: false, report: {change: 100}, onlyProducer: false, linkyPhase: linkyPhaseDef.single, linkyMode: linkyModeDef.standard, exposes: exposes.numeric('EASD04', ea.STATE).withUnit('kWh').withProperty('active_enerfy_out_d04').withDescription('Active energy withdrawn Distributor (index 04)')},
351
+ {cluster: clustersDef._0x0702, att: 'currentSummReceived', reportable: true, report: {change: 100}, onlyProducer: true, linkyPhase: linkyPhaseDef.single, linkyMode: linkyModeDef.standard, exposes: exposes.numeric('EAIT', ea.STATE).withUnit('kWh').withProperty('current_summ_received').withDescription('Total active power injected')},
352
352
  {cluster: clustersDef._0x0B04, att: 'totalReactivePower', reportable: true, onlyProducer: true, linkyPhase: linkyPhaseDef.single, linkyMode: linkyModeDef.standard, exposes: exposes.numeric('ERQ1', ea.STATE).withUnit('VArh').withProperty('total_reactive_power').withDescription('Total reactive power (Q1)')},
353
353
  {cluster: clustersDef._0x0B04, att: 'reactivePower', reportable: true, onlyProducer: true, linkyPhase: linkyPhaseDef.single, linkyMode: linkyModeDef.standard, exposes: exposes.numeric('ERQ2', ea.STATE).withUnit('VArh').withProperty('reactive_power').withDescription('Total reactive power (Q2)')},
354
354
  {cluster: clustersDef._0x0B04, att: 'reactivePowerPhB', reportable: true, onlyProducer: true, linkyPhase: linkyPhaseDef.single, linkyMode: linkyModeDef.standard, exposes: exposes.numeric('ERQ3', ea.STATE).withUnit('VArh').withProperty('reactive_power_ph_b').withDescription('Total reactive power (Q3)')},
@@ -491,7 +491,12 @@ const definition = {
491
491
  // docs generation
492
492
  let exposes;
493
493
  if (device == null && options == null) {
494
- exposes = exposedData.map((e) => e.exposes);
494
+ exposes = exposedData.map((e) => e.exposes)
495
+ .filter((value, index, self) =>
496
+ index === self.findIndex((t) => (
497
+ t.property === value.property // Remove duplicates
498
+ )),
499
+ );
495
500
  } else {
496
501
  exposes = getCurrentConfig(device, options).map((e) => e.exposes);
497
502
  }
@@ -533,13 +538,19 @@ const definition = {
533
538
  });
534
539
 
535
540
  for (const e of suscribeNew) {
536
- let change = 1;
537
- if (e.hasOwnProperty('reportChange')) {
538
- change = e['reportChange'];
541
+ let params = {
542
+ att: e.att,
543
+ min: 0,
544
+ max: repInterval.MINUTES_15,
545
+ change: 1,
546
+ };
547
+ // Override reportings
548
+ if (e.hasOwnProperty('report')) {
549
+ params = {...params, ...e.report};
539
550
  }
540
551
  configReportings.push(endpoint
541
552
  .configureReporting(
542
- e.cluster, reporting.payload(e.att, 0, repInterval.MINUTES_15, change)),
553
+ e.cluster, reporting.payload(params.att, params.min, params.max, params.change)),
543
554
  );
544
555
  }
545
556
  (await Promise.allSettled(configReportings))
@@ -90,7 +90,7 @@ module.exports = [
90
90
  },
91
91
  {
92
92
  zigbeeModel: ['500.45'],
93
- model: '798.15',
93
+ model: '500.45',
94
94
  vendor: 'Paulmann',
95
95
  description: 'SmartHome Zigbee Pendulum Light Aptare',
96
96
  extend: extend.light_onoff_brightness(),
@@ -45,6 +45,15 @@ module.exports = [
45
45
  extend: hueExtend.light_onoff_brightness_colortemp_color({colorTempRange: [153, 500]}),
46
46
  ota: ota.zigbeeOTA,
47
47
  },
48
+ {
49
+ zigbeeModel: ['929003047401'],
50
+ model: '929003047401',
51
+ vendor: 'Philips',
52
+ description: 'Hue White and Color Ambiance GU10 (Centura)',
53
+ meta: {turnsOffAtBrightness1: true},
54
+ extend: hueExtend.light_onoff_brightness_colortemp_color({colorTempRange: [153, 500]}),
55
+ ota: ota.zigbeeOTA,
56
+ },
48
57
  {
49
58
  zigbeeModel: ['929003056901'],
50
59
  model: '929003056901',
@@ -652,7 +661,7 @@ module.exports = [
652
661
  ota: ota.zigbeeOTA,
653
662
  },
654
663
  {
655
- zigbeeModel: ['LWW003'],
664
+ zigbeeModel: ['LWW003', 'LWF003'],
656
665
  model: '9290018216',
657
666
  vendor: 'Philips',
658
667
  description: 'Hue white A60 bulb E27 bluetooth',
@@ -1468,6 +1477,15 @@ module.exports = [
1468
1477
  extend: hueExtend.light_onoff_brightness_colortemp({colorTempRange: [153, 500]}),
1469
1478
  ota: ota.zigbeeOTA,
1470
1479
  },
1480
+ {
1481
+ zigbeeModel: ['929003054801'],
1482
+ model: '929003054801',
1483
+ vendor: 'Philips',
1484
+ description: 'Hue white ambiance suspension Amaze with Bluetooth',
1485
+ meta: {turnsOffAtBrightness1: true},
1486
+ extend: hueExtend.light_onoff_brightness_colortemp({colorTempRange: [153, 454]}),
1487
+ ota: ota.zigbeeOTA,
1488
+ },
1471
1489
  {
1472
1490
  zigbeeModel: ['LWF001', 'LWF002', 'LWW001'],
1473
1491
  model: '9290011370B',
@@ -1,4 +1,7 @@
1
1
  const extend = require('../lib/extend');
2
+ const fz = require('../converters/fromZigbee');
3
+ const exposes = require('../lib/exposes');
4
+ const e = exposes.presets;
2
5
 
3
6
  module.exports = [
4
7
  {
@@ -29,4 +32,13 @@ module.exports = [
29
32
  description: 'GU10 white and colour spot',
30
33
  extend: extend.light_onoff_brightness_colortemp_color({colorTempRange: [153, 555]}),
31
34
  },
35
+ {
36
+ zigbeeModel: ['PROLIGHT REMOTE CONTROL'],
37
+ model: 'PROLIGHT_REMOTE_CONTROL',
38
+ vendor: 'Prolight',
39
+ description: 'Remote control',
40
+ toZigbee: [],
41
+ fromZigbee: [fz.command_on, fz.command_off, fz.command_move_to_level],
42
+ exposes: [e.action(['on', 'off', 'brightness_move_up', 'brightness_move_down'])],
43
+ },
32
44
  ];
@@ -379,6 +379,7 @@ module.exports = [
379
379
  endpoint: (device) => {
380
380
  return {'top': 21, 'bottom': 22};
381
381
  },
382
+ whiteLabel: [{vendor: 'Elko', model: 'EKO07117'}],
382
383
  meta: {multiEndpoint: true},
383
384
  exposes: [e.action(['on_top', 'off_top', 'on_bottom', 'off_bottom', 'brightness_move_up_top', 'brightness_stop_top',
384
385
  'brightness_move_down_top', 'brightness_stop_top', 'brightness_move_up_bottom', 'brightness_stop_bottom',
@@ -10,11 +10,12 @@ module.exports = [
10
10
  vendor: 'Titan Products',
11
11
  description: 'Room CO2, humidity & temperature sensor',
12
12
  fromZigbee: [fz.battery, fz.humidity, fz.temperature, fz.co2],
13
- exposes: [e.battery(), e.humidity(), e.temperature(), e.co2()],
13
+ exposes: [e.battery_voltage(), e.battery_low(), e.humidity(), e.temperature(), e.co2()],
14
14
  toZigbee: [],
15
15
  configure: async (device, coordinatorEndpoint, logger) => {
16
16
  const endpoint = device.getEndpoint(1);
17
17
  await reporting.bind(endpoint, coordinatorEndpoint, ['genPowerCfg', 'msTemperatureMeasurement', 'msCO2']);
18
+ await endpoint.read('genPowerCfg', ['batteryVoltage']);
18
19
  await reporting.bind(device.getEndpoint(2), coordinatorEndpoint, ['msRelativeHumidity']);
19
20
  },
20
21
  },
package/devices/tplink.js CHANGED
@@ -1,6 +1,6 @@
1
- const exposes = require('zigbee-herdsman-converters/lib/exposes');
2
- const fz = {...require('zigbee-herdsman-converters/converters/fromZigbee'), legacy: require('../lib/legacy').fromZigbee};
3
- const reporting = require('zigbee-herdsman-converters/lib/reporting');
1
+ const exposes = require('../lib/exposes');
2
+ const fz = {...require('../converters/fromZigbee'), legacy: require('../lib/legacy').fromZigbee};
3
+ const reporting = require('../lib/reporting');
4
4
  const e = exposes.presets;
5
5
 
6
6
  module.exports = [
package/devices/tuya.js CHANGED
@@ -175,7 +175,8 @@ module.exports = [
175
175
  {modelID: 'TS0505B', manufacturerName: '_TZ3000_cmaky9gq'},
176
176
  {modelID: 'TS0505B', manufacturerName: '_TZ3000_tza2vjxx'},
177
177
  {modelID: 'TS0505B', manufacturerName: '_TZ3210_k1pe6ibm'},
178
- {modelID: 'TS0505B', manufacturerName: '_TZ3210_bfwvfyx1'}],
178
+ {modelID: 'TS0505B', manufacturerName: '_TZ3210_bfwvfyx1'},
179
+ {modelID: 'TS0505B', manufacturerName: '_TZ3210_jd3z4yig'}],
179
180
  model: 'TS0505B',
180
181
  vendor: 'TuYa',
181
182
  description: 'Zigbee RGB+CCT light',
@@ -204,6 +205,7 @@ module.exports = [
204
205
  fingerprint: [{modelID: 'TS0504B', manufacturerName: '_TZ3000_ukuvyhaa'},
205
206
  {modelID: 'TS0504B', manufacturerName: '_TZ3210_bfvybixd'},
206
207
  {modelID: 'TS0504B', manufacturerName: '_TZ3210_sroezl0s'},
208
+ {modelID: 'TS0504B', manufacturerName: '_TZ3210_i2i0bsnv'},
207
209
  {modelID: 'TS0504B', manufacturerName: '_TZ3210_1elppmba'}],
208
210
  model: 'TS0504B',
209
211
  vendor: 'TuYa',
@@ -369,7 +371,8 @@ module.exports = [
369
371
  {vendor: 'BSEED', model: 'Zigbee Socket'}],
370
372
  },
371
373
  {
372
- fingerprint: [{modelID: 'isltm67\u0000', manufacturerName: '_TYST11_pisltm67'}],
374
+ fingerprint: [{modelID: 'isltm67\u0000', manufacturerName: '_TYST11_pisltm67'},
375
+ {modelID: 'TS0601', manufacturerName: '_TZE200_pisltm67'}],
373
376
  model: 'S-LUX-ZB',
374
377
  vendor: 'TuYa',
375
378
  description: 'Light sensor',
@@ -379,7 +382,13 @@ module.exports = [
379
382
  const endpoint = device.getEndpoint(1);
380
383
  await reporting.bind(endpoint, coordinatorEndpoint, ['genBasic']);
381
384
  },
382
- exposes: [e.battery(), e.illuminance_lux(), e.battery_low()],
385
+ exposes: (device, options) => {
386
+ if (device && device.manufacturerName === '_TZE200_pisltm67') {
387
+ return [e.illuminance_lux(), e.linkquality()];
388
+ } else {
389
+ return [e.battery(), e.illuminance_lux(), e.battery_low(), e.linkquality()];
390
+ }
391
+ },
383
392
  },
384
393
  {
385
394
  zigbeeModel: ['TS130F'],
@@ -1297,7 +1306,7 @@ module.exports = [
1297
1306
  description: 'PIR sensor',
1298
1307
  fromZigbee: [fz.battery, fz.ignore_basic_report, fz.ias_occupancy_alarm_1],
1299
1308
  toZigbee: [],
1300
- whiteLabel: [{vendor: 'Samotech', model: 'SM301Z'}],
1309
+ whiteLabel: [{vendor: 'Samotech', model: 'SM301Z'}, {vendor: 'Nedis', model: 'ZBSM10WT'}],
1301
1310
  exposes: [e.battery(), e.occupancy(), e.battery_low(), e.tamper()],
1302
1311
  },
1303
1312
  {
package/devices/woox.js CHANGED
@@ -1,5 +1,5 @@
1
1
  const exposes = require('../lib/exposes');
2
- const reporting = require('zigbee-herdsman-converters/lib/reporting');
2
+ const reporting = require('../lib/reporting');
3
3
  const fz = {...require('../converters/fromZigbee'), legacy: require('../lib/legacy').fromZigbee};
4
4
  const tz = require('../converters/toZigbee');
5
5
  const tuya = require('../lib/tuya');
package/lib/exposes.js CHANGED
@@ -501,6 +501,7 @@ module.exports = {
501
501
  illuminance_below_threshold_check: () => new Binary(`illuminance_below_threshold_check`, access.SET, true, false).withDescription(`Set to false to also send messages when illuminance is above threshold in night mode (default true).`),
502
502
  },
503
503
  presets: {
504
+ ac_frequency: () => new Numeric('ac_frequency', access.STATE).withUnit('Hz').withDescription('Measured electrical AC frequency'),
504
505
  action: (values) => new Enum('action', access.STATE, values).withDescription('Triggered action (e.g. a button click)'),
505
506
  angle: (name) => new Numeric(name, access.STATE).withValueMin(-360).withValueMax(360),
506
507
  angle_axis: (name) => new Numeric(name, access.STATE).withValueMin(-90).withValueMax(90),
package/lib/reporting.js CHANGED
@@ -19,9 +19,10 @@ function payload(attribute, min, max, change, overrides) {
19
19
  }
20
20
 
21
21
  async function readEletricalMeasurementMultiplierDivisors(endpoint) {
22
- // Split into two chunks, some devices fail to respond when reading too much attributes at once.
22
+ // Split into three chunks, some devices fail to respond when reading too much attributes at once.
23
23
  await endpoint.read('haElectricalMeasurement', ['acVoltageMultiplier', 'acVoltageDivisor', 'acCurrentMultiplier']);
24
24
  await endpoint.read('haElectricalMeasurement', ['acCurrentDivisor', 'acPowerMultiplier', 'acPowerDivisor']);
25
+ await endpoint.read('haElectricalMeasurement', ['acFrequencyDivisor', 'acFrequencyMultiplier']);
25
26
  }
26
27
 
27
28
  async function readMeteringMultiplierDivisor(endpoint) {
@@ -199,4 +200,8 @@ module.exports = {
199
200
  const p = payload('measuredValue', 10, repInterval.HOUR, 100, overrides);
200
201
  await endpoint.configureReporting('msSoilMoisture', p);
201
202
  },
203
+ acFrequency: async (endpoint, overrides) => {
204
+ const p = payload('acFrequency', 5, repInterval.MINUTES_5, 10, overrides);
205
+ await endpoint.configureReporting('haElectricalMeasurement', p);
206
+ },
202
207
  };
package/lib/utils.js CHANGED
@@ -1,5 +1,7 @@
1
1
  'use strict';
2
2
 
3
+ const globalStore = require('./store');
4
+
3
5
  function isLegacyEnabled(options) {
4
6
  return !options.hasOwnProperty('legacy') || options.legacy;
5
7
  }
@@ -386,7 +388,23 @@ function extendDevice(deviceConfigs, modelName, adjustments) {
386
388
  return {...baseDevice, ...adjustments};
387
389
  }
388
390
 
391
+ function noOccupancySince(endpoint, newPayload, options, publish) {
392
+ if (options && options.no_occupancy_since && newPayload.occupancy) {
393
+ globalStore.getValue(endpoint, 'no_occupancy_since_timers', []).forEach((t) => clearTimeout(t));
394
+ globalStore.putValue(endpoint, 'no_occupancy_since_timers', []);
395
+
396
+ newPayload.no_occupancy_since = 0;
397
+ options.no_occupancy_since.forEach((since) => {
398
+ const timer = setTimeout(() => {
399
+ publish({no_occupancy_since: since});
400
+ }, since * 1000);
401
+ globalStore.getValue(endpoint, 'no_occupancy_since_timers').push(timer);
402
+ });
403
+ }
404
+ }
405
+
389
406
  module.exports = {
407
+ noOccupancySince,
390
408
  getOptions,
391
409
  isLegacyEnabled,
392
410
  precisionRound,
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "zigbee-herdsman-converters",
3
- "version": "14.0.414",
3
+ "version": "14.0.418",
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.414",
3
+ "version": "14.0.418",
4
4
  "description": "Collection of device converters to be used with zigbee-herdsman",
5
5
  "main": "index.js",
6
6
  "files": [