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.
- package/converters/toZigbee.js +7 -1
- package/devices/aurora_lighting.js +4 -3
- package/devices/awox.js +151 -35
- package/devices/hive.js +3 -0
- package/devices/lonsonho.js +12 -0
- package/devices/orvibo.js +2 -0
- package/devices/philips.js +26 -1
- package/devices/saswell.js +2 -1
- package/devices/slv.js +7 -0
- package/devices/tuya.js +3 -0
- package/devices/xiaomi.js +29 -16
- package/lib/exposes.js +1 -0
- package/lib/xiaomi.js +24 -12
- package/npm-shrinkwrap.json +1 -1
- package/package.json +1 -1
package/converters/toZigbee.js
CHANGED
|
@@ -2031,7 +2031,7 @@ const converters = {
|
|
|
2031
2031
|
await entity.read('genBasic', [0x0033], manufacturerOptions.hue);
|
|
2032
2032
|
},
|
|
2033
2033
|
},
|
|
2034
|
-
|
|
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.
|
|
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.
|
|
188
|
-
|
|
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
|
-
{
|
|
74
|
-
|
|
75
|
-
|
|
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
|
-
{
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
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
|
-
{
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
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
|
-
{
|
|
134
|
-
|
|
135
|
-
|
|
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);
|
package/devices/lonsonho.js
CHANGED
|
@@ -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
|
},
|
package/devices/philips.js
CHANGED
|
@@ -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
|
];
|
package/devices/saswell.js
CHANGED
|
@@ -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
|
-
|
|
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.
|
|
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
|
|
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
|
-
|
|
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.
|
|
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
|
-
|
|
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()
|
|
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.
|
|
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 (['
|
|
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
|
-
|
|
223
|
-
|
|
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 =
|
|
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
|
-
|
|
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
|
-
|
|
320
|
-
|
|
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
|
-
|
|
324
|
-
|
|
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
|
-
|
|
328
|
-
|
|
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
|
package/npm-shrinkwrap.json
CHANGED