zigbee-herdsman-converters 14.0.661 → 14.0.663
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/toZigbee.js +6 -0
- package/devices/akuvox.js +28 -0
- package/devices/dresden_elektronik.js +13 -0
- package/devices/hampton_bay.js +4 -0
- package/devices/innr.js +3 -1
- package/devices/inovelli.js +68 -23
- package/devices/ledvance.js +12 -1
- package/devices/leviton.js +25 -7
- package/devices/lidl.js +6 -4
- package/devices/miboxer.js +5 -2
- package/devices/moes.js +3 -2
- package/devices/nue_3a.js +2 -2
- package/devices/philips.js +10 -0
- package/devices/sinope.js +2 -2
- package/devices/stelpro.js +44 -0
- package/devices/tuya.js +26 -58
- package/lib/exposes.js +1 -1
- package/lib/tuya.js +20 -5
- package/package.json +1 -1
package/converters/toZigbee.js
CHANGED
|
@@ -3420,6 +3420,12 @@ const converters = {
|
|
|
3420
3420
|
return tuya.sendDataPointRaw(entity, tuya.dataPoints.moesSchedule, payload);
|
|
3421
3421
|
},
|
|
3422
3422
|
},
|
|
3423
|
+
moesS_thermostat_system_mode: {
|
|
3424
|
+
key: ['system_mode'],
|
|
3425
|
+
convertSet: async (entity, key, value, meta) => {
|
|
3426
|
+
return {state: {system_mode: 'heat'}};
|
|
3427
|
+
},
|
|
3428
|
+
},
|
|
3423
3429
|
moesS_thermostat_preset: {
|
|
3424
3430
|
key: ['preset'],
|
|
3425
3431
|
convertSet: async (entity, key, value, meta) => {
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
const exposes = require('../lib/exposes');
|
|
2
|
+
const fz = require('../converters/fromZigbee');
|
|
3
|
+
const reporting = require('../lib/reporting');
|
|
4
|
+
const e = exposes.presets;
|
|
5
|
+
|
|
6
|
+
module.exports = [
|
|
7
|
+
{
|
|
8
|
+
fingerprint: [{modelID: 'TS0201', manufacturerName: '_TYZB01_ujfk3xd9'}],
|
|
9
|
+
model: 'M423-9E',
|
|
10
|
+
vendor: 'Akuvox',
|
|
11
|
+
description: 'Smart temperature & humidity Sensor',
|
|
12
|
+
exposes: [e.battery(), e.temperature(), e.humidity()],
|
|
13
|
+
fromZigbee: [fz.temperature, fz.humidity, fz.battery],
|
|
14
|
+
toZigbee: [],
|
|
15
|
+
meta: {battery: {voltageToPercentage: '3V_2500'}},
|
|
16
|
+
configure: async (device, coordinatorEndpoint, logger) => {
|
|
17
|
+
const endpoint1 = device.getEndpoint(1);
|
|
18
|
+
await reporting.bind(endpoint1, coordinatorEndpoint, ['msTemperatureMeasurement', 'genPowerCfg']);
|
|
19
|
+
await endpoint1.read('genPowerCfg', ['batteryPercentageRemaining']);
|
|
20
|
+
const endpoint2 = device.getEndpoint(2);
|
|
21
|
+
await reporting.bind(endpoint2, coordinatorEndpoint, ['msRelativeHumidity']);
|
|
22
|
+
await reporting.temperature(endpoint1);
|
|
23
|
+
await reporting.humidity(endpoint2);
|
|
24
|
+
await reporting.batteryVoltage(endpoint1);
|
|
25
|
+
await reporting.batteryPercentageRemaining(endpoint1);
|
|
26
|
+
},
|
|
27
|
+
},
|
|
28
|
+
];
|
|
@@ -31,4 +31,17 @@ module.exports = [
|
|
|
31
31
|
extend: extend.light_onoff_brightness(),
|
|
32
32
|
ota: ota.zigbeeOTA,
|
|
33
33
|
},
|
|
34
|
+
{
|
|
35
|
+
zigbeeModel: ['FLS-A lp (1-10V)'],
|
|
36
|
+
model: 'BN-600078',
|
|
37
|
+
vendor: 'Dresden Elektronik',
|
|
38
|
+
description: 'Zigbee controller for 1-10V/PWM',
|
|
39
|
+
extend: extend.light_onoff_brightness(),
|
|
40
|
+
exposes: [e.light_brightness().withEndpoint('l1'), e.light_brightness().withEndpoint('l2'),
|
|
41
|
+
e.light_brightness().withEndpoint('l3'), e.light_brightness().withEndpoint('l4')],
|
|
42
|
+
endpoint: (device) => {
|
|
43
|
+
return {'l1': 11, 'l2': 12, 'l3': 13, 'l4': 14};
|
|
44
|
+
},
|
|
45
|
+
meta: {multiEndpoint: true, disableDefaultResponse: true},
|
|
46
|
+
},
|
|
34
47
|
];
|
package/devices/hampton_bay.js
CHANGED
|
@@ -21,6 +21,10 @@ module.exports = [
|
|
|
21
21
|
await reporting.onOff(endpoint);
|
|
22
22
|
await reporting.brightness(endpoint);
|
|
23
23
|
await reporting.fanMode(endpoint);
|
|
24
|
+
|
|
25
|
+
// Has Unknown power source, force it here.
|
|
26
|
+
device.powerSource = 'Mains (single phase)';
|
|
27
|
+
device.save();
|
|
24
28
|
},
|
|
25
29
|
},
|
|
26
30
|
{
|
package/devices/innr.js
CHANGED
|
@@ -1,10 +1,11 @@
|
|
|
1
1
|
const exposes = require('../lib/exposes');
|
|
2
|
-
const fz =
|
|
2
|
+
const fz = require('../converters/fromZigbee');
|
|
3
3
|
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
7
|
const ea = exposes.access;
|
|
8
|
+
const ota = require('../lib/ota');
|
|
8
9
|
|
|
9
10
|
module.exports = [
|
|
10
11
|
{
|
|
@@ -591,6 +592,7 @@ module.exports = [
|
|
|
591
592
|
// Gives UNSUPPORTED_ATTRIBUTE on reporting.readMeteringMultiplierDivisor.
|
|
592
593
|
endpoint.saveClusterAttributeKeyValue('seMetering', {multiplier: 1, divisor: 100});
|
|
593
594
|
},
|
|
595
|
+
ota: ota.zigbeeOTA,
|
|
594
596
|
exposes: [e.power(), e.current(), e.voltage().withAccess(ea.STATE), e.switch(), e.energy()],
|
|
595
597
|
},
|
|
596
598
|
{
|
package/devices/inovelli.js
CHANGED
|
@@ -25,25 +25,40 @@ const buttonLookup = {
|
|
|
25
25
|
};
|
|
26
26
|
|
|
27
27
|
const ledEffects = {
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
28
|
+
off: 0,
|
|
29
|
+
solid: 1,
|
|
30
|
+
fast_blink: 2,
|
|
31
|
+
slow_blink: 3,
|
|
32
|
+
pulse: 4,
|
|
33
|
+
chase: 5,
|
|
34
|
+
open_close: 6,
|
|
35
|
+
small_to_big: 7,
|
|
36
|
+
aurora: 8,
|
|
37
|
+
slow_falling: 9,
|
|
38
|
+
medium_falling: 10,
|
|
39
|
+
fast_falling: 11,
|
|
40
|
+
slow_rising: 12,
|
|
41
|
+
medium_rising: 13,
|
|
42
|
+
fast_rising: 14,
|
|
43
|
+
medium_blink: 15,
|
|
44
|
+
slow_chase: 16,
|
|
45
|
+
fast_chase: 17,
|
|
46
|
+
fast_siren: 18,
|
|
47
|
+
slow_siren: 19,
|
|
48
|
+
clear_effect: 255,
|
|
37
49
|
};
|
|
38
50
|
|
|
39
51
|
const individualLedEffects = {
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
52
|
+
off: 0,
|
|
53
|
+
solid: 1,
|
|
54
|
+
fast_blink: 2,
|
|
55
|
+
slow_blink: 3,
|
|
56
|
+
pulse: 4,
|
|
57
|
+
chase: 5,
|
|
58
|
+
falling: 6,
|
|
59
|
+
rising: 7,
|
|
60
|
+
aurora: 8,
|
|
61
|
+
clear_effect: 255,
|
|
47
62
|
};
|
|
48
63
|
|
|
49
64
|
const UINT8 = 32;
|
|
@@ -629,8 +644,20 @@ const ATTRIBUTES = {
|
|
|
629
644
|
dataType: BOOLEAN,
|
|
630
645
|
min: 0,
|
|
631
646
|
max: 1,
|
|
632
|
-
description:
|
|
633
|
-
|
|
647
|
+
description:
|
|
648
|
+
'In neutral on/off setups, the default is to have a clicking sound to notify you that the relay ' +
|
|
649
|
+
'is open or closed. You may disable this sound by creating a, “simulated” on/off where the switch ' +
|
|
650
|
+
'only will turn onto 100 or off to 0.',
|
|
651
|
+
values: {'Disabled (Click Sound On)': 0, 'Enabled (Click Sound Off)': 1},
|
|
652
|
+
displayType: 'enum',
|
|
653
|
+
},
|
|
654
|
+
doubleTapClearNotifications: {
|
|
655
|
+
ID: 262,
|
|
656
|
+
dataType: BOOLEAN,
|
|
657
|
+
min: 0,
|
|
658
|
+
max: 1,
|
|
659
|
+
description: 'Double-Tap the Config button to clear notifications.',
|
|
660
|
+
values: {'Enabled (Default)': 0, 'Disabled': 1},
|
|
634
661
|
displayType: 'enum',
|
|
635
662
|
},
|
|
636
663
|
};
|
|
@@ -656,12 +683,11 @@ tzLocal.inovelli_vzw31sn_parameters = {
|
|
|
656
683
|
manufacturerCode: INOVELLI,
|
|
657
684
|
});
|
|
658
685
|
|
|
686
|
+
meta.state[key] = value;
|
|
687
|
+
|
|
659
688
|
return {
|
|
660
689
|
state: {
|
|
661
|
-
[key]:
|
|
662
|
-
ATTRIBUTES[key].displayType === 'enum' ?
|
|
663
|
-
ATTRIBUTES[key].values[value] :
|
|
664
|
-
value,
|
|
690
|
+
[key]: value,
|
|
665
691
|
},
|
|
666
692
|
};
|
|
667
693
|
},
|
|
@@ -1057,12 +1083,24 @@ const exposesList = [
|
|
|
1057
1083
|
.enum('effect', ea.SET_STATE, [
|
|
1058
1084
|
'off',
|
|
1059
1085
|
'solid',
|
|
1060
|
-
'chase',
|
|
1061
1086
|
'fast_blink',
|
|
1062
1087
|
'slow_blink',
|
|
1063
1088
|
'pulse',
|
|
1089
|
+
'chase',
|
|
1064
1090
|
'open_close',
|
|
1065
1091
|
'small_to_big',
|
|
1092
|
+
'aurora',
|
|
1093
|
+
'slow_falling',
|
|
1094
|
+
'medium_falling',
|
|
1095
|
+
'fast_falling',
|
|
1096
|
+
'slow_rising',
|
|
1097
|
+
'medium_rising',
|
|
1098
|
+
'fast_rising',
|
|
1099
|
+
'medium_blink',
|
|
1100
|
+
'slow_chase',
|
|
1101
|
+
'fast_chase',
|
|
1102
|
+
'fast_siren',
|
|
1103
|
+
'slow_siren',
|
|
1066
1104
|
'clear_effect',
|
|
1067
1105
|
])
|
|
1068
1106
|
.withDescription('Animation Effect to use for the LEDs'),
|
|
@@ -1110,6 +1148,9 @@ const exposesList = [
|
|
|
1110
1148
|
'slow_blink',
|
|
1111
1149
|
'pulse',
|
|
1112
1150
|
'chase',
|
|
1151
|
+
'falling',
|
|
1152
|
+
'rising',
|
|
1153
|
+
'aurora',
|
|
1113
1154
|
'clear_effect',
|
|
1114
1155
|
])
|
|
1115
1156
|
.withDescription('Animation Effect to use for the LED'),
|
|
@@ -1247,7 +1288,11 @@ module.exports = [
|
|
|
1247
1288
|
await reporting.bind(endpoint, coordinatorEndpoint, [
|
|
1248
1289
|
'seMetering',
|
|
1249
1290
|
'haElectricalMeasurement',
|
|
1291
|
+
'genOnOff',
|
|
1292
|
+
'genLevelCtrl',
|
|
1250
1293
|
]);
|
|
1294
|
+
await reporting.onOff(endpoint);
|
|
1295
|
+
|
|
1251
1296
|
// Bind for Button Event Reporting
|
|
1252
1297
|
const endpoint2 = device.getEndpoint(2);
|
|
1253
1298
|
await reporting.bind(endpoint2, coordinatorEndpoint, [
|
package/devices/ledvance.js
CHANGED
|
@@ -21,6 +21,9 @@ module.exports = [
|
|
|
21
21
|
const endpoint = device.getEndpoint(1);
|
|
22
22
|
await reporting.bind(endpoint, coordinatorEndpoint, ['genOnOff']);
|
|
23
23
|
await reporting.onOff(endpoint);
|
|
24
|
+
// Has Unknown power source, force it here.
|
|
25
|
+
device.powerSource = 'Mains (single phase)';
|
|
26
|
+
device.save();
|
|
24
27
|
},
|
|
25
28
|
},
|
|
26
29
|
{
|
|
@@ -68,7 +71,7 @@ module.exports = [
|
|
|
68
71
|
model: 'AC33905',
|
|
69
72
|
vendor: 'LEDVANCE',
|
|
70
73
|
description: 'SMART+ spot GU10 tunable white',
|
|
71
|
-
extend: extend.ledvance.
|
|
74
|
+
extend: extend.ledvance.light_onoff_brightness_colortemp({colorTempRange: [153, 370]}),
|
|
72
75
|
ota: ota.ledvance,
|
|
73
76
|
},
|
|
74
77
|
{
|
|
@@ -87,6 +90,14 @@ module.exports = [
|
|
|
87
90
|
extend: extend.ledvance.light_onoff_brightness_colortemp({colorTempRange: [153, 370]}),
|
|
88
91
|
ota: ota.ledvance,
|
|
89
92
|
},
|
|
93
|
+
{
|
|
94
|
+
zigbeeModel: ['B40S TW'],
|
|
95
|
+
model: 'AC33901',
|
|
96
|
+
vendor: 'LEDVANCE',
|
|
97
|
+
description: 'SMART+ Classic B40 E14 Tunable white',
|
|
98
|
+
extend: extend.ledvance.light_onoff_brightness_colortemp({colorTempRange: [153, 370]}),
|
|
99
|
+
ota: ota.ledvance,
|
|
100
|
+
},
|
|
90
101
|
{
|
|
91
102
|
zigbeeModel: ['FLEX RGBW Z3'],
|
|
92
103
|
model: '4058075208339',
|
package/devices/leviton.js
CHANGED
|
@@ -3,9 +3,24 @@ const fz = {...require('../converters/fromZigbee'), legacy: require('../lib/lega
|
|
|
3
3
|
const tz = require('../converters/toZigbee');
|
|
4
4
|
const reporting = require('../lib/reporting');
|
|
5
5
|
const extend = require('../lib/extend');
|
|
6
|
+
const utils = require('../lib/utils');
|
|
6
7
|
const e = exposes.presets;
|
|
7
8
|
const ea = exposes.access;
|
|
8
9
|
|
|
10
|
+
const fzLocal = {
|
|
11
|
+
on_off_via_brightness: {
|
|
12
|
+
cluster: 'genLevelCtrl',
|
|
13
|
+
type: ['attributeReport', 'readResponse'],
|
|
14
|
+
convert: (model, msg, publish, options, meta) => {
|
|
15
|
+
if (msg.data.hasOwnProperty('currentLevel')) {
|
|
16
|
+
const currentLevel = Number(msg.data['currentLevel']);
|
|
17
|
+
const property = utils.postfixWithEndpointName('state', msg, model, meta);
|
|
18
|
+
return {[property]: currentLevel > 0 ? 'ON' : 'OFF'};
|
|
19
|
+
}
|
|
20
|
+
},
|
|
21
|
+
},
|
|
22
|
+
};
|
|
23
|
+
|
|
9
24
|
module.exports = [
|
|
10
25
|
{
|
|
11
26
|
zigbeeModel: ['DL15S'],
|
|
@@ -91,21 +106,24 @@ module.exports = [
|
|
|
91
106
|
model: 'ZS057-D0Z',
|
|
92
107
|
vendor: 'Leviton',
|
|
93
108
|
description: 'Wall switch, 0-10V dimmer, 120-277V, Lumina™ RF',
|
|
109
|
+
meta: {disableDefaultResponse: true},
|
|
94
110
|
extend: extend.light_onoff_brightness({disableEffect: true, noConfigure: true}),
|
|
95
|
-
fromZigbee: [fz.
|
|
96
|
-
toZigbee: [tz.light_onoff_brightness, tz.ballast_config
|
|
111
|
+
fromZigbee: [fz.on_off, fzLocal.on_off_via_brightness, fz.lighting_ballast_configuration],
|
|
112
|
+
toZigbee: [tz.light_onoff_brightness, tz.ballast_config],
|
|
97
113
|
exposes: [e.light_brightness(),
|
|
114
|
+
// Note: ballast_power_on_level used to be here, but it does't appear to work properly with this device
|
|
115
|
+
// If set, it's reset back to 0 when the device is turned off then back to 32 when turned on
|
|
98
116
|
exposes.numeric('ballast_minimum_level', ea.ALL).withValueMin(1).withValueMax(254)
|
|
99
117
|
.withDescription('Specifies the minimum brightness value'),
|
|
100
118
|
exposes.numeric('ballast_maximum_level', ea.ALL).withValueMin(1).withValueMax(254)
|
|
101
|
-
.withDescription('Specifies the maximum brightness value'),
|
|
102
|
-
exposes.numeric('ballast_power_on_level', ea.ALL).withValueMin(1).withValueMax(254)
|
|
103
|
-
.withDescription('Specifies the initialisation light level. Can not be set lower than "ballast_minimum_level"')],
|
|
119
|
+
.withDescription('Specifies the maximum brightness value')],
|
|
104
120
|
configure: async (device, coordinatorEndpoint, logger) => {
|
|
105
|
-
await extend.light_onoff_brightness().configure(device, coordinatorEndpoint, logger);
|
|
106
121
|
const endpoint = device.getEndpoint(1);
|
|
107
122
|
await reporting.bind(endpoint, coordinatorEndpoint, ['genOnOff', 'genLevelCtrl', 'lightingBallastCfg']);
|
|
108
|
-
|
|
123
|
+
// This device doesn't reliably report state changes - make it chatty to compensate for that
|
|
124
|
+
// This feels like a hack - hopefully there is a better fix at some point
|
|
125
|
+
await reporting.onOff(endpoint, {max: 5});
|
|
126
|
+
await reporting.brightness(endpoint, {max: 5});
|
|
109
127
|
},
|
|
110
128
|
},
|
|
111
129
|
];
|
package/devices/lidl.js
CHANGED
|
@@ -399,27 +399,29 @@ module.exports = [
|
|
|
399
399
|
model: 'HG08673-FR',
|
|
400
400
|
vendor: 'Lidl',
|
|
401
401
|
description: 'Silvercrest smart plug FR with power monitoring',
|
|
402
|
-
ota: ota.zigbeeOTA,
|
|
402
|
+
ota: ota.zigbeeOTA,
|
|
403
403
|
fromZigbee: [fz.on_off, fzLocal.electrical_measurement_skip_duplicate, fzLocal.metering_skip_duplicate, fz.ignore_basic_report,
|
|
404
404
|
fz.tuya_switch_power_outage_memory, fz.ts011f_plug_indicator_mode, fz.ts011f_plug_child_mode],
|
|
405
405
|
toZigbee: [tz.on_off, tz.tuya_switch_power_outage_memory, tz.ts011f_plug_indicator_mode, tz.ts011f_plug_child_mode],
|
|
406
406
|
configure: async (device, coordinatorEndpoint, logger) => {
|
|
407
407
|
const endpoint = device.getEndpoint(1);
|
|
408
|
-
await
|
|
409
|
-
await reporting.bind(endpoint, coordinatorEndpoint, ['genOnOff', 'haElectricalMeasurement'
|
|
408
|
+
await tuya.configureMagicPacket(device, coordinatorEndpoint, logger);
|
|
409
|
+
await reporting.bind(endpoint, coordinatorEndpoint, ['genOnOff', 'haElectricalMeasurement']);
|
|
410
410
|
await reporting.rmsVoltage(endpoint, {change: 5});
|
|
411
411
|
await reporting.rmsCurrent(endpoint, {change: 50});
|
|
412
412
|
await reporting.activePower(endpoint, {change: 10});
|
|
413
|
-
|
|
413
|
+
// Energy reporting (currentSummDelivered) doesn't work; requires polling: https://github.com/Koenkk/zigbee2mqtt/issues/14356
|
|
414
414
|
endpoint.saveClusterAttributeKeyValue('haElectricalMeasurement', {acCurrentDivisor: 1000, acCurrentMultiplier: 1});
|
|
415
415
|
endpoint.saveClusterAttributeKeyValue('seMetering', {divisor: 100, multiplier: 1});
|
|
416
416
|
device.save();
|
|
417
417
|
},
|
|
418
|
+
options: [exposes.options.measurement_poll_interval().withDescription('Only the energy value is polled for this device.')],
|
|
418
419
|
exposes: [e.switch(), e.power(), e.current(), e.voltage().withAccess(ea.STATE),
|
|
419
420
|
e.energy(), exposes.enum('power_outage_memory', ea.ALL, ['on', 'off', 'restore'])
|
|
420
421
|
.withDescription('Recover state after power outage'),
|
|
421
422
|
exposes.enum('indicator_mode', ea.ALL, ['off', 'off/on', 'on/off', 'on'])
|
|
422
423
|
.withDescription('Plug LED indicator mode'), e.child_lock()],
|
|
424
|
+
onEvent: (type, data, device, options) => tuya.onEventMeasurementPoll(type, data, device, options, false, true),
|
|
423
425
|
},
|
|
424
426
|
{
|
|
425
427
|
fingerprint: [{modelID: 'TS004F', manufacturerName: '_TZ3000_rco1yzb1'}],
|
package/devices/miboxer.js
CHANGED
|
@@ -50,8 +50,11 @@ module.exports = [
|
|
|
50
50
|
onEvent: tuya.onEventSetTime,
|
|
51
51
|
},
|
|
52
52
|
{
|
|
53
|
-
fingerprint: [
|
|
54
|
-
{modelID: 'TS0502B', manufacturerName: '
|
|
53
|
+
fingerprint: [
|
|
54
|
+
{modelID: 'TS0502B', manufacturerName: '_TZ3210_frm6149r'},
|
|
55
|
+
{modelID: 'TS0502B', manufacturerName: '_TZ3210_jtifm80b'},
|
|
56
|
+
{modelID: 'TS0502B', manufacturerName: '_TZ3210_xwqng7ol'},
|
|
57
|
+
],
|
|
55
58
|
model: 'FUT035Z',
|
|
56
59
|
description: 'Dual white LED controller',
|
|
57
60
|
vendor: 'Miboxer',
|
package/devices/moes.js
CHANGED
|
@@ -299,7 +299,8 @@ module.exports = [
|
|
|
299
299
|
tz.moesS_thermostat_boost_heating, tz.moesS_thermostat_boostHeatingCountdownTimeSet,
|
|
300
300
|
tz.moesS_thermostat_eco_temperature, tz.moesS_thermostat_max_temperature,
|
|
301
301
|
tz.moesS_thermostat_min_temperature, tz.moesS_thermostat_moesSecoMode,
|
|
302
|
-
tz.moesS_thermostat_preset, tz.moesS_thermostat_schedule_programming
|
|
302
|
+
tz.moesS_thermostat_preset, tz.moesS_thermostat_schedule_programming,
|
|
303
|
+
tz.moesS_thermostat_system_mode],
|
|
303
304
|
exposes: [
|
|
304
305
|
e.battery(), e.child_lock(), e.eco_mode(),
|
|
305
306
|
e.eco_temperature().withValueMin(5), e.max_temperature().withValueMax(45), e.min_temperature().withValueMin(5),
|
|
@@ -308,7 +309,7 @@ module.exports = [
|
|
|
308
309
|
exposes.climate()
|
|
309
310
|
.withLocalTemperature(ea.STATE).withSetpoint('current_heating_setpoint', 5, 35, 1, ea.STATE_SET)
|
|
310
311
|
.withLocalTemperatureCalibration(-9, 9, 1, ea.STATE_SET)
|
|
311
|
-
.withSystemMode(['heat'], ea.
|
|
312
|
+
.withSystemMode(['heat'], ea.STATE_SET)
|
|
312
313
|
.withRunningState(['idle', 'heat'], ea.STATE)
|
|
313
314
|
.withPreset(['programming', 'manual', 'temporary_manual', 'holiday'],
|
|
314
315
|
'MANUAL MODE ☝ - In this mode, the device executes manual temperature setting. '+
|
package/devices/nue_3a.js
CHANGED
|
@@ -99,7 +99,7 @@ module.exports = [
|
|
|
99
99
|
exposes: [e.action(['recall_*']), e.switch()],
|
|
100
100
|
},
|
|
101
101
|
{
|
|
102
|
-
zigbeeModel: ['LXN56-DC27LX1.1', 'LXN56-DS27LX1.1'],
|
|
102
|
+
zigbeeModel: ['LXN56-DC27LX1.1', 'LXN56-DS27LX1.1', 'LXN56-DS27LX1.3'],
|
|
103
103
|
model: 'LXZB-02A',
|
|
104
104
|
vendor: 'Nue / 3A',
|
|
105
105
|
description: 'Smart light controller',
|
|
@@ -159,7 +159,7 @@ module.exports = [
|
|
|
159
159
|
},
|
|
160
160
|
},
|
|
161
161
|
{
|
|
162
|
-
zigbeeModel: ['FB56+ZSC05HG1.0', 'FNB56-ZBW01LX1.2', '
|
|
162
|
+
zigbeeModel: ['FB56+ZSC05HG1.0', 'FNB56-ZBW01LX1.2', 'LXN60-DS27LX1.3'],
|
|
163
163
|
model: 'HGZB-04D / HGZB-4D-UK',
|
|
164
164
|
vendor: 'Nue / 3A',
|
|
165
165
|
description: 'Smart dimmer wall switch',
|
package/devices/philips.js
CHANGED
|
@@ -1634,6 +1634,16 @@ module.exports = [
|
|
|
1634
1634
|
...hueExtend.light_onoff_brightness_colortemp_color({colorTempRange: [153, 500]}).exposes],
|
|
1635
1635
|
extend: hueExtend.light_onoff_brightness_colortemp_color({colorTempRange: [153, 500]}),
|
|
1636
1636
|
},
|
|
1637
|
+
{
|
|
1638
|
+
zigbeeModel: ['915005987601'],
|
|
1639
|
+
model: '915005987601',
|
|
1640
|
+
vendor: 'Philips',
|
|
1641
|
+
description: 'Hue Gradient Signe floor lamp (black)',
|
|
1642
|
+
toZigbee: [tzLocal.gradient_scene, ...hueExtend.light_onoff_brightness_colortemp_color({colorTempRange: [153, 500]}).toZigbee],
|
|
1643
|
+
exposes: [exposes.enum('gradient_scene', ea.SET, Object.keys(gradientScenes)),
|
|
1644
|
+
...hueExtend.light_onoff_brightness_colortemp_color({colorTempRange: [153, 500]}).exposes],
|
|
1645
|
+
extend: hueExtend.light_onoff_brightness_colortemp_color({colorTempRange: [153, 500]}),
|
|
1646
|
+
},
|
|
1637
1647
|
{
|
|
1638
1648
|
zigbeeModel: ['LCT020'],
|
|
1639
1649
|
model: '4080148P7',
|
package/devices/sinope.js
CHANGED
|
@@ -249,7 +249,7 @@ module.exports = [
|
|
|
249
249
|
.withFeature(exposes.numeric('r', ea.ALL))
|
|
250
250
|
.withFeature(exposes.numeric('g', ea.ALL))
|
|
251
251
|
.withFeature(exposes.numeric('b', ea.ALL))
|
|
252
|
-
.withDescription('Control status LED
|
|
252
|
+
.withDescription('Control status LED color when load ON'),
|
|
253
253
|
exposes.composite('led_color_off', 'led_color_off')
|
|
254
254
|
.withFeature(exposes.numeric('r', ea.ALL))
|
|
255
255
|
.withFeature(exposes.numeric('g', ea.ALL))
|
|
@@ -280,7 +280,7 @@ module.exports = [
|
|
|
280
280
|
.withFeature(exposes.numeric('r', ea.ALL))
|
|
281
281
|
.withFeature(exposes.numeric('g', ea.ALL))
|
|
282
282
|
.withFeature(exposes.numeric('b', ea.ALL))
|
|
283
|
-
.withDescription('Control status LED
|
|
283
|
+
.withDescription('Control status LED color when load ON'),
|
|
284
284
|
exposes.composite('led_color_off', 'led_color_off')
|
|
285
285
|
.withFeature(exposes.numeric('r', ea.ALL))
|
|
286
286
|
.withFeature(exposes.numeric('g', ea.ALL))
|
package/devices/stelpro.js
CHANGED
|
@@ -5,7 +5,51 @@ const reporting = require('../lib/reporting');
|
|
|
5
5
|
const e = exposes.presets;
|
|
6
6
|
const constants = require('../lib/constants');
|
|
7
7
|
|
|
8
|
+
const fzLocal = {
|
|
9
|
+
power: {
|
|
10
|
+
cluster: 'hvacThermostat',
|
|
11
|
+
type: ['attributeReport', 'readResponse'],
|
|
12
|
+
convert: (model, msg, publish, options, meta) => {
|
|
13
|
+
if (msg.data.hasOwnProperty('16392')) {
|
|
14
|
+
return {power: msg.data['16392']};
|
|
15
|
+
}
|
|
16
|
+
},
|
|
17
|
+
},
|
|
18
|
+
energy: {
|
|
19
|
+
cluster: 'hvacThermostat',
|
|
20
|
+
type: ['attributeReport', 'readResponse'],
|
|
21
|
+
convert: (model, msg, publish, options, meta) => {
|
|
22
|
+
if (msg.data.hasOwnProperty('16393')) {
|
|
23
|
+
return {energy: parseFloat(msg.data['16393']) / 1000};
|
|
24
|
+
}
|
|
25
|
+
},
|
|
26
|
+
},
|
|
27
|
+
};
|
|
28
|
+
|
|
8
29
|
module.exports = [
|
|
30
|
+
{
|
|
31
|
+
zigbeeModel: ['HT402'],
|
|
32
|
+
model: 'HT402',
|
|
33
|
+
vendor: 'Stelpro',
|
|
34
|
+
description: 'Hilo thermostat',
|
|
35
|
+
fromZigbee: [fz.stelpro_thermostat, fz.hvac_user_interface, fzLocal.power, fzLocal.energy],
|
|
36
|
+
toZigbee: [tz.thermostat_local_temperature, tz.thermostat_occupancy, tz.thermostat_occupied_heating_setpoint,
|
|
37
|
+
tz.thermostat_temperature_display_mode, tz.thermostat_keypad_lockout, tz.thermostat_system_mode,
|
|
38
|
+
tz.thermostat_running_state, tz.stelpro_thermostat_outdoor_temperature],
|
|
39
|
+
exposes: [e.local_temperature(), e.keypad_lockout(), e.power(), e.energy(),
|
|
40
|
+
exposes.climate().withSetpoint('occupied_heating_setpoint', 5, 30, 0.5).withLocalTemperature()
|
|
41
|
+
.withSystemMode(['heat']).withRunningState(['idle', 'heat'])],
|
|
42
|
+
configure: async (device, coordinatorEndpoint, logger) => {
|
|
43
|
+
const endpoint = device.getEndpoint(25);
|
|
44
|
+
const binds = ['genBasic', 'genIdentify', 'genGroups', 'hvacThermostat', 'hvacUserInterfaceCfg', 'msTemperatureMeasurement'];
|
|
45
|
+
await reporting.bind(endpoint, coordinatorEndpoint, binds);
|
|
46
|
+
await reporting.thermostatTemperature(endpoint);
|
|
47
|
+
await reporting.thermostatOccupiedHeatingSetpoint(endpoint);
|
|
48
|
+
await reporting.thermostatSystemMode(endpoint);
|
|
49
|
+
await reporting.thermostatPIHeatingDemand(endpoint);
|
|
50
|
+
await reporting.thermostatKeypadLockMode(endpoint);
|
|
51
|
+
},
|
|
52
|
+
},
|
|
9
53
|
{
|
|
10
54
|
zigbeeModel: ['ST218'],
|
|
11
55
|
model: 'ST218',
|
package/devices/tuya.js
CHANGED
|
@@ -840,10 +840,7 @@ module.exports = [
|
|
|
840
840
|
return {'l1': 1, 'l2': 2};
|
|
841
841
|
},
|
|
842
842
|
meta: {multiEndpoint: true},
|
|
843
|
-
configure:
|
|
844
|
-
const endpoint = device.getEndpoint(1);
|
|
845
|
-
await endpoint.read('genBasic', ['manufacturerName', 'zclVersion', 'appVersion', 'modelId', 'powerSource', 0xfffe]);
|
|
846
|
-
},
|
|
843
|
+
configure: tuya.configureMagicPacket,
|
|
847
844
|
},
|
|
848
845
|
{
|
|
849
846
|
fingerprint: [{modelID: 'TS011F', manufacturerName: '_TZ3000_rk2yzt0u'},
|
|
@@ -1085,10 +1082,7 @@ module.exports = [
|
|
|
1085
1082
|
exposes.enum('sensitivity', ea.ALL, ['low', 'medium', 'high']).withDescription('PIR sensor sensitivity'),
|
|
1086
1083
|
exposes.enum('keep_time', ea.ALL, [30, 60, 120]).withDescription('PIR keep time in seconds'),
|
|
1087
1084
|
],
|
|
1088
|
-
configure:
|
|
1089
|
-
const endpoint = device.getEndpoint(1);
|
|
1090
|
-
await endpoint.read('genBasic', ['manufacturerName', 'zclVersion', 'appVersion', 'modelId', 'powerSource', 0xfffe]);
|
|
1091
|
-
},
|
|
1085
|
+
configure: tuya.configureMagicPacket,
|
|
1092
1086
|
},
|
|
1093
1087
|
{
|
|
1094
1088
|
fingerprint: [{modelID: 'TS0202', manufacturerName: '_TZ3040_msl6wxk9'}],
|
|
@@ -1101,10 +1095,7 @@ module.exports = [
|
|
|
1101
1095
|
exposes.enum('sensitivity', ea.ALL, ['low', 'medium', 'high']).withDescription('PIR sensor sensitivity'),
|
|
1102
1096
|
exposes.enum('keep_time', ea.ALL, [30, 60, 120]).withDescription('PIR keep time in seconds'),
|
|
1103
1097
|
],
|
|
1104
|
-
configure:
|
|
1105
|
-
const endpoint = device.getEndpoint(1);
|
|
1106
|
-
await endpoint.read('genBasic', ['manufacturerName', 'zclVersion', 'appVersion', 'modelId', 'powerSource', 0xfffe]);
|
|
1107
|
-
},
|
|
1098
|
+
configure: tuya.configureMagicPacket,
|
|
1108
1099
|
},
|
|
1109
1100
|
{
|
|
1110
1101
|
fingerprint: tuya.fingerprint('TS0202', ['_TZ3000_mcxw5ehu', '_TZ3040_6ygjfyll']),
|
|
@@ -1593,10 +1584,7 @@ module.exports = [
|
|
|
1593
1584
|
fromZigbee: [fzLocal.TS0201_battery, fz.temperature, fzLocal.TS0201_humidity],
|
|
1594
1585
|
toZigbee: [],
|
|
1595
1586
|
exposes: [e.battery(), e.temperature(), e.humidity(), e.battery_voltage()],
|
|
1596
|
-
configure:
|
|
1597
|
-
const endpoint = device.getEndpoint(1);
|
|
1598
|
-
await endpoint.read('genBasic', ['manufacturerName', 'zclVersion', 'appVersion', 'modelId', 'powerSource', 0xfffe]);
|
|
1599
|
-
},
|
|
1587
|
+
configure: tuya.configureMagicPacket,
|
|
1600
1588
|
},
|
|
1601
1589
|
{
|
|
1602
1590
|
fingerprint: [
|
|
@@ -1611,10 +1599,7 @@ module.exports = [
|
|
|
1611
1599
|
fromZigbee: [fzLocal.TS0201_battery, fz.temperature, fz.humidity],
|
|
1612
1600
|
toZigbee: [],
|
|
1613
1601
|
exposes: [e.battery(), e.temperature(), e.humidity(), e.battery_voltage()],
|
|
1614
|
-
configure:
|
|
1615
|
-
const endpoint = device.getEndpoint(1);
|
|
1616
|
-
await endpoint.read('genBasic', ['manufacturerName', 'zclVersion', 'appVersion', 'modelId', 'powerSource', 0xfffe]);
|
|
1617
|
-
},
|
|
1602
|
+
configure: tuya.configureMagicPacket,
|
|
1618
1603
|
},
|
|
1619
1604
|
{
|
|
1620
1605
|
fingerprint: tuya.fingerprint('TS0201', ['_TZ3000_dowj6gyi', '_TZ3000_8ybe88nf']),
|
|
@@ -1624,10 +1609,7 @@ module.exports = [
|
|
|
1624
1609
|
fromZigbee: [fzLocal.TS0201_battery, fz.temperature, fz.humidity],
|
|
1625
1610
|
toZigbee: [],
|
|
1626
1611
|
exposes: [e.battery(), e.temperature(), e.humidity(), e.battery_voltage()],
|
|
1627
|
-
configure:
|
|
1628
|
-
const endpoint = device.getEndpoint(1);
|
|
1629
|
-
await endpoint.read('genBasic', ['manufacturerName', 'zclVersion', 'appVersion', 'modelId', 'powerSource', 0xfffe]);
|
|
1630
|
-
},
|
|
1612
|
+
configure: tuya.configureMagicPacket,
|
|
1631
1613
|
},
|
|
1632
1614
|
{
|
|
1633
1615
|
fingerprint: [{modelID: 'SM0201', manufacturerName: '_TYZB01_cbiezpds'}],
|
|
@@ -1653,9 +1635,8 @@ module.exports = [
|
|
|
1653
1635
|
return {'l1': 1, 'l2': 2, 'l3': 3, 'l4': 4};
|
|
1654
1636
|
},
|
|
1655
1637
|
meta: {multiEndpoint: true},
|
|
1656
|
-
configure: async (device, coordinatorEndpoint) => {
|
|
1657
|
-
await
|
|
1658
|
-
['manufacturerName', 'zclVersion', 'appVersion', 'modelId', 'powerSource', 0xfffe]);
|
|
1638
|
+
configure: async (device, coordinatorEndpoint, logger) => {
|
|
1639
|
+
await tuya.configureMagicPacket(device, coordinatorEndpoint, logger);
|
|
1659
1640
|
for (const endpointID of [1, 2, 3, 4]) {
|
|
1660
1641
|
const endpoint = device.getEndpoint(endpointID);
|
|
1661
1642
|
await reporting.bind(endpoint, coordinatorEndpoint, ['genOnOff']);
|
|
@@ -1793,8 +1774,8 @@ module.exports = [
|
|
|
1793
1774
|
fromZigbee: [fz.on_off, fz.electrical_measurement, fz.metering, fz.ignore_basic_report, fz.tuya_switch_power_outage_memory],
|
|
1794
1775
|
toZigbee: [tz.on_off, tz.tuya_switch_power_outage_memory],
|
|
1795
1776
|
configure: async (device, coordinatorEndpoint, logger) => {
|
|
1777
|
+
await tuya.configureMagicPacket(device, coordinatorEndpoint, logger);
|
|
1796
1778
|
const endpoint = device.getEndpoint(1);
|
|
1797
|
-
await endpoint.read('genBasic', ['manufacturerName', 'zclVersion', 'appVersion', 'modelId', 'powerSource', 0xfffe]);
|
|
1798
1779
|
await reporting.bind(endpoint, coordinatorEndpoint, ['genOnOff', 'haElectricalMeasurement', 'seMetering']);
|
|
1799
1780
|
await reporting.rmsVoltage(endpoint, {change: 5});
|
|
1800
1781
|
await reporting.rmsCurrent(endpoint, {change: 50});
|
|
@@ -1812,20 +1793,22 @@ module.exports = [
|
|
|
1812
1793
|
model: 'TS000F_power',
|
|
1813
1794
|
description: 'Switch with power monitoring',
|
|
1814
1795
|
vendor: 'TuYa',
|
|
1815
|
-
fromZigbee: [fz.on_off, fz.electrical_measurement, fz.metering, fz.ignore_basic_report
|
|
1816
|
-
|
|
1796
|
+
fromZigbee: [fz.on_off, fz.electrical_measurement, fz.metering, fz.ignore_basic_report, fz.moes_power_on_behavior,
|
|
1797
|
+
fz.tuya_switch_type],
|
|
1798
|
+
toZigbee: [tz.on_off, tz.moes_power_on_behavior, tz.tuya_switch_type],
|
|
1817
1799
|
configure: async (device, coordinatorEndpoint, logger) => {
|
|
1818
1800
|
const endpoint = device.getEndpoint(1);
|
|
1819
1801
|
await tuya.configureMagicPacket(device, coordinatorEndpoint, logger);
|
|
1820
|
-
await reporting.bind(endpoint, coordinatorEndpoint, ['genOnOff', 'haElectricalMeasurement'
|
|
1802
|
+
await reporting.bind(endpoint, coordinatorEndpoint, ['genOnOff', 'haElectricalMeasurement']);
|
|
1821
1803
|
await reporting.rmsVoltage(endpoint, {change: 5});
|
|
1822
1804
|
await reporting.activePower(endpoint, {change: 10});
|
|
1823
|
-
await reporting.currentSummDelivered(endpoint);
|
|
1824
1805
|
endpoint.saveClusterAttributeKeyValue('seMetering', {divisor: 100, multiplier: 1});
|
|
1825
1806
|
device.save();
|
|
1826
1807
|
},
|
|
1808
|
+
options: [exposes.options.measurement_poll_interval().withDescription('Only the energy value is polled for this device.')],
|
|
1809
|
+
onEvent: (type, data, device, options) => tuya.onEventMeasurementPoll(type, data, device, options, false, true),
|
|
1827
1810
|
whiteLabel: [{vendor: 'Aubess', model: 'WDH02'}],
|
|
1828
|
-
exposes: [e.switch(), e.power(), e.voltage().withAccess(ea.STATE), e.energy()],
|
|
1811
|
+
exposes: [e.switch(), e.power(), e.voltage().withAccess(ea.STATE), e.energy(), e.power_on_behavior(), e.switch_type_2()],
|
|
1829
1812
|
},
|
|
1830
1813
|
{
|
|
1831
1814
|
zigbeeModel: ['TS0001'],
|
|
@@ -1898,8 +1881,7 @@ module.exports = [
|
|
|
1898
1881
|
},
|
|
1899
1882
|
meta: {multiEndpoint: true},
|
|
1900
1883
|
configure: async (device, coordinatorEndpoint, logger) => {
|
|
1901
|
-
await
|
|
1902
|
-
['manufacturerName', 'zclVersion', 'appVersion', 'modelId', 'powerSource', 0xfffe]);
|
|
1884
|
+
await tuya.configureMagicPacket(device, coordinatorEndpoint, logger);
|
|
1903
1885
|
await reporting.bind(device.getEndpoint(1), coordinatorEndpoint, ['genOnOff']);
|
|
1904
1886
|
await reporting.bind(device.getEndpoint(2), coordinatorEndpoint, ['genOnOff']);
|
|
1905
1887
|
},
|
|
@@ -1946,8 +1928,7 @@ module.exports = [
|
|
|
1946
1928
|
},
|
|
1947
1929
|
meta: {multiEndpoint: true},
|
|
1948
1930
|
configure: async (device, coordinatorEndpoint, logger) => {
|
|
1949
|
-
await
|
|
1950
|
-
['manufacturerName', 'zclVersion', 'appVersion', 'modelId', 'powerSource', 0xfffe]);
|
|
1931
|
+
await tuya.configureMagicPacket(device, coordinatorEndpoint, logger);
|
|
1951
1932
|
await reporting.bind(device.getEndpoint(1), coordinatorEndpoint, ['genOnOff']);
|
|
1952
1933
|
await reporting.bind(device.getEndpoint(2), coordinatorEndpoint, ['genOnOff']);
|
|
1953
1934
|
await reporting.bind(device.getEndpoint(3), coordinatorEndpoint, ['genOnOff']);
|
|
@@ -1974,8 +1955,7 @@ module.exports = [
|
|
|
1974
1955
|
},
|
|
1975
1956
|
meta: {multiEndpoint: true},
|
|
1976
1957
|
configure: async (device, coordinatorEndpoint, logger) => {
|
|
1977
|
-
await
|
|
1978
|
-
['manufacturerName', 'zclVersion', 'appVersion', 'modelId', 'powerSource', 0xfffe]);
|
|
1958
|
+
await tuya.configureMagicPacket(device, coordinatorEndpoint, logger);
|
|
1979
1959
|
await reporting.bind(device.getEndpoint(1), coordinatorEndpoint, ['genOnOff']);
|
|
1980
1960
|
await reporting.bind(device.getEndpoint(2), coordinatorEndpoint, ['genOnOff']);
|
|
1981
1961
|
await reporting.bind(device.getEndpoint(3), coordinatorEndpoint, ['genOnOff']);
|
|
@@ -2375,8 +2355,8 @@ module.exports = [
|
|
|
2375
2355
|
fz.tuya_switch_power_outage_memory, fz.ts011f_plug_indicator_mode, fz.ts011f_plug_child_mode],
|
|
2376
2356
|
toZigbee: [tz.on_off, tz.tuya_switch_power_outage_memory, tz.ts011f_plug_indicator_mode, tz.ts011f_plug_child_mode],
|
|
2377
2357
|
configure: async (device, coordinatorEndpoint, logger) => {
|
|
2358
|
+
await tuya.configureMagicPacket(device, coordinatorEndpoint, logger);
|
|
2378
2359
|
const endpoint = device.getEndpoint(1);
|
|
2379
|
-
await endpoint.read('genBasic', ['manufacturerName', 'zclVersion', 'appVersion', 'modelId', 'powerSource', 0xfffe]);
|
|
2380
2360
|
await reporting.bind(endpoint, coordinatorEndpoint, ['genOnOff', 'haElectricalMeasurement', 'seMetering']);
|
|
2381
2361
|
await reporting.rmsVoltage(endpoint, {change: 5});
|
|
2382
2362
|
await reporting.rmsCurrent(endpoint, {change: 50});
|
|
@@ -2429,14 +2409,8 @@ module.exports = [
|
|
|
2429
2409
|
fz.tuya_switch_power_outage_memory, fz.ts011f_plug_indicator_mode, fz.ts011f_plug_child_mode],
|
|
2430
2410
|
toZigbee: [tz.on_off, tz.tuya_switch_power_outage_memory, tz.ts011f_plug_indicator_mode, tz.ts011f_plug_child_mode],
|
|
2431
2411
|
configure: async (device, coordinatorEndpoint, logger) => {
|
|
2412
|
+
await tuya.configureMagicPacket(device, coordinatorEndpoint, logger);
|
|
2432
2413
|
const endpoint = device.getEndpoint(1);
|
|
2433
|
-
// Enables reporting of physical state changes
|
|
2434
|
-
// https://github.com/Koenkk/zigbee2mqtt/issues/9057#issuecomment-1007742130
|
|
2435
|
-
try {
|
|
2436
|
-
await endpoint.read('genBasic', ['manufacturerName', 'zclVersion', 'appVersion', 'modelId', 'powerSource', 0xfffe]);
|
|
2437
|
-
} catch (e) {
|
|
2438
|
-
// Sometimes can fail: https://github.com/Koenkk/zigbee2mqtt/issues/12760#issuecomment-1165435220
|
|
2439
|
-
}
|
|
2440
2414
|
endpoint.saveClusterAttributeKeyValue('haElectricalMeasurement', {acCurrentDivisor: 1000, acCurrentMultiplier: 1});
|
|
2441
2415
|
endpoint.saveClusterAttributeKeyValue('seMetering', {divisor: 100, multiplier: 1});
|
|
2442
2416
|
device.save();
|
|
@@ -2680,8 +2654,7 @@ module.exports = [
|
|
|
2680
2654
|
},
|
|
2681
2655
|
meta: {multiEndpoint: true},
|
|
2682
2656
|
configure: async (device, coordinatorEndpoint, logger) => {
|
|
2683
|
-
await
|
|
2684
|
-
['manufacturerName', 'zclVersion', 'appVersion', 'modelId', 'powerSource', 0xfffe]);
|
|
2657
|
+
await tuya.configureMagicPacket(device, coordinatorEndpoint, logger);
|
|
2685
2658
|
await reporting.bind(device.getEndpoint(1), coordinatorEndpoint, ['genOnOff']);
|
|
2686
2659
|
await reporting.bind(device.getEndpoint(2), coordinatorEndpoint, ['genOnOff']);
|
|
2687
2660
|
device.powerSource = 'Mains (single phase)';
|
|
@@ -2734,8 +2707,7 @@ module.exports = [
|
|
|
2734
2707
|
whiteLabel: [{vendor: 'TUYATEC', model: 'GDKES-03TZXD'}],
|
|
2735
2708
|
meta: {multiEndpoint: true},
|
|
2736
2709
|
configure: async (device, coordinatorEndpoint, logger) => {
|
|
2737
|
-
await
|
|
2738
|
-
['manufacturerName', 'zclVersion', 'appVersion', 'modelId', 'powerSource', 0xfffe]);
|
|
2710
|
+
await tuya.configureMagicPacket(device, coordinatorEndpoint, logger);
|
|
2739
2711
|
try {
|
|
2740
2712
|
for (const ID of [1, 2, 3]) {
|
|
2741
2713
|
const endpoint = device.getEndpoint(ID);
|
|
@@ -2856,8 +2828,7 @@ module.exports = [
|
|
|
2856
2828
|
},
|
|
2857
2829
|
meta: {multiEndpoint: true},
|
|
2858
2830
|
configure: async (device, coordinatorEndpoint, logger) => {
|
|
2859
|
-
await
|
|
2860
|
-
['manufacturerName', 'zclVersion', 'appVersion', 'modelId', 'powerSource', 0xfffe]);
|
|
2831
|
+
await tuya.configureMagicPacket(device, coordinatorEndpoint, logger);
|
|
2861
2832
|
await reporting.bind(device.getEndpoint(1), coordinatorEndpoint, ['genOnOff']);
|
|
2862
2833
|
await reporting.bind(device.getEndpoint(2), coordinatorEndpoint, ['genOnOff']);
|
|
2863
2834
|
await reporting.bind(device.getEndpoint(3), coordinatorEndpoint, ['genOnOff']);
|
|
@@ -3027,10 +2998,7 @@ module.exports = [
|
|
|
3027
2998
|
fromZigbee: [fz.battery, fz.illuminance, fzLocal.TS0222],
|
|
3028
2999
|
toZigbee: [],
|
|
3029
3000
|
exposes: [e.battery(), e.illuminance(), e.illuminance_lux()],
|
|
3030
|
-
configure:
|
|
3031
|
-
const endpoint = device.getEndpoint(1);
|
|
3032
|
-
await endpoint.read('genBasic', ['manufacturerName', 'zclVersion', 'appVersion', 'modelId', 'powerSource', 0xfffe]);
|
|
3033
|
-
},
|
|
3001
|
+
configure: tuya.configureMagicPacket,
|
|
3034
3002
|
},
|
|
3035
3003
|
{
|
|
3036
3004
|
fingerprint: [{modelID: 'TS0210', manufacturerName: '_TYZB01_3zv6oleo'},
|
|
@@ -3132,7 +3100,7 @@ module.exports = [
|
|
|
3132
3100
|
configure: async (device, coordinatorEndpoint, logger) => {
|
|
3133
3101
|
const endpoint = device.getEndpoint(1);
|
|
3134
3102
|
// Enables reporting of measurement state changes
|
|
3135
|
-
await
|
|
3103
|
+
await tuya.configureMagicPacket(device, coordinatorEndpoint, logger);
|
|
3136
3104
|
await reporting.bind(endpoint, coordinatorEndpoint, ['genBasic', 'genPowerCfg',
|
|
3137
3105
|
'msTemperatureMeasurement', 'msIlluminanceMeasurement', 'msRelativeHumidity', 'manuSpecificTuya_2']);
|
|
3138
3106
|
},
|
package/lib/exposes.js
CHANGED
|
@@ -507,7 +507,7 @@ module.exports = {
|
|
|
507
507
|
no_position_support: () => new Binary('no_position_support', access.SET, true, false).withDescription('Set to true when your device only reports position 0, 100 and 50 (in this case your device has an older firmware) (default false).'),
|
|
508
508
|
transition: () => new Numeric(`transition`, access.SET).withValueMin(0).withDescription('Controls the transition time (in seconds) of on/off, brightness, color temperature (if applicable) and color (if applicable) changes. Defaults to `0` (no transition).'),
|
|
509
509
|
legacy: () => new Binary(`legacy`, access.SET, true, false).withDescription(`Set to false to disable the legacy integration (highly recommended), will change structure of the published payload (default true).`),
|
|
510
|
-
measurement_poll_interval: () => new Numeric(`measurement_poll_interval`, access.SET).withValueMin(-1).withDescription(`This device does not support reporting electric measurements so it is polled instead. The default poll interval is 60 seconds, set to -1 to disable
|
|
510
|
+
measurement_poll_interval: (extraNote='') => new Numeric(`measurement_poll_interval`, access.SET).withValueMin(-1).withDescription(`This device does not support reporting electric measurements so it is polled instead. The default poll interval is 60 seconds, set to -1 to disable.${extraNote}`),
|
|
511
511
|
illuminance_below_threshold_check: () => new Binary(`illuminance_below_threshold_check`, access.SET, true, false).withDescription(`Set to false to also send messages when illuminance is above threshold in night mode (default true).`),
|
|
512
512
|
},
|
|
513
513
|
presets: {
|
package/lib/tuya.js
CHANGED
|
@@ -243,7 +243,7 @@ function convertDecimalValueTo2ByteHexArray(value) {
|
|
|
243
243
|
return [chunk1, chunk2].map((hexVal) => parseInt(hexVal, 16));
|
|
244
244
|
}
|
|
245
245
|
|
|
246
|
-
async function onEventMeasurementPoll(type, data, device, options) {
|
|
246
|
+
async function onEventMeasurementPoll(type, data, device, options, electricalMeasurement=true, metering=false) {
|
|
247
247
|
const endpoint = device.getEndpoint(1);
|
|
248
248
|
if (type === 'stop') {
|
|
249
249
|
clearInterval(globalStore.getValue(device, 'interval'));
|
|
@@ -253,7 +253,12 @@ async function onEventMeasurementPoll(type, data, device, options) {
|
|
|
253
253
|
if (seconds === -1) return;
|
|
254
254
|
const interval = setInterval(async () => {
|
|
255
255
|
try {
|
|
256
|
-
|
|
256
|
+
if (electricalMeasurement) {
|
|
257
|
+
await endpoint.read('haElectricalMeasurement', ['rmsVoltage', 'rmsCurrent', 'activePower']);
|
|
258
|
+
}
|
|
259
|
+
if (metering) {
|
|
260
|
+
await endpoint.read('seMetering', ['currentSummDelivered']);
|
|
261
|
+
}
|
|
257
262
|
} catch (error) {/* Do nothing*/}
|
|
258
263
|
}, seconds*1000);
|
|
259
264
|
globalStore.putValue(device, 'interval', interval);
|
|
@@ -1170,8 +1175,18 @@ const skip = {
|
|
|
1170
1175
|
};
|
|
1171
1176
|
|
|
1172
1177
|
const configureMagicPacket = async (device, coordinatorEndpoint, logger) => {
|
|
1173
|
-
|
|
1174
|
-
|
|
1178
|
+
try {
|
|
1179
|
+
const endpoint = device.endpoints[0];
|
|
1180
|
+
await endpoint.read('genBasic', ['manufacturerName', 'zclVersion', 'appVersion', 'modelId', 'powerSource', 0xfffe]);
|
|
1181
|
+
} catch (e) {
|
|
1182
|
+
// Fails for some TuYa devices with UNSUPPORTED_ATTRIBUTE, ignore that.
|
|
1183
|
+
// e.g. https://github.com/Koenkk/zigbee2mqtt/issues/14857
|
|
1184
|
+
if (e.message.includes('UNSUPPORTED_ATTRIBUTE')) {
|
|
1185
|
+
logger.debug('TuYa configureMagicPacket failed, ignoring...');
|
|
1186
|
+
} else {
|
|
1187
|
+
throw e;
|
|
1188
|
+
}
|
|
1189
|
+
}
|
|
1175
1190
|
};
|
|
1176
1191
|
|
|
1177
1192
|
const fingerprint = (modelID, manufacturerNames) => {
|
|
@@ -1231,7 +1246,7 @@ const valueConverter = {
|
|
|
1231
1246
|
onOff: valueConverterBasic.lookup({'ON': true, 'OFF': false}),
|
|
1232
1247
|
powerOnBehavior: valueConverterBasic.lookup({'off': 0, 'on': 1, 'previous': 2}),
|
|
1233
1248
|
lightType: valueConverterBasic.lookup({'led': 0, 'incandescent': 1, 'halogen': 2}),
|
|
1234
|
-
countdown: valueConverterBasic.raw,
|
|
1249
|
+
countdown: valueConverterBasic.raw(),
|
|
1235
1250
|
scale0_254to0_1000: valueConverterBasic.scale(0, 254, 0, 1000),
|
|
1236
1251
|
scale0_1to0_1000: valueConverterBasic.scale(0, 1, 0, 1000),
|
|
1237
1252
|
divideBy100: valueConverterBasic.divideBy(100),
|