zigbee-herdsman-converters 14.0.591 → 14.0.594

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.
@@ -1556,7 +1556,7 @@ const converters = {
1556
1556
  result[postfixWithEndpointName('tilt', msg, model, meta)] = invert ? value : 100 - value;
1557
1557
  if (coverStateFromTilt) {
1558
1558
  result[postfixWithEndpointName('state', msg, model, meta)] =
1559
- invert ? (value === 100 ? 'CLOSE' : 'OPEN') : (value === 0 ? 'CLOSE' : 'OPEN');
1559
+ invert ? (value === 100 ? 'OPEN' : 'CLOSE') : (value === 0 ? 'OPEN' : 'CLOSE');
1560
1560
  }
1561
1561
  }
1562
1562
  return result;
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/gewiss.js CHANGED
@@ -39,8 +39,8 @@ module.exports = [
39
39
  toZigbee: [tz.cover_state, tz.cover_position_tilt],
40
40
  configure: async (device, coordinatorEndpoint, logger) => {
41
41
  const endpoint = device.getEndpoint(1);
42
- await reporting.bind(endpoint, coordinatorEndpoint, ['genLevelCtrl']);
43
- await reporting.brightness(endpoint);
42
+ await reporting.bind(endpoint, coordinatorEndpoint, ['closuresWindowCovering']);
43
+ await reporting.currentPositionLiftPercentage(endpoint);
44
44
  },
45
45
  exposes: [e.cover_position()],
46
46
  },
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',
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',
@@ -1325,7 +1325,7 @@ module.exports = [
1325
1325
  extend: hueExtend.light_onoff_brightness_colortemp(),
1326
1326
  },
1327
1327
  {
1328
- zigbeeModel: ['LTP002'],
1328
+ zigbeeModel: ['LTP002', '929003054901'],
1329
1329
  model: '4023330P7',
1330
1330
  vendor: 'Philips',
1331
1331
  description: 'Hue white ambiance suspension Amaze',
@@ -1,6 +1,7 @@
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');
4
5
  const ea = exposes.access;
5
6
 
6
7
  module.exports = [
@@ -49,6 +50,14 @@ module.exports = [
49
50
  ea.STATE_SET).withColor(['hs']),
50
51
  ],
51
52
  },
53
+ {
54
+ fingerprint: [{modelID: 'TS0503B', manufacturerName: '_TZB210_zdvrsts8'}],
55
+ model: 'WZ5_rgb_1',
56
+ vendor: 'TuYa',
57
+ description: 'Zigbee & RF 5 in 1 LED controller (RGB mode)',
58
+ extend: extend.light_onoff_brightness_color({supportsHS: true, preferHS: true, disableEffect: true}),
59
+ meta: {applyRedFix: true, enhancedHue: false},
60
+ },
52
61
  {
53
62
  fingerprint: [
54
63
  {modelID: 'TS0601', manufacturerName: '_TZE200_3thxjahu'},
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
@@ -1007,6 +1007,26 @@ module.exports = [
1007
1007
  },
1008
1008
  ota: ota.zigbeeOTA,
1009
1009
  },
1010
+ {
1011
+ zigbeeModel: ['lumi.motion.acn001'],
1012
+ model: 'RTCGQ15LM',
1013
+ vendor: 'Xiaomi',
1014
+ description: 'Aqara E1 human body movement and illuminance sensor',
1015
+ fromZigbee: [fz.aqara_occupancy_illuminance, fz.aqara_opple, fz.battery],
1016
+ toZigbee: [tz.aqara_detection_interval],
1017
+ exposes: [e.occupancy(), e.illuminance_lux().withProperty('illuminance'),
1018
+ e.illuminance().withUnit('lx').withDescription('Measured illuminance in lux'),
1019
+ exposes.numeric('detection_interval', ea.ALL).withValueMin(2).withValueMax(65535).withUnit('s')
1020
+ .withDescription('Time interval for detecting actions'),
1021
+ e.device_temperature(), e.battery(), e.battery_voltage(), e.power_outage_count(false)],
1022
+ meta: {battery: {voltageToPercentage: '3V_2850_3200'}},
1023
+ configure: async (device, coordinatorEndpoint, logger) => {
1024
+ const endpoint = device.getEndpoint(1);
1025
+ await endpoint.read('genPowerCfg', ['batteryVoltage']);
1026
+ await endpoint.read('aqaraOpple', [0x0102], {manufacturerCode: 0x115f});
1027
+ },
1028
+ ota: ota.zigbeeOTA,
1029
+ },
1010
1030
  {
1011
1031
  zigbeeModel: ['lumi.motion.ac01'],
1012
1032
  model: 'RTCZCGQ11LM',
@@ -1025,7 +1045,7 @@ module.exports = [
1025
1045
  'sensor detects approaching'),
1026
1046
  exposes.enum('motion_sensitivity', ea.ALL, ['low', 'medium', 'high']).withDescription('Different sensitivities ' +
1027
1047
  'means different static human body recognition rate and response speed of occupied'),
1028
- exposes.enum('reset_nopresence_status', ea.SET, ['Reset']).withDescription('Reset the status of no presence'),
1048
+ exposes.enum('reset_nopresence_status', ea.SET, ['']).withDescription('Reset the status of no presence'),
1029
1049
  e.device_temperature(), e.power_outage_count()],
1030
1050
  configure: async (device, coordinatorEndpoint, logger) => {
1031
1051
  const endpoint = device.getEndpoint(1);
@@ -1284,10 +1304,10 @@ module.exports = [
1284
1304
  exposes.numeric('gas_density', ea.STATE_GET).withUnit('%LEL').withDescription('Value of gas concentration'),
1285
1305
  exposes.enum('gas_sensitivity', ea.ALL, ['10%LEL', '15%LEL']).withDescription('Gas concentration value at which ' +
1286
1306
  'an alarm is triggered ("10%LEL" is more sensitive than "15%LEL")'),
1287
- exposes.enum('selftest', ea.SET, ['Test']).withDescription('Starts the self-test process (checking the indicator ' +
1307
+ exposes.enum('selftest', ea.SET, ['']).withDescription('Starts the self-test process (checking the indicator ' +
1288
1308
  'light and buzzer work properly)'),
1289
1309
  exposes.binary('test', ea.STATE, true, false).withDescription('Self-test in progress'),
1290
- exposes.enum('mute_buzzer', ea.SET, ['Mute']).withDescription('Mute the buzzer for 10 minutes (buzzer cannot be ' +
1310
+ exposes.enum('mute_buzzer', ea.SET, ['']).withDescription('Mute the buzzer for 10 minutes (buzzer cannot be ' +
1291
1311
  'pre-muted, because this function only works when the alarm is triggered)'),
1292
1312
  exposes.binary('mute', ea.STATE_GET, true, false).withDescription('Buzzer muted'),
1293
1313
  exposes.binary('linkage_alarm', ea.ALL, true, false).withDescription('When this option is enabled and a gas leak ' +
@@ -1318,10 +1338,10 @@ module.exports = [
1318
1338
  exposes: [e.smoke().withAccess(ea.STATE_GET),
1319
1339
  exposes.numeric('smoke_density', ea.STATE_GET).withDescription('Value of smoke concentration'),
1320
1340
  exposes.numeric('smoke_density_dbm', ea.STATE).withUnit('dB/m').withDescription('Value of smoke concentration in dB/m'),
1321
- exposes.enum('selftest', ea.SET, ['Test']).withDescription('Starts the self-test process (checking the indicator ' +
1341
+ exposes.enum('selftest', ea.SET, ['']).withDescription('Starts the self-test process (checking the indicator ' +
1322
1342
  'light and buzzer work properly)'),
1323
1343
  exposes.binary('test', ea.STATE, true, false).withDescription('Self-test in progress'),
1324
- exposes.enum('mute_buzzer', ea.SET, ['Mute']).withDescription('Mute the buzzer for 80 seconds (buzzer cannot be ' +
1344
+ exposes.enum('mute_buzzer', ea.SET, ['']).withDescription('Mute the buzzer for 80 seconds (buzzer cannot be ' +
1325
1345
  'pre-muted, because this function only works when the alarm is triggered)'),
1326
1346
  exposes.binary('mute', ea.STATE_GET, true, false).withDescription('Buzzer muted'),
1327
1347
  exposes.binary('heartbeat_indicator', ea.ALL, true, false).withDescription('When this option is enabled then in ' +
@@ -1751,37 +1771,37 @@ module.exports = [
1751
1771
  },
1752
1772
  exposes: [e.switch().withEndpoint('left'), e.switch().withEndpoint('center'),
1753
1773
  e.switch().withEndpoint('right'),
1754
- exposes.binary('standby_enabled', ea.SET, true, false).withDescription('Enable standby'),
1755
- exposes.enum('theme', ea.SET, ['classic', 'concise']).withDescription('Display theme'),
1756
- exposes.enum('beep_volume', ea.SET, ['mute', 'low', 'medium', 'high']).withDescription('Beep volume'),
1757
- exposes.numeric('lcd_brightness', ea.SET).withValueMin(1).withValueMax(100).withUnit('%')
1774
+ exposes.binary('standby_enabled', ea.STATE_SET, true, false).withDescription('Enable standby'),
1775
+ exposes.enum('theme', ea.STATE_SET, ['classic', 'concise']).withDescription('Display theme'),
1776
+ exposes.enum('beep_volume', ea.STATE_SET, ['mute', 'low', 'medium', 'high']).withDescription('Beep volume'),
1777
+ exposes.numeric('lcd_brightness', ea.STATE_SET).withValueMin(1).withValueMax(100).withUnit('%')
1758
1778
  .withDescription('LCD brightness (will not persist if auto-brightness is enabled)'),
1759
- exposes.enum('language', ea.SET, ['chinese', 'english']).withDescription('Interface language'),
1760
- exposes.enum('screen_saver_style', ea.SET, ['classic', 'analog clock']).withDescription('Screen saver style'),
1761
- exposes.numeric('standby_time', ea.SET).withValueMin(0).withValueMax(65534).withUnit('s')
1779
+ exposes.enum('language', ea.STATE_SET, ['chinese', 'english']).withDescription('Interface language'),
1780
+ exposes.enum('screen_saver_style', ea.STATE_SET, ['classic', 'analog clock']).withDescription('Screen saver style'),
1781
+ exposes.numeric('standby_time', ea.STATE_SET).withValueMin(0).withValueMax(65534).withUnit('s')
1762
1782
  .withDescription('Display standby time'),
1763
- exposes.enum('font_size', ea.SET, ['small', 'medium', 'large']).withDescription('Display font size'),
1764
- exposes.binary('lcd_auto_brightness_enabled', ea.SET, true, false).withDescription('Enable LCD auto brightness'),
1765
- exposes.enum('homepage', ea.SET, ['scene', 'feel', 'thermostat', 'switch']).withDescription('Default display homepage'),
1766
- exposes.binary('screen_saver_enabled', ea.SET, true, false).withDescription('Enable screen saver'),
1767
- exposes.numeric('standby_lcd_brightness', ea.SET).withValueMin(1).withValueMax(100).withUnit('%')
1783
+ exposes.enum('font_size', ea.STATE_SET, ['small', 'medium', 'large']).withDescription('Display font size'),
1784
+ exposes.binary('lcd_auto_brightness_enabled', ea.STATE_SET, true, false).withDescription('Enable LCD auto brightness'),
1785
+ exposes.enum('homepage', ea.STATE_SET, ['scene', 'feel', 'thermostat', 'switch']).withDescription('Default display homepage'),
1786
+ exposes.binary('screen_saver_enabled', ea.STATE_SET, true, false).withDescription('Enable screen saver'),
1787
+ exposes.numeric('standby_lcd_brightness', ea.STATE_SET).withValueMin(1).withValueMax(100).withUnit('%')
1768
1788
  .withDescription('Standby LCD brightness'),
1769
- exposes.enum('available_switches', ea.SET, ['none', '1', '2', '3', '1 and 2', '1 and 3', '2 and 3', 'all'])
1789
+ exposes.enum('available_switches', ea.STATE_SET, ['none', '1', '2', '3', '1 and 2', '1 and 3', '2 and 3', 'all'])
1770
1790
  .withDescription('Control which switches are available in the switches screen (none disables switches screen)'),
1771
1791
  exposes.composite('switch_1_text_icon', 'switch_1_text_icon').withDescription('Switch 1 text and icon')
1772
- .withFeature(exposes.enum('switch_1_icon', ea.SET, ['1', '2', '3', '4', '5', '6', '7', '8', '9', '10', '11'])
1792
+ .withFeature(exposes.enum('switch_1_icon', ea.STATE_SET, ['1', '2', '3', '4', '5', '6', '7', '8', '9', '10', '11'])
1773
1793
  .withDescription('Icon'))
1774
- .withFeature(exposes.text('switch_1_text', ea.SET)
1794
+ .withFeature(exposes.text('switch_1_text', ea.STATE_SET)
1775
1795
  .withDescription('Text')),
1776
1796
  exposes.composite('switch_2_text_icon', 'switch_2_text_icon').withDescription('Switch 2 text and icon')
1777
- .withFeature(exposes.enum('switch_2_icon', ea.SET, ['1', '2', '3', '4', '5', '6', '7', '8', '9', '10', '11'])
1797
+ .withFeature(exposes.enum('switch_2_icon', ea.STATE_SET, ['1', '2', '3', '4', '5', '6', '7', '8', '9', '10', '11'])
1778
1798
  .withDescription('Icon'))
1779
- .withFeature(exposes.text('switch_2_text', ea.SET)
1799
+ .withFeature(exposes.text('switch_2_text', ea.STATE_SET)
1780
1800
  .withDescription('Text')),
1781
1801
  exposes.composite('switch_3_text_icon', 'switch_3_text_icon').withDescription('Switch 3 text and icon')
1782
- .withFeature(exposes.enum('switch_3_icon', ea.SET, ['1', '2', '3', '4', '5', '6', '7', '8', '9', '10', '11'])
1802
+ .withFeature(exposes.enum('switch_3_icon', ea.STATE_SET, ['1', '2', '3', '4', '5', '6', '7', '8', '9', '10', '11'])
1783
1803
  .withDescription('Icon'))
1784
- .withFeature(exposes.text('switch_3_text', ea.SET)
1804
+ .withFeature(exposes.text('switch_3_text', ea.STATE_SET)
1785
1805
  .withDescription('Text'))],
1786
1806
  configure: async (device, coordinatorEndpoint, logger) => {
1787
1807
  await reporting.bind(device.getEndpoint(1), coordinatorEndpoint, ['genOnOff']);
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.591",
3
+ "version": "14.0.594",
4
4
  "description": "Collection of device converters to be used with zigbee-herdsman",
5
5
  "main": "index.js",
6
6
  "files": [