zigbee-herdsman-converters 14.0.405 → 14.0.409
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/converters/toZigbee.js +13 -15
- package/devices/acova.js +60 -29
- package/devices/danfoss.js +5 -1
- package/devices/gledopto.js +11 -0
- package/devices/kwikset.js +1 -1
- package/devices/legrand.js +4 -1
- package/devices/m/303/274ller_licht.js +8 -0
- package/devices/orvibo.js +178 -0
- package/devices/philips.js +1 -1
- package/devices/shinasystem.js +21 -0
- package/devices/sinope.js +32 -0
- package/devices/stelpro.js +30 -0
- package/devices/tplink.js +16 -0
- package/devices/tuya.js +22 -4
- package/devices/woox.js +19 -0
- package/devices/xiaomi.js +24 -21
- package/devices/yale.js +7 -0
- package/lib/exposes.js +2 -0
- package/lib/reporting.js +4 -0
- package/npm-shrinkwrap.json +109 -109
- package/package.json +2 -2
package/converters/fromZigbee.js
CHANGED
|
@@ -2522,8 +2522,8 @@ const converters = {
|
|
|
2522
2522
|
return {battpercentage: value};
|
|
2523
2523
|
case tuya.dataPoints.neoAOMelody: // 0x21 [5] Melody
|
|
2524
2524
|
return {melody: value};
|
|
2525
|
-
case tuya.dataPoints.neoAOVolume: // 0x5 [0]/[1]/[2] Volume 0-
|
|
2526
|
-
return {volume: {
|
|
2525
|
+
case tuya.dataPoints.neoAOVolume: // 0x5 [0]/[1]/[2] Volume 0-low, 2-max
|
|
2526
|
+
return {volume: {0: 'low', 1: 'medium', 2: 'high'}[value]};
|
|
2527
2527
|
default: // Unknown code
|
|
2528
2528
|
meta.logger.warn(`Unhandled DP #${dp}: ${JSON.stringify(msg.data)}`);
|
|
2529
2529
|
}
|
|
@@ -3211,6 +3211,10 @@ const converters = {
|
|
|
3211
3211
|
result[postfixWithEndpointName('pi_heating_demand', msg, model)] =
|
|
3212
3212
|
precisionRound(msg.data['pIHeatingDemand'], 0);
|
|
3213
3213
|
}
|
|
3214
|
+
if (msg.data.hasOwnProperty('danfossWindowOpenFeatureEnable')) {
|
|
3215
|
+
result[postfixWithEndpointName('window_open_feature', msg, model)] =
|
|
3216
|
+
(msg.data['danfossWindowOpenFeatureEnable'] === 1);
|
|
3217
|
+
}
|
|
3214
3218
|
if (msg.data.hasOwnProperty('danfossWindowOpenInternal')) {
|
|
3215
3219
|
result[postfixWithEndpointName('window_open_internal', msg, model)] =
|
|
3216
3220
|
constants.danfossWindowOpen.hasOwnProperty(msg.data['danfossWindowOpenInternal']) ?
|
|
@@ -8238,7 +8242,7 @@ const converters = {
|
|
|
8238
8242
|
cluster: 'genOnOff',
|
|
8239
8243
|
type: 'raw',
|
|
8240
8244
|
convert: (model, msg, publish, options, meta) => {
|
|
8241
|
-
if (hasAlreadyProcessedMessage(msg, msg.data[
|
|
8245
|
+
if (hasAlreadyProcessedMessage(msg, msg.data[1])) return;
|
|
8242
8246
|
let action;
|
|
8243
8247
|
if (msg.data[2] == 253) {
|
|
8244
8248
|
action = {0: 'single', 1: 'double', 2: 'hold'}[msg.data[3]];
|
package/converters/toZigbee.js
CHANGED
|
@@ -2417,12 +2417,6 @@ const converters = {
|
|
|
2417
2417
|
await entity.read('genAnalogOutput', [0x0055]);
|
|
2418
2418
|
},
|
|
2419
2419
|
},
|
|
2420
|
-
xiaomi_curtain_acn002_status: {
|
|
2421
|
-
key: ['motor_state'],
|
|
2422
|
-
convertGet: async (entity, key, meta) => {
|
|
2423
|
-
await entity.read('genMultistateOutput', [0x0055]);
|
|
2424
|
-
},
|
|
2425
|
-
},
|
|
2426
2420
|
ledvance_commands: {
|
|
2427
2421
|
/* deprectated osram_*/
|
|
2428
2422
|
key: ['set_transition', 'remember_state', 'osram_set_transition', 'osram_remember_state'],
|
|
@@ -2752,6 +2746,16 @@ const converters = {
|
|
|
2752
2746
|
await entity.read('hvacThermostat', ['danfossTriggerTime'], manufacturerOptions.danfoss);
|
|
2753
2747
|
},
|
|
2754
2748
|
},
|
|
2749
|
+
danfoss_window_open_feature: {
|
|
2750
|
+
key: ['window_open_feature'],
|
|
2751
|
+
convertSet: async (entity, key, value, meta) => {
|
|
2752
|
+
await entity.write('hvacThermostat', {'danfossWindowOpenFeatureEnable': value}, manufacturerOptions.danfoss);
|
|
2753
|
+
return {readAfterWriteTime: 200, state: {'window_open_feature': value}};
|
|
2754
|
+
},
|
|
2755
|
+
convertGet: async (entity, key, meta) => {
|
|
2756
|
+
await entity.read('hvacThermostat', ['danfossWindowOpenFeatureEnable'], manufacturerOptions.danfoss);
|
|
2757
|
+
},
|
|
2758
|
+
},
|
|
2755
2759
|
danfoss_window_open_internal: {
|
|
2756
2760
|
key: ['window_open_internal'],
|
|
2757
2761
|
convertGet: async (entity, key, meta) => {
|
|
@@ -6759,7 +6763,7 @@ const converters = {
|
|
|
6759
6763
|
await tuya.sendDataPoints(entity, [
|
|
6760
6764
|
tuya.dpValueFromEnum(tuya.dataPoints.silvercrestChangeMode, tuya.silvercrestModes.white),
|
|
6761
6765
|
tuya.dpValueFromIntValue(tuya.dataPoints.dimmerLevel, newValue),
|
|
6762
|
-
], 'dataRequest'
|
|
6766
|
+
], 'dataRequest');
|
|
6763
6767
|
|
|
6764
6768
|
return {state: (key == 'white_brightness') ? {white_brightness: value} : {brightness: value}};
|
|
6765
6769
|
} else if (key == 'color_temp') {
|
|
@@ -6786,7 +6790,7 @@ const converters = {
|
|
|
6786
6790
|
await tuya.sendDataPoints(entity, [
|
|
6787
6791
|
tuya.dpValueFromEnum(tuya.dataPoints.silvercrestChangeMode, tuya.silvercrestModes.white),
|
|
6788
6792
|
tuya.dpValueFromIntValue(tuya.dataPoints.silvercrestSetColorTemp, data),
|
|
6789
|
-
], 'dataRequest'
|
|
6793
|
+
], 'dataRequest');
|
|
6790
6794
|
|
|
6791
6795
|
return {state: {color_temp: value}};
|
|
6792
6796
|
} else if (key == 'color' || (separateWhite && (key == 'brightness'))) {
|
|
@@ -6865,13 +6869,7 @@ const converters = {
|
|
|
6865
6869
|
tuya.dpValueFromStringBuffer(tuya.dataPoints.silvercrestSetColor, data),
|
|
6866
6870
|
];
|
|
6867
6871
|
|
|
6868
|
-
|
|
6869
|
-
// restore white state
|
|
6870
|
-
const newValue = utils.mapNumberRange(meta.state.white_brightness, 0, 255, 0, 1000);
|
|
6871
|
-
commands.push(tuya.dpValueFromEnum(tuya.dataPoints.silvercrestChangeMode, tuya.silvercrestModes.white));
|
|
6872
|
-
commands.push(tuya.dpValueFromIntValue(tuya.dataPoints.dimmerLevel, newValue));
|
|
6873
|
-
}
|
|
6874
|
-
await tuya.sendDataPoints(entity, commands, 'dataRequest', 1);
|
|
6872
|
+
await tuya.sendDataPoints(entity, commands, 'dataRequest');
|
|
6875
6873
|
|
|
6876
6874
|
return {state: newState};
|
|
6877
6875
|
}
|
package/devices/acova.js
CHANGED
|
@@ -3,33 +3,64 @@ const fz = require('../converters/fromZigbee');
|
|
|
3
3
|
const tz = require('../converters/toZigbee');
|
|
4
4
|
const reporting = require('../lib/reporting');
|
|
5
5
|
|
|
6
|
-
module.exports = [
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
exposes
|
|
22
|
-
.
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
6
|
+
module.exports = [
|
|
7
|
+
{
|
|
8
|
+
zigbeeModel: ['PERCALE2 D1.00P1.01Z1.00'],
|
|
9
|
+
model: 'PERCALE2',
|
|
10
|
+
vendor: 'Acova',
|
|
11
|
+
description: 'Percale 2 heater',
|
|
12
|
+
fromZigbee: [fz.thermostat, fz.hvac_user_interface],
|
|
13
|
+
toZigbee: [
|
|
14
|
+
tz.thermostat_local_temperature,
|
|
15
|
+
tz.thermostat_system_mode,
|
|
16
|
+
tz.thermostat_occupied_heating_setpoint,
|
|
17
|
+
tz.thermostat_unoccupied_heating_setpoint,
|
|
18
|
+
tz.thermostat_occupied_cooling_setpoint,
|
|
19
|
+
tz.thermostat_running_state,
|
|
20
|
+
],
|
|
21
|
+
exposes: [
|
|
22
|
+
exposes.climate()
|
|
23
|
+
.withSetpoint('occupied_heating_setpoint', 7, 28, 0.5)
|
|
24
|
+
.withLocalTemperature()
|
|
25
|
+
.withSystemMode(['off', 'heat', 'auto'])
|
|
26
|
+
.withRunningState(['idle', 'heat']),
|
|
27
|
+
],
|
|
28
|
+
configure: async (device, coordinatorEndpoint, logger) => {
|
|
29
|
+
const endpoint = device.getEndpoint(1);
|
|
30
|
+
await reporting.bind(endpoint, coordinatorEndpoint, ['genPowerCfg', 'hvacThermostat']);
|
|
31
|
+
await reporting.thermostatTemperature(endpoint);
|
|
32
|
+
await reporting.thermostatRunningState(endpoint);
|
|
33
|
+
await reporting.thermostatOccupiedHeatingSetpoint(endpoint);
|
|
34
|
+
await reporting.thermostatUnoccupiedHeatingSetpoint(endpoint);
|
|
35
|
+
},
|
|
34
36
|
},
|
|
35
|
-
|
|
37
|
+
{
|
|
38
|
+
zigbeeModel: ['ALCANTARA2 D1.00P1.02Z1.00\u0000\u0000\u0000\u0000\u0000\u0000'],
|
|
39
|
+
model: 'ALCANTARA2',
|
|
40
|
+
vendor: 'Acova',
|
|
41
|
+
description: 'Alcantara 2 heater',
|
|
42
|
+
fromZigbee: [fz.thermostat, fz.hvac_user_interface],
|
|
43
|
+
toZigbee: [
|
|
44
|
+
tz.thermostat_local_temperature,
|
|
45
|
+
tz.thermostat_system_mode,
|
|
46
|
+
tz.thermostat_occupied_heating_setpoint,
|
|
47
|
+
tz.thermostat_unoccupied_heating_setpoint,
|
|
48
|
+
tz.thermostat_running_state,
|
|
49
|
+
],
|
|
50
|
+
exposes: [
|
|
51
|
+
exposes.climate()
|
|
52
|
+
.withSetpoint('occupied_heating_setpoint', 7, 28, 0.5)
|
|
53
|
+
.withLocalTemperature()
|
|
54
|
+
.withSystemMode(['off', 'heat', 'auto'])
|
|
55
|
+
.withRunningState(['idle', 'heat']),
|
|
56
|
+
],
|
|
57
|
+
configure: async (device, coordinatorEndpoint, logger) => {
|
|
58
|
+
const endpoint = device.getEndpoint(1);
|
|
59
|
+
await reporting.bind(endpoint, coordinatorEndpoint, ['genPowerCfg', 'hvacThermostat']);
|
|
60
|
+
await reporting.thermostatTemperature(endpoint);
|
|
61
|
+
await reporting.thermostatRunningState(endpoint);
|
|
62
|
+
await reporting.thermostatOccupiedHeatingSetpoint(endpoint);
|
|
63
|
+
await reporting.thermostatUnoccupiedHeatingSetpoint(endpoint);
|
|
64
|
+
},
|
|
65
|
+
},
|
|
66
|
+
];
|
package/devices/danfoss.js
CHANGED
|
@@ -22,7 +22,8 @@ module.exports = [
|
|
|
22
22
|
tz.danfoss_window_open_internal, tz.danfoss_window_open_external, tz.danfoss_load_estimate,
|
|
23
23
|
tz.danfoss_viewing_direction, tz.danfoss_external_measured_room_sensor, tz.danfoss_radiator_covered,
|
|
24
24
|
tz.thermostat_keypad_lockout, tz.thermostat_system_mode, tz.danfoss_load_balancing_enable, tz.danfoss_load_room_mean,
|
|
25
|
-
tz.thermostat_weekly_schedule, tz.thermostat_clear_weekly_schedule, tz.thermostat_programming_operation_mode
|
|
25
|
+
tz.thermostat_weekly_schedule, tz.thermostat_clear_weekly_schedule, tz.thermostat_programming_operation_mode,
|
|
26
|
+
tz.danfoss_window_open_feature],
|
|
26
27
|
exposes: [e.battery(), e.keypad_lockout(), e.programming_operation_mode(),
|
|
27
28
|
exposes.binary('mounted_mode_active', ea.STATE_GET, true, false)
|
|
28
29
|
.withDescription('Is the unit in mounting mode. This is set to `false` for mounted (already on ' +
|
|
@@ -53,6 +54,8 @@ module.exports = [
|
|
|
53
54
|
exposes.binary('radiator_covered', ea.ALL, true, false)
|
|
54
55
|
.withDescription('Set if the TRV should solely rely on external_measured_room_sensor or operate in offset mode. ' +
|
|
55
56
|
'`false` = Auto Offset Mode or `true` = Room Sensor Mode'),
|
|
57
|
+
exposes.binary('window_open_feature', ea.ALL, true, false)
|
|
58
|
+
.withDescription('Whether or not the window open feature is enabled'),
|
|
56
59
|
exposes.numeric('window_open_internal', ea.STATE_GET).withValueMin(0).withValueMax(4)
|
|
57
60
|
.withDescription('0=Quarantine, 1=Windows are closed, 2=Hold - Windows are maybe about to open, ' +
|
|
58
61
|
'3=Open window detected, 4=In window open state from external but detected closed locally'),
|
|
@@ -114,6 +117,7 @@ module.exports = [
|
|
|
114
117
|
}], options);
|
|
115
118
|
|
|
116
119
|
await endpoint.read('hvacThermostat', [
|
|
120
|
+
'danfossWindowOpenFeatureEnable',
|
|
117
121
|
'danfossWindowOpenExternal',
|
|
118
122
|
'danfossDayOfWeek',
|
|
119
123
|
'danfossTriggerTime',
|
package/devices/gledopto.js
CHANGED
|
@@ -62,6 +62,12 @@ const gledoptoExtend = {
|
|
|
62
62
|
}),
|
|
63
63
|
};
|
|
64
64
|
|
|
65
|
+
const configureReadModelID = async (device, coordinatorEndpoint, logger) => {
|
|
66
|
+
// https://github.com/Koenkk/zigbee-herdsman-converters/issues/3016#issuecomment-1027726604
|
|
67
|
+
const endpoint = device.endpoints[0];
|
|
68
|
+
await endpoint.read('genBasic', ['modelId']);
|
|
69
|
+
};
|
|
70
|
+
|
|
65
71
|
module.exports = [
|
|
66
72
|
{
|
|
67
73
|
fingerprint: [
|
|
@@ -117,6 +123,7 @@ module.exports = [
|
|
|
117
123
|
ota: ota.zigbeeOTA,
|
|
118
124
|
description: 'Zigbee LED Controller WW/CW (pro)',
|
|
119
125
|
extend: gledoptoExtend.light_onoff_brightness_colortemp(),
|
|
126
|
+
configure: configureReadModelID,
|
|
120
127
|
},
|
|
121
128
|
{
|
|
122
129
|
fingerprint: [
|
|
@@ -180,6 +187,7 @@ module.exports = [
|
|
|
180
187
|
ota: ota.zigbeeOTA,
|
|
181
188
|
description: 'Zigbee LED Controller RGBW (pro)',
|
|
182
189
|
extend: gledoptoExtend.light_onoff_brightness_colortemp_color(),
|
|
190
|
+
configure: configureReadModelID,
|
|
183
191
|
},
|
|
184
192
|
{
|
|
185
193
|
fingerprint: [
|
|
@@ -238,6 +246,7 @@ module.exports = [
|
|
|
238
246
|
ota: ota.zigbeeOTA,
|
|
239
247
|
description: 'Zigbee LED Controller RGB (pro)',
|
|
240
248
|
extend: gledoptoExtend.light_onoff_brightness_color(),
|
|
249
|
+
configure: configureReadModelID,
|
|
241
250
|
},
|
|
242
251
|
{
|
|
243
252
|
zigbeeModel: ['GL-C-008P'],
|
|
@@ -247,6 +256,7 @@ module.exports = [
|
|
|
247
256
|
description: 'Zigbee LED Controller RGB+CCT (pro)',
|
|
248
257
|
extend: gledoptoExtend.light_onoff_brightness_colortemp_color({colorTempRange: [158, 495]}),
|
|
249
258
|
meta: {disableDefaultResponse: true},
|
|
259
|
+
configure: configureReadModelID,
|
|
250
260
|
},
|
|
251
261
|
{
|
|
252
262
|
zigbeeModel: ['GL-C-009'],
|
|
@@ -268,6 +278,7 @@ module.exports = [
|
|
|
268
278
|
ota: ota.zigbeeOTA,
|
|
269
279
|
description: 'Zigbee LED Controller W (pro)',
|
|
270
280
|
extend: gledoptoExtend.light_onoff_brightness(),
|
|
281
|
+
configure: configureReadModelID,
|
|
271
282
|
},
|
|
272
283
|
{
|
|
273
284
|
zigbeeModel: ['GL-C-009S'],
|
package/devices/kwikset.js
CHANGED
|
@@ -36,7 +36,7 @@ module.exports = [
|
|
|
36
36
|
exposes: [e.lock(), e.battery()],
|
|
37
37
|
},
|
|
38
38
|
{
|
|
39
|
-
zigbeeModel: ['SMARTCODE_DEADBOLT_10_W3'],
|
|
39
|
+
zigbeeModel: ['SMARTCODE_DEADBOLT_10_W3', 'SMARTCODE_DEADBOLT_10T_W3'],
|
|
40
40
|
model: '99140-031',
|
|
41
41
|
vendor: 'Kwikset',
|
|
42
42
|
description: 'SmartCode traditional electronic deadbolt',
|
package/devices/legrand.js
CHANGED
|
@@ -6,6 +6,7 @@ const extend = require('../lib/extend');
|
|
|
6
6
|
const e = exposes.presets;
|
|
7
7
|
const ea = exposes.access;
|
|
8
8
|
const ota = require('../lib/ota');
|
|
9
|
+
const utils = require('../lib/utils');
|
|
9
10
|
|
|
10
11
|
const readInitialBatteryState = async (type, data, device) => {
|
|
11
12
|
if (['deviceAnnounce'].includes(type)) {
|
|
@@ -20,7 +21,9 @@ const fzLocal = {
|
|
|
20
21
|
cluster: 'genOnOff',
|
|
21
22
|
type: 'commandOff',
|
|
22
23
|
convert: (model, msg, publish, options, meta) => {
|
|
23
|
-
|
|
24
|
+
const payload = {action: utils.postfixWithEndpointName('off', msg, model)};
|
|
25
|
+
utils.addActionGroup(payload, msg, model);
|
|
26
|
+
return payload;
|
|
24
27
|
},
|
|
25
28
|
},
|
|
26
29
|
};
|
|
@@ -87,6 +87,14 @@ module.exports = [
|
|
|
87
87
|
extend: extend.light_onoff_brightness_colortemp_color(),
|
|
88
88
|
toZigbee: extend.light_onoff_brightness_colortemp_color().toZigbee.concat([tz.tint_scene]),
|
|
89
89
|
},
|
|
90
|
+
{
|
|
91
|
+
fingerprint: [{modelID: 'TS0505B', manufacturerName: '_TZ3210_mntza0sw'}],
|
|
92
|
+
model: '404062',
|
|
93
|
+
vendor: 'Müller Licht',
|
|
94
|
+
description: 'Kea RGB+CCT',
|
|
95
|
+
extend: extend.light_onoff_brightness_colortemp_color({colorTempRange: [153, 500]}),
|
|
96
|
+
toZigbee: extend.light_onoff_brightness_colortemp_color().toZigbee.concat([tz.tint_scene]),
|
|
97
|
+
},
|
|
90
98
|
{
|
|
91
99
|
zigbeeModel: ['ZBT-Remote-ALL-RGBW'],
|
|
92
100
|
model: 'MLI-404011',
|
package/devices/orvibo.js
CHANGED
|
@@ -292,4 +292,182 @@ module.exports = [
|
|
|
292
292
|
},
|
|
293
293
|
exposes: [e.cover_position(), e.battery()],
|
|
294
294
|
},
|
|
295
|
+
{
|
|
296
|
+
zigbeeModel: ['2ae011fb6d0542f58705d6861064eb5f'],
|
|
297
|
+
model: 'T40W1Z',
|
|
298
|
+
vendor: 'ORVIBO',
|
|
299
|
+
description: 'MixSwitch 1 gang',
|
|
300
|
+
extend: extend.switch(),
|
|
301
|
+
exposes: [e.switch()],
|
|
302
|
+
|
|
303
|
+
configure: async (device, coordinatorEndpoint, logger) => {
|
|
304
|
+
const endpoint = device.getEndpoint(1);
|
|
305
|
+
await reporting.bind(endpoint, coordinatorEndpoint, ['genOnOff']);
|
|
306
|
+
await reporting.onOff(endpoint);
|
|
307
|
+
},
|
|
308
|
+
},
|
|
309
|
+
{
|
|
310
|
+
zigbeeModel: ['2e13af8e17434961be98f055d68c2166'],
|
|
311
|
+
model: 'T40W2Z',
|
|
312
|
+
vendor: 'ORVIBO',
|
|
313
|
+
description: 'MixSwitch 2 gangs',
|
|
314
|
+
extend: extend.switch(),
|
|
315
|
+
exposes: [e.switch().withEndpoint('left'), e.switch().withEndpoint('right')],
|
|
316
|
+
endpoint: (device) => {
|
|
317
|
+
return {'left': 1, 'right': 2};
|
|
318
|
+
},
|
|
319
|
+
meta: {multiEndpoint: true},
|
|
320
|
+
configure: async (device, coordinatorEndpoint, logger) => {
|
|
321
|
+
const endpoint1 = device.getEndpoint(1);
|
|
322
|
+
await reporting.bind(endpoint1, coordinatorEndpoint, ['genOnOff']);
|
|
323
|
+
await reporting.onOff(endpoint1);
|
|
324
|
+
const endpoint2 = device.getEndpoint(2);
|
|
325
|
+
await reporting.bind(endpoint2, coordinatorEndpoint, ['genOnOff']);
|
|
326
|
+
await reporting.onOff(endpoint2);
|
|
327
|
+
},
|
|
328
|
+
},
|
|
329
|
+
{
|
|
330
|
+
zigbeeModel: ['e8d667cb184b4a2880dd886c23d00976'],
|
|
331
|
+
model: 'T40W3Z',
|
|
332
|
+
vendor: 'ORVIBO',
|
|
333
|
+
description: 'MixSwitch 3 gangs',
|
|
334
|
+
extend: extend.switch(),
|
|
335
|
+
exposes: [e.switch().withEndpoint('left'), e.switch().withEndpoint('center'), e.switch().withEndpoint('right')],
|
|
336
|
+
endpoint: (device) => {
|
|
337
|
+
return {'left': 1, 'center': 2, 'right': 3};
|
|
338
|
+
},
|
|
339
|
+
meta: {multiEndpoint: true},
|
|
340
|
+
configure: async (device, coordinatorEndpoint, logger) => {
|
|
341
|
+
const endpoint1 = device.getEndpoint(1);
|
|
342
|
+
await reporting.bind(endpoint1, coordinatorEndpoint, ['genOnOff']);
|
|
343
|
+
await reporting.onOff(endpoint1);
|
|
344
|
+
const endpoint2 = device.getEndpoint(2);
|
|
345
|
+
await reporting.bind(endpoint2, coordinatorEndpoint, ['genOnOff']);
|
|
346
|
+
await reporting.onOff(endpoint2);
|
|
347
|
+
const endpoint3 = device.getEndpoint(3);
|
|
348
|
+
await reporting.bind(endpoint3, coordinatorEndpoint, ['genOnOff']);
|
|
349
|
+
await reporting.onOff(endpoint3);
|
|
350
|
+
},
|
|
351
|
+
},
|
|
352
|
+
{
|
|
353
|
+
zigbeeModel: ['20513b10079f4cc68cffb8b0dc6d3277'],
|
|
354
|
+
model: 'T40W4Z',
|
|
355
|
+
vendor: 'ORVIBO',
|
|
356
|
+
description: 'MixSwitch 4 gangs',
|
|
357
|
+
extend: extend.switch(),
|
|
358
|
+
exposes: [e.switch().withEndpoint('l1'), e.switch().withEndpoint('l2'), e.switch().withEndpoint('l3'),
|
|
359
|
+
e.switch().withEndpoint('l4'), e.switch().withEndpoint('l5'), e.switch().withEndpoint('l6')],
|
|
360
|
+
endpoint: (device) => {
|
|
361
|
+
return {'l1': 1, 'l2': 2, 'l3': 3, 'l4': 4, 'l5': 5, 'l6': 6};
|
|
362
|
+
},
|
|
363
|
+
meta: {multiEndpoint: true},
|
|
364
|
+
configure: async (device, coordinatorEndpoint, logger) => {
|
|
365
|
+
const endpoint1 = device.getEndpoint(1);
|
|
366
|
+
await reporting.bind(endpoint1, coordinatorEndpoint, ['genOnOff']);
|
|
367
|
+
await reporting.onOff(endpoint1);
|
|
368
|
+
const endpoint2 = device.getEndpoint(2);
|
|
369
|
+
await reporting.bind(endpoint2, coordinatorEndpoint, ['genOnOff']);
|
|
370
|
+
await reporting.onOff(endpoint2);
|
|
371
|
+
const endpoint3 = device.getEndpoint(3);
|
|
372
|
+
await reporting.bind(endpoint3, coordinatorEndpoint, ['genOnOff']);
|
|
373
|
+
await reporting.onOff(endpoint3);
|
|
374
|
+
const endpoint4 = device.getEndpoint(4);
|
|
375
|
+
await reporting.bind(endpoint4, coordinatorEndpoint, ['genOnOff']);
|
|
376
|
+
await reporting.onOff(endpoint4);
|
|
377
|
+
const endpoint5 = device.getEndpoint(5);
|
|
378
|
+
await reporting.bind(endpoint5, coordinatorEndpoint, ['genOnOff']);
|
|
379
|
+
await reporting.onOff(endpoint5);
|
|
380
|
+
const endpoint6 = device.getEndpoint(6);
|
|
381
|
+
await reporting.bind(endpoint6, coordinatorEndpoint, ['genOnOff']);
|
|
382
|
+
await reporting.onOff(endpoint6);
|
|
383
|
+
},
|
|
384
|
+
},
|
|
385
|
+
{
|
|
386
|
+
zigbeeModel: ['bcb949e87e8c4ea6bc2803052dd8fbf5'],
|
|
387
|
+
model: 'T40S6Z',
|
|
388
|
+
vendor: 'ORVIBO',
|
|
389
|
+
description: 'MixSwitch 6 gangs',
|
|
390
|
+
fromZigbee: [fz.orvibo_raw_2],
|
|
391
|
+
toZigbee: [],
|
|
392
|
+
exposes: [e.action(['button_1_click', 'button_2_click', 'button_3_click', 'button_4_click', 'button_5_click', 'button_6_click'])],
|
|
393
|
+
},
|
|
394
|
+
{
|
|
395
|
+
zigbeeModel: ['ba8120ad03f744ecb6a973672369e80d'],
|
|
396
|
+
model: 'T41W1Z',
|
|
397
|
+
vendor: 'ORVIBO',
|
|
398
|
+
description: 'MixSwitch 1 gang (without neutral wire)',
|
|
399
|
+
extend: extend.switch(),
|
|
400
|
+
exposes: [e.switch()],
|
|
401
|
+
configure: async (device, coordinatorEndpoint, logger) => {
|
|
402
|
+
const endpoint = device.getEndpoint(1);
|
|
403
|
+
await reporting.bind(endpoint, coordinatorEndpoint, ['genOnOff']);
|
|
404
|
+
await reporting.onOff(endpoint);
|
|
405
|
+
},
|
|
406
|
+
},
|
|
407
|
+
{
|
|
408
|
+
zigbeeModel: ['7c8f476a0f764cd4b994bc73d07c906d'],
|
|
409
|
+
model: 'T41W2Z',
|
|
410
|
+
vendor: 'ORVIBO',
|
|
411
|
+
description: 'MixSwitch 2 gang (without neutral wire)',
|
|
412
|
+
extend: extend.switch(),
|
|
413
|
+
exposes: [e.switch().withEndpoint('left'), e.switch().withEndpoint('right')],
|
|
414
|
+
endpoint: (device) => {
|
|
415
|
+
return {'left': 1, 'right': 2};
|
|
416
|
+
},
|
|
417
|
+
meta: {multiEndpoint: true},
|
|
418
|
+
configure: async (device, coordinatorEndpoint, logger) => {
|
|
419
|
+
const endpoint1 = device.getEndpoint(1);
|
|
420
|
+
await reporting.bind(endpoint1, coordinatorEndpoint, ['genOnOff']);
|
|
421
|
+
await reporting.onOff(endpoint1);
|
|
422
|
+
const endpoint2 = device.getEndpoint(2);
|
|
423
|
+
await reporting.bind(endpoint2, coordinatorEndpoint, ['genOnOff']);
|
|
424
|
+
await reporting.onOff(endpoint2);
|
|
425
|
+
},
|
|
426
|
+
},
|
|
427
|
+
{
|
|
428
|
+
zigbeeModel: ['cb7ce9fe2cb147e69c5ea700b39b3d5b'],
|
|
429
|
+
model: 'DM10ZW',
|
|
430
|
+
vendor: 'ORVIBO',
|
|
431
|
+
description: '0-10v dimmer',
|
|
432
|
+
extend: extend.light_onoff_brightness_colortemp({colorTempRange: [153, 371]}),
|
|
433
|
+
},
|
|
434
|
+
{
|
|
435
|
+
zigbeeModel: ['1a20628504bf48c88ed698fe96b7867c'],
|
|
436
|
+
model: 'DTZ09039',
|
|
437
|
+
vendor: 'ORVIBO',
|
|
438
|
+
description: 'Downlight (Q series)',
|
|
439
|
+
extend: extend.light_onoff_brightness(),
|
|
440
|
+
},
|
|
441
|
+
{
|
|
442
|
+
zigbeeModel: ['bbfed49c738948b989911f9f9f73d759'],
|
|
443
|
+
model: 'R30W3Z',
|
|
444
|
+
vendor: 'ORVIBO',
|
|
445
|
+
description: 'In-wall switch 3 gang',
|
|
446
|
+
extend: extend.switch(),
|
|
447
|
+
exposes: [e.switch().withEndpoint('left'), e.switch().withEndpoint('center'), e.switch().withEndpoint('right')],
|
|
448
|
+
endpoint: (device) => {
|
|
449
|
+
return {'left': 1, 'center': 2, 'right': 3};
|
|
450
|
+
},
|
|
451
|
+
meta: {multiEndpoint: true},
|
|
452
|
+
configure: async (device, coordinatorEndpoint, logger) => {
|
|
453
|
+
const endpoint1 = device.getEndpoint(1);
|
|
454
|
+
await reporting.bind(endpoint1, coordinatorEndpoint, ['genOnOff']);
|
|
455
|
+
await reporting.onOff(endpoint1);
|
|
456
|
+
const endpoint2 = device.getEndpoint(2);
|
|
457
|
+
await reporting.bind(endpoint2, coordinatorEndpoint, ['genOnOff']);
|
|
458
|
+
await reporting.onOff(endpoint2);
|
|
459
|
+
const endpoint3 = device.getEndpoint(3);
|
|
460
|
+
await reporting.bind(endpoint3, coordinatorEndpoint, ['genOnOff']);
|
|
461
|
+
await reporting.onOff(endpoint3);
|
|
462
|
+
},
|
|
463
|
+
},
|
|
464
|
+
{
|
|
465
|
+
zigbeeModel: ['0e93fa9c36bb417a90ad5d8a184b683a'],
|
|
466
|
+
model: 'SM20',
|
|
467
|
+
vendor: 'ORVIBO',
|
|
468
|
+
description: 'Door or window contact switch',
|
|
469
|
+
fromZigbee: [fz.ias_contact_alarm_1, fz.battery],
|
|
470
|
+
toZigbee: [],
|
|
471
|
+
exposes: [e.contact(), e.battery_low(), e.tamper(), e.battery()],
|
|
472
|
+
},
|
|
295
473
|
];
|
package/devices/philips.js
CHANGED
|
@@ -1613,7 +1613,7 @@ module.exports = [
|
|
|
1613
1613
|
ota: ota.zigbeeOTA,
|
|
1614
1614
|
},
|
|
1615
1615
|
{
|
|
1616
|
-
zigbeeModel: ['4080248U9'],
|
|
1616
|
+
zigbeeModel: ['4080248U9', '915005987201'],
|
|
1617
1617
|
model: '4080248U9',
|
|
1618
1618
|
vendor: 'Philips',
|
|
1619
1619
|
description: 'Hue White and color ambiance Signe floor light',
|
package/devices/shinasystem.js
CHANGED
|
@@ -341,4 +341,25 @@ module.exports = [
|
|
|
341
341
|
}]);
|
|
342
342
|
},
|
|
343
343
|
},
|
|
344
|
+
{
|
|
345
|
+
zigbeeModel: ['DLM-300Z'],
|
|
346
|
+
model: 'DLM-300Z',
|
|
347
|
+
vendor: 'ShinaSystem',
|
|
348
|
+
description: 'Sihas door lock',
|
|
349
|
+
fromZigbee: [fz.lock, fz.battery, fz.lock_operation_event, fz.lock_programming_event, fz.lock_pin_code_response],
|
|
350
|
+
toZigbee: [tz.lock, tz.pincode_lock],
|
|
351
|
+
meta: {pinCodeCount: 4},
|
|
352
|
+
configure: async (device, coordinatorEndpoint, logger) => {
|
|
353
|
+
const endpoint = device.getEndpoint(1);
|
|
354
|
+
await reporting.bind(endpoint, coordinatorEndpoint, ['closuresDoorLock', 'genPowerCfg']);
|
|
355
|
+
await reporting.lockState(endpoint, {min: 0, max: 3600, change: 0});
|
|
356
|
+
await reporting.batteryPercentageRemaining(endpoint, {min: 600, max: 21600, change: 1});
|
|
357
|
+
await reporting.doorState(endpoint);
|
|
358
|
+
},
|
|
359
|
+
exposes: [e.battery(), e.lock(), exposes.enum('door_state', ea.STATE, ['open', 'closed']).withDescription('Door status'),
|
|
360
|
+
exposes.composite('pin_code', 'pin_code')
|
|
361
|
+
.withFeature(exposes.numeric('user', ea.SET).withDescription('User ID can only number 1'))
|
|
362
|
+
.withFeature(exposes.numeric('pin_code', ea.SET).withDescription('Pincode to set, set pincode(4 digit) to null to clear')),
|
|
363
|
+
],
|
|
364
|
+
},
|
|
344
365
|
];
|
package/devices/sinope.js
CHANGED
|
@@ -331,4 +331,36 @@ module.exports = [
|
|
|
331
331
|
},
|
|
332
332
|
exposes: [e.water_leak(), e.battery_low(), e.temperature(), e.battery()],
|
|
333
333
|
},
|
|
334
|
+
{
|
|
335
|
+
zigbeeModel: ['VA4200WZ'],
|
|
336
|
+
model: 'VA4200WZ',
|
|
337
|
+
vendor: 'Sinopé',
|
|
338
|
+
description: 'Zigbee smart water valve (3/4")',
|
|
339
|
+
fromZigbee: [fz.cover_position_via_brightness, fz.cover_state_via_onoff, fz.battery],
|
|
340
|
+
toZigbee: [tz.cover_via_brightness],
|
|
341
|
+
configure: async (device, coordinatorEndpoint) => {
|
|
342
|
+
const endpoint = device.getEndpoint(1);
|
|
343
|
+
await reporting.bind(endpoint, coordinatorEndpoint, ['genOnOff', 'genLevelCtrl', 'genPowerCfg']);
|
|
344
|
+
await reporting.batteryPercentageRemaining(endpoint);
|
|
345
|
+
await reporting.onOff(endpoint);
|
|
346
|
+
await reporting.brightness(endpoint); // valve position
|
|
347
|
+
},
|
|
348
|
+
exposes: [e.valve_switch(), e.valve_position(), e.battery_low(), e.battery()],
|
|
349
|
+
},
|
|
350
|
+
{
|
|
351
|
+
zigbeeModel: ['VA4201WZ'],
|
|
352
|
+
model: 'VA4201WZ',
|
|
353
|
+
vendor: 'Sinopé',
|
|
354
|
+
description: 'Zigbee smart water valve (1")',
|
|
355
|
+
fromZigbee: [fz.cover_position_via_brightness, fz.cover_state_via_onoff, fz.battery],
|
|
356
|
+
toZigbee: [tz.cover_via_brightness],
|
|
357
|
+
configure: async (device, coordinatorEndpoint) => {
|
|
358
|
+
const endpoint = device.getEndpoint(1);
|
|
359
|
+
await reporting.bind(endpoint, coordinatorEndpoint, ['genOnOff', 'genLevelCtrl', 'genPowerCfg']);
|
|
360
|
+
await reporting.batteryPercentageRemaining(endpoint);
|
|
361
|
+
await reporting.onOff(endpoint);
|
|
362
|
+
await reporting.brightness(endpoint); // valve position
|
|
363
|
+
},
|
|
364
|
+
exposes: [e.valve_switch(), e.valve_position(), e.battery_low(), e.battery()],
|
|
365
|
+
},
|
|
334
366
|
];
|
package/devices/stelpro.js
CHANGED
|
@@ -103,6 +103,36 @@ module.exports = [
|
|
|
103
103
|
reportableChange: 1}]);
|
|
104
104
|
},
|
|
105
105
|
},
|
|
106
|
+
{
|
|
107
|
+
zigbeeModel: ['SORB'],
|
|
108
|
+
model: 'SORB',
|
|
109
|
+
vendor: 'Stelpro',
|
|
110
|
+
description: 'ORLÉANS fan heater',
|
|
111
|
+
fromZigbee: [fz.stelpro_thermostat, fz.hvac_user_interface],
|
|
112
|
+
toZigbee: [tz.thermostat_local_temperature, tz.thermostat_occupied_heating_setpoint,
|
|
113
|
+
tz.thermostat_temperature_display_mode, tz.thermostat_keypad_lockout, tz.thermostat_system_mode, tz.thermostat_running_state],
|
|
114
|
+
exposes: [e.local_temperature(), e.keypad_lockout(),
|
|
115
|
+
exposes.climate().withSetpoint('occupied_heating_setpoint', 5, 30, 0.5).withLocalTemperature()
|
|
116
|
+
.withSystemMode(['off', 'auto', 'heat']).withRunningState(['idle', 'heat'])],
|
|
117
|
+
configure: async (device, coordinatorEndpoint, logger) => {
|
|
118
|
+
const endpoint = device.getEndpoint(25);
|
|
119
|
+
const binds = ['genBasic', 'genIdentify', 'genGroups', 'hvacThermostat', 'hvacUserInterfaceCfg', 'msTemperatureMeasurement'];
|
|
120
|
+
await reporting.bind(endpoint, coordinatorEndpoint, binds);
|
|
121
|
+
|
|
122
|
+
// Those exact parameters (min/max/change) are required for reporting to work with Stelpro SORB
|
|
123
|
+
await reporting.thermostatTemperature(endpoint);
|
|
124
|
+
await reporting.thermostatOccupiedHeatingSetpoint(endpoint);
|
|
125
|
+
await reporting.thermostatSystemMode(endpoint);
|
|
126
|
+
await reporting.thermostatPIHeatingDemand(endpoint);
|
|
127
|
+
await reporting.thermostatKeypadLockMode(endpoint);
|
|
128
|
+
// cluster 0x0201 attribute 0x401c
|
|
129
|
+
await endpoint.configureReporting('hvacThermostat', [{
|
|
130
|
+
attribute: 'StelproSystemMode',
|
|
131
|
+
minimumReportInterval: constants.repInterval.MINUTE,
|
|
132
|
+
maximumReportInterval: constants.repInterval.HOUR,
|
|
133
|
+
reportableChange: 1}]);
|
|
134
|
+
},
|
|
135
|
+
},
|
|
106
136
|
{
|
|
107
137
|
zigbeeModel: ['SMT402AD'],
|
|
108
138
|
model: 'SMT402AD',
|
package/devices/tplink.js
CHANGED
|
@@ -23,4 +23,20 @@ module.exports = [
|
|
|
23
23
|
device.save();
|
|
24
24
|
},
|
|
25
25
|
},
|
|
26
|
+
{
|
|
27
|
+
zigbeeModel: ['CS100'],
|
|
28
|
+
model: 'CS100',
|
|
29
|
+
vendor: 'TP-Link',
|
|
30
|
+
description: 'Contact sensor',
|
|
31
|
+
fromZigbee: [fz.ias_contact_alarm_1, fz.battery],
|
|
32
|
+
toZigbee: [],
|
|
33
|
+
exposes: [e.contact(), e.battery_low(), e.battery()],
|
|
34
|
+
configure: async (device, coordinatorEndpoint, logger) => {
|
|
35
|
+
const endpoint = device.getEndpoint(1);
|
|
36
|
+
await reporting.bind(endpoint, coordinatorEndpoint, ['genPowerCfg']);
|
|
37
|
+
await reporting.batteryPercentageRemaining(endpoint);
|
|
38
|
+
device.powerSource = 'Battery';
|
|
39
|
+
device.save();
|
|
40
|
+
},
|
|
41
|
+
},
|
|
26
42
|
];
|