zigbee-herdsman-converters 14.0.420 → 14.0.424
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 +40 -5
- package/converters/toZigbee.js +16 -6
- package/devices/adeo.js +7 -0
- package/devices/alchemy.js +11 -0
- package/devices/aurora_lighting.js +18 -0
- package/devices/awox.js +77 -0
- package/devices/enbrighten.js +12 -0
- package/devices/hive.js +14 -0
- package/devices/ikea.js +7 -0
- package/devices/lds.js +11 -0
- package/devices/legrand.js +1 -1
- package/devices/lixee.js +18 -14
- package/devices/meazon.js +1 -1
- package/devices/miboxer.js +7 -4
- package/devices/m/303/274ller_licht.js +1 -1
- package/devices/nous.js +25 -0
- package/devices/paulmann.js +7 -0
- package/devices/philips.js +1 -1
- package/devices/profalux.js +4 -4
- package/devices/slv.js +20 -0
- package/devices/sonoff.js +2 -2
- package/devices/the_light_group.js +7 -0
- package/devices/tuya.js +31 -11
- package/devices/xiaomi.js +2 -1
- package/lib/exposes.js +1 -0
- package/lib/tuya.js +3 -0
- package/lib/utils.js +2 -1
- package/npm-shrinkwrap.json +963 -896
- package/package.json +2 -2
package/converters/fromZigbee.js
CHANGED
|
@@ -1837,7 +1837,7 @@ const converters = {
|
|
|
1837
1837
|
case tuya.dataPoints.nousBattery:
|
|
1838
1838
|
return {battery: value};
|
|
1839
1839
|
case tuya.dataPoints.nousTempUnitConvert:
|
|
1840
|
-
return {temperature_unit_convert: {0x00: '
|
|
1840
|
+
return {temperature_unit_convert: {0x00: 'celsius', 0x01: 'fahrenheit'}[value]};
|
|
1841
1841
|
case tuya.dataPoints.nousMaxTemp:
|
|
1842
1842
|
return {max_temperature: calibrateAndPrecisionRoundOptions(value / 10, options, 'temperature')};
|
|
1843
1843
|
case tuya.dataPoints.nousMinTemp:
|
|
@@ -3224,8 +3224,9 @@ const converters = {
|
|
|
3224
3224
|
}
|
|
3225
3225
|
|
|
3226
3226
|
if (msg.data.hasOwnProperty('12288')) {
|
|
3227
|
-
result.energy_consumed = precisionRound(msg.data['12288'], 2);
|
|
3227
|
+
result.energy_consumed = precisionRound(msg.data['12288'], 2); // deprecated
|
|
3228
3228
|
result.energyconsumed = result.energy_consumed; // deprecated
|
|
3229
|
+
result.energy = result.energy_consumed;
|
|
3229
3230
|
}
|
|
3230
3231
|
|
|
3231
3232
|
if (msg.data.hasOwnProperty('12291')) {
|
|
@@ -4141,6 +4142,25 @@ const converters = {
|
|
|
4141
4142
|
}
|
|
4142
4143
|
},
|
|
4143
4144
|
},
|
|
4145
|
+
tuya_CO: {
|
|
4146
|
+
cluster: 'manuSpecificTuya',
|
|
4147
|
+
type: ['commandDataReport', 'commandDataResponse'],
|
|
4148
|
+
options: [exposes.options.precision('co'), exposes.options.calibration('co')],
|
|
4149
|
+
convert: (model, msg, publish, options, meta) => {
|
|
4150
|
+
const dpValue = tuya.firstDpValue(msg, meta, 'tuya_CO');
|
|
4151
|
+
const dp = dpValue.dp;
|
|
4152
|
+
const value = tuya.getDataValue(dpValue);
|
|
4153
|
+
switch (dp) {
|
|
4154
|
+
case tuya.dataPoints.tuyaSabCO:
|
|
4155
|
+
return {co: calibrateAndPrecisionRoundOptions(value / 100, options, 'co')};
|
|
4156
|
+
case tuya.dataPoints.tuyaSabCOalarm:
|
|
4157
|
+
return {carbon_monoxide: value ? 'OFF' : 'ON'};
|
|
4158
|
+
default:
|
|
4159
|
+
meta.logger.warn(`zigbee-herdsman-converters:TuyaSmartAirBox: Unrecognized DP #${
|
|
4160
|
+
dp} with data ${JSON.stringify(dpValue)}`);
|
|
4161
|
+
}
|
|
4162
|
+
},
|
|
4163
|
+
},
|
|
4144
4164
|
saswell_thermostat: {
|
|
4145
4165
|
cluster: 'manuSpecificTuya',
|
|
4146
4166
|
type: ['commandDataResponse', 'commandDataReport'],
|
|
@@ -4434,7 +4454,7 @@ const converters = {
|
|
|
4434
4454
|
case tuya.dataPoints.ecoTemp:
|
|
4435
4455
|
return {eco_temperature: value};
|
|
4436
4456
|
case tuya.dataPoints.valvePos:
|
|
4437
|
-
return {position: value};
|
|
4457
|
+
return {position: value, running_state: value ? 'heat' : 'idle'};
|
|
4438
4458
|
case tuya.dataPoints.awayTemp:
|
|
4439
4459
|
return {away_preset_temperature: value};
|
|
4440
4460
|
case tuya.dataPoints.awayDays:
|
|
@@ -5106,7 +5126,7 @@ const converters = {
|
|
|
5106
5126
|
},
|
|
5107
5127
|
},
|
|
5108
5128
|
legrand_cable_outlet_mode: {
|
|
5109
|
-
cluster: '
|
|
5129
|
+
cluster: 'manuSpecificLegrandDevices2',
|
|
5110
5130
|
type: ['readResponse'],
|
|
5111
5131
|
convert: (model, msg, publish, options, meta) => {
|
|
5112
5132
|
const payload = {};
|
|
@@ -8134,6 +8154,7 @@ const converters = {
|
|
|
8134
8154
|
}
|
|
8135
8155
|
if (dp === tuya.dataPoints.hochTotalActivePower) {
|
|
8136
8156
|
result.energy_consumed = value / 100;
|
|
8157
|
+
result.energy = result.energy_consumed;
|
|
8137
8158
|
}
|
|
8138
8159
|
if (dp === tuya.dataPoints.hochLocking) {
|
|
8139
8160
|
result.trip = value ? 'trip' : 'clear';
|
|
@@ -8150,7 +8171,7 @@ const converters = {
|
|
|
8150
8171
|
1: 'on',
|
|
8151
8172
|
2: 'previous',
|
|
8152
8173
|
};
|
|
8153
|
-
result.
|
|
8174
|
+
result.power_on_behavior = lookup[value];
|
|
8154
8175
|
}
|
|
8155
8176
|
if (dp === tuya.dataPoints.hochFaultCode) {
|
|
8156
8177
|
const lookup = {
|
|
@@ -8410,6 +8431,20 @@ const converters = {
|
|
|
8410
8431
|
}
|
|
8411
8432
|
},
|
|
8412
8433
|
},
|
|
8434
|
+
tm081: {
|
|
8435
|
+
cluster: 'manuSpecificTuya',
|
|
8436
|
+
type: ['commandDataReport'],
|
|
8437
|
+
convert: (model, msg, publish, options, meta) => {
|
|
8438
|
+
const dpValue = tuya.firstDpValue(msg, meta, 'tm0801');
|
|
8439
|
+
const dp = dpValue.dp;
|
|
8440
|
+
const value = tuya.getDataValue(dpValue);
|
|
8441
|
+
if (dp === 1) return {contact: value === true ? false : true};
|
|
8442
|
+
if (dp === 2) return {battery: value};
|
|
8443
|
+
else {
|
|
8444
|
+
meta.logger.warn(`zigbee-herdsman-converters:TM081: NOT RECOGNIZED DP #${dp} with data ${JSON.stringify(dpValue)}`);
|
|
8445
|
+
}
|
|
8446
|
+
},
|
|
8447
|
+
},
|
|
8413
8448
|
// #endregion
|
|
8414
8449
|
|
|
8415
8450
|
// #region Ignore converters (these message dont need parsing).
|
package/converters/toZigbee.js
CHANGED
|
@@ -4577,10 +4577,20 @@ const converters = {
|
|
|
4577
4577
|
legrand_cableOutletMode: {
|
|
4578
4578
|
key: ['cable_outlet_mode'],
|
|
4579
4579
|
convertSet: async (entity, key, value, meta) => {
|
|
4580
|
-
|
|
4580
|
+
const mode = {
|
|
4581
|
+
'comfort': 0x00,
|
|
4582
|
+
'comfort-1': 0x01,
|
|
4583
|
+
'comfort-2': 0x02,
|
|
4584
|
+
'eco': 0x03,
|
|
4585
|
+
'frost_protection': 0x04,
|
|
4586
|
+
'off': 0x05,
|
|
4587
|
+
};
|
|
4588
|
+
const payload = {data: Buffer.from([mode[value]])};
|
|
4589
|
+
await entity.command('manuSpecificLegrandDevices2', 'command0', payload);
|
|
4590
|
+
return {state: {'cable_outlet_mode': value}};
|
|
4581
4591
|
},
|
|
4582
4592
|
convertGet: async (entity, key, meta) => {
|
|
4583
|
-
await entity.read(
|
|
4593
|
+
await entity.read('manuSpecificLegrandDevices2', [0x0000], manufacturerOptions.legrand);
|
|
4584
4594
|
},
|
|
4585
4595
|
},
|
|
4586
4596
|
legrand_powerAlarm: {
|
|
@@ -5279,7 +5289,7 @@ const converters = {
|
|
|
5279
5289
|
convertSet: async (entity, key, value, meta) => {
|
|
5280
5290
|
switch (key) {
|
|
5281
5291
|
case 'temperature_unit_convert':
|
|
5282
|
-
await tuya.sendDataPointEnum(entity, tuya.dataPoints.nousTempUnitConvert, ['
|
|
5292
|
+
await tuya.sendDataPointEnum(entity, tuya.dataPoints.nousTempUnitConvert, ['celsius', 'fahrenheit'].indexOf(value));
|
|
5283
5293
|
break;
|
|
5284
5294
|
case 'min_temperature':
|
|
5285
5295
|
await tuya.sendDataPointValue(entity, tuya.dataPoints.nousMinTemp, Math.round(value * 10));
|
|
@@ -7006,7 +7016,7 @@ const converters = {
|
|
|
7006
7016
|
key: ['state',
|
|
7007
7017
|
'child_lock',
|
|
7008
7018
|
'countdown_timer',
|
|
7009
|
-
'
|
|
7019
|
+
'power_on_behavior',
|
|
7010
7020
|
'trip',
|
|
7011
7021
|
'clear_device_data',
|
|
7012
7022
|
/* TODO: Add the below keys when toZigbee converter work has been completed
|
|
@@ -7025,10 +7035,10 @@ const converters = {
|
|
|
7025
7035
|
} else if (key === 'countdown_timer') {
|
|
7026
7036
|
await tuya.sendDataPointValue(entity, tuya.dataPoints.hochCountdownTimer, value);
|
|
7027
7037
|
return {state: {countdown_timer: value}};
|
|
7028
|
-
} else if (key === '
|
|
7038
|
+
} else if (key === 'power_on_behavior') {
|
|
7029
7039
|
const lookup = {'off': 0, 'on': 1, 'previous': 2};
|
|
7030
7040
|
await tuya.sendDataPointEnum(entity, tuya.dataPoints.hochRelayStatus, lookup[value], 'sendData');
|
|
7031
|
-
return {state: {
|
|
7041
|
+
return {state: {power_on_behavior: value}};
|
|
7032
7042
|
} else if (key === 'trip') {
|
|
7033
7043
|
if (value === 'clear') {
|
|
7034
7044
|
await tuya.sendDataPointBool(entity, tuya.dataPoints.hochLocking, true, 'sendData');
|
package/devices/adeo.js
CHANGED
|
@@ -71,6 +71,13 @@ module.exports = [
|
|
|
71
71
|
description: 'ENKI Lexman E27 14W to 100W LED RGBW',
|
|
72
72
|
extend: extend.light_onoff_brightness_colortemp_color(),
|
|
73
73
|
},
|
|
74
|
+
{
|
|
75
|
+
zigbeeModel: ['ZBEK-2'],
|
|
76
|
+
model: 'IG-CDZOTAAG014RA-MAN',
|
|
77
|
+
vendor: 'ADEO',
|
|
78
|
+
description: 'ENKI Lexman E27 14W to 100W LED RGBW v2',
|
|
79
|
+
extend: extend.light_onoff_brightness_colortemp_color({colorTempRange: [153, 370]}),
|
|
80
|
+
},
|
|
74
81
|
{
|
|
75
82
|
zigbeeModel: ['LXEK-7'],
|
|
76
83
|
model: '9CZA-A806ST-Q1Z',
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
const extend = require('../lib/extend');
|
|
2
|
+
|
|
3
|
+
module.exports = [
|
|
4
|
+
{
|
|
5
|
+
zigbeeModel: ['AL8TC13W-AP'],
|
|
6
|
+
model: 'AL8TC13W-AP',
|
|
7
|
+
vendor: 'Alchemy',
|
|
8
|
+
description: 'Downlight with tuneable white',
|
|
9
|
+
extend: extend.light_onoff_brightness_colortemp({colorTempRange: [153, 370]}),
|
|
10
|
+
},
|
|
11
|
+
];
|
|
@@ -4,6 +4,21 @@ const tz = require('../converters/toZigbee');
|
|
|
4
4
|
const reporting = require('../lib/reporting');
|
|
5
5
|
const extend = require('../lib/extend');
|
|
6
6
|
const e = exposes.presets;
|
|
7
|
+
const utils = require('../lib/utils');
|
|
8
|
+
const ea = exposes.access;
|
|
9
|
+
|
|
10
|
+
const tzLocal = {
|
|
11
|
+
aOneBacklight: {
|
|
12
|
+
key: ['backlight_led'],
|
|
13
|
+
convertSet: async (entity, key, value, meta) => {
|
|
14
|
+
const state = value.toLowerCase();
|
|
15
|
+
utils.validateValue(state, ['toggle', 'off', 'on']);
|
|
16
|
+
const endpoint = meta.device.getEndpoint(3);
|
|
17
|
+
await endpoint.command('genOnOff', state, {});
|
|
18
|
+
return {state: {backlight_led: state.toUpperCase()}};
|
|
19
|
+
},
|
|
20
|
+
},
|
|
21
|
+
};
|
|
7
22
|
|
|
8
23
|
const batteryRotaryDimmer = (...endpointsIds) => ({
|
|
9
24
|
fromZigbee: [fz.battery, fz.command_on, fz.command_off, fz.command_step, fz.command_step_color_temperature],
|
|
@@ -129,6 +144,9 @@ module.exports = [
|
|
|
129
144
|
model: 'AU-A1ZB2WDM',
|
|
130
145
|
vendor: 'Aurora Lighting',
|
|
131
146
|
description: 'AOne 250W smart rotary dimmer module',
|
|
147
|
+
exposes: [...extend.light_onoff_brightness({noConfigure: true}).exposes,
|
|
148
|
+
exposes.binary('backlight_led', ea.STATE_SET, 'ON', 'OFF').withDescription('Enable or disable the blue backlight LED')],
|
|
149
|
+
toZigbee: [...extend.light_onoff_brightness({noConfigure: true}).toZigbee, tzLocal.aOneBacklight],
|
|
132
150
|
extend: extend.light_onoff_brightness({noConfigure: true}),
|
|
133
151
|
configure: async (device, coordinatorEndpoint, logger) => {
|
|
134
152
|
await extend.light_onoff_brightness().configure(device, coordinatorEndpoint, logger);
|
package/devices/awox.js
CHANGED
|
@@ -1,4 +1,64 @@
|
|
|
1
1
|
const extend = require('../lib/extend');
|
|
2
|
+
const fz = require('../converters/fromZigbee');
|
|
3
|
+
const exposes = require('../lib/exposes');
|
|
4
|
+
const e = exposes.presets;
|
|
5
|
+
|
|
6
|
+
const awoxRemoteHelper = {
|
|
7
|
+
convertToColorName: (buffer) => {
|
|
8
|
+
const commonForColors = buffer[0] === 17 && buffer[2] === 48 && buffer[3] === 0 && buffer[5] === 8 && buffer[6] === 0;
|
|
9
|
+
|
|
10
|
+
if (commonForColors && buffer[4] === 255) {
|
|
11
|
+
return 'red';
|
|
12
|
+
} else if (commonForColors && buffer[4] === 42) {
|
|
13
|
+
return 'yellow';
|
|
14
|
+
} else if (commonForColors && buffer[4] === 85) {
|
|
15
|
+
return 'green';
|
|
16
|
+
} else if (commonForColors && buffer[4] === 170) {
|
|
17
|
+
return 'blue';
|
|
18
|
+
}
|
|
19
|
+
return null;
|
|
20
|
+
},
|
|
21
|
+
isRefresh: (buffer) => {
|
|
22
|
+
return buffer[0] === 17 && buffer[2] === 16 && buffer[3] === 1 && buffer[4] === 1;
|
|
23
|
+
},
|
|
24
|
+
};
|
|
25
|
+
|
|
26
|
+
const fzLocal = {
|
|
27
|
+
colors: {
|
|
28
|
+
cluster: 'lightingColorCtrl',
|
|
29
|
+
type: ['raw'],
|
|
30
|
+
convert: (model, msg, publish, options, meta) => {
|
|
31
|
+
const color = awoxRemoteHelper.convertToColorName(msg.data);
|
|
32
|
+
if (color != null) {
|
|
33
|
+
return {
|
|
34
|
+
action: color,
|
|
35
|
+
};
|
|
36
|
+
}
|
|
37
|
+
},
|
|
38
|
+
},
|
|
39
|
+
refreshColored: {
|
|
40
|
+
cluster: 'lightingColorCtrl',
|
|
41
|
+
type: ['commandMoveHue'],
|
|
42
|
+
convert: (model, msg, publish, options, meta) => {
|
|
43
|
+
if (msg.data.movemode === 1 && msg.data.rate === 12) {
|
|
44
|
+
return {
|
|
45
|
+
action: 'refresh_colored',
|
|
46
|
+
};
|
|
47
|
+
}
|
|
48
|
+
},
|
|
49
|
+
},
|
|
50
|
+
refresh: {
|
|
51
|
+
cluster: 'genLevelCtrl',
|
|
52
|
+
type: ['raw'],
|
|
53
|
+
convert: (model, msg, publish, options, meta) => {
|
|
54
|
+
if (awoxRemoteHelper.isRefresh(msg.data)) {
|
|
55
|
+
return {
|
|
56
|
+
action: 'refresh',
|
|
57
|
+
};
|
|
58
|
+
}
|
|
59
|
+
},
|
|
60
|
+
},
|
|
61
|
+
};
|
|
2
62
|
|
|
3
63
|
module.exports = [
|
|
4
64
|
{
|
|
@@ -8,6 +68,23 @@ module.exports = [
|
|
|
8
68
|
description: 'LED white',
|
|
9
69
|
extend: extend.light_onoff_brightness(),
|
|
10
70
|
},
|
|
71
|
+
{
|
|
72
|
+
fingerprint: [
|
|
73
|
+
{type: 'Router', manufacturerName: 'AwoX', modelID: 'TLSR82xx', endpoints: [
|
|
74
|
+
{ID: 1, profileID: 260, deviceID: 2028, inputClusters: [0, 3, 4, 4096], outputClusters: [0, 3, 4, 5, 6, 8, 768, 4096]},
|
|
75
|
+
{ID: 3, profileID: 4751, deviceID: 2048, inputClusters: [65360, 65361], outputClusters: [65360, 65361]},
|
|
76
|
+
]},
|
|
77
|
+
],
|
|
78
|
+
model: '33952',
|
|
79
|
+
vendor: 'AwoX',
|
|
80
|
+
description: 'Remote controller',
|
|
81
|
+
fromZigbee: [fz.command_on, fzLocal.colors, fzLocal.refresh, fzLocal.refreshColored, fz.command_off,
|
|
82
|
+
fz.command_step, fz.command_move, fz.command_stop, fz.command_recall, fz.command_step_color_temperature],
|
|
83
|
+
toZigbee: [],
|
|
84
|
+
exposes: [e.action(['on', 'off', 'red', 'refresh', 'refresh_colored', 'blue', 'yellow',
|
|
85
|
+
'green', 'brightness_step_up', 'brightness_step_down', 'brightness_move_up', 'brightness_move_down', 'brightness_stop',
|
|
86
|
+
'recall_1', 'color_temperature_step_up', 'color_temperature_step_down'])],
|
|
87
|
+
},
|
|
11
88
|
{
|
|
12
89
|
fingerprint: [
|
|
13
90
|
{type: 'Router', manufacturerName: 'AwoX', modelID: 'TLSR82xx', endpoints: [
|
package/devices/enbrighten.js
CHANGED
|
@@ -15,6 +15,18 @@ module.exports = [
|
|
|
15
15
|
await reporting.onOff(endpoint);
|
|
16
16
|
},
|
|
17
17
|
},
|
|
18
|
+
{
|
|
19
|
+
zigbeeModel: ['43078'],
|
|
20
|
+
model: '43078',
|
|
21
|
+
vendor: 'Enbrighten',
|
|
22
|
+
description: 'Zigbee in-wall smart switch',
|
|
23
|
+
extend: extend.switch(),
|
|
24
|
+
configure: async (device, coordinatorEndpoint, logger) => {
|
|
25
|
+
const endpoint = device.getEndpoint(1);
|
|
26
|
+
await reporting.bind(endpoint, coordinatorEndpoint, ['genOnOff']);
|
|
27
|
+
await reporting.onOff(endpoint);
|
|
28
|
+
},
|
|
29
|
+
},
|
|
18
30
|
{
|
|
19
31
|
zigbeeModel: ['43080'],
|
|
20
32
|
model: '43080',
|
package/devices/hive.js
CHANGED
|
@@ -496,4 +496,18 @@ module.exports = [
|
|
|
496
496
|
},
|
|
497
497
|
exposes: [],
|
|
498
498
|
},
|
|
499
|
+
{
|
|
500
|
+
zigbeeModel: ['SLT6'],
|
|
501
|
+
model: 'SLT6',
|
|
502
|
+
vendor: 'Hive',
|
|
503
|
+
description: 'Heating thermostat remote control',
|
|
504
|
+
fromZigbee: [fz.battery],
|
|
505
|
+
toZigbee: [],
|
|
506
|
+
exposes: [e.battery()],
|
|
507
|
+
configure: async (device, coordinatorEndpoint, logger) => {
|
|
508
|
+
const endpoint = device.getEndpoint(9);
|
|
509
|
+
await reporting.bind(endpoint, coordinatorEndpoint, ['genPowerCfg']);
|
|
510
|
+
await reporting.batteryPercentageRemaining(endpoint);
|
|
511
|
+
},
|
|
512
|
+
},
|
|
499
513
|
];
|
package/devices/ikea.js
CHANGED
|
@@ -285,6 +285,13 @@ module.exports = [
|
|
|
285
285
|
description: 'TRADFRI LED bulb E27 1055 lumen, dimmable, white spectrum, opal white',
|
|
286
286
|
extend: tradfriExtend.light_onoff_brightness_colortemp(),
|
|
287
287
|
},
|
|
288
|
+
{
|
|
289
|
+
zigbeeModel: ['TRADFRIbulbE27WSglobeclear806lm'],
|
|
290
|
+
model: 'LED2004G8',
|
|
291
|
+
vendor: 'IKEA',
|
|
292
|
+
description: 'TRADFRI LED bulb E27 806 lumen, dimmable, white spectrum, clear',
|
|
293
|
+
extend: tradfriExtend.light_onoff_brightness_colortemp(),
|
|
294
|
+
},
|
|
288
295
|
{
|
|
289
296
|
zigbeeModel: ['TRADFRI bulb E27 opal 470lm', 'TRADFRI bulb E27 W opal 470lm', 'TRADFRIbulbT120E27WSopal470lm'],
|
|
290
297
|
model: 'LED1937T5_E27',
|
package/devices/lds.js
ADDED
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
const extend = require('../lib/extend');
|
|
2
|
+
|
|
3
|
+
module.exports = [
|
|
4
|
+
{
|
|
5
|
+
zigbeeModel: ['ZBT-RGBWLight-A0000'],
|
|
6
|
+
model: 'ZBT-RGBWLight-A0000',
|
|
7
|
+
vendor: 'LDS',
|
|
8
|
+
description: 'Ynoa smart LED E27',
|
|
9
|
+
extend: extend.light_onoff_brightness_colortemp_color({colorTempRange: [153, 555]}),
|
|
10
|
+
},
|
|
11
|
+
];
|
package/devices/legrand.js
CHANGED
|
@@ -313,7 +313,7 @@ module.exports = [
|
|
|
313
313
|
e.power().withAccess(ea.STATE_GET)],
|
|
314
314
|
configure: async (device, coordinatorEndpoint, logger) => {
|
|
315
315
|
const endpoint = device.getEndpoint(1);
|
|
316
|
-
await reporting.bind(endpoint, coordinatorEndpoint, ['genOnOff', 'haElectricalMeasurement',
|
|
316
|
+
await reporting.bind(endpoint, coordinatorEndpoint, ['genOnOff', 'haElectricalMeasurement', 'manuSpecificLegrandDevices2']);
|
|
317
317
|
await reporting.onOff(endpoint);
|
|
318
318
|
await reporting.readEletricalMeasurementMultiplierDivisors(endpoint);
|
|
319
319
|
await reporting.activePower(endpoint);
|
package/devices/lixee.js
CHANGED
|
@@ -443,19 +443,21 @@ function getCurrentConfig(device, options, logger=console) {
|
|
|
443
443
|
.filter((e) => e.linkyMode == linkyMode && (e.linkyPhase == linkyPhase || e.linkyPhase == linkyPhaseDef.all) && (linkyProduction || !e.onlyProducer));
|
|
444
444
|
|
|
445
445
|
// Filter even more, based on our current tarif
|
|
446
|
-
let currentTarf;
|
|
446
|
+
let currentTarf = '';
|
|
447
447
|
|
|
448
|
-
|
|
449
|
-
|
|
450
|
-
|
|
451
|
-
|
|
452
|
-
|
|
453
|
-
|
|
454
|
-
currentTarf =
|
|
448
|
+
if (options && options.hasOwnProperty('tarif') && options['tarif'] != 'auto') {
|
|
449
|
+
currentTarf = Object.entries(tarifsDef).find(( [k, v] ) => (v.fname == options['tarif']))[1].currentTarf;
|
|
450
|
+
} else {
|
|
451
|
+
try {
|
|
452
|
+
const lixAtts = endpoint.clusters[clustersDef._0xFF66].attributes;
|
|
453
|
+
lixAtts.raiseIfEmpty;
|
|
454
|
+
currentTarf = fzLocal.lixee_private_fz.convert({}, {data: lixAtts}).current_tarif;
|
|
455
|
+
} catch (error) {
|
|
456
|
+
logger.warn(`Not able to detect the current tarif. Not filtering any expose...`);
|
|
455
457
|
}
|
|
456
458
|
}
|
|
457
459
|
|
|
458
|
-
|
|
460
|
+
logger.debug(`zlinky config: ` + linkyMode + `, `+ linkyPhase + `, `+ linkyProduction.toString() +`, `+ currentTarf);
|
|
459
461
|
|
|
460
462
|
switch (currentTarf) {
|
|
461
463
|
case linkyMode == linkyModeDef.legacy && tarifsDef.histo_BASE.currentTarf:
|
|
@@ -481,7 +483,7 @@ function getCurrentConfig(device, options, logger=console) {
|
|
|
481
483
|
return myExpose;
|
|
482
484
|
}
|
|
483
485
|
const definition = {
|
|
484
|
-
zigbeeModel: ['ZLinky_TIC'],
|
|
486
|
+
zigbeeModel: ['ZLinky_TIC', 'ZLinky_TIC\u0000'],
|
|
485
487
|
model: 'ZLinky_TIC',
|
|
486
488
|
vendor: 'LiXee',
|
|
487
489
|
description: 'Lixee ZLinky',
|
|
@@ -525,13 +527,15 @@ const definition = {
|
|
|
525
527
|
clustersDef._0xFF66, /* liXeePrivate */
|
|
526
528
|
]);
|
|
527
529
|
|
|
530
|
+
await endpoint.read('liXeePrivate', ['linkyMode', 'currentTarif'], {manufacturerCode: null});
|
|
531
|
+
|
|
528
532
|
const configReportings = [];
|
|
529
533
|
const suscribeNew = getCurrentConfig(device, options, logger).filter((e) => e.reportable);
|
|
530
534
|
|
|
531
535
|
const unsuscribe = endpoint.configuredReportings
|
|
532
536
|
.filter((e) => !suscribeNew.some((r) => e.cluster.name == r.cluster && e.attribute.name == r.att));
|
|
533
537
|
// Unsuscribe reports that doesn't correspond with the current config
|
|
534
|
-
(await Promise.allSettled(unsuscribe.map((e) => endpoint.configureReporting(e.cluster.name, reporting.payload(e.attribute.name, e.minimumReportInterval, 65535, e.reportableChange)))))
|
|
538
|
+
(await Promise.allSettled(unsuscribe.map((e) => endpoint.configureReporting(e.cluster.name, reporting.payload(e.attribute.name, e.minimumReportInterval, 65535, e.reportableChange), {manufacturerCode: null}))))
|
|
535
539
|
.filter((e) => e.status == 'rejected')
|
|
536
540
|
.forEach((e) => {
|
|
537
541
|
throw e.reason;
|
|
@@ -550,7 +554,8 @@ const definition = {
|
|
|
550
554
|
}
|
|
551
555
|
configReportings.push(endpoint
|
|
552
556
|
.configureReporting(
|
|
553
|
-
e.cluster, reporting.payload(params.att, params.min, params.max, params.change)
|
|
557
|
+
e.cluster, reporting.payload(params.att, params.min, params.max, params.change),
|
|
558
|
+
{manufacturerCode: null}),
|
|
554
559
|
);
|
|
555
560
|
}
|
|
556
561
|
(await Promise.allSettled(configReportings))
|
|
@@ -573,8 +578,7 @@ const definition = {
|
|
|
573
578
|
.filter((e) => !endpoint.configuredReportings.some((r) => r.cluster.name == e.cluster && r.attribute.name == e.att));
|
|
574
579
|
for (const e of currentExposes) {
|
|
575
580
|
await endpoint
|
|
576
|
-
.read(e.cluster, [e.att])
|
|
577
|
-
.catch((err) => { }); // TODO: Ignore reads error?
|
|
581
|
+
.read(e.cluster, [e.att], {manufacturerCode: null});
|
|
578
582
|
}
|
|
579
583
|
}, seconds * 1000);
|
|
580
584
|
globalStore.putValue(device, 'interval', interval);
|
package/devices/meazon.js
CHANGED
|
@@ -13,7 +13,7 @@ module.exports = [
|
|
|
13
13
|
vendor: 'Meazon',
|
|
14
14
|
description: 'Bizy plug meter',
|
|
15
15
|
fromZigbee: [fz.command_on, fz.legacy.genOnOff_cmdOn, fz.command_off, fz.legacy.genOnOff_cmdOff, fz.on_off, fz.meazon_meter],
|
|
16
|
-
exposes: [e.switch(), e.power(), e.voltage(), e.current()],
|
|
16
|
+
exposes: [e.switch(), e.power(), e.voltage(), e.current(), e.energy()],
|
|
17
17
|
toZigbee: [tz.on_off],
|
|
18
18
|
configure: async (device, coordinatorEndpoint, logger) => {
|
|
19
19
|
const endpoint = device.getEndpoint(10);
|
package/devices/miboxer.js
CHANGED
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
const exposes = require('../lib/exposes');
|
|
2
|
-
const fz = {...require('../converters/fromZigbee'), legacy: require('../lib/legacy').fromZigbee};
|
|
3
2
|
const tz = require('../converters/toZigbee');
|
|
4
3
|
const e = exposes.presets;
|
|
5
4
|
const ea = exposes.access;
|
|
@@ -12,8 +11,11 @@ module.exports = [
|
|
|
12
11
|
model: 'FUT039Z',
|
|
13
12
|
vendor: 'Miboxer',
|
|
14
13
|
description: 'RGB+CCT LED controller',
|
|
15
|
-
toZigbee:
|
|
16
|
-
|
|
14
|
+
toZigbee: extend.light_onoff_brightness_colortemp_color().toZigbee.concat([
|
|
15
|
+
tz.tuya_do_not_disturb, tz.tuya_color_power_on_behavior,
|
|
16
|
+
]),
|
|
17
|
+
meta: {applyRedFix: true, enhancedHue: false},
|
|
18
|
+
fromZigbee: extend.light_onoff_brightness_colortemp_color().fromZigbee,
|
|
17
19
|
exposes: [e.light_brightness_colortemp_colorhs([153, 500]).removeFeature('color_temp_startup'),
|
|
18
20
|
exposes.binary('do_not_disturb', ea.STATE_SET, true, false)
|
|
19
21
|
.withDescription('Do not disturb mode'),
|
|
@@ -31,7 +33,8 @@ module.exports = [
|
|
|
31
33
|
onEvent: tuya.onEventSetTime,
|
|
32
34
|
},
|
|
33
35
|
{
|
|
34
|
-
fingerprint: [{modelID: 'TS0502B', manufacturerName: '_TZ3210_frm6149r'}
|
|
36
|
+
fingerprint: [{modelID: 'TS0502B', manufacturerName: '_TZ3210_frm6149r'},
|
|
37
|
+
{modelID: 'TS0502B', manufacturerName: '_TZ3210_jtifm80b'}],
|
|
35
38
|
model: 'FUT035Z',
|
|
36
39
|
description: 'Dual white LED controller',
|
|
37
40
|
vendor: 'Miboxer',
|
|
@@ -45,7 +45,7 @@ module.exports = [
|
|
|
45
45
|
},
|
|
46
46
|
{
|
|
47
47
|
zigbeeModel: ['ZBT-ExtendedColor'],
|
|
48
|
-
model: '404000/404005/404012',
|
|
48
|
+
model: '404000/404005/404012/404019',
|
|
49
49
|
vendor: 'Müller Licht',
|
|
50
50
|
description: 'Tint LED bulb GU10/E14/E27 350/470/806 lumen, dimmable, color, opal white',
|
|
51
51
|
extend: extend.light_onoff_brightness_colortemp_color({colorTempRange: [153, 556], supportsHS: true}),
|
package/devices/nous.js
CHANGED
|
@@ -16,6 +16,31 @@ module.exports = [
|
|
|
16
16
|
toZigbee: [],
|
|
17
17
|
exposes: [e.temperature(), e.humidity(), e.battery()],
|
|
18
18
|
},
|
|
19
|
+
{
|
|
20
|
+
fingerprint: [{modelID: 'TS0601', manufacturerName: '_TZE200_lve3dvpy'}],
|
|
21
|
+
model: 'SZ-T04',
|
|
22
|
+
vendor: 'Nous',
|
|
23
|
+
description: 'Temperature and humidity sensor with clock',
|
|
24
|
+
fromZigbee: [fz.nous_lcd_temperature_humidity_sensor, fz.ignore_tuya_set_time],
|
|
25
|
+
toZigbee: [tz.nous_lcd_temperature_humidity_sensor],
|
|
26
|
+
onEvent: tuya.onEventSetLocalTime,
|
|
27
|
+
configure: async (device, coordinatorEndpoint, logger) => {
|
|
28
|
+
const endpoint = device.getEndpoint(1);
|
|
29
|
+
await reporting.bind(endpoint, coordinatorEndpoint, ['genBasic']);
|
|
30
|
+
},
|
|
31
|
+
exposes: [
|
|
32
|
+
e.temperature(), e.humidity(), e.battery(),
|
|
33
|
+
exposes.enum('temperature_unit_convert', ea.STATE_SET, ['celsius', 'fahrenheit']).withDescription('Current display unit'),
|
|
34
|
+
exposes.enum('temperature_alarm', ea.STATE, ['canceled', 'lower_alarm', 'upper_alarm'])
|
|
35
|
+
.withDescription('Temperature alarm status'),
|
|
36
|
+
exposes.numeric('max_temperature', ea.STATE_SET).withUnit('°C').withValueMin(-20).withValueMax(60)
|
|
37
|
+
.withDescription('Alarm temperature max'),
|
|
38
|
+
exposes.numeric('min_temperature', ea.STATE_SET).withUnit('°C').withValueMin(-20).withValueMax(60)
|
|
39
|
+
.withDescription('Alarm temperature min'),
|
|
40
|
+
exposes.numeric('temperature_sensitivity', ea.STATE_SET).withUnit('°C').withValueMin(0.1).withValueMax(50).withValueStep(0.1)
|
|
41
|
+
.withDescription('Temperature sensitivity'),
|
|
42
|
+
],
|
|
43
|
+
},
|
|
19
44
|
{
|
|
20
45
|
fingerprint: [{modelID: 'TS0601', manufacturerName: '_TZE200_nnrfa68v'}],
|
|
21
46
|
model: 'E6',
|
package/devices/paulmann.js
CHANGED
|
@@ -88,6 +88,13 @@ module.exports = [
|
|
|
88
88
|
description: 'Amaris LED panels',
|
|
89
89
|
extend: extend.light_onoff_brightness_colortemp_color(),
|
|
90
90
|
},
|
|
91
|
+
{
|
|
92
|
+
zigbeeModel: ['371232040'],
|
|
93
|
+
model: '371232040',
|
|
94
|
+
vendor: 'Paulmann',
|
|
95
|
+
description: 'LED panels',
|
|
96
|
+
extend: extend.light_onoff_brightness_colortemp_color({colorTempRange: [153, 350]}),
|
|
97
|
+
},
|
|
91
98
|
{
|
|
92
99
|
zigbeeModel: ['500.45'],
|
|
93
100
|
model: '500.45',
|
package/devices/philips.js
CHANGED
|
@@ -2465,7 +2465,7 @@ module.exports = [
|
|
|
2465
2465
|
ota: ota.zigbeeOTA,
|
|
2466
2466
|
},
|
|
2467
2467
|
{
|
|
2468
|
-
zigbeeModel: ['5309230P6', '5309231P6'],
|
|
2468
|
+
zigbeeModel: ['5309230P6', '5309231P6', '929003045701_01', '929003045701_02'],
|
|
2469
2469
|
model: '5309230P6',
|
|
2470
2470
|
vendor: 'Philips',
|
|
2471
2471
|
description: 'Hue White ambiance Runner double spotlight',
|
package/devices/profalux.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
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
|
const ea = exposes.access;
|
|
7
7
|
|
package/devices/slv.js
ADDED
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
const extend = require('../lib/extend');
|
|
2
|
+
|
|
3
|
+
module.exports = [
|
|
4
|
+
{
|
|
5
|
+
zigbeeModel: ['1001248', 'ZBT-ColorTemperature-Panel'],
|
|
6
|
+
model: '1001248',
|
|
7
|
+
vendor: 'SLV',
|
|
8
|
+
description: 'VALETO CCT LED driver',
|
|
9
|
+
extend: extend.light_onoff_brightness_colortemp({colorTempRange: [153, 370]}),
|
|
10
|
+
},
|
|
11
|
+
{
|
|
12
|
+
zigbeeModel: ['1002994'],
|
|
13
|
+
model: '1002994',
|
|
14
|
+
vendor: 'SLV',
|
|
15
|
+
description: 'VALETO remote (binds to device)',
|
|
16
|
+
fromZigbee: [],
|
|
17
|
+
toZigbee: [],
|
|
18
|
+
exposes: [],
|
|
19
|
+
},
|
|
20
|
+
];
|
package/devices/sonoff.js
CHANGED
|
@@ -78,7 +78,7 @@ module.exports = [
|
|
|
78
78
|
vendor: 'SONOFF',
|
|
79
79
|
whiteLabel: [{vendor: 'eWeLink', model: 'RHK07'}],
|
|
80
80
|
description: 'Wireless button',
|
|
81
|
-
exposes: [e.battery(), e.action(['single', 'double', 'long'])],
|
|
81
|
+
exposes: [e.battery(), e.action(['single', 'double', 'long']), e.battery_voltage()],
|
|
82
82
|
fromZigbee: [fz.ewelink_action, fz.battery],
|
|
83
83
|
toZigbee: [],
|
|
84
84
|
configure: async (device, coordinatorEndpoint, logger) => {
|
|
@@ -144,7 +144,7 @@ module.exports = [
|
|
|
144
144
|
await reporting.batteryVoltage(endpoint);
|
|
145
145
|
await reporting.batteryPercentageRemaining(endpoint);
|
|
146
146
|
},
|
|
147
|
-
exposes: [e.occupancy(), e.battery_low(), e.tamper(), e.battery()],
|
|
147
|
+
exposes: [e.occupancy(), e.battery_low(), e.tamper(), e.battery(), e.battery_voltage()],
|
|
148
148
|
},
|
|
149
149
|
{
|
|
150
150
|
zigbeeModel: ['S26R2ZB'],
|
|
@@ -36,4 +36,11 @@ module.exports = [
|
|
|
36
36
|
await reporting.onOff(endpoint);
|
|
37
37
|
},
|
|
38
38
|
},
|
|
39
|
+
{
|
|
40
|
+
zigbeeModel: ['S32053'],
|
|
41
|
+
model: 'S32053',
|
|
42
|
+
vendor: 'The Light Group',
|
|
43
|
+
description: 'SLC SmartOne CV led dimmable driver',
|
|
44
|
+
extend: extend.light_onoff_brightness(),
|
|
45
|
+
},
|
|
39
46
|
];
|