zigbee-herdsman-converters 14.0.563 → 14.0.566
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 +10 -4
- package/converters/toZigbee.js +7 -2
- package/devices/acova.js +2 -1
- package/devices/adeo.js +7 -0
- package/devices/centralite.js +20 -0
- package/devices/custom_devices_diy.js +177 -0
- package/devices/gledopto.js +2 -1
- package/devices/immax.js +10 -0
- package/devices/ledvance.js +9 -1
- package/devices/lellki.js +4 -4
- package/devices/linkind.js +8 -1
- package/devices/lonsonho.js +1 -1
- package/devices/moes.js +1 -1
- package/devices/owon.js +1 -1
- package/devices/philips.js +21 -0
- package/devices/tuya.js +46 -16
- package/devices/xiaomi.js +15 -1
- package/devices/yale.js +2 -1
- package/devices/zemismart.js +1 -1
- package/lib/exposes.js +1 -0
- package/lib/tuya.js +5 -0
- package/lib/xiaomi.js +26 -2
- package/package.json +2 -2
package/converters/fromZigbee.js
CHANGED
|
@@ -1943,13 +1943,18 @@ const converters = {
|
|
|
1943
1943
|
const dp = dpValue.dp;
|
|
1944
1944
|
const value = tuya.getDataValue(dpValue);
|
|
1945
1945
|
switch (dp) {
|
|
1946
|
-
case
|
|
1946
|
+
case tuya.dataPoints.tthTemperature:
|
|
1947
1947
|
return {temperature: calibrateAndPrecisionRoundOptions(value / 10, options, 'temperature')};
|
|
1948
|
-
case
|
|
1948
|
+
case tuya.dataPoints.tthHumidity:
|
|
1949
1949
|
return {humidity: calibrateAndPrecisionRoundOptions(
|
|
1950
1950
|
(value / (meta.device.manufacturerName === '_TZE200_bjawzodf' ? 10 : 1)),
|
|
1951
1951
|
options, 'humidity')};
|
|
1952
|
-
case
|
|
1952
|
+
case tuya.dataPoints.tthBatteryLevel:
|
|
1953
|
+
return {
|
|
1954
|
+
battery_level: {0: 'low', 1: 'middle', 2: 'high'}[value],
|
|
1955
|
+
battery_low: value === 0 ? true : false,
|
|
1956
|
+
};
|
|
1957
|
+
case tuya.dataPoints.tthBattery:
|
|
1953
1958
|
return {battery: value};
|
|
1954
1959
|
default:
|
|
1955
1960
|
meta.logger.warn(`zigbee-herdsman-converters:maa_tuya_temp_sensor: NOT RECOGNIZED ` +
|
|
@@ -7333,13 +7338,14 @@ const converters = {
|
|
|
7333
7338
|
const dpValue = tuya.firstDpValue(msg, meta, 'SLUXZB');
|
|
7334
7339
|
const dp = dpValue.dp;
|
|
7335
7340
|
const value = tuya.getDataValue(dpValue);
|
|
7341
|
+
const brightnesStateLookup = {'0': 'LOW', '1': 'MEDIUM', '2': 'HIGH'};
|
|
7336
7342
|
switch (dp) {
|
|
7337
7343
|
case 2:
|
|
7338
7344
|
return {illuminance_lux: value};
|
|
7339
7345
|
case 4:
|
|
7340
7346
|
return {battery: value};
|
|
7341
7347
|
case 1:
|
|
7342
|
-
return {
|
|
7348
|
+
return {brightness_level: brightnesStateLookup[value]};
|
|
7343
7349
|
default:
|
|
7344
7350
|
meta.logger.warn(`s_lux_zb_illuminance: NOT RECOGNIZED DP #${dp} with data ${JSON.stringify(dpValue)}`);
|
|
7345
7351
|
}
|
package/converters/toZigbee.js
CHANGED
|
@@ -2167,7 +2167,8 @@ const converters = {
|
|
|
2167
2167
|
convertSet: async (entity, key, value, meta) => {
|
|
2168
2168
|
if (['SP-EUC01', 'ZNCZ04LM', 'ZNCZ15LM', 'QBCZ14LM', 'QBCZ15LM', 'SSM-U01', 'SSM-U02', 'DLKZMK11LM', 'DLKZMK12LM',
|
|
2169
2169
|
'WS-EUK01', 'WS-EUK02', 'WS-EUK03', 'WS-EUK04', 'QBKG19LM', 'QBKG20LM', 'QBKG25LM', 'QBKG26LM',
|
|
2170
|
-
'QBKG31LM', 'QBKG34LM', 'QBKG38LM', 'QBKG39LM', 'QBKG40LM', 'QBKG41LM', 'ZNDDMK11LM'
|
|
2170
|
+
'QBKG31LM', 'QBKG34LM', 'QBKG38LM', 'QBKG39LM', 'QBKG40LM', 'QBKG41LM', 'ZNDDMK11LM', 'ZNLDP13LM',
|
|
2171
|
+
].includes(meta.mapped.model)) {
|
|
2171
2172
|
await entity.write('aqaraOpple', {0x0201: {value: value ? 1 : 0, type: 0x10}}, manufacturerOptions.xiaomi);
|
|
2172
2173
|
} else if (['ZNCZ02LM', 'QBCZ11LM', 'LLKZMK11LM'].includes(meta.mapped.model)) {
|
|
2173
2174
|
const payload = value ?
|
|
@@ -2190,7 +2191,8 @@ const converters = {
|
|
|
2190
2191
|
convertGet: async (entity, key, meta) => {
|
|
2191
2192
|
if (['SP-EUC01', 'ZNCZ04LM', 'ZNCZ15LM', 'QBCZ14LM', 'QBCZ15LM', 'SSM-U01', 'SSM-U02', 'DLKZMK11LM', 'DLKZMK12LM',
|
|
2192
2193
|
'WS-EUK01', 'WS-EUK02', 'WS-EUK03', 'WS-EUK04', 'QBKG19LM', 'QBKG20LM', 'QBKG25LM', 'QBKG26LM',
|
|
2193
|
-
'QBKG31LM', 'QBKG34LM', 'QBKG38LM', 'QBKG39LM', 'QBKG40LM', 'QBKG41LM', 'ZNDDMK11LM'
|
|
2194
|
+
'QBKG31LM', 'QBKG34LM', 'QBKG38LM', 'QBKG39LM', 'QBKG40LM', 'QBKG41LM', 'ZNDDMK11LM', 'ZNLDP13LM',
|
|
2195
|
+
].includes(meta.mapped.model)) {
|
|
2194
2196
|
await entity.read('aqaraOpple', [0x0201]);
|
|
2195
2197
|
} else if (['ZNCZ02LM', 'QBCZ11LM', 'ZNCZ11LM'].includes(meta.mapped.model)) {
|
|
2196
2198
|
await entity.read('aqaraOpple', [0xFFF0]);
|
|
@@ -3582,6 +3584,9 @@ const converters = {
|
|
|
3582
3584
|
await entity.write('genOnOff', {moesStartUpOnOff: payload});
|
|
3583
3585
|
return {state: {power_outage_memory: value}};
|
|
3584
3586
|
},
|
|
3587
|
+
convertGet: async (entity, key, meta) => {
|
|
3588
|
+
await entity.read('genOnOff', ['moesStartUpOnOff']);
|
|
3589
|
+
},
|
|
3585
3590
|
},
|
|
3586
3591
|
moes_power_on_behavior: {
|
|
3587
3592
|
key: ['power_on_behavior'],
|
package/devices/acova.js
CHANGED
|
@@ -64,7 +64,8 @@ module.exports = [
|
|
|
64
64
|
},
|
|
65
65
|
},
|
|
66
66
|
{
|
|
67
|
-
zigbeeModel: ['TAFFETAS2 D1.00P1.02Z1.00'
|
|
67
|
+
zigbeeModel: ['TAFFETAS2 D1.00P1.02Z1.00\u0000\u0000\u0000\u0000\u0000\u0000\u0000',
|
|
68
|
+
'TAFFETAS2 D1.00P1.01Z1.00\u0000\u0000\u0000\u0000\u0000\u0000\u0000'],
|
|
68
69
|
model: 'TAFFETAS2',
|
|
69
70
|
vendor: 'Acova',
|
|
70
71
|
description: 'Taffetas 2 heater',
|
package/devices/adeo.js
CHANGED
|
@@ -22,6 +22,13 @@ module.exports = [
|
|
|
22
22
|
}
|
|
23
23
|
},
|
|
24
24
|
},
|
|
25
|
+
{
|
|
26
|
+
zigbeeModel: ['ZBEK-8'],
|
|
27
|
+
model: 'IG-CDZFB2G009RA-MZN-02',
|
|
28
|
+
vendor: 'ADEO',
|
|
29
|
+
description: 'ENKI LEXMAN E27 LED white filament 1055 lumen',
|
|
30
|
+
extend: extend.light_onoff_brightness_colortemp({colorTempRange: [153, 454]}),
|
|
31
|
+
},
|
|
25
32
|
{
|
|
26
33
|
zigbeeModel: ['ZBEK-4'],
|
|
27
34
|
model: 'IM-CDZDGAAA0005KA_MAN',
|
package/devices/centralite.js
CHANGED
|
@@ -72,6 +72,26 @@ module.exports = [
|
|
|
72
72
|
await reporting.activePower(endpoint, {change: 2}); // Power reports in 0.1W
|
|
73
73
|
},
|
|
74
74
|
},
|
|
75
|
+
{
|
|
76
|
+
zigbeeModel: ['4256050-RZHAC'],
|
|
77
|
+
model: '4256050-RZHAC',
|
|
78
|
+
vendor: 'Centralite',
|
|
79
|
+
description: '3-Series smart outlet appliance module',
|
|
80
|
+
fromZigbee: [fz.on_off, fz.electrical_measurement],
|
|
81
|
+
toZigbee: [tz.on_off],
|
|
82
|
+
exposes: [e.switch(), e.power(), e.voltage(), e.current()],
|
|
83
|
+
configure: async (device, coordinatorEndpoint, logger) => {
|
|
84
|
+
const endpoint = device.getEndpoint(1);
|
|
85
|
+
await reporting.bind(endpoint, coordinatorEndpoint, ['genOnOff', 'haElectricalMeasurement']);
|
|
86
|
+
await reporting.onOff(endpoint);
|
|
87
|
+
// 4256050-RZHAC doesn't support reading 'acVoltageMultiplier' or 'acVoltageDivisor'
|
|
88
|
+
await endpoint.read('haElectricalMeasurement', ['acCurrentMultiplier', 'acCurrentDivisor']);
|
|
89
|
+
await endpoint.read('haElectricalMeasurement', ['acPowerMultiplier', 'acPowerDivisor']);
|
|
90
|
+
await reporting.rmsVoltage(endpoint, {change: 2}); // Voltage reports in V
|
|
91
|
+
await reporting.rmsCurrent(endpoint, {change: 10}); // Current reports in mA
|
|
92
|
+
await reporting.activePower(endpoint, {change: 2}); // Power reports in 0.1W
|
|
93
|
+
},
|
|
94
|
+
},
|
|
75
95
|
{
|
|
76
96
|
zigbeeModel: ['4257050-ZHAC'],
|
|
77
97
|
model: '4257050-ZHAC',
|
|
@@ -3,8 +3,11 @@ 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 constants = require('../lib/constants');
|
|
6
7
|
const e = exposes.presets;
|
|
7
8
|
const ea = exposes.access;
|
|
9
|
+
const {calibrateAndPrecisionRoundOptions} = require('../lib/utils');
|
|
10
|
+
|
|
8
11
|
|
|
9
12
|
const tzLocal = {
|
|
10
13
|
node_config: {
|
|
@@ -21,6 +24,62 @@ const tzLocal = {
|
|
|
21
24
|
};
|
|
22
25
|
},
|
|
23
26
|
},
|
|
27
|
+
local_time: {
|
|
28
|
+
key: ['local_time'],
|
|
29
|
+
convertSet: async (entity, key, value, meta) => {
|
|
30
|
+
const firstEndpoint = meta.device.getEndpoint(1);
|
|
31
|
+
const time = Math.round(((new Date()).getTime() - constants.OneJanuary2000) / 1000 + ((new Date())
|
|
32
|
+
.getTimezoneOffset() * -1) * 60);
|
|
33
|
+
await firstEndpoint.write('genTime', {time: time});
|
|
34
|
+
return {state: {local_time: time}};
|
|
35
|
+
},
|
|
36
|
+
},
|
|
37
|
+
co2_config: {
|
|
38
|
+
key: ['auto_brightness', 'forced_recalibration', 'factory_reset_co2', 'long_chart_period', 'set_altitude',
|
|
39
|
+
'manual_forced_recalibration'],
|
|
40
|
+
convertSet: async (entity, key, rawValue, meta) => {
|
|
41
|
+
const lookup = {'OFF': 0x00, 'ON': 0x01};
|
|
42
|
+
const value = lookup.hasOwnProperty(rawValue) ? lookup[rawValue] : parseInt(rawValue, 10);
|
|
43
|
+
const payloads = {
|
|
44
|
+
auto_brightness: ['msCO2', {0x0203: {value, type: 0x10}}],
|
|
45
|
+
forced_recalibration: ['msCO2', {0x0202: {value, type: 0x10}}],
|
|
46
|
+
factory_reset_co2: ['msCO2', {0x0206: {value, type: 0x10}}],
|
|
47
|
+
long_chart_period: ['msCO2', {0x0204: {value, type: 0x10}}],
|
|
48
|
+
set_altitude: ['msCO2', {0x0205: {value, type: 0x21}}],
|
|
49
|
+
manual_forced_recalibration: ['msCO2', {0x0207: {value, type: 0x21}}],
|
|
50
|
+
};
|
|
51
|
+
await entity.write(payloads[key][0], payloads[key][1]);
|
|
52
|
+
return {
|
|
53
|
+
state: {[key]: rawValue},
|
|
54
|
+
};
|
|
55
|
+
},
|
|
56
|
+
},
|
|
57
|
+
temperature_config: {
|
|
58
|
+
key: ['temperature_offset'],
|
|
59
|
+
convertSet: async (entity, key, rawValue, meta) => {
|
|
60
|
+
const value = parseInt(rawValue, 10);
|
|
61
|
+
const payloads = {
|
|
62
|
+
temperature_offset: ['msTemperatureMeasurement', {0x0210: {value, type: 0x29}}],
|
|
63
|
+
};
|
|
64
|
+
await entity.write(payloads[key][0], payloads[key][1]);
|
|
65
|
+
return {
|
|
66
|
+
state: {[key]: rawValue},
|
|
67
|
+
};
|
|
68
|
+
},
|
|
69
|
+
},
|
|
70
|
+
humidity_config: {
|
|
71
|
+
key: ['humidity_offset'],
|
|
72
|
+
convertSet: async (entity, key, rawValue, meta) => {
|
|
73
|
+
const value = parseInt(rawValue, 10);
|
|
74
|
+
const payloads = {
|
|
75
|
+
humidity_offset: ['msRelativeHumidity', {0x0210: {value, type: 0x29}}],
|
|
76
|
+
};
|
|
77
|
+
await entity.write(payloads[key][0], payloads[key][1]);
|
|
78
|
+
return {
|
|
79
|
+
state: {[key]: rawValue},
|
|
80
|
+
};
|
|
81
|
+
},
|
|
82
|
+
},
|
|
24
83
|
};
|
|
25
84
|
|
|
26
85
|
const fzLocal = {
|
|
@@ -35,6 +94,64 @@ const fzLocal = {
|
|
|
35
94
|
return result;
|
|
36
95
|
},
|
|
37
96
|
},
|
|
97
|
+
co2: {
|
|
98
|
+
cluster: 'msCO2',
|
|
99
|
+
type: ['attributeReport', 'readResponse'],
|
|
100
|
+
convert: (model, msg, publish, options, meta) => {
|
|
101
|
+
if (msg.data.hasOwnProperty('measuredValue')) {
|
|
102
|
+
const co2 = msg.data['measuredValue'];
|
|
103
|
+
return {co2: calibrateAndPrecisionRoundOptions(co2, options, 'co2')};
|
|
104
|
+
}
|
|
105
|
+
},
|
|
106
|
+
},
|
|
107
|
+
co2_config: {
|
|
108
|
+
cluster: 'msCO2',
|
|
109
|
+
type: ['attributeReport', 'readResponse'],
|
|
110
|
+
convert: (model, msg, publish, options, meta) => {
|
|
111
|
+
const result = {};
|
|
112
|
+
if (msg.data.hasOwnProperty(0x0203)) {
|
|
113
|
+
result.auto_brightness = ['OFF', 'ON'][msg.data[0x0203]];
|
|
114
|
+
}
|
|
115
|
+
if (msg.data.hasOwnProperty(0x0202)) {
|
|
116
|
+
result.forced_recalibration = ['OFF', 'ON'][msg.data[0x0202]];
|
|
117
|
+
}
|
|
118
|
+
if (msg.data.hasOwnProperty(0x0206)) {
|
|
119
|
+
result.factory_reset_co2 = ['OFF', 'ON'][msg.data[0x0206]];
|
|
120
|
+
}
|
|
121
|
+
if (msg.data.hasOwnProperty(0x0204)) {
|
|
122
|
+
result.long_chart_period = ['OFF', 'ON'][msg.data[0x0204]];
|
|
123
|
+
}
|
|
124
|
+
if (msg.data.hasOwnProperty(0x0205)) {
|
|
125
|
+
result.set_altitude = msg.data[0x0205];
|
|
126
|
+
}
|
|
127
|
+
if (msg.data.hasOwnProperty(0x0207)) {
|
|
128
|
+
result.manual_forced_recalibration = msg.data[0x0207];
|
|
129
|
+
}
|
|
130
|
+
return result;
|
|
131
|
+
},
|
|
132
|
+
},
|
|
133
|
+
temperature_config: {
|
|
134
|
+
cluster: 'msTemperatureMeasurement',
|
|
135
|
+
type: 'readResponse',
|
|
136
|
+
convert: (model, msg, publish, options, meta) => {
|
|
137
|
+
const result = {};
|
|
138
|
+
if (msg.data.hasOwnProperty(0x0210)) {
|
|
139
|
+
result.temperature_offset = msg.data[0x0210];
|
|
140
|
+
}
|
|
141
|
+
return result;
|
|
142
|
+
},
|
|
143
|
+
},
|
|
144
|
+
humidity_config: {
|
|
145
|
+
cluster: 'msRelativeHumidity',
|
|
146
|
+
type: 'readResponse',
|
|
147
|
+
convert: (model, msg, publish, options, meta) => {
|
|
148
|
+
const result = {};
|
|
149
|
+
if (msg.data.hasOwnProperty(0x0210)) {
|
|
150
|
+
result.humidity_offset = msg.data[0x0210];
|
|
151
|
+
}
|
|
152
|
+
return result;
|
|
153
|
+
},
|
|
154
|
+
},
|
|
38
155
|
};
|
|
39
156
|
|
|
40
157
|
module.exports = [
|
|
@@ -444,4 +561,64 @@ module.exports = [
|
|
|
444
561
|
},
|
|
445
562
|
exposes: [e.battery(), e.temperature(), e.humidity()],
|
|
446
563
|
},
|
|
564
|
+
{
|
|
565
|
+
zigbeeModel: ['EFEKTA_iAQ'],
|
|
566
|
+
model: 'EFEKTA_iAQ',
|
|
567
|
+
vendor: 'Custom devices (DiY)',
|
|
568
|
+
description: '[CO2 Monitor with IPS TFT Display, outdoor temperature and humidity, date and time](http://efektalab.com/iAQ)',
|
|
569
|
+
fromZigbee: [fz.temperature, fz.humidity, fz.illuminance, fzLocal.co2, fzLocal.co2_config,
|
|
570
|
+
fzLocal.temperature_config, fzLocal.humidity_config],
|
|
571
|
+
toZigbee: [tz.factory_reset, tzLocal.co2_config, tzLocal.temperature_config, tzLocal.humidity_config, tzLocal.local_time],
|
|
572
|
+
configure: async (device, coordinatorEndpoint, logger) => {
|
|
573
|
+
const endpoint = device.getEndpoint(1);
|
|
574
|
+
const clusters = ['msTemperatureMeasurement', 'msRelativeHumidity', 'msIlluminanceMeasurement', 'msCO2'];
|
|
575
|
+
await reporting.bind(endpoint, coordinatorEndpoint, clusters);
|
|
576
|
+
for (const cluster of clusters) {
|
|
577
|
+
await endpoint.configureReporting(cluster, [
|
|
578
|
+
{attribute: 'measuredValue', minimumReportInterval: 0, maximumReportInterval: 3600, reportableChange: 0},
|
|
579
|
+
]);
|
|
580
|
+
}
|
|
581
|
+
const payload1 = [{attribute: {ID: 0x0203, type: 0x10},
|
|
582
|
+
minimumReportInterval: 0, maximumReportInterval: 3600, reportableChange: 0}];
|
|
583
|
+
await endpoint.configureReporting('msCO2', payload1);
|
|
584
|
+
const payload2 = [{attribute: {ID: 0x0202, type: 0x10},
|
|
585
|
+
minimumReportInterval: 0, maximumReportInterval: 3600, reportableChange: 0}];
|
|
586
|
+
await endpoint.configureReporting('msCO2', payload2);
|
|
587
|
+
const payload3 = [{attribute: {ID: 0x0204, type: 0x10},
|
|
588
|
+
minimumReportInterval: 0, maximumReportInterval: 3600, reportableChange: 0}];
|
|
589
|
+
await endpoint.configureReporting('msCO2', payload3);
|
|
590
|
+
const payload4 = [{attribute: {ID: 0x0205, type: 0x21},
|
|
591
|
+
minimumReportInterval: 0, maximumReportInterval: 3600, reportableChange: 0}];
|
|
592
|
+
await endpoint.configureReporting('msCO2', payload4);
|
|
593
|
+
const payload5 = [{attribute: {ID: 0x0206, type: 0x10},
|
|
594
|
+
minimumReportInterval: 0, maximumReportInterval: 3600, reportableChange: 0}];
|
|
595
|
+
await endpoint.configureReporting('msCO2', payload5);
|
|
596
|
+
const payload6 = [{attribute: {ID: 0x0207, type: 0x21},
|
|
597
|
+
minimumReportInterval: 0, maximumReportInterval: 3600, reportableChange: 0}];
|
|
598
|
+
await endpoint.configureReporting('msCO2', payload6);
|
|
599
|
+
const time = Math.round(((new Date()).getTime() - constants.OneJanuary2000) / 1000 + ((new Date())
|
|
600
|
+
.getTimezoneOffset() * -1) * 60);
|
|
601
|
+
const values = {time: time};
|
|
602
|
+
endpoint.write('genTime', values);
|
|
603
|
+
},
|
|
604
|
+
exposes: [e.co2(), e.temperature(), e.humidity(), e.illuminance(),
|
|
605
|
+
exposes.binary('auto_brightness', ea.STATE_SET, 'ON', 'OFF')
|
|
606
|
+
.withDescription('Enable or Disable Auto Brightness of the Display'),
|
|
607
|
+
exposes.binary('long_chart_period', ea.STATE_SET, 'ON', 'OFF')
|
|
608
|
+
.withDescription('The period of plotting the CO2 level(OFF - 1H | ON - 24H)'),
|
|
609
|
+
exposes.numeric('set_altitude', ea.STATE_SET).withUnit('meters')
|
|
610
|
+
.withDescription('Setting the altitude above sea level (for high accuracy of the CO2 sensor)')
|
|
611
|
+
.withValueMin(0).withValueMax(3000),
|
|
612
|
+
exposes.enum('local_time', ea.STATE_SET, ['set']).withDescription('Set date and time'),
|
|
613
|
+
exposes.numeric('temperature_offset', ea.STATE_SET).withUnit('°C').withDescription('Adjust temperature')
|
|
614
|
+
.withValueMin(-30).withValueMax(60),
|
|
615
|
+
exposes.numeric('humidity_offset', ea.STATE_SET).withUnit('%').withDescription('Adjust humidity')
|
|
616
|
+
.withValueMin(0).withValueMax(99),
|
|
617
|
+
exposes.binary('forced_recalibration', ea.STATE_SET, 'ON', 'OFF')
|
|
618
|
+
.withDescription('Start FRC (Perform Forced Recalibration of the CO2 Sensor)'),
|
|
619
|
+
exposes.binary('factory_reset_co2', ea.STATE_SET, 'ON', 'OFF').withDescription('Factory Reset CO2 sensor'),
|
|
620
|
+
exposes.numeric('manual_forced_recalibration', ea.STATE_SET).withUnit('ppm')
|
|
621
|
+
.withDescription('Start Manual FRC (Perform Forced Recalibration of the CO2 Sensor)')
|
|
622
|
+
.withValueMin(0).withValueMax(5000)],
|
|
623
|
+
},
|
|
447
624
|
];
|
package/devices/gledopto.js
CHANGED
|
@@ -348,7 +348,7 @@ module.exports = [
|
|
|
348
348
|
model: 'GL-S-004Z',
|
|
349
349
|
vendor: 'Gledopto',
|
|
350
350
|
description: 'Zigbee 4W MR16 Bulb 30deg RGB+CCT',
|
|
351
|
-
extend: gledoptoExtend.light_onoff_brightness_colortemp_color(),
|
|
351
|
+
extend: gledoptoExtend.light_onoff_brightness_colortemp_color({disableColorTempStartup: false, colorTempRange: [155, 495]}),
|
|
352
352
|
},
|
|
353
353
|
{
|
|
354
354
|
zigbeeModel: ['GL-S-005Z'],
|
|
@@ -537,6 +537,7 @@ module.exports = [
|
|
|
537
537
|
zigbeeModel: ['GL-D-006P'],
|
|
538
538
|
model: 'GL-D-006P',
|
|
539
539
|
vendor: 'Gledopto',
|
|
540
|
+
ota: ota.zigbeeOTA,
|
|
540
541
|
description: 'Zigbee 6W anti-glare downlight RGB+CCT (pro)',
|
|
541
542
|
extend: gledoptoExtend.light_onoff_brightness_colortemp_color({colorTempRange: [158, 495]}),
|
|
542
543
|
},
|
package/devices/immax.js
CHANGED
|
@@ -8,6 +8,16 @@ const e = exposes.presets;
|
|
|
8
8
|
const ea = exposes.access;
|
|
9
9
|
|
|
10
10
|
module.exports = [
|
|
11
|
+
{
|
|
12
|
+
|
|
13
|
+
zigbeeModel: ['Motion-Sensor-ZB3.0'],
|
|
14
|
+
model: '07043M',
|
|
15
|
+
vendor: 'Immax',
|
|
16
|
+
description: 'Motion sensor',
|
|
17
|
+
fromZigbee: [fz.ias_occupancy_alarm_1, fz.battery],
|
|
18
|
+
toZigbee: [],
|
|
19
|
+
exposes: [e.occupancy(), e.battery_low(), e.tamper(), e.battery()],
|
|
20
|
+
},
|
|
11
21
|
{
|
|
12
22
|
zigbeeModel: ['ZBT-CCTfilament-D0000'],
|
|
13
23
|
model: '07089L',
|
package/devices/ledvance.js
CHANGED
|
@@ -139,7 +139,7 @@ module.exports = [
|
|
|
139
139
|
zigbeeModel: ['Tibea TW Z3'],
|
|
140
140
|
model: '4058075168572',
|
|
141
141
|
vendor: 'LEDVANCE',
|
|
142
|
-
description: 'SMART+ lamp E27
|
|
142
|
+
description: 'SMART+ lamp E27 tuneable white',
|
|
143
143
|
extend: extend.ledvance.light_onoff_brightness_colortemp({colorTempRange: [153, 370]}),
|
|
144
144
|
ota: ota.ledvance,
|
|
145
145
|
},
|
|
@@ -151,4 +151,12 @@ module.exports = [
|
|
|
151
151
|
extend: extend.ledvance.light_onoff_brightness_colortemp({colorTempRange: [153, 370]}),
|
|
152
152
|
ota: ota.ledvance,
|
|
153
153
|
},
|
|
154
|
+
{
|
|
155
|
+
zigbeeModel: ['CLA60 RGBW JP'],
|
|
156
|
+
model: 'SMARTZBA60RGBW',
|
|
157
|
+
vendor: 'LEDVANCE',
|
|
158
|
+
description: 'SMART+ lamp E26 RGBW',
|
|
159
|
+
extend: extend.ledvance.light_onoff_brightness_colortemp_color({colorTempRange: [153, 526]}),
|
|
160
|
+
ota: ota.ledvance,
|
|
161
|
+
},
|
|
154
162
|
];
|
package/devices/lellki.js
CHANGED
|
@@ -42,7 +42,7 @@ module.exports = [
|
|
|
42
42
|
const endpoint = device.getEndpoint(1);
|
|
43
43
|
await reporting.bind(endpoint, coordinatorEndpoint, ['genOnOff']);
|
|
44
44
|
},
|
|
45
|
-
exposes: [e.switch(), exposes.enum('power_outage_memory', ea.
|
|
45
|
+
exposes: [e.switch(), exposes.enum('power_outage_memory', ea.ALL, ['on', 'off', 'restore'])
|
|
46
46
|
.withDescription('Recover state after power outage')],
|
|
47
47
|
},
|
|
48
48
|
{
|
|
@@ -102,7 +102,7 @@ module.exports = [
|
|
|
102
102
|
},
|
|
103
103
|
options: [exposes.options.measurement_poll_interval()],
|
|
104
104
|
exposes: [e.switch(), e.power(), e.current(), e.voltage().withAccess(ea.STATE),
|
|
105
|
-
e.energy(), exposes.enum('power_outage_memory', ea.
|
|
105
|
+
e.energy(), exposes.enum('power_outage_memory', ea.ALL, ['on', 'off', 'restore'])
|
|
106
106
|
.withDescription('Recover state after power outage')],
|
|
107
107
|
onEvent: tuya.onEventMeasurementPoll,
|
|
108
108
|
},
|
|
@@ -122,7 +122,7 @@ module.exports = [
|
|
|
122
122
|
},
|
|
123
123
|
options: [exposes.options.measurement_poll_interval()],
|
|
124
124
|
exposes: [e.switch(), e.power(), e.current(), e.voltage().withAccess(ea.STATE),
|
|
125
|
-
e.energy(), exposes.enum('power_outage_memory', ea.
|
|
125
|
+
e.energy(), exposes.enum('power_outage_memory', ea.ALL, ['on', 'off', 'restore'])
|
|
126
126
|
.withDescription('Recover state after power outage')],
|
|
127
127
|
onEvent: tuya.onEventMeasurementPoll,
|
|
128
128
|
},
|
|
@@ -146,7 +146,7 @@ module.exports = [
|
|
|
146
146
|
options: [exposes.options.measurement_poll_interval()],
|
|
147
147
|
exposes: [e.switch().withEndpoint('l1'), e.switch().withEndpoint('l2'),
|
|
148
148
|
e.switch().withEndpoint('l3'), e.power(), e.current(), e.voltage().withAccess(ea.STATE),
|
|
149
|
-
e.energy(), exposes.enum('power_outage_memory', ea.
|
|
149
|
+
e.energy(), exposes.enum('power_outage_memory', ea.ALL, ['on', 'off', 'restore'])
|
|
150
150
|
.withDescription('Recover state after power outage')],
|
|
151
151
|
endpoint: (device) => {
|
|
152
152
|
return {l1: 1, l2: 2, l3: 3};
|
package/devices/linkind.js
CHANGED
|
@@ -68,12 +68,19 @@ module.exports = [
|
|
|
68
68
|
extend: extend.light_onoff_brightness_colortemp({colorTempRange: [153, 370]}),
|
|
69
69
|
},
|
|
70
70
|
{
|
|
71
|
-
zigbeeModel: ['ZBT-CCTLight-C4700107'
|
|
71
|
+
zigbeeModel: ['ZBT-CCTLight-C4700107'],
|
|
72
72
|
model: 'ZL1000400-CCT-EU-2-V1A02',
|
|
73
73
|
vendor: 'Linkind',
|
|
74
74
|
description: 'Zigbee LED 5.4W C35 bulb E14, dimmable & tunable',
|
|
75
75
|
extend: extend.light_onoff_brightness_colortemp(),
|
|
76
76
|
},
|
|
77
|
+
{
|
|
78
|
+
zigbeeModel: ['ZBT-CCTLight-M3500107'],
|
|
79
|
+
model: 'ZL00030014',
|
|
80
|
+
vendor: 'Linkind',
|
|
81
|
+
description: 'Zigbee LED 4.8W GU10 bulb, dimmable & tunable',
|
|
82
|
+
extend: extend.light_onoff_brightness_colortemp({colorTempRange: [153, 370]}),
|
|
83
|
+
},
|
|
77
84
|
{
|
|
78
85
|
zigbeeModel: ['ZBT-CCTLight-BR300107'],
|
|
79
86
|
model: 'ZL100050004',
|
package/devices/lonsonho.js
CHANGED
|
@@ -267,7 +267,7 @@ module.exports = [
|
|
|
267
267
|
exposes: [
|
|
268
268
|
e.light_brightness().withEndpoint('l1'),
|
|
269
269
|
e.light_brightness().withEndpoint('l2'),
|
|
270
|
-
exposes.enum('power_outage_memory', ea.
|
|
270
|
+
exposes.enum('power_outage_memory', ea.ALL, ['on', 'off', 'restore']).withDescription('Recover state after power outage')
|
|
271
271
|
.withEndpoint('l1'),
|
|
272
272
|
exposes.presets.switch_type_2().withEndpoint('l1'),
|
|
273
273
|
exposes.presets.switch_type_2().withEndpoint('l2'),
|
package/devices/moes.js
CHANGED
|
@@ -22,7 +22,7 @@ module.exports = [
|
|
|
22
22
|
fromZigbee: [fz.on_off, fz.tuya_switch_power_outage_memory, fz.ts011f_plug_child_mode],
|
|
23
23
|
toZigbee: [tz.on_off, tz.tuya_switch_power_outage_memory, tz.ts011f_plug_child_mode],
|
|
24
24
|
exposes: [e.switch().withEndpoint('l1'), e.switch().withEndpoint('l2'),
|
|
25
|
-
exposes.enum('power_outage_memory', ea.
|
|
25
|
+
exposes.enum('power_outage_memory', ea.ALL, ['on', 'off', 'restore'])
|
|
26
26
|
.withDescription('Recover state after power outage'), e.child_lock()],
|
|
27
27
|
endpoint: (device) => {
|
|
28
28
|
return {'l1': 1, 'l2': 2};
|
package/devices/owon.js
CHANGED
package/devices/philips.js
CHANGED
|
@@ -55,6 +55,13 @@ module.exports = [
|
|
|
55
55
|
description: 'Hue White and Color Ambiance GU10 (Centura)',
|
|
56
56
|
extend: hueExtend.light_onoff_brightness_colortemp_color({colorTempRange: [153, 500]}),
|
|
57
57
|
},
|
|
58
|
+
{
|
|
59
|
+
zigbeeModel: ['929003045201_01', '929003045201_02', '929003045201_03'],
|
|
60
|
+
model: '929003045201',
|
|
61
|
+
vendor: 'Philips',
|
|
62
|
+
description: 'Hue White and Color Ambiance GU10 (Centura round white)',
|
|
63
|
+
extend: hueExtend.light_onoff_brightness_colortemp_color({colorTempRange: [153, 500]}),
|
|
64
|
+
},
|
|
58
65
|
{
|
|
59
66
|
zigbeeModel: ['929003047401'],
|
|
60
67
|
model: '929003047401',
|
|
@@ -426,6 +433,13 @@ module.exports = [
|
|
|
426
433
|
description: 'Hue Calla outdoor',
|
|
427
434
|
extend: hueExtend.light_onoff_brightness_colortemp_color({colorTempRange: [153, 500]}),
|
|
428
435
|
},
|
|
436
|
+
{
|
|
437
|
+
zigbeeModel: ['929003098601'],
|
|
438
|
+
model: '929003098601',
|
|
439
|
+
vendor: 'Philips',
|
|
440
|
+
description: 'Hue Calla outdoor Pedestal',
|
|
441
|
+
extend: hueExtend.light_onoff_brightness_colortemp_color({colorTempRange: [153, 500]}),
|
|
442
|
+
},
|
|
429
443
|
{
|
|
430
444
|
zigbeeModel: ['1742330P7'],
|
|
431
445
|
model: '1742330P7',
|
|
@@ -2427,6 +2441,13 @@ module.exports = [
|
|
|
2427
2441
|
description: 'Akari downlight',
|
|
2428
2442
|
extend: hueExtend.light_onoff_brightness_colortemp_color({colorTempRange: [153, 500]}),
|
|
2429
2443
|
},
|
|
2444
|
+
{
|
|
2445
|
+
zigbeeModel: ['LCD006'],
|
|
2446
|
+
model: '9290031346',
|
|
2447
|
+
vendor: 'Philips',
|
|
2448
|
+
description: 'Hue white and color ambiance 5/6" retrofit recessed downlight',
|
|
2449
|
+
extend: hueExtend.light_onoff_brightness_colortemp_color({colorTempRange: [153, 500]}),
|
|
2450
|
+
},
|
|
2430
2451
|
{
|
|
2431
2452
|
zigbeeModel: ['LWE004'],
|
|
2432
2453
|
model: '8719514302235',
|
package/devices/tuya.js
CHANGED
|
@@ -319,13 +319,22 @@ module.exports = [
|
|
|
319
319
|
},
|
|
320
320
|
{
|
|
321
321
|
fingerprint: [{modelID: 'TS0601', manufacturerName: '_TZE200_bq5c8xfe'},
|
|
322
|
-
{modelID: 'TS0601', manufacturerName: '_TZE200_bjawzodf'}
|
|
322
|
+
{modelID: 'TS0601', manufacturerName: '_TZE200_bjawzodf'},
|
|
323
|
+
{modelID: 'TS0601', manufacturerName: '_TZE200_qyflbnbj'}],
|
|
323
324
|
model: 'TS0601_temperature_humidity_sensor',
|
|
324
325
|
vendor: 'TuYa',
|
|
325
326
|
description: 'Temperature & humidity sensor',
|
|
326
327
|
fromZigbee: [fz.tuya_temperature_humidity_sensor],
|
|
327
328
|
toZigbee: [],
|
|
328
|
-
exposes:
|
|
329
|
+
exposes: (device, options) => {
|
|
330
|
+
const exps = [e.temperature(), e.humidity(), e.battery()];
|
|
331
|
+
if (!device || device.manufacturerName === '_TZE200_qyflbnbj') {
|
|
332
|
+
exps.push(e.battery_low());
|
|
333
|
+
exps.push(exposes.enum('battery_level', ea.STATE, ['low', 'middle', 'high']).withDescription('Battery level state'));
|
|
334
|
+
}
|
|
335
|
+
exps.push(e.linkquality());
|
|
336
|
+
return exps;
|
|
337
|
+
},
|
|
329
338
|
},
|
|
330
339
|
{
|
|
331
340
|
fingerprint: [{modelID: 'TS0601', manufacturerName: '_TZE200_vzqtvljm'}],
|
|
@@ -431,7 +440,13 @@ module.exports = [
|
|
|
431
440
|
model: 'ZN231392',
|
|
432
441
|
vendor: 'TuYa',
|
|
433
442
|
description: 'Smart water/gas valve',
|
|
434
|
-
|
|
443
|
+
fromZigbee: extend.switch().fromZigbee.concat([fz.moes_power_on_behavior]),
|
|
444
|
+
toZigbee: extend.switch().toZigbee.concat([tz.moes_power_on_behavior]),
|
|
445
|
+
exposes: extend.switch().exposes.concat([e.power_on_behavior()]),
|
|
446
|
+
configure: async (device, coordinatorEndpoint, logger) => {
|
|
447
|
+
const endpoint = device.getEndpoint(1);
|
|
448
|
+
await endpoint.read('genOnOff', ['onOff', 'moesStartUpOnOff']);
|
|
449
|
+
},
|
|
435
450
|
},
|
|
436
451
|
{
|
|
437
452
|
fingerprint: [{modelID: 'TS011F', manufacturerName: '_TZ3000_1hwjutgo'}, {modelID: 'TS011F', manufacturerName: '_TZ3000_lnggrqqi'}],
|
|
@@ -483,7 +498,8 @@ module.exports = [
|
|
|
483
498
|
{modelID: 'TS0505B', manufacturerName: '_TZ3210_s6zec0of'},
|
|
484
499
|
{modelID: 'TS0505B', manufacturerName: '_TZ3210_y5fjkn7x'},
|
|
485
500
|
{modelID: 'TS0505B', manufacturerName: '_TZ3210_cuqkfz2q'},
|
|
486
|
-
{modelID: 'TS0505B', manufacturerName: '_TZ3210_6amjviba'}
|
|
501
|
+
{modelID: 'TS0505B', manufacturerName: '_TZ3210_6amjviba'},
|
|
502
|
+
{modelID: 'TS0505B', manufacturerName: '_TZ3000_xr5m6kfg'}],
|
|
487
503
|
model: 'TS0505B',
|
|
488
504
|
vendor: 'TuYa',
|
|
489
505
|
description: 'Zigbee RGB+CCT light',
|
|
@@ -736,7 +752,8 @@ module.exports = [
|
|
|
736
752
|
const endpoint = device.getEndpoint(1);
|
|
737
753
|
await reporting.bind(endpoint, coordinatorEndpoint, ['genBasic']);
|
|
738
754
|
},
|
|
739
|
-
exposes: [e.battery(), e.illuminance_lux(), e.
|
|
755
|
+
exposes: [e.battery(), e.illuminance_lux(), e.linkquality(),
|
|
756
|
+
exposes.enum('brightness_level', ea.STATE, ['LOW', 'MEDIUM', 'HIGH'])],
|
|
740
757
|
},
|
|
741
758
|
{
|
|
742
759
|
zigbeeModel: ['TS130F'],
|
|
@@ -1548,8 +1565,9 @@ module.exports = [
|
|
|
1548
1565
|
description: '10A UK or 16A EU smart plug',
|
|
1549
1566
|
whiteLabel: [{vendor: 'BlitzWolf', model: 'BW-SHP13'}],
|
|
1550
1567
|
vendor: 'TuYa',
|
|
1551
|
-
fromZigbee: [fz.on_off, fz.electrical_measurement, fz.metering, fz.ignore_basic_report, fz.tuya_switch_power_outage_memory
|
|
1552
|
-
|
|
1568
|
+
fromZigbee: [fz.on_off, fz.electrical_measurement, fz.metering, fz.ignore_basic_report, fz.tuya_switch_power_outage_memory,
|
|
1569
|
+
fz.ts011f_plug_indicator_mode],
|
|
1570
|
+
toZigbee: [tz.on_off, tz.tuya_switch_power_outage_memory, tz.ts011f_plug_indicator_mode],
|
|
1553
1571
|
configure: async (device, coordinatorEndpoint, logger) => {
|
|
1554
1572
|
const endpoint = device.getEndpoint(1);
|
|
1555
1573
|
await reporting.bind(endpoint, coordinatorEndpoint, ['genOnOff', 'haElectricalMeasurement', 'seMetering']);
|
|
@@ -1561,21 +1579,31 @@ module.exports = [
|
|
|
1561
1579
|
try {
|
|
1562
1580
|
await reporting.currentSummDelivered(endpoint);
|
|
1563
1581
|
} catch (error) {/* fails for some https://github.com/Koenkk/zigbee2mqtt/issues/11179 */}
|
|
1582
|
+
await endpoint.read('genOnOff', ['onOff', 'moesStartUpOnOff', 'tuyaBacklightMode']);
|
|
1564
1583
|
},
|
|
1565
1584
|
options: [exposes.options.measurement_poll_interval()],
|
|
1566
1585
|
// This device doesn't support reporting correctly.
|
|
1567
1586
|
// https://github.com/Koenkk/zigbee-herdsman-converters/pull/1270
|
|
1568
1587
|
exposes: [e.switch(), e.power(), e.current(), e.voltage().withAccess(ea.STATE),
|
|
1569
|
-
e.energy(), exposes.enum('power_outage_memory', ea.
|
|
1570
|
-
.withDescription('Recover state after power outage')
|
|
1588
|
+
e.energy(), exposes.enum('power_outage_memory', ea.ALL, ['on', 'off', 'restore'])
|
|
1589
|
+
.withDescription('Recover state after power outage'),
|
|
1590
|
+
exposes.enum('indicator_mode', ea.ALL, ['off', 'off/on', 'on/off']).withDescription('LED indicator mode')],
|
|
1571
1591
|
onEvent: tuya.onEventMeasurementPoll,
|
|
1572
1592
|
},
|
|
1573
1593
|
{
|
|
1574
1594
|
fingerprint: [{modelID: 'TS0111', manufacturerName: '_TYZB01_ymcdbl3u'}],
|
|
1575
1595
|
model: 'TS0111_valve',
|
|
1576
1596
|
vendor: 'TuYa',
|
|
1597
|
+
whiteLabel: [{vendor: 'TuYa', model: 'SM-AW713Z'}],
|
|
1577
1598
|
description: 'Smart water/gas valve',
|
|
1578
|
-
|
|
1599
|
+
fromZigbee: extend.switch().fromZigbee.concat([fz.moes_power_on_behavior, fz.ts011f_plug_indicator_mode]),
|
|
1600
|
+
toZigbee: extend.switch().toZigbee.concat([tz.moes_power_on_behavior, tz.ts011f_plug_indicator_mode]),
|
|
1601
|
+
exposes: extend.switch().exposes.concat([e.power_on_behavior(),
|
|
1602
|
+
exposes.enum('indicator_mode', ea.ALL, ['off', 'off/on', 'on/off', 'on']).withDescription('LED indicator mode')]),
|
|
1603
|
+
configure: async (device, coordinatorEndpoint, logger) => {
|
|
1604
|
+
const endpoint = device.getEndpoint(1);
|
|
1605
|
+
await endpoint.read('genOnOff', ['onOff', 'moesStartUpOnOff', 'tuyaBacklightMode']);
|
|
1606
|
+
},
|
|
1579
1607
|
},
|
|
1580
1608
|
{
|
|
1581
1609
|
fingerprint: TS011Fplugs.map((manufacturerName) => {
|
|
@@ -1604,7 +1632,7 @@ module.exports = [
|
|
|
1604
1632
|
device.save();
|
|
1605
1633
|
},
|
|
1606
1634
|
exposes: [e.switch(), e.power(), e.current(), e.voltage().withAccess(ea.STATE),
|
|
1607
|
-
e.energy(), exposes.enum('power_outage_memory', ea.
|
|
1635
|
+
e.energy(), exposes.enum('power_outage_memory', ea.ALL, ['on', 'off', 'restore'])
|
|
1608
1636
|
.withDescription('Recover state after power outage'),
|
|
1609
1637
|
exposes.enum('indicator_mode', ea.ALL, ['off', 'off/on', 'on/off', 'on'])
|
|
1610
1638
|
.withDescription('Plug LED indicator mode'), e.child_lock()],
|
|
@@ -1625,7 +1653,7 @@ module.exports = [
|
|
|
1625
1653
|
const endpoint = device.getEndpoint(1);
|
|
1626
1654
|
await reporting.bind(endpoint, coordinatorEndpoint, ['genOnOff']);
|
|
1627
1655
|
},
|
|
1628
|
-
exposes: [e.switch(), exposes.enum('power_outage_memory', ea.
|
|
1656
|
+
exposes: [e.switch(), exposes.enum('power_outage_memory', ea.ALL, ['on', 'off', 'restore'])
|
|
1629
1657
|
.withDescription('Recover state after power outage'),
|
|
1630
1658
|
exposes.enum('indicator_mode', ea.ALL, ['off', 'off/on', 'on/off', 'on'])
|
|
1631
1659
|
.withDescription('Plug LED indicator mode'), e.child_lock()],
|
|
@@ -1656,7 +1684,7 @@ module.exports = [
|
|
|
1656
1684
|
},
|
|
1657
1685
|
options: [exposes.options.measurement_poll_interval()],
|
|
1658
1686
|
exposes: [e.switch(), e.power(), e.current(), e.voltage().withAccess(ea.STATE),
|
|
1659
|
-
e.energy(), exposes.enum('power_outage_memory', ea.
|
|
1687
|
+
e.energy(), exposes.enum('power_outage_memory', ea.ALL, ['on', 'off', 'restore'])
|
|
1660
1688
|
.withDescription('Recover state after power outage'),
|
|
1661
1689
|
exposes.enum('indicator_mode', ea.ALL, ['off', 'off/on', 'on/off', 'on'])
|
|
1662
1690
|
.withDescription('Plug LED indicator mode'), e.child_lock()],
|
|
@@ -1838,7 +1866,9 @@ module.exports = [
|
|
|
1838
1866
|
},
|
|
1839
1867
|
},
|
|
1840
1868
|
{
|
|
1841
|
-
fingerprint: [{modelID: 'TS0012', manufacturerName: '_TZ3000_jl7qyupf'},
|
|
1869
|
+
fingerprint: [{modelID: 'TS0012', manufacturerName: '_TZ3000_jl7qyupf'},
|
|
1870
|
+
{modelID: 'TS0012', manufacturerName: '_TZ3000_nPGIPl5D'},
|
|
1871
|
+
{modelID: 'TS0012', manufacturerName: '_TZ3000_4zf0crgo'}],
|
|
1842
1872
|
model: 'TS0012_switch_module',
|
|
1843
1873
|
vendor: 'TuYa',
|
|
1844
1874
|
description: '2 gang switch module - (without neutral)',
|
|
@@ -2162,7 +2192,7 @@ module.exports = [
|
|
|
2162
2192
|
device.save();
|
|
2163
2193
|
},
|
|
2164
2194
|
exposes: [e.switch(), e.power(), e.current(), e.voltage().withAccess(ea.STATE),
|
|
2165
|
-
e.energy(), exposes.enum('power_outage_memory', ea.
|
|
2195
|
+
e.energy(), exposes.enum('power_outage_memory', ea.ALL, ['on', 'off', 'restore'])
|
|
2166
2196
|
.withDescription('Recover state after power outage'),
|
|
2167
2197
|
exposes.enum('indicator_mode', ea.STATE_SET, ['off', 'on_off', 'off_on'])
|
|
2168
2198
|
.withDescription('Relay LED indicator mode')],
|
|
@@ -2180,7 +2210,7 @@ module.exports = [
|
|
|
2180
2210
|
device.save();
|
|
2181
2211
|
},
|
|
2182
2212
|
exposes: [e.switch(),
|
|
2183
|
-
exposes.enum('power_outage_memory', ea.
|
|
2213
|
+
exposes.enum('power_outage_memory', ea.ALL, ['on', 'off', 'restore'])
|
|
2184
2214
|
.withDescription('Recover state after power outage'),
|
|
2185
2215
|
exposes.enum('indicator_mode', ea.STATE_SET, ['off', 'on_off', 'off_on'])
|
|
2186
2216
|
.withDescription('Relay LED indicator mode')],
|
package/devices/xiaomi.js
CHANGED
|
@@ -113,7 +113,21 @@ module.exports = [
|
|
|
113
113
|
model: 'ZNLDP13LM',
|
|
114
114
|
vendor: 'Xiaomi',
|
|
115
115
|
description: 'Aqara T1 smart LED bulb',
|
|
116
|
-
|
|
116
|
+
toZigbee: xiaomiExtend.light_onoff_brightness_colortemp({disableEffect: true, disablePowerOnBehavior: true}).toZigbee.concat([
|
|
117
|
+
tz.xiaomi_switch_power_outage_memory,
|
|
118
|
+
]),
|
|
119
|
+
fromZigbee: xiaomiExtend.light_onoff_brightness_colortemp({disableEffect: true, disablePowerOnBehavior: true}).fromZigbee.concat([
|
|
120
|
+
fz.aqara_opple,
|
|
121
|
+
]),
|
|
122
|
+
exposes: xiaomiExtend.light_onoff_brightness_colortemp({
|
|
123
|
+
disableEffect: true,
|
|
124
|
+
disablePowerOnBehavior: true,
|
|
125
|
+
colorTempRange: [153, 370],
|
|
126
|
+
}).exposes.concat([
|
|
127
|
+
e.power_outage_memory(),
|
|
128
|
+
e.device_temperature(),
|
|
129
|
+
e.power_outage_count(),
|
|
130
|
+
]),
|
|
117
131
|
ota: ota.zigbeeOTA,
|
|
118
132
|
},
|
|
119
133
|
{
|
package/devices/yale.js
CHANGED
|
@@ -10,7 +10,8 @@ const lockExtend = (meta) => {
|
|
|
10
10
|
fz.lock_user_status_response],
|
|
11
11
|
toZigbee: [tz.lock, tz.pincode_lock, tz.lock_userstatus],
|
|
12
12
|
meta: {pinCodeCount: 250, ...meta},
|
|
13
|
-
exposes: [e.lock(), e.battery(), e.pincode(), e.lock_action(), e.lock_action_source_name(), e.lock_action_source_user()
|
|
13
|
+
exposes: [e.lock(), e.battery(), e.pincode(), e.lock_action(), e.lock_action_source_name(), e.lock_action_source_user(),
|
|
14
|
+
e.lock_action_user()],
|
|
14
15
|
configure: async (device, coordinatorEndpoint, logger) => {
|
|
15
16
|
const endpoint = device.getEndpoint(1);
|
|
16
17
|
await reporting.bind(endpoint, coordinatorEndpoint, ['closuresDoorLock', 'genPowerCfg']);
|
package/devices/zemismart.js
CHANGED
|
@@ -137,7 +137,7 @@ module.exports = [
|
|
|
137
137
|
fromZigbee: [fz.on_off, fz.tuya_switch_power_outage_memory],
|
|
138
138
|
toZigbee: [tz.on_off, tz.tuya_switch_power_outage_memory],
|
|
139
139
|
exposes: [e.switch().withEndpoint('l1'), e.switch().withEndpoint('l2'),
|
|
140
|
-
exposes.enum('power_outage_memory', ea.
|
|
140
|
+
exposes.enum('power_outage_memory', ea.ALL, ['on', 'off', 'restore'])
|
|
141
141
|
.withDescription('Recover state after power outage')],
|
|
142
142
|
endpoint: (device) => {
|
|
143
143
|
return {'l1': 1, 'l2': 2};
|
package/lib/exposes.js
CHANGED
|
@@ -574,6 +574,7 @@ module.exports = {
|
|
|
574
574
|
lock_action: () => new Enum('action', access.STATE, ['unknown', 'lock', 'unlock', 'lock_failure_invalid_pin_or_id', 'lock_failure_invalid_schedule', 'unlock_failure_invalid_pin_or_id', 'unlock_failure_invalid_schedule', 'one_touch_lock', 'key_lock', 'key_unlock', 'auto_lock', 'schedule_lock', 'schedule_unlock', 'manual_lock', 'manual_unlock', 'non_access_user_operational_event']).withDescription('Triggered action on the lock'),
|
|
575
575
|
lock_action_source_name: () => new Enum('action_source_name', access.STATE, ['keypad', 'rfid', 'manual', 'rf']).withDescription('Source of the triggered action on the lock'),
|
|
576
576
|
lock_action_source_user: () => new Numeric('action_source_user', access.STATE).withDescription('ID of user that triggered the action on the lock'),
|
|
577
|
+
lock_action_user: () => new Numeric('action_user', access.STATE).withDescription('ID of user that triggered the action on the lock'),
|
|
577
578
|
max_temperature: () => new Numeric('max_temperature', access.STATE_SET).withUnit('°C').withDescription('Maximum temperature').withValueMin(15).withValueMax(35),
|
|
578
579
|
max_temperature_limit: () => new Numeric('max_temperature_limit', access.STATE_SET).withUnit('°C').withDescription('Maximum temperature limit').withValueMin(0).withValueMax(35),
|
|
579
580
|
min_temperature: () => new Numeric('min_temperature', access.STATE_SET).withUnit('°C').withDescription('Minimum temperature').withValueMin(1).withValueMax(15),
|
package/lib/tuya.js
CHANGED
|
@@ -626,6 +626,11 @@ const dataPoints = {
|
|
|
626
626
|
nousHumiAlarm: 15,
|
|
627
627
|
nousTempSensitivity: 19,
|
|
628
628
|
nousReportInterval: 17,
|
|
629
|
+
// TUYA Temperature and Humidity Sensor
|
|
630
|
+
tthTemperature: 1,
|
|
631
|
+
tthHumidity: 2,
|
|
632
|
+
tthBatteryLevel: 3,
|
|
633
|
+
tthBattery: 4,
|
|
629
634
|
// TUYA / HUMIDITY/ILLUMINANCE/TEMPERATURE SENSOR
|
|
630
635
|
thitBatteryPercentage: 3,
|
|
631
636
|
thitIlluminanceLux: 7,
|
package/lib/xiaomi.js
CHANGED
|
@@ -172,11 +172,25 @@ const numericAttributes2Payload = (msg, meta, model, options, dataObject) => {
|
|
|
172
172
|
case '5':
|
|
173
173
|
payload.power_outage_count = value - 1;
|
|
174
174
|
break;
|
|
175
|
+
case '8':
|
|
176
|
+
if (['ZNLDP13LM'].includes(model.model)) {
|
|
177
|
+
// We don't know what the value means for these devices.
|
|
178
|
+
}
|
|
179
|
+
break;
|
|
180
|
+
case '9':
|
|
181
|
+
if (['ZNLDP13LM'].includes(model.model)) {
|
|
182
|
+
// We don't know what the value means for these devices.
|
|
183
|
+
}
|
|
184
|
+
break;
|
|
175
185
|
case '10':
|
|
176
|
-
|
|
186
|
+
if (['ZNLDP13LM'].includes(model.model)) {
|
|
187
|
+
// We don't know what the value means for these devices.
|
|
188
|
+
} else {
|
|
189
|
+
payload.switch_type = {1: 'toggle', 2: 'momentary'}[value];
|
|
190
|
+
}
|
|
177
191
|
break;
|
|
178
192
|
case '11':
|
|
179
|
-
if (['JT-BZ-01AQ/A', 'QBKG25LM'].includes(model.model)) {
|
|
193
|
+
if (['JT-BZ-01AQ/A', 'QBKG25LM', 'ZNLDP13LM'].includes(model.model)) {
|
|
180
194
|
// We don't know what the value means for these devices.
|
|
181
195
|
// https://github.com/Koenkk/zigbee2mqtt/issues/12451
|
|
182
196
|
} else {
|
|
@@ -185,6 +199,11 @@ const numericAttributes2Payload = (msg, meta, model, options, dataObject) => {
|
|
|
185
199
|
payload.illuminance_lux = calibrateAndPrecisionRoundOptions(value, options, 'illuminance_lux');
|
|
186
200
|
}
|
|
187
201
|
break;
|
|
202
|
+
case '12':
|
|
203
|
+
if (['ZNLDP13LM'].includes(model.model)) {
|
|
204
|
+
// We don't know what the value means for these devices.
|
|
205
|
+
}
|
|
206
|
+
break;
|
|
188
207
|
case '100':
|
|
189
208
|
if (['QBKG20LM', 'QBKG31LM', 'QBKG39LM', 'QBKG41LM', 'QBCZ15LM', 'LLKZMK11LM', 'QBKG12LM', 'QBKG03LM', 'QBKG25LM']
|
|
190
209
|
.includes(model.model)) {
|
|
@@ -339,6 +358,11 @@ const numericAttributes2Payload = (msg, meta, model, options, dataObject) => {
|
|
|
339
358
|
payload.power = precisionRound(value, 2); // 0x98
|
|
340
359
|
}
|
|
341
360
|
break;
|
|
361
|
+
case '154':
|
|
362
|
+
if (['ZNLDP13LM'].includes(model.model)) {
|
|
363
|
+
// We don't know what the value means for these devices.
|
|
364
|
+
}
|
|
365
|
+
break;
|
|
342
366
|
case '159':
|
|
343
367
|
if (['JT-BZ-01AQ/A'].includes(model.model)) {
|
|
344
368
|
payload.gas_sensitivity = {1: '15%LEL', 2: '10%LEL'}[value];
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "zigbee-herdsman-converters",
|
|
3
|
-
"version": "14.0.
|
|
3
|
+
"version": "14.0.566",
|
|
4
4
|
"description": "Collection of device converters to be used with zigbee-herdsman",
|
|
5
5
|
"main": "index.js",
|
|
6
6
|
"files": [
|
|
@@ -38,7 +38,7 @@
|
|
|
38
38
|
"buffer-crc32": "^0.2.13",
|
|
39
39
|
"https-proxy-agent": "^5.0.1",
|
|
40
40
|
"tar-stream": "^2.2.0",
|
|
41
|
-
"zigbee-herdsman": "^0.14.
|
|
41
|
+
"zigbee-herdsman": "^0.14.42"
|
|
42
42
|
},
|
|
43
43
|
"devDependencies": {
|
|
44
44
|
"eslint": "*",
|