zigbee-herdsman-converters 14.0.336 → 14.0.337
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 +38 -0
- package/devices/acova.js +34 -0
- package/devices/custom_devices_diy.js +19 -0
- package/devices/danfoss.js +3 -1
- package/devices/gledopto.js +31 -21
- package/devices/lidl.js +2 -1
- package/devices/sunricher.js +18 -0
- package/devices/sylvania.js +8 -0
- package/devices/tuya.js +7 -3
- package/devices/xiaomi.js +9 -0
- package/lib/exposes.js +1 -1
- package/npm-shrinkwrap.json +1 -1
- package/package.json +1 -1
package/converters/fromZigbee.js
CHANGED
|
@@ -7510,6 +7510,44 @@ const converters = {
|
|
|
7510
7510
|
}
|
|
7511
7511
|
},
|
|
7512
7512
|
},
|
|
7513
|
+
sunricher_switch2801K2: {
|
|
7514
|
+
cluster: 'greenPower',
|
|
7515
|
+
type: ['commandNotification', 'commandCommisioningNotification'],
|
|
7516
|
+
convert: (model, msg, publish, options, meta) => {
|
|
7517
|
+
const commandID = msg.data.commandID;
|
|
7518
|
+
if (hasAlreadyProcessedMessage(msg, msg.data.frameCounter, `${msg.device.ieeeAddr}_${commandID}`)) return;
|
|
7519
|
+
if (commandID === 224) return;
|
|
7520
|
+
const lookup = {0x21: 'press_on', 0x20: 'press_off', 0x34: 'release', 0x35: 'hold_on', 0x36: 'hold_off'};
|
|
7521
|
+
if (!lookup.hasOwnProperty(commandID)) {
|
|
7522
|
+
meta.logger.error(`Sunricher: missing command '${commandID}'`);
|
|
7523
|
+
} else {
|
|
7524
|
+
return {action: lookup[commandID]};
|
|
7525
|
+
}
|
|
7526
|
+
},
|
|
7527
|
+
},
|
|
7528
|
+
sunricher_switch2801K4: {
|
|
7529
|
+
cluster: 'greenPower',
|
|
7530
|
+
type: ['commandNotification', 'commandCommisioningNotification'],
|
|
7531
|
+
convert: (model, msg, publish, options, meta) => {
|
|
7532
|
+
const commandID = msg.data.commandID;
|
|
7533
|
+
if (hasAlreadyProcessedMessage(msg, msg.data.frameCounter, `${msg.device.ieeeAddr}_${commandID}`)) return;
|
|
7534
|
+
if (commandID === 224) return;
|
|
7535
|
+
const lookup = {
|
|
7536
|
+
0x21: 'press_on',
|
|
7537
|
+
0x20: 'press_off',
|
|
7538
|
+
0x37: 'press_high',
|
|
7539
|
+
0x38: 'press_low',
|
|
7540
|
+
0x35: 'hold_high',
|
|
7541
|
+
0x36: 'hold_low',
|
|
7542
|
+
0x34: 'release',
|
|
7543
|
+
};
|
|
7544
|
+
if (!lookup.hasOwnProperty(commandID)) {
|
|
7545
|
+
meta.logger.error(`Sunricher: missing command '${commandID}'`);
|
|
7546
|
+
} else {
|
|
7547
|
+
return {action: lookup[commandID]};
|
|
7548
|
+
}
|
|
7549
|
+
},
|
|
7550
|
+
},
|
|
7513
7551
|
// #endregion
|
|
7514
7552
|
|
|
7515
7553
|
// #region Ignore converters (these message dont need parsing).
|
package/devices/acova.js
ADDED
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
const exposes = require('../lib/exposes');
|
|
2
|
+
const fz = require('../converters/fromZigbee');
|
|
3
|
+
const tz = require('../converters/toZigbee');
|
|
4
|
+
const reporting = require('../lib/reporting');
|
|
5
|
+
|
|
6
|
+
module.exports = [{
|
|
7
|
+
zigbeeModel: ['PERCALE2 D1.00P1.01Z1.00'],
|
|
8
|
+
model: 'PERCALE2',
|
|
9
|
+
vendor: 'Acova',
|
|
10
|
+
description: 'Percale 2 heater',
|
|
11
|
+
fromZigbee: [fz.thermostat, fz.hvac_user_interface],
|
|
12
|
+
toZigbee: [
|
|
13
|
+
tz.thermostat_local_temperature,
|
|
14
|
+
tz.thermostat_system_mode,
|
|
15
|
+
tz.thermostat_occupied_heating_setpoint,
|
|
16
|
+
tz.thermostat_unoccupied_heating_setpoint,
|
|
17
|
+
tz.thermostat_occupied_cooling_setpoint,
|
|
18
|
+
tz.thermostat_running_state,
|
|
19
|
+
],
|
|
20
|
+
exposes: [
|
|
21
|
+
exposes.climate()
|
|
22
|
+
.withSetpoint('occupied_heating_setpoint', 7, 28, 0.5)
|
|
23
|
+
.withLocalTemperature()
|
|
24
|
+
.withSystemMode(['off', 'heat', 'auto'])
|
|
25
|
+
.withRunningState(['idle', 'heat']),
|
|
26
|
+
],
|
|
27
|
+
configure: async (device, coordinatorEndpoint, logger) => {
|
|
28
|
+
const endpoint = device.getEndpoint(1);
|
|
29
|
+
await reporting.bind(endpoint, coordinatorEndpoint, ['genPowerCfg', 'hvacThermostat']);
|
|
30
|
+
await reporting.thermostatTemperature(endpoint);
|
|
31
|
+
await reporting.thermostatOccupiedHeatingSetpoint(endpoint);
|
|
32
|
+
await reporting.thermostatUnoccupiedHeatingSetpoint(endpoint);
|
|
33
|
+
},
|
|
34
|
+
}];
|
|
@@ -233,4 +233,23 @@ module.exports = [
|
|
|
233
233
|
},
|
|
234
234
|
exposes: [e.soil_moisture(), e.battery(), e.temperature()],
|
|
235
235
|
},
|
|
236
|
+
{
|
|
237
|
+
zigbeeModel: ['EFEKTA_eON213z'],
|
|
238
|
+
model: 'EFEKTA_eON213z',
|
|
239
|
+
vendor: 'Custom devices (DiY)',
|
|
240
|
+
description: '[Temperature and humidity sensor with e-ink2.13](http://efektalab.com/eON213z)',
|
|
241
|
+
fromZigbee: [fz.temperature, fz.humidity, fz.battery],
|
|
242
|
+
toZigbee: [tz.factory_reset],
|
|
243
|
+
configure: async (device, coordinatorEndpoint, logger) => {
|
|
244
|
+
const endpoint = device.getEndpoint(1);
|
|
245
|
+
await reporting.bind(endpoint, coordinatorEndpoint, [
|
|
246
|
+
'genPowerCfg', 'msTemperatureMeasurement', 'msRelativeHumidity']);
|
|
247
|
+
const overides = {min: 0, max: 21600, change: 0};
|
|
248
|
+
await reporting.batteryVoltage(endpoint, overides);
|
|
249
|
+
await reporting.batteryPercentageRemaining(endpoint, overides);
|
|
250
|
+
await reporting.temperature(endpoint, overides);
|
|
251
|
+
await reporting.humidity(endpoint, overides);
|
|
252
|
+
},
|
|
253
|
+
exposes: [e.battery(), e.temperature(), e.humidity()],
|
|
254
|
+
},
|
|
236
255
|
];
|
package/devices/danfoss.js
CHANGED
|
@@ -34,7 +34,9 @@ module.exports = [
|
|
|
34
34
|
exposes.binary('viewing_direction', ea.ALL, true, false)
|
|
35
35
|
.withDescription('Viewing/Display Direction. `false` Horizontal or `true` Vertical'),
|
|
36
36
|
exposes.binary('heat_available', ea.ALL, true, false)
|
|
37
|
-
.withDescription('Not clear how this affects operation.
|
|
37
|
+
.withDescription('Not clear how this affects operation. However, it would appear that the device does not execute any ' +
|
|
38
|
+
'motor functions if this is set to false. This may be a means to conserve battery during periods that the heating ' +
|
|
39
|
+
'system is not energized (e.g. during summer). `false` No Heat Available or `true` Heat Available'),
|
|
38
40
|
exposes.binary('heat_required', ea.STATE_GET, true, false)
|
|
39
41
|
.withDescription('Whether or not the unit needs warm water. `false` No Heat Request or `true` Heat Request'),
|
|
40
42
|
exposes.enum('setpoint_change_source', ea.STATE, ['manual', 'schedule', 'externally'])
|
package/devices/gledopto.js
CHANGED
|
@@ -39,6 +39,27 @@ const gledoptoExtend = {
|
|
|
39
39
|
[tz.gledopto_light_onoff_brightness, tz.gledopto_light_color_colortemp],
|
|
40
40
|
),
|
|
41
41
|
}),
|
|
42
|
+
switch: (options={}) => ({
|
|
43
|
+
...extend.switch(options),
|
|
44
|
+
onEvent: async (type, data, device) => {
|
|
45
|
+
// This device doesn't support reporting.
|
|
46
|
+
// Therefore we read the on/off state every 5 seconds.
|
|
47
|
+
// This is the same way as the Hue bridge does it.
|
|
48
|
+
if (type === 'stop') {
|
|
49
|
+
clearInterval(globalStore.getValue(device, 'interval'));
|
|
50
|
+
globalStore.clearValue(device, 'interval');
|
|
51
|
+
} else if (!globalStore.hasValue(device, 'interval')) {
|
|
52
|
+
const interval = setInterval(async () => {
|
|
53
|
+
try {
|
|
54
|
+
await device.endpoints[0].read('genOnOff', ['onOff']);
|
|
55
|
+
} catch (error) {
|
|
56
|
+
// Do nothing
|
|
57
|
+
}
|
|
58
|
+
}, 5000);
|
|
59
|
+
globalStore.putValue(device, 'interval', interval);
|
|
60
|
+
}
|
|
61
|
+
},
|
|
62
|
+
}),
|
|
42
63
|
};
|
|
43
64
|
|
|
44
65
|
module.exports = [
|
|
@@ -580,32 +601,21 @@ module.exports = [
|
|
|
580
601
|
zigbeeModel: ['GL-G-007Z'],
|
|
581
602
|
model: 'GL-G-007Z',
|
|
582
603
|
vendor: 'Gledopto',
|
|
583
|
-
description: 'Zigbee 9W
|
|
604
|
+
description: 'Zigbee 9W garden lamp RGB+CCT',
|
|
584
605
|
extend: gledoptoExtend.light_onoff_brightness_colortemp_color(),
|
|
585
606
|
},
|
|
586
607
|
{
|
|
587
608
|
zigbeeModel: ['GL-W-001Z'],
|
|
588
609
|
model: 'GL-W-001Z',
|
|
589
610
|
vendor: 'Gledopto',
|
|
590
|
-
description: 'Zigbee
|
|
591
|
-
extend:
|
|
592
|
-
|
|
593
|
-
|
|
594
|
-
|
|
595
|
-
|
|
596
|
-
|
|
597
|
-
|
|
598
|
-
|
|
599
|
-
} else if (!globalStore.hasValue(device, 'interval')) {
|
|
600
|
-
const interval = setInterval(async () => {
|
|
601
|
-
try {
|
|
602
|
-
await device.endpoints[0].read('genOnOff', ['onOff']);
|
|
603
|
-
} catch (error) {
|
|
604
|
-
// Do nothing
|
|
605
|
-
}
|
|
606
|
-
}, 5000);
|
|
607
|
-
globalStore.putValue(device, 'interval', interval);
|
|
608
|
-
}
|
|
609
|
-
},
|
|
611
|
+
description: 'Zigbee on/off wall switch',
|
|
612
|
+
extend: gledoptoExtend.switch(),
|
|
613
|
+
},
|
|
614
|
+
{
|
|
615
|
+
zigbeeModel: ['GL-SD-002'],
|
|
616
|
+
model: 'GL-SD-002',
|
|
617
|
+
vendor: 'Gledopto',
|
|
618
|
+
description: 'Zigbee 3.0 smart home switch',
|
|
619
|
+
extend: gledoptoExtend.switch(),
|
|
610
620
|
},
|
|
611
621
|
];
|
package/devices/lidl.js
CHANGED
|
@@ -417,6 +417,7 @@ module.exports = [
|
|
|
417
417
|
configure: async (device, coordinatorEndpoint, logger) => {
|
|
418
418
|
const endpoint = device.getEndpoint(1);
|
|
419
419
|
await reporting.bind(endpoint, coordinatorEndpoint, ['genPowerCfg']);
|
|
420
|
+
await reporting.batteryPercentageRemaining(endpoint);
|
|
420
421
|
},
|
|
421
422
|
},
|
|
422
423
|
{
|
|
@@ -656,7 +657,7 @@ module.exports = [
|
|
|
656
657
|
model: '368308_2010',
|
|
657
658
|
vendor: 'Lidl',
|
|
658
659
|
description: 'Silvercrest radiator valve with thermostat',
|
|
659
|
-
fromZigbee: [fz.ignore_tuya_set_time, fzLocal.zs_thermostat
|
|
660
|
+
fromZigbee: [fz.ignore_tuya_set_time, fzLocal.zs_thermostat],
|
|
660
661
|
toZigbee: [tzLocal.zs_thermostat_current_heating_setpoint, tzLocal.zs_thermostat_child_lock,
|
|
661
662
|
tzLocal.zs_thermostat_comfort_temp, tzLocal.zs_thermostat_eco_temp, tzLocal.zs_thermostat_preset_mode,
|
|
662
663
|
tzLocal.zs_thermostat_system_mode, tzLocal.zs_thermostat_local_temperature_calibration,
|
package/devices/sunricher.js
CHANGED
|
@@ -234,4 +234,22 @@ module.exports = [
|
|
|
234
234
|
await reporting.currentPositionLiftPercentage(endpoint);
|
|
235
235
|
},
|
|
236
236
|
},
|
|
237
|
+
{
|
|
238
|
+
fingerprint: [{modelID: 'GreenPower_2', ieeeAddr: /^0x00000000010.....$/}],
|
|
239
|
+
model: 'SR-ZGP2801K2-DIM',
|
|
240
|
+
vendor: 'Sunricher',
|
|
241
|
+
description: 'Pushbutton transmitter module',
|
|
242
|
+
fromZigbee: [fz.sunricher_switch2801K2],
|
|
243
|
+
toZigbee: [],
|
|
244
|
+
exposes: [e.action(['press_on', 'press_off', 'hold_on', 'hold_off', 'release'])],
|
|
245
|
+
},
|
|
246
|
+
{
|
|
247
|
+
fingerprint: [{modelID: 'GreenPower_2', ieeeAddr: /^0x000000005d5.....$/}],
|
|
248
|
+
model: 'SR-ZGP2801K4-DIM',
|
|
249
|
+
vendor: 'Sunricher',
|
|
250
|
+
description: 'Pushbutton transmitter module',
|
|
251
|
+
fromZigbee: [fz.sunricher_switch2801K4],
|
|
252
|
+
toZigbee: [],
|
|
253
|
+
exposes: [e.action(['press_on', 'press_off', 'press_high', 'press_low', 'hold_high', 'hold_low', 'release'])],
|
|
254
|
+
},
|
|
237
255
|
];
|
package/devices/sylvania.js
CHANGED
|
@@ -189,4 +189,12 @@ module.exports = [
|
|
|
189
189
|
extend: extend.ledvance.light_onoff_brightness(),
|
|
190
190
|
ota: ota.ledvance,
|
|
191
191
|
},
|
|
192
|
+
{
|
|
193
|
+
zigbeeModel: ['A19 G2 RGBW'],
|
|
194
|
+
model: '75564',
|
|
195
|
+
vendor: 'Sylvania',
|
|
196
|
+
description: 'Smart+ adjustable white and full color bulb A19',
|
|
197
|
+
extend: extend.ledvance.light_onoff_brightness_colortemp_color({colorTempRange: [142, 555]}),
|
|
198
|
+
ota: ota.ledvance,
|
|
199
|
+
},
|
|
192
200
|
];
|
package/devices/tuya.js
CHANGED
|
@@ -66,7 +66,7 @@ module.exports = [
|
|
|
66
66
|
},
|
|
67
67
|
{
|
|
68
68
|
fingerprint: [{modelID: 'TS0001', manufacturerName: '_TZ3000_hktqahrq'}, {manufacturerName: '_TZ3000_hktqahrq'},
|
|
69
|
-
{modelID: 'TS000F', manufacturerName: '_TZ3000_m9af2l6g'}],
|
|
69
|
+
{manufacturerName: '_TZ3000_q6a3tepg'}, {modelID: 'TS000F', manufacturerName: '_TZ3000_m9af2l6g'}],
|
|
70
70
|
model: 'WHD02',
|
|
71
71
|
vendor: 'TuYa',
|
|
72
72
|
description: 'Wall switch module',
|
|
@@ -164,6 +164,8 @@ module.exports = [
|
|
|
164
164
|
{modelID: 'TS0202', manufacturerName: '_TYZB01_dl7cejts'},
|
|
165
165
|
{modelID: 'TS0202', manufacturerName: '_TYZB01_qjqgmqxr'},
|
|
166
166
|
{modelID: 'TS0202', manufacturerName: '_TZ3000_mmtwjmaq'},
|
|
167
|
+
{modelID: 'TS0202', manufacturerName: '_TZ3000_mcxw5ehu'},
|
|
168
|
+
{modelID: 'TS0202', manufacturerName: '_TYZB01_hqbdru35'},
|
|
167
169
|
{modelID: 'WHD02', manufacturerName: '_TZ3000_hktqahrq'}],
|
|
168
170
|
model: 'TS0202',
|
|
169
171
|
vendor: 'TuYa',
|
|
@@ -717,6 +719,7 @@ module.exports = [
|
|
|
717
719
|
{modelID: 'TS0601', manufacturerName: '_TZE200_xuzcvlku'},
|
|
718
720
|
{modelID: 'TS0601', manufacturerName: '_TZE200_4vobcgd3'},
|
|
719
721
|
{modelID: 'TS0601', manufacturerName: '_TZE200_nogaemzt'},
|
|
722
|
+
{modelID: 'TS0601', manufacturerName: '_TZE200_r0jdjrvi'},
|
|
720
723
|
{modelID: 'TS0601', manufacturerName: '_TZE200_pk0sfzvr'},
|
|
721
724
|
{modelID: 'TS0601', manufacturerName: '_TZE200_fdtjuw7u'},
|
|
722
725
|
{modelID: 'TS0601', manufacturerName: '_TZE200_zpzndjez'},
|
|
@@ -726,6 +729,7 @@ module.exports = [
|
|
|
726
729
|
{modelID: 'TS0601', manufacturerName: '_TZE200_nueqqe6k'},
|
|
727
730
|
{modelID: 'TS0601', manufacturerName: '_TZE200_xaabybja'},
|
|
728
731
|
{modelID: 'TS0601', manufacturerName: '_TZE200_rmymn92d'},
|
|
732
|
+
{modelID: 'TS0601', manufacturerName: '_TZE200_3i3exuay'},
|
|
729
733
|
{modelID: 'zo2pocs\u0000', manufacturerName: '_TYST11_fzo2pocs'},
|
|
730
734
|
// Roller blinds:
|
|
731
735
|
{modelID: 'TS0601', manufacturerName: '_TZE200_sbordckq'},
|
|
@@ -1212,7 +1216,7 @@ module.exports = [
|
|
|
1212
1216
|
},
|
|
1213
1217
|
},
|
|
1214
1218
|
{
|
|
1215
|
-
fingerprint: [{modelID: 'TS0011', manufacturerName: '_TZ3000_ji4araar'}],
|
|
1219
|
+
fingerprint: [{modelID: 'TS0011', manufacturerName: '_TZ3000_ji4araar'}, {modelID: 'TS0011', manufacturerName: '_TZ3000_qmi1cfuq'}],
|
|
1216
1220
|
model: 'TS0011_switch_module',
|
|
1217
1221
|
vendor: 'TuYa',
|
|
1218
1222
|
description: '1 gang switch module - (without neutral)',
|
|
@@ -1251,7 +1255,7 @@ module.exports = [
|
|
|
1251
1255
|
},
|
|
1252
1256
|
},
|
|
1253
1257
|
{
|
|
1254
|
-
fingerprint: [{modelID: 'TS0012', manufacturerName: '_TZ3000_jl7qyupf'}],
|
|
1258
|
+
fingerprint: [{modelID: 'TS0012', manufacturerName: '_TZ3000_jl7qyupf'}, {modelID: 'TS0012', manufacturerName: '_TZ3000_nPGIPl5D'}],
|
|
1255
1259
|
model: 'TS0012_switch_module',
|
|
1256
1260
|
vendor: 'TuYa',
|
|
1257
1261
|
description: '2 gang switch module - (without neutral)',
|
package/devices/xiaomi.js
CHANGED
|
@@ -49,6 +49,15 @@ module.exports = [
|
|
|
49
49
|
toZigbee: [],
|
|
50
50
|
exposes: [e.contact(), e.battery(), e.battery_voltage()],
|
|
51
51
|
},
|
|
52
|
+
{
|
|
53
|
+
zigbeeModel: ['lumi.magnet.ac01'],
|
|
54
|
+
model: 'MCCGQ13LM',
|
|
55
|
+
vendor: 'Xiaomi',
|
|
56
|
+
description: 'Aqara P1 door & window contact sensor',
|
|
57
|
+
fromZigbee: [fz.ias_contact_alarm_1, fz.aqara_opple],
|
|
58
|
+
toZigbee: [],
|
|
59
|
+
exposes: [e.contact(), e.battery(), e.battery_voltage()],
|
|
60
|
+
},
|
|
52
61
|
{
|
|
53
62
|
zigbeeModel: ['lumi.dimmer.rcbac1'],
|
|
54
63
|
model: 'ZNDDMK11LM',
|
package/lib/exposes.js
CHANGED
|
@@ -511,7 +511,7 @@ module.exports = {
|
|
|
511
511
|
battery: () => new Numeric('battery', access.STATE).withUnit('%').withDescription('Remaining battery in %').withValueMin(0).withValueMax(100),
|
|
512
512
|
battery_low: () => new Binary('battery_low', access.STATE, true, false).withDescription('Indicates if the battery of this device is almost empty'),
|
|
513
513
|
battery_voltage: () => new Numeric('voltage', access.STATE).withUnit('mV').withDescription('Voltage of the battery in millivolts'),
|
|
514
|
-
boost_time: () => new Numeric('boost_time', access.STATE_SET).withUnit('s').withDescription('Boost time').withValueMin(0).withValueMax(
|
|
514
|
+
boost_time: () => new Numeric('boost_time', access.STATE_SET).withUnit('s').withDescription('Boost time').withValueMin(0).withValueMax(900),
|
|
515
515
|
button_lock: () => new Binary('button_lock', access.ALL, 'ON', 'OFF').withDescription('Disables the physical switch button'),
|
|
516
516
|
carbon_monoxide: () => new Binary('carbon_monoxide', access.STATE, true, false).withDescription('Indicates if CO (carbon monoxide) is detected'),
|
|
517
517
|
child_lock: () => new Lock().withState('child_lock', 'LOCK', 'UNLOCK', 'Enables/disables physical input on the device', access.STATE_SET),
|
package/npm-shrinkwrap.json
CHANGED