zigbee-herdsman-converters 14.0.578 → 14.0.581
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/fromZigbee.js +3 -3
- package/devices/adeo.js +14 -0
- package/devices/ajax_online.js +8 -0
- package/devices/bitron.js +5 -1
- package/devices/halemeier.js +11 -0
- package/devices/home_control_as.js +7 -3
- package/devices/legrand.js +18 -0
- package/devices/lellki.js +1 -0
- package/devices/mecrator.js +24 -0
- package/devices/orvibo.js +25 -0
- package/devices/philips.js +9 -2
- package/devices/plugwise.js +23 -0
- package/devices/profalux.js +1 -0
- package/devices/sengled.js +9 -1
- package/devices/tuya.js +7 -3
- package/devices/xiaomi.js +15 -0
- package/lib/ota/ubisys.js +9 -6
- package/lib/xiaomi.js +3 -4
- package/package.json +1 -1
package/converters/fromZigbee.js
CHANGED
|
@@ -1094,9 +1094,9 @@ const converters = {
|
|
|
1094
1094
|
cluster: 'genScenes',
|
|
1095
1095
|
type: 'commandStore',
|
|
1096
1096
|
convert: (model, msg, publish, options, meta) => {
|
|
1097
|
-
if (
|
|
1098
|
-
const payload = {action:
|
|
1099
|
-
|
|
1097
|
+
if (hasAlreadyProcessedMessage(msg)) return;
|
|
1098
|
+
const payload = {action: postfixWithEndpointName(`store_${msg.data.sceneid}`, msg, model, meta)};
|
|
1099
|
+
addActionGroup(payload, msg, model);
|
|
1100
1100
|
return payload;
|
|
1101
1101
|
},
|
|
1102
1102
|
},
|
package/devices/adeo.js
CHANGED
|
@@ -36,6 +36,13 @@ module.exports = [
|
|
|
36
36
|
description: 'ENKI LEXMAN E27 LED white',
|
|
37
37
|
extend: extend.light_onoff_brightness_colortemp_color({colorTempRange: [153, 454]}),
|
|
38
38
|
},
|
|
39
|
+
{
|
|
40
|
+
zigbeeModel: ['ZBEK-6'],
|
|
41
|
+
model: 'IG-CDZB2AG009RA-MZN-01',
|
|
42
|
+
vendor: 'ADEO',
|
|
43
|
+
description: 'ENKI LEXMAN E27 Led white bulb',
|
|
44
|
+
extend: extend.light_onoff_brightness_colortemp_color({colorTempRange: [153, 454]}),
|
|
45
|
+
},
|
|
39
46
|
{
|
|
40
47
|
zigbeeModel: ['ZBEK-4'],
|
|
41
48
|
model: 'IM-CDZDGAAA0005KA_MAN',
|
|
@@ -57,6 +64,13 @@ module.exports = [
|
|
|
57
64
|
description: 'ENKI LEXMAN E27 LED white',
|
|
58
65
|
extend: extend.light_onoff_brightness_colortemp({colorTempRange: [153, 454]}),
|
|
59
66
|
},
|
|
67
|
+
{
|
|
68
|
+
zigbeeModel: ['ZBEK-14'],
|
|
69
|
+
model: 'IC-CDZFB2AC005HA-MZN',
|
|
70
|
+
vendor: 'ADEO',
|
|
71
|
+
description: 'ENKI LEXMAN E14 LED white',
|
|
72
|
+
extend: extend.light_onoff_brightness_colortemp({colorTempRange: [153, 454]}),
|
|
73
|
+
},
|
|
60
74
|
{
|
|
61
75
|
zigbeeModel: ['ZBEK-5'],
|
|
62
76
|
model: 'IST-CDZFB2AS007NA-MZN-01',
|
package/devices/ajax_online.js
CHANGED
|
@@ -30,4 +30,12 @@ module.exports = [
|
|
|
30
30
|
description: 'Smart Zigbee pro 12W A60 RGBCW bulb',
|
|
31
31
|
extend: extend.light_onoff_brightness_colortemp_color({colorTempRange: [153, 500]}),
|
|
32
32
|
},
|
|
33
|
+
{
|
|
34
|
+
fingerprint: [{modelID: 'TS0505B', manufacturerName: '_TZ3210_hzy4rjz3'}],
|
|
35
|
+
model: 'AJ_RGBCCT_CTRL',
|
|
36
|
+
vendor: 'Ajax Online',
|
|
37
|
+
description: 'Smart Zigbee LED strip RGB+CCT',
|
|
38
|
+
extend: extend.light_onoff_brightness_colortemp_color({colorTempRange: [153, 500], disableColorTempStartup: true}),
|
|
39
|
+
meta: {applyRedFix: true, enhancedHue: false},
|
|
40
|
+
},
|
|
33
41
|
];
|
package/devices/bitron.js
CHANGED
|
@@ -136,7 +136,11 @@ module.exports = [
|
|
|
136
136
|
await reporting.bind(endpoint, coordinatorEndpoint, ['genOnOff', 'seMetering']);
|
|
137
137
|
await reporting.instantaneousDemand(endpoint);
|
|
138
138
|
await reporting.currentSummDelivered(endpoint);
|
|
139
|
-
|
|
139
|
+
try {
|
|
140
|
+
await reporting.currentSummReceived(endpoint);
|
|
141
|
+
} catch (error) {
|
|
142
|
+
/* fails for some: https://github.com/Koenkk/zigbee2mqtt/issues/13258 */
|
|
143
|
+
}
|
|
140
144
|
endpoint.saveClusterAttributeKeyValue('seMetering', {divisor: 10000, multiplier: 1});
|
|
141
145
|
},
|
|
142
146
|
},
|
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
const exposes = require('../lib/exposes');
|
|
2
|
-
const fz =
|
|
2
|
+
const fz = require('../converters/fromZigbee');
|
|
3
3
|
const tz = require('../converters/toZigbee');
|
|
4
4
|
const reporting = require('../lib/reporting');
|
|
5
5
|
const e = exposes.presets;
|
|
6
|
+
const ota = require('../lib/ota');
|
|
6
7
|
|
|
7
8
|
module.exports = [
|
|
8
9
|
{
|
|
@@ -11,13 +12,16 @@ module.exports = [
|
|
|
11
12
|
vendor: 'Home Control AS',
|
|
12
13
|
description: 'Heimgard (Wattle) door lock pro',
|
|
13
14
|
fromZigbee: [fz.lock, fz.battery],
|
|
14
|
-
toZigbee: [tz.lock],
|
|
15
|
+
toZigbee: [tz.lock, tz.lock_auto_relock_time, tz.lock_sound_volume],
|
|
16
|
+
ota: ota.zigbeeOTA,
|
|
15
17
|
configure: async (device, coordinatorEndpoint, logger) => {
|
|
16
18
|
const endpoint = device.getEndpoint(1);
|
|
17
19
|
await reporting.bind(endpoint, coordinatorEndpoint, ['closuresDoorLock', 'genPowerCfg']);
|
|
18
20
|
await reporting.lockState(endpoint);
|
|
19
21
|
await reporting.batteryPercentageRemaining(endpoint);
|
|
22
|
+
await endpoint.read('closuresDoorLock', ['lockState', 'soundVolume']);
|
|
20
23
|
},
|
|
21
|
-
exposes: [
|
|
24
|
+
exposes: [
|
|
25
|
+
e.lock(), e.battery(), e.auto_relock_time().withValueMin(0).withValueMax(3600), e.sound_volume()],
|
|
22
26
|
},
|
|
23
27
|
];
|
package/devices/legrand.js
CHANGED
|
@@ -266,6 +266,24 @@ module.exports = [
|
|
|
266
266
|
// Read configuration values that are not sent periodically as well as current power (activePower).
|
|
267
267
|
await endpoint.read('haElectricalMeasurement', ['activePower', 0xf000, 0xf001, 0xf002]);
|
|
268
268
|
},
|
|
269
|
+
onEvent: async (type, data, device, options, state) => {
|
|
270
|
+
/**
|
|
271
|
+
* The DIN power consumption module loses the configure reporting
|
|
272
|
+
* after device restart/powerloss.
|
|
273
|
+
*
|
|
274
|
+
* We reconfigure the reporting at deviceAnnounce.
|
|
275
|
+
*/
|
|
276
|
+
if (type === 'deviceAnnounce') {
|
|
277
|
+
for (const endpoint of device.endpoints) {
|
|
278
|
+
for (const c of endpoint.configuredReportings) {
|
|
279
|
+
await endpoint.configureReporting(c.cluster.name, [{
|
|
280
|
+
attribute: c.attribute.name, minimumReportInterval: c.minimumReportInterval,
|
|
281
|
+
maximumReportInterval: c.maximumReportInterval, reportableChange: c.reportableChange,
|
|
282
|
+
}]);
|
|
283
|
+
}
|
|
284
|
+
}
|
|
285
|
+
}
|
|
286
|
+
},
|
|
269
287
|
},
|
|
270
288
|
{
|
|
271
289
|
zigbeeModel: ['Remote switch Wake up / Sleep'],
|
package/devices/lellki.js
CHANGED
|
@@ -115,6 +115,7 @@ module.exports = [
|
|
|
115
115
|
toZigbee: [tz.on_off, tz.tuya_switch_power_outage_memory],
|
|
116
116
|
configure: async (device, coordinatorEndpoint, logger) => {
|
|
117
117
|
const endpoint = device.getEndpoint(1);
|
|
118
|
+
await endpoint.read('genBasic', ['manufacturerName', 'zclVersion', 'appVersion', 'modelId', 'powerSource', 0xfffe]);
|
|
118
119
|
await reporting.bind(endpoint, coordinatorEndpoint, ['genOnOff']);
|
|
119
120
|
endpoint.saveClusterAttributeKeyValue('haElectricalMeasurement', {acCurrentDivisor: 1000, acCurrentMultiplier: 1});
|
|
120
121
|
endpoint.saveClusterAttributeKeyValue('seMetering', {divisor: 100, multiplier: 1});
|
package/devices/mecrator.js
CHANGED
|
@@ -6,6 +6,30 @@ const e = exposes.presets;
|
|
|
6
6
|
const ea = exposes.access;
|
|
7
7
|
|
|
8
8
|
module.exports = [
|
|
9
|
+
{
|
|
10
|
+
fingerprint: [{modelID: 'TS011F', manufacturerName: '_TZ3210_yvxjawlt'}],
|
|
11
|
+
model: 'SPP04G',
|
|
12
|
+
vendor: 'Mercator',
|
|
13
|
+
description: 'Ikuü Quad Power Point',
|
|
14
|
+
fromZigbee: [fz.on_off, fz.electrical_measurement, fz.metering, fz.ignore_basic_report, fz.tuya_switch_power_outage_memory],
|
|
15
|
+
toZigbee: [tz.on_off, tz.tuya_switch_power_outage_memory],
|
|
16
|
+
exposes: [e.switch().withEndpoint('left'), e.switch().withEndpoint('right'),
|
|
17
|
+
e.power().withEndpoint('left'), e.current().withEndpoint('left'),
|
|
18
|
+
e.voltage().withEndpoint('left').withAccess(ea.STATE), e.energy(),
|
|
19
|
+
exposes.enum('power_outage_memory', ea.ALL, ['on', 'off', 'restore'])
|
|
20
|
+
.withDescription('Recover state after power outage')],
|
|
21
|
+
endpoint: (device) => {
|
|
22
|
+
return {left: 1, right: 2};
|
|
23
|
+
},
|
|
24
|
+
meta: {multiEndpoint: true},
|
|
25
|
+
configure: async (device, coordinatorEndpoint, logger) => {
|
|
26
|
+
const endpoint = device.getEndpoint(1);
|
|
27
|
+
await endpoint.read('genBasic', ['manufacturerName', 'zclVersion', 'appVersion', 'modelId', 'powerSource', 0xfffe]);
|
|
28
|
+
endpoint.saveClusterAttributeKeyValue('haElectricalMeasurement', {acCurrentDivisor: 1000, acCurrentMultiplier: 1});
|
|
29
|
+
endpoint.saveClusterAttributeKeyValue('seMetering', {divisor: 100, multiplier: 1});
|
|
30
|
+
device.save();
|
|
31
|
+
},
|
|
32
|
+
},
|
|
9
33
|
{
|
|
10
34
|
fingerprint: [{modelID: 'TS011F', manufacturerName: '_TZ3210_7jnk7l3k'}],
|
|
11
35
|
model: 'SPP02GIP',
|
package/devices/orvibo.js
CHANGED
|
@@ -5,7 +5,32 @@ const reporting = require('../lib/reporting');
|
|
|
5
5
|
const extend = require('../lib/extend');
|
|
6
6
|
const e = exposes.presets;
|
|
7
7
|
|
|
8
|
+
const tzLocal = {
|
|
9
|
+
DD10Z_brightness: {
|
|
10
|
+
key: ['brightness'],
|
|
11
|
+
options: [exposes.options.transition()],
|
|
12
|
+
convertSet: async (entity, key, value, meta) => {
|
|
13
|
+
// Device doesn't support moveToLevelWithOnOff therefore this converter is needed.
|
|
14
|
+
await entity.command('genLevelCtrl', 'moveToLevel', {level: Number(value), transtime: 0}, {disableDefaultResponse: true});
|
|
15
|
+
return {state: {brightness: value}};
|
|
16
|
+
},
|
|
17
|
+
convertGet: async (entity, key, meta) => {
|
|
18
|
+
await entity.read('genLevelCtrl', ['currentLevel']);
|
|
19
|
+
},
|
|
20
|
+
},
|
|
21
|
+
};
|
|
22
|
+
|
|
8
23
|
module.exports = [
|
|
24
|
+
{
|
|
25
|
+
zigbeeModel: ['ccb9f56837ab41dcad366fb1452096b6'],
|
|
26
|
+
model: 'DD10Z',
|
|
27
|
+
vendor: 'ORVIBO',
|
|
28
|
+
description: 'Smart spotlight',
|
|
29
|
+
// https://github.com/Koenkk/zigbee2mqtt/issues/13123#issuecomment-1198793749
|
|
30
|
+
meta: {disableDefaultResponse: true},
|
|
31
|
+
toZigbee: [tz.on_off, tzLocal.DD10Z_brightness, tz.light_colortemp, tz.effect],
|
|
32
|
+
extend: extend.light_onoff_brightness_colortemp({colorTempRange: [153, 370], disableColorTempStartup: true}),
|
|
33
|
+
},
|
|
9
34
|
{
|
|
10
35
|
zigbeeModel: ['4a33f5ea766a4c96a962b371ffde9943'],
|
|
11
36
|
model: 'DS20Z07B',
|
package/devices/philips.js
CHANGED
|
@@ -406,7 +406,7 @@ module.exports = [
|
|
|
406
406
|
extend: hueExtend.light_onoff_brightness(),
|
|
407
407
|
},
|
|
408
408
|
{
|
|
409
|
-
zigbeeModel: ['LCT026', '7602031P7', '7602031U7'],
|
|
409
|
+
zigbeeModel: ['LCT026', '7602031P7', '7602031U7', '7602031PU'],
|
|
410
410
|
model: '7602031P7',
|
|
411
411
|
vendor: 'Philips',
|
|
412
412
|
description: 'Hue Go with Bluetooth',
|
|
@@ -1469,6 +1469,13 @@ module.exports = [
|
|
|
1469
1469
|
description: 'Hue White and color ambiance Gradient Signe table lamp (white)',
|
|
1470
1470
|
extend: hueExtend.light_onoff_brightness_colortemp_color({colorTempRange: [153, 500]}),
|
|
1471
1471
|
},
|
|
1472
|
+
{
|
|
1473
|
+
zigbeeModel: ['915005987001'],
|
|
1474
|
+
model: '915005987001',
|
|
1475
|
+
vendor: 'Philips',
|
|
1476
|
+
description: 'Hue White and color ambiance Gradient Signe table lamp (black)',
|
|
1477
|
+
extend: hueExtend.light_onoff_brightness_colortemp_color({colorTempRange: [153, 500]}),
|
|
1478
|
+
},
|
|
1472
1479
|
{
|
|
1473
1480
|
zigbeeModel: ['5060730P7_01', '5060730P7_02', '5060730P7_03', '5060730P7_04', '5060730P7_05'],
|
|
1474
1481
|
model: '5060730P7',
|
|
@@ -2139,7 +2146,7 @@ module.exports = [
|
|
|
2139
2146
|
extend: hueExtend.light_onoff_brightness_colortemp(),
|
|
2140
2147
|
},
|
|
2141
2148
|
{
|
|
2142
|
-
zigbeeModel: ['929003047101', '929003045101_03'],
|
|
2149
|
+
zigbeeModel: ['929003047101', '929003045101_03', '929003045101_01', '929003045101_02'],
|
|
2143
2150
|
model: '929003047101',
|
|
2144
2151
|
vendor: 'Philips',
|
|
2145
2152
|
description: 'Hue White ambiance Milliskin (round)',
|
package/devices/plugwise.js
CHANGED
|
@@ -149,4 +149,27 @@ module.exports = [
|
|
|
149
149
|
.withDescription('Calibrates valve on next wakeup'),
|
|
150
150
|
],
|
|
151
151
|
},
|
|
152
|
+
{
|
|
153
|
+
zigbeeModel: ['158-01'],
|
|
154
|
+
model: '158-01',
|
|
155
|
+
vendor: 'Plugwise',
|
|
156
|
+
description: 'Lisa zone thermostat',
|
|
157
|
+
fromZigbee: [fz.thermostat, fz.temperature, fz.battery],
|
|
158
|
+
toZigbee: [
|
|
159
|
+
tz.thermostat_system_mode,
|
|
160
|
+
tz.thermostat_occupied_heating_setpoint,
|
|
161
|
+
],
|
|
162
|
+
configure: async (device, coordinatorEndpoint, logger) => {
|
|
163
|
+
const endpoint = device.getEndpoint(1);
|
|
164
|
+
await reporting.bind(endpoint, coordinatorEndpoint, ['genBasic', 'genPowerCfg', 'hvacThermostat']);
|
|
165
|
+
await reporting.batteryPercentageRemaining(endpoint);
|
|
166
|
+
await reporting.thermostatTemperature(endpoint);
|
|
167
|
+
},
|
|
168
|
+
exposes: [e.battery(),
|
|
169
|
+
exposes.climate()
|
|
170
|
+
.withSetpoint('occupied_heating_setpoint', 5, 30, 0.5, ea.ALL)
|
|
171
|
+
.withLocalTemperature(ea.STATE)
|
|
172
|
+
.withSystemMode(['off', 'auto'], ea.ALL),
|
|
173
|
+
],
|
|
174
|
+
},
|
|
152
175
|
];
|
package/devices/profalux.js
CHANGED
|
@@ -17,6 +17,7 @@ module.exports = [
|
|
|
17
17
|
exposes: [],
|
|
18
18
|
},
|
|
19
19
|
{
|
|
20
|
+
zigbeeModel: ['MOT-C1Z06C\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000'],
|
|
20
21
|
fingerprint: [{manufId: 4368, endpoints: [{ID: 1, profileID: 260, deviceID: 512,
|
|
21
22
|
inputClusters: [0, 3, 4, 5, 6, 8, 10, 21, 256, 64544, 64545], outputClusters: [3, 64544]}]}],
|
|
22
23
|
model: 'NSAV061',
|
package/devices/sengled.js
CHANGED
|
@@ -137,13 +137,21 @@ module.exports = [
|
|
|
137
137
|
model: 'E11-N1EA',
|
|
138
138
|
vendor: 'Sengled',
|
|
139
139
|
description: 'Element plus color (A19)',
|
|
140
|
-
|
|
140
|
+
fromZigbee: extend.light_onoff_brightness().fromZigbee.concat([fz.metering]),
|
|
141
|
+
toZigbee: extend.light_onoff_brightness().toZigbee,
|
|
141
142
|
ota: ota.zigbeeOTA,
|
|
142
143
|
configure: async (device, coordinatorEndpoint, logger) => {
|
|
143
144
|
await extend.light_onoff_brightness().configure(device, coordinatorEndpoint, logger);
|
|
144
145
|
device.powerSource = 'Mains (single phase)';
|
|
145
146
|
device.save();
|
|
147
|
+
|
|
148
|
+
const endpoint = device.getEndpoint(1);
|
|
149
|
+
await reporting.bind(endpoint, coordinatorEndpoint, ['genOnOff', 'seMetering']);
|
|
150
|
+
await reporting.readMeteringMultiplierDivisor(endpoint);
|
|
151
|
+
await reporting.currentSummDelivered(endpoint);
|
|
152
|
+
await reporting.instantaneousDemand(endpoint);
|
|
146
153
|
},
|
|
154
|
+
exposes: extend.light_onoff_brightness().exposes.concat([e.power(), e.energy()]),
|
|
147
155
|
},
|
|
148
156
|
{
|
|
149
157
|
zigbeeModel: ['E11-U2E'],
|
package/devices/tuya.js
CHANGED
|
@@ -438,7 +438,8 @@ module.exports = [
|
|
|
438
438
|
{modelID: 'TS0001', manufacturerName: '_TZ3000_rmjr4ufz'},
|
|
439
439
|
{modelID: 'TS0001', manufacturerName: '_TZ3000_v7gnj3ad'},
|
|
440
440
|
{modelID: 'TS0001', manufacturerName: '_TZ3000_mx3vgyea'},
|
|
441
|
-
{modelID: 'TS0001', manufacturerName: '_TZ3000_qsp2pwtf'}
|
|
441
|
+
{modelID: 'TS0001', manufacturerName: '_TZ3000_qsp2pwtf'},
|
|
442
|
+
{modelID: 'TS0001', manufacturerName: '_TZ3000_46t1rvdu'}],
|
|
442
443
|
model: 'WHD02',
|
|
443
444
|
vendor: 'TuYa',
|
|
444
445
|
whiteLabel: [{vendor: 'TuYa', model: 'iHSW02'}],
|
|
@@ -594,7 +595,8 @@ module.exports = [
|
|
|
594
595
|
{modelID: 'TS0501B', manufacturerName: '_TZ3210_grnwgegn'},
|
|
595
596
|
{modelID: 'TS0501B', manufacturerName: '_TZ3210_nehayyhx'},
|
|
596
597
|
{modelID: 'TS0501B', manufacturerName: '_TZ3210_wuheofsg'},
|
|
597
|
-
{modelID: 'TS0501B', manufacturerName: '_TZ3210_e5t9bfdv'}
|
|
598
|
+
{modelID: 'TS0501B', manufacturerName: '_TZ3210_e5t9bfdv'},
|
|
599
|
+
{modelID: 'TS0501B', manufacturerName: '_TZ3210_19qb27da'}],
|
|
598
600
|
model: 'TS0501B',
|
|
599
601
|
description: 'Zigbee light',
|
|
600
602
|
vendor: 'TuYa',
|
|
@@ -627,6 +629,7 @@ module.exports = [
|
|
|
627
629
|
{modelID: 'TS0202', manufacturerName: '_TZ3000_tiwq83wk'},
|
|
628
630
|
{modelID: 'TS0202', manufacturerName: '_TZ3000_ykwcwxmz'},
|
|
629
631
|
{modelID: 'TS0202', manufacturerName: '_TZ3000_hgu1dlak'},
|
|
632
|
+
{modelID: 'TS0202', manufacturerName: '_TZ3000_h4wnrtck'},
|
|
630
633
|
{modelID: 'WHD02', manufacturerName: '_TZ3000_hktqahrq'}],
|
|
631
634
|
model: 'TS0202',
|
|
632
635
|
vendor: 'TuYa',
|
|
@@ -981,6 +984,7 @@ module.exports = [
|
|
|
981
984
|
{modelID: 'TS0502B', manufacturerName: '_TZ3210_2p6wbry3'},
|
|
982
985
|
{modelID: 'TS0502B', manufacturerName: '_TZ3210_qamcypen'},
|
|
983
986
|
{modelID: 'TS0502B', manufacturerName: '_TZ3210_zdrhqmo0'},
|
|
987
|
+
{modelID: 'TS0502B', manufacturerName: '_TZ3210_2cjfbpy0'},
|
|
984
988
|
],
|
|
985
989
|
model: 'TS0502B',
|
|
986
990
|
vendor: 'TuYa',
|
|
@@ -2520,7 +2524,7 @@ module.exports = [
|
|
|
2520
2524
|
},
|
|
2521
2525
|
{
|
|
2522
2526
|
fingerprint: [{modelID: 'TS004F', manufacturerName: '_TZ3000_4fjiwweb'}, {modelID: 'TS004F', manufacturerName: '_TZ3000_uri7ongn'},
|
|
2523
|
-
{modelID: 'TS004F', manufacturerName: '_TZ3000_ixla93vd'}],
|
|
2527
|
+
{modelID: 'TS004F', manufacturerName: '_TZ3000_ixla93vd'}, {modelID: 'TS004F', manufacturerName: '_TZ3000_qja6nq5z'}],
|
|
2524
2528
|
model: 'ERS-10TZBVK-AA',
|
|
2525
2529
|
vendor: 'TuYa',
|
|
2526
2530
|
description: 'Smart knob',
|
package/devices/xiaomi.js
CHANGED
|
@@ -40,6 +40,21 @@ const preventReset = async (type, data, device) => {
|
|
|
40
40
|
};
|
|
41
41
|
|
|
42
42
|
module.exports = [
|
|
43
|
+
{
|
|
44
|
+
zigbeeModel: ['lumi.flood.acn001'],
|
|
45
|
+
model: 'SJCGQ13LM',
|
|
46
|
+
vendor: 'Xiaomi',
|
|
47
|
+
description: 'Aqara E1 water leak sensor',
|
|
48
|
+
fromZigbee: [fz.ias_water_leak_alarm_1, fz.aqara_opple, fz.battery],
|
|
49
|
+
toZigbee: [],
|
|
50
|
+
exposes: [e.water_leak(), e.battery(), e.battery_low(), e.battery_voltage(), e.device_temperature(), e.power_outage_count(false)],
|
|
51
|
+
meta: {battery: {voltageToPercentage: '3V_2850_3200'}},
|
|
52
|
+
configure: async (device, coordinatorEndpoint, logger) => {
|
|
53
|
+
const endpoint = device.getEndpoint(1);
|
|
54
|
+
await endpoint.read('genPowerCfg', ['batteryVoltage']);
|
|
55
|
+
},
|
|
56
|
+
ota: ota.zigbeeOTA,
|
|
57
|
+
},
|
|
43
58
|
{
|
|
44
59
|
zigbeeModel: ['lumi.magnet.acn001'],
|
|
45
60
|
model: 'MCCGQ14LM',
|
package/lib/ota/ubisys.js
CHANGED
|
@@ -21,22 +21,25 @@ async function getImageMeta(current, logger, device) {
|
|
|
21
21
|
|
|
22
22
|
imageRegex.lastIndex = 0; // reset (global) regex for next exec to match from the beginning again
|
|
23
23
|
let imageMatch = imageRegex.exec(firmwarePageHtml);
|
|
24
|
+
let highestMatch = null;
|
|
24
25
|
while (imageMatch != null) {
|
|
25
26
|
logger.debug(`OTA ubisys: image found: ${imageMatch[0]}`);
|
|
26
27
|
if (parseInt(imageMatch[1], 16) === imageType &&
|
|
27
28
|
parseInt(imageMatch[2], 16) <= hardwareVersion && hardwareVersion <= parseInt(imageMatch[3], 16)) {
|
|
28
|
-
|
|
29
|
+
if (highestMatch === null || parseInt(highestMatch[4], 16) < parseInt(imageMatch[4], 16)) {
|
|
30
|
+
highestMatch = imageMatch;
|
|
31
|
+
}
|
|
29
32
|
}
|
|
30
33
|
imageMatch = imageRegex.exec(firmwarePageHtml);
|
|
31
34
|
}
|
|
32
|
-
assert(
|
|
35
|
+
assert(highestMatch !== null,
|
|
33
36
|
`No image available for imageType '0x${imageType.toString(16)}' with hardware version ${hardwareVersion}`);
|
|
34
37
|
|
|
35
38
|
return {
|
|
36
|
-
hardwareVersionMin: parseInt(
|
|
37
|
-
hardwareVersionMax: parseInt(
|
|
38
|
-
fileVersion: parseInt(
|
|
39
|
-
url: url.resolve(firmwareHtmlPageUrl,
|
|
39
|
+
hardwareVersionMin: parseInt(highestMatch[2], 16),
|
|
40
|
+
hardwareVersionMax: parseInt(highestMatch[3], 16),
|
|
41
|
+
fileVersion: parseInt(highestMatch[4], 16),
|
|
42
|
+
url: url.resolve(firmwareHtmlPageUrl, highestMatch[0]),
|
|
40
43
|
};
|
|
41
44
|
}
|
|
42
45
|
|
package/lib/xiaomi.js
CHANGED
|
@@ -191,10 +191,7 @@ const numericAttributes2Payload = (msg, meta, model, options, dataObject) => {
|
|
|
191
191
|
}
|
|
192
192
|
break;
|
|
193
193
|
case '11':
|
|
194
|
-
if (['
|
|
195
|
-
// We don't know what the value means for these devices.
|
|
196
|
-
// https://github.com/Koenkk/zigbee2mqtt/issues/12451
|
|
197
|
-
} else {
|
|
194
|
+
if (['RTCGQ11LM'].includes(model.model)) {
|
|
198
195
|
payload.illuminance = calibrateAndPrecisionRoundOptions(value, options, 'illuminance');
|
|
199
196
|
// DEPRECATED: remove illuminance_lux here.
|
|
200
197
|
payload.illuminance_lux = calibrateAndPrecisionRoundOptions(value, options, 'illuminance_lux');
|
|
@@ -241,6 +238,8 @@ const numericAttributes2Payload = (msg, meta, model, options, dataObject) => {
|
|
|
241
238
|
} else if (['SJCGQ11LM'].includes(model.model)) {
|
|
242
239
|
// Ignore the message. It seems not reliable. See discussion here https://github.com/Koenkk/zigbee2mqtt/issues/12018
|
|
243
240
|
// payload.water_leak = value === 1;
|
|
241
|
+
} else if (['SJCGQ13LM'].includes(model.model)) {
|
|
242
|
+
payload.water_leak = value === 1;
|
|
244
243
|
} else if (['JTYJ-GD-01LM/BW'].includes(model.model)) {
|
|
245
244
|
payload.smoke_density = value;
|
|
246
245
|
} else if (['GZCGQ01LM'].includes(model.model)) {
|