zigbee-herdsman-converters 15.0.112 → 15.0.114
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 +7 -3
- package/devices/develco.js +24 -0
- package/devices/ewelink.js +1 -1
- package/devices/ge.js +6 -1
- package/devices/legrand.js +8 -4
- package/devices/lidl.js +1 -1
- package/devices/nue_3a.js +1 -1
- package/devices/owon.js +5 -0
- package/devices/third_reality.js +1 -0
- package/devices/tuya.js +93 -29
- package/devices/xiaomi.js +2 -0
- package/lib/ota/common.js +1 -1
- package/package.json +3 -3
package/converters/fromZigbee.js
CHANGED
|
@@ -5264,16 +5264,20 @@ const converters = {
|
|
|
5264
5264
|
return payload;
|
|
5265
5265
|
},
|
|
5266
5266
|
},
|
|
5267
|
-
|
|
5267
|
+
legrand_greenpower_254: {
|
|
5268
5268
|
cluster: 'greenPower',
|
|
5269
5269
|
type: ['commandNotification', 'commandCommisioningNotification'],
|
|
5270
5270
|
convert: (model, msg, publish, options, meta) => {
|
|
5271
5271
|
const commandID = msg.data.commandID;
|
|
5272
5272
|
if (hasAlreadyProcessedMessage(msg, model, msg.data.frameCounter, `${msg.device.ieeeAddr}_${commandID}`)) return;
|
|
5273
5273
|
if (commandID === 224) return;
|
|
5274
|
-
const lookup = {
|
|
5274
|
+
const lookup = {
|
|
5275
|
+
0x10: 'home_arrival', 0x11: 'home_departure', // ZLGP14
|
|
5276
|
+
0x12: 'daytime_day', 0x13: 'daytime_night', // ZLGP16, yes these commandIDs are lower than ZLGP15s'
|
|
5277
|
+
0x14: 'press_1', 0x15: 'press_2', 0x16: 'press_3', 0x17: 'press_4', // ZLGP15
|
|
5278
|
+
};
|
|
5275
5279
|
if (!lookup.hasOwnProperty(commandID)) {
|
|
5276
|
-
meta.logger.error(`
|
|
5280
|
+
meta.logger.error(`GreenPower_254: missing command '${commandID}'`);
|
|
5277
5281
|
} else {
|
|
5278
5282
|
return {action: lookup[commandID]};
|
|
5279
5283
|
}
|
package/devices/develco.js
CHANGED
|
@@ -487,6 +487,30 @@ module.exports = [
|
|
|
487
487
|
.withDescription('Indicates reason if any fault'),
|
|
488
488
|
exposes.binary('fault', ea.STATE, true, false).withDescription('Indicates whether the device are in fault state')],
|
|
489
489
|
},
|
|
490
|
+
{
|
|
491
|
+
zigbeeModel: ['SPLZB-141'],
|
|
492
|
+
model: 'SPLZB-141',
|
|
493
|
+
vendor: 'Develco',
|
|
494
|
+
description: 'Power plug',
|
|
495
|
+
fromZigbee: [fz.on_off, develco.fz.electrical_measurement, develco.fz.metering],
|
|
496
|
+
toZigbee: [tz.on_off],
|
|
497
|
+
exposes: [e.switch(), e.power(), e.current(), e.voltage(), e.energy(), e.ac_frequency()],
|
|
498
|
+
configure: async (device, coordinatorEndpoint, logger) => {
|
|
499
|
+
const endpoint = device.getEndpoint(2);
|
|
500
|
+
await reporting.bind(endpoint, coordinatorEndpoint, ['genOnOff', 'haElectricalMeasurement', 'seMetering']);
|
|
501
|
+
await reporting.onOff(endpoint);
|
|
502
|
+
await reporting.readEletricalMeasurementMultiplierDivisors(endpoint);
|
|
503
|
+
await reporting.activePower(endpoint);
|
|
504
|
+
await reporting.rmsCurrent(endpoint);
|
|
505
|
+
await reporting.rmsVoltage(endpoint);
|
|
506
|
+
await reporting.readMeteringMultiplierDivisor(endpoint);
|
|
507
|
+
await reporting.currentSummDelivered(endpoint);
|
|
508
|
+
await reporting.acFrequency(endpoint);
|
|
509
|
+
},
|
|
510
|
+
endpoint: (device) => {
|
|
511
|
+
return {default: 2};
|
|
512
|
+
},
|
|
513
|
+
},
|
|
490
514
|
{
|
|
491
515
|
zigbeeModel: ['HESZB-120'],
|
|
492
516
|
model: 'HESZB-120',
|
package/devices/ewelink.js
CHANGED
|
@@ -82,7 +82,7 @@ module.exports = [
|
|
|
82
82
|
model: 'ZB-SW01',
|
|
83
83
|
vendor: 'eWeLink',
|
|
84
84
|
description: 'Smart light switch - 1 gang',
|
|
85
|
-
extend: extend.switch(),
|
|
85
|
+
extend: extend.switch({disablePowerOnBehavior: true}),
|
|
86
86
|
fromZigbee: [fz.on_off_skip_duplicate_transaction],
|
|
87
87
|
onEvent: async (type, data, device) => {
|
|
88
88
|
device.skipDefaultResponse = true;
|
package/devices/ge.js
CHANGED
|
@@ -78,12 +78,17 @@ module.exports = [
|
|
|
78
78
|
model: '45857GE',
|
|
79
79
|
vendor: 'GE',
|
|
80
80
|
description: 'ZigBee in-wall smart dimmer',
|
|
81
|
+
exposes: extend.light_onoff_brightness({noConfigure: true}).exposes.concat([e.energy(), e.power()]),
|
|
82
|
+
fromZigbee: extend.light_onoff_brightness({noConfigure: true}).fromZigbee.concat([fz.metering]),
|
|
81
83
|
extend: extend.light_onoff_brightness({noConfigure: true}),
|
|
82
84
|
configure: async (device, coordinatorEndpoint, logger) => {
|
|
83
85
|
await extend.light_onoff_brightness().configure(device, coordinatorEndpoint, logger);
|
|
84
86
|
const endpoint = device.getEndpoint(1);
|
|
85
|
-
await reporting.bind(endpoint, coordinatorEndpoint, ['genOnOff']);
|
|
87
|
+
await reporting.bind(endpoint, coordinatorEndpoint, ['genOnOff', 'seMetering']);
|
|
86
88
|
await reporting.onOff(endpoint);
|
|
89
|
+
await reporting.instantaneousDemand(endpoint);
|
|
90
|
+
await reporting.currentSummDelivered(endpoint);
|
|
91
|
+
endpoint.saveClusterAttributeKeyValue('seMetering', {divisor: 10000, multiplier: 1});
|
|
87
92
|
},
|
|
88
93
|
},
|
|
89
94
|
{
|
package/devices/legrand.js
CHANGED
|
@@ -385,12 +385,16 @@ module.exports = [
|
|
|
385
385
|
},
|
|
386
386
|
{
|
|
387
387
|
fingerprint: [{modelID: 'GreenPower_254', ieeeAddr: /^0x00000000005.....$/}],
|
|
388
|
-
model: 'ZLGP15',
|
|
388
|
+
model: 'ZLGP14/ZLGP15/ZLGP16',
|
|
389
389
|
vendor: 'Legrand',
|
|
390
|
-
description: 'Wireless and batteryless 4
|
|
391
|
-
fromZigbee: [fz.
|
|
390
|
+
description: 'Wireless and batteryless scenario switch (home arrival/departure, 1-4 switches, daytime day/night)',
|
|
391
|
+
fromZigbee: [fz.legrand_greenpower_254],
|
|
392
392
|
toZigbee: [],
|
|
393
|
-
exposes: [e.action([
|
|
393
|
+
exposes: [e.action([
|
|
394
|
+
'home_arrival', 'home_departure', // ZLGP14
|
|
395
|
+
'press_1', 'press_2', 'press_3', 'press_4', // ZLGP15
|
|
396
|
+
'daytime_day', 'daytime_night', // ZLGP16
|
|
397
|
+
])],
|
|
394
398
|
},
|
|
395
399
|
{
|
|
396
400
|
fingerprint: [{modelID: 'GreenPower_2', ieeeAddr: /^0x00000000005.....$/}],
|
package/devices/lidl.js
CHANGED
|
@@ -553,7 +553,7 @@ module.exports = [
|
|
|
553
553
|
model: 'HG06337',
|
|
554
554
|
vendor: 'Lidl',
|
|
555
555
|
description: 'Silvercrest smart plug (EU, CH, FR, BS, DK)',
|
|
556
|
-
extend: tuya.extend.switch(),
|
|
556
|
+
extend: tuya.extend.switch({indicatorMode: true}),
|
|
557
557
|
configure: async (device, coordinatorEndpoint, logger) => {
|
|
558
558
|
const endpoint = device.getEndpoint(11);
|
|
559
559
|
await reporting.bind(endpoint, coordinatorEndpoint, ['genOnOff']);
|
package/devices/nue_3a.js
CHANGED
|
@@ -37,7 +37,7 @@ module.exports = [
|
|
|
37
37
|
model: 'HGZB-01',
|
|
38
38
|
vendor: 'Nue / 3A',
|
|
39
39
|
description: 'Smart Zigbee 3.0 light controller',
|
|
40
|
-
extend: extend.switch(),
|
|
40
|
+
extend: extend.switch({disablePowerOnBehavior: true}),
|
|
41
41
|
whiteLabel: [{vendor: 'Zemismart', model: 'ZW-EU-01', description: 'Smart light relay - 1 gang'},
|
|
42
42
|
{vendor: 'Moes', model: 'ZK-CH-2U', description: 'Plug with 2 USB ports'}],
|
|
43
43
|
configure: async (device, coordinatorEndpoint, logger) => {
|
package/devices/owon.js
CHANGED
|
@@ -109,6 +109,7 @@ module.exports = [
|
|
|
109
109
|
zigbeeModel: ['WSP403-E'],
|
|
110
110
|
model: 'WSP403',
|
|
111
111
|
vendor: 'OWON',
|
|
112
|
+
whiteLabel: [{vendor: 'Oz Smart Things', model: 'WSP403'}],
|
|
112
113
|
description: 'Smart plug',
|
|
113
114
|
fromZigbee: [fz.on_off, fz.metering],
|
|
114
115
|
toZigbee: [tz.on_off],
|
|
@@ -121,6 +122,10 @@ module.exports = [
|
|
|
121
122
|
await reporting.instantaneousDemand(endpoint, {min: 5, max: constants.repInterval.MINUTES_5, change: 2}); // divider 1000: 2W
|
|
122
123
|
await reporting.currentSummDelivered(endpoint, {min: 5, max: constants.repInterval.MINUTES_5,
|
|
123
124
|
change: [10, 10]}); // divider 1000: 0,01kWh
|
|
125
|
+
|
|
126
|
+
// At least some white label devices, like the Oz Smart Things device, don't report a power source so we need to force it
|
|
127
|
+
device.powerSource = 'Mains (single phase)';
|
|
128
|
+
device.save();
|
|
124
129
|
},
|
|
125
130
|
},
|
|
126
131
|
{
|
package/devices/third_reality.js
CHANGED
|
@@ -199,6 +199,7 @@ module.exports = [
|
|
|
199
199
|
description: 'Zigbee vibration sensor',
|
|
200
200
|
fromZigbee: [fz.ias_vibration_alarm_1, fz.battery],
|
|
201
201
|
toZigbee: [],
|
|
202
|
+
ota: ota.zigbeeOTA,
|
|
202
203
|
exposes: [e.vibration(), e.battery_low(), e.battery(), e.battery_voltage()],
|
|
203
204
|
configure: async (device, coordinatorEndpoint, logger) => {
|
|
204
205
|
const endpoint = device.getEndpoint(1);
|
package/devices/tuya.js
CHANGED
|
@@ -514,6 +514,14 @@ const tzLocal = {
|
|
|
514
514
|
};
|
|
515
515
|
|
|
516
516
|
const fzLocal = {
|
|
517
|
+
TS0222_humidity: {
|
|
518
|
+
...fz.humidity,
|
|
519
|
+
convert: (model, msg, publish, options, meta) => {
|
|
520
|
+
const result = fz.humidity.convert(model, msg, publish, options, meta);
|
|
521
|
+
result.humidity *= 10;
|
|
522
|
+
return result;
|
|
523
|
+
},
|
|
524
|
+
},
|
|
517
525
|
TS110E: {
|
|
518
526
|
cluster: 'genLevelCtrl',
|
|
519
527
|
type: ['attributeReport', 'readResponse'],
|
|
@@ -901,7 +909,7 @@ const fzLocal = {
|
|
|
901
909
|
|
|
902
910
|
// Wait 5 seconds before reporting a 0 value as this could be an invalid measurement.
|
|
903
911
|
// https://github.com/Koenkk/zigbee2mqtt/issues/16709#issuecomment-1509599046
|
|
904
|
-
if (['_TZ3000_gvn91tmx', '_TZ3000_amdymr7l', '_TZ3000_typdpbpg', '_TZ3000_hdopuwv6'].includes(meta.device.manufacturerName)) {
|
|
912
|
+
if (result && ['_TZ3000_gvn91tmx', '_TZ3000_amdymr7l', '_TZ3000_typdpbpg', '_TZ3000_hdopuwv6'].includes(meta.device.manufacturerName)) {
|
|
905
913
|
for (const key of ['power', 'current', 'voltage']) {
|
|
906
914
|
if (key in result) {
|
|
907
915
|
const value = result[key];
|
|
@@ -1089,7 +1097,7 @@ module.exports = [
|
|
|
1089
1097
|
description: 'Smart air house keeper',
|
|
1090
1098
|
fromZigbee: [fz.tuya_air_quality],
|
|
1091
1099
|
toZigbee: [],
|
|
1092
|
-
exposes: [e.temperature(), e.humidity(), e.co2(), e.voc().withUnit('ppm'), e.formaldehyd().withUnit('
|
|
1100
|
+
exposes: [e.temperature(), e.humidity(), e.co2(), e.voc().withUnit('ppm'), e.formaldehyd().withUnit('µg/m³'),
|
|
1093
1101
|
e.pm25().withValueMin(0).withValueMax(999).withValueStep(1)],
|
|
1094
1102
|
},
|
|
1095
1103
|
{
|
|
@@ -1259,8 +1267,8 @@ module.exports = [
|
|
|
1259
1267
|
model: 'TS0505B_1',
|
|
1260
1268
|
vendor: 'TuYa',
|
|
1261
1269
|
description: 'Zigbee RGB+CCT light',
|
|
1262
|
-
whiteLabel: [{vendor: 'Mercator
|
|
1263
|
-
{vendor: 'TuYa', model: 'A5C-21F7-01'}, {vendor: 'Mercator
|
|
1270
|
+
whiteLabel: [{vendor: 'Mercator Ikuü', model: 'SMD4106W-RGB-ZB'},
|
|
1271
|
+
{vendor: 'TuYa', model: 'A5C-21F7-01'}, {vendor: 'Mercator Ikuü', model: 'S9E27LED9W-RGB-Z'},
|
|
1264
1272
|
{vendor: 'Aldi', model: 'L122CB63H11A9.0W', description: 'LIGHTWAY smart home LED-lamp - bulb'},
|
|
1265
1273
|
{vendor: 'Lidl', model: '14153706L', description: 'Livarno smart LED ceiling light'},
|
|
1266
1274
|
{vendor: 'Zemismart', model: 'LXZB-ZB-09A', description: 'Zemismart LED Surface Mounted Downlight 9W RGBW'},
|
|
@@ -1443,7 +1451,7 @@ module.exports = [
|
|
|
1443
1451
|
model: 'TS0202',
|
|
1444
1452
|
vendor: 'TuYa',
|
|
1445
1453
|
description: 'Motion sensor',
|
|
1446
|
-
whiteLabel: [{vendor: 'Mercator
|
|
1454
|
+
whiteLabel: [{vendor: 'Mercator Ikuü', model: 'SMA02P'},
|
|
1447
1455
|
{vendor: 'TuYa', model: 'TY-ZPR06'},
|
|
1448
1456
|
{vendor: 'Tesla Smart', model: 'TS0202'},
|
|
1449
1457
|
tuya.whitelabel('MiBoxer', 'PIR1-ZB', 'PIR sensor', ['_TZ3040_wqmtjsyk']),
|
|
@@ -1517,7 +1525,11 @@ module.exports = [
|
|
|
1517
1525
|
vendor: 'TuYa',
|
|
1518
1526
|
description: 'Water leak detector',
|
|
1519
1527
|
fromZigbee: [fz.ias_water_leak_alarm_1, fz.battery],
|
|
1520
|
-
whiteLabel: [
|
|
1528
|
+
whiteLabel: [
|
|
1529
|
+
{vendor: 'CR Smart Home', model: 'TS0207'},
|
|
1530
|
+
tuya.whitelabel('Meian', 'SW02', 'Water leak sensor', ['_TZ3000_kyb656no']),
|
|
1531
|
+
tuya.whitelabel('Aubess', 'IH-K665', 'Water leak sensor', ['_TZ3000_k4ej3ww2']),
|
|
1532
|
+
],
|
|
1521
1533
|
toZigbee: [],
|
|
1522
1534
|
configure: async (device, coordinatorEndpoint, logger) => {
|
|
1523
1535
|
const endpoint = device.getEndpoint(1);
|
|
@@ -1527,13 +1539,20 @@ module.exports = [
|
|
|
1527
1539
|
exposes: [e.water_leak(), e.battery_low(), e.battery()],
|
|
1528
1540
|
},
|
|
1529
1541
|
{
|
|
1530
|
-
fingerprint: tuya.fingerprint('TS0101', ['_TYZB01_ijihzffk', '_TZ3210_tfxwxklq']),
|
|
1542
|
+
fingerprint: tuya.fingerprint('TS0101', ['_TYZB01_ijihzffk', '_TZ3210_tfxwxklq', '_TZ3210_2dfy6tol']),
|
|
1531
1543
|
model: 'TS0101',
|
|
1532
1544
|
vendor: 'TuYa',
|
|
1533
1545
|
description: 'Zigbee Socket',
|
|
1534
|
-
whiteLabel: [
|
|
1546
|
+
whiteLabel: [
|
|
1547
|
+
{vendor: 'Larkkey', model: 'PS080'}, {vendor: 'Mercator', model: 'SPBS01G'},
|
|
1548
|
+
tuya.whitelabel('Mercator', 'SISW01', 'Ikuü inline switch', ['_TZ3210_2dfy6tol']),
|
|
1549
|
+
],
|
|
1535
1550
|
extend: tuya.extend.switch(),
|
|
1536
|
-
|
|
1551
|
+
configure: async (device, coordinatorEndpoint, logger) => {
|
|
1552
|
+
const endpoint = device.getEndpoint(1);
|
|
1553
|
+
await reporting.bind(endpoint, coordinatorEndpoint, ['genOnOff']);
|
|
1554
|
+
await reporting.onOff(endpoint);
|
|
1555
|
+
},
|
|
1537
1556
|
},
|
|
1538
1557
|
{
|
|
1539
1558
|
fingerprint: [{modelID: 'TS0108', manufacturerName: '_TYZB01_7yidyqxd'}],
|
|
@@ -1583,7 +1602,7 @@ module.exports = [
|
|
|
1583
1602
|
{vendor: 'Earda', model: 'EDM-1ZAA-EU'},
|
|
1584
1603
|
{vendor: 'Earda', model: 'EDM-1ZAB-EU'},
|
|
1585
1604
|
{vendor: 'Earda', model: 'EDM-1ZBA-EU'},
|
|
1586
|
-
{vendor: 'Mercator
|
|
1605
|
+
{vendor: 'Mercator Ikuü', model: 'SSWD01'},
|
|
1587
1606
|
{vendor: 'Moes', model: 'ZS-USD'},
|
|
1588
1607
|
{vendor: 'Moes', model: 'EDM-1ZBB-EU'},
|
|
1589
1608
|
],
|
|
@@ -2020,8 +2039,8 @@ module.exports = [
|
|
|
2020
2039
|
vendor: 'TuYa',
|
|
2021
2040
|
description: 'Light controller',
|
|
2022
2041
|
whiteLabel: [
|
|
2023
|
-
{vendor: 'Mercator
|
|
2024
|
-
{vendor: 'Mercator
|
|
2042
|
+
{vendor: 'Mercator Ikuü', model: 'SMI7040', description: 'Ford Batten Light'},
|
|
2043
|
+
{vendor: 'Mercator Ikuü', model: 'SMD9300', description: 'Donovan Panel Light'},
|
|
2025
2044
|
tuya.whitelabel('Aldi', 'F122SB62H22A4.5W', 'LIGHTWAY smart home LED-lamp - filament', ['_TZ3000_g1glzzfk']),
|
|
2026
2045
|
tuya.whitelabel('Miboxer', 'FUT035Z', 'Dual white LED controller', ['_TZ3210_frm6149r', '_TZ3210_jtifm80b', '_TZ3210_xwqng7ol']),
|
|
2027
2046
|
tuya.whitelabel('Lidl', '14156408L', 'Livarno Lux smart LED ceiling light', ['_TZ3210_c2iwpxf1']),
|
|
@@ -2671,7 +2690,7 @@ module.exports = [
|
|
|
2671
2690
|
.withRunningState(['idle', 'heat'], ea.STATE),
|
|
2672
2691
|
e.auto_lock(), e.away_mode(), e.away_preset_days(), e.boost_time(), e.comfort_temperature(), e.eco_temperature(), e.force(),
|
|
2673
2692
|
e.max_temperature().withValueMin(16).withValueMax(70), e.min_temperature(), e.away_preset_temperature(),
|
|
2674
|
-
exposes.composite('programming_mode', 'programming_mode', ea.STATE).withDescription('Schedule MODE
|
|
2693
|
+
exposes.composite('programming_mode', 'programming_mode', ea.STATE).withDescription('Schedule MODE â± - In this mode, ' +
|
|
2675
2694
|
'the device executes a preset week programming temperature time and temperature.')
|
|
2676
2695
|
.withFeature(e.week())
|
|
2677
2696
|
.withFeature(exposes.text('workdays_schedule', ea.STATE_SET))
|
|
@@ -2784,9 +2803,9 @@ module.exports = [
|
|
|
2784
2803
|
' by switching the heating off. To achieve this, the valve is closed fully. To activate the '+
|
|
2785
2804
|
'heating stop, the device display "HS", press the pair button to cancel.'),
|
|
2786
2805
|
tuya.exposes.frostProtection('When Anti-Freezing function is activated, the temperature in the house is kept '+
|
|
2787
|
-
'at 8
|
|
2806
|
+
'at 8 °C, the device display "AF".press the pair button to cancel.'),
|
|
2788
2807
|
exposes.numeric('boost_timeset_countdown', ea.STATE_SET).withUnit('second').withDescription('Setting '+
|
|
2789
|
-
'minimum 0 - maximum 465 seconds boost time. The boost (
|
|
2808
|
+
'minimum 0 - maximum 465 seconds boost time. The boost (â¨) function is activated. The remaining '+
|
|
2790
2809
|
'time for the function will be counted down in seconds ( 465 to 0 ).').withValueMin(0).withValueMax(465),
|
|
2791
2810
|
e.holiday_temperature().withValueMin(5).withValueMax(30),
|
|
2792
2811
|
exposes.text('holiday_start_stop', ea.STATE_SET).withDescription('The holiday mode will automatically start ' +
|
|
@@ -2923,7 +2942,7 @@ module.exports = [
|
|
|
2923
2942
|
'two weeks. It will run for 30 seconds per time with the screen displaying "Ad", then return to its normal working state ' +
|
|
2924
2943
|
'again.'),
|
|
2925
2944
|
exposes.binary('frost_protection', ea.STATE_SET, 'ON', 'OFF').withDescription('When the room temperature is lower than ' +
|
|
2926
|
-
'5
|
|
2945
|
+
'5 °C, the valve opens; when the temperature rises to 8 °C, the valve closes.'),
|
|
2927
2946
|
exposes.numeric('error', ea.STATE).withDescription('If NTC is damaged, "Er" will be on the TRV display.'),
|
|
2928
2947
|
],
|
|
2929
2948
|
meta: {
|
|
@@ -3013,9 +3032,9 @@ module.exports = [
|
|
|
3013
3032
|
.withLocalTemperature(ea.STATE).withSetpoint('current_heating_setpoint', 5, 35, 0.5, ea.STATE_SET)
|
|
3014
3033
|
.withLocalTemperatureCalibration(-30, 30, 0.1, ea.STATE_SET)
|
|
3015
3034
|
.withPreset(['auto', 'manual', 'off', 'on'],
|
|
3016
|
-
'MANUAL MODE
|
|
3035
|
+
'MANUAL MODE â - In this mode, the device executes manual temperature setting. ' +
|
|
3017
3036
|
'When the set temperature is lower than the "minimum temperature", the valve is closed (forced closed). ' +
|
|
3018
|
-
'AUTO MODE
|
|
3037
|
+
'AUTO MODE â± - In this mode, the device executes a preset week programming temperature time and temperature. ' +
|
|
3019
3038
|
'ON - In this mode, the thermostat stays open ' +
|
|
3020
3039
|
'OFF - In this mode, the thermostat stays closed')
|
|
3021
3040
|
.withSystemMode(['auto', 'heat', 'off'], ea.STATE)
|
|
@@ -3023,7 +3042,7 @@ module.exports = [
|
|
|
3023
3042
|
...tuya.exposes.scheduleAllDays(ea.STATE_SET, 'HH:MM/C HH:MM/C HH:MM/C HH:MM/C'),
|
|
3024
3043
|
exposes.binary('boost_heating', ea.STATE_SET, 'ON', 'OFF')
|
|
3025
3044
|
.withDescription('Boost Heating: press and hold "+" for 3 seconds, ' +
|
|
3026
|
-
'the device will enter the boost heating mode, and the
|
|
3045
|
+
'the device will enter the boost heating mode, and the â·âµâ will flash. The countdown will be displayed in the APP'),
|
|
3027
3046
|
exposes.numeric('boost_time', ea.STATE_SET).withUnit('min').withDescription('Countdown in minutes')
|
|
3028
3047
|
.withValueMin(0).withValueMax(1000),
|
|
3029
3048
|
],
|
|
@@ -3605,7 +3624,7 @@ module.exports = [
|
|
|
3605
3624
|
{vendor: 'Vrey', model: 'VR-X712U-0013'},
|
|
3606
3625
|
{vendor: 'TUYATEC', model: 'GDKES-01TZXD'},
|
|
3607
3626
|
{vendor: 'Lonsonho', model: 'QS-Zigbee-S05-L', description: '1 gang smart switch module without neutral wire'},
|
|
3608
|
-
{vendor: 'Mercator
|
|
3627
|
+
{vendor: 'Mercator Ikuü', model: 'SSW01'},
|
|
3609
3628
|
],
|
|
3610
3629
|
configure: async (device, coordinatorEndpoint, logger) => {
|
|
3611
3630
|
await tuya.configureMagicPacket(device, coordinatorEndpoint, logger);
|
|
@@ -3733,7 +3752,7 @@ module.exports = [
|
|
|
3733
3752
|
return {'l1': 1, 'l2': 2, 'l3': 3, 'l4': 4};
|
|
3734
3753
|
},
|
|
3735
3754
|
whiteLabel: [{vendor: 'TUYATEC', model: 'GDKES-04TZXD'}, {vendor: 'Vizo', model: 'VZ-222S'},
|
|
3736
|
-
{vendor: 'MakeGood', model: 'MG-ZG04W/B/G'}, {vendor: 'Mercator
|
|
3755
|
+
{vendor: 'MakeGood', model: 'MG-ZG04W/B/G'}, {vendor: 'Mercator Ikuü', model: 'SSW04'}],
|
|
3737
3756
|
meta: {multiEndpoint: true},
|
|
3738
3757
|
configure: async (device, coordinatorEndpoint, logger) => {
|
|
3739
3758
|
await tuya.configureMagicPacket(device, coordinatorEndpoint, logger);
|
|
@@ -3975,17 +3994,29 @@ module.exports = [
|
|
|
3975
3994
|
.withDescription('Antifreeze function'),
|
|
3976
3995
|
exposes.binary('factory_reset', ea.STATE_SET, 'ON', 'OFF')
|
|
3977
3996
|
.withDescription('Resets all settings to default. Doesn\'t unpair device.'),
|
|
3978
|
-
exposes.numeric('heating_temp_limit', ea.STATE_SET).withUnit('
|
|
3997
|
+
exposes.numeric('heating_temp_limit', ea.STATE_SET).withUnit('°C').withValueMax(60)
|
|
3979
3998
|
.withValueMin(5).withValueStep(1).withPreset('default', 35, 'Default value')
|
|
3980
3999
|
.withDescription('Heating temperature limit'),
|
|
3981
|
-
exposes.numeric('deadzone_temperature', ea.STATE_SET).withUnit('
|
|
4000
|
+
exposes.numeric('deadzone_temperature', ea.STATE_SET).withUnit('°C').withValueMax(9.5)
|
|
3982
4001
|
.withValueMin(0.5).withValueStep(0.5).withPreset('default', 1, 'Default value')
|
|
3983
4002
|
.withDescription('The delta between local_temperature and current_heating_setpoint to trigger Heat'),
|
|
3984
|
-
exposes.numeric('upper_temp', ea.STATE_SET).withUnit('
|
|
4003
|
+
exposes.numeric('upper_temp', ea.STATE_SET).withUnit('°C').withValueMax(95)
|
|
3985
4004
|
.withValueMin(35).withValueStep(1).withPreset('default', 60, 'Default value'),
|
|
3986
4005
|
],
|
|
3987
4006
|
onEvent: tuya.onEventSetTime,
|
|
3988
4007
|
},
|
|
4008
|
+
{
|
|
4009
|
+
fingerprint: tuya.fingerprint('TS0222', ['_TZ3000_kky16aay']),
|
|
4010
|
+
model: 'TS0222_temperature_humidity',
|
|
4011
|
+
vendor: 'TuYa',
|
|
4012
|
+
description: 'Temperature & humidity sensor',
|
|
4013
|
+
fromZigbee: [fzLocal.TS0222_humidity, fz.battery, fz.temperature, fz.illuminance],
|
|
4014
|
+
toZigbee: [],
|
|
4015
|
+
exposes: [e.battery(), e.temperature(), e.humidity(), e.illuminance()],
|
|
4016
|
+
whiteLabel: [
|
|
4017
|
+
tuya.whitelabel('TuYa', 'QT-07S', 'Soil sensor', ['_TZ3000_kky16aay']),
|
|
4018
|
+
],
|
|
4019
|
+
},
|
|
3989
4020
|
{
|
|
3990
4021
|
fingerprint: [{modelID: 'TS0222', manufacturerName: '_TYZB01_4mdqxxnn'},
|
|
3991
4022
|
{modelID: 'TS0222', manufacturerName: '_TYZB01_m6ec2pgj'}],
|
|
@@ -4106,9 +4137,9 @@ module.exports = [
|
|
|
4106
4137
|
'msTemperatureMeasurement', 'msIlluminanceMeasurement', 'msRelativeHumidity', 'manuSpecificTuya_2']);
|
|
4107
4138
|
},
|
|
4108
4139
|
exposes: [e.temperature(), e.humidity(), e.battery(), e.illuminance(), e.illuminance_lux(),
|
|
4109
|
-
exposes.numeric('alarm_temperature_max', ea.STATE_SET).withUnit('
|
|
4140
|
+
exposes.numeric('alarm_temperature_max', ea.STATE_SET).withUnit('°C').withDescription('Alarm temperature max')
|
|
4110
4141
|
.withValueMin(-20).withValueMax(80),
|
|
4111
|
-
exposes.numeric('alarm_temperature_min', ea.STATE_SET).withUnit('
|
|
4142
|
+
exposes.numeric('alarm_temperature_min', ea.STATE_SET).withUnit('°C').withDescription('Alarm temperature min')
|
|
4112
4143
|
.withValueMin(-20).withValueMax(80),
|
|
4113
4144
|
exposes.numeric('alarm_humidity_max', ea.STATE_SET).withUnit('%').withDescription('Alarm humidity max')
|
|
4114
4145
|
.withValueMin(0).withValueMax(100),
|
|
@@ -4145,7 +4176,7 @@ module.exports = [
|
|
|
4145
4176
|
],
|
|
4146
4177
|
},
|
|
4147
4178
|
{
|
|
4148
|
-
fingerprint: tuya.fingerprint('TS0601', ['_TZE200_lu01t0zl', '_TZE200_vrfecyku']),
|
|
4179
|
+
fingerprint: tuya.fingerprint('TS0601', ['_TZE200_lu01t0zl', '_TZE200_vrfecyku', '_TZE200_ypprdwsl']),
|
|
4149
4180
|
model: 'MIR-HE200-TY',
|
|
4150
4181
|
vendor: 'TuYa',
|
|
4151
4182
|
description: 'Human presence sensor with fall function',
|
|
@@ -4444,9 +4475,9 @@ module.exports = [
|
|
|
4444
4475
|
exposes.enum('temperature_unit_convert', ea.STATE_SET, ['celsius', 'fahrenheit']).withDescription('Current display unit'),
|
|
4445
4476
|
exposes.enum('temperature_alarm', ea.STATE, ['canceled', 'lower_alarm', 'upper_alarm'])
|
|
4446
4477
|
.withDescription('Temperature alarm status'),
|
|
4447
|
-
exposes.numeric('max_temperature', ea.STATE_SET).withUnit('
|
|
4478
|
+
exposes.numeric('max_temperature', ea.STATE_SET).withUnit('°C').withValueMin(-20).withValueMax(60)
|
|
4448
4479
|
.withDescription('Alarm temperature max'),
|
|
4449
|
-
exposes.numeric('min_temperature', ea.STATE_SET).withUnit('
|
|
4480
|
+
exposes.numeric('min_temperature', ea.STATE_SET).withUnit('°C').withValueMin(-20).withValueMax(60)
|
|
4450
4481
|
.withDescription('Alarm temperature min'),
|
|
4451
4482
|
exposes.enum('humidity_alarm', ea.STATE, ['canceled', 'lower_alarm', 'upper_alarm'])
|
|
4452
4483
|
.withDescription('Humidity alarm status'),
|
|
@@ -5133,4 +5164,37 @@ module.exports = [
|
|
|
5133
5164
|
tuya.whitelabel('Homeetec', '37022173', 'Curtain/blind switch with 2 Gang switch', ['_TZE200_5nldle7w']),
|
|
5134
5165
|
],
|
|
5135
5166
|
},
|
|
5167
|
+
{
|
|
5168
|
+
fingerprint: [{modelID: 'TS0601', manufacturerName: '_TZE200_bcusnqt8'}],
|
|
5169
|
+
model: 'SPM01',
|
|
5170
|
+
vendor: 'TuYa',
|
|
5171
|
+
description: 'Smart energy monitor for 1P+N system',
|
|
5172
|
+
fromZigbee: [tuya.fz.datapoints],
|
|
5173
|
+
toZigbee: [tuya.tz.datapoints],
|
|
5174
|
+
configure: tuya.configureMagicPacket,
|
|
5175
|
+
exposes: [e.voltage(), e.power(), e.current(),
|
|
5176
|
+
// Change the description according to the specifications of the device
|
|
5177
|
+
e.energy().withDescription('Total forward active energy'),
|
|
5178
|
+
e.produced_energy().withDescription('Total reverse active energy'),
|
|
5179
|
+
],
|
|
5180
|
+
meta: {
|
|
5181
|
+
tuyaDatapoints: [
|
|
5182
|
+
[1, 'energy', tuya.valueConverter.divideBy100],
|
|
5183
|
+
[2, 'produced_energy', tuya.valueConverter.divideBy100],
|
|
5184
|
+
[6, null, {
|
|
5185
|
+
from: (v) => {
|
|
5186
|
+
return {
|
|
5187
|
+
voltage: v.readUint16BE(0)/10,
|
|
5188
|
+
current: ((v.readUint8(2)<<16)+(v.readUint8(3)<<8)+v.readUint8(4))/1000,
|
|
5189
|
+
power: ((v.readUint8(5)<<16)+(v.readUint8(6)<<8)+v.readUint8(7)),
|
|
5190
|
+
};
|
|
5191
|
+
},
|
|
5192
|
+
}],
|
|
5193
|
+
[6, 'voltage', tuya.valueConverter.raw],
|
|
5194
|
+
[6, 'current', tuya.valueConverter.raw],
|
|
5195
|
+
[6, 'power', tuya.valueConverter.raw],
|
|
5196
|
+
// [9,'',tuya.valueConverter.raw] // Unknown / datatype=5 (bitmap)
|
|
5197
|
+
],
|
|
5198
|
+
},
|
|
5199
|
+
},
|
|
5136
5200
|
];
|
package/devices/xiaomi.js
CHANGED
|
@@ -1759,6 +1759,8 @@ module.exports = [
|
|
|
1759
1759
|
await endpoint.read('genPowerCfg', ['batteryVoltage']);
|
|
1760
1760
|
await endpoint.read('aqaraOpple', [0x0102], {manufacturerCode: 0x115f});
|
|
1761
1761
|
await endpoint.read('aqaraOpple', [0x010c], {manufacturerCode: 0x115f});
|
|
1762
|
+
// This cluster is not discovered automatically and needs to be explicitly attached to enable OTA
|
|
1763
|
+
utils.attachOutputCluster(device, 'genOta');
|
|
1762
1764
|
},
|
|
1763
1765
|
ota: ota.zigbeeOTA,
|
|
1764
1766
|
},
|
package/lib/ota/common.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
const crypto = require('crypto');
|
|
2
2
|
const upgradeFileIdentifier = Buffer.from([0x1E, 0xF1, 0xEE, 0x0B]);
|
|
3
|
-
const HttpsProxyAgent = require('https-proxy-agent');
|
|
3
|
+
const {HttpsProxyAgent} = require('https-proxy-agent');
|
|
4
4
|
const assert = require('assert');
|
|
5
5
|
const crc32 = require('buffer-crc32');
|
|
6
6
|
const maxTimeout = 2147483647; // +- 24 days
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "zigbee-herdsman-converters",
|
|
3
|
-
"version": "15.0.
|
|
3
|
+
"version": "15.0.114",
|
|
4
4
|
"description": "Collection of device converters to be used with zigbee-herdsman",
|
|
5
5
|
"main": "index.js",
|
|
6
6
|
"files": [
|
|
@@ -36,9 +36,9 @@
|
|
|
36
36
|
"dependencies": {
|
|
37
37
|
"axios": "^1.4.0",
|
|
38
38
|
"buffer-crc32": "^0.2.13",
|
|
39
|
-
"https-proxy-agent": "^
|
|
39
|
+
"https-proxy-agent": "^6.1.0",
|
|
40
40
|
"tar-stream": "^3.0.0",
|
|
41
|
-
"zigbee-herdsman": "^0.14.
|
|
41
|
+
"zigbee-herdsman": "^0.14.115"
|
|
42
42
|
},
|
|
43
43
|
"devDependencies": {
|
|
44
44
|
"eslint": "*",
|