zigbee-herdsman-converters 14.0.419 → 14.0.423
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 +36 -3
- package/converters/toZigbee.js +19 -5
- 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/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 +34 -0
- package/devices/slv.js +20 -0
- package/devices/tuya.js +25 -3
- package/devices/xiaomi.js +9 -2
- package/lib/exposes.js +1 -0
- package/lib/tuya.js +3 -0
- package/npm-shrinkwrap.json +963 -896
- package/package.json +2 -2
package/converters/fromZigbee.js
CHANGED
|
@@ -4141,6 +4141,25 @@ const converters = {
|
|
|
4141
4141
|
}
|
|
4142
4142
|
},
|
|
4143
4143
|
},
|
|
4144
|
+
tuya_CO: {
|
|
4145
|
+
cluster: 'manuSpecificTuya',
|
|
4146
|
+
type: ['commandDataReport', 'commandDataResponse'],
|
|
4147
|
+
options: [exposes.options.precision('co'), exposes.options.calibration('co')],
|
|
4148
|
+
convert: (model, msg, publish, options, meta) => {
|
|
4149
|
+
const dpValue = tuya.firstDpValue(msg, meta, 'tuya_CO');
|
|
4150
|
+
const dp = dpValue.dp;
|
|
4151
|
+
const value = tuya.getDataValue(dpValue);
|
|
4152
|
+
switch (dp) {
|
|
4153
|
+
case tuya.dataPoints.tuyaSabCO:
|
|
4154
|
+
return {co: calibrateAndPrecisionRoundOptions(value / 100, options, 'co')};
|
|
4155
|
+
case tuya.dataPoints.tuyaSabCOalarm:
|
|
4156
|
+
return {carbon_monoxide: value ? 'OFF' : 'ON'};
|
|
4157
|
+
default:
|
|
4158
|
+
meta.logger.warn(`zigbee-herdsman-converters:TuyaSmartAirBox: Unrecognized DP #${
|
|
4159
|
+
dp} with data ${JSON.stringify(dpValue)}`);
|
|
4160
|
+
}
|
|
4161
|
+
},
|
|
4162
|
+
},
|
|
4144
4163
|
saswell_thermostat: {
|
|
4145
4164
|
cluster: 'manuSpecificTuya',
|
|
4146
4165
|
type: ['commandDataResponse', 'commandDataReport'],
|
|
@@ -4434,7 +4453,7 @@ const converters = {
|
|
|
4434
4453
|
case tuya.dataPoints.ecoTemp:
|
|
4435
4454
|
return {eco_temperature: value};
|
|
4436
4455
|
case tuya.dataPoints.valvePos:
|
|
4437
|
-
return {position: value};
|
|
4456
|
+
return {position: value, running_state: value ? 'heat' : 'idle'};
|
|
4438
4457
|
case tuya.dataPoints.awayTemp:
|
|
4439
4458
|
return {away_preset_temperature: value};
|
|
4440
4459
|
case tuya.dataPoints.awayDays:
|
|
@@ -5106,7 +5125,7 @@ const converters = {
|
|
|
5106
5125
|
},
|
|
5107
5126
|
},
|
|
5108
5127
|
legrand_cable_outlet_mode: {
|
|
5109
|
-
cluster: '
|
|
5128
|
+
cluster: 'manuSpecificLegrandDevices2',
|
|
5110
5129
|
type: ['readResponse'],
|
|
5111
5130
|
convert: (model, msg, publish, options, meta) => {
|
|
5112
5131
|
const payload = {};
|
|
@@ -8150,7 +8169,7 @@ const converters = {
|
|
|
8150
8169
|
1: 'on',
|
|
8151
8170
|
2: 'previous',
|
|
8152
8171
|
};
|
|
8153
|
-
result.
|
|
8172
|
+
result.power_on_behavior = lookup[value];
|
|
8154
8173
|
}
|
|
8155
8174
|
if (dp === tuya.dataPoints.hochFaultCode) {
|
|
8156
8175
|
const lookup = {
|
|
@@ -8410,6 +8429,20 @@ const converters = {
|
|
|
8410
8429
|
}
|
|
8411
8430
|
},
|
|
8412
8431
|
},
|
|
8432
|
+
tm081: {
|
|
8433
|
+
cluster: 'manuSpecificTuya',
|
|
8434
|
+
type: ['commandDataReport'],
|
|
8435
|
+
convert: (model, msg, publish, options, meta) => {
|
|
8436
|
+
const dpValue = tuya.firstDpValue(msg, meta, 'tm0801');
|
|
8437
|
+
const dp = dpValue.dp;
|
|
8438
|
+
const value = tuya.getDataValue(dpValue);
|
|
8439
|
+
if (dp === 1) return {contact: value === true ? false : true};
|
|
8440
|
+
if (dp === 2) return {battery: value};
|
|
8441
|
+
else {
|
|
8442
|
+
meta.logger.warn(`zigbee-herdsman-converters:TM081: NOT RECOGNIZED DP #${dp} with data ${JSON.stringify(dpValue)}`);
|
|
8443
|
+
}
|
|
8444
|
+
},
|
|
8445
|
+
},
|
|
8413
8446
|
// #endregion
|
|
8414
8447
|
|
|
8415
8448
|
// #region Ignore converters (these message dont need parsing).
|
package/converters/toZigbee.js
CHANGED
|
@@ -299,6 +299,10 @@ const converters = {
|
|
|
299
299
|
convertSet: async (entity, key, value, meta) => {
|
|
300
300
|
if (typeof value !== 'number') {
|
|
301
301
|
value = value.toLowerCase();
|
|
302
|
+
if (value === 'stop') {
|
|
303
|
+
await entity.command('genLevelCtrl', 'stop', {}, utils.getOptions(meta.mapped, entity));
|
|
304
|
+
return;
|
|
305
|
+
}
|
|
302
306
|
const lookup = {'open': 100, 'close': 0};
|
|
303
307
|
utils.validateValue(value, Object.keys(lookup));
|
|
304
308
|
value = lookup[value];
|
|
@@ -4573,10 +4577,20 @@ const converters = {
|
|
|
4573
4577
|
legrand_cableOutletMode: {
|
|
4574
4578
|
key: ['cable_outlet_mode'],
|
|
4575
4579
|
convertSet: async (entity, key, value, meta) => {
|
|
4576
|
-
|
|
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}};
|
|
4577
4591
|
},
|
|
4578
4592
|
convertGet: async (entity, key, meta) => {
|
|
4579
|
-
await entity.read(
|
|
4593
|
+
await entity.read('manuSpecificLegrandDevices2', [0x0000], manufacturerOptions.legrand);
|
|
4580
4594
|
},
|
|
4581
4595
|
},
|
|
4582
4596
|
legrand_powerAlarm: {
|
|
@@ -7002,7 +7016,7 @@ const converters = {
|
|
|
7002
7016
|
key: ['state',
|
|
7003
7017
|
'child_lock',
|
|
7004
7018
|
'countdown_timer',
|
|
7005
|
-
'
|
|
7019
|
+
'power_on_behavior',
|
|
7006
7020
|
'trip',
|
|
7007
7021
|
'clear_device_data',
|
|
7008
7022
|
/* TODO: Add the below keys when toZigbee converter work has been completed
|
|
@@ -7021,10 +7035,10 @@ const converters = {
|
|
|
7021
7035
|
} else if (key === 'countdown_timer') {
|
|
7022
7036
|
await tuya.sendDataPointValue(entity, tuya.dataPoints.hochCountdownTimer, value);
|
|
7023
7037
|
return {state: {countdown_timer: value}};
|
|
7024
|
-
} else if (key === '
|
|
7038
|
+
} else if (key === 'power_on_behavior') {
|
|
7025
7039
|
const lookup = {'off': 0, 'on': 1, 'previous': 2};
|
|
7026
7040
|
await tuya.sendDataPointEnum(entity, tuya.dataPoints.hochRelayStatus, lookup[value], 'sendData');
|
|
7027
|
-
return {state: {
|
|
7041
|
+
return {state: {power_on_behavior: value}};
|
|
7028
7042
|
} else if (key === 'trip') {
|
|
7029
7043
|
if (value === 'clear') {
|
|
7030
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('zigbee-herdsman-converters/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);
|
|
@@ -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',
|
|
@@ -0,0 +1,34 @@
|
|
|
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
|
+
const e = exposes.presets;
|
|
6
|
+
const ea = exposes.access;
|
|
7
|
+
|
|
8
|
+
module.exports = [
|
|
9
|
+
{
|
|
10
|
+
fingerprint: [{manufId: 4368, endpoints: [{ID: 1, profileID: 260, deviceID: 513, inputClusters: [0, 3, 21],
|
|
11
|
+
outputClusters: [3, 4, 5, 6, 8, 256, 64544, 64545]}]}],
|
|
12
|
+
model: 'NB102',
|
|
13
|
+
vendor: 'Profalux',
|
|
14
|
+
description: 'Cover remote',
|
|
15
|
+
fromZigbee: [],
|
|
16
|
+
toZigbee: [],
|
|
17
|
+
exposes: [],
|
|
18
|
+
},
|
|
19
|
+
{
|
|
20
|
+
fingerprint: [{manufId: 4368, endpoints: [{ID: 1, profileID: 260, deviceID: 512,
|
|
21
|
+
inputClusters: [0, 3, 4, 5, 6, 8, 10, 21, 256, 64544, 64545], outputClusters: [3, 64544]}]}],
|
|
22
|
+
model: 'NSAV061',
|
|
23
|
+
vendor: 'Profalux',
|
|
24
|
+
description: 'Cover',
|
|
25
|
+
fromZigbee: [fz.cover_position_via_brightness, fz.cover_state_via_onoff],
|
|
26
|
+
toZigbee: [tz.cover_via_brightness],
|
|
27
|
+
exposes: [e.cover_position().setAccess('state', ea.ALL)],
|
|
28
|
+
configure: async (device, coordinatorEndpoint, logger) => {
|
|
29
|
+
const endpoint = device.getEndpoint(1);
|
|
30
|
+
await reporting.bind(endpoint, coordinatorEndpoint, ['genLevelCtrl']);
|
|
31
|
+
await reporting.brightness(endpoint);
|
|
32
|
+
},
|
|
33
|
+
},
|
|
34
|
+
];
|
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/tuya.js
CHANGED
|
@@ -98,6 +98,15 @@ module.exports = [
|
|
|
98
98
|
toZigbee: [],
|
|
99
99
|
exposes: [e.temperature(), e.humidity(), e.co2(), e.voc(), e.formaldehyd(), e.pm25()],
|
|
100
100
|
},
|
|
101
|
+
{
|
|
102
|
+
fingerprint: [{modelID: 'TS0601', manufacturerName: '_TZE200_7bztmfm1'}],
|
|
103
|
+
model: 'TS0601_smart_CO_air_box',
|
|
104
|
+
vendor: 'TuYa',
|
|
105
|
+
description: 'Smart air box (carbon monoxide)',
|
|
106
|
+
fromZigbee: [fz.tuya_CO],
|
|
107
|
+
toZigbee: [],
|
|
108
|
+
exposes: [e.carbon_monoxide(), e.co()],
|
|
109
|
+
},
|
|
101
110
|
{
|
|
102
111
|
fingerprint: [{modelID: 'TS0601', manufacturerName: '_TZE200_ggev5fsl'}],
|
|
103
112
|
model: 'TS0601_gas_sensor',
|
|
@@ -110,7 +119,8 @@ module.exports = [
|
|
|
110
119
|
{
|
|
111
120
|
fingerprint: [{modelID: 'TS0001', manufacturerName: '_TZ3000_hktqahrq'}, {manufacturerName: '_TZ3000_hktqahrq'},
|
|
112
121
|
{manufacturerName: '_TZ3000_q6a3tepg'}, {modelID: 'TS000F', manufacturerName: '_TZ3000_m9af2l6g'},
|
|
113
|
-
{modelID: 'TS0001', manufacturerName: '_TZ3000_npzfdcof'}
|
|
122
|
+
{modelID: 'TS0001', manufacturerName: '_TZ3000_npzfdcof'},
|
|
123
|
+
{modelID: 'TS0001', manufacturerName: '_TZ3000_v7gnj3ad'}],
|
|
114
124
|
model: 'WHD02',
|
|
115
125
|
vendor: 'TuYa',
|
|
116
126
|
description: 'Wall switch module',
|
|
@@ -331,6 +341,7 @@ module.exports = [
|
|
|
331
341
|
{modelID: 'TS0601', manufacturerName: '_TZE200_dfxkcots'},
|
|
332
342
|
{modelID: 'TS0601', manufacturerName: '_TZE200_ojzhk75b'},
|
|
333
343
|
{modelID: 'TS0601', manufacturerName: '_TZE200_swaamsoy'},
|
|
344
|
+
{modelID: 'TS0601', manufacturerName: '_TZE200_3p5ydos3'},
|
|
334
345
|
],
|
|
335
346
|
model: 'TS0601_dimmer',
|
|
336
347
|
vendor: 'TuYa',
|
|
@@ -410,6 +421,7 @@ module.exports = [
|
|
|
410
421
|
{modelID: 'TS0601', manufacturerName: '_TZE200_vhy3iakz'},
|
|
411
422
|
{modelID: 'TS0601', manufacturerName: '_TZE200_oisqyl4o'},
|
|
412
423
|
{modelID: 'TS0601', manufacturerName: '_TZ3000_uim07oem'},
|
|
424
|
+
{modelID: 'TS0601', manufacturerName: '_TZE200_js3mgbjb'},
|
|
413
425
|
],
|
|
414
426
|
model: 'TS0601_switch',
|
|
415
427
|
vendor: 'TuYa',
|
|
@@ -961,7 +973,8 @@ module.exports = [
|
|
|
961
973
|
'to the desired temperature. If you want TRV to properly regulate the temperature you need to use mode `auto` ' +
|
|
962
974
|
'instead setting the desired temperature.')
|
|
963
975
|
.withLocalTemperatureCalibration(-9, 9, 1, ea.STATE_SET)
|
|
964
|
-
.withAwayMode().withPreset(['schedule', 'manual', 'boost', 'complex', 'comfort', 'eco'])
|
|
976
|
+
.withAwayMode().withPreset(['schedule', 'manual', 'boost', 'complex', 'comfort', 'eco'])
|
|
977
|
+
.withRunningState(['idle', 'heat'], ea.STATE),
|
|
965
978
|
e.auto_lock(), e.away_mode(), e.away_preset_days(), e.boost_time(), e.comfort_temperature(), e.eco_temperature(), e.force(),
|
|
966
979
|
e.max_temperature(), e.min_temperature(), e.away_preset_temperature(),
|
|
967
980
|
exposes.composite('programming_mode').withDescription('Schedule MODE ⏱ - In this mode, ' +
|
|
@@ -1894,7 +1907,7 @@ module.exports = [
|
|
|
1894
1907
|
exposes.text('alarm', ea.STATE),
|
|
1895
1908
|
exposes.binary('trip', ea.STATE_SET, 'trip', 'clear'),
|
|
1896
1909
|
exposes.binary('child_lock', ea.STATE_SET, 'ON', 'OFF'),
|
|
1897
|
-
exposes.enum('
|
|
1910
|
+
exposes.enum('power_on_behavior', ea.STATE_SET, ['off', 'on', 'previous']),
|
|
1898
1911
|
exposes.numeric('countdown_timer', ea.STATE_SET).withValueMin(0).withValueMax(86400).withUnit('s'),
|
|
1899
1912
|
exposes.numeric('voltage', ea.STATE).withUnit('V'),
|
|
1900
1913
|
exposes.numeric('voltage_rms', ea.STATE).withUnit('V'),
|
|
@@ -2005,4 +2018,13 @@ module.exports = [
|
|
|
2005
2018
|
toZigbee: [],
|
|
2006
2019
|
exposes: [e.illuminance_lux(), e.brightness_state()],
|
|
2007
2020
|
},
|
|
2021
|
+
{
|
|
2022
|
+
fingerprint: [{modelID: 'TS0601', manufacturerName: '_TZE200_kltffuzl'}, {modelID: 'TS0601', manufacturerName: '_TZE200_fwoorn8y'}],
|
|
2023
|
+
model: 'TM001-ZA/TM081',
|
|
2024
|
+
vendor: 'TuYa',
|
|
2025
|
+
description: 'Door and window sensor',
|
|
2026
|
+
fromZigbee: [fz.tm081],
|
|
2027
|
+
toZigbee: [],
|
|
2028
|
+
exposes: [e.contact(), e.battery()],
|
|
2029
|
+
},
|
|
2008
2030
|
];
|
package/devices/xiaomi.js
CHANGED
|
@@ -54,9 +54,15 @@ module.exports = [
|
|
|
54
54
|
model: 'MCCGQ13LM',
|
|
55
55
|
vendor: 'Xiaomi',
|
|
56
56
|
description: 'Aqara P1 door & window contact sensor',
|
|
57
|
-
fromZigbee: [fz.ias_contact_alarm_1, fz.aqara_opple],
|
|
57
|
+
fromZigbee: [fz. xiaomi_contact, fz.ias_contact_alarm_1, fz.aqara_opple, fz.battery],
|
|
58
58
|
toZigbee: [],
|
|
59
|
+
meta: {battery: {voltageToPercentage: '3V_2850_3200'}},
|
|
59
60
|
exposes: [e.contact(), e.battery(), e.battery_voltage()],
|
|
61
|
+
configure: async (device, coordinatorEndpoint, logger) => {
|
|
62
|
+
const endpoint = device.getEndpoint(1);
|
|
63
|
+
await reporting.bind(endpoint, coordinatorEndpoint, ['genPowerCfg']);
|
|
64
|
+
await reporting.batteryVoltage(endpoint);
|
|
65
|
+
},
|
|
60
66
|
},
|
|
61
67
|
{
|
|
62
68
|
zigbeeModel: ['lumi.dimmer.rcbac1'],
|
|
@@ -1472,7 +1478,8 @@ module.exports = [
|
|
|
1472
1478
|
// Ignore energy metering reports, rely on aqara_opple: https://github.com/Koenkk/zigbee2mqtt/issues/10709
|
|
1473
1479
|
fromZigbee: [fz.on_off, fz.device_temperature, fz.aqara_opple, fz.ignore_metering, fz.ignore_electrical_measurement,
|
|
1474
1480
|
fz.xiaomi_power],
|
|
1475
|
-
exposes: [e.switch(), e.energy(), e.power(), e.device_temperature(), e.power_outage_memory(), e.switch_type()
|
|
1481
|
+
exposes: [e.switch(), e.energy(), e.power(), e.device_temperature(), e.power_outage_memory(), e.switch_type(),
|
|
1482
|
+
e.voltage(), e.temperature(), e.current()],
|
|
1476
1483
|
toZigbee: [tz.xiaomi_switch_type, tz.on_off, tz.xiaomi_switch_power_outage_memory, tz.xiaomi_led_disabled_night],
|
|
1477
1484
|
configure: async (device, coordinatorEndpoint, logger) => {
|
|
1478
1485
|
const endpoint = device.getEndpoint(1);
|