zigbee-herdsman-converters 14.0.642 → 14.0.644

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') {
@@ -59,6 +59,13 @@ module.exports = [
59
59
  description: 'ERIA E14 Candle Color',
60
60
  extend: extend.light_onoff_brightness_colortemp_color({colorTempRange: [153, 500]}),
61
61
  },
62
+ {
63
+ zigbeeModel: ['AD-DimmableLight3001'],
64
+ model: '81810',
65
+ vendor: 'AduroSmart',
66
+ description: 'Zigbee Aduro Eria B22 bulb - warm white',
67
+ extend: extend.light_onoff_brightness(),
68
+ },
62
69
  {
63
70
  zigbeeModel: ['Adurolight_NCC'],
64
71
  model: '81825',
package/devices/awox.js CHANGED
@@ -159,6 +159,7 @@ module.exports = [
159
159
  whiteLabel: [{vendor: 'EGLO', model: '12239'}],
160
160
  },
161
161
  {
162
+ zigbeeModel: ['EGLO_ZM_TW'],
162
163
  fingerprint: [
163
164
  {
164
165
  type: 'Router', manufacturerName: 'AwoX', modelID: 'TLSR82xx', endpoints: [
@@ -91,14 +91,14 @@ const develco = {
91
91
  type: ['attributeReport', 'readResponse'],
92
92
  convert: (model, msg, publish, options, meta) => {
93
93
  const result = {};
94
- if (0x8000 in msg.data) {
95
- const firmware = msg.data[0x8000].join('.');
94
+ if (msg.data.hasOwnProperty('develcoPrimarySwVersion')) {
95
+ const firmware = msg.data.develcoPrimarySwVersion.join('.');
96
96
  result.current_firmware = firmware;
97
97
  meta.device.softwareBuildID = firmware;
98
98
  }
99
99
 
100
- if (0x8020 in msg.data) {
101
- meta.device.hardwareVersion = msg.data[0x8020].join('.');
100
+ if (msg.data.hasOwnProperty('develcoPrimaryHwVersion')) {
101
+ meta.device.hardwareVersion = msg.data.develcoPrimaryHwVersion.join('.');
102
102
  }
103
103
 
104
104
  return result;
@@ -218,7 +218,7 @@ const develco = {
218
218
  key: ['interface_mode'],
219
219
  convertSet: async (entity, key, value, meta) => {
220
220
  const payload = {'develcoInterfaceMode': utils.getKey(constants.develcoInterfaceMode, value, undefined, Number)};
221
- await entity.write('seMetering', payload, manufacturerOptions.develco);
221
+ await entity.write('seMetering', payload, manufacturerOptions);
222
222
  return {readAfterWriteTime: 200, state: {'interface_mode': value}};
223
223
  },
224
224
  convertGet: async (entity, key, meta) => {
@@ -379,7 +379,7 @@ module.exports = [
379
379
  ota: ota.zigbeeOTA,
380
380
  configure: async (device, coordinatorEndpoint, logger) => {
381
381
  const endpoint = device.getEndpoint(2);
382
- await endpoint.read('genBasic', [0x8000, 0x8010, 0x8020], manufacturerOptions);
382
+ await endpoint.read('genBasic', ['develcoPrimarySwVersion', 'develcoPrimaryHwVersion'], manufacturerOptions);
383
383
  await reporting.bind(endpoint, coordinatorEndpoint, ['haElectricalMeasurement', 'seMetering']);
384
384
 
385
385
  try {
@@ -424,7 +424,7 @@ module.exports = [
424
424
 
425
425
  await reporting.bind(endpoint, coordinatorEndpoint, ['genPowerCfg', 'ssIasZone', 'ssIasWd', 'genBasic', 'genBinaryInput']);
426
426
  await reporting.batteryVoltage(endpoint);
427
- await endpoint.read('genBasic', [0x8000, 0x8010, 0x8020], manufacturerOptions);
427
+ await endpoint.read('genBasic', ['develcoPrimarySwVersion', 'develcoPrimaryHwVersion'], manufacturerOptions);
428
428
  await endpoint.read('ssIasZone', ['iasCieAddr', 'zoneState', 'zoneId']);
429
429
  await endpoint.read('genBinaryInput', ['reliability', 'statusFlags']);
430
430
  await endpoint.read('ssIasWd', ['maxDuration']);
@@ -457,7 +457,7 @@ module.exports = [
457
457
 
458
458
  await reporting.bind(endpoint, coordinatorEndpoint, ['genPowerCfg', 'ssIasZone', 'ssIasWd', 'genBasic', 'genBinaryInput']);
459
459
  await reporting.batteryVoltage(endpoint);
460
- await endpoint.read('genBasic', [0x8000], manufacturerOptions);
460
+ await endpoint.read('genBasic', ['develcoPrimarySwVersion'], manufacturerOptions);
461
461
  await endpoint.read('ssIasZone', ['iasCieAddr', 'zoneState', 'zoneId']);
462
462
  await endpoint.read('genBinaryInput', ['reliability', 'statusFlags']);
463
463
  await endpoint.read('ssIasWd', ['maxDuration']);
@@ -519,7 +519,7 @@ module.exports = [
519
519
  description: 'Motion sensor',
520
520
  fromZigbee: [
521
521
  fz.temperature, fz.illuminance, fz.ias_occupancy_alarm_1, fz.battery,
522
- develco.fz.led_control, develco.fz.ias_occupancy_timeout,
522
+ develco.fz.led_control, develco.fz.ias_occupancy_timeout, develco.fz.firmware_version,
523
523
  ],
524
524
  toZigbee: [develco.tz.led_control, develco.tz.ias_occupancy_timeout],
525
525
  exposes: [
@@ -538,6 +538,7 @@ module.exports = [
538
538
  await reporting.bind(endpoint35, coordinatorEndpoint, ['genPowerCfg']);
539
539
  await reporting.batteryVoltage(endpoint35, {min: constants.repInterval.HOUR, max: 43200, change: 100});
540
540
  try {
541
+ await endpoint35.read('genBasic', ['develcoPrimarySwVersion', 'develcoPrimaryHwVersion'], manufacturerOptions);
541
542
  await endpoint35.read('ssIasZone', ['develcoAlarmOffDelay'], manufacturerOptions);
542
543
  await endpoint35.read('genBasic', ['develcoLedControl'], manufacturerOptions);
543
544
  } catch (error) {/* some reports of timeouts on reading these */}
@@ -682,7 +683,7 @@ module.exports = [
682
683
  const endpoint = device.getEndpoint(43);
683
684
  await reporting.bind(endpoint, coordinatorEndpoint, ['genPowerCfg', 'ssIasZone', 'ssIasWd', 'genBasic']);
684
685
  await reporting.batteryVoltage(endpoint);
685
- await endpoint.read('genBasic', [0x8000], manufacturerOptions);
686
+ await endpoint.read('genBasic', ['develcoPrimarySwVersion', 'develcoPrimaryHwVersion'], manufacturerOptions);
686
687
  await endpoint.read('ssIasZone', ['iasCieAddr', 'zoneState', 'zoneId']);
687
688
  await endpoint.read('ssIasWd', ['maxDuration']);
688
689
 
@@ -758,7 +759,7 @@ module.exports = [
758
759
  const ep2 = device.getEndpoint(112);
759
760
  await reporting.bind(ep2, coordinatorEndpoint, ['genBinaryInput', 'genBasic']);
760
761
  await reporting.presentValue(ep2, {min: 0});
761
- await ep2.read('genBasic', [0x8000, 0x8010, 0x8020], options);
762
+ await ep2.read('genBasic', ['develcoPrimarySwVersion', 'develcoPrimaryHwVersion'], options);
762
763
 
763
764
  const ep3 = device.getEndpoint(113);
764
765
  await reporting.bind(ep3, coordinatorEndpoint, ['genBinaryInput']);
package/devices/fantem.js CHANGED
@@ -9,10 +9,11 @@ const tuya = require('../lib/tuya');
9
9
 
10
10
  module.exports = [
11
11
  {
12
- fingerprint: [{modelID: 'TS110F', manufacturerName: '_TZ3210_lfbz816s'}],
12
+ fingerprint: [{modelID: 'TS110F', manufacturerName: '_TZ3210_lfbz816s'},
13
+ {modelID: 'TS110F', manufacturerName: '_TZ3210_ebbfkvoy'}],
13
14
  model: 'ZB006-X',
14
15
  vendor: 'Fantem',
15
- description: 'Smart dimmer module without neutral',
16
+ description: 'Smart dimmer module',
16
17
  extend: extend.light_onoff_brightness({noConfigure: true}),
17
18
  fromZigbee: [...extend.light_onoff_brightness({noConfigure: true}).fromZigbee,
18
19
  fz.command_on, fz.command_off, fz.command_move, fz.command_stop, fz.ZB006X_settings],
package/devices/heiman.js CHANGED
@@ -11,7 +11,7 @@ const tuya = require('../lib/tuya');
11
11
  module.exports = [
12
12
  {
13
13
  fingerprint: [{modelID: 'TS0212', manufacturerName: '_TYZB01_wpmo3ja3'}],
14
- zigbeeModel: ['CO_V15', 'CO_YDLV10', 'CO_V16', '1ccaa94c49a84abaa9e38687913947ba'],
14
+ zigbeeModel: ['CO_V15', 'CO_YDLV10', 'CO_V16', '1ccaa94c49a84abaa9e38687913947ba', 'CO_CTPG'],
15
15
  model: 'HS1CA-M',
16
16
  description: 'Smart carbon monoxide sensor',
17
17
  vendor: 'HEIMAN',
@@ -104,7 +104,7 @@ module.exports = [
104
104
  model: 'HS3CG',
105
105
  vendor: 'HEIMAN',
106
106
  description: 'Combustible gas sensor',
107
- fromZigbee: [fz.ias_gas_alarm_1],
107
+ fromZigbee: [fz.ias_gas_alarm_2],
108
108
  toZigbee: [],
109
109
  exposes: [e.gas(), e.battery_low(), e.tamper()],
110
110
  },
package/devices/lidl.js CHANGED
@@ -716,7 +716,8 @@ module.exports = [
716
716
  },
717
717
  },
718
718
  {
719
- fingerprint: [{modelID: 'TS0502A', manufacturerName: '_TZ3000_rylaozuc'}],
719
+ fingerprint: [{modelID: 'TS0502A', manufacturerName: '_TZ3000_rylaozuc'},
720
+ {modelID: 'TS0502A', manufacturerName: '_TZ3000_5fkufhn1'}],
720
721
  model: '14147206L',
721
722
  vendor: 'Lidl',
722
723
  description: 'Livarno Lux ceiling light',
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
@@ -260,7 +260,7 @@ module.exports = [
260
260
  extend: extend.light_onoff_brightness(),
261
261
  },
262
262
  {
263
- fingerprint: [{modelID: 'TS110E', manufacturerName: '_TZ3210_wdexaypg'}],
263
+ fingerprint: [{modelID: 'TS110E', manufacturerName: '_TZ3210_wdexaypg'}, {modelID: 'TS110E', manufacturerName: '_TZ3210_3mpwqzuu'}],
264
264
  model: 'TS110E_2gang',
265
265
  vendor: 'Lonsonho',
266
266
  description: 'Zigbee smart dimmer module 2 gang with neutral',
@@ -81,7 +81,7 @@ module.exports = [
81
81
  },
82
82
  {
83
83
  fingerprint: [{modelID: 'TS011F', manufacturerName: '_TZ3210_pfbzs1an'}],
84
- model: 'SPUSB02',
84
+ model: 'SPPUSB02',
85
85
  vendor: 'Mercator',
86
86
  description: 'Ikuü double power point with USB',
87
87
  fromZigbee: [fz.on_off, fz.electrical_measurement, fz.metering, fz.ignore_basic_report, fz.tuya_switch_power_outage_memory],
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,25 @@ 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_01', '929003048301_02', '929003048301_03', '929003048301_04'],
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
+ },
2851
+ {
2852
+ zigbeeModel: ['929003048101_01', '929003048101_02', '929003048101_03'],
2853
+ model: '8719514339125',
2854
+ vendor: 'Philips',
2855
+ description: 'Hue white ambiance Buckram triple spotlight with Bluetooth',
2856
+ extend: hueExtend.light_onoff_brightness_colortemp({colorTempRange: [153, 454]}),
2857
+ },
2858
+ {
2859
+ zigbeeModel: ['929003047901_01', '929003047901_02'],
2860
+ model: '871951433908',
2861
+ vendor: 'Philips',
2862
+ description: 'Hue white ambiance Buckram double spotlight with Bluetooth',
2863
+ extend: hueExtend.light_onoff_brightness_colortemp({colorTempRange: [153, 454]}),
2864
+ },
2844
2865
  ];
@@ -120,4 +120,21 @@ module.exports = [
120
120
  },
121
121
  exposes: [e.occupancy(), e.battery_low(), e.tamper(), e.battery()],
122
122
  },
123
+ {
124
+ zigbeeModel: ['SZ-PIR04N', 'SZ-PIR04N_EU'],
125
+ model: 'SZ-PIR04N',
126
+ vendor: 'Sercomm',
127
+ description: 'PIR motion & temperature sensor',
128
+ fromZigbee: [fz.ias_occupancy_alarm_1, fz.illuminance, fz.temperature, fz.battery],
129
+ toZigbee: [],
130
+ meta: {battery: {voltageToPercent: '3V_2500_3200'}},
131
+ configure: async (device, coordinatorEndpoint, logger) => {
132
+ const endpoint = device.getEndpoint(1);
133
+ await reporting.bind(endpoint, coordinatorEndpoint, ['msIlluminanceMeasurement', 'msTemperatureMeasurement', 'genPowerCfg']);
134
+ await reporting.illuminance(endpoint);
135
+ await reporting.temperature(endpoint);
136
+ await reporting.batteryVoltage(endpoint);
137
+ },
138
+ exposes: [e.occupancy(), e.tamper(), e.illuminance(), e.temperature(), e.battery(), e.battery_voltage()],
139
+ },
123
140
  ];
@@ -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'}],
@@ -1327,7 +1332,10 @@ module.exports = [
1327
1332
  },
1328
1333
  },
1329
1334
  {
1330
- fingerprint: [{modelID: 'TS0601', manufacturerName: '_TZE200_nkjintbl'}],
1335
+ fingerprint: [
1336
+ {modelID: 'TS0601', manufacturerName: '_TZE200_nkjintbl'},
1337
+ {modelID: 'TS0601', manufacturerName: '_TZE200_ji1gn7rw'},
1338
+ ],
1331
1339
  model: 'TS0601_switch_2_gang',
1332
1340
  vendor: 'TuYa',
1333
1341
  description: '2 gang switch',
@@ -1516,9 +1524,7 @@ module.exports = [
1516
1524
  },
1517
1525
  },
1518
1526
  {
1519
- fingerprint: [
1520
- {modelID: 'TS0201', manufacturerName: '_TZ3000_dowj6gyi'},
1521
- ],
1527
+ fingerprint: tuya.fingerprint('TS0201', ['_TZ3000_dowj6gyi', '_TZ3000_8ybe88nf']),
1522
1528
  model: 'IH-K009',
1523
1529
  vendor: 'TuYa',
1524
1530
  description: 'Temperature & humidity sensor',
@@ -1817,14 +1823,16 @@ module.exports = [
1817
1823
  e.switch().withEndpoint('l1'),
1818
1824
  e.switch().withEndpoint('l2'),
1819
1825
  e.switch().withEndpoint('l3'),
1820
- exposes.presets.power_on_behavior(),
1821
- exposes.presets.switch_type_2(),
1826
+ e.power_on_behavior(),
1827
+ e.switch_type_2(),
1822
1828
  ],
1823
1829
  endpoint: (device) => {
1824
1830
  return {'l1': 1, 'l2': 2, 'l3': 3};
1825
1831
  },
1826
1832
  meta: {multiEndpoint: true},
1827
1833
  configure: async (device, coordinatorEndpoint, logger) => {
1834
+ await device.getEndpoint(1).read('genBasic',
1835
+ ['manufacturerName', 'zclVersion', 'appVersion', 'modelId', 'powerSource', 0xfffe]);
1828
1836
  await reporting.bind(device.getEndpoint(1), coordinatorEndpoint, ['genOnOff']);
1829
1837
  await reporting.bind(device.getEndpoint(2), coordinatorEndpoint, ['genOnOff']);
1830
1838
  await reporting.bind(device.getEndpoint(3), coordinatorEndpoint, ['genOnOff']);
@@ -1843,14 +1851,16 @@ module.exports = [
1843
1851
  e.switch().withEndpoint('l2'),
1844
1852
  e.switch().withEndpoint('l3'),
1845
1853
  e.switch().withEndpoint('l4'),
1846
- exposes.presets.power_on_behavior(),
1847
- exposes.presets.switch_type_2(),
1854
+ e.power_on_behavior(),
1855
+ e.switch_type_2(),
1848
1856
  ],
1849
1857
  endpoint: (device) => {
1850
1858
  return {'l1': 1, 'l2': 2, 'l3': 3, 'l4': 4};
1851
1859
  },
1852
1860
  meta: {multiEndpoint: true},
1853
1861
  configure: async (device, coordinatorEndpoint, logger) => {
1862
+ await device.getEndpoint(1).read('genBasic',
1863
+ ['manufacturerName', 'zclVersion', 'appVersion', 'modelId', 'powerSource', 0xfffe]);
1854
1864
  await reporting.bind(device.getEndpoint(1), coordinatorEndpoint, ['genOnOff']);
1855
1865
  await reporting.bind(device.getEndpoint(2), coordinatorEndpoint, ['genOnOff']);
1856
1866
  await reporting.bind(device.getEndpoint(3), coordinatorEndpoint, ['genOnOff']);
@@ -1950,6 +1960,7 @@ module.exports = [
1950
1960
  {vendor: 'SHOJZJ', model: '378RT'},
1951
1961
  {vendor: 'Silvercrest', model: 'TVR01'},
1952
1962
  {vendor: 'Immax', model: '07732B'},
1963
+ {vendor: 'Evolveo', model: 'Heat M30'},
1953
1964
  ],
1954
1965
  meta: {tuyaThermostatPreset: tuya.thermostatPresets, tuyaThermostatSystemMode: tuya.thermostatSystemModes3},
1955
1966
  ota: ota.zigbeeOTA,
@@ -2315,19 +2326,20 @@ module.exports = [
2315
2326
  fromZigbee: [tuya.fzDataPoints],
2316
2327
  toZigbee: [tuya.tzDataPoints],
2317
2328
  configure: tuya.configureMagicPacket,
2318
- exposes: [tuya.exposes.switch(), e.ac_frequency(), e.energy(), e.power(), e.power_factor(), e.voltage(), e.current()],
2329
+ exposes: [tuya.exposes.switch(), e.ac_frequency(), e.energy(), e.power(), e.power_factor(), e.voltage(), e.current(),
2330
+ e.produced_energy()],
2319
2331
  meta: {
2320
2332
  tuyaDatapoints: [
2321
2333
  [1, 'energy', tuya.valueConverter.divideBy100],
2322
2334
  [6, null, tuya.valueConverter.phaseA], // voltage and current
2323
2335
  [16, 'state', tuya.valueConverter.onOff],
2336
+ [102, 'produced_energy', tuya.valueConverter.divideBy100],
2324
2337
  [103, 'power', tuya.valueConverter.raw],
2325
2338
  [105, 'ac_frequency', tuya.valueConverter.divideBy100],
2326
2339
  [111, 'power_factor', tuya.valueConverter.divideBy10],
2327
2340
  // Ignored for now; we don't know what the values mean
2328
2341
  [109, null, null], // reactive_power in VArh, ignored for now
2329
2342
  [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
2343
  [9, null, null], // Fault - we don't know the possible values here
2332
2344
  [110, null, null], // total reactive power (translated from chinese) - value is 0.03kvar, we already have kvarh on dp 109
2333
2345
  [17, null, null], // Alarm set1 - value seems garbage "AAAAAAAAAAAAAABkAAEOAACqAAAAAAAKAAAAAAAA"
@@ -3221,6 +3233,7 @@ module.exports = [
3221
3233
  fingerprint: [{modelID: 'TS0601', manufacturerName: '_TZE200_ikvncluo'},
3222
3234
  {modelID: 'TS0601', manufacturerName: '_TZE200_lyetpprm'},
3223
3235
  {modelID: 'TS0601', manufacturerName: '_TZE200_jva8ink8'},
3236
+ {modelID: 'TS0601', manufacturerName: '_TZE200_holel4dk'},
3224
3237
  {modelID: 'TS0601', manufacturerName: '_TZE200_wukb7rhc'},
3225
3238
  {modelID: 'TS0601', manufacturerName: '_TZE200_ztc6ggyl'}],
3226
3239
  model: 'TS0601_smart_human_presense_sensor',
@@ -5,7 +5,14 @@ module.exports = [
5
5
  zigbeeModel: ['5991711'],
6
6
  model: 'C5850000',
7
7
  vendor: 'Villeroy & Boch',
8
- description: 'Subway 3.0 Zigbee home Aautomation kit ',
8
+ description: 'Subway 3.0 Zigbee home automation kit',
9
+ extend: extend.light_onoff_brightness_colortemp({colorTempRange: [160, 450]}),
10
+ },
11
+ {
12
+ zigbeeModel: ['EC1300'],
13
+ model: 'C0040000',
14
+ vendor: 'Villeroy & Boch',
15
+ description: 'Zigbee home automation kit for mirror',
9
16
  extend: extend.light_onoff_brightness_colortemp({colorTempRange: [160, 450]}),
10
17
  },
11
18
  ];
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.644",
4
4
  "description": "Collection of device converters to be used with zigbee-herdsman",
5
5
  "main": "index.js",
6
6
  "files": [
@@ -34,7 +34,7 @@
34
34
  },
35
35
  "homepage": "https://github.com/Koenkk/zigbee-herdsman-converters",
36
36
  "dependencies": {
37
- "axios": "^1.1.2",
37
+ "axios": "^1.1.3",
38
38
  "buffer-crc32": "^0.2.13",
39
39
  "https-proxy-agent": "^5.0.1",
40
40
  "tar-stream": "^2.2.0",
@@ -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
- ];