zigbee-herdsman-converters 14.0.350 → 14.0.354
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 +1 -2
- package/converters/toZigbee.js +10 -10
- package/devices/ikea.js +12 -2
- package/devices/kwikset.js +15 -0
- package/devices/lellki.js +27 -0
- package/devices/owon.js +19 -0
- package/devices/philips.js +12 -3
- package/devices/schneider_electric.js +15 -0
- package/devices/siglis.js +88 -11
- package/devices/sinope.js +18 -5
- package/devices/sonoff.js +2 -2
- package/devices/tuya.js +7 -4
- package/devices/xiaomi.js +14 -21
- package/npm-shrinkwrap.json +1 -1
- package/package.json +1 -1
package/converters/fromZigbee.js
CHANGED
|
@@ -5114,11 +5114,10 @@ const converters = {
|
|
|
5114
5114
|
let buttonLookup = null;
|
|
5115
5115
|
if (['WXKG02LM_rev2', 'WXKG07LM', 'WXKG17LM'].includes(model.model)) buttonLookup = {1: 'left', 2: 'right', 3: 'both'};
|
|
5116
5116
|
if (['QBKG12LM', 'QBKG24LM'].includes(model.model)) buttonLookup = {5: 'left', 6: 'right', 7: 'both'};
|
|
5117
|
-
if (['QBKG25LM'].includes(model.model)) buttonLookup = {41: 'left', 42: 'center', 43: 'right'};
|
|
5118
5117
|
if (['QBKG39LM', 'QBKG41LM', 'WS-EUK02', 'WS-EUK04', 'QBKG20LM', 'QBKG31LM'].includes(model.model)) {
|
|
5119
5118
|
buttonLookup = {41: 'left', 42: 'right', 51: 'both'};
|
|
5120
5119
|
}
|
|
5121
|
-
if (['QBKG26LM', 'QBKG34LM'].includes(model.model)) {
|
|
5120
|
+
if (['QBKG25LM', 'QBKG26LM', 'QBKG34LM'].includes(model.model)) {
|
|
5122
5121
|
buttonLookup = {
|
|
5123
5122
|
41: 'left', 42: 'center', 43: 'right',
|
|
5124
5123
|
51: 'left_center', 52: 'left_right', 53: 'center_right',
|
package/converters/toZigbee.js
CHANGED
|
@@ -1982,9 +1982,9 @@ const converters = {
|
|
|
1982
1982
|
xiaomi_switch_power_outage_memory: {
|
|
1983
1983
|
key: ['power_outage_memory'],
|
|
1984
1984
|
convertSet: async (entity, key, value, meta) => {
|
|
1985
|
-
if (['ZNCZ04LM', '
|
|
1986
|
-
'WS-EUK01', 'WS-EUK02', 'WS-EUK03', 'WS-EUK04', '
|
|
1987
|
-
'QBKG34LM', '
|
|
1985
|
+
if (['ZNCZ04LM', 'ZNCZ15LM', 'QBCZ14LM', 'QBCZ15LM', 'SSM-U01', 'SSM-U02', 'DLKZMK11LM', 'DLKZMK12LM',
|
|
1986
|
+
'WS-EUK01', 'WS-EUK02', 'WS-EUK03', 'WS-EUK04', 'QBKG19LM', 'QBKG20LM', 'QBKG25LM', 'QBKG26LM',
|
|
1987
|
+
'QBKG31LM', 'QBKG34LM', 'QBKG38LM', 'QBKG39LM', 'QBKG40LM', 'QBKG41LM'].includes(meta.mapped.model)) {
|
|
1988
1988
|
await entity.write('aqaraOpple', {0x0201: {value: value ? 1 : 0, type: 0x10}}, manufacturerOptions.xiaomi);
|
|
1989
1989
|
} else if (['ZNCZ02LM', 'QBCZ11LM'].includes(meta.mapped.model)) {
|
|
1990
1990
|
const payload = value ?
|
|
@@ -2005,9 +2005,9 @@ const converters = {
|
|
|
2005
2005
|
return {state: {power_outage_memory: value}};
|
|
2006
2006
|
},
|
|
2007
2007
|
convertGet: async (entity, key, meta) => {
|
|
2008
|
-
if (['ZNCZ04LM', '
|
|
2009
|
-
'WS-
|
|
2010
|
-
'QBKG38LM', 'QBKG40LM', 'QBKG41LM'].includes(meta.mapped.model)) {
|
|
2008
|
+
if (['ZNCZ04LM', 'ZNCZ15LM', 'QBCZ14LM', 'QBCZ15LM', 'SSM-U01', 'SSM-U02', 'DLKZMK11LM', 'DLKZMK12LM',
|
|
2009
|
+
'WS-EUK01', 'WS-EUK02', 'WS-EUK03', 'WS-EUK04', 'QBKG19LM', 'QBKG20LM', 'QBKG25LM', 'QBKG26LM',
|
|
2010
|
+
'QBKG31LM', 'QBKG34LM', 'QBKG38LM', 'QBKG39LM', 'QBKG40LM', 'QBKG41LM'].includes(meta.mapped.model)) {
|
|
2011
2011
|
await entity.read('aqaraOpple', [0x0201]);
|
|
2012
2012
|
} else if (['ZNCZ02LM', 'QBCZ11LM', 'ZNCZ11LM'].includes(meta.mapped.model)) {
|
|
2013
2013
|
await entity.read('aqaraOpple', [0xFFF0]);
|
|
@@ -2105,8 +2105,8 @@ const converters = {
|
|
|
2105
2105
|
xiaomi_led_disabled_night: {
|
|
2106
2106
|
key: ['led_disabled_night'],
|
|
2107
2107
|
convertSet: async (entity, key, value, meta) => {
|
|
2108
|
-
if (['ZNCZ04LM', 'ZNCZ15LM', '
|
|
2109
|
-
'QBKG34LM'].includes(meta.mapped.model)) {
|
|
2108
|
+
if (['ZNCZ04LM', 'ZNCZ15LM', 'QBCZ14LM', 'QBCZ15LM', 'QBKG19LM', 'QBKG20LM', 'QBKG25LM', 'QBKG26LM',
|
|
2109
|
+
'QBKG34LM', 'DLKZMK11LM'].includes(meta.mapped.model)) {
|
|
2110
2110
|
await entity.write('aqaraOpple', {0x0203: {value: value ? 1 : 0, type: 0x10}}, manufacturerOptions.xiaomi);
|
|
2111
2111
|
} else if (['ZNCZ11LM'].includes(meta.mapped.model)) {
|
|
2112
2112
|
const payload = value ?
|
|
@@ -2120,8 +2120,8 @@ const converters = {
|
|
|
2120
2120
|
return {state: {led_disabled_night: value}};
|
|
2121
2121
|
},
|
|
2122
2122
|
convertGet: async (entity, key, meta) => {
|
|
2123
|
-
if (['ZNCZ04LM', 'ZNCZ15LM', 'QBCZ15LM', 'QBCZ14LM', '
|
|
2124
|
-
'QBKG34LM'].includes(meta.mapped.model)) {
|
|
2123
|
+
if (['ZNCZ04LM', 'ZNCZ15LM', 'QBCZ15LM', 'QBCZ14LM', 'QBKG19LM', 'QBKG20LM', 'QBKG25LM', 'QBKG26LM',
|
|
2124
|
+
'QBKG34LM', 'DLKZMK11LM'].includes(meta.mapped.model)) {
|
|
2125
2125
|
await entity.read('aqaraOpple', [0x0203], manufacturerOptions.xiaomi);
|
|
2126
2126
|
} else {
|
|
2127
2127
|
throw new Error('Not supported');
|
package/devices/ikea.js
CHANGED
|
@@ -546,7 +546,12 @@ module.exports = [
|
|
|
546
546
|
toZigbee: [],
|
|
547
547
|
ota: ota.tradfri,
|
|
548
548
|
meta: {battery: {dontDividePercentage: true}},
|
|
549
|
-
configure:
|
|
549
|
+
configure: async (device, coordinatorEndpoint, logger) => {
|
|
550
|
+
// Binding genOnOff is not required to make device send events.
|
|
551
|
+
const endpoint = device.getEndpoint(1);
|
|
552
|
+
await reporting.bind(endpoint, coordinatorEndpoint, ['genPowerCfg']);
|
|
553
|
+
await reporting.batteryPercentageRemaining(endpoint);
|
|
554
|
+
},
|
|
550
555
|
},
|
|
551
556
|
{
|
|
552
557
|
zigbeeModel: ['TRADFRI on/off switch'],
|
|
@@ -596,7 +601,12 @@ module.exports = [
|
|
|
596
601
|
toZigbee: [],
|
|
597
602
|
ota: ota.tradfri,
|
|
598
603
|
meta: {disableActionGroup: true, battery: {dontDividePercentage: true}},
|
|
599
|
-
configure:
|
|
604
|
+
configure: async (device, coordinatorEndpoint, logger) => {
|
|
605
|
+
// Binding genOnOff is not required to make device send events.
|
|
606
|
+
const endpoint = device.getEndpoint(1);
|
|
607
|
+
await reporting.bind(endpoint, coordinatorEndpoint, ['genPowerCfg']);
|
|
608
|
+
await reporting.batteryPercentageRemaining(endpoint);
|
|
609
|
+
},
|
|
600
610
|
},
|
|
601
611
|
{
|
|
602
612
|
zigbeeModel: ['SYMFONISK Sound Controller'],
|
package/devices/kwikset.js
CHANGED
|
@@ -35,6 +35,21 @@ module.exports = [
|
|
|
35
35
|
},
|
|
36
36
|
exposes: [e.lock(), e.battery()],
|
|
37
37
|
},
|
|
38
|
+
{
|
|
39
|
+
zigbeeModel: ['SMARTCODE_DEADBOLT_10_W3'],
|
|
40
|
+
model: '99140-031',
|
|
41
|
+
vendor: 'Kwikset',
|
|
42
|
+
description: 'SmartCode traditional electronic deadbolt',
|
|
43
|
+
fromZigbee: [fz.lock, fz.lock_operation_event, fz.battery],
|
|
44
|
+
toZigbee: [tz.lock],
|
|
45
|
+
configure: async (device, coordinatorEndpoint, logger) => {
|
|
46
|
+
const endpoint = device.getEndpoint(2);
|
|
47
|
+
await reporting.bind(endpoint, coordinatorEndpoint, ['closuresDoorLock', 'genPowerCfg']);
|
|
48
|
+
await reporting.lockState(endpoint);
|
|
49
|
+
await reporting.batteryPercentageRemaining(endpoint);
|
|
50
|
+
},
|
|
51
|
+
exposes: [e.lock(), e.battery()],
|
|
52
|
+
},
|
|
38
53
|
{
|
|
39
54
|
zigbeeModel: ['SMARTCODE_DEADBOLT_5'],
|
|
40
55
|
model: '99100-045',
|
package/devices/lellki.js
CHANGED
|
@@ -142,4 +142,31 @@ module.exports = [
|
|
|
142
142
|
.withDescription('Recover state after power outage')],
|
|
143
143
|
onEvent: tuya.onEventMeasurementPoll,
|
|
144
144
|
},
|
|
145
|
+
{
|
|
146
|
+
fingerprint: [{modelID: 'TS011F', manufacturerName: '_TZ3000_c7nc9w3c'}],
|
|
147
|
+
model: 'WP30-EU',
|
|
148
|
+
description: 'Power cord 4 sockets EU (with power monitoring)',
|
|
149
|
+
vendor: 'LELLKI',
|
|
150
|
+
extend: extend.switch(),
|
|
151
|
+
fromZigbee: [fz.on_off, fz.electrical_measurement, fz.metering, fz.ignore_basic_report, fz.tuya_switch_power_outage_memory],
|
|
152
|
+
toZigbee: [tz.on_off, tz.tuya_switch_power_outage_memory],
|
|
153
|
+
configure: async (device, coordinatorEndpoint, logger) => {
|
|
154
|
+
const endpoint = device.getEndpoint(1);
|
|
155
|
+
await reporting.bind(endpoint, coordinatorEndpoint, ['genOnOff']);
|
|
156
|
+
await reporting.bind(device.getEndpoint(2), coordinatorEndpoint, ['genOnOff']);
|
|
157
|
+
await reporting.bind(device.getEndpoint(3), coordinatorEndpoint, ['genOnOff']);
|
|
158
|
+
endpoint.saveClusterAttributeKeyValue('haElectricalMeasurement', {acCurrentDivisor: 1000, acCurrentMultiplier: 1});
|
|
159
|
+
endpoint.saveClusterAttributeKeyValue('seMetering', {divisor: 100, multiplier: 1});
|
|
160
|
+
device.save();
|
|
161
|
+
},
|
|
162
|
+
options: [exposes.options.measurement_poll_interval()],
|
|
163
|
+
exposes: [e.switch().withEndpoint('l1'), e.switch().withEndpoint('l2'),
|
|
164
|
+
e.switch().withEndpoint('l3'), e.power(), e.current(), e.voltage().withAccess(ea.STATE),
|
|
165
|
+
e.energy(), exposes.enum('power_outage_memory', ea.STATE_SET, ['on', 'off', 'restore'])
|
|
166
|
+
.withDescription('Recover state after power outage')],
|
|
167
|
+
endpoint: (device) => {
|
|
168
|
+
return {l1: 1, l2: 2, l3: 3};
|
|
169
|
+
},
|
|
170
|
+
onEvent: tuya.onEventMeasurementPoll,
|
|
171
|
+
},
|
|
145
172
|
];
|
package/devices/owon.js
CHANGED
|
@@ -102,4 +102,23 @@ module.exports = [
|
|
|
102
102
|
device.save();
|
|
103
103
|
},
|
|
104
104
|
},
|
|
105
|
+
{
|
|
106
|
+
zigbeeModel: ['THS317-ET'],
|
|
107
|
+
model: 'THS317-ET',
|
|
108
|
+
vendor: 'OWON',
|
|
109
|
+
description: 'Temperature and humidity sensor',
|
|
110
|
+
fromZigbee: [fz.temperature, fz.humidity, fz.battery],
|
|
111
|
+
toZigbee: [],
|
|
112
|
+
exposes: [e.battery(), e.temperature(), e.humidity()],
|
|
113
|
+
configure: async (device, coordinatorEndpoint, logger) => {
|
|
114
|
+
const endpoint = device.getEndpoint(2);
|
|
115
|
+
await reporting.bind(endpoint, coordinatorEndpoint, ['msTemperatureMeasurement', 'msRelativeHumidity', 'genPowerCfg']);
|
|
116
|
+
await reporting.temperature(endpoint);
|
|
117
|
+
await reporting.humidity(endpoint);
|
|
118
|
+
await reporting.batteryVoltage(endpoint);
|
|
119
|
+
await reporting.batteryPercentageRemaining(endpoint);
|
|
120
|
+
device.powerSource = 'Battery';
|
|
121
|
+
device.save();
|
|
122
|
+
},
|
|
123
|
+
},
|
|
105
124
|
];
|
package/devices/philips.js
CHANGED
|
@@ -1104,7 +1104,7 @@ module.exports = [
|
|
|
1104
1104
|
ota: ota.zigbeeOTA,
|
|
1105
1105
|
},
|
|
1106
1106
|
{
|
|
1107
|
-
zigbeeModel: ['LCW002', '4090230P9'],
|
|
1107
|
+
zigbeeModel: ['LCW002', '4090230P9', '929003053101'],
|
|
1108
1108
|
model: '4090230P9',
|
|
1109
1109
|
vendor: 'Philips',
|
|
1110
1110
|
description: 'Hue Liane',
|
|
@@ -1457,9 +1457,18 @@ module.exports = [
|
|
|
1457
1457
|
zigbeeModel: ['1746430P7'],
|
|
1458
1458
|
model: '1746430P7',
|
|
1459
1459
|
vendor: 'Philips',
|
|
1460
|
-
description: 'Hue outdoor Resonate wall lamp',
|
|
1460
|
+
description: 'Hue outdoor Resonate wall lamp (black)',
|
|
1461
1461
|
meta: {turnsOffAtBrightness1: true},
|
|
1462
|
-
extend: hueExtend.light_onoff_brightness_colortemp_color(),
|
|
1462
|
+
extend: hueExtend.light_onoff_brightness_colortemp_color({colorTempRange: [153, 500]}),
|
|
1463
|
+
ota: ota.zigbeeOTA,
|
|
1464
|
+
},
|
|
1465
|
+
{
|
|
1466
|
+
zigbeeModel: ['1746447P7'],
|
|
1467
|
+
model: '1746447P7',
|
|
1468
|
+
vendor: 'Philips',
|
|
1469
|
+
description: 'Hue outdoor Resonate wall lamp (silver)',
|
|
1470
|
+
meta: {turnsOffAtBrightness1: true},
|
|
1471
|
+
extend: hueExtend.light_onoff_brightness_colortemp_color({colorTempRange: [153, 500]}),
|
|
1463
1472
|
ota: ota.zigbeeOTA,
|
|
1464
1473
|
},
|
|
1465
1474
|
{
|
|
@@ -8,6 +8,21 @@ const e = exposes.presets;
|
|
|
8
8
|
const ea = exposes.access;
|
|
9
9
|
|
|
10
10
|
module.exports = [
|
|
11
|
+
{
|
|
12
|
+
zigbeeModel: ['NHPB/SHUTTER/1'],
|
|
13
|
+
model: 'S520567',
|
|
14
|
+
vendor: 'Schneider Electric',
|
|
15
|
+
description: 'Roller shutter',
|
|
16
|
+
fromZigbee: [fz.cover_position_tilt],
|
|
17
|
+
toZigbee: [tz.cover_position_tilt, tz.cover_state],
|
|
18
|
+
exposes: [e.cover_position()],
|
|
19
|
+
meta: {coverInverted: true},
|
|
20
|
+
configure: async (device, coordinatorEndpoint, logger) => {
|
|
21
|
+
const endpoint = device.getEndpoint(5);
|
|
22
|
+
await reporting.bind(endpoint, coordinatorEndpoint, ['closuresWindowCovering']);
|
|
23
|
+
await reporting.currentPositionLiftPercentage(endpoint);
|
|
24
|
+
},
|
|
25
|
+
},
|
|
11
26
|
{
|
|
12
27
|
zigbeeModel: ['iTRV'],
|
|
13
28
|
model: 'WV704R0A0902',
|
package/devices/siglis.js
CHANGED
|
@@ -1,9 +1,46 @@
|
|
|
1
|
-
const fz = require('
|
|
2
|
-
const tz = require('
|
|
3
|
-
const exposes = require('
|
|
4
|
-
const reporting = require('
|
|
1
|
+
const fz = require('../converters/fromZigbee');
|
|
2
|
+
const tz = require('../converters/toZigbee');
|
|
3
|
+
const exposes = require('../lib/exposes');
|
|
4
|
+
const reporting = require('../lib/reporting');
|
|
5
5
|
const e = exposes.presets;
|
|
6
6
|
|
|
7
|
+
const siglisManufacturerCode = 0x129C;
|
|
8
|
+
const zigfredEndpoint = 5;
|
|
9
|
+
|
|
10
|
+
const zifgredFromZigbee = {
|
|
11
|
+
cluster: 'manuSpecificSiglisZigfred',
|
|
12
|
+
type: ['attributeReport'],
|
|
13
|
+
convert: (model, msg, publish, options, meta) => {
|
|
14
|
+
const buttonEvent = msg.data['buttonEvent'];
|
|
15
|
+
|
|
16
|
+
if (buttonEvent != null) {
|
|
17
|
+
const buttonLookup = {
|
|
18
|
+
0: 'button_1',
|
|
19
|
+
1: 'button_2',
|
|
20
|
+
2: 'button_3',
|
|
21
|
+
3: 'button_4',
|
|
22
|
+
};
|
|
23
|
+
|
|
24
|
+
const actionLookup = {
|
|
25
|
+
0: 'release',
|
|
26
|
+
1: 'single',
|
|
27
|
+
2: 'double',
|
|
28
|
+
3: 'hold',
|
|
29
|
+
};
|
|
30
|
+
|
|
31
|
+
const button = buttonEvent & 0xff;
|
|
32
|
+
const state = (buttonEvent >> 8) & 0xff;
|
|
33
|
+
|
|
34
|
+
const buttonName = buttonLookup[button];
|
|
35
|
+
const stateName = actionLookup[state];
|
|
36
|
+
|
|
37
|
+
if (buttonName && stateName) {
|
|
38
|
+
const action = `${buttonName}_${stateName}`;
|
|
39
|
+
return {action};
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
},
|
|
43
|
+
};
|
|
7
44
|
|
|
8
45
|
module.exports = [
|
|
9
46
|
{
|
|
@@ -11,27 +48,67 @@ module.exports = [
|
|
|
11
48
|
model: 'ZFU-1D-CH',
|
|
12
49
|
vendor: 'Siglis',
|
|
13
50
|
description: 'zigfred uno smart in-wall switch',
|
|
14
|
-
exposes: [e.light_brightness_colorxy().withEndpoint('l1'), e.switch().withEndpoint('l2'), e.light_brightness().withEndpoint('l3')
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
51
|
+
exposes: [e.light_brightness_colorxy().withEndpoint('l1'), e.switch().withEndpoint('l2'), e.light_brightness().withEndpoint('l3'),
|
|
52
|
+
e.action([
|
|
53
|
+
'button_1_single', 'button_1_double', 'button_1_hold', 'button_1_release',
|
|
54
|
+
'button_2_single', 'button_2_double', 'button_2_hold', 'button_2_release',
|
|
55
|
+
'button_3_single', 'button_3_double', 'button_3_hold', 'button_3_release',
|
|
56
|
+
'button_4_single', 'button_4_double', 'button_4_hold', 'button_4_release',
|
|
57
|
+
])],
|
|
58
|
+
fromZigbee: [
|
|
59
|
+
zifgredFromZigbee,
|
|
60
|
+
fz.color_colortemp,
|
|
61
|
+
fz.on_off,
|
|
62
|
+
fz.brightness,
|
|
63
|
+
fz.level_config,
|
|
64
|
+
fz.power_on_behavior,
|
|
65
|
+
fz.ignore_basic_report,
|
|
66
|
+
],
|
|
67
|
+
toZigbee: [
|
|
68
|
+
tz.light_onoff_brightness,
|
|
69
|
+
tz.light_color,
|
|
70
|
+
tz.ignore_transition,
|
|
71
|
+
tz.ignore_rate,
|
|
72
|
+
tz.light_brightness_move,
|
|
73
|
+
tz.light_brightness_step,
|
|
74
|
+
tz.level_config,
|
|
75
|
+
tz.power_on_behavior,
|
|
76
|
+
tz.light_hue_saturation_move,
|
|
77
|
+
tz.light_hue_saturation_step,
|
|
78
|
+
tz.light_color_options,
|
|
79
|
+
tz.light_color_mode,
|
|
80
|
+
],
|
|
19
81
|
meta: {multiEndpoint: true},
|
|
20
82
|
endpoint: (device) => {
|
|
21
|
-
return {
|
|
83
|
+
return {
|
|
84
|
+
'l1': zigfredEndpoint,
|
|
85
|
+
'l2': 6,
|
|
86
|
+
'l3': 7,
|
|
87
|
+
};
|
|
22
88
|
},
|
|
23
89
|
configure: async (device, coordinatorEndpoint, logger) => {
|
|
24
|
-
const controlEp = device.getEndpoint(
|
|
90
|
+
const controlEp = device.getEndpoint(zigfredEndpoint);
|
|
25
91
|
const relayEp = device.getEndpoint(6);
|
|
26
92
|
const dimmerEp = device.getEndpoint(7);
|
|
93
|
+
|
|
27
94
|
// Bind Control EP (LED)
|
|
28
95
|
await reporting.bind(controlEp, coordinatorEndpoint, ['genOnOff']);
|
|
29
96
|
await reporting.bind(controlEp, coordinatorEndpoint, ['genLevelCtrl']);
|
|
30
97
|
await reporting.onOff(controlEp);
|
|
31
98
|
await reporting.brightness(controlEp);
|
|
99
|
+
await reporting.bind(controlEp, coordinatorEndpoint, ['manuSpecificSiglisZigfred']);
|
|
100
|
+
const payload = [{
|
|
101
|
+
attribute: 'buttonEvent',
|
|
102
|
+
minimumReportInterval: 0,
|
|
103
|
+
maximumReportInterval: 0,
|
|
104
|
+
reportableChange: 0,
|
|
105
|
+
}];
|
|
106
|
+
await controlEp.configureReporting('manuSpecificSiglisZigfred', payload, {manufacturerCode: siglisManufacturerCode});
|
|
107
|
+
|
|
32
108
|
// Bind Relay EP
|
|
33
109
|
await reporting.bind(relayEp, coordinatorEndpoint, ['genOnOff']);
|
|
34
110
|
await reporting.onOff(relayEp);
|
|
111
|
+
|
|
35
112
|
// Bind Dimmer EP
|
|
36
113
|
await reporting.bind(dimmerEp, coordinatorEndpoint, ['genOnOff']);
|
|
37
114
|
await reporting.bind(dimmerEp, coordinatorEndpoint, ['genLevelCtrl']);
|
package/devices/sinope.js
CHANGED
|
@@ -35,15 +35,28 @@ module.exports = [
|
|
|
35
35
|
|
|
36
36
|
try {
|
|
37
37
|
await reporting.thermostatSystemMode(endpoint);
|
|
38
|
+
} catch (error) {/* Not all support this */}
|
|
39
|
+
|
|
40
|
+
try {
|
|
38
41
|
await reporting.thermostatRunningState(endpoint);
|
|
39
|
-
|
|
40
|
-
|
|
42
|
+
} catch (error) {/* Not all support this */}
|
|
43
|
+
|
|
44
|
+
await reporting.readMeteringMultiplierDivisor(endpoint);
|
|
45
|
+
await reporting.currentSummDelivered(endpoint, {min: 10, max: 303, change: [1, 1]});
|
|
46
|
+
try {
|
|
41
47
|
await reporting.instantaneousDemand(endpoint, {min: 10, max: 304, change: 1});
|
|
42
|
-
|
|
48
|
+
} catch (error) {/* Do nothing*/}
|
|
49
|
+
|
|
50
|
+
await reporting.readEletricalMeasurementMultiplierDivisors(endpoint);
|
|
51
|
+
try {
|
|
43
52
|
await reporting.activePower(endpoint, {min: 10, max: 305, change: 1});
|
|
53
|
+
} catch (error) {/* Do nothing*/}
|
|
54
|
+
try {
|
|
44
55
|
await reporting.rmsCurrent(endpoint, {min: 10, max: 306, change: 100}); // divider 1000: 0.1Arms
|
|
56
|
+
} catch (error) {/* Do nothing*/}
|
|
57
|
+
try {
|
|
45
58
|
await reporting.rmsVoltage(endpoint, {min: 10, max: 307, change: 5}); // divider 10: 0.5Vrms
|
|
46
|
-
} catch (error) {/*
|
|
59
|
+
} catch (error) {/* Do nothing*/}
|
|
47
60
|
|
|
48
61
|
// Disable default reporting
|
|
49
62
|
await reporting.temperature(endpoint, {min: 1, max: 0xFFFF});
|
|
@@ -121,7 +134,7 @@ module.exports = [
|
|
|
121
134
|
tz.sinope_thermostat_enable_outdoor_temperature, tz.sinope_thermostat_outdoor_temperature, tz.sinope_floor_control_mode,
|
|
122
135
|
tz.sinope_ambiant_max_heat_setpoint, tz.sinope_floor_min_heat_setpoint, tz.sinope_floor_max_heat_setpoint,
|
|
123
136
|
tz.sinope_temperature_sensor, tz.sinope_time_format],
|
|
124
|
-
exposes: [e.local_temperature(), e.keypad_lockout(),
|
|
137
|
+
exposes: [e.local_temperature(), e.keypad_lockout(), e.power(), e.current(), e.voltage(),
|
|
125
138
|
exposes.climate().withSetpoint('occupied_heating_setpoint', 7, 30, 0.5).withLocalTemperature()
|
|
126
139
|
.withSystemMode(['off', 'auto', 'heat']).withRunningState(['idle', 'heat']).withPiHeatingDemand(),
|
|
127
140
|
exposes.enum('backlight_auto_dim', ea.SET, ['on demand', 'sensing']).withDescription('Control backlight dimming behavior')],
|
package/devices/sonoff.js
CHANGED
|
@@ -70,11 +70,11 @@ module.exports = [
|
|
|
70
70
|
exposes: [e.battery(), e.action(['single', 'double', 'long'])],
|
|
71
71
|
fromZigbee: [fz.ewelink_action, fz.battery],
|
|
72
72
|
toZigbee: [],
|
|
73
|
-
meta: {battery: {voltageToPercentage: '3V_2500'}},
|
|
74
73
|
configure: async (device, coordinatorEndpoint, logger) => {
|
|
75
74
|
const endpoint = device.getEndpoint(1);
|
|
76
75
|
await reporting.bind(endpoint, coordinatorEndpoint, ['genOnOff', 'genPowerCfg']);
|
|
77
76
|
await reporting.batteryVoltage(endpoint);
|
|
77
|
+
await reporting.batteryPercentageRemaining(endpoint);
|
|
78
78
|
},
|
|
79
79
|
},
|
|
80
80
|
{
|
|
@@ -126,12 +126,12 @@ module.exports = [
|
|
|
126
126
|
description: 'Motion sensor',
|
|
127
127
|
fromZigbee: [fz.ias_occupancy_alarm_1, fz.battery],
|
|
128
128
|
toZigbee: [],
|
|
129
|
-
meta: {battery: {voltageToPercentage: '3V_2500'}},
|
|
130
129
|
configure: async (device, coordinatorEndpoint, logger) => {
|
|
131
130
|
const endpoint = device.getEndpoint(1);
|
|
132
131
|
const bindClusters = ['genPowerCfg'];
|
|
133
132
|
await reporting.bind(endpoint, coordinatorEndpoint, bindClusters);
|
|
134
133
|
await reporting.batteryVoltage(endpoint);
|
|
134
|
+
await reporting.batteryPercentageRemaining(endpoint);
|
|
135
135
|
},
|
|
136
136
|
exposes: [e.occupancy(), e.battery_low(), e.tamper(), e.battery()],
|
|
137
137
|
},
|
package/devices/tuya.js
CHANGED
|
@@ -9,8 +9,9 @@ const e = exposes.presets;
|
|
|
9
9
|
const ea = exposes.access;
|
|
10
10
|
|
|
11
11
|
|
|
12
|
-
const TS011Fplugs = ['_TZ3000_5f43h46b', '_TZ3000_cphmq0q7', '_TZ3000_dpo1ysak', '_TZ3000_ew3ldmgx',
|
|
13
|
-
'_TZ3000_jvzvulen', '_TZ3000_mraovvmm', '_TZ3000_nfnmi125', '_TZ3000_ps3dmato', '_TZ3000_w0qqde0g', '_TZ3000_u5u4cakc'
|
|
12
|
+
const TS011Fplugs = ['_TZ3000_5f43h46b', '_TZ3000_cphmq0q7', '_TZ3000_dpo1ysak', '_TZ3000_ew3ldmgx', '_TZ3000_gjnozsaz',
|
|
13
|
+
'_TZ3000_jvzvulen', '_TZ3000_mraovvmm', '_TZ3000_nfnmi125', '_TZ3000_ps3dmato', '_TZ3000_w0qqde0g', '_TZ3000_u5u4cakc',
|
|
14
|
+
'_TZ3000_rdtixbnu'];
|
|
14
15
|
|
|
15
16
|
module.exports = [
|
|
16
17
|
{
|
|
@@ -125,6 +126,7 @@ module.exports = [
|
|
|
125
126
|
{modelID: 'TS0505B', manufacturerName: '_TZ3000_x2fqbdun'},
|
|
126
127
|
{modelID: 'TS0505B', manufacturerName: '_TZ3000_589kq4ul'},
|
|
127
128
|
{modelID: 'TS0505B', manufacturerName: '_TZ3000_1mtktxdk'},
|
|
129
|
+
{modelID: 'TS0505B', manufacturerName: '_TZ3210_remypqqm'},
|
|
128
130
|
{modelID: 'TS0505B', manufacturerName: '_TZ3210_0rn9qhnu'},
|
|
129
131
|
{modelID: 'TS0505B', manufacturerName: '_TZ3210_bicjqpg4'},
|
|
130
132
|
{modelID: 'TS0505B', manufacturerName: '_TZ3000_cmaky9gq'},
|
|
@@ -844,6 +846,7 @@ module.exports = [
|
|
|
844
846
|
whiteLabel: [
|
|
845
847
|
{vendor: 'Moes', model: 'TV01-ZB'},
|
|
846
848
|
{vendor: 'Tesla Smart', model: 'TSL-TRV-TV01ZG'},
|
|
849
|
+
{vendor: 'Unknown/id3.pl', model: 'GTZ08'},
|
|
847
850
|
],
|
|
848
851
|
ota: ota.zigbeeOTA,
|
|
849
852
|
fromZigbee: [fz.ignore_basic_report, fz.ignore_tuya_set_time, fz.tvtwo_thermostat],
|
|
@@ -1187,7 +1190,7 @@ module.exports = [
|
|
|
1187
1190
|
exposes: [e.humidity(), e.temperature(), e.battery()],
|
|
1188
1191
|
},
|
|
1189
1192
|
{
|
|
1190
|
-
fingerprint: [{modelID: 'TS0011', manufacturerName: '_TZ3000_l8fsgo6p'}],
|
|
1193
|
+
fingerprint: [{modelID: 'TS0011', manufacturerName: '_TZ3000_l8fsgo6p'}, {modelID: 'TS0011', manufacturerName: '_TZ3000_ji4araar'}],
|
|
1191
1194
|
zigbeeModel: ['TS0011'],
|
|
1192
1195
|
model: 'TS0011',
|
|
1193
1196
|
vendor: 'TuYa',
|
|
@@ -1207,7 +1210,7 @@ module.exports = [
|
|
|
1207
1210
|
},
|
|
1208
1211
|
},
|
|
1209
1212
|
{
|
|
1210
|
-
fingerprint: [{modelID: 'TS0011', manufacturerName: '
|
|
1213
|
+
fingerprint: [{modelID: 'TS0011', manufacturerName: '_TZ3000_qmi1cfuq'},
|
|
1211
1214
|
{modelID: 'TS0011', manufacturerName: '_TZ3000_txpirhfq'}],
|
|
1212
1215
|
model: 'TS0011_switch_module',
|
|
1213
1216
|
vendor: 'TuYa',
|
package/devices/xiaomi.js
CHANGED
|
@@ -584,7 +584,7 @@ module.exports = [
|
|
|
584
584
|
model: 'QBKG25LM',
|
|
585
585
|
vendor: 'Xiaomi',
|
|
586
586
|
description: 'Aqara D1 3 gang smart wall switch (no neutral wire)',
|
|
587
|
-
fromZigbee: [fz.on_off, fz.
|
|
587
|
+
fromZigbee: [fz.on_off, fz.xiaomi_multistate_action, fz.aqara_opple],
|
|
588
588
|
toZigbee: [tz.on_off, tz.xiaomi_switch_operation_mode_opple, tz.xiaomi_switch_power_outage_memory, tz.xiaomi_led_disabled_night,
|
|
589
589
|
tz.aqara_switch_mode_switch],
|
|
590
590
|
meta: {multiEndpoint: true},
|
|
@@ -607,9 +607,9 @@ module.exports = [
|
|
|
607
607
|
'Quick mode makes the device respond faster.'),
|
|
608
608
|
e.power_outage_memory(), e.led_disabled_night(), e.temperature().withAccess(ea.STATE),
|
|
609
609
|
e.action([
|
|
610
|
-
'left_single', 'left_double', '
|
|
611
|
-
'
|
|
612
|
-
'
|
|
610
|
+
'left_single', 'left_double', 'center_single', 'center_double', 'right_single', 'right_double',
|
|
611
|
+
'single_left_center', 'double_left_center', 'single_left_right', 'double_left_right',
|
|
612
|
+
'single_center_right', 'double_center_right', 'single_all', 'double_all']),
|
|
613
613
|
],
|
|
614
614
|
onEvent: preventReset,
|
|
615
615
|
configure: async (device, coordinatorEndpoint, logger) => {
|
|
@@ -622,11 +622,8 @@ module.exports = [
|
|
|
622
622
|
model: 'QBKG26LM',
|
|
623
623
|
vendor: 'Xiaomi',
|
|
624
624
|
description: 'Aqara D1 3 gang smart wall switch (with neutral wire)',
|
|
625
|
-
extend: extend.switch(),
|
|
626
625
|
exposes: [
|
|
627
|
-
e.switch().withEndpoint('left'),
|
|
628
|
-
e.switch().withEndpoint('center'),
|
|
629
|
-
e.switch().withEndpoint('right'),
|
|
626
|
+
e.switch().withEndpoint('left'), e.switch().withEndpoint('center'), e.switch().withEndpoint('right'),
|
|
630
627
|
exposes.enum('operation_mode', ea.ALL, ['control_relay', 'decoupled'])
|
|
631
628
|
.withDescription('Decoupled mode for left button')
|
|
632
629
|
.withEndpoint('left'),
|
|
@@ -636,27 +633,22 @@ module.exports = [
|
|
|
636
633
|
exposes.enum('operation_mode', ea.ALL, ['control_relay', 'decoupled'])
|
|
637
634
|
.withDescription('Decoupled mode for right button')
|
|
638
635
|
.withEndpoint('right'),
|
|
639
|
-
e.power().withAccess(ea.STATE), e.
|
|
640
|
-
|
|
641
|
-
|
|
642
|
-
'
|
|
636
|
+
e.power().withAccess(ea.STATE), e.power_outage_memory(), e.led_disabled_night(),
|
|
637
|
+
e.temperature().withAccess(ea.STATE),
|
|
638
|
+
e.action([
|
|
639
|
+
'single_left', 'double_left', 'single_center', 'double_center', 'single_right', 'double_right',
|
|
643
640
|
'single_left_center', 'double_left_center', 'single_left_right', 'double_left_right',
|
|
644
641
|
'single_center_right', 'double_center_right', 'single_all', 'double_all']),
|
|
645
642
|
],
|
|
646
|
-
fromZigbee: [fz.on_off, fz.
|
|
647
|
-
toZigbee: [tz.on_off, tz.xiaomi_switch_operation_mode_opple
|
|
643
|
+
fromZigbee: [fz.on_off, fz.xiaomi_power, fz.aqara_opple, fz.xiaomi_multistate_action],
|
|
644
|
+
toZigbee: [tz.on_off, tz.xiaomi_switch_operation_mode_opple, tz.xiaomi_switch_power_outage_memory,
|
|
645
|
+
tz.xiaomi_led_disabled_night],
|
|
648
646
|
meta: {multiEndpoint: true},
|
|
649
647
|
endpoint: (device) => {
|
|
650
|
-
return {'left': 1, 'center': 2, 'right': 3
|
|
648
|
+
return {'left': 1, 'center': 2, 'right': 3};
|
|
651
649
|
},
|
|
652
650
|
configure: async (device, coordinatorEndpoint, logger) => {
|
|
653
651
|
await device.getEndpoint(1).write('aqaraOpple', {'mode': 1}, {manufacturerCode: 0x115f, disableResponse: true});
|
|
654
|
-
await reporting.bind(device.getEndpoint(1), coordinatorEndpoint, ['genOnOff']);
|
|
655
|
-
await reporting.bind(device.getEndpoint(2), coordinatorEndpoint, ['genOnOff']);
|
|
656
|
-
await reporting.bind(device.getEndpoint(3), coordinatorEndpoint, ['genOnOff']);
|
|
657
|
-
await reporting.onOff(device.getEndpoint(1));
|
|
658
|
-
await reporting.onOff(device.getEndpoint(2));
|
|
659
|
-
await reporting.onOff(device.getEndpoint(3));
|
|
660
652
|
},
|
|
661
653
|
onEvent: preventReset,
|
|
662
654
|
},
|
|
@@ -1725,6 +1717,7 @@ module.exports = [
|
|
|
1725
1717
|
configure: async (device, coordinatorEndpoint, logger) => {
|
|
1726
1718
|
await device.getEndpoint(1).write('aqaraOpple', {'mode': 1}, {manufacturerCode: 0x115f, disableResponse: true});
|
|
1727
1719
|
},
|
|
1720
|
+
ota: ota.zigbeeOTA,
|
|
1728
1721
|
},
|
|
1729
1722
|
{
|
|
1730
1723
|
zigbeeModel: ['lumi.magnet.agl02'],
|
package/npm-shrinkwrap.json
CHANGED