zigbee-herdsman-converters 14.0.564 → 14.0.567
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 +2 -1
- package/converters/toZigbee.js +7 -2
- package/devices/acova.js +2 -1
- package/devices/adeo.js +7 -0
- package/devices/custom_devices_diy.js +177 -0
- package/devices/gledopto.js +1 -1
- package/devices/immax.js +10 -0
- 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 +14 -0
- package/devices/tuya.js +35 -14
- package/devices/ubisys.js +25 -12
- 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/xiaomi.js +26 -2
- package/package.json +2 -2
package/converters/fromZigbee.js
CHANGED
|
@@ -7338,13 +7338,14 @@ const converters = {
|
|
|
7338
7338
|
const dpValue = tuya.firstDpValue(msg, meta, 'SLUXZB');
|
|
7339
7339
|
const dp = dpValue.dp;
|
|
7340
7340
|
const value = tuya.getDataValue(dpValue);
|
|
7341
|
+
const brightnesStateLookup = {'0': 'LOW', '1': 'MEDIUM', '2': 'HIGH'};
|
|
7341
7342
|
switch (dp) {
|
|
7342
7343
|
case 2:
|
|
7343
7344
|
return {illuminance_lux: value};
|
|
7344
7345
|
case 4:
|
|
7345
7346
|
return {battery: value};
|
|
7346
7347
|
case 1:
|
|
7347
|
-
return {
|
|
7348
|
+
return {brightness_level: brightnesStateLookup[value]};
|
|
7348
7349
|
default:
|
|
7349
7350
|
meta.logger.warn(`s_lux_zb_illuminance: NOT RECOGNIZED DP #${dp} with data ${JSON.stringify(dpValue)}`);
|
|
7350
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',
|
|
@@ -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({disableColorTempStartup: false}),
|
|
351
|
+
extend: gledoptoExtend.light_onoff_brightness_colortemp_color({disableColorTempStartup: false, colorTempRange: [155, 495]}),
|
|
352
352
|
},
|
|
353
353
|
{
|
|
354
354
|
zigbeeModel: ['GL-S-005Z'],
|
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/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',
|
package/devices/tuya.js
CHANGED
|
@@ -440,7 +440,13 @@ module.exports = [
|
|
|
440
440
|
model: 'ZN231392',
|
|
441
441
|
vendor: 'TuYa',
|
|
442
442
|
description: 'Smart water/gas valve',
|
|
443
|
-
|
|
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
|
+
},
|
|
444
450
|
},
|
|
445
451
|
{
|
|
446
452
|
fingerprint: [{modelID: 'TS011F', manufacturerName: '_TZ3000_1hwjutgo'}, {modelID: 'TS011F', manufacturerName: '_TZ3000_lnggrqqi'}],
|
|
@@ -492,7 +498,8 @@ module.exports = [
|
|
|
492
498
|
{modelID: 'TS0505B', manufacturerName: '_TZ3210_s6zec0of'},
|
|
493
499
|
{modelID: 'TS0505B', manufacturerName: '_TZ3210_y5fjkn7x'},
|
|
494
500
|
{modelID: 'TS0505B', manufacturerName: '_TZ3210_cuqkfz2q'},
|
|
495
|
-
{modelID: 'TS0505B', manufacturerName: '_TZ3210_6amjviba'}
|
|
501
|
+
{modelID: 'TS0505B', manufacturerName: '_TZ3210_6amjviba'},
|
|
502
|
+
{modelID: 'TS0505B', manufacturerName: '_TZ3000_xr5m6kfg'}],
|
|
496
503
|
model: 'TS0505B',
|
|
497
504
|
vendor: 'TuYa',
|
|
498
505
|
description: 'Zigbee RGB+CCT light',
|
|
@@ -745,7 +752,8 @@ module.exports = [
|
|
|
745
752
|
const endpoint = device.getEndpoint(1);
|
|
746
753
|
await reporting.bind(endpoint, coordinatorEndpoint, ['genBasic']);
|
|
747
754
|
},
|
|
748
|
-
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'])],
|
|
749
757
|
},
|
|
750
758
|
{
|
|
751
759
|
zigbeeModel: ['TS130F'],
|
|
@@ -1557,8 +1565,9 @@ module.exports = [
|
|
|
1557
1565
|
description: '10A UK or 16A EU smart plug',
|
|
1558
1566
|
whiteLabel: [{vendor: 'BlitzWolf', model: 'BW-SHP13'}],
|
|
1559
1567
|
vendor: 'TuYa',
|
|
1560
|
-
fromZigbee: [fz.on_off, fz.electrical_measurement, fz.metering, fz.ignore_basic_report, fz.tuya_switch_power_outage_memory
|
|
1561
|
-
|
|
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],
|
|
1562
1571
|
configure: async (device, coordinatorEndpoint, logger) => {
|
|
1563
1572
|
const endpoint = device.getEndpoint(1);
|
|
1564
1573
|
await reporting.bind(endpoint, coordinatorEndpoint, ['genOnOff', 'haElectricalMeasurement', 'seMetering']);
|
|
@@ -1570,21 +1579,31 @@ module.exports = [
|
|
|
1570
1579
|
try {
|
|
1571
1580
|
await reporting.currentSummDelivered(endpoint);
|
|
1572
1581
|
} catch (error) {/* fails for some https://github.com/Koenkk/zigbee2mqtt/issues/11179 */}
|
|
1582
|
+
await endpoint.read('genOnOff', ['onOff', 'moesStartUpOnOff', 'tuyaBacklightMode']);
|
|
1573
1583
|
},
|
|
1574
1584
|
options: [exposes.options.measurement_poll_interval()],
|
|
1575
1585
|
// This device doesn't support reporting correctly.
|
|
1576
1586
|
// https://github.com/Koenkk/zigbee-herdsman-converters/pull/1270
|
|
1577
1587
|
exposes: [e.switch(), e.power(), e.current(), e.voltage().withAccess(ea.STATE),
|
|
1578
|
-
e.energy(), exposes.enum('power_outage_memory', ea.
|
|
1579
|
-
.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')],
|
|
1580
1591
|
onEvent: tuya.onEventMeasurementPoll,
|
|
1581
1592
|
},
|
|
1582
1593
|
{
|
|
1583
1594
|
fingerprint: [{modelID: 'TS0111', manufacturerName: '_TYZB01_ymcdbl3u'}],
|
|
1584
1595
|
model: 'TS0111_valve',
|
|
1585
1596
|
vendor: 'TuYa',
|
|
1597
|
+
whiteLabel: [{vendor: 'TuYa', model: 'SM-AW713Z'}],
|
|
1586
1598
|
description: 'Smart water/gas valve',
|
|
1587
|
-
|
|
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
|
+
},
|
|
1588
1607
|
},
|
|
1589
1608
|
{
|
|
1590
1609
|
fingerprint: TS011Fplugs.map((manufacturerName) => {
|
|
@@ -1613,7 +1632,7 @@ module.exports = [
|
|
|
1613
1632
|
device.save();
|
|
1614
1633
|
},
|
|
1615
1634
|
exposes: [e.switch(), e.power(), e.current(), e.voltage().withAccess(ea.STATE),
|
|
1616
|
-
e.energy(), exposes.enum('power_outage_memory', ea.
|
|
1635
|
+
e.energy(), exposes.enum('power_outage_memory', ea.ALL, ['on', 'off', 'restore'])
|
|
1617
1636
|
.withDescription('Recover state after power outage'),
|
|
1618
1637
|
exposes.enum('indicator_mode', ea.ALL, ['off', 'off/on', 'on/off', 'on'])
|
|
1619
1638
|
.withDescription('Plug LED indicator mode'), e.child_lock()],
|
|
@@ -1634,7 +1653,7 @@ module.exports = [
|
|
|
1634
1653
|
const endpoint = device.getEndpoint(1);
|
|
1635
1654
|
await reporting.bind(endpoint, coordinatorEndpoint, ['genOnOff']);
|
|
1636
1655
|
},
|
|
1637
|
-
exposes: [e.switch(), exposes.enum('power_outage_memory', ea.
|
|
1656
|
+
exposes: [e.switch(), exposes.enum('power_outage_memory', ea.ALL, ['on', 'off', 'restore'])
|
|
1638
1657
|
.withDescription('Recover state after power outage'),
|
|
1639
1658
|
exposes.enum('indicator_mode', ea.ALL, ['off', 'off/on', 'on/off', 'on'])
|
|
1640
1659
|
.withDescription('Plug LED indicator mode'), e.child_lock()],
|
|
@@ -1665,7 +1684,7 @@ module.exports = [
|
|
|
1665
1684
|
},
|
|
1666
1685
|
options: [exposes.options.measurement_poll_interval()],
|
|
1667
1686
|
exposes: [e.switch(), e.power(), e.current(), e.voltage().withAccess(ea.STATE),
|
|
1668
|
-
e.energy(), exposes.enum('power_outage_memory', ea.
|
|
1687
|
+
e.energy(), exposes.enum('power_outage_memory', ea.ALL, ['on', 'off', 'restore'])
|
|
1669
1688
|
.withDescription('Recover state after power outage'),
|
|
1670
1689
|
exposes.enum('indicator_mode', ea.ALL, ['off', 'off/on', 'on/off', 'on'])
|
|
1671
1690
|
.withDescription('Plug LED indicator mode'), e.child_lock()],
|
|
@@ -1847,7 +1866,9 @@ module.exports = [
|
|
|
1847
1866
|
},
|
|
1848
1867
|
},
|
|
1849
1868
|
{
|
|
1850
|
-
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'}],
|
|
1851
1872
|
model: 'TS0012_switch_module',
|
|
1852
1873
|
vendor: 'TuYa',
|
|
1853
1874
|
description: '2 gang switch module - (without neutral)',
|
|
@@ -2171,7 +2192,7 @@ module.exports = [
|
|
|
2171
2192
|
device.save();
|
|
2172
2193
|
},
|
|
2173
2194
|
exposes: [e.switch(), e.power(), e.current(), e.voltage().withAccess(ea.STATE),
|
|
2174
|
-
e.energy(), exposes.enum('power_outage_memory', ea.
|
|
2195
|
+
e.energy(), exposes.enum('power_outage_memory', ea.ALL, ['on', 'off', 'restore'])
|
|
2175
2196
|
.withDescription('Recover state after power outage'),
|
|
2176
2197
|
exposes.enum('indicator_mode', ea.STATE_SET, ['off', 'on_off', 'off_on'])
|
|
2177
2198
|
.withDescription('Relay LED indicator mode')],
|
|
@@ -2189,7 +2210,7 @@ module.exports = [
|
|
|
2189
2210
|
device.save();
|
|
2190
2211
|
},
|
|
2191
2212
|
exposes: [e.switch(),
|
|
2192
|
-
exposes.enum('power_outage_memory', ea.
|
|
2213
|
+
exposes.enum('power_outage_memory', ea.ALL, ['on', 'off', 'restore'])
|
|
2193
2214
|
.withDescription('Recover state after power outage'),
|
|
2194
2215
|
exposes.enum('indicator_mode', ea.STATE_SET, ['off', 'on_off', 'off_on'])
|
|
2195
2216
|
.withDescription('Relay LED indicator mode')],
|
package/devices/ubisys.js
CHANGED
|
@@ -74,6 +74,22 @@ const ubisys = {
|
|
|
74
74
|
}
|
|
75
75
|
},
|
|
76
76
|
},
|
|
77
|
+
configure_device_setup: {
|
|
78
|
+
cluster: 'manuSpecificUbisysDeviceSetup',
|
|
79
|
+
type: ['attributeReport', 'readResponse'],
|
|
80
|
+
convert: (model, msg, publish, options, meta) => {
|
|
81
|
+
const result = {};
|
|
82
|
+
if (msg.data.hasOwnProperty('input_configurations')) {
|
|
83
|
+
result['input_configurations'] = msg.data['input_configurations'];
|
|
84
|
+
}
|
|
85
|
+
if (msg.data.hasOwnProperty('inputActions')) {
|
|
86
|
+
result['input_actions'] = msg.data['inputActions'].map(function(el) {
|
|
87
|
+
return Object.values(el);
|
|
88
|
+
});
|
|
89
|
+
}
|
|
90
|
+
return {configure_device_setup: result};
|
|
91
|
+
},
|
|
92
|
+
},
|
|
77
93
|
},
|
|
78
94
|
tz: {
|
|
79
95
|
configure_j1: {
|
|
@@ -482,13 +498,9 @@ const ubisys = {
|
|
|
482
498
|
},
|
|
483
499
|
|
|
484
500
|
convertGet: async (entity, key, meta) => {
|
|
485
|
-
const log = (dataRead) => {
|
|
486
|
-
meta.logger.warn(
|
|
487
|
-
`ubisys: Device setup read for '${meta.options.friendly_name}': ${JSON.stringify(utils.toSnakeCase(dataRead))}`);
|
|
488
|
-
};
|
|
489
501
|
const devMgmtEp = meta.device.getEndpoint(232);
|
|
490
|
-
|
|
491
|
-
|
|
502
|
+
await devMgmtEp.read('manuSpecificUbisysDeviceSetup', ['inputConfigurations', 'inputActions'],
|
|
503
|
+
manufacturerOptions.ubisysNull);
|
|
492
504
|
},
|
|
493
505
|
},
|
|
494
506
|
},
|
|
@@ -507,7 +519,7 @@ module.exports = [
|
|
|
507
519
|
]),
|
|
508
520
|
e.power_on_behavior()],
|
|
509
521
|
fromZigbee: [fz.on_off, fz.metering, fz.command_toggle, fz.command_on, fz.command_off, fz.command_recall, fz.command_move,
|
|
510
|
-
fz.command_stop, fz.power_on_behavior],
|
|
522
|
+
fz.command_stop, fz.power_on_behavior, ubisys.fz.configure_device_setup],
|
|
511
523
|
toZigbee: [tz.on_off, tz.metering_power, ubisys.tz.configure_device_setup, tz.power_on_behavior],
|
|
512
524
|
endpoint: (device) => {
|
|
513
525
|
return {'l1': 1, 's1': 2, 'meter': 3};
|
|
@@ -549,7 +561,7 @@ module.exports = [
|
|
|
549
561
|
]),
|
|
550
562
|
e.power_on_behavior()],
|
|
551
563
|
fromZigbee: [fz.on_off, fz.metering, fz.command_toggle, fz.command_on, fz.command_off, fz.command_recall, fz.command_move,
|
|
552
|
-
fz.command_stop, fz.power_on_behavior],
|
|
564
|
+
fz.command_stop, fz.power_on_behavior, ubisys.fz.configure_device_setup],
|
|
553
565
|
toZigbee: [tz.on_off, tz.metering_power, ubisys.tz.configure_device_setup, tz.power_on_behavior],
|
|
554
566
|
endpoint: (device) => {
|
|
555
567
|
return {'l1': 1, 's1': 2, 'meter': 4};
|
|
@@ -592,7 +604,7 @@ module.exports = [
|
|
|
592
604
|
'brightness_stop_s2']),
|
|
593
605
|
e.power_on_behavior().withEndpoint('l1'), e.power_on_behavior().withEndpoint('l2')],
|
|
594
606
|
fromZigbee: [fz.on_off, fz.metering, fz.command_toggle, fz.command_on, fz.command_off, fz.command_recall, fz.command_move,
|
|
595
|
-
fz.command_stop, fz.power_on_behavior],
|
|
607
|
+
fz.command_stop, fz.power_on_behavior, ubisys.fz.configure_device_setup],
|
|
596
608
|
toZigbee: [tz.on_off, tz.metering_power, ubisys.tz.configure_device_setup, tz.power_on_behavior],
|
|
597
609
|
endpoint: (device) => {
|
|
598
610
|
return {'l1': 1, 'l2': 2, 's1': 3, 's2': 4, 'meter': 5};
|
|
@@ -638,7 +650,7 @@ module.exports = [
|
|
|
638
650
|
description: 'Universal dimmer D1',
|
|
639
651
|
fromZigbee: [fz.on_off, fz.brightness, fz.metering, fz.command_toggle, fz.command_on, fz.command_off, fz.command_recall,
|
|
640
652
|
fz.command_move, fz.command_stop, fz.lighting_ballast_configuration, fz.level_config, ubisys.fz.dimmer_setup,
|
|
641
|
-
ubisys.fz.dimmer_setup_genLevelCtrl],
|
|
653
|
+
ubisys.fz.dimmer_setup_genLevelCtrl, ubisys.fz.configure_device_setup],
|
|
642
654
|
toZigbee: [tz.light_onoff_brightness, tz.ballast_config, tz.level_config, ubisys.tz.dimmer_setup,
|
|
643
655
|
ubisys.tz.dimmer_setup_genLevelCtrl, ubisys.tz.configure_device_setup, tz.ignore_transition, tz.light_brightness_move,
|
|
644
656
|
tz.light_brightness_step],
|
|
@@ -702,7 +714,7 @@ module.exports = [
|
|
|
702
714
|
model: 'J1',
|
|
703
715
|
vendor: 'Ubisys',
|
|
704
716
|
description: 'Shutter control J1',
|
|
705
|
-
fromZigbee: [fz.cover_position_tilt, fz.metering],
|
|
717
|
+
fromZigbee: [fz.cover_position_tilt, fz.metering, ubisys.fz.configure_device_setup],
|
|
706
718
|
toZigbee: [tz.cover_state, tz.cover_position_tilt, tz.metering_power,
|
|
707
719
|
ubisys.tz.configure_j1, ubisys.tz.configure_device_setup],
|
|
708
720
|
exposes: [e.cover_position_tilt(),
|
|
@@ -739,7 +751,8 @@ module.exports = [
|
|
|
739
751
|
model: 'C4',
|
|
740
752
|
vendor: 'Ubisys',
|
|
741
753
|
description: 'Control unit C4',
|
|
742
|
-
fromZigbee: [fz.legacy.ubisys_c4_scenes, fz.legacy.ubisys_c4_onoff, fz.legacy.ubisys_c4_level, fz.legacy.ubisys_c4_cover
|
|
754
|
+
fromZigbee: [fz.legacy.ubisys_c4_scenes, fz.legacy.ubisys_c4_onoff, fz.legacy.ubisys_c4_level, fz.legacy.ubisys_c4_cover,
|
|
755
|
+
ubisys.fz.configure_device_setup],
|
|
743
756
|
toZigbee: [ubisys.tz.configure_device_setup],
|
|
744
757
|
exposes: [e.action([
|
|
745
758
|
'1_scene_*', '1_on', '1_off', '1_toggle', '1_level_move_down', '1_level_move_up',
|
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/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.567",
|
|
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": "*",
|