zigbee-herdsman-converters 14.0.592 → 14.0.595

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.
package/devices/climax.js CHANGED
@@ -91,7 +91,7 @@ module.exports = [
91
91
  },
92
92
  exposes: [e.battery_low(), e.tamper(), e.warning(),
93
93
  exposes.numeric('max_duration', ea.ALL).withUnit('s').withValueMin(0).withValueMax(600).withDescription('Duration of Siren'),
94
- exposes.binary('alarm', ea.SET, 'ON', 'OFF').withDescription('Manual start of siren')],
94
+ exposes.binary('alarm', ea.SET, 'START', 'OFF').withDescription('Manual start of siren')],
95
95
  },
96
96
  {
97
97
  zigbeeModel: ['WS15_00.00.00.14TC'],
@@ -8,6 +8,35 @@ const ota = require('../lib/ota');
8
8
  const e = exposes.presets;
9
9
  const ea = exposes.access;
10
10
 
11
+ const fzLocal = {
12
+ // SPLZB-134 reports strange values sometimes
13
+ // https://github.com/Koenkk/zigbee2mqtt/issues/13329
14
+ SPLZB134_electrical_measurement: {
15
+ ...fz.electrical_measurement,
16
+ convert: (model, msg, publish, options, meta) => {
17
+ if (msg.data.rmsVoltage !== 0xFFFF && msg.data.rmsCurrent !== 0xFFFF && msg.data.activePower !== -0x8000) {
18
+ return fz.electrical_measurement.convert(model, msg, publish, options, meta);
19
+ }
20
+ },
21
+ },
22
+ SPLZB134_device_temperature: {
23
+ ...fz.device_temperature,
24
+ convert: (model, msg, publish, options, meta) => {
25
+ if (msg.data.currentTemperature !== -0x8000) {
26
+ return fz.device_temperature.convert(model, msg, publish, options, meta);
27
+ }
28
+ },
29
+ },
30
+ SPLZB134_metering: {
31
+ ...fz.metering,
32
+ convert: (model, msg, publish, options, meta) => {
33
+ if (msg.data.instantaneousDemand !== -0x800000) {
34
+ return fz.metering.convert(model, msg, publish, options, meta);
35
+ }
36
+ },
37
+ },
38
+ };
39
+
11
40
  module.exports = [
12
41
  {
13
42
  zigbeeModel: ['SPLZB-131'],
@@ -65,7 +94,7 @@ module.exports = [
65
94
  model: 'SPLZB-134',
66
95
  vendor: 'Develco',
67
96
  description: 'Power plug (type G)',
68
- fromZigbee: [fz.on_off, fz.electrical_measurement, fz.metering, fz.device_temperature],
97
+ fromZigbee: [fz.on_off, fzLocal.SPLZB134_electrical_measurement, fzLocal.SPLZB134_metering, fzLocal.SPLZB134_device_temperature],
69
98
  toZigbee: [tz.on_off],
70
99
  exposes: [e.switch(), e.power(), e.current(), e.voltage(), e.energy(), e.device_temperature()],
71
100
  configure: async (device, coordinatorEndpoint, logger) => {
package/devices/ecodim.js CHANGED
@@ -8,9 +8,9 @@ module.exports = [
8
8
  {
9
9
  fingerprint: [
10
10
  {type: 'Router', manufacturerName: 'EcoDim BV', modelID: 'EcoDim-Zigbee 3.0', endpoints: [
11
- {ID: 1, profileID: 260, deviceID: 257, inputClusters: [0, 3, 4, 5, 6, 8, 2821, 4096], outputClusters: [25]},
12
- {ID: 2, profileID: 260, deviceID: 257, inputClusters: [0, 3, 4, 5, 6, 8], outputClusters: []},
13
- {ID: 242, profileID: 41440, deviceID: 97, inputClusters: [], outputClusters: [33]},
11
+ {ID: 1, profileID: 260, inputClusters: [0, 3, 4, 5, 6, 8, 2821, 4096], outputClusters: [25]},
12
+ {ID: 2, profileID: 260, inputClusters: [0, 3, 4, 5, 6, 8], outputClusters: []},
13
+ {ID: 242, profileID: 41440, inputClusters: [], outputClusters: [33]},
14
14
  ]},
15
15
  ],
16
16
  model: 'Eco-Dim.05',
package/devices/giex.js CHANGED
@@ -104,7 +104,10 @@ const tzLocal = {
104
104
 
105
105
  module.exports = [
106
106
  {
107
- fingerprint: [{modelID: 'TS0601', manufacturerName: '_TZE200_sh1btabb'}],
107
+ fingerprint: [
108
+ {modelID: 'TS0601', manufacturerName: '_TZE200_sh1btabb'},
109
+ {modelID: 'TS0601', manufacturerName: '_TZE200_a7sghmms'},
110
+ ],
108
111
  model: 'QT06',
109
112
  vendor: 'GiEX',
110
113
  description: 'Water irrigation valve',
@@ -5,6 +5,7 @@ const extend = require('../lib/extend');
5
5
  const tz = require('../converters/toZigbee');
6
6
  const ota = require('../lib/ota');
7
7
  const e = exposes.presets;
8
+ const ea = exposes.access;
8
9
 
9
10
  module.exports = [
10
11
  {
@@ -160,7 +161,14 @@ module.exports = [
160
161
  fz.command_step, fz.command_recall, fz.command_on, fz.command_off],
161
162
  exposes: [e.battery(), e.action([
162
163
  'color_move', 'color_temperature_move', 'hue_move', 'hue_stop', 'brightness_step_up', 'brightness_step_down',
163
- 'recall_*', 'on', 'off'])],
164
+ 'recall_*', 'on', 'off']),
165
+ // exposes.composite('action_color', 'action_color') * At the moment not shown in Frontend correctly
166
+ // .withFeature(exposes.numeric('x', ea.STATE)) see: https://github.com/nurikk/zigbee2mqtt-frontend/issues/1535
167
+ // .withFeature(exposes.numeric('y', ea.STATE)),
168
+ exposes.numeric('action_color_temperature', ea.STATE).withUnit('mired'),
169
+ exposes.numeric('action_group', ea.STATE),
170
+ exposes.numeric('action_transition_time', ea.STATE),
171
+ exposes.text('action_color', ea.STATE)],
164
172
  toZigbee: [],
165
173
  meta: {multiEndpoint: true},
166
174
  endpoint: (device) => {
package/devices/istar.js CHANGED
@@ -9,4 +9,12 @@ module.exports = [
9
9
  extend: extend.light_onoff_brightness(),
10
10
  meta: {turnsOffAtBrightness1: true},
11
11
  },
12
+ {
13
+ zigbeeModel: ['iStar CCT Light'],
14
+ model: 'SCCV2403-2',
15
+ vendor: 'iStar',
16
+ description: 'Zigbee 3.0 LED controller, dimmable white spectrum',
17
+ extend: extend.light_onoff_brightness_colortemp({colorTempRange: [153, 370]}),
18
+ meta: {turnsOffAtBrightness1: true},
19
+ },
12
20
  ];
package/devices/lidl.js CHANGED
@@ -561,6 +561,14 @@ module.exports = [
561
561
  device.getEndpoint(1).saveClusterAttributeKeyValue('lightingColorCtrl', {colorCapabilities: 29});
562
562
  },
563
563
  },
564
+ {
565
+ fingerprint: [{modelID: 'TS0505B', manufacturerName: '_TZ3210_zbabx9wh'}],
566
+ model: 'HG08007',
567
+ vendor: 'TuYa',
568
+ description: 'Livarno Home outdoor LED band',
569
+ extend: extend.light_onoff_brightness_colortemp_color({colorTempRange: [153, 500], disableColorTempStartup: true}),
570
+ meta: {applyRedFix: true, enhancedHue: false},
571
+ },
564
572
  {
565
573
  fingerprint: [{modelID: 'TS0505B', manufacturerName: '_TZ3210_z1vlyufu'}],
566
574
  model: '14158704L',
@@ -134,6 +134,13 @@ module.exports = [
134
134
  description: 'Hue gradient lightstrip',
135
135
  extend: hueExtend.light_onoff_brightness_colortemp_color({colorTempRange: [153, 500]}),
136
136
  },
137
+ {
138
+ zigbeeModel: ['929003045401'],
139
+ model: '929003045401',
140
+ vendor: 'Philips',
141
+ description: 'Hue Centura recessed spotlight white and color ambiance GU10 (black)',
142
+ extend: hueExtend.light_onoff_brightness_colortemp_color({colorTempRange: [153, 500]}),
143
+ },
137
144
  {
138
145
  zigbeeModel: ['929003045501_01', '929003045501_02', '929003045501_03'],
139
146
  model: '929003045501',
@@ -1325,7 +1332,7 @@ module.exports = [
1325
1332
  extend: hueExtend.light_onoff_brightness_colortemp(),
1326
1333
  },
1327
1334
  {
1328
- zigbeeModel: ['LTP002'],
1335
+ zigbeeModel: ['LTP002', '929003054901'],
1329
1336
  model: '4023330P7',
1330
1337
  vendor: 'Philips',
1331
1338
  description: 'Hue white ambiance suspension Amaze',
@@ -2071,7 +2078,7 @@ module.exports = [
2071
2078
  extend: hueExtend.light_onoff_brightness_colortemp_color(),
2072
2079
  },
2073
2080
  {
2074
- zigbeeModel: ['LCS001'],
2081
+ zigbeeModel: ['LCS001', '1741830P7'],
2075
2082
  model: '1741830P7',
2076
2083
  vendor: 'Philips',
2077
2084
  description: 'Hue Lily outdoor spot light',
package/devices/robb.js CHANGED
@@ -274,4 +274,24 @@ module.exports = [
274
274
  await reporting.currentSummDelivered(endpoint1, {min: 60, change: 1});
275
275
  },
276
276
  },
277
+ {
278
+ zigbeeModel: ['ROB_200-035-0'],
279
+ model: 'ROB_200-035-0',
280
+ vendor: 'ROBB',
281
+ description: '1 channel switch with power monitoring',
282
+ fromZigbee: [fz.electrical_measurement, fz.on_off, fz.ignore_genLevelCtrl_report, fz.metering],
283
+ toZigbee: [tz.on_off],
284
+ exposes: [e.switch(), e.power(), e.current(), e.voltage(), e.energy()],
285
+ configure: async (device, coordinatorEndpoint, logger) => {
286
+ const endpoint = device.getEndpoint(1);
287
+ await reporting.bind(endpoint, coordinatorEndpoint, ['genOnOff', 'haElectricalMeasurement', 'seMetering']);
288
+ await reporting.onOff(endpoint);
289
+ await reporting.readEletricalMeasurementMultiplierDivisors(endpoint);
290
+ await reporting.readMeteringMultiplierDivisor(endpoint);
291
+ await reporting.rmsCurrent(endpoint);
292
+ await reporting.activePower(endpoint);
293
+ await reporting.rmsVoltage(endpoint);
294
+ await reporting.currentSummDelivered(endpoint);
295
+ },
296
+ },
277
297
  ];
@@ -1,6 +1,8 @@
1
1
  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
+ const extend = require('../lib/extend');
5
+ const reporting = require('../lib/reporting');
4
6
  const ea = exposes.access;
5
7
 
6
8
  module.exports = [
@@ -49,6 +51,14 @@ module.exports = [
49
51
  ea.STATE_SET).withColor(['hs']),
50
52
  ],
51
53
  },
54
+ {
55
+ fingerprint: [{modelID: 'TS0503B', manufacturerName: '_TZB210_zdvrsts8'}],
56
+ model: 'WZ5_rgb_1',
57
+ vendor: 'TuYa',
58
+ description: 'Zigbee & RF 5 in 1 LED controller (RGB mode)',
59
+ extend: extend.light_onoff_brightness_color({supportsHS: true, preferHS: true, disableEffect: true}),
60
+ meta: {applyRedFix: true, enhancedHue: false},
61
+ },
52
62
  {
53
63
  fingerprint: [
54
64
  {modelID: 'TS0601', manufacturerName: '_TZE200_3thxjahu'},
@@ -86,4 +96,18 @@ module.exports = [
86
96
  ],
87
97
  meta: {separateWhite: true},
88
98
  },
99
+ {
100
+ fingerprint: [{modelID: 'TS0501B', manufacturerName: '_TZB210_rkgngb5o'}],
101
+ model: 'WZ1',
102
+ vendor: 'Skydance',
103
+ description: 'Zigbee & RF 2 channel LED controller',
104
+ extend: extend.light_onoff_brightness({noConfigure: true}),
105
+ configure: async (device, coordinatorEndpoint, logger) => {
106
+ await extend.light_onoff_brightness().configure(device, coordinatorEndpoint, logger);
107
+ const endpoint = device.getEndpoint(1);
108
+ await reporting.bind(endpoint, coordinatorEndpoint, ['genOnOff', 'genLevelCtrl']);
109
+ await reporting.onOff(endpoint);
110
+ await reporting.brightness(endpoint);
111
+ },
112
+ },
89
113
  ];
package/devices/tuya.js CHANGED
@@ -19,7 +19,8 @@ const TS011Fplugs = ['_TZ3000_5f43h46b', '_TZ3000_cphmq0q7', '_TZ3000_dpo1ysak',
19
19
  '_TZ3000_jvzvulen', '_TZ3000_mraovvmm', '_TZ3000_nfnmi125', '_TZ3000_ps3dmato', '_TZ3000_w0qqde0g', '_TZ3000_u5u4cakc',
20
20
  '_TZ3000_rdtixbnu', '_TZ3000_typdpbpg', '_TZ3000_kx0pris5', '_TZ3000_amdymr7l', '_TZ3000_z1pnpsdo', '_TZ3000_ksw8qtmt',
21
21
  '_TZ3000_1h2x4akh', '_TZ3000_9vo5icau', '_TZ3000_cehuw1lw', '_TZ3000_ko6v90pg', '_TZ3000_f1bapcit', '_TZ3000_cjrngdr3',
22
- '_TZ3000_zloso4jk', '_TZ3000_r6buo8ba', '_TZ3000_iksasdbv', '_TZ3000_idrffznf', '_TZ3000_okaz9tjs', '_TZ3210_q7oryllx'];
22
+ '_TZ3000_zloso4jk', '_TZ3000_r6buo8ba', '_TZ3000_iksasdbv', '_TZ3000_idrffznf', '_TZ3000_okaz9tjs', '_TZ3210_q7oryllx',
23
+ '_TZ3000_ss98ec5d', '_TZ3000_gznh2xla'];
23
24
 
24
25
  const tzLocal = {
25
26
  TS0504B_color: {
@@ -796,7 +797,8 @@ module.exports = [
796
797
  {modelID: 'TS0503B', manufacturerName: '_TZ3210_trm3l2aw'},
797
798
  {modelID: 'TS0503B', manufacturerName: '_TZ3210_95txyzbx'},
798
799
  {modelID: 'TS0503B', manufacturerName: '_TZ3210_odlghna1'},
799
- {modelID: 'TS0503B', manufacturerName: '_TZ3220_wp1k8xws'}],
800
+ {modelID: 'TS0503B', manufacturerName: '_TZ3220_wp1k8xws'},
801
+ {modelID: 'TS0503B', manufacturerName: '_TZ3210_wp1k8xws'}],
800
802
  model: 'TS0503B',
801
803
  vendor: 'TuYa',
802
804
  description: 'Zigbee RGB light',
@@ -840,14 +842,15 @@ module.exports = [
840
842
  extend: extend.light_onoff_brightness(),
841
843
  },
842
844
  {
843
- fingerprint: [{modelID: 'TS0202', manufacturerName: '_TYZB01_jytabjkb'}],
845
+ fingerprint: [{modelID: 'TS0202', manufacturerName: '_TYZB01_jytabjkb'},
846
+ {modelID: 'TS0202', manufacturerName: '_TZ3000_lltemgsf'}],
844
847
  model: 'TS0202_1',
845
848
  vendor: 'TuYa',
846
849
  description: 'Motion sensor',
847
850
  // Requires alarm_1_with_timeout https://github.com/Koenkk/zigbee2mqtt/issues/2818#issuecomment-776119586
848
851
  fromZigbee: [fz.ias_occupancy_alarm_1_with_timeout, fz.battery, fz.ignore_basic_report],
849
852
  toZigbee: [],
850
- exposes: [e.occupancy(), e.battery_low(), e.tamper(), e.battery()],
853
+ exposes: [e.occupancy(), e.battery_low(), e.linkquality()],
851
854
  },
852
855
  {
853
856
  fingerprint: [{modelID: 'TS0202', manufacturerName: '_TYZB01_dr6sduka'},
@@ -2477,7 +2480,12 @@ module.exports = [
2477
2480
  .withLocalTemperature(ea.STATE).withLocalTemperatureCalibration(-9.9, 9.9, 0.1, ea.STATE_SET)
2478
2481
  .withSystemMode(['off', 'heat'], ea.STATE_SET).withRunningState(['idle', 'heat'], ea.STATE)
2479
2482
  .withPreset(['manual', 'program']).withSensor(['internal', 'external', 'both'], ea.STATE_SET),
2480
- exposes.text('schedule', ea.STATE_SET), e.child_lock(), e.week(),
2483
+ exposes.text('schedule', ea.STATE_SET).withDescription('There are 8 periods in the schedule in total. ' +
2484
+ '6 for workdays and 2 for holidays. It should be set in the following format for each of the periods: ' +
2485
+ '`hours:minutes/temperature`. All periods should be set at once and delimited by the space symbol. ' +
2486
+ 'For example: `06:00/20.5 08:00/15 11:30/15 13:30/15 17:00/22 22:00/15 06:00/20 22:00/15`. ' +
2487
+ 'The thermostat doesn\'t report the schedule by itself even if you change it manually from device'),
2488
+ e.child_lock(), e.week(),
2481
2489
  exposes.enum('brightness_state', ea.STATE_SET, ['off', 'low', 'medium', 'high'])
2482
2490
  .withDescription('Screen brightness'),
2483
2491
  exposes.binary('sound', ea.STATE_SET, 'ON', 'OFF')
@@ -2802,7 +2810,7 @@ module.exports = [
2802
2810
  .withFeature(exposes.binary('over_leakage_current_trip', ea.STATE_SET, 'ON', 'OFF'))
2803
2811
  .withFeature(exposes.binary('over_leakage_current_alarm', ea.STATE_SET, 'ON', 'OFF'))
2804
2812
  .withFeature(exposes.binary('self_test', ea.STATE_SET, 'test', 'clear')),*/
2805
- exposes.enum('clear_device_data', ea.SET, ['clear']),
2813
+ exposes.enum('clear_device_data', ea.SET, ['']),
2806
2814
  ],
2807
2815
  },
2808
2816
  {
@@ -3019,7 +3027,7 @@ module.exports = [
3019
3027
  .withDescription('Favorite position of this cover'),
3020
3028
  exposes.binary(`reverse_direction`, ea.STATE_SET, true, false).withDescription(`Inverts the cover direction`),
3021
3029
  exposes.text('motor_type', ea.STATE),
3022
- exposes.enum('report', ea.SET, ['REPORT']),
3030
+ exposes.enum('report', ea.SET, ['']),
3023
3031
  ],
3024
3032
  },
3025
3033
  {
@@ -0,0 +1,17 @@
1
+ const extend = require('../lib/extend');
2
+ const reporting = require('../lib/reporting');
3
+
4
+ module.exports = [
5
+ {
6
+ zigbeeModel: ['Z111PL0H-1JX'],
7
+ model: 'SA-029',
8
+ vendor: 'Woolley',
9
+ description: 'Smart Plug',
10
+ extend: extend.switch(),
11
+ configure: async (device, coordinatorEndpoint, logger) => {
12
+ const endpoint = device.getEndpoint(1);
13
+ await reporting.bind(endpoint, coordinatorEndpoint, ['genOnOff']);
14
+ await reporting.onOff(endpoint);
15
+ },
16
+ },
17
+ ];
package/devices/xiaomi.js CHANGED
@@ -312,6 +312,7 @@ module.exports = [
312
312
  // set "event" mode
313
313
  await endpoint1.write('aqaraOpple', {'mode': 1}, {manufacturerCode: 0x115f, disableResponse: true});
314
314
  },
315
+ ota: ota.zigbeeOTA,
315
316
  },
316
317
  {
317
318
  zigbeeModel: ['lumi.switch.b2laus01'],
@@ -332,6 +333,7 @@ module.exports = [
332
333
  await reporting.bind(endpoint2, coordinatorEndpoint, ['genOnOff']);
333
334
  await reporting.onOff(endpoint2);
334
335
  },
336
+ ota: ota.zigbeeOTA,
335
337
  },
336
338
  {
337
339
  zigbeeModel: ['lumi.switch.b1naus01'],
@@ -344,6 +346,7 @@ module.exports = [
344
346
  await reporting.bind(endpoint, coordinatorEndpoint, ['genOnOff']);
345
347
  await reporting.onOff(endpoint);
346
348
  },
349
+ ota: ota.zigbeeOTA,
347
350
  },
348
351
  {
349
352
  zigbeeModel: ['lumi.switch.b2naus01'],
@@ -364,6 +367,7 @@ module.exports = [
364
367
  await reporting.bind(endpoint2, coordinatorEndpoint, ['genOnOff']);
365
368
  await reporting.onOff(endpoint2);
366
369
  },
370
+ ota: ota.zigbeeOTA,
367
371
  },
368
372
  {
369
373
  zigbeeModel: ['lumi.switch.n2acn1'],
@@ -737,6 +741,7 @@ module.exports = [
737
741
  await device.getEndpoint(1).write('aqaraOpple', {'mode': 1}, {manufacturerCode: 0x115f, disableResponse: true});
738
742
  },
739
743
  onEvent: preventReset,
744
+ ota: ota.zigbeeOTA,
740
745
  },
741
746
  {
742
747
  zigbeeModel: ['lumi.switch.b1nacn02'],
@@ -761,6 +766,7 @@ module.exports = [
761
766
  device.powerSource = 'Mains (single phase)';
762
767
  device.save();
763
768
  },
769
+ ota: ota.zigbeeOTA,
764
770
  },
765
771
  {
766
772
  zigbeeModel: ['lumi.switch.b2nacn02'],
@@ -1045,7 +1051,7 @@ module.exports = [
1045
1051
  'sensor detects approaching'),
1046
1052
  exposes.enum('motion_sensitivity', ea.ALL, ['low', 'medium', 'high']).withDescription('Different sensitivities ' +
1047
1053
  'means different static human body recognition rate and response speed of occupied'),
1048
- exposes.enum('reset_nopresence_status', ea.SET, ['Reset']).withDescription('Reset the status of no presence'),
1054
+ exposes.enum('reset_nopresence_status', ea.SET, ['']).withDescription('Reset the status of no presence'),
1049
1055
  e.device_temperature(), e.power_outage_count()],
1050
1056
  configure: async (device, coordinatorEndpoint, logger) => {
1051
1057
  const endpoint = device.getEndpoint(1);
@@ -1304,10 +1310,10 @@ module.exports = [
1304
1310
  exposes.numeric('gas_density', ea.STATE_GET).withUnit('%LEL').withDescription('Value of gas concentration'),
1305
1311
  exposes.enum('gas_sensitivity', ea.ALL, ['10%LEL', '15%LEL']).withDescription('Gas concentration value at which ' +
1306
1312
  'an alarm is triggered ("10%LEL" is more sensitive than "15%LEL")'),
1307
- exposes.enum('selftest', ea.SET, ['Test']).withDescription('Starts the self-test process (checking the indicator ' +
1313
+ exposes.enum('selftest', ea.SET, ['']).withDescription('Starts the self-test process (checking the indicator ' +
1308
1314
  'light and buzzer work properly)'),
1309
1315
  exposes.binary('test', ea.STATE, true, false).withDescription('Self-test in progress'),
1310
- exposes.enum('mute_buzzer', ea.SET, ['Mute']).withDescription('Mute the buzzer for 10 minutes (buzzer cannot be ' +
1316
+ exposes.enum('mute_buzzer', ea.SET, ['']).withDescription('Mute the buzzer for 10 minutes (buzzer cannot be ' +
1311
1317
  'pre-muted, because this function only works when the alarm is triggered)'),
1312
1318
  exposes.binary('mute', ea.STATE_GET, true, false).withDescription('Buzzer muted'),
1313
1319
  exposes.binary('linkage_alarm', ea.ALL, true, false).withDescription('When this option is enabled and a gas leak ' +
@@ -1338,10 +1344,10 @@ module.exports = [
1338
1344
  exposes: [e.smoke().withAccess(ea.STATE_GET),
1339
1345
  exposes.numeric('smoke_density', ea.STATE_GET).withDescription('Value of smoke concentration'),
1340
1346
  exposes.numeric('smoke_density_dbm', ea.STATE).withUnit('dB/m').withDescription('Value of smoke concentration in dB/m'),
1341
- exposes.enum('selftest', ea.SET, ['Test']).withDescription('Starts the self-test process (checking the indicator ' +
1347
+ exposes.enum('selftest', ea.SET, ['']).withDescription('Starts the self-test process (checking the indicator ' +
1342
1348
  'light and buzzer work properly)'),
1343
1349
  exposes.binary('test', ea.STATE, true, false).withDescription('Self-test in progress'),
1344
- exposes.enum('mute_buzzer', ea.SET, ['Mute']).withDescription('Mute the buzzer for 80 seconds (buzzer cannot be ' +
1350
+ exposes.enum('mute_buzzer', ea.SET, ['']).withDescription('Mute the buzzer for 80 seconds (buzzer cannot be ' +
1345
1351
  'pre-muted, because this function only works when the alarm is triggered)'),
1346
1352
  exposes.binary('mute', ea.STATE_GET, true, false).withDescription('Buzzer muted'),
1347
1353
  exposes.binary('heartbeat_indicator', ea.ALL, true, false).withDescription('When this option is enabled then in ' +
@@ -1392,6 +1398,7 @@ module.exports = [
1392
1398
  fromZigbee: [fz.DJT12LM_vibration],
1393
1399
  exposes: [e.action(['vibration'])],
1394
1400
  toZigbee: [],
1401
+ ota: ota.zigbeeOTA,
1395
1402
  },
1396
1403
  {
1397
1404
  zigbeeModel: ['lumi.curtain'],
@@ -1681,6 +1688,7 @@ module.exports = [
1681
1688
  vendor: 'Xiaomi',
1682
1689
  description: 'Aqara smart RGBW light controller',
1683
1690
  extend: extend.light_onoff_brightness_colortemp_color({supportsHS: true}),
1691
+ ota: ota.zigbeeOTA,
1684
1692
  },
1685
1693
  {
1686
1694
  zigbeeModel: ['lumi.light.cbacn1'],
@@ -1688,6 +1696,7 @@ module.exports = [
1688
1696
  vendor: 'Xiaomi',
1689
1697
  description: 'Aqara zigbee LED-controller ',
1690
1698
  extend: extend.light_onoff_brightness(),
1699
+ ota: ota.zigbeeOTA,
1691
1700
  },
1692
1701
  {
1693
1702
  zigbeeModel: ['lumi.switch.n0agl1'],
@@ -1771,37 +1780,37 @@ module.exports = [
1771
1780
  },
1772
1781
  exposes: [e.switch().withEndpoint('left'), e.switch().withEndpoint('center'),
1773
1782
  e.switch().withEndpoint('right'),
1774
- exposes.binary('standby_enabled', ea.SET, true, false).withDescription('Enable standby'),
1775
- exposes.enum('theme', ea.SET, ['classic', 'concise']).withDescription('Display theme'),
1776
- exposes.enum('beep_volume', ea.SET, ['mute', 'low', 'medium', 'high']).withDescription('Beep volume'),
1777
- exposes.numeric('lcd_brightness', ea.SET).withValueMin(1).withValueMax(100).withUnit('%')
1783
+ exposes.binary('standby_enabled', ea.STATE_SET, true, false).withDescription('Enable standby'),
1784
+ exposes.enum('theme', ea.STATE_SET, ['classic', 'concise']).withDescription('Display theme'),
1785
+ exposes.enum('beep_volume', ea.STATE_SET, ['mute', 'low', 'medium', 'high']).withDescription('Beep volume'),
1786
+ exposes.numeric('lcd_brightness', ea.STATE_SET).withValueMin(1).withValueMax(100).withUnit('%')
1778
1787
  .withDescription('LCD brightness (will not persist if auto-brightness is enabled)'),
1779
- exposes.enum('language', ea.SET, ['chinese', 'english']).withDescription('Interface language'),
1780
- exposes.enum('screen_saver_style', ea.SET, ['classic', 'analog clock']).withDescription('Screen saver style'),
1781
- exposes.numeric('standby_time', ea.SET).withValueMin(0).withValueMax(65534).withUnit('s')
1788
+ exposes.enum('language', ea.STATE_SET, ['chinese', 'english']).withDescription('Interface language'),
1789
+ exposes.enum('screen_saver_style', ea.STATE_SET, ['classic', 'analog clock']).withDescription('Screen saver style'),
1790
+ exposes.numeric('standby_time', ea.STATE_SET).withValueMin(0).withValueMax(65534).withUnit('s')
1782
1791
  .withDescription('Display standby time'),
1783
- exposes.enum('font_size', ea.SET, ['small', 'medium', 'large']).withDescription('Display font size'),
1784
- exposes.binary('lcd_auto_brightness_enabled', ea.SET, true, false).withDescription('Enable LCD auto brightness'),
1785
- exposes.enum('homepage', ea.SET, ['scene', 'feel', 'thermostat', 'switch']).withDescription('Default display homepage'),
1786
- exposes.binary('screen_saver_enabled', ea.SET, true, false).withDescription('Enable screen saver'),
1787
- exposes.numeric('standby_lcd_brightness', ea.SET).withValueMin(1).withValueMax(100).withUnit('%')
1792
+ exposes.enum('font_size', ea.STATE_SET, ['small', 'medium', 'large']).withDescription('Display font size'),
1793
+ exposes.binary('lcd_auto_brightness_enabled', ea.STATE_SET, true, false).withDescription('Enable LCD auto brightness'),
1794
+ exposes.enum('homepage', ea.STATE_SET, ['scene', 'feel', 'thermostat', 'switch']).withDescription('Default display homepage'),
1795
+ exposes.binary('screen_saver_enabled', ea.STATE_SET, true, false).withDescription('Enable screen saver'),
1796
+ exposes.numeric('standby_lcd_brightness', ea.STATE_SET).withValueMin(1).withValueMax(100).withUnit('%')
1788
1797
  .withDescription('Standby LCD brightness'),
1789
- exposes.enum('available_switches', ea.SET, ['none', '1', '2', '3', '1 and 2', '1 and 3', '2 and 3', 'all'])
1798
+ exposes.enum('available_switches', ea.STATE_SET, ['none', '1', '2', '3', '1 and 2', '1 and 3', '2 and 3', 'all'])
1790
1799
  .withDescription('Control which switches are available in the switches screen (none disables switches screen)'),
1791
1800
  exposes.composite('switch_1_text_icon', 'switch_1_text_icon').withDescription('Switch 1 text and icon')
1792
- .withFeature(exposes.enum('switch_1_icon', ea.SET, ['1', '2', '3', '4', '5', '6', '7', '8', '9', '10', '11'])
1801
+ .withFeature(exposes.enum('switch_1_icon', ea.STATE_SET, ['1', '2', '3', '4', '5', '6', '7', '8', '9', '10', '11'])
1793
1802
  .withDescription('Icon'))
1794
- .withFeature(exposes.text('switch_1_text', ea.SET)
1803
+ .withFeature(exposes.text('switch_1_text', ea.STATE_SET)
1795
1804
  .withDescription('Text')),
1796
1805
  exposes.composite('switch_2_text_icon', 'switch_2_text_icon').withDescription('Switch 2 text and icon')
1797
- .withFeature(exposes.enum('switch_2_icon', ea.SET, ['1', '2', '3', '4', '5', '6', '7', '8', '9', '10', '11'])
1806
+ .withFeature(exposes.enum('switch_2_icon', ea.STATE_SET, ['1', '2', '3', '4', '5', '6', '7', '8', '9', '10', '11'])
1798
1807
  .withDescription('Icon'))
1799
- .withFeature(exposes.text('switch_2_text', ea.SET)
1808
+ .withFeature(exposes.text('switch_2_text', ea.STATE_SET)
1800
1809
  .withDescription('Text')),
1801
1810
  exposes.composite('switch_3_text_icon', 'switch_3_text_icon').withDescription('Switch 3 text and icon')
1802
- .withFeature(exposes.enum('switch_3_icon', ea.SET, ['1', '2', '3', '4', '5', '6', '7', '8', '9', '10', '11'])
1811
+ .withFeature(exposes.enum('switch_3_icon', ea.STATE_SET, ['1', '2', '3', '4', '5', '6', '7', '8', '9', '10', '11'])
1803
1812
  .withDescription('Icon'))
1804
- .withFeature(exposes.text('switch_3_text', ea.SET)
1813
+ .withFeature(exposes.text('switch_3_text', ea.STATE_SET)
1805
1814
  .withDescription('Text'))],
1806
1815
  configure: async (device, coordinatorEndpoint, logger) => {
1807
1816
  await reporting.bind(device.getEndpoint(1), coordinatorEndpoint, ['genOnOff']);
@@ -1811,6 +1820,7 @@ module.exports = [
1811
1820
  // await reporting.onOff(device.getEndpoint(2)); ToDo: Currently fails
1812
1821
  // await reporting.onOff(device.getEndpoint(3)); ToDo: Currently fails
1813
1822
  },
1823
+ ota: ota.zigbeeOTA,
1814
1824
  },
1815
1825
  {
1816
1826
  zigbeeModel: ['lumi.remote.b28ac1'],
package/lib/utils.js CHANGED
@@ -114,7 +114,10 @@ function addActionGroup(payload, msg, definition) {
114
114
 
115
115
  function postfixWithEndpointName(value, msg, definition, meta) {
116
116
  // Prevent breaking change https://github.com/Koenkk/zigbee2mqtt/issues/13451
117
- if (!meta) meta = {device: null};
117
+ if (!meta) {
118
+ meta.logger.warn(`No meta passed to postfixWithEndpointName, update your external converter!`);
119
+ meta = {device: null};
120
+ }
118
121
  if (definition.meta && definition.meta.multiEndpoint) {
119
122
  const endpointName = definition.hasOwnProperty('endpoint') ?
120
123
  getKey(definition.endpoint(meta.device), msg.endpoint.ID) : msg.endpoint.ID;
package/lib/xiaomi.js CHANGED
@@ -219,7 +219,8 @@ const numericAttributes2Payload = (msg, meta, model, options, dataObject) => {
219
219
  payload[`state_${mapping}`] = value === 1 ? 'ON' : 'OFF';
220
220
  } else if (['WXKG14LM', 'WXKG16LM', 'WXKG17LM'].includes(model.model)) {
221
221
  payload.click_mode = {1: 'fast', 2: 'multi'}[value];
222
- } else if (['WXCJKG11LM', 'WXCJKG12LM', 'WXCJKG13LM', 'ZNMS12LM', 'RTCGQ14LM', 'ZNCLBL01LM'].includes(model.model)) {
222
+ } else if (['WXCJKG11LM', 'WXCJKG12LM', 'WXCJKG13LM', 'ZNMS12LM', 'ZNCLBL01LM', 'RTCGQ12LM', 'RTCGQ13LM', 'RTCGQ14LM',
223
+ 'RTCGQ15LM'].includes(model.model)) {
223
224
  // We don't know what the value means for these devices.
224
225
  // https://github.com/Koenkk/zigbee2mqtt/issues/11126
225
226
  // https://github.com/Koenkk/zigbee2mqtt/issues/12279
@@ -268,7 +269,7 @@ const numericAttributes2Payload = (msg, meta, model, options, dataObject) => {
268
269
  mapping = 'right';
269
270
  }
270
271
  payload[`state_${mapping}`] = value === 1 ? 'ON' : 'OFF';
271
- } else if (['RTCGQ12LM', 'RTCGQ14LM'].includes(model.model)) {
272
+ } else if (['RTCGQ12LM', 'RTCGQ14LM', 'RTCGQ15LM'].includes(model.model)) {
272
273
  // Sometimes RTCGQ14LM reports high illuminance values in the dark
273
274
  // https://github.com/Koenkk/zigbee2mqtt/issues/12596
274
275
  const illuminance = value > 65000 ? 0 : value;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "zigbee-herdsman-converters",
3
- "version": "14.0.592",
3
+ "version": "14.0.595",
4
4
  "description": "Collection of device converters to be used with zigbee-herdsman",
5
5
  "main": "index.js",
6
6
  "files": [