zigbee-herdsman-converters 14.0.642 → 14.0.643

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.
@@ -1760,8 +1760,7 @@ const converters = {
1760
1760
  result.hysterersis = precisionRound(data[0x100A], 2) / 10;
1761
1761
  }
1762
1762
  if (data.hasOwnProperty(0x100B)) { // DisplayAutoOffEnable
1763
- const lookup = {0: 'enabled', 1: 'disabled'};
1764
- result.display_auto_off_enabled = lookup[data[0x100B]];
1763
+ result.display_auto_off_enabled = data[0x100B] ? 'enabled' : 'disabled';
1765
1764
  }
1766
1765
  if (data.hasOwnProperty(0x2001)) { // AlarmAirTempOverValue
1767
1766
  result.alarm_airtemp_overvalue = data[0x2001];
@@ -3182,7 +3182,7 @@ const converters = {
3182
3182
  const payload = {0x100A: {value: value * 10, type: 0x20}};
3183
3183
  await entity.write('hvacThermostat', payload, manufacturerOptions.sunricher);
3184
3184
  } else if (key==='display_auto_off_enabled') {
3185
- const lookup = {'enabled': 0, 'disabled': 1};
3185
+ const lookup = {'disabled': 0, 'enabled': 1};
3186
3186
  const payload = {0x100B: {value: lookup[value], type: herdsman.Zcl.DataType.enum8}};
3187
3187
  await entity.write('hvacThermostat', payload, manufacturerOptions.sunricher);
3188
3188
  } else if (key==='alarm_airtemp_overvalue') {
package/devices/lixee.js CHANGED
@@ -48,7 +48,7 @@ const fzLocal = {
48
48
 
49
49
  for (const at of elements) {
50
50
  const at_snake = at.split(/(?=[A-Z])/).join('_').toLowerCase();
51
- if (msg.data[at]) {
51
+ if (msg.data[at] != null) {
52
52
  result[at_snake] = msg.data[at];
53
53
  }
54
54
  }
@@ -104,7 +104,7 @@ const fzLocal = {
104
104
  for (const at of elements) {
105
105
  const at_snake = at.split(/(?=[A-Z])/).join('_').toLowerCase();
106
106
  let val = msg.data[at];
107
- if (val) {
107
+ if (val != null) {
108
108
  if (val.hasOwnProperty('type') && val.type === 'Buffer') {
109
109
  val = Buffer.from(val.data);
110
110
  }
@@ -155,7 +155,7 @@ const fzLocal = {
155
155
  for (const at of elements) {
156
156
  const at_snake = at.split(/(?=[A-Z])/).join('_').toLowerCase();
157
157
  const val = msg.data[at];
158
- if (val) {
158
+ if (val != null) {
159
159
  result[at_snake] = val; // By default we assign raw value
160
160
  switch (at) {
161
161
  // If we receive a Buffer, transform to human readable text
package/devices/moes.js CHANGED
@@ -391,19 +391,6 @@ module.exports = [
391
391
  exposes.numeric('boost_heating_countdown_time_set', ea.STATE_SET).withUnit('second')
392
392
  .withDescription('Boost Time Setting 100 sec - 900 sec, (default = 300 sec)').withValueMin(100).withValueMax(900)],
393
393
  },
394
- {
395
- fingerprint: [{modelID: 'TS0601', manufacturerName: '_TZE200_la2c2uo9'}],
396
- model: 'MS-105Z',
397
- vendor: 'Moes',
398
- description: '1 gang 2 way Zigbee dimmer switch',
399
- fromZigbee: [fz.moes_105_dimmer, fz.ignore_basic_report],
400
- toZigbee: [tz.moes_105_dimmer],
401
- meta: {turnsOffAtBrightness1: true},
402
- configure: async (device, coordinatorEndpoint, logger) => {
403
- await reporting.bind(device.getEndpoint(1), coordinatorEndpoint, ['genOnOff', 'genLevelCtrl']);
404
- },
405
- exposes: [e.light_brightness().setAccess('state', ea.STATE_SET).setAccess('brightness', ea.STATE_SET)],
406
- },
407
394
  {
408
395
  fingerprint: [{modelID: 'TS0601', manufacturerName: '_TZE200_fjjbhx9d'}],
409
396
  model: 'ZS-EUD',
@@ -2841,4 +2841,11 @@ module.exports = [
2841
2841
  description: 'Hue white ambiance Fair ceiling with Bluetooth white',
2842
2842
  extend: hueExtend.light_onoff_brightness_colortemp({colorTempRange: [153, 454]}),
2843
2843
  },
2844
+ {
2845
+ zigbeeModel: ['929003048301'],
2846
+ model: '8719514339163',
2847
+ vendor: 'Philips',
2848
+ description: 'Hue white ambiance Buckram quadruple spotlight with Bluetooth',
2849
+ extend: hueExtend.light_onoff_brightness_colortemp({colorTempRange: [153, 454]}),
2850
+ },
2844
2851
  ];
@@ -2,6 +2,7 @@ const exposes = require('../lib/exposes');
2
2
  const fz = {...require('../converters/fromZigbee'), legacy: require('../lib/legacy').fromZigbee};
3
3
  const tz = require('../converters/toZigbee');
4
4
  const reporting = require('../lib/reporting');
5
+ const globalStore = require('../lib/store');
5
6
  const constants = require('../lib/constants');
6
7
  const extend = require('../lib/extend');
7
8
  const utils = require('../lib/utils');
@@ -40,6 +41,14 @@ const fzLocal = {
40
41
  },
41
42
  };
42
43
 
44
+ function syncTime(endpoint) {
45
+ try {
46
+ const time = Math.round(((new Date()).getTime() - constants.OneJanuary2000) / 1000 + ((new Date()).getTimezoneOffset() * -1) * 60);
47
+ const values = {time: time};
48
+ endpoint.write('genTime', values);
49
+ } catch (error) {/* Do nothing*/}
50
+ }
51
+
43
52
  module.exports = [
44
53
  {
45
54
  zigbeeModel: ['SR-ZG9023A-EU'],
@@ -351,13 +360,12 @@ module.exports = [
351
360
  model: 'SR-ZG9092A',
352
361
  vendor: 'Sunricher',
353
362
  description: 'Touch thermostat',
354
- fromZigbee: [fz.thermostat, fz.namron_thermostat, fz.metering, fz.electrical_measurement],
363
+ fromZigbee: [fz.thermostat, fz.namron_thermostat, fz.metering, fz.electrical_measurement, fz.namron_hvac_user_interface],
355
364
  toZigbee: [tz.thermostat_occupied_heating_setpoint, tz.thermostat_unoccupied_heating_setpoint, tz.thermostat_occupancy,
356
365
  tz.thermostat_local_temperature_calibration, tz.thermostat_local_temperature, tz.thermostat_outdoor_temperature,
357
366
  tz.thermostat_system_mode, tz.thermostat_control_sequence_of_operation, tz.thermostat_running_state,
358
- tz.namron_thermostat],
367
+ tz.namron_thermostat, tz.namron_thermostat_child_lock],
359
368
  exposes: [
360
- e.local_temperature(),
361
369
  exposes.numeric('outdoor_temperature', ea.STATE_GET).withUnit('°C')
362
370
  .withDescription('Current temperature measured from the floor sensor'),
363
371
  exposes.climate()
@@ -369,7 +377,11 @@ module.exports = [
369
377
  .withRunningState(['idle', 'heat']),
370
378
  exposes.binary('away_mode', ea.ALL, 'ON', 'OFF')
371
379
  .withDescription('Enable/disable away mode'),
380
+ exposes.binary('child_lock', ea.ALL, 'UNLOCK', 'LOCK')
381
+ .withDescription('Enables/disables physical input on the device'),
372
382
  e.power(), e.current(), e.voltage(), e.energy(),
383
+ exposes.enum('lcd_brightness', ea.ALL, ['low', 'mid', 'high'])
384
+ .withDescription('OLED brightness when operating the buttons. Default: Medium.'),
373
385
  exposes.enum('button_vibration_level', ea.ALL, ['off', 'low', 'high'])
374
386
  .withDescription('Key beep volume and vibration level. Default: Low.'),
375
387
  exposes.enum('floor_sensor_type', ea.ALL, ['10k', '15k', '50k', '100k', '12k'])
@@ -398,11 +410,24 @@ module.exports = [
398
410
  .withUnit('°C')
399
411
  .withValueMin(0.5).withValueMax(2).withValueStep(0.1)
400
412
  .withDescription('Hysteresis setting, between 0.5 and 2 in 0.1 °C. Default: 0.5.'),
413
+ exposes.enum('display_auto_off_enabled', ea.ALL, ['disabled', 'enabled']),
401
414
  exposes.numeric('alarm_airtemp_overvalue', ea.ALL)
402
415
  .withUnit('°C')
403
416
  .withValueMin(20).withValueMax(60)
404
417
  .withDescription('Room temperature alarm threshold, between 20 and 60 in °C. 0 means disabled. Default: 45.'),
405
418
  ],
419
+ onEvent: async (type, data, device, options) => {
420
+ if (type === 'stop') {
421
+ clearInterval(globalStore.getValue(device, 'time'));
422
+ globalStore.clearValue(device, 'time');
423
+ } else if (!globalStore.hasValue(device, 'time')) {
424
+ const endpoint = device.getEndpoint(1);
425
+ const hours24 = 1000 * 60 * 60 * 24;
426
+ // Device does not ask for the time with binding, therefore we write the time every 24 hours
427
+ const interval = setInterval(async () => syncTime(endpoint), hours24);
428
+ globalStore.putValue(device, 'time', interval);
429
+ }
430
+ },
406
431
  configure: async (device, coordinatorEndpoint, logger) => {
407
432
  const endpoint = device.getEndpoint(1);
408
433
  const binds = [
@@ -415,6 +440,7 @@ module.exports = [
415
440
  await reporting.thermostatTemperature(endpoint);
416
441
  await reporting.thermostatOccupiedHeatingSetpoint(endpoint);
417
442
  await reporting.thermostatUnoccupiedHeatingSetpoint(endpoint);
443
+ await reporting.thermostatKeypadLockMode(endpoint);
418
444
 
419
445
  await endpoint.configureReporting('hvacThermostat', [{
420
446
  attribute: 'ocupancy',
@@ -425,16 +451,24 @@ module.exports = [
425
451
 
426
452
  await endpoint.read('haElectricalMeasurement', ['acVoltageMultiplier', 'acVoltageDivisor', 'acCurrentMultiplier']);
427
453
  await endpoint.read('haElectricalMeasurement', ['acCurrentDivisor']);
454
+ await endpoint.read('seMetering', ['multiplier', 'divisor']);
428
455
 
429
- await reporting.activePower(endpoint);
430
- await reporting.rmsCurrent(endpoint, {min: 10, change: 10});
431
- await reporting.rmsVoltage(endpoint, {min: 10});
456
+ await reporting.activePower(endpoint, {min: 30, change: 10}); // Min report change 10W
457
+ await reporting.rmsCurrent(endpoint, {min: 30, change: 50}); // Min report change 0.05A
458
+ await reporting.rmsVoltage(endpoint, {min: 30, change: 20}); // Min report change 2V
459
+ await reporting.readMeteringMultiplierDivisor(endpoint);
432
460
  await reporting.currentSummDelivered(endpoint);
433
461
 
434
462
  // Custom attributes
435
463
  const options = {manufacturerCode: 0x1224}; // Sunricher Manufacturer Code
436
464
 
437
- // OperateDisplayLcdBrightnesss - removed as it has no effect
465
+ // OperateDisplayLcdBrightnesss
466
+ await endpoint.configureReporting('hvacThermostat', [{
467
+ attribute: {ID: 0x1000, type: 0x30},
468
+ minimumReportInterval: 0,
469
+ maximumReportInterval: constants.repInterval.HOUR,
470
+ reportableChange: null}],
471
+ options);
438
472
  // ButtonVibrationLevel
439
473
  await endpoint.configureReporting('hvacThermostat', [{
440
474
  attribute: {ID: 0x1001, type: 0x30},
@@ -507,6 +541,14 @@ module.exports = [
507
541
  reportableChange: 0}],
508
542
  options);
509
543
 
544
+ // DisplayAutoOffEnable
545
+ await endpoint.configureReporting('hvacThermostat', [{
546
+ attribute: {ID: 0x100B, type: 0x30},
547
+ minimumReportInterval: 0,
548
+ maximumReportInterval: constants.repInterval.HOUR,
549
+ reportableChange: null}],
550
+ options);
551
+
510
552
  // AlarmAirTempOverValue
511
553
  await endpoint.configureReporting('hvacThermostat', [{
512
554
  attribute: {ID: 0x2001, type: 0x20},
@@ -523,12 +565,13 @@ module.exports = [
523
565
  options);
524
566
 
525
567
  // Device does not asks for the time with binding, we need to write time during configure
568
+ syncTime(endpoint);
526
569
 
527
570
  // Trigger initial read
528
571
  await endpoint.read('hvacThermostat', ['systemMode', 'runningState', 'occupiedHeatingSetpoint']);
529
- await endpoint.read('hvacThermostat', [0x1001, 0x1002, 0x1003], options);
572
+ await endpoint.read('hvacThermostat', [0x1000, 0x1001, 0x1002, 0x1003], options);
530
573
  await endpoint.read('hvacThermostat', [0x1004, 0x1005, 0x1006, 0x1007], options);
531
- await endpoint.read('hvacThermostat', [0x1008, 0x1009, 0x100A], options);
574
+ await endpoint.read('hvacThermostat', [0x1008, 0x1009, 0x100A, 0x100B], options);
532
575
  await endpoint.read('hvacThermostat', [0x2001, 0x2002], options);
533
576
  },
534
577
  },
package/devices/tuya.js CHANGED
@@ -793,6 +793,7 @@ module.exports = [
793
793
  fingerprint: [{modelID: 'TS0001', manufacturerName: '_TZ3000_hktqahrq'}, {manufacturerName: '_TZ3000_hktqahrq'},
794
794
  {manufacturerName: '_TZ3000_q6a3tepg'}, {modelID: 'TS000F', manufacturerName: '_TZ3000_m9af2l6g'},
795
795
  {modelID: 'TS000F', manufacturerName: '_TZ3000_mx3vgyea'},
796
+ {modelID: 'TS000F', manufacturerName: '_TZ3000_xkap8wtb'},
796
797
  {modelID: 'TS0001', manufacturerName: '_TZ3000_npzfdcof'},
797
798
  {modelID: 'TS0001', manufacturerName: '_TZ3000_5ng23zjs'},
798
799
  {modelID: 'TS0001', manufacturerName: '_TZ3000_rmjr4ufz'},
@@ -1168,7 +1169,7 @@ module.exports = [
1168
1169
  ],
1169
1170
  },
1170
1171
  {
1171
- fingerprint: tuya.fingerprint('TS0601', ['_TZE200_ip2akl4w', '_TZE200_1agwnems']),
1172
+ fingerprint: tuya.fingerprint('TS0601', ['_TZE200_ip2akl4w', '_TZE200_1agwnems', '_TZE200_la2c2uo9', '_TZE200_579lguh2']),
1172
1173
  model: 'TS0601_dimmer_1',
1173
1174
  vendor: 'TuYa',
1174
1175
  description: 'Zigbee smart dimmer',
@@ -1188,6 +1189,10 @@ module.exports = [
1188
1189
  [14, 'power_on_behavior', tuya.valueConverter.powerOnBehavior],
1189
1190
  ],
1190
1191
  },
1192
+ whiteLabel: [
1193
+ {vendor: 'Moes', model: 'MS-105Z'},
1194
+ {vendor: 'Lerlink', model: 'X706U'},
1195
+ ],
1191
1196
  },
1192
1197
  {
1193
1198
  fingerprint: [{modelID: 'TS011F', manufacturerName: '_TZ3000_oiymh3qu'}],
@@ -2315,19 +2320,20 @@ module.exports = [
2315
2320
  fromZigbee: [tuya.fzDataPoints],
2316
2321
  toZigbee: [tuya.tzDataPoints],
2317
2322
  configure: tuya.configureMagicPacket,
2318
- exposes: [tuya.exposes.switch(), e.ac_frequency(), e.energy(), e.power(), e.power_factor(), e.voltage(), e.current()],
2323
+ exposes: [tuya.exposes.switch(), e.ac_frequency(), e.energy(), e.power(), e.power_factor(), e.voltage(), e.current(),
2324
+ e.produced_energy()],
2319
2325
  meta: {
2320
2326
  tuyaDatapoints: [
2321
2327
  [1, 'energy', tuya.valueConverter.divideBy100],
2322
2328
  [6, null, tuya.valueConverter.phaseA], // voltage and current
2323
2329
  [16, 'state', tuya.valueConverter.onOff],
2330
+ [102, 'produced_energy', tuya.valueConverter.divideBy100],
2324
2331
  [103, 'power', tuya.valueConverter.raw],
2325
2332
  [105, 'ac_frequency', tuya.valueConverter.divideBy100],
2326
2333
  [111, 'power_factor', tuya.valueConverter.divideBy10],
2327
2334
  // Ignored for now; we don't know what the values mean
2328
2335
  [109, null, null], // reactive_power in VArh, ignored for now
2329
2336
  [101, null, null], // total active power (translated from chinese) - same as energy dp 1??
2330
- [102, null, null], // Reverse active power (translated from chinese), produced power? (e.g. if solar panels are connected)
2331
2337
  [9, null, null], // Fault - we don't know the possible values here
2332
2338
  [110, null, null], // total reactive power (translated from chinese) - value is 0.03kvar, we already have kvarh on dp 109
2333
2339
  [17, null, null], // Alarm set1 - value seems garbage "AAAAAAAAAAAAAABkAAEOAACqAAAAAAAKAAAAAAAA"
@@ -3221,6 +3227,7 @@ module.exports = [
3221
3227
  fingerprint: [{modelID: 'TS0601', manufacturerName: '_TZE200_ikvncluo'},
3222
3228
  {modelID: 'TS0601', manufacturerName: '_TZE200_lyetpprm'},
3223
3229
  {modelID: 'TS0601', manufacturerName: '_TZE200_jva8ink8'},
3230
+ {modelID: 'TS0601', manufacturerName: '_TZE200_holel4dk'},
3224
3231
  {modelID: 'TS0601', manufacturerName: '_TZE200_wukb7rhc'},
3225
3232
  {modelID: 'TS0601', manufacturerName: '_TZE200_ztc6ggyl'}],
3226
3233
  model: 'TS0601_smart_human_presense_sensor',
package/lib/exposes.js CHANGED
@@ -549,6 +549,7 @@ module.exports = {
549
549
  eco_temperature: () => new Numeric('eco_temperature', access.STATE_SET).withUnit('°C').withDescription('Eco temperature').withValueMin(0).withValueMax(35),
550
550
  effect: () => new Enum('effect', access.SET, ['blink', 'breathe', 'okay', 'channel_change', 'finish_effect', 'stop_effect']).withDescription('Triggers an effect on the light (e.g. make light blink for a few seconds)'),
551
551
  energy: () => new Numeric('energy', access.STATE).withUnit('kWh').withDescription('Sum of consumed energy'),
552
+ produced_energy: () => new Numeric('produced_energy', access.STATE).withUnit('kWh').withDescription('Sum of produced energy'),
552
553
  fan: () => new Fan(),
553
554
  flip_indicator_light: () => new Binary('flip_indicator_light', access.ALL, 'ON', 'OFF').withDescription('After turn on, the indicator light turns on while switch is off, and vice versa'),
554
555
  force: () => new Enum('force', access.STATE_SET, ['normal', 'open', 'close']).withDescription('Force the valve position'),
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "zigbee-herdsman-converters",
3
- "version": "14.0.642",
3
+ "version": "14.0.643",
4
4
  "description": "Collection of device converters to be used with zigbee-herdsman",
5
5
  "main": "index.js",
6
6
  "files": [
@@ -1,19 +0,0 @@
1
- const exposes = require('../lib/exposes');
2
- const fz = {...require('../converters/fromZigbee'), legacy: require('../lib/legacy').fromZigbee};
3
- const tz = require('../converters/toZigbee');
4
- const e = exposes.presets;
5
- const ea = exposes.access;
6
-
7
- module.exports = [
8
- {
9
- fingerprint: [
10
- {modelID: 'TS0601', manufacturerName: '_TZE200_579lguh2'},
11
- ],
12
- model: 'X706U',
13
- vendor: 'Lerlink',
14
- description: 'Zigbee dimmer switch',
15
- fromZigbee: [fz.moes_105_dimmer, fz.ignore_basic_report],
16
- toZigbee: [tz.moes_105_dimmer],
17
- exposes: [e.light_brightness().setAccess('state', ea.STATE_SET).setAccess('brightness', ea.STATE_SET)],
18
- },
19
- ];