zigbee-herdsman-converters 14.0.562 → 14.0.565

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 ` +
@@ -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/hive.js CHANGED
@@ -9,6 +9,13 @@ const e = exposes.presets;
9
9
  const ea = exposes.access;
10
10
 
11
11
  module.exports = [
12
+ {
13
+ zigbeeModel: ['FWGU10Bulb02UK'],
14
+ model: 'FWGU10Bulb02UK',
15
+ vendor: 'Hive',
16
+ description: 'GU10 warm white',
17
+ extend: extend.light_onoff_brightness(),
18
+ },
12
19
  {
13
20
  zigbeeModel: ['MOT003'],
14
21
  model: 'MOT003',
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};
@@ -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'}],
@@ -441,6 +456,14 @@ module.exports = [
441
456
  extend: extend.switch(),
442
457
  whiteLabel: [{vendor: 'Mumubiz', model: 'ZJSB9-80Z'}],
443
458
  },
459
+ {
460
+ fingerprint: [{modelID: 'TS011F', manufacturerName: '_TZ3000_8fdayfch'}],
461
+ model: 'TS011F_relay_switch',
462
+ vendor: 'TuYa',
463
+ description: 'Dry contact relay switch',
464
+ extend: extend.switch(),
465
+ whiteLabel: [{vendor: 'KTNNKG', model: 'ZB1248-10A'}],
466
+ },
444
467
  {
445
468
  fingerprint: [{modelID: 'TS0505B', manufacturerName: '_TZ3000_qqjaziws'},
446
469
  {modelID: 'TS0505B', manufacturerName: '_TZ3000_jtmhndw2'},
@@ -1540,8 +1563,9 @@ module.exports = [
1540
1563
  description: '10A UK or 16A EU smart plug',
1541
1564
  whiteLabel: [{vendor: 'BlitzWolf', model: 'BW-SHP13'}],
1542
1565
  vendor: 'TuYa',
1543
- fromZigbee: [fz.on_off, fz.electrical_measurement, fz.metering, fz.ignore_basic_report, fz.tuya_switch_power_outage_memory],
1544
- toZigbee: [tz.on_off, tz.tuya_switch_power_outage_memory],
1566
+ fromZigbee: [fz.on_off, fz.electrical_measurement, fz.metering, fz.ignore_basic_report, fz.tuya_switch_power_outage_memory,
1567
+ fz.ts011f_plug_indicator_mode],
1568
+ toZigbee: [tz.on_off, tz.tuya_switch_power_outage_memory, tz.ts011f_plug_indicator_mode],
1545
1569
  configure: async (device, coordinatorEndpoint, logger) => {
1546
1570
  const endpoint = device.getEndpoint(1);
1547
1571
  await reporting.bind(endpoint, coordinatorEndpoint, ['genOnOff', 'haElectricalMeasurement', 'seMetering']);
@@ -1553,21 +1577,31 @@ module.exports = [
1553
1577
  try {
1554
1578
  await reporting.currentSummDelivered(endpoint);
1555
1579
  } catch (error) {/* fails for some https://github.com/Koenkk/zigbee2mqtt/issues/11179 */}
1580
+ await endpoint.read('genOnOff', ['onOff', 'moesStartUpOnOff', 'tuyaBacklightMode']);
1556
1581
  },
1557
1582
  options: [exposes.options.measurement_poll_interval()],
1558
1583
  // This device doesn't support reporting correctly.
1559
1584
  // https://github.com/Koenkk/zigbee-herdsman-converters/pull/1270
1560
1585
  exposes: [e.switch(), e.power(), e.current(), e.voltage().withAccess(ea.STATE),
1561
- e.energy(), exposes.enum('power_outage_memory', ea.STATE_SET, ['on', 'off', 'restore'])
1562
- .withDescription('Recover state after power outage')],
1586
+ e.energy(), exposes.enum('power_outage_memory', ea.ALL, ['on', 'off', 'restore'])
1587
+ .withDescription('Recover state after power outage'),
1588
+ exposes.enum('indicator_mode', ea.ALL, ['off', 'off/on', 'on/off']).withDescription('LED indicator mode')],
1563
1589
  onEvent: tuya.onEventMeasurementPoll,
1564
1590
  },
1565
1591
  {
1566
1592
  fingerprint: [{modelID: 'TS0111', manufacturerName: '_TYZB01_ymcdbl3u'}],
1567
1593
  model: 'TS0111_valve',
1568
1594
  vendor: 'TuYa',
1595
+ whiteLabel: [{vendor: 'TuYa', model: 'SM-AW713Z'}],
1569
1596
  description: 'Smart water/gas valve',
1570
- extend: extend.switch(),
1597
+ fromZigbee: extend.switch().fromZigbee.concat([fz.moes_power_on_behavior, fz.ts011f_plug_indicator_mode]),
1598
+ toZigbee: extend.switch().toZigbee.concat([tz.moes_power_on_behavior, tz.ts011f_plug_indicator_mode]),
1599
+ exposes: extend.switch().exposes.concat([e.power_on_behavior(),
1600
+ exposes.enum('indicator_mode', ea.ALL, ['off', 'off/on', 'on/off', 'on']).withDescription('LED indicator mode')]),
1601
+ configure: async (device, coordinatorEndpoint, logger) => {
1602
+ const endpoint = device.getEndpoint(1);
1603
+ await endpoint.read('genOnOff', ['onOff', 'moesStartUpOnOff', 'tuyaBacklightMode']);
1604
+ },
1571
1605
  },
1572
1606
  {
1573
1607
  fingerprint: TS011Fplugs.map((manufacturerName) => {
@@ -1596,7 +1630,7 @@ module.exports = [
1596
1630
  device.save();
1597
1631
  },
1598
1632
  exposes: [e.switch(), e.power(), e.current(), e.voltage().withAccess(ea.STATE),
1599
- e.energy(), exposes.enum('power_outage_memory', ea.STATE_SET, ['on', 'off', 'restore'])
1633
+ e.energy(), exposes.enum('power_outage_memory', ea.ALL, ['on', 'off', 'restore'])
1600
1634
  .withDescription('Recover state after power outage'),
1601
1635
  exposes.enum('indicator_mode', ea.ALL, ['off', 'off/on', 'on/off', 'on'])
1602
1636
  .withDescription('Plug LED indicator mode'), e.child_lock()],
@@ -1617,7 +1651,7 @@ module.exports = [
1617
1651
  const endpoint = device.getEndpoint(1);
1618
1652
  await reporting.bind(endpoint, coordinatorEndpoint, ['genOnOff']);
1619
1653
  },
1620
- exposes: [e.switch(), exposes.enum('power_outage_memory', ea.STATE_SET, ['on', 'off', 'restore'])
1654
+ exposes: [e.switch(), exposes.enum('power_outage_memory', ea.ALL, ['on', 'off', 'restore'])
1621
1655
  .withDescription('Recover state after power outage'),
1622
1656
  exposes.enum('indicator_mode', ea.ALL, ['off', 'off/on', 'on/off', 'on'])
1623
1657
  .withDescription('Plug LED indicator mode'), e.child_lock()],
@@ -1648,7 +1682,7 @@ module.exports = [
1648
1682
  },
1649
1683
  options: [exposes.options.measurement_poll_interval()],
1650
1684
  exposes: [e.switch(), e.power(), e.current(), e.voltage().withAccess(ea.STATE),
1651
- e.energy(), exposes.enum('power_outage_memory', ea.STATE_SET, ['on', 'off', 'restore'])
1685
+ e.energy(), exposes.enum('power_outage_memory', ea.ALL, ['on', 'off', 'restore'])
1652
1686
  .withDescription('Recover state after power outage'),
1653
1687
  exposes.enum('indicator_mode', ea.ALL, ['off', 'off/on', 'on/off', 'on'])
1654
1688
  .withDescription('Plug LED indicator mode'), e.child_lock()],
@@ -2154,7 +2188,7 @@ module.exports = [
2154
2188
  device.save();
2155
2189
  },
2156
2190
  exposes: [e.switch(), e.power(), e.current(), e.voltage().withAccess(ea.STATE),
2157
- e.energy(), exposes.enum('power_outage_memory', ea.STATE_SET, ['on', 'off', 'restore'])
2191
+ e.energy(), exposes.enum('power_outage_memory', ea.ALL, ['on', 'off', 'restore'])
2158
2192
  .withDescription('Recover state after power outage'),
2159
2193
  exposes.enum('indicator_mode', ea.STATE_SET, ['off', 'on_off', 'off_on'])
2160
2194
  .withDescription('Relay LED indicator mode')],
@@ -2172,7 +2206,7 @@ module.exports = [
2172
2206
  device.save();
2173
2207
  },
2174
2208
  exposes: [e.switch(),
2175
- exposes.enum('power_outage_memory', ea.STATE_SET, ['on', 'off', 'restore'])
2209
+ exposes.enum('power_outage_memory', ea.ALL, ['on', 'off', 'restore'])
2176
2210
  .withDescription('Recover state after power outage'),
2177
2211
  exposes.enum('indicator_mode', ea.STATE_SET, ['off', 'on_off', 'off_on'])
2178
2212
  .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
  {
@@ -269,11 +283,19 @@ module.exports = [
269
283
  model: 'WS-USC01',
270
284
  vendor: 'Xiaomi',
271
285
  description: 'Aqara smart wall switch (no neutral, single rocker)',
272
- extend: extend.switch(),
286
+ fromZigbee: [fz.on_off, fz.xiaomi_multistate_action, fz.aqara_opple],
287
+ toZigbee: [tz.on_off, tz.xiaomi_switch_operation_mode_opple,
288
+ tz.xiaomi_flip_indicator_light, tz.aqara_switch_mode_switch],
289
+ exposes: [e.switch(), e.action(['single', 'double']), e.flip_indicator_light(),
290
+ exposes.enum('operation_mode', ea.ALL, ['control_relay', 'decoupled']).withDescription('Decoupled mode'),
291
+ exposes.enum('mode_switch', ea.ALL, ['anti_flicker_mode', 'quick_mode'])
292
+ .withDescription('Anti flicker mode can be used to solve blinking issues of some lights.' +
293
+ 'Quick mode makes the device respond faster.')],
294
+ onEvent: preventReset,
273
295
  configure: async (device, coordinatorEndpoint, logger) => {
274
- const endpoint = device.getEndpoint(1);
275
- await reporting.bind(endpoint, coordinatorEndpoint, ['genOnOff']);
276
- await reporting.onOff(endpoint);
296
+ const endpoint1 = device.getEndpoint(1);
297
+ // set "event" mode
298
+ await endpoint1.write('aqaraOpple', {'mode': 1}, {manufacturerCode: 0x115f, disableResponse: true});
277
299
  },
278
300
  },
279
301
  {
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.562",
3
+ "version": "14.0.565",
4
4
  "description": "Collection of device converters to be used with zigbee-herdsman",
5
5
  "main": "index.js",
6
6
  "files": [