zigbee-herdsman-converters 14.0.562 → 14.0.565
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 +8 -3
- 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/hive.js +7 -0
- 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/philips.js +21 -0
- package/devices/tuya.js +47 -13
- package/devices/xiaomi.js +27 -5
- 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 +1 -1
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 ` +
|
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/hive.js
CHANGED
|
@@ -9,6 +9,13 @@ const e = exposes.presets;
|
|
|
9
9
|
const ea = exposes.access;
|
|
10
10
|
|
|
11
11
|
module.exports = [
|
|
12
|
+
{
|
|
13
|
+
zigbeeModel: ['FWGU10Bulb02UK'],
|
|
14
|
+
model: 'FWGU10Bulb02UK',
|
|
15
|
+
vendor: 'Hive',
|
|
16
|
+
description: 'GU10 warm white',
|
|
17
|
+
extend: extend.light_onoff_brightness(),
|
|
18
|
+
},
|
|
12
19
|
{
|
|
13
20
|
zigbeeModel: ['MOT003'],
|
|
14
21
|
model: 'MOT003',
|
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/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'}],
|
|
@@ -441,6 +456,14 @@ module.exports = [
|
|
|
441
456
|
extend: extend.switch(),
|
|
442
457
|
whiteLabel: [{vendor: 'Mumubiz', model: 'ZJSB9-80Z'}],
|
|
443
458
|
},
|
|
459
|
+
{
|
|
460
|
+
fingerprint: [{modelID: 'TS011F', manufacturerName: '_TZ3000_8fdayfch'}],
|
|
461
|
+
model: 'TS011F_relay_switch',
|
|
462
|
+
vendor: 'TuYa',
|
|
463
|
+
description: 'Dry contact relay switch',
|
|
464
|
+
extend: extend.switch(),
|
|
465
|
+
whiteLabel: [{vendor: 'KTNNKG', model: 'ZB1248-10A'}],
|
|
466
|
+
},
|
|
444
467
|
{
|
|
445
468
|
fingerprint: [{modelID: 'TS0505B', manufacturerName: '_TZ3000_qqjaziws'},
|
|
446
469
|
{modelID: 'TS0505B', manufacturerName: '_TZ3000_jtmhndw2'},
|
|
@@ -1540,8 +1563,9 @@ module.exports = [
|
|
|
1540
1563
|
description: '10A UK or 16A EU smart plug',
|
|
1541
1564
|
whiteLabel: [{vendor: 'BlitzWolf', model: 'BW-SHP13'}],
|
|
1542
1565
|
vendor: 'TuYa',
|
|
1543
|
-
fromZigbee: [fz.on_off, fz.electrical_measurement, fz.metering, fz.ignore_basic_report, fz.tuya_switch_power_outage_memory
|
|
1544
|
-
|
|
1566
|
+
fromZigbee: [fz.on_off, fz.electrical_measurement, fz.metering, fz.ignore_basic_report, fz.tuya_switch_power_outage_memory,
|
|
1567
|
+
fz.ts011f_plug_indicator_mode],
|
|
1568
|
+
toZigbee: [tz.on_off, tz.tuya_switch_power_outage_memory, tz.ts011f_plug_indicator_mode],
|
|
1545
1569
|
configure: async (device, coordinatorEndpoint, logger) => {
|
|
1546
1570
|
const endpoint = device.getEndpoint(1);
|
|
1547
1571
|
await reporting.bind(endpoint, coordinatorEndpoint, ['genOnOff', 'haElectricalMeasurement', 'seMetering']);
|
|
@@ -1553,21 +1577,31 @@ module.exports = [
|
|
|
1553
1577
|
try {
|
|
1554
1578
|
await reporting.currentSummDelivered(endpoint);
|
|
1555
1579
|
} catch (error) {/* fails for some https://github.com/Koenkk/zigbee2mqtt/issues/11179 */}
|
|
1580
|
+
await endpoint.read('genOnOff', ['onOff', 'moesStartUpOnOff', 'tuyaBacklightMode']);
|
|
1556
1581
|
},
|
|
1557
1582
|
options: [exposes.options.measurement_poll_interval()],
|
|
1558
1583
|
// This device doesn't support reporting correctly.
|
|
1559
1584
|
// https://github.com/Koenkk/zigbee-herdsman-converters/pull/1270
|
|
1560
1585
|
exposes: [e.switch(), e.power(), e.current(), e.voltage().withAccess(ea.STATE),
|
|
1561
|
-
e.energy(), exposes.enum('power_outage_memory', ea.
|
|
1562
|
-
.withDescription('Recover state after power outage')
|
|
1586
|
+
e.energy(), exposes.enum('power_outage_memory', ea.ALL, ['on', 'off', 'restore'])
|
|
1587
|
+
.withDescription('Recover state after power outage'),
|
|
1588
|
+
exposes.enum('indicator_mode', ea.ALL, ['off', 'off/on', 'on/off']).withDescription('LED indicator mode')],
|
|
1563
1589
|
onEvent: tuya.onEventMeasurementPoll,
|
|
1564
1590
|
},
|
|
1565
1591
|
{
|
|
1566
1592
|
fingerprint: [{modelID: 'TS0111', manufacturerName: '_TYZB01_ymcdbl3u'}],
|
|
1567
1593
|
model: 'TS0111_valve',
|
|
1568
1594
|
vendor: 'TuYa',
|
|
1595
|
+
whiteLabel: [{vendor: 'TuYa', model: 'SM-AW713Z'}],
|
|
1569
1596
|
description: 'Smart water/gas valve',
|
|
1570
|
-
|
|
1597
|
+
fromZigbee: extend.switch().fromZigbee.concat([fz.moes_power_on_behavior, fz.ts011f_plug_indicator_mode]),
|
|
1598
|
+
toZigbee: extend.switch().toZigbee.concat([tz.moes_power_on_behavior, tz.ts011f_plug_indicator_mode]),
|
|
1599
|
+
exposes: extend.switch().exposes.concat([e.power_on_behavior(),
|
|
1600
|
+
exposes.enum('indicator_mode', ea.ALL, ['off', 'off/on', 'on/off', 'on']).withDescription('LED indicator mode')]),
|
|
1601
|
+
configure: async (device, coordinatorEndpoint, logger) => {
|
|
1602
|
+
const endpoint = device.getEndpoint(1);
|
|
1603
|
+
await endpoint.read('genOnOff', ['onOff', 'moesStartUpOnOff', 'tuyaBacklightMode']);
|
|
1604
|
+
},
|
|
1571
1605
|
},
|
|
1572
1606
|
{
|
|
1573
1607
|
fingerprint: TS011Fplugs.map((manufacturerName) => {
|
|
@@ -1596,7 +1630,7 @@ module.exports = [
|
|
|
1596
1630
|
device.save();
|
|
1597
1631
|
},
|
|
1598
1632
|
exposes: [e.switch(), e.power(), e.current(), e.voltage().withAccess(ea.STATE),
|
|
1599
|
-
e.energy(), exposes.enum('power_outage_memory', ea.
|
|
1633
|
+
e.energy(), exposes.enum('power_outage_memory', ea.ALL, ['on', 'off', 'restore'])
|
|
1600
1634
|
.withDescription('Recover state after power outage'),
|
|
1601
1635
|
exposes.enum('indicator_mode', ea.ALL, ['off', 'off/on', 'on/off', 'on'])
|
|
1602
1636
|
.withDescription('Plug LED indicator mode'), e.child_lock()],
|
|
@@ -1617,7 +1651,7 @@ module.exports = [
|
|
|
1617
1651
|
const endpoint = device.getEndpoint(1);
|
|
1618
1652
|
await reporting.bind(endpoint, coordinatorEndpoint, ['genOnOff']);
|
|
1619
1653
|
},
|
|
1620
|
-
exposes: [e.switch(), exposes.enum('power_outage_memory', ea.
|
|
1654
|
+
exposes: [e.switch(), exposes.enum('power_outage_memory', ea.ALL, ['on', 'off', 'restore'])
|
|
1621
1655
|
.withDescription('Recover state after power outage'),
|
|
1622
1656
|
exposes.enum('indicator_mode', ea.ALL, ['off', 'off/on', 'on/off', 'on'])
|
|
1623
1657
|
.withDescription('Plug LED indicator mode'), e.child_lock()],
|
|
@@ -1648,7 +1682,7 @@ module.exports = [
|
|
|
1648
1682
|
},
|
|
1649
1683
|
options: [exposes.options.measurement_poll_interval()],
|
|
1650
1684
|
exposes: [e.switch(), e.power(), e.current(), e.voltage().withAccess(ea.STATE),
|
|
1651
|
-
e.energy(), exposes.enum('power_outage_memory', ea.
|
|
1685
|
+
e.energy(), exposes.enum('power_outage_memory', ea.ALL, ['on', 'off', 'restore'])
|
|
1652
1686
|
.withDescription('Recover state after power outage'),
|
|
1653
1687
|
exposes.enum('indicator_mode', ea.ALL, ['off', 'off/on', 'on/off', 'on'])
|
|
1654
1688
|
.withDescription('Plug LED indicator mode'), e.child_lock()],
|
|
@@ -2154,7 +2188,7 @@ module.exports = [
|
|
|
2154
2188
|
device.save();
|
|
2155
2189
|
},
|
|
2156
2190
|
exposes: [e.switch(), e.power(), e.current(), e.voltage().withAccess(ea.STATE),
|
|
2157
|
-
e.energy(), exposes.enum('power_outage_memory', ea.
|
|
2191
|
+
e.energy(), exposes.enum('power_outage_memory', ea.ALL, ['on', 'off', 'restore'])
|
|
2158
2192
|
.withDescription('Recover state after power outage'),
|
|
2159
2193
|
exposes.enum('indicator_mode', ea.STATE_SET, ['off', 'on_off', 'off_on'])
|
|
2160
2194
|
.withDescription('Relay LED indicator mode')],
|
|
@@ -2172,7 +2206,7 @@ module.exports = [
|
|
|
2172
2206
|
device.save();
|
|
2173
2207
|
},
|
|
2174
2208
|
exposes: [e.switch(),
|
|
2175
|
-
exposes.enum('power_outage_memory', ea.
|
|
2209
|
+
exposes.enum('power_outage_memory', ea.ALL, ['on', 'off', 'restore'])
|
|
2176
2210
|
.withDescription('Recover state after power outage'),
|
|
2177
2211
|
exposes.enum('indicator_mode', ea.STATE_SET, ['off', 'on_off', 'off_on'])
|
|
2178
2212
|
.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
|
{
|
|
@@ -269,11 +283,19 @@ module.exports = [
|
|
|
269
283
|
model: 'WS-USC01',
|
|
270
284
|
vendor: 'Xiaomi',
|
|
271
285
|
description: 'Aqara smart wall switch (no neutral, single rocker)',
|
|
272
|
-
|
|
286
|
+
fromZigbee: [fz.on_off, fz.xiaomi_multistate_action, fz.aqara_opple],
|
|
287
|
+
toZigbee: [tz.on_off, tz.xiaomi_switch_operation_mode_opple,
|
|
288
|
+
tz.xiaomi_flip_indicator_light, tz.aqara_switch_mode_switch],
|
|
289
|
+
exposes: [e.switch(), e.action(['single', 'double']), e.flip_indicator_light(),
|
|
290
|
+
exposes.enum('operation_mode', ea.ALL, ['control_relay', 'decoupled']).withDescription('Decoupled mode'),
|
|
291
|
+
exposes.enum('mode_switch', ea.ALL, ['anti_flicker_mode', 'quick_mode'])
|
|
292
|
+
.withDescription('Anti flicker mode can be used to solve blinking issues of some lights.' +
|
|
293
|
+
'Quick mode makes the device respond faster.')],
|
|
294
|
+
onEvent: preventReset,
|
|
273
295
|
configure: async (device, coordinatorEndpoint, logger) => {
|
|
274
|
-
const
|
|
275
|
-
|
|
276
|
-
await
|
|
296
|
+
const endpoint1 = device.getEndpoint(1);
|
|
297
|
+
// set "event" mode
|
|
298
|
+
await endpoint1.write('aqaraOpple', {'mode': 1}, {manufacturerCode: 0x115f, disableResponse: true});
|
|
277
299
|
},
|
|
278
300
|
},
|
|
279
301
|
{
|
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];
|