zigbee-herdsman-converters 14.0.563 → 14.0.566

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.
@@ -1943,13 +1943,18 @@ const converters = {
1943
1943
  const dp = dpValue.dp;
1944
1944
  const value = tuya.getDataValue(dpValue);
1945
1945
  switch (dp) {
1946
- case 1:
1946
+ case tuya.dataPoints.tthTemperature:
1947
1947
  return {temperature: calibrateAndPrecisionRoundOptions(value / 10, options, 'temperature')};
1948
- case 2:
1948
+ case tuya.dataPoints.tthHumidity:
1949
1949
  return {humidity: calibrateAndPrecisionRoundOptions(
1950
1950
  (value / (meta.device.manufacturerName === '_TZE200_bjawzodf' ? 10 : 1)),
1951
1951
  options, 'humidity')};
1952
- case 4:
1952
+ case tuya.dataPoints.tthBatteryLevel:
1953
+ return {
1954
+ battery_level: {0: 'low', 1: 'middle', 2: 'high'}[value],
1955
+ battery_low: value === 0 ? true : false,
1956
+ };
1957
+ case tuya.dataPoints.tthBattery:
1953
1958
  return {battery: value};
1954
1959
  default:
1955
1960
  meta.logger.warn(`zigbee-herdsman-converters:maa_tuya_temp_sensor: NOT RECOGNIZED ` +
@@ -7333,13 +7338,14 @@ const converters = {
7333
7338
  const dpValue = tuya.firstDpValue(msg, meta, 'SLUXZB');
7334
7339
  const dp = dpValue.dp;
7335
7340
  const value = tuya.getDataValue(dpValue);
7341
+ const brightnesStateLookup = {'0': 'LOW', '1': 'MEDIUM', '2': 'HIGH'};
7336
7342
  switch (dp) {
7337
7343
  case 2:
7338
7344
  return {illuminance_lux: value};
7339
7345
  case 4:
7340
7346
  return {battery: value};
7341
7347
  case 1:
7342
- return {battery_low: value === 1};
7348
+ return {brightness_level: brightnesStateLookup[value]};
7343
7349
  default:
7344
7350
  meta.logger.warn(`s_lux_zb_illuminance: NOT RECOGNIZED DP #${dp} with data ${JSON.stringify(dpValue)}`);
7345
7351
  }
@@ -2167,7 +2167,8 @@ const converters = {
2167
2167
  convertSet: async (entity, key, value, meta) => {
2168
2168
  if (['SP-EUC01', 'ZNCZ04LM', 'ZNCZ15LM', 'QBCZ14LM', 'QBCZ15LM', 'SSM-U01', 'SSM-U02', 'DLKZMK11LM', 'DLKZMK12LM',
2169
2169
  'WS-EUK01', 'WS-EUK02', 'WS-EUK03', 'WS-EUK04', 'QBKG19LM', 'QBKG20LM', 'QBKG25LM', 'QBKG26LM',
2170
- 'QBKG31LM', 'QBKG34LM', 'QBKG38LM', 'QBKG39LM', 'QBKG40LM', 'QBKG41LM', 'ZNDDMK11LM'].includes(meta.mapped.model)) {
2170
+ 'QBKG31LM', 'QBKG34LM', 'QBKG38LM', 'QBKG39LM', 'QBKG40LM', 'QBKG41LM', 'ZNDDMK11LM', 'ZNLDP13LM',
2171
+ ].includes(meta.mapped.model)) {
2171
2172
  await entity.write('aqaraOpple', {0x0201: {value: value ? 1 : 0, type: 0x10}}, manufacturerOptions.xiaomi);
2172
2173
  } else if (['ZNCZ02LM', 'QBCZ11LM', 'LLKZMK11LM'].includes(meta.mapped.model)) {
2173
2174
  const payload = value ?
@@ -2190,7 +2191,8 @@ const converters = {
2190
2191
  convertGet: async (entity, key, meta) => {
2191
2192
  if (['SP-EUC01', 'ZNCZ04LM', 'ZNCZ15LM', 'QBCZ14LM', 'QBCZ15LM', 'SSM-U01', 'SSM-U02', 'DLKZMK11LM', 'DLKZMK12LM',
2192
2193
  'WS-EUK01', 'WS-EUK02', 'WS-EUK03', 'WS-EUK04', 'QBKG19LM', 'QBKG20LM', 'QBKG25LM', 'QBKG26LM',
2193
- 'QBKG31LM', 'QBKG34LM', 'QBKG38LM', 'QBKG39LM', 'QBKG40LM', 'QBKG41LM', 'ZNDDMK11LM'].includes(meta.mapped.model)) {
2194
+ 'QBKG31LM', 'QBKG34LM', 'QBKG38LM', 'QBKG39LM', 'QBKG40LM', 'QBKG41LM', 'ZNDDMK11LM', 'ZNLDP13LM',
2195
+ ].includes(meta.mapped.model)) {
2194
2196
  await entity.read('aqaraOpple', [0x0201]);
2195
2197
  } else if (['ZNCZ02LM', 'QBCZ11LM', 'ZNCZ11LM'].includes(meta.mapped.model)) {
2196
2198
  await entity.read('aqaraOpple', [0xFFF0]);
@@ -3582,6 +3584,9 @@ const converters = {
3582
3584
  await entity.write('genOnOff', {moesStartUpOnOff: payload});
3583
3585
  return {state: {power_outage_memory: value}};
3584
3586
  },
3587
+ convertGet: async (entity, key, meta) => {
3588
+ await entity.read('genOnOff', ['moesStartUpOnOff']);
3589
+ },
3585
3590
  },
3586
3591
  moes_power_on_behavior: {
3587
3592
  key: ['power_on_behavior'],
package/devices/acova.js CHANGED
@@ -64,7 +64,8 @@ module.exports = [
64
64
  },
65
65
  },
66
66
  {
67
- zigbeeModel: ['TAFFETAS2 D1.00P1.02Z1.00'],
67
+ zigbeeModel: ['TAFFETAS2 D1.00P1.02Z1.00\u0000\u0000\u0000\u0000\u0000\u0000\u0000',
68
+ 'TAFFETAS2 D1.00P1.01Z1.00\u0000\u0000\u0000\u0000\u0000\u0000\u0000'],
68
69
  model: 'TAFFETAS2',
69
70
  vendor: 'Acova',
70
71
  description: 'Taffetas 2 heater',
package/devices/adeo.js CHANGED
@@ -22,6 +22,13 @@ module.exports = [
22
22
  }
23
23
  },
24
24
  },
25
+ {
26
+ zigbeeModel: ['ZBEK-8'],
27
+ model: 'IG-CDZFB2G009RA-MZN-02',
28
+ vendor: 'ADEO',
29
+ description: 'ENKI LEXMAN E27 LED white filament 1055 lumen',
30
+ extend: extend.light_onoff_brightness_colortemp({colorTempRange: [153, 454]}),
31
+ },
25
32
  {
26
33
  zigbeeModel: ['ZBEK-4'],
27
34
  model: 'IM-CDZDGAAA0005KA_MAN',
@@ -72,6 +72,26 @@ module.exports = [
72
72
  await reporting.activePower(endpoint, {change: 2}); // Power reports in 0.1W
73
73
  },
74
74
  },
75
+ {
76
+ zigbeeModel: ['4256050-RZHAC'],
77
+ model: '4256050-RZHAC',
78
+ vendor: 'Centralite',
79
+ description: '3-Series smart outlet appliance module',
80
+ fromZigbee: [fz.on_off, fz.electrical_measurement],
81
+ toZigbee: [tz.on_off],
82
+ exposes: [e.switch(), e.power(), e.voltage(), e.current()],
83
+ configure: async (device, coordinatorEndpoint, logger) => {
84
+ const endpoint = device.getEndpoint(1);
85
+ await reporting.bind(endpoint, coordinatorEndpoint, ['genOnOff', 'haElectricalMeasurement']);
86
+ await reporting.onOff(endpoint);
87
+ // 4256050-RZHAC doesn't support reading 'acVoltageMultiplier' or 'acVoltageDivisor'
88
+ await endpoint.read('haElectricalMeasurement', ['acCurrentMultiplier', 'acCurrentDivisor']);
89
+ await endpoint.read('haElectricalMeasurement', ['acPowerMultiplier', 'acPowerDivisor']);
90
+ await reporting.rmsVoltage(endpoint, {change: 2}); // Voltage reports in V
91
+ await reporting.rmsCurrent(endpoint, {change: 10}); // Current reports in mA
92
+ await reporting.activePower(endpoint, {change: 2}); // Power reports in 0.1W
93
+ },
94
+ },
75
95
  {
76
96
  zigbeeModel: ['4257050-ZHAC'],
77
97
  model: '4257050-ZHAC',
@@ -3,8 +3,11 @@ const fz = {...require('../converters/fromZigbee'), legacy: require('../lib/lega
3
3
  const tz = require('../converters/toZigbee');
4
4
  const reporting = require('../lib/reporting');
5
5
  const extend = require('../lib/extend');
6
+ const constants = require('../lib/constants');
6
7
  const e = exposes.presets;
7
8
  const ea = exposes.access;
9
+ const {calibrateAndPrecisionRoundOptions} = require('../lib/utils');
10
+
8
11
 
9
12
  const tzLocal = {
10
13
  node_config: {
@@ -21,6 +24,62 @@ const tzLocal = {
21
24
  };
22
25
  },
23
26
  },
27
+ local_time: {
28
+ key: ['local_time'],
29
+ convertSet: async (entity, key, value, meta) => {
30
+ const firstEndpoint = meta.device.getEndpoint(1);
31
+ const time = Math.round(((new Date()).getTime() - constants.OneJanuary2000) / 1000 + ((new Date())
32
+ .getTimezoneOffset() * -1) * 60);
33
+ await firstEndpoint.write('genTime', {time: time});
34
+ return {state: {local_time: time}};
35
+ },
36
+ },
37
+ co2_config: {
38
+ key: ['auto_brightness', 'forced_recalibration', 'factory_reset_co2', 'long_chart_period', 'set_altitude',
39
+ 'manual_forced_recalibration'],
40
+ convertSet: async (entity, key, rawValue, meta) => {
41
+ const lookup = {'OFF': 0x00, 'ON': 0x01};
42
+ const value = lookup.hasOwnProperty(rawValue) ? lookup[rawValue] : parseInt(rawValue, 10);
43
+ const payloads = {
44
+ auto_brightness: ['msCO2', {0x0203: {value, type: 0x10}}],
45
+ forced_recalibration: ['msCO2', {0x0202: {value, type: 0x10}}],
46
+ factory_reset_co2: ['msCO2', {0x0206: {value, type: 0x10}}],
47
+ long_chart_period: ['msCO2', {0x0204: {value, type: 0x10}}],
48
+ set_altitude: ['msCO2', {0x0205: {value, type: 0x21}}],
49
+ manual_forced_recalibration: ['msCO2', {0x0207: {value, type: 0x21}}],
50
+ };
51
+ await entity.write(payloads[key][0], payloads[key][1]);
52
+ return {
53
+ state: {[key]: rawValue},
54
+ };
55
+ },
56
+ },
57
+ temperature_config: {
58
+ key: ['temperature_offset'],
59
+ convertSet: async (entity, key, rawValue, meta) => {
60
+ const value = parseInt(rawValue, 10);
61
+ const payloads = {
62
+ temperature_offset: ['msTemperatureMeasurement', {0x0210: {value, type: 0x29}}],
63
+ };
64
+ await entity.write(payloads[key][0], payloads[key][1]);
65
+ return {
66
+ state: {[key]: rawValue},
67
+ };
68
+ },
69
+ },
70
+ humidity_config: {
71
+ key: ['humidity_offset'],
72
+ convertSet: async (entity, key, rawValue, meta) => {
73
+ const value = parseInt(rawValue, 10);
74
+ const payloads = {
75
+ humidity_offset: ['msRelativeHumidity', {0x0210: {value, type: 0x29}}],
76
+ };
77
+ await entity.write(payloads[key][0], payloads[key][1]);
78
+ return {
79
+ state: {[key]: rawValue},
80
+ };
81
+ },
82
+ },
24
83
  };
25
84
 
26
85
  const fzLocal = {
@@ -35,6 +94,64 @@ const fzLocal = {
35
94
  return result;
36
95
  },
37
96
  },
97
+ co2: {
98
+ cluster: 'msCO2',
99
+ type: ['attributeReport', 'readResponse'],
100
+ convert: (model, msg, publish, options, meta) => {
101
+ if (msg.data.hasOwnProperty('measuredValue')) {
102
+ const co2 = msg.data['measuredValue'];
103
+ return {co2: calibrateAndPrecisionRoundOptions(co2, options, 'co2')};
104
+ }
105
+ },
106
+ },
107
+ co2_config: {
108
+ cluster: 'msCO2',
109
+ type: ['attributeReport', 'readResponse'],
110
+ convert: (model, msg, publish, options, meta) => {
111
+ const result = {};
112
+ if (msg.data.hasOwnProperty(0x0203)) {
113
+ result.auto_brightness = ['OFF', 'ON'][msg.data[0x0203]];
114
+ }
115
+ if (msg.data.hasOwnProperty(0x0202)) {
116
+ result.forced_recalibration = ['OFF', 'ON'][msg.data[0x0202]];
117
+ }
118
+ if (msg.data.hasOwnProperty(0x0206)) {
119
+ result.factory_reset_co2 = ['OFF', 'ON'][msg.data[0x0206]];
120
+ }
121
+ if (msg.data.hasOwnProperty(0x0204)) {
122
+ result.long_chart_period = ['OFF', 'ON'][msg.data[0x0204]];
123
+ }
124
+ if (msg.data.hasOwnProperty(0x0205)) {
125
+ result.set_altitude = msg.data[0x0205];
126
+ }
127
+ if (msg.data.hasOwnProperty(0x0207)) {
128
+ result.manual_forced_recalibration = msg.data[0x0207];
129
+ }
130
+ return result;
131
+ },
132
+ },
133
+ temperature_config: {
134
+ cluster: 'msTemperatureMeasurement',
135
+ type: 'readResponse',
136
+ convert: (model, msg, publish, options, meta) => {
137
+ const result = {};
138
+ if (msg.data.hasOwnProperty(0x0210)) {
139
+ result.temperature_offset = msg.data[0x0210];
140
+ }
141
+ return result;
142
+ },
143
+ },
144
+ humidity_config: {
145
+ cluster: 'msRelativeHumidity',
146
+ type: 'readResponse',
147
+ convert: (model, msg, publish, options, meta) => {
148
+ const result = {};
149
+ if (msg.data.hasOwnProperty(0x0210)) {
150
+ result.humidity_offset = msg.data[0x0210];
151
+ }
152
+ return result;
153
+ },
154
+ },
38
155
  };
39
156
 
40
157
  module.exports = [
@@ -444,4 +561,64 @@ module.exports = [
444
561
  },
445
562
  exposes: [e.battery(), e.temperature(), e.humidity()],
446
563
  },
564
+ {
565
+ zigbeeModel: ['EFEKTA_iAQ'],
566
+ model: 'EFEKTA_iAQ',
567
+ vendor: 'Custom devices (DiY)',
568
+ description: '[CO2 Monitor with IPS TFT Display, outdoor temperature and humidity, date and time](http://efektalab.com/iAQ)',
569
+ fromZigbee: [fz.temperature, fz.humidity, fz.illuminance, fzLocal.co2, fzLocal.co2_config,
570
+ fzLocal.temperature_config, fzLocal.humidity_config],
571
+ toZigbee: [tz.factory_reset, tzLocal.co2_config, tzLocal.temperature_config, tzLocal.humidity_config, tzLocal.local_time],
572
+ configure: async (device, coordinatorEndpoint, logger) => {
573
+ const endpoint = device.getEndpoint(1);
574
+ const clusters = ['msTemperatureMeasurement', 'msRelativeHumidity', 'msIlluminanceMeasurement', 'msCO2'];
575
+ await reporting.bind(endpoint, coordinatorEndpoint, clusters);
576
+ for (const cluster of clusters) {
577
+ await endpoint.configureReporting(cluster, [
578
+ {attribute: 'measuredValue', minimumReportInterval: 0, maximumReportInterval: 3600, reportableChange: 0},
579
+ ]);
580
+ }
581
+ const payload1 = [{attribute: {ID: 0x0203, type: 0x10},
582
+ minimumReportInterval: 0, maximumReportInterval: 3600, reportableChange: 0}];
583
+ await endpoint.configureReporting('msCO2', payload1);
584
+ const payload2 = [{attribute: {ID: 0x0202, type: 0x10},
585
+ minimumReportInterval: 0, maximumReportInterval: 3600, reportableChange: 0}];
586
+ await endpoint.configureReporting('msCO2', payload2);
587
+ const payload3 = [{attribute: {ID: 0x0204, type: 0x10},
588
+ minimumReportInterval: 0, maximumReportInterval: 3600, reportableChange: 0}];
589
+ await endpoint.configureReporting('msCO2', payload3);
590
+ const payload4 = [{attribute: {ID: 0x0205, type: 0x21},
591
+ minimumReportInterval: 0, maximumReportInterval: 3600, reportableChange: 0}];
592
+ await endpoint.configureReporting('msCO2', payload4);
593
+ const payload5 = [{attribute: {ID: 0x0206, type: 0x10},
594
+ minimumReportInterval: 0, maximumReportInterval: 3600, reportableChange: 0}];
595
+ await endpoint.configureReporting('msCO2', payload5);
596
+ const payload6 = [{attribute: {ID: 0x0207, type: 0x21},
597
+ minimumReportInterval: 0, maximumReportInterval: 3600, reportableChange: 0}];
598
+ await endpoint.configureReporting('msCO2', payload6);
599
+ const time = Math.round(((new Date()).getTime() - constants.OneJanuary2000) / 1000 + ((new Date())
600
+ .getTimezoneOffset() * -1) * 60);
601
+ const values = {time: time};
602
+ endpoint.write('genTime', values);
603
+ },
604
+ exposes: [e.co2(), e.temperature(), e.humidity(), e.illuminance(),
605
+ exposes.binary('auto_brightness', ea.STATE_SET, 'ON', 'OFF')
606
+ .withDescription('Enable or Disable Auto Brightness of the Display'),
607
+ exposes.binary('long_chart_period', ea.STATE_SET, 'ON', 'OFF')
608
+ .withDescription('The period of plotting the CO2 level(OFF - 1H | ON - 24H)'),
609
+ exposes.numeric('set_altitude', ea.STATE_SET).withUnit('meters')
610
+ .withDescription('Setting the altitude above sea level (for high accuracy of the CO2 sensor)')
611
+ .withValueMin(0).withValueMax(3000),
612
+ exposes.enum('local_time', ea.STATE_SET, ['set']).withDescription('Set date and time'),
613
+ exposes.numeric('temperature_offset', ea.STATE_SET).withUnit('°C').withDescription('Adjust temperature')
614
+ .withValueMin(-30).withValueMax(60),
615
+ exposes.numeric('humidity_offset', ea.STATE_SET).withUnit('%').withDescription('Adjust humidity')
616
+ .withValueMin(0).withValueMax(99),
617
+ exposes.binary('forced_recalibration', ea.STATE_SET, 'ON', 'OFF')
618
+ .withDescription('Start FRC (Perform Forced Recalibration of the CO2 Sensor)'),
619
+ exposes.binary('factory_reset_co2', ea.STATE_SET, 'ON', 'OFF').withDescription('Factory Reset CO2 sensor'),
620
+ exposes.numeric('manual_forced_recalibration', ea.STATE_SET).withUnit('ppm')
621
+ .withDescription('Start Manual FRC (Perform Forced Recalibration of the CO2 Sensor)')
622
+ .withValueMin(0).withValueMax(5000)],
623
+ },
447
624
  ];
@@ -348,7 +348,7 @@ module.exports = [
348
348
  model: 'GL-S-004Z',
349
349
  vendor: 'Gledopto',
350
350
  description: 'Zigbee 4W MR16 Bulb 30deg RGB+CCT',
351
- extend: gledoptoExtend.light_onoff_brightness_colortemp_color(),
351
+ extend: gledoptoExtend.light_onoff_brightness_colortemp_color({disableColorTempStartup: false, colorTempRange: [155, 495]}),
352
352
  },
353
353
  {
354
354
  zigbeeModel: ['GL-S-005Z'],
@@ -537,6 +537,7 @@ module.exports = [
537
537
  zigbeeModel: ['GL-D-006P'],
538
538
  model: 'GL-D-006P',
539
539
  vendor: 'Gledopto',
540
+ ota: ota.zigbeeOTA,
540
541
  description: 'Zigbee 6W anti-glare downlight RGB+CCT (pro)',
541
542
  extend: gledoptoExtend.light_onoff_brightness_colortemp_color({colorTempRange: [158, 495]}),
542
543
  },
package/devices/immax.js CHANGED
@@ -8,6 +8,16 @@ const e = exposes.presets;
8
8
  const ea = exposes.access;
9
9
 
10
10
  module.exports = [
11
+ {
12
+
13
+ zigbeeModel: ['Motion-Sensor-ZB3.0'],
14
+ model: '07043M',
15
+ vendor: 'Immax',
16
+ description: 'Motion sensor',
17
+ fromZigbee: [fz.ias_occupancy_alarm_1, fz.battery],
18
+ toZigbee: [],
19
+ exposes: [e.occupancy(), e.battery_low(), e.tamper(), e.battery()],
20
+ },
11
21
  {
12
22
  zigbeeModel: ['ZBT-CCTfilament-D0000'],
13
23
  model: '07089L',
@@ -139,7 +139,7 @@ module.exports = [
139
139
  zigbeeModel: ['Tibea TW Z3'],
140
140
  model: '4058075168572',
141
141
  vendor: 'LEDVANCE',
142
- description: 'SMART+ lamp E27 turntable white',
142
+ description: 'SMART+ lamp E27 tuneable white',
143
143
  extend: extend.ledvance.light_onoff_brightness_colortemp({colorTempRange: [153, 370]}),
144
144
  ota: ota.ledvance,
145
145
  },
@@ -151,4 +151,12 @@ module.exports = [
151
151
  extend: extend.ledvance.light_onoff_brightness_colortemp({colorTempRange: [153, 370]}),
152
152
  ota: ota.ledvance,
153
153
  },
154
+ {
155
+ zigbeeModel: ['CLA60 RGBW JP'],
156
+ model: 'SMARTZBA60RGBW',
157
+ vendor: 'LEDVANCE',
158
+ description: 'SMART+ lamp E26 RGBW',
159
+ extend: extend.ledvance.light_onoff_brightness_colortemp_color({colorTempRange: [153, 526]}),
160
+ ota: ota.ledvance,
161
+ },
154
162
  ];
package/devices/lellki.js CHANGED
@@ -42,7 +42,7 @@ module.exports = [
42
42
  const endpoint = device.getEndpoint(1);
43
43
  await reporting.bind(endpoint, coordinatorEndpoint, ['genOnOff']);
44
44
  },
45
- exposes: [e.switch(), exposes.enum('power_outage_memory', ea.STATE_SET, ['on', 'off', 'restore'])
45
+ exposes: [e.switch(), exposes.enum('power_outage_memory', ea.ALL, ['on', 'off', 'restore'])
46
46
  .withDescription('Recover state after power outage')],
47
47
  },
48
48
  {
@@ -102,7 +102,7 @@ module.exports = [
102
102
  },
103
103
  options: [exposes.options.measurement_poll_interval()],
104
104
  exposes: [e.switch(), e.power(), e.current(), e.voltage().withAccess(ea.STATE),
105
- e.energy(), exposes.enum('power_outage_memory', ea.STATE_SET, ['on', 'off', 'restore'])
105
+ e.energy(), exposes.enum('power_outage_memory', ea.ALL, ['on', 'off', 'restore'])
106
106
  .withDescription('Recover state after power outage')],
107
107
  onEvent: tuya.onEventMeasurementPoll,
108
108
  },
@@ -122,7 +122,7 @@ module.exports = [
122
122
  },
123
123
  options: [exposes.options.measurement_poll_interval()],
124
124
  exposes: [e.switch(), e.power(), e.current(), e.voltage().withAccess(ea.STATE),
125
- e.energy(), exposes.enum('power_outage_memory', ea.STATE_SET, ['on', 'off', 'restore'])
125
+ e.energy(), exposes.enum('power_outage_memory', ea.ALL, ['on', 'off', 'restore'])
126
126
  .withDescription('Recover state after power outage')],
127
127
  onEvent: tuya.onEventMeasurementPoll,
128
128
  },
@@ -146,7 +146,7 @@ module.exports = [
146
146
  options: [exposes.options.measurement_poll_interval()],
147
147
  exposes: [e.switch().withEndpoint('l1'), e.switch().withEndpoint('l2'),
148
148
  e.switch().withEndpoint('l3'), e.power(), e.current(), e.voltage().withAccess(ea.STATE),
149
- e.energy(), exposes.enum('power_outage_memory', ea.STATE_SET, ['on', 'off', 'restore'])
149
+ e.energy(), exposes.enum('power_outage_memory', ea.ALL, ['on', 'off', 'restore'])
150
150
  .withDescription('Recover state after power outage')],
151
151
  endpoint: (device) => {
152
152
  return {l1: 1, l2: 2, l3: 3};
@@ -68,12 +68,19 @@ module.exports = [
68
68
  extend: extend.light_onoff_brightness_colortemp({colorTempRange: [153, 370]}),
69
69
  },
70
70
  {
71
- zigbeeModel: ['ZBT-CCTLight-C4700107', 'ZBT-CCTLight-M3500107'],
71
+ zigbeeModel: ['ZBT-CCTLight-C4700107'],
72
72
  model: 'ZL1000400-CCT-EU-2-V1A02',
73
73
  vendor: 'Linkind',
74
74
  description: 'Zigbee LED 5.4W C35 bulb E14, dimmable & tunable',
75
75
  extend: extend.light_onoff_brightness_colortemp(),
76
76
  },
77
+ {
78
+ zigbeeModel: ['ZBT-CCTLight-M3500107'],
79
+ model: 'ZL00030014',
80
+ vendor: 'Linkind',
81
+ description: 'Zigbee LED 4.8W GU10 bulb, dimmable & tunable',
82
+ extend: extend.light_onoff_brightness_colortemp({colorTempRange: [153, 370]}),
83
+ },
77
84
  {
78
85
  zigbeeModel: ['ZBT-CCTLight-BR300107'],
79
86
  model: 'ZL100050004',
@@ -267,7 +267,7 @@ module.exports = [
267
267
  exposes: [
268
268
  e.light_brightness().withEndpoint('l1'),
269
269
  e.light_brightness().withEndpoint('l2'),
270
- exposes.enum('power_outage_memory', ea.STATE_SET, ['on', 'off', 'restore']).withDescription('Recover state after power outage')
270
+ exposes.enum('power_outage_memory', ea.ALL, ['on', 'off', 'restore']).withDescription('Recover state after power outage')
271
271
  .withEndpoint('l1'),
272
272
  exposes.presets.switch_type_2().withEndpoint('l1'),
273
273
  exposes.presets.switch_type_2().withEndpoint('l2'),
package/devices/moes.js CHANGED
@@ -22,7 +22,7 @@ module.exports = [
22
22
  fromZigbee: [fz.on_off, fz.tuya_switch_power_outage_memory, fz.ts011f_plug_child_mode],
23
23
  toZigbee: [tz.on_off, tz.tuya_switch_power_outage_memory, tz.ts011f_plug_child_mode],
24
24
  exposes: [e.switch().withEndpoint('l1'), e.switch().withEndpoint('l2'),
25
- exposes.enum('power_outage_memory', ea.STATE_SET, ['on', 'off', 'restore'])
25
+ exposes.enum('power_outage_memory', ea.ALL, ['on', 'off', 'restore'])
26
26
  .withDescription('Recover state after power outage'), e.child_lock()],
27
27
  endpoint: (device) => {
28
28
  return {'l1': 1, 'l2': 2};
package/devices/owon.js CHANGED
@@ -111,7 +111,7 @@ module.exports = [
111
111
  },
112
112
  },
113
113
  {
114
- zigbeeModel: ['PIR313-E'],
114
+ zigbeeModel: ['PIR313-E', 'PIR313'],
115
115
  model: 'PIR313-E',
116
116
  vendor: 'OWON',
117
117
  description: 'Motion sensor',
@@ -55,6 +55,13 @@ module.exports = [
55
55
  description: 'Hue White and Color Ambiance GU10 (Centura)',
56
56
  extend: hueExtend.light_onoff_brightness_colortemp_color({colorTempRange: [153, 500]}),
57
57
  },
58
+ {
59
+ zigbeeModel: ['929003045201_01', '929003045201_02', '929003045201_03'],
60
+ model: '929003045201',
61
+ vendor: 'Philips',
62
+ description: 'Hue White and Color Ambiance GU10 (Centura round white)',
63
+ extend: hueExtend.light_onoff_brightness_colortemp_color({colorTempRange: [153, 500]}),
64
+ },
58
65
  {
59
66
  zigbeeModel: ['929003047401'],
60
67
  model: '929003047401',
@@ -426,6 +433,13 @@ module.exports = [
426
433
  description: 'Hue Calla outdoor',
427
434
  extend: hueExtend.light_onoff_brightness_colortemp_color({colorTempRange: [153, 500]}),
428
435
  },
436
+ {
437
+ zigbeeModel: ['929003098601'],
438
+ model: '929003098601',
439
+ vendor: 'Philips',
440
+ description: 'Hue Calla outdoor Pedestal',
441
+ extend: hueExtend.light_onoff_brightness_colortemp_color({colorTempRange: [153, 500]}),
442
+ },
429
443
  {
430
444
  zigbeeModel: ['1742330P7'],
431
445
  model: '1742330P7',
@@ -2427,6 +2441,13 @@ module.exports = [
2427
2441
  description: 'Akari downlight',
2428
2442
  extend: hueExtend.light_onoff_brightness_colortemp_color({colorTempRange: [153, 500]}),
2429
2443
  },
2444
+ {
2445
+ zigbeeModel: ['LCD006'],
2446
+ model: '9290031346',
2447
+ vendor: 'Philips',
2448
+ description: 'Hue white and color ambiance 5/6" retrofit recessed downlight',
2449
+ extend: hueExtend.light_onoff_brightness_colortemp_color({colorTempRange: [153, 500]}),
2450
+ },
2430
2451
  {
2431
2452
  zigbeeModel: ['LWE004'],
2432
2453
  model: '8719514302235',
package/devices/tuya.js CHANGED
@@ -319,13 +319,22 @@ module.exports = [
319
319
  },
320
320
  {
321
321
  fingerprint: [{modelID: 'TS0601', manufacturerName: '_TZE200_bq5c8xfe'},
322
- {modelID: 'TS0601', manufacturerName: '_TZE200_bjawzodf'}],
322
+ {modelID: 'TS0601', manufacturerName: '_TZE200_bjawzodf'},
323
+ {modelID: 'TS0601', manufacturerName: '_TZE200_qyflbnbj'}],
323
324
  model: 'TS0601_temperature_humidity_sensor',
324
325
  vendor: 'TuYa',
325
326
  description: 'Temperature & humidity sensor',
326
327
  fromZigbee: [fz.tuya_temperature_humidity_sensor],
327
328
  toZigbee: [],
328
- exposes: [e.temperature(), e.humidity(), e.battery()],
329
+ exposes: (device, options) => {
330
+ const exps = [e.temperature(), e.humidity(), e.battery()];
331
+ if (!device || device.manufacturerName === '_TZE200_qyflbnbj') {
332
+ exps.push(e.battery_low());
333
+ exps.push(exposes.enum('battery_level', ea.STATE, ['low', 'middle', 'high']).withDescription('Battery level state'));
334
+ }
335
+ exps.push(e.linkquality());
336
+ return exps;
337
+ },
329
338
  },
330
339
  {
331
340
  fingerprint: [{modelID: 'TS0601', manufacturerName: '_TZE200_vzqtvljm'}],
@@ -431,7 +440,13 @@ module.exports = [
431
440
  model: 'ZN231392',
432
441
  vendor: 'TuYa',
433
442
  description: 'Smart water/gas valve',
434
- extend: extend.switch(),
443
+ fromZigbee: extend.switch().fromZigbee.concat([fz.moes_power_on_behavior]),
444
+ toZigbee: extend.switch().toZigbee.concat([tz.moes_power_on_behavior]),
445
+ exposes: extend.switch().exposes.concat([e.power_on_behavior()]),
446
+ configure: async (device, coordinatorEndpoint, logger) => {
447
+ const endpoint = device.getEndpoint(1);
448
+ await endpoint.read('genOnOff', ['onOff', 'moesStartUpOnOff']);
449
+ },
435
450
  },
436
451
  {
437
452
  fingerprint: [{modelID: 'TS011F', manufacturerName: '_TZ3000_1hwjutgo'}, {modelID: 'TS011F', manufacturerName: '_TZ3000_lnggrqqi'}],
@@ -483,7 +498,8 @@ module.exports = [
483
498
  {modelID: 'TS0505B', manufacturerName: '_TZ3210_s6zec0of'},
484
499
  {modelID: 'TS0505B', manufacturerName: '_TZ3210_y5fjkn7x'},
485
500
  {modelID: 'TS0505B', manufacturerName: '_TZ3210_cuqkfz2q'},
486
- {modelID: 'TS0505B', manufacturerName: '_TZ3210_6amjviba'}],
501
+ {modelID: 'TS0505B', manufacturerName: '_TZ3210_6amjviba'},
502
+ {modelID: 'TS0505B', manufacturerName: '_TZ3000_xr5m6kfg'}],
487
503
  model: 'TS0505B',
488
504
  vendor: 'TuYa',
489
505
  description: 'Zigbee RGB+CCT light',
@@ -736,7 +752,8 @@ module.exports = [
736
752
  const endpoint = device.getEndpoint(1);
737
753
  await reporting.bind(endpoint, coordinatorEndpoint, ['genBasic']);
738
754
  },
739
- exposes: [e.battery(), e.illuminance_lux(), e.battery_low(), e.linkquality()],
755
+ exposes: [e.battery(), e.illuminance_lux(), e.linkquality(),
756
+ exposes.enum('brightness_level', ea.STATE, ['LOW', 'MEDIUM', 'HIGH'])],
740
757
  },
741
758
  {
742
759
  zigbeeModel: ['TS130F'],
@@ -1548,8 +1565,9 @@ module.exports = [
1548
1565
  description: '10A UK or 16A EU smart plug',
1549
1566
  whiteLabel: [{vendor: 'BlitzWolf', model: 'BW-SHP13'}],
1550
1567
  vendor: 'TuYa',
1551
- fromZigbee: [fz.on_off, fz.electrical_measurement, fz.metering, fz.ignore_basic_report, fz.tuya_switch_power_outage_memory],
1552
- toZigbee: [tz.on_off, tz.tuya_switch_power_outage_memory],
1568
+ fromZigbee: [fz.on_off, fz.electrical_measurement, fz.metering, fz.ignore_basic_report, fz.tuya_switch_power_outage_memory,
1569
+ fz.ts011f_plug_indicator_mode],
1570
+ toZigbee: [tz.on_off, tz.tuya_switch_power_outage_memory, tz.ts011f_plug_indicator_mode],
1553
1571
  configure: async (device, coordinatorEndpoint, logger) => {
1554
1572
  const endpoint = device.getEndpoint(1);
1555
1573
  await reporting.bind(endpoint, coordinatorEndpoint, ['genOnOff', 'haElectricalMeasurement', 'seMetering']);
@@ -1561,21 +1579,31 @@ module.exports = [
1561
1579
  try {
1562
1580
  await reporting.currentSummDelivered(endpoint);
1563
1581
  } catch (error) {/* fails for some https://github.com/Koenkk/zigbee2mqtt/issues/11179 */}
1582
+ await endpoint.read('genOnOff', ['onOff', 'moesStartUpOnOff', 'tuyaBacklightMode']);
1564
1583
  },
1565
1584
  options: [exposes.options.measurement_poll_interval()],
1566
1585
  // This device doesn't support reporting correctly.
1567
1586
  // https://github.com/Koenkk/zigbee-herdsman-converters/pull/1270
1568
1587
  exposes: [e.switch(), e.power(), e.current(), e.voltage().withAccess(ea.STATE),
1569
- e.energy(), exposes.enum('power_outage_memory', ea.STATE_SET, ['on', 'off', 'restore'])
1570
- .withDescription('Recover state after power outage')],
1588
+ e.energy(), exposes.enum('power_outage_memory', ea.ALL, ['on', 'off', 'restore'])
1589
+ .withDescription('Recover state after power outage'),
1590
+ exposes.enum('indicator_mode', ea.ALL, ['off', 'off/on', 'on/off']).withDescription('LED indicator mode')],
1571
1591
  onEvent: tuya.onEventMeasurementPoll,
1572
1592
  },
1573
1593
  {
1574
1594
  fingerprint: [{modelID: 'TS0111', manufacturerName: '_TYZB01_ymcdbl3u'}],
1575
1595
  model: 'TS0111_valve',
1576
1596
  vendor: 'TuYa',
1597
+ whiteLabel: [{vendor: 'TuYa', model: 'SM-AW713Z'}],
1577
1598
  description: 'Smart water/gas valve',
1578
- extend: extend.switch(),
1599
+ fromZigbee: extend.switch().fromZigbee.concat([fz.moes_power_on_behavior, fz.ts011f_plug_indicator_mode]),
1600
+ toZigbee: extend.switch().toZigbee.concat([tz.moes_power_on_behavior, tz.ts011f_plug_indicator_mode]),
1601
+ exposes: extend.switch().exposes.concat([e.power_on_behavior(),
1602
+ exposes.enum('indicator_mode', ea.ALL, ['off', 'off/on', 'on/off', 'on']).withDescription('LED indicator mode')]),
1603
+ configure: async (device, coordinatorEndpoint, logger) => {
1604
+ const endpoint = device.getEndpoint(1);
1605
+ await endpoint.read('genOnOff', ['onOff', 'moesStartUpOnOff', 'tuyaBacklightMode']);
1606
+ },
1579
1607
  },
1580
1608
  {
1581
1609
  fingerprint: TS011Fplugs.map((manufacturerName) => {
@@ -1604,7 +1632,7 @@ module.exports = [
1604
1632
  device.save();
1605
1633
  },
1606
1634
  exposes: [e.switch(), e.power(), e.current(), e.voltage().withAccess(ea.STATE),
1607
- e.energy(), exposes.enum('power_outage_memory', ea.STATE_SET, ['on', 'off', 'restore'])
1635
+ e.energy(), exposes.enum('power_outage_memory', ea.ALL, ['on', 'off', 'restore'])
1608
1636
  .withDescription('Recover state after power outage'),
1609
1637
  exposes.enum('indicator_mode', ea.ALL, ['off', 'off/on', 'on/off', 'on'])
1610
1638
  .withDescription('Plug LED indicator mode'), e.child_lock()],
@@ -1625,7 +1653,7 @@ module.exports = [
1625
1653
  const endpoint = device.getEndpoint(1);
1626
1654
  await reporting.bind(endpoint, coordinatorEndpoint, ['genOnOff']);
1627
1655
  },
1628
- exposes: [e.switch(), exposes.enum('power_outage_memory', ea.STATE_SET, ['on', 'off', 'restore'])
1656
+ exposes: [e.switch(), exposes.enum('power_outage_memory', ea.ALL, ['on', 'off', 'restore'])
1629
1657
  .withDescription('Recover state after power outage'),
1630
1658
  exposes.enum('indicator_mode', ea.ALL, ['off', 'off/on', 'on/off', 'on'])
1631
1659
  .withDescription('Plug LED indicator mode'), e.child_lock()],
@@ -1656,7 +1684,7 @@ module.exports = [
1656
1684
  },
1657
1685
  options: [exposes.options.measurement_poll_interval()],
1658
1686
  exposes: [e.switch(), e.power(), e.current(), e.voltage().withAccess(ea.STATE),
1659
- e.energy(), exposes.enum('power_outage_memory', ea.STATE_SET, ['on', 'off', 'restore'])
1687
+ e.energy(), exposes.enum('power_outage_memory', ea.ALL, ['on', 'off', 'restore'])
1660
1688
  .withDescription('Recover state after power outage'),
1661
1689
  exposes.enum('indicator_mode', ea.ALL, ['off', 'off/on', 'on/off', 'on'])
1662
1690
  .withDescription('Plug LED indicator mode'), e.child_lock()],
@@ -1838,7 +1866,9 @@ module.exports = [
1838
1866
  },
1839
1867
  },
1840
1868
  {
1841
- fingerprint: [{modelID: 'TS0012', manufacturerName: '_TZ3000_jl7qyupf'}, {modelID: 'TS0012', manufacturerName: '_TZ3000_nPGIPl5D'}],
1869
+ fingerprint: [{modelID: 'TS0012', manufacturerName: '_TZ3000_jl7qyupf'},
1870
+ {modelID: 'TS0012', manufacturerName: '_TZ3000_nPGIPl5D'},
1871
+ {modelID: 'TS0012', manufacturerName: '_TZ3000_4zf0crgo'}],
1842
1872
  model: 'TS0012_switch_module',
1843
1873
  vendor: 'TuYa',
1844
1874
  description: '2 gang switch module - (without neutral)',
@@ -2162,7 +2192,7 @@ module.exports = [
2162
2192
  device.save();
2163
2193
  },
2164
2194
  exposes: [e.switch(), e.power(), e.current(), e.voltage().withAccess(ea.STATE),
2165
- e.energy(), exposes.enum('power_outage_memory', ea.STATE_SET, ['on', 'off', 'restore'])
2195
+ e.energy(), exposes.enum('power_outage_memory', ea.ALL, ['on', 'off', 'restore'])
2166
2196
  .withDescription('Recover state after power outage'),
2167
2197
  exposes.enum('indicator_mode', ea.STATE_SET, ['off', 'on_off', 'off_on'])
2168
2198
  .withDescription('Relay LED indicator mode')],
@@ -2180,7 +2210,7 @@ module.exports = [
2180
2210
  device.save();
2181
2211
  },
2182
2212
  exposes: [e.switch(),
2183
- exposes.enum('power_outage_memory', ea.STATE_SET, ['on', 'off', 'restore'])
2213
+ exposes.enum('power_outage_memory', ea.ALL, ['on', 'off', 'restore'])
2184
2214
  .withDescription('Recover state after power outage'),
2185
2215
  exposes.enum('indicator_mode', ea.STATE_SET, ['off', 'on_off', 'off_on'])
2186
2216
  .withDescription('Relay LED indicator mode')],
package/devices/xiaomi.js CHANGED
@@ -113,7 +113,21 @@ module.exports = [
113
113
  model: 'ZNLDP13LM',
114
114
  vendor: 'Xiaomi',
115
115
  description: 'Aqara T1 smart LED bulb',
116
- extend: xiaomiExtend.light_onoff_brightness_colortemp({disableEffect: true, colorTempRange: [153, 370]}),
116
+ toZigbee: xiaomiExtend.light_onoff_brightness_colortemp({disableEffect: true, disablePowerOnBehavior: true}).toZigbee.concat([
117
+ tz.xiaomi_switch_power_outage_memory,
118
+ ]),
119
+ fromZigbee: xiaomiExtend.light_onoff_brightness_colortemp({disableEffect: true, disablePowerOnBehavior: true}).fromZigbee.concat([
120
+ fz.aqara_opple,
121
+ ]),
122
+ exposes: xiaomiExtend.light_onoff_brightness_colortemp({
123
+ disableEffect: true,
124
+ disablePowerOnBehavior: true,
125
+ colorTempRange: [153, 370],
126
+ }).exposes.concat([
127
+ e.power_outage_memory(),
128
+ e.device_temperature(),
129
+ e.power_outage_count(),
130
+ ]),
117
131
  ota: ota.zigbeeOTA,
118
132
  },
119
133
  {
package/devices/yale.js CHANGED
@@ -10,7 +10,8 @@ const lockExtend = (meta) => {
10
10
  fz.lock_user_status_response],
11
11
  toZigbee: [tz.lock, tz.pincode_lock, tz.lock_userstatus],
12
12
  meta: {pinCodeCount: 250, ...meta},
13
- exposes: [e.lock(), e.battery(), e.pincode(), e.lock_action(), e.lock_action_source_name(), e.lock_action_source_user()],
13
+ exposes: [e.lock(), e.battery(), e.pincode(), e.lock_action(), e.lock_action_source_name(), e.lock_action_source_user(),
14
+ e.lock_action_user()],
14
15
  configure: async (device, coordinatorEndpoint, logger) => {
15
16
  const endpoint = device.getEndpoint(1);
16
17
  await reporting.bind(endpoint, coordinatorEndpoint, ['closuresDoorLock', 'genPowerCfg']);
@@ -137,7 +137,7 @@ module.exports = [
137
137
  fromZigbee: [fz.on_off, fz.tuya_switch_power_outage_memory],
138
138
  toZigbee: [tz.on_off, tz.tuya_switch_power_outage_memory],
139
139
  exposes: [e.switch().withEndpoint('l1'), e.switch().withEndpoint('l2'),
140
- exposes.enum('power_outage_memory', ea.STATE_SET, ['on', 'off', 'restore'])
140
+ exposes.enum('power_outage_memory', ea.ALL, ['on', 'off', 'restore'])
141
141
  .withDescription('Recover state after power outage')],
142
142
  endpoint: (device) => {
143
143
  return {'l1': 1, 'l2': 2};
package/lib/exposes.js CHANGED
@@ -574,6 +574,7 @@ module.exports = {
574
574
  lock_action: () => new Enum('action', access.STATE, ['unknown', 'lock', 'unlock', 'lock_failure_invalid_pin_or_id', 'lock_failure_invalid_schedule', 'unlock_failure_invalid_pin_or_id', 'unlock_failure_invalid_schedule', 'one_touch_lock', 'key_lock', 'key_unlock', 'auto_lock', 'schedule_lock', 'schedule_unlock', 'manual_lock', 'manual_unlock', 'non_access_user_operational_event']).withDescription('Triggered action on the lock'),
575
575
  lock_action_source_name: () => new Enum('action_source_name', access.STATE, ['keypad', 'rfid', 'manual', 'rf']).withDescription('Source of the triggered action on the lock'),
576
576
  lock_action_source_user: () => new Numeric('action_source_user', access.STATE).withDescription('ID of user that triggered the action on the lock'),
577
+ lock_action_user: () => new Numeric('action_user', access.STATE).withDescription('ID of user that triggered the action on the lock'),
577
578
  max_temperature: () => new Numeric('max_temperature', access.STATE_SET).withUnit('°C').withDescription('Maximum temperature').withValueMin(15).withValueMax(35),
578
579
  max_temperature_limit: () => new Numeric('max_temperature_limit', access.STATE_SET).withUnit('°C').withDescription('Maximum temperature limit').withValueMin(0).withValueMax(35),
579
580
  min_temperature: () => new Numeric('min_temperature', access.STATE_SET).withUnit('°C').withDescription('Minimum temperature').withValueMin(1).withValueMax(15),
package/lib/tuya.js CHANGED
@@ -626,6 +626,11 @@ const dataPoints = {
626
626
  nousHumiAlarm: 15,
627
627
  nousTempSensitivity: 19,
628
628
  nousReportInterval: 17,
629
+ // TUYA Temperature and Humidity Sensor
630
+ tthTemperature: 1,
631
+ tthHumidity: 2,
632
+ tthBatteryLevel: 3,
633
+ tthBattery: 4,
629
634
  // TUYA / HUMIDITY/ILLUMINANCE/TEMPERATURE SENSOR
630
635
  thitBatteryPercentage: 3,
631
636
  thitIlluminanceLux: 7,
package/lib/xiaomi.js CHANGED
@@ -172,11 +172,25 @@ const numericAttributes2Payload = (msg, meta, model, options, dataObject) => {
172
172
  case '5':
173
173
  payload.power_outage_count = value - 1;
174
174
  break;
175
+ case '8':
176
+ if (['ZNLDP13LM'].includes(model.model)) {
177
+ // We don't know what the value means for these devices.
178
+ }
179
+ break;
180
+ case '9':
181
+ if (['ZNLDP13LM'].includes(model.model)) {
182
+ // We don't know what the value means for these devices.
183
+ }
184
+ break;
175
185
  case '10':
176
- payload.switch_type = {1: 'toggle', 2: 'momentary'}[value];
186
+ if (['ZNLDP13LM'].includes(model.model)) {
187
+ // We don't know what the value means for these devices.
188
+ } else {
189
+ payload.switch_type = {1: 'toggle', 2: 'momentary'}[value];
190
+ }
177
191
  break;
178
192
  case '11':
179
- if (['JT-BZ-01AQ/A', 'QBKG25LM'].includes(model.model)) {
193
+ if (['JT-BZ-01AQ/A', 'QBKG25LM', 'ZNLDP13LM'].includes(model.model)) {
180
194
  // We don't know what the value means for these devices.
181
195
  // https://github.com/Koenkk/zigbee2mqtt/issues/12451
182
196
  } else {
@@ -185,6 +199,11 @@ const numericAttributes2Payload = (msg, meta, model, options, dataObject) => {
185
199
  payload.illuminance_lux = calibrateAndPrecisionRoundOptions(value, options, 'illuminance_lux');
186
200
  }
187
201
  break;
202
+ case '12':
203
+ if (['ZNLDP13LM'].includes(model.model)) {
204
+ // We don't know what the value means for these devices.
205
+ }
206
+ break;
188
207
  case '100':
189
208
  if (['QBKG20LM', 'QBKG31LM', 'QBKG39LM', 'QBKG41LM', 'QBCZ15LM', 'LLKZMK11LM', 'QBKG12LM', 'QBKG03LM', 'QBKG25LM']
190
209
  .includes(model.model)) {
@@ -339,6 +358,11 @@ const numericAttributes2Payload = (msg, meta, model, options, dataObject) => {
339
358
  payload.power = precisionRound(value, 2); // 0x98
340
359
  }
341
360
  break;
361
+ case '154':
362
+ if (['ZNLDP13LM'].includes(model.model)) {
363
+ // We don't know what the value means for these devices.
364
+ }
365
+ break;
342
366
  case '159':
343
367
  if (['JT-BZ-01AQ/A'].includes(model.model)) {
344
368
  payload.gas_sensitivity = {1: '15%LEL', 2: '10%LEL'}[value];
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "zigbee-herdsman-converters",
3
- "version": "14.0.563",
3
+ "version": "14.0.566",
4
4
  "description": "Collection of device converters to be used with zigbee-herdsman",
5
5
  "main": "index.js",
6
6
  "files": [
@@ -38,7 +38,7 @@
38
38
  "buffer-crc32": "^0.2.13",
39
39
  "https-proxy-agent": "^5.0.1",
40
40
  "tar-stream": "^2.2.0",
41
- "zigbee-herdsman": "^0.14.40"
41
+ "zigbee-herdsman": "^0.14.42"
42
42
  },
43
43
  "devDependencies": {
44
44
  "eslint": "*",