zigbee-herdsman-converters 14.0.446 → 14.0.449

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.
@@ -2031,7 +2031,7 @@ const converters = {
2031
2031
  await entity.read('genBasic', [0x0033], manufacturerOptions.hue);
2032
2032
  },
2033
2033
  },
2034
- RTCGQ13LM_motion_sensitivity: {
2034
+ aqara_motion_sensitivity: {
2035
2035
  key: ['motion_sensitivity'],
2036
2036
  convertSet: async (entity, key, value, meta) => {
2037
2037
  const lookup = {'low': 1, 'medium': 2, 'high': 3};
@@ -2074,6 +2074,12 @@ const converters = {
2074
2074
  await entity.read('aqaraOpple', [0x0146], manufacturerOptions.xiaomi);
2075
2075
  },
2076
2076
  },
2077
+ RTCZCGQ11LM_reset_nopresence_status: {
2078
+ key: ['reset_nopresence_status'],
2079
+ convertSet: async (entity, key, value, meta) => {
2080
+ await entity.write('aqaraOpple', {0x0157: {value: 1, type: 0x20}}, manufacturerOptions.xiaomi);
2081
+ },
2082
+ },
2077
2083
  ZigUP_lock: {
2078
2084
  key: ['led'],
2079
2085
  convertSet: async (entity, key, value, meta) => {
@@ -13,7 +13,7 @@ const tzLocal = {
13
13
  convertSet: async (entity, key, value, meta) => {
14
14
  const state = value.toLowerCase();
15
15
  utils.validateValue(state, ['toggle', 'off', 'on']);
16
- const endpoint = meta.mapped.model === 'AU-A1ZBDSS' ? meta.device.getEndpoint(2) : meta.device.getEndpoint(3);
16
+ const endpoint = meta.device.getEndpoint(3);
17
17
  await endpoint.command('genOnOff', state, {});
18
18
  return {state: {backlight_led: state.toUpperCase()}};
19
19
  },
@@ -184,8 +184,9 @@ module.exports = [
184
184
  fromZigbee: [fz.identify, fz.on_off, fz.electrical_measurement],
185
185
  exposes: [e.switch().withEndpoint('left'), e.switch().withEndpoint('right'),
186
186
  e.power().withEndpoint('left'), e.power().withEndpoint('right'),
187
- exposes.binary('backlight_led', ea.STATE_SET, 'ON', 'OFF').withDescription('Enable or disable the blue backlight LED')],
188
- toZigbee: [tz.on_off, tzLocal.aOneBacklight],
187
+ exposes.numeric('brightness', ea.ALL).withValueMin(0).withValueMax(254)
188
+ .withDescription('Brightness of this backlight LED')],
189
+ toZigbee: [tz.light_onoff_brightness],
189
190
  meta: {multiEndpoint: true},
190
191
  endpoint: (device) => {
191
192
  return {'left': 1, 'right': 2};
package/devices/awox.js CHANGED
@@ -70,10 +70,28 @@ module.exports = [
70
70
  },
71
71
  {
72
72
  fingerprint: [
73
- {type: 'Router', manufacturerName: 'AwoX', modelID: 'TLSR82xx', endpoints: [
74
- {ID: 1, profileID: 260, deviceID: 2028, inputClusters: [0, 3, 4, 4096], outputClusters: [0, 3, 4, 5, 6, 8, 768, 4096]},
75
- {ID: 3, profileID: 4751, deviceID: 2048, inputClusters: [65360, 65361], outputClusters: [65360, 65361]},
76
- ]},
73
+ {
74
+ type: 'EndDevice',
75
+ manufacturerName: 'AwoX',
76
+ modelID: 'TLSR82xx',
77
+ powerSource: 'Battery',
78
+ endpoints: [
79
+ {
80
+ ID: 1,
81
+ profileID: 260,
82
+ deviceID: 2048,
83
+ inputClusters: [0, 3, 4, 4096],
84
+ outputClusters: [0, 3, 4, 5, 6, 8, 768, 4096],
85
+ },
86
+ {
87
+ ID: 3,
88
+ profileID: 4751,
89
+ deviceID: 2048,
90
+ inputClusters: [65360, 65361],
91
+ outputClusters: [65360, 65361],
92
+ },
93
+ ],
94
+ },
77
95
  ],
78
96
  model: '33952',
79
97
  vendor: 'AwoX',
@@ -87,24 +105,80 @@ module.exports = [
87
105
  },
88
106
  {
89
107
  fingerprint: [
90
- {type: 'Router', manufacturerName: 'AwoX', modelID: 'TLSR82xx', endpoints: [
91
- {ID: 1, profileID: 260, deviceID: 269, inputClusters: [0, 3, 4, 5, 6, 8, 768, 4096, 64599, 10], outputClusters: [6]},
92
- {ID: 3, profileID: 4751, deviceID: 269, inputClusters: [65360, 65361], outputClusters: [65360, 65361]},
93
- {ID: 242, profileID: 41440, deviceID: 97, inputClusters: [], outputClusters: [33]},
94
- ]},
95
- {type: 'Router', manufacturerName: 'AwoX', modelID: 'TLSR82xx', endpoints: [
96
- {ID: 1, profileID: 260, deviceID: 258, inputClusters: [0, 3, 4, 5, 6, 8, 768, 4096], outputClusters: [6, 25]},
97
- {ID: 3, profileID: 49152, deviceID: 258, inputClusters: [65360, 65361], outputClusters: [65360, 65361]},
98
- ]},
99
- {type: 'Router', manufacturerName: 'AwoX', modelID: 'TLSR82xx', endpoints: [
100
- {ID: 1, profileID: 260, deviceID: 269, inputClusters: [0, 3, 4, 5, 6, 8, 768, 4096, 64599], outputClusters: [6]},
101
- {ID: 3, profileID: 4751, deviceID: 269, inputClusters: [65360, 65361], outputClusters: [65360, 65361]},
102
- {ID: 242, profileID: 41440, deviceID: 97, inputClusters: [], outputClusters: [33]},
103
- ]},
104
- {type: 'Router', manufacturerName: 'AwoX', modelID: 'TLSR82xx', endpoints: [
105
- {ID: 1, profileID: 260, deviceID: 269, inputClusters: [0, 3, 4, 5, 6, 8, 768, 4096, 64599], outputClusters: [6]},
106
- {ID: 3, profileID: 4751, deviceID: 269, inputClusters: [65360, 65361], outputClusters: [65360, 65361]},
107
- ]},
108
+ {
109
+ type: 'Router', manufacturerName: 'AwoX', modelID: 'TLSR82xx', endpoints: [
110
+ {
111
+ ID: 1,
112
+ profileID: 260,
113
+ deviceID: 269,
114
+ inputClusters: [0, 3, 4, 5, 6, 8, 768, 4096, 64599, 10],
115
+ outputClusters: [6],
116
+ },
117
+ {
118
+ ID: 3,
119
+ profileID: 4751,
120
+ deviceID: 269,
121
+ inputClusters: [65360, 65361],
122
+ outputClusters: [65360, 65361],
123
+ },
124
+ {ID: 242, profileID: 41440, deviceID: 97, inputClusters: [], outputClusters: [33]},
125
+ ],
126
+ },
127
+ {
128
+ type: 'Router', manufacturerName: 'AwoX', modelID: 'TLSR82xx', endpoints: [
129
+ {
130
+ ID: 1,
131
+ profileID: 260,
132
+ deviceID: 258,
133
+ inputClusters: [0, 3, 4, 5, 6, 8, 768, 4096],
134
+ outputClusters: [6, 25],
135
+ },
136
+ {
137
+ ID: 3,
138
+ profileID: 49152,
139
+ deviceID: 258,
140
+ inputClusters: [65360, 65361],
141
+ outputClusters: [65360, 65361],
142
+ },
143
+ ],
144
+ },
145
+ {
146
+ type: 'Router', manufacturerName: 'AwoX', modelID: 'TLSR82xx', endpoints: [
147
+ {
148
+ ID: 1,
149
+ profileID: 260,
150
+ deviceID: 269,
151
+ inputClusters: [0, 3, 4, 5, 6, 8, 768, 4096, 64599],
152
+ outputClusters: [6],
153
+ },
154
+ {
155
+ ID: 3,
156
+ profileID: 4751,
157
+ deviceID: 269,
158
+ inputClusters: [65360, 65361],
159
+ outputClusters: [65360, 65361],
160
+ },
161
+ {ID: 242, profileID: 41440, deviceID: 97, inputClusters: [], outputClusters: [33]},
162
+ ],
163
+ },
164
+ {
165
+ type: 'Router', manufacturerName: 'AwoX', modelID: 'TLSR82xx', endpoints: [
166
+ {
167
+ ID: 1,
168
+ profileID: 260,
169
+ deviceID: 269,
170
+ inputClusters: [0, 3, 4, 5, 6, 8, 768, 4096, 64599],
171
+ outputClusters: [6],
172
+ },
173
+ {
174
+ ID: 3,
175
+ profileID: 4751,
176
+ deviceID: 269,
177
+ inputClusters: [65360, 65361],
178
+ outputClusters: [65360, 65361],
179
+ },
180
+ ],
181
+ },
108
182
  ],
109
183
  model: '33943/33944/33946',
110
184
  vendor: 'AwoX',
@@ -113,15 +187,43 @@ module.exports = [
113
187
  },
114
188
  {
115
189
  fingerprint: [
116
- {type: 'Router', manufacturerName: 'AwoX', modelID: 'TLSR82xx', endpoints: [
117
- {ID: 1, profileID: 260, deviceID: 268, inputClusters: [0, 3, 4, 5, 6, 8, 768, 4096, 64599], outputClusters: [6]},
118
- {ID: 3, profileID: 4751, deviceID: 268, inputClusters: [65360, 65361], outputClusters: [65360, 65361]},
119
- ]},
120
- {type: 'Router', manufacturerName: 'AwoX', modelID: 'TLSR82xx', endpoints: [
121
- {ID: 1, profileID: 260, deviceID: 268, inputClusters: [0, 3, 4, 5, 6, 8, 768, 4096, 64599], outputClusters: [6]},
122
- {ID: 242, profileID: 41440, deviceID: 97, inputClusters: [], outputClusters: [33]},
123
- {ID: 3, profileID: 4751, deviceID: 268, inputClusters: [65360, 65361], outputClusters: [65360, 65361]},
124
- ]},
190
+ {
191
+ type: 'Router', manufacturerName: 'AwoX', modelID: 'TLSR82xx', endpoints: [
192
+ {
193
+ ID: 1,
194
+ profileID: 260,
195
+ deviceID: 268,
196
+ inputClusters: [0, 3, 4, 5, 6, 8, 768, 4096, 64599],
197
+ outputClusters: [6],
198
+ },
199
+ {
200
+ ID: 3,
201
+ profileID: 4751,
202
+ deviceID: 268,
203
+ inputClusters: [65360, 65361],
204
+ outputClusters: [65360, 65361],
205
+ },
206
+ ],
207
+ },
208
+ {
209
+ type: 'Router', manufacturerName: 'AwoX', modelID: 'TLSR82xx', endpoints: [
210
+ {
211
+ ID: 1,
212
+ profileID: 260,
213
+ deviceID: 268,
214
+ inputClusters: [0, 3, 4, 5, 6, 8, 768, 4096, 64599],
215
+ outputClusters: [6],
216
+ },
217
+ {ID: 242, profileID: 41440, deviceID: 97, inputClusters: [], outputClusters: [33]},
218
+ {
219
+ ID: 3,
220
+ profileID: 4751,
221
+ deviceID: 268,
222
+ inputClusters: [65360, 65361],
223
+ outputClusters: [65360, 65361],
224
+ },
225
+ ],
226
+ },
125
227
  ],
126
228
  model: '33957',
127
229
  vendor: 'AwoX',
@@ -130,10 +232,24 @@ module.exports = [
130
232
  },
131
233
  {
132
234
  fingerprint: [
133
- {type: 'Router', manufacturerName: 'AwoX', modelID: 'TLSR82xx', endpoints: [
134
- {ID: 1, profileID: 260, deviceID: 268, inputClusters: [0, 3, 4, 5, 6, 8, 768, 4096], outputClusters: [6, 25]},
135
- {ID: 3, profileID: 49152, deviceID: 268, inputClusters: [65360, 65361], outputClusters: [65360, 65361]},
136
- ]},
235
+ {
236
+ type: 'Router', manufacturerName: 'AwoX', modelID: 'TLSR82xx', endpoints: [
237
+ {
238
+ ID: 1,
239
+ profileID: 260,
240
+ deviceID: 268,
241
+ inputClusters: [0, 3, 4, 5, 6, 8, 768, 4096],
242
+ outputClusters: [6, 25],
243
+ },
244
+ {
245
+ ID: 3,
246
+ profileID: 49152,
247
+ deviceID: 268,
248
+ inputClusters: [65360, 65361],
249
+ outputClusters: [65360, 65361],
250
+ },
251
+ ],
252
+ },
137
253
  ],
138
254
  model: '33955',
139
255
  vendor: 'Eglo',
package/devices/hive.js CHANGED
@@ -275,6 +275,7 @@ module.exports = [
275
275
  await reporting.thermostatTemperatureSetpointHold(heatEndpoint);
276
276
  await reporting.thermostatTemperatureSetpointHoldDuration(heatEndpoint);
277
277
  await reporting.bind(waterEndpoint, coordinatorEndpoint, binds);
278
+ await reporting.thermostatTemperature(waterEndpoint);
278
279
  await reporting.thermostatRunningState(waterEndpoint);
279
280
  await reporting.thermostatSystemMode(waterEndpoint);
280
281
  await reporting.thermostatOccupiedHeatingSetpoint(waterEndpoint);
@@ -326,6 +327,7 @@ module.exports = [
326
327
  await reporting.thermostatTemperatureSetpointHold(heatEndpoint);
327
328
  await reporting.thermostatTemperatureSetpointHoldDuration(heatEndpoint);
328
329
  await reporting.bind(waterEndpoint, coordinatorEndpoint, binds);
330
+ await reporting.thermostatTemperature(waterEndpoint);
329
331
  await reporting.thermostatRunningState(waterEndpoint);
330
332
  await reporting.thermostatSystemMode(waterEndpoint);
331
333
  await reporting.thermostatOccupiedHeatingSetpoint(waterEndpoint);
@@ -377,6 +379,7 @@ module.exports = [
377
379
  await reporting.thermostatTemperatureSetpointHold(heatEndpoint);
378
380
  await reporting.thermostatTemperatureSetpointHoldDuration(heatEndpoint);
379
381
  await reporting.bind(waterEndpoint, coordinatorEndpoint, binds);
382
+ await reporting.thermostatTemperature(waterEndpoint);
380
383
  await reporting.thermostatRunningState(waterEndpoint);
381
384
  await reporting.thermostatSystemMode(waterEndpoint);
382
385
  await reporting.thermostatOccupiedHeatingSetpoint(waterEndpoint);
@@ -197,6 +197,18 @@ module.exports = [
197
197
  await reporting.bind(device.getEndpoint(1), coordinatorEndpoint, ['genOnOff']);
198
198
  },
199
199
  },
200
+ {
201
+ fingerprint: [{modelID: 'TS130F', manufacturerName: '_TZ3000_zirycpws'}],
202
+ model: 'QS-Zigbee-C03',
203
+ vendor: 'Lonsonho',
204
+ description: 'Curtain/blind motor controller',
205
+ fromZigbee: [fz.cover_position_tilt, fz.tuya_cover_options],
206
+ toZigbee: [tz.cover_state, tz.cover_position_tilt, tz.tuya_cover_calibration, tz.tuya_cover_reversal],
207
+ meta: {coverInverted: true},
208
+ exposes: [e.cover_position(), exposes.enum('moving', ea.STATE, ['UP', 'STOP', 'DOWN']),
209
+ exposes.binary('calibration', ea.ALL, 'ON', 'OFF'), exposes.binary('motor_reversal', ea.ALL, 'ON', 'OFF'),
210
+ exposes.numeric('calibration_time', ea.STATE).withUnit('S').withDescription('Calibration time')],
211
+ },
200
212
  {
201
213
  fingerprint: [{modelID: 'TS110E', manufacturerName: '_TZ3210_zxbtub8r'}],
202
214
  model: 'TS110E_1gang',
package/devices/orvibo.js CHANGED
@@ -289,6 +289,8 @@ module.exports = [
289
289
  await reporting.bind(endpoint, coordinatorEndpoint, ['genPowerCfg', 'closuresWindowCovering']);
290
290
  await reporting.batteryPercentageRemaining(endpoint);
291
291
  await reporting.currentPositionLiftPercentage(endpoint);
292
+ device.powerSource = 'Battery';
293
+ device.save();
292
294
  },
293
295
  exposes: [e.cover_position(), e.battery()],
294
296
  },
@@ -1181,6 +1181,15 @@ module.exports = [
1181
1181
  extend: hueExtend.light_onoff_brightness_colortemp(),
1182
1182
  ota: ota.zigbeeOTA,
1183
1183
  },
1184
+ {
1185
+ zigbeeModel: ['LTD004'],
1186
+ model: '801480',
1187
+ vendor: 'Philips',
1188
+ description: 'Hue white ambiance 4" retrofit recessed downlight',
1189
+ meta: {turnsOffAtBrightness1: true},
1190
+ extend: hueExtend.light_onoff_brightness_colortemp({colorTempRange: [153, 454]}),
1191
+ ota: ota.zigbeeOTA,
1192
+ },
1184
1193
  {
1185
1194
  zigbeeModel: ['LTD009'],
1186
1195
  model: '5996311U5',
@@ -2239,6 +2248,13 @@ module.exports = [
2239
2248
  meta: {turnsOffAtBrightness1: true},
2240
2249
  extend: hueExtend.light_onoff_brightness(),
2241
2250
  },
2251
+ {
2252
+ zigbeeModel: ['929003055201'],
2253
+ model: '929003055201',
2254
+ vendor: 'Philips',
2255
+ description: 'Hue Being',
2256
+ extend: extend.light_onoff_brightness_colortemp({colorTempRange: [153, 454]}),
2257
+ },
2242
2258
  {
2243
2259
  zigbeeModel: ['1743630P7', '1743630V7'],
2244
2260
  model: '17436/30/P7',
@@ -2546,7 +2562,7 @@ module.exports = [
2546
2562
  ota: ota.zigbeeOTA,
2547
2563
  },
2548
2564
  {
2549
- zigbeeModel: ['5309030P9', '5309031P9', '5309030P6', '5309031P6'],
2565
+ zigbeeModel: ['5309030P9', '5309031P9', '5309030P6', '5309031P6', '929003046101'],
2550
2566
  model: '5309030P9',
2551
2567
  vendor: 'Philips',
2552
2568
  description: 'Hue White ambiance Runner single spotlight',
@@ -2785,4 +2801,13 @@ module.exports = [
2785
2801
  extend: extend.light_onoff_brightness_colortemp({colorTempRange: [153, 454]}),
2786
2802
  ota: ota.zigbeeOTA,
2787
2803
  },
2804
+ {
2805
+ zigbeeModel: ['LWS002'],
2806
+ model: '046677562229',
2807
+ vendor: 'Philips',
2808
+ description: 'Hue White PAR20 with Bluetooth',
2809
+ meta: {turnsOffAtBrightness1: true},
2810
+ extend: hueExtend.light_onoff_brightness(),
2811
+ ota: ota.zigbeeOTA,
2812
+ },
2788
2813
  ];
@@ -46,7 +46,8 @@ module.exports = [
46
46
  exposes.climate()
47
47
  .withSetpoint('current_heating_setpoint', 5, 30, 0.5, ea.STATE_SET).withLocalTemperature(ea.STATE)
48
48
  .withSystemMode(['off', 'heat', 'auto'], ea.STATE_SET)
49
- .withLocalTemperatureCalibration(-30, 30, 0.1, ea.STATE_SET)
49
+ // Range is -6 - 6 and step 1: https://github.com/Koenkk/zigbee2mqtt/issues/11777
50
+ .withLocalTemperatureCalibration(-6, 6, 1, ea.STATE_SET)
50
51
  .withAwayMode()],
51
52
  },
52
53
  ];
package/devices/slv.js CHANGED
@@ -17,4 +17,11 @@ module.exports = [
17
17
  toZigbee: [],
18
18
  exposes: [],
19
19
  },
20
+ {
21
+ zigbeeModel: ['ZBT-RGBWLight-AR0844'],
22
+ model: '1001923',
23
+ vendor: 'SLV',
24
+ description: 'VALETO LED GU10 RGBW',
25
+ extend: extend.light_onoff_brightness_colortemp_color({colorTempRange: [153, 556]}),
26
+ },
20
27
  ];
package/devices/tuya.js CHANGED
@@ -234,6 +234,7 @@ module.exports = [
234
234
  {modelID: 'TS0505B', manufacturerName: '_TZ3000_tza2vjxx'},
235
235
  {modelID: 'TS0505B', manufacturerName: '_TZ3210_k1pe6ibm'},
236
236
  {modelID: 'TS0505B', manufacturerName: '_TZ3210_bfwvfyx1'},
237
+ {modelID: 'TS0505B', manufacturerName: '_TZ3210_leyz4rju'},
237
238
  {modelID: 'TS0505B', manufacturerName: '_TZ3210_jd3z4yig'}],
238
239
  model: 'TS0505B',
239
240
  vendor: 'TuYa',
@@ -998,6 +999,8 @@ module.exports = [
998
999
  toZigbee: [tz.tuya_cover_control, tz.tuya_cover_options],
999
1000
  exposes: [
1000
1001
  e.cover_position().setAccess('position', ea.STATE_SET),
1002
+ exposes.binary('running', ea.STATE, true, false)
1003
+ .withDescription('Whether the motor is moving or not'),
1001
1004
  exposes.composite('options', 'options')
1002
1005
  .withFeature(exposes.numeric('motor_speed', ea.STATE_SET)
1003
1006
  .withValueMin(0)
package/devices/xiaomi.js CHANGED
@@ -893,7 +893,7 @@ module.exports = [
893
893
  vendor: 'Xiaomi',
894
894
  description: 'Aqara high precision motion sensor',
895
895
  fromZigbee: [fz.RTCGQ13LM_occupancy, fz.aqara_opple, fz.battery],
896
- toZigbee: [tz.aqara_detection_interval, tz.RTCGQ13LM_motion_sensitivity],
896
+ toZigbee: [tz.aqara_detection_interval, tz.aqara_motion_sensitivity],
897
897
  exposes: [e.occupancy(), exposes.enum('motion_sensitivity', ea.ALL, ['low', 'medium', 'high']),
898
898
  exposes.numeric('detection_interval', ea.ALL).withValueMin(2).withValueMax(65535).withUnit('s')
899
899
  .withDescription('Time interval for detecting actions'), e.battery()],
@@ -910,10 +910,11 @@ module.exports = [
910
910
  zigbeeModel: ['lumi.motion.ac01'],
911
911
  model: 'RTCZCGQ11LM',
912
912
  vendor: 'Xiaomi',
913
- description: 'Aqara Presence Detector FP1 (regions not supported for now)',
913
+ description: 'Aqara presence detector FP1 (regions not supported for now)',
914
914
  fromZigbee: [fz.aqara_opple],
915
- toZigbee: [tz.RTCZCGQ11LM_presence, tz.RTCZCGQ11LM_monitoring_mode, tz.RTCZCGQ11LM_approach_distance],
916
- exposes: [e.presence().withAccess(ea.STATE_GET),
915
+ toZigbee: [tz.RTCZCGQ11LM_presence, tz.RTCZCGQ11LM_monitoring_mode, tz.RTCZCGQ11LM_approach_distance,
916
+ tz.aqara_motion_sensitivity, tz.RTCZCGQ11LM_reset_nopresence_status],
917
+ exposes: [e.presence().withAccess(ea.STATE_GET), e.power_outage_count(), e.temperature(),
917
918
  exposes.enum('presence_event', ea.STATE, ['enter', 'leave', 'left_enter', 'right_leave', 'right_enter', 'left_leave',
918
919
  'approach', 'away']).withDescription('Presence events: "enter", "leave", "left_enter", "right_leave", ' +
919
920
  '"right_enter", "left_leave", "approach", "away"'),
@@ -921,9 +922,13 @@ module.exports = [
921
922
  'without considering right and left sides'),
922
923
  exposes.enum('approach_distance', ea.ALL, ['far', 'medium', 'near']).withDescription('The distance at which the ' +
923
924
  'sensor detects approaching'),
924
- exposes.numeric('power_outage_count', ea.STATE).withDescription('Number of power outages (since last pairing)')],
925
+ exposes.enum('motion_sensitivity', ea.ALL, ['low', 'medium', 'high']).withDescription('Different sensitivities ' +
926
+ 'means different static human body recognition rate and response speed of occupied'),
927
+ exposes.enum('reset_nopresence_status', ea.SET, ['Reset']).withDescription('Reset the status of no presence'),
928
+ ],
925
929
  configure: async (device, coordinatorEndpoint, logger) => {
926
930
  const endpoint = device.getEndpoint(1);
931
+ await endpoint.read('aqaraOpple', [0x010c], {manufacturerCode: 0x115f});
927
932
  await endpoint.read('aqaraOpple', [0x0142], {manufacturerCode: 0x115f});
928
933
  await endpoint.read('aqaraOpple', [0x0144], {manufacturerCode: 0x115f});
929
934
  await endpoint.read('aqaraOpple', [0x0146], {manufacturerCode: 0x115f});
@@ -1167,7 +1172,7 @@ module.exports = [
1167
1172
  fromZigbee: [fz.aqara_opple],
1168
1173
  toZigbee: [tz.JTBZ01AQA_gas, tz.JTBZ01AQA_gas_density, tz.JTBZ01AQA_gas_sensitivity, tz.JTBZ01AQA_selftest,
1169
1174
  tz.JTBZ01AQA_mute_buzzer, tz.JTBZ01AQA_mute, tz.JTBZ01AQA_linkage_alarm, tz.JTBZ01AQA_state, tz.aqara_power_outage_count],
1170
- exposes: [e.gas().withAccess(ea.STATE_GET),
1175
+ exposes: [e.gas().withAccess(ea.STATE_GET), e.power_outage_count().withAccess(ea.STATE_GET),
1171
1176
  exposes.numeric('gas_density', ea.STATE_GET).withUnit('%LEL').withDescription('Value of gas concentration'),
1172
1177
  exposes.enum('gas_sensitivity', ea.ALL, ['10%LEL', '15%LEL']).withDescription('Gas concentration value at which ' +
1173
1178
  'an alarm is triggered ("10%LEL" is more sensitive than "15%LEL")'),
@@ -1181,7 +1186,7 @@ module.exports = [
1181
1186
  'is detected, other detectors with this option enabled will also sound the alarm buzzer'),
1182
1187
  exposes.binary('state', ea.STATE_GET, 'preparation', 'work').withDescription('"Preparation" or "work" ' +
1183
1188
  '(measurement of the gas concentration value and triggering of an alarm are only performed in the "work" state)'),
1184
- exposes.numeric('power_outage_count', ea.STATE_GET).withDescription('Number of power outages (since last pairing)')],
1189
+ ],
1185
1190
  configure: async (device, coordinatorEndpoint, logger) => {
1186
1191
  const endpoint = device.getEndpoint(1);
1187
1192
  await endpoint.read('aqaraOpple', [0x013a], {manufacturerCode: 0x115f});
@@ -1233,7 +1238,9 @@ module.exports = [
1233
1238
  vendor: 'Xiaomi',
1234
1239
  fromZigbee: [fz.xiaomi_curtain_position, fz.cover_position_tilt, fz.xiaomi_curtain_options],
1235
1240
  toZigbee: [tz.xiaomi_curtain_position_state, tz.xiaomi_curtain_options],
1236
- exposes: [e.cover_position().setAccess('state', ea.ALL)],
1241
+ exposes: [e.cover_position().setAccess('state', ea.ALL),
1242
+ exposes.binary('running', ea.STATE, true, false)
1243
+ .withDescription('Whether the motor is moving or not')],
1237
1244
  ota: ota.zigbeeOTA,
1238
1245
  },
1239
1246
  {
@@ -1243,7 +1250,9 @@ module.exports = [
1243
1250
  vendor: 'Xiaomi',
1244
1251
  fromZigbee: [fz.xiaomi_curtain_position, fz.cover_position_tilt, fz.xiaomi_curtain_options],
1245
1252
  toZigbee: [tz.xiaomi_curtain_position_state, tz.xiaomi_curtain_options],
1246
- exposes: [e.cover_position().setAccess('state', ea.ALL)],
1253
+ exposes: [e.cover_position().setAccess('state', ea.ALL),
1254
+ exposes.binary('running', ea.STATE, true, false)
1255
+ .withDescription('Whether the motor is moving or not')],
1247
1256
  ota: ota.zigbeeOTA,
1248
1257
  },
1249
1258
  {
@@ -1260,7 +1269,9 @@ module.exports = [
1260
1269
  await device.endpoints[0].read('genAnalogOutput', ['presentValue']);
1261
1270
  }
1262
1271
  },
1263
- exposes: [e.cover_position().setAccess('state', ea.ALL), e.battery()],
1272
+ exposes: [e.cover_position().setAccess('state', ea.ALL), e.battery(),
1273
+ exposes.binary('running', ea.STATE, true, false)
1274
+ .withDescription('Whether the motor is moving or not')],
1264
1275
  configure: async (device, coordinatorEndpoint, logger) => {
1265
1276
  const endpoint = device.endpoints[0];
1266
1277
  await reporting.bind(endpoint, coordinatorEndpoint, ['genPowerCfg']);
@@ -1280,7 +1291,7 @@ module.exports = [
1280
1291
  exposes.enum('motor_state', ea.STATE, ['declining', 'rising', 'pause', 'blocked'])
1281
1292
  .withDescription('The current state of the motor.'),
1282
1293
  exposes.binary('running', ea.STATE, true, false)
1283
- .withDescription('Whether the motor is moving or not.')],
1294
+ .withDescription('Whether the motor is moving or not')],
1284
1295
  configure: async (device, coordinatorEndpoint, logger) => {
1285
1296
  device.powerSource = 'Battery';
1286
1297
  device.save();
@@ -1298,10 +1309,11 @@ module.exports = [
1298
1309
  endpoint: (device) => {
1299
1310
  return {'l1': 1, 'l2': 2};
1300
1311
  },
1301
- exposes: [e.power().withAccess(ea.STATE_GET), e.energy(), e.temperature(), e.voltage().withAccess(ea.STATE), e.current(),
1302
- e.switch().withEndpoint('l1'), e.switch().withEndpoint('l2'),
1312
+ exposes: [e.power().withAccess(ea.STATE_GET), e.energy(), e.temperature(), e.voltage(), e.current(),
1313
+ e.switch().withEndpoint('l1'), e.switch().withEndpoint('l2'), e.power_outage_count(false),
1303
1314
  exposes.binary('interlock', ea.STATE_SET, true, false)
1304
- .withDescription('Enabling prevents both relais being on at the same time')],
1315
+ .withDescription('Enabling prevents both relais being on at the same time'),
1316
+ ],
1305
1317
  ota: ota.zigbeeOTA,
1306
1318
  },
1307
1319
  {
@@ -1475,8 +1487,9 @@ module.exports = [
1475
1487
  // Ignore energy metering reports, rely on aqara_opple: https://github.com/Koenkk/zigbee2mqtt/issues/10709
1476
1488
  fromZigbee: [fz.on_off, fz.device_temperature, fz.aqara_opple, fz.ignore_metering, fz.ignore_electrical_measurement,
1477
1489
  fz.xiaomi_power],
1478
- exposes: [e.switch(), e.energy(), e.power(), e.device_temperature(), e.power_outage_memory(), e.switch_type(),
1479
- e.voltage(), e.temperature(), e.current()],
1490
+ exposes: [e.switch(), e.energy(), e.power(), e.device_temperature(), e.power_outage_memory(), e.power_outage_count(),
1491
+ e.switch_type(), e.voltage(), e.temperature(), e.current(),
1492
+ ],
1480
1493
  toZigbee: [tz.xiaomi_switch_type, tz.on_off, tz.xiaomi_switch_power_outage_memory, tz.xiaomi_led_disabled_night],
1481
1494
  configure: async (device, coordinatorEndpoint, logger) => {
1482
1495
  const endpoint = device.getEndpoint(1);
package/lib/exposes.js CHANGED
@@ -582,6 +582,7 @@ module.exports = {
582
582
  position: () => new Numeric('position', access.STATE).withUnit('%').withDescription('Position'),
583
583
  power: () => new Numeric('power', access.STATE).withUnit('W').withDescription('Instantaneous measured power'),
584
584
  power_on_behavior: () => new Enum('power_on_behavior', access.ALL, ['off', 'previous', 'on']).withDescription('Controls the behavior when the device is powered on'),
585
+ power_outage_count: (resetsWhenPairing = true) => new Numeric('power_outage_count', access.STATE).withDescription('Number of power outages' + (resetsWhenPairing ? ' (since last pairing)' : '')),
585
586
  power_outage_memory: () => new Binary('power_outage_memory', access.ALL, true, false).withDescription('Enable/disable the power outage memory, this recovers the on/off mode after power failure'),
586
587
  presence: () => new Binary('presence', access.STATE, true, false).withDescription('Indicates whether the device detected presence'),
587
588
  pressure: () => new Numeric('pressure', access.STATE).withUnit('hPa').withDescription('The measured atmospheric pressure'),
package/lib/xiaomi.js CHANGED
@@ -160,7 +160,7 @@ const numericAttributes2Payload = (msg, meta, model, options, dataObject) => {
160
160
  payload.mode_switch = {4: 'anti_flicker_mode', 1: 'quick_mode'}[value];
161
161
  break;
162
162
  case '5':
163
- if (['JT-BZ-01AQ/A', 'RTCZCGQ11LM'].includes(model.model)) {
163
+ if (['Mains (single phase)', 'DC Source'].includes(meta.device.powerSource)) {
164
164
  payload.power_outage_count = value;
165
165
  }
166
166
  break;
@@ -213,19 +213,25 @@ const numericAttributes2Payload = (msg, meta, model, options, dataObject) => {
213
213
  payload.illuminance = calibrateAndPrecisionRoundOptions(value, options, 'illuminance');
214
214
  } else if (['ZNJLBL01LM'].includes(model.model)) {
215
215
  payload.battery = value;
216
+ } else if (['RTCZCGQ11LM'].includes(model.model)) {
217
+ payload.presence = {0: false, 1: true, 255: null}[value];
216
218
  }
217
219
  break;
218
220
  case '102':
219
221
  if (['QBKG25LM', 'QBKG34LM'].includes(model.model)) {
220
222
  payload.state_right = value === 1 ? 'ON' : 'OFF';
221
223
  } else if (['RTCZCGQ11LM'].includes(model.model)) {
222
- payload.presence_event = {0: 'enter', 1: 'leave', 2: 'left_enter', 3: 'right_leave', 4: 'right_enter',
223
- 5: 'left_leave', 6: 'approach', 7: 'away', 255: null}[value];
224
+ if (meta.device.applicationVersion < 50) {
225
+ payload.presence_event = {0: 'enter', 1: 'leave', 2: 'left_enter', 3: 'right_leave', 4: 'right_enter',
226
+ 5: 'left_leave', 6: 'approach', 7: 'away', 255: null}[value];
227
+ } else {
228
+ payload.motion_sensitivity = {1: 'low', 2: 'medium', 3: 'high'}[value];
229
+ }
224
230
  }
225
231
  break;
226
232
  case '103':
227
233
  if (['RTCZCGQ11LM'].includes(model.model)) {
228
- payload.monitoring_mode = value === 1 ? 'left_right' : 'undirected';
234
+ payload.monitoring_mode = {0: 'undirected', 1: 'left_right'}[value];
229
235
  }
230
236
  break;
231
237
  case '105':
@@ -288,7 +294,7 @@ const numericAttributes2Payload = (msg, meta, model, options, dataObject) => {
288
294
  payload.detection_interval = value;
289
295
  break;
290
296
  case '268':
291
- if (['RTCGQ13LM'].includes(model.model)) {
297
+ if (['RTCGQ13LM', 'RTCZCGQ11LM'].includes(model.model)) {
292
298
  payload.motion_sensitivity = {1: 'low', 2: 'medium', 3: 'high'}[value];
293
299
  } else if (['JT-BZ-01AQ/A'].includes(model.model)) {
294
300
  payload.gas_sensitivity = {1: '15%LEL', 2: '10%LEL'}[value];
@@ -313,19 +319,25 @@ const numericAttributes2Payload = (msg, meta, model, options, dataObject) => {
313
319
  payload.gas_density = value; // JT-BZ-01AQ/A
314
320
  break;
315
321
  case '322':
316
- payload.presence = value === 1; // RTCZCGQ11LM
322
+ if (['RTCZCGQ11LM'].includes(model.model)) {
323
+ payload.presence = {0: false, 1: true, 255: null}[value];
324
+ }
317
325
  break;
318
326
  case '323':
319
- payload.presence_event = {0: 'enter', 1: 'leave', 2: 'left_enter', 3: 'right_leave', 4: 'right_enter',
320
- 5: 'left_leave', 6: 'approach', 7: 'away'}[value]; // RTCZCGQ11LM
327
+ if (['RTCZCGQ11LM'].includes(model.model)) {
328
+ payload.presence_event = {0: 'enter', 1: 'leave', 2: 'left_enter', 3: 'right_leave', 4: 'right_enter',
329
+ 5: 'left_leave', 6: 'approach', 7: 'away'}[value];
330
+ }
321
331
  break;
322
332
  case '324':
323
- // RTCZCGQ11LM
324
- payload.monitoring_mode = value === 1 ? 'left_right' : 'undirected';
333
+ if (['RTCZCGQ11LM'].includes(model.model)) {
334
+ payload.monitoring_mode = {0: 'undirected', 1: 'left_right'}[value];
335
+ }
325
336
  break;
326
337
  case '326':
327
- // RTCZCGQ11LM
328
- payload.approach_distance = {0: 'far', 1: 'medium', 2: 'near'}[value];
338
+ if (['RTCZCGQ11LM'].includes(model.model)) {
339
+ payload.approach_distance = {0: 'far', 1: 'medium', 2: 'near'}[value];
340
+ }
329
341
  break;
330
342
  case '331':
331
343
  payload.linkage_alarm = value === 1; // JT-BZ-01AQ/A
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "zigbee-herdsman-converters",
3
- "version": "14.0.446",
3
+ "version": "14.0.449",
4
4
  "lockfileVersion": 1,
5
5
  "requires": true,
6
6
  "dependencies": {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "zigbee-herdsman-converters",
3
- "version": "14.0.446",
3
+ "version": "14.0.449",
4
4
  "description": "Collection of device converters to be used with zigbee-herdsman",
5
5
  "main": "index.js",
6
6
  "files": [