zigbee-herdsman-converters 14.0.327 → 14.0.331
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 +26 -105
- package/converters/toZigbee.js +29 -5
- package/devices/adurosmart.js +19 -0
- package/devices/girier.js +4 -1
- package/devices/gledopto.js +1 -1
- package/devices/ikea.js +4 -4
- package/devices/innr.js +1 -1
- package/devices/ledvance.js +1 -1
- package/devices/lidl.js +2 -2
- package/devices/lonsonho.js +1 -1
- package/devices/osram.js +6 -6
- package/devices/owon.js +24 -0
- package/devices/philips.js +45 -5
- package/devices/schneider_electric.js +1 -0
- package/devices/tuya.js +46 -44
- package/devices/xiaomi.js +36 -37
- package/lib/constants.js +10 -0
- package/lib/exposes.js +8 -0
- package/lib/reporting.js +4 -0
- package/npm-shrinkwrap.json +1 -1
- package/package.json +1 -1
package/converters/fromZigbee.js
CHANGED
|
@@ -128,6 +128,10 @@ const converters = {
|
|
|
128
128
|
value = value < -250 ? 0 : value;
|
|
129
129
|
result[postfixWithEndpointName('abs_max_heat_setpoint_limit', msg, model)] = value;
|
|
130
130
|
}
|
|
131
|
+
if (msg.data.hasOwnProperty('acLouverPosition')) {
|
|
132
|
+
result[postfixWithEndpointName('ac_louver_position', msg, model)] =
|
|
133
|
+
constants.thermostatAcLouverPositions[msg.data['acLouverPosition']];
|
|
134
|
+
}
|
|
131
135
|
return result;
|
|
132
136
|
},
|
|
133
137
|
},
|
|
@@ -3837,7 +3841,7 @@ const converters = {
|
|
|
3837
3841
|
return {'local_temperature_calibration': ( value/10 ).toFixed(1)};
|
|
3838
3842
|
case tuya.dataPoints.haozeeValvePosition:
|
|
3839
3843
|
// valve position
|
|
3840
|
-
return {'position': value};
|
|
3844
|
+
return {'position': ( value/10 ).toFixed(1)};
|
|
3841
3845
|
case tuya.dataPoints.haozeeMinTemp:
|
|
3842
3846
|
// lower limit temperature
|
|
3843
3847
|
return {'min_temperature': ( value/10 ).toFixed(1)};
|
|
@@ -4862,7 +4866,7 @@ const converters = {
|
|
|
4862
4866
|
}
|
|
4863
4867
|
},
|
|
4864
4868
|
},
|
|
4865
|
-
|
|
4869
|
+
aqara_opple: {
|
|
4866
4870
|
cluster: 'aqaraOpple',
|
|
4867
4871
|
type: ['attributeReport', 'readResponse'],
|
|
4868
4872
|
options: [exposes.options.precision('temperature'), exposes.options.calibration('temperature')],
|
|
@@ -4872,11 +4876,9 @@ const converters = {
|
|
|
4872
4876
|
const data = msg.data['247'];
|
|
4873
4877
|
// Xiaomi struct parsing
|
|
4874
4878
|
const length = data.length;
|
|
4875
|
-
// if (meta.logger) meta.logger.debug(`${model.zigbeeModel}: Xiaomi struct: length ${length}`);
|
|
4876
4879
|
for (let i=0; i < length; i++) {
|
|
4877
4880
|
const index = data[i];
|
|
4878
4881
|
let value = null;
|
|
4879
|
-
// if (meta.logger) meta.logger.debug(`${model.zigbeeModel}: pos=${i}, ind=${data[i]}, vtype=${data[i+1]}`);
|
|
4880
4882
|
switch (data[i+1]) {
|
|
4881
4883
|
case 16:
|
|
4882
4884
|
// 0x10 ZclBoolean
|
|
@@ -4936,7 +4938,11 @@ const converters = {
|
|
|
4936
4938
|
default:
|
|
4937
4939
|
if (meta.logger) meta.logger.debug(`${model.zigbeeModel}: unknown vtype=${data[i+1]}, pos=${i+1}`);
|
|
4938
4940
|
}
|
|
4939
|
-
|
|
4941
|
+
|
|
4942
|
+
if (index == 1) {
|
|
4943
|
+
payload.voltage = value;
|
|
4944
|
+
payload.battery = batteryVoltageToPercentage(value, '3V_2100');
|
|
4945
|
+
} else if (index === 3) payload.temperature = calibrateAndPrecisionRoundOptions(value, options, 'temperature'); // 0x03
|
|
4940
4946
|
else if (index === 100) payload.state = value === 1 ? 'ON' : 'OFF'; // 0x64
|
|
4941
4947
|
else if (index === 149) {
|
|
4942
4948
|
payload.energy = precisionRound(value, 2); // 0x95
|
|
@@ -4948,34 +4954,26 @@ const converters = {
|
|
|
4948
4954
|
else if (meta.logger) meta.logger.debug(`${model.zigbeeModel}: unknown index ${index} with value ${value}`);
|
|
4949
4955
|
}
|
|
4950
4956
|
}
|
|
4951
|
-
|
|
4952
|
-
|
|
4953
|
-
|
|
4954
|
-
}
|
|
4955
|
-
if (msg.data.hasOwnProperty('
|
|
4956
|
-
const lookup = {1: 'toggle', 2: 'momentary'};
|
|
4957
|
-
payload.switch_type = lookup[msg.data['10']];
|
|
4958
|
-
}
|
|
4957
|
+
|
|
4958
|
+
if (msg.data.hasOwnProperty('0')) payload.detection_period = msg.data['0'];
|
|
4959
|
+
if (msg.data.hasOwnProperty('4')) payload.mode_switch = {4: 'anti_flicker_mode', 1: 'quick_mode'}[msg.data['4']];
|
|
4960
|
+
if (msg.data.hasOwnProperty('10')) payload.switch_type = {1: 'toggle', 2: 'momentary'}[msg.data['10']];
|
|
4961
|
+
if (msg.data.hasOwnProperty('268')) payload.motion_sensitivity = {1: 'low', 2: 'medium', 3: 'high'}[msg.data['268']];
|
|
4959
4962
|
if (msg.data.hasOwnProperty('512')) {
|
|
4960
4963
|
if (['ZNCZ15LM', 'QBCZ14LM', 'QBCZ15LM'].includes(model.model)) {
|
|
4961
4964
|
payload.button_lock = msg.data['512'] === 1 ? 'OFF' : 'ON';
|
|
4962
4965
|
} else {
|
|
4963
|
-
const
|
|
4964
|
-
0x01: 'control_relay',
|
|
4965
|
-
0x00: 'decoupled',
|
|
4966
|
-
};
|
|
4967
|
-
const mode = mappingMode[msg.data['512']];
|
|
4968
|
-
const payload = {};
|
|
4966
|
+
const mode = {0x01: 'control_relay', 0x00: 'decoupled'}[msg.data['512']];
|
|
4969
4967
|
payload[postfixWithEndpointName('operation_mode', msg, model)] = mode;
|
|
4970
|
-
return payload;
|
|
4971
4968
|
}
|
|
4972
4969
|
}
|
|
4973
|
-
if (msg.data.hasOwnProperty('513')) payload.power_outage_memory = msg.data['513'] === 1;
|
|
4974
|
-
if (msg.data.hasOwnProperty('514')) payload.auto_off = msg.data['514'] === 1;
|
|
4975
|
-
if (msg.data.hasOwnProperty('515')) payload.led_disabled_night = msg.data['515'] === 1;
|
|
4976
|
-
if (msg.data.hasOwnProperty('519')) payload.consumer_connected = msg.data['519'] === 1;
|
|
4977
|
-
if (msg.data.hasOwnProperty('523')) payload.overload_protection = precisionRound(msg.data['523'], 2);
|
|
4978
|
-
if (msg.data.hasOwnProperty('550')) payload.button_switch_mode = msg.data['550'] === 1 ? 'relay_and_usb' : 'relay';
|
|
4970
|
+
if (msg.data.hasOwnProperty('513')) payload.power_outage_memory = msg.data['513'] === 1;
|
|
4971
|
+
if (msg.data.hasOwnProperty('514')) payload.auto_off = msg.data['514'] === 1;
|
|
4972
|
+
if (msg.data.hasOwnProperty('515')) payload.led_disabled_night = msg.data['515'] === 1;
|
|
4973
|
+
if (msg.data.hasOwnProperty('519')) payload.consumer_connected = msg.data['519'] === 1;
|
|
4974
|
+
if (msg.data.hasOwnProperty('523')) payload.overload_protection = precisionRound(msg.data['523'], 2);
|
|
4975
|
+
if (msg.data.hasOwnProperty('550')) payload.button_switch_mode = msg.data['550'] === 1 ? 'relay_and_usb' : 'relay';
|
|
4976
|
+
if (msg.data['mode'] !== undefined) payload.operation_mode = ['command', 'event'][msg.data['mode']];
|
|
4979
4977
|
return payload;
|
|
4980
4978
|
},
|
|
4981
4979
|
},
|
|
@@ -5047,11 +5045,11 @@ const converters = {
|
|
|
5047
5045
|
let buttonLookup = null;
|
|
5048
5046
|
if (['WXKG02LM_rev2', 'WXKG07LM', 'WXKG17LM'].includes(model.model)) buttonLookup = {1: 'left', 2: 'right', 3: 'both'};
|
|
5049
5047
|
if (['QBKG12LM', 'QBKG24LM'].includes(model.model)) buttonLookup = {5: 'left', 6: 'right', 7: 'both'};
|
|
5050
|
-
if (['QBKG25LM'
|
|
5048
|
+
if (['QBKG25LM'].includes(model.model)) buttonLookup = {41: 'left', 42: 'center', 43: 'right'};
|
|
5051
5049
|
if (['QBKG39LM', 'QBKG41LM', 'WS-EUK02', 'WS-EUK04', 'QBKG20LM', 'QBKG31LM'].includes(model.model)) {
|
|
5052
5050
|
buttonLookup = {41: 'left', 42: 'right', 51: 'both'};
|
|
5053
5051
|
}
|
|
5054
|
-
if (['QBKG34LM'].includes(model.model)) {
|
|
5052
|
+
if (['QBKG26LM', 'QBKG34LM'].includes(model.model)) {
|
|
5055
5053
|
buttonLookup = {
|
|
5056
5054
|
41: 'left', 42: 'center', 43: 'right',
|
|
5057
5055
|
51: 'left_center', 52: 'left_right', 53: 'center_right',
|
|
@@ -5415,23 +5413,6 @@ const converters = {
|
|
|
5415
5413
|
return payload;
|
|
5416
5414
|
},
|
|
5417
5415
|
},
|
|
5418
|
-
xiaomi_operation_mode_opple: {
|
|
5419
|
-
cluster: 'aqaraOpple',
|
|
5420
|
-
type: ['attributeReport', 'readResponse'],
|
|
5421
|
-
convert: (model, msg, publish, options, meta) => {
|
|
5422
|
-
if (!msg.data.hasOwnProperty('512')) {
|
|
5423
|
-
return;
|
|
5424
|
-
}
|
|
5425
|
-
const mappingMode = {
|
|
5426
|
-
0x01: 'control_relay',
|
|
5427
|
-
0x00: 'decoupled',
|
|
5428
|
-
};
|
|
5429
|
-
const mode = mappingMode[msg.data['512']];
|
|
5430
|
-
const payload = {};
|
|
5431
|
-
payload[postfixWithEndpointName('operation_mode', msg, model)] = mode;
|
|
5432
|
-
return payload;
|
|
5433
|
-
},
|
|
5434
|
-
},
|
|
5435
5416
|
qlwz_letv8key_switch: {
|
|
5436
5417
|
cluster: 'genMultistateInput',
|
|
5437
5418
|
type: ['attributeReport', 'readResponse'],
|
|
@@ -5445,27 +5426,6 @@ const converters = {
|
|
|
5445
5426
|
}
|
|
5446
5427
|
},
|
|
5447
5428
|
},
|
|
5448
|
-
aqara_opple_report: {
|
|
5449
|
-
cluster: 'aqaraOpple',
|
|
5450
|
-
type: ['attributeReport', 'readResponse'],
|
|
5451
|
-
convert: (model, msg, publish, options, meta) => {
|
|
5452
|
-
// it is like xiaomi_battery_3v, but not parsed
|
|
5453
|
-
// https://github.com/Koenkk/zigbee-herdsman/blob/master/src/zcl/buffaloZcl.ts#L93
|
|
5454
|
-
// data: { '247': <Buffer 01 21 b8 0b 03 28 19 04 21 a8 13 05 21 44 01 06 24 02
|
|
5455
|
-
// 00 00 00 00 08 21 11 01 0a 21 00 00 0c 20 01 64 10 00> }
|
|
5456
|
-
if (msg.data['247']) {
|
|
5457
|
-
const voltage = msg.data['247'][2] + msg.data['247'][3]*256;
|
|
5458
|
-
if (voltage) {
|
|
5459
|
-
return {battery: batteryVoltageToPercentage(voltage, '3V_2100'), voltage: voltage};
|
|
5460
|
-
}
|
|
5461
|
-
}
|
|
5462
|
-
|
|
5463
|
-
if (msg.data['mode'] !== undefined) {
|
|
5464
|
-
const lookup = ['command', 'event'];
|
|
5465
|
-
return {operation_mode: lookup[msg.data['mode']]};
|
|
5466
|
-
}
|
|
5467
|
-
},
|
|
5468
|
-
},
|
|
5469
5429
|
aqara_opple_multistate: {
|
|
5470
5430
|
cluster: 'genMultistateInput',
|
|
5471
5431
|
type: ['attributeReport', 'readResponse'],
|
|
@@ -5576,26 +5536,6 @@ const converters = {
|
|
|
5576
5536
|
return result;
|
|
5577
5537
|
},
|
|
5578
5538
|
},
|
|
5579
|
-
xiaomi_switch_type: {
|
|
5580
|
-
cluster: 'aqaraOpple',
|
|
5581
|
-
type: ['attributeReport', 'readResponse'],
|
|
5582
|
-
convert: (model, msg, publish, options, meta) => {
|
|
5583
|
-
if (msg.data.hasOwnProperty(0x000A)) {
|
|
5584
|
-
const lookup = {1: 'toggle', 2: 'momentary'};
|
|
5585
|
-
return {switch_type: lookup[msg.data[0x000A]]};
|
|
5586
|
-
}
|
|
5587
|
-
},
|
|
5588
|
-
},
|
|
5589
|
-
xiaomi_switch_power_outage_memory: {
|
|
5590
|
-
cluster: 'aqaraOpple',
|
|
5591
|
-
type: ['attributeReport', 'readResponse'],
|
|
5592
|
-
convert: (model, msg, publish, options, meta) => {
|
|
5593
|
-
if (msg.data.hasOwnProperty(0x0201)) {
|
|
5594
|
-
const lookup = [false, true];
|
|
5595
|
-
return {power_outage_memory: lookup[msg.data[0x0201]]};
|
|
5596
|
-
}
|
|
5597
|
-
},
|
|
5598
|
-
},
|
|
5599
5539
|
keen_home_smart_vent_pressure: {
|
|
5600
5540
|
cluster: 'msPressureMeasurement',
|
|
5601
5541
|
type: ['attributeReport', 'readResponse'],
|
|
@@ -6489,16 +6429,6 @@ const converters = {
|
|
|
6489
6429
|
}
|
|
6490
6430
|
},
|
|
6491
6431
|
},
|
|
6492
|
-
RTCGQ13LM_motion_sensitivity: {
|
|
6493
|
-
cluster: 'aqaraOpple',
|
|
6494
|
-
type: ['attributeReport', 'readResponse'],
|
|
6495
|
-
convert: (model, msg, publish, options, meta) => {
|
|
6496
|
-
if (msg.data.hasOwnProperty(0x010c)) {
|
|
6497
|
-
const lookup = {1: 'low', 2: 'medium', 3: 'high'};
|
|
6498
|
-
return {motion_sensitivity: lookup[msg.data[0x010c]]};
|
|
6499
|
-
}
|
|
6500
|
-
},
|
|
6501
|
-
},
|
|
6502
6432
|
CCTSwitch_D0001_levelctrl: {
|
|
6503
6433
|
cluster: 'genLevelCtrl',
|
|
6504
6434
|
options: [exposes.options.legacy()],
|
|
@@ -7226,15 +7156,6 @@ const converters = {
|
|
|
7226
7156
|
return {voc: msg.data.presentValue};
|
|
7227
7157
|
},
|
|
7228
7158
|
},
|
|
7229
|
-
GZCGQ11LM_detection_period: {
|
|
7230
|
-
cluster: 'aqaraOpple',
|
|
7231
|
-
type: ['attributeReport', 'readResponse'],
|
|
7232
|
-
convert: (model, msg, publish, options, meta) => {
|
|
7233
|
-
if (msg.data.hasOwnProperty(0x0000)) {
|
|
7234
|
-
return {detection_period: msg.data[0x0000]};
|
|
7235
|
-
}
|
|
7236
|
-
},
|
|
7237
|
-
},
|
|
7238
7159
|
heiman_doorbell_button: {
|
|
7239
7160
|
cluster: 'ssIasZone',
|
|
7240
7161
|
type: 'commandStatusChangeNotification',
|
package/converters/toZigbee.js
CHANGED
|
@@ -1364,6 +1364,20 @@ const converters = {
|
|
|
1364
1364
|
await entity.read('hvacThermostat', ['maxHeatSetpointLimit']);
|
|
1365
1365
|
},
|
|
1366
1366
|
},
|
|
1367
|
+
thermostat_ac_louver_position: {
|
|
1368
|
+
key: ['ac_louver_position'],
|
|
1369
|
+
convertSet: async (entity, key, value, meta) => {
|
|
1370
|
+
let acLouverPosition = utils.getKey(constants.thermostatAcLouverPositions, value, undefined, Number);
|
|
1371
|
+
if (acLouverPosition === undefined) {
|
|
1372
|
+
acLouverPosition = utils.getKey(constants.thermostatAcLouverPositions, value, value, Number);
|
|
1373
|
+
}
|
|
1374
|
+
await entity.write('hvacThermostat', {acLouverPosition});
|
|
1375
|
+
return {state: {ac_louver_position: value}};
|
|
1376
|
+
},
|
|
1377
|
+
convertGet: async (entity, key, meta) => {
|
|
1378
|
+
await entity.read('hvacThermostat', ['acLouverPosition']);
|
|
1379
|
+
},
|
|
1380
|
+
},
|
|
1367
1381
|
electrical_measurement_power: {
|
|
1368
1382
|
key: ['power'],
|
|
1369
1383
|
convertGet: async (entity, key, meta) => {
|
|
@@ -2808,11 +2822,21 @@ const converters = {
|
|
|
2808
2822
|
const presetLookup = {'auto': 0, 'manual': 1, 'holiday': 3};
|
|
2809
2823
|
await tuya.sendDataPointEnum(entity, tuya.dataPoints.tvMode, presetLookup[value]);
|
|
2810
2824
|
return {state: {preset: value}};}
|
|
2811
|
-
case 'frost_protection':
|
|
2812
|
-
await tuya.sendDataPointBool(entity, tuya.dataPoints.tvFrostDetection, value === 'ON');
|
|
2813
|
-
break;
|
|
2814
2825
|
case 'heating_stop':
|
|
2815
|
-
|
|
2826
|
+
if (value == 'ON') {
|
|
2827
|
+
await tuya.sendDataPointBool(entity, tuya.dataPoints.tvHeatingStop, 1);
|
|
2828
|
+
} else {
|
|
2829
|
+
await tuya.sendDataPointBool(entity, tuya.dataPoints.tvHeatingStop, 0);
|
|
2830
|
+
await tuya.sendDataPointEnum(entity, tuya.dataPoints.tvMode, 1 /* manual */);
|
|
2831
|
+
}
|
|
2832
|
+
break;
|
|
2833
|
+
case 'frost_protection':
|
|
2834
|
+
if (value == 'ON') {
|
|
2835
|
+
await tuya.sendDataPointBool(entity, tuya.dataPoints.tvFrostDetection, 1);
|
|
2836
|
+
} else {
|
|
2837
|
+
await tuya.sendDataPointBool(entity, tuya.dataPoints.tvFrostDetection, 0);
|
|
2838
|
+
await tuya.sendDataPointEnum(entity, tuya.dataPoints.tvMode, 1 /* manual */);
|
|
2839
|
+
}
|
|
2816
2840
|
break;
|
|
2817
2841
|
case 'window_detection':
|
|
2818
2842
|
await tuya.sendDataPointBool(entity, tuya.dataPoints.tvWindowDetection, value === 'ON');
|
|
@@ -2845,7 +2869,7 @@ const converters = {
|
|
|
2845
2869
|
await tuya.sendDataPointValue(entity, tuya.dataPoints.tvOpenWindowTemp, value * 10);
|
|
2846
2870
|
break;
|
|
2847
2871
|
case 'holiday_mode_date':
|
|
2848
|
-
await tuya.sendDataPointBitmap(entity, tuya.dataPoints.
|
|
2872
|
+
await tuya.sendDataPointBitmap(entity, tuya.dataPoints.tvHolidayMode, value);
|
|
2849
2873
|
break;
|
|
2850
2874
|
|
|
2851
2875
|
case 'online':
|
package/devices/adurosmart.js
CHANGED
|
@@ -1,10 +1,29 @@
|
|
|
1
1
|
const exposes = require('../lib/exposes');
|
|
2
2
|
const fz = {...require('../converters/fromZigbee'), legacy: require('../lib/legacy').fromZigbee};
|
|
3
|
+
const tz = require('../converters/toZigbee');
|
|
3
4
|
const reporting = require('../lib/reporting');
|
|
4
5
|
const extend = require('../lib/extend');
|
|
5
6
|
const e = exposes.presets;
|
|
6
7
|
|
|
7
8
|
module.exports = [
|
|
9
|
+
{
|
|
10
|
+
zigbeeModel: ['AD-SmartPlug3001'],
|
|
11
|
+
model: '81848',
|
|
12
|
+
vendor: 'AduroSmart',
|
|
13
|
+
description: 'ERIA smart plug (with power measurements)',
|
|
14
|
+
fromZigbee: [fz.on_off, fz.electrical_measurement],
|
|
15
|
+
toZigbee: [tz.on_off],
|
|
16
|
+
exposes: [e.switch(), e.power(), e.current(), e.voltage()],
|
|
17
|
+
configure: async (device, coordinatorEndpoint, logger) => {
|
|
18
|
+
const endpoint = device.getEndpoint(1);
|
|
19
|
+
await reporting.bind(endpoint, coordinatorEndpoint, ['genOnOff', 'haElectricalMeasurement']);
|
|
20
|
+
await reporting.onOff(endpoint);
|
|
21
|
+
await reporting.readEletricalMeasurementMultiplierDivisors(endpoint);
|
|
22
|
+
await reporting.rmsVoltage(endpoint);
|
|
23
|
+
await reporting.rmsCurrent(endpoint);
|
|
24
|
+
await reporting.activePower(endpoint);
|
|
25
|
+
},
|
|
26
|
+
},
|
|
8
27
|
{
|
|
9
28
|
zigbeeModel: ['ZLL-ExtendedColo', 'ZLL-ExtendedColor', 'AD-RGBW3001'],
|
|
10
29
|
model: '81809/81813',
|
package/devices/girier.js
CHANGED
|
@@ -6,7 +6,10 @@ const extend = require('../lib/extend');
|
|
|
6
6
|
|
|
7
7
|
module.exports = [
|
|
8
8
|
{
|
|
9
|
-
fingerprint: [
|
|
9
|
+
fingerprint: [
|
|
10
|
+
{modelID: 'TS0001', manufacturerName: '_TZ3000_majwnphg'},
|
|
11
|
+
{modelID: 'TS0001', manufacturerName: '_TZ3000_6axxqqi2'},
|
|
12
|
+
],
|
|
10
13
|
model: 'JR-ZDS01',
|
|
11
14
|
vendor: 'Girier',
|
|
12
15
|
description: '1 gang mini switch',
|
package/devices/gledopto.js
CHANGED
|
@@ -464,7 +464,7 @@ module.exports = [
|
|
|
464
464
|
vendor: 'Gledopto',
|
|
465
465
|
ota: ota.zigbeeOTA,
|
|
466
466
|
description: 'Zigbee 12W Downlight RGB+CCT (pro)',
|
|
467
|
-
extend: gledoptoExtend.light_onoff_brightness_colortemp_color(),
|
|
467
|
+
extend: gledoptoExtend.light_onoff_brightness_colortemp_color({colorTempRange: [158, 495]}),
|
|
468
468
|
},
|
|
469
469
|
{
|
|
470
470
|
zigbeeModel: ['GL-D-006P'],
|
package/devices/ikea.js
CHANGED
|
@@ -354,7 +354,7 @@ module.exports = [
|
|
|
354
354
|
model: 'LED1624G9',
|
|
355
355
|
vendor: 'IKEA',
|
|
356
356
|
description: 'TRADFRI LED bulb E14/E26/E27 600 lumen, dimmable, color, opal white',
|
|
357
|
-
extend: tradfriExtend.light_onoff_brightness_colortemp_color(),
|
|
357
|
+
extend: tradfriExtend.light_onoff_brightness_colortemp_color({colorTempRange: [250, 454]}),
|
|
358
358
|
meta: {supportsHueAndSaturation: false},
|
|
359
359
|
},
|
|
360
360
|
{
|
|
@@ -376,7 +376,7 @@ module.exports = [
|
|
|
376
376
|
model: 'LED1732G11',
|
|
377
377
|
vendor: 'IKEA',
|
|
378
378
|
description: 'TRADFRI LED bulb E27 1000 lumen, dimmable, white spectrum, opal white',
|
|
379
|
-
extend: tradfriExtend.light_onoff_brightness_colortemp(),
|
|
379
|
+
extend: tradfriExtend.light_onoff_brightness_colortemp({colorTempRange: [250, 454]}),
|
|
380
380
|
},
|
|
381
381
|
{
|
|
382
382
|
zigbeeModel: ['TRADFRI bulb E27 WW 806lm', 'TRADFRI bulb E26 WW 806lm'],
|
|
@@ -753,11 +753,11 @@ module.exports = [
|
|
|
753
753
|
extend: tradfriExtend.light_onoff_brightness_colortemp(),
|
|
754
754
|
},
|
|
755
755
|
{
|
|
756
|
-
zigbeeModel: ['TRADFRI bulb GU10 CWS 345lm'],
|
|
756
|
+
zigbeeModel: ['TRADFRI bulb GU10 CWS 345lm', 'TRADFRI bulb GU10 CWS 380lm'],
|
|
757
757
|
model: 'LED1923R5',
|
|
758
758
|
vendor: 'IKEA',
|
|
759
759
|
description: 'TRADFRI LED bulb GU10 345 lumen, dimmable, white spectrum, color spectrum',
|
|
760
|
-
extend: tradfriExtend.light_onoff_brightness_colortemp_color(),
|
|
760
|
+
extend: tradfriExtend.light_onoff_brightness_colortemp_color({colorTempRange: [250, 454]}),
|
|
761
761
|
},
|
|
762
762
|
{
|
|
763
763
|
zigbeeModel: ['TRADFRI bulb E14 CWS 470lm', 'TRADFRI bulb E12 CWS 450lm'],
|
package/devices/innr.js
CHANGED
|
@@ -220,7 +220,7 @@ module.exports = [
|
|
|
220
220
|
model: 'RS 228 T',
|
|
221
221
|
vendor: 'Innr',
|
|
222
222
|
description: 'GU10 spot 350 lm, dimmable, white spectrum',
|
|
223
|
-
extend: extend.light_onoff_brightness_colortemp({colorTempRange: [
|
|
223
|
+
extend: extend.light_onoff_brightness_colortemp({colorTempRange: [200, 454]}),
|
|
224
224
|
meta: {applyRedFix: true, turnsOffAtBrightness1: true},
|
|
225
225
|
},
|
|
226
226
|
{
|
package/devices/ledvance.js
CHANGED
|
@@ -31,7 +31,7 @@ module.exports = [
|
|
|
31
31
|
model: 'AC25697',
|
|
32
32
|
vendor: 'LEDVANCE',
|
|
33
33
|
description: 'SMART+ CLASSIC MULTICOLOUR 60 10W E27',
|
|
34
|
-
extend: extend.ledvance.light_onoff_brightness_colortemp_color(),
|
|
34
|
+
extend: extend.ledvance.light_onoff_brightness_colortemp_color({colorTempRange: [153, 500]}),
|
|
35
35
|
ota: ota.ledvance,
|
|
36
36
|
},
|
|
37
37
|
{
|
package/devices/lidl.js
CHANGED
|
@@ -553,7 +553,7 @@ module.exports = [
|
|
|
553
553
|
model: 'HG06492B',
|
|
554
554
|
vendor: 'Lidl',
|
|
555
555
|
description: 'Livarno Lux E14 candle CCT',
|
|
556
|
-
...extend.light_onoff_brightness_colortemp({disableColorTempStartup: true}),
|
|
556
|
+
...extend.light_onoff_brightness_colortemp({disableColorTempStartup: true, colorTempRange: [153, 500]}),
|
|
557
557
|
configure: async (device, coordinatorEndpoint, logger) => {
|
|
558
558
|
device.getEndpoint(1).saveClusterAttributeKeyValue('lightingColorCtrl', {colorCapabilities: 16});
|
|
559
559
|
},
|
|
@@ -624,7 +624,7 @@ module.exports = [
|
|
|
624
624
|
fingerprint: [{modelID: 'TS0501A', manufacturerName: '_TZ3000_nosnx7im'}],
|
|
625
625
|
model: 'HG06463B',
|
|
626
626
|
vendor: 'Lidl',
|
|
627
|
-
description: 'Livarno Lux E27
|
|
627
|
+
description: 'Livarno Lux E27 G95 filament bulb',
|
|
628
628
|
extend: extend.light_onoff_brightness({disableEffect: true}),
|
|
629
629
|
meta: {turnsOffAtBrightness1: false},
|
|
630
630
|
},
|
package/devices/lonsonho.js
CHANGED
|
@@ -142,7 +142,7 @@ module.exports = [
|
|
|
142
142
|
{
|
|
143
143
|
zigbeeModel: ['ZB-RGBCW'],
|
|
144
144
|
fingerprint: [{modelID: 'ZB-CL01', manufacturerName: 'eWeLight'}, {modelID: 'ZB-CL01', manufacturerName: 'eWeLink'},
|
|
145
|
-
{modelID: 'ZB-CL02', manufacturerName: 'eWeLight'}],
|
|
145
|
+
{modelID: 'ZB-CL02', manufacturerName: 'eWeLight'}, {modelID: 'ZB-CL01', manufacturerName: 'eWeLi\u0001\u0000\u0010'}],
|
|
146
146
|
model: 'ZB-RGBCW',
|
|
147
147
|
vendor: 'Lonsonho',
|
|
148
148
|
description: 'Zigbee 3.0 LED-bulb, RGBW LED',
|
package/devices/osram.js
CHANGED
|
@@ -126,7 +126,7 @@ module.exports = [
|
|
|
126
126
|
model: 'AA70155',
|
|
127
127
|
vendor: 'OSRAM',
|
|
128
128
|
description: 'LIGHTIFY LED A19 tunable white / Classic A60 TW',
|
|
129
|
-
extend: extend.ledvance.light_onoff_brightness_colortemp(),
|
|
129
|
+
extend: extend.ledvance.light_onoff_brightness_colortemp({colorTempRange: [153, 370]}),
|
|
130
130
|
ota: ota.ledvance,
|
|
131
131
|
},
|
|
132
132
|
{
|
|
@@ -134,7 +134,7 @@ module.exports = [
|
|
|
134
134
|
model: 'AA68199',
|
|
135
135
|
vendor: 'OSRAM',
|
|
136
136
|
description: 'LIGHTIFY LED PAR16 50 GU10 tunable white',
|
|
137
|
-
extend: extend.ledvance.light_onoff_brightness_colortemp(),
|
|
137
|
+
extend: extend.ledvance.light_onoff_brightness_colortemp({colorTempRange: [153, 370]}),
|
|
138
138
|
ota: ota.ledvance,
|
|
139
139
|
},
|
|
140
140
|
{
|
|
@@ -142,7 +142,7 @@ module.exports = [
|
|
|
142
142
|
model: '4058075148338',
|
|
143
143
|
vendor: 'OSRAM',
|
|
144
144
|
description: 'LIGHTIFY LED PAR16 50 GU10 tunable white',
|
|
145
|
-
extend: extend.ledvance.light_onoff_brightness_colortemp(),
|
|
145
|
+
extend: extend.ledvance.light_onoff_brightness_colortemp({colorTempRange: [153, 370]}),
|
|
146
146
|
ota: ota.ledvance,
|
|
147
147
|
},
|
|
148
148
|
{
|
|
@@ -228,7 +228,7 @@ module.exports = [
|
|
|
228
228
|
model: '4052899926110',
|
|
229
229
|
vendor: 'OSRAM',
|
|
230
230
|
description: 'Flex RGBW',
|
|
231
|
-
extend: extend.ledvance.light_onoff_brightness_colortemp_color(),
|
|
231
|
+
extend: extend.ledvance.light_onoff_brightness_colortemp_color({colorTempRange: [125, 666]}),
|
|
232
232
|
ota: ota.ledvance,
|
|
233
233
|
},
|
|
234
234
|
{
|
|
@@ -278,7 +278,7 @@ module.exports = [
|
|
|
278
278
|
model: 'AB35996',
|
|
279
279
|
vendor: 'OSRAM',
|
|
280
280
|
description: 'Smart+ Spot GU10 Multicolor',
|
|
281
|
-
extend: extend.ledvance.light_onoff_brightness_colortemp_color(),
|
|
281
|
+
extend: extend.ledvance.light_onoff_brightness_colortemp_color({colorTempRange: [125, 666]}),
|
|
282
282
|
ota: ota.ledvance,
|
|
283
283
|
},
|
|
284
284
|
{
|
|
@@ -318,7 +318,7 @@ module.exports = [
|
|
|
318
318
|
model: 'AC03648',
|
|
319
319
|
vendor: 'OSRAM',
|
|
320
320
|
description: 'SMART+ spot GU5.3 tunable white',
|
|
321
|
-
extend: extend.ledvance.light_onoff_brightness_colortemp(),
|
|
321
|
+
extend: extend.ledvance.light_onoff_brightness_colortemp({colorTempRange: [153, 370]}),
|
|
322
322
|
ota: ota.ledvance,
|
|
323
323
|
},
|
|
324
324
|
{
|
package/devices/owon.js
CHANGED
|
@@ -59,4 +59,28 @@ module.exports = [
|
|
|
59
59
|
device.save();
|
|
60
60
|
},
|
|
61
61
|
},
|
|
62
|
+
{
|
|
63
|
+
zigbeeModel: ['AC201'],
|
|
64
|
+
model: 'AC201',
|
|
65
|
+
vendor: 'OWON',
|
|
66
|
+
description: 'HVAC controller/IR blaster',
|
|
67
|
+
fromZigbee: [fz.fan, fz.thermostat],
|
|
68
|
+
toZigbee: [tz.fan_mode, tz.thermostat_system_mode, tz.thermostat_occupied_heating_setpoint,
|
|
69
|
+
tz.thermostat_occupied_cooling_setpoint, tz.thermostat_ac_louver_position, tz.thermostat_local_temperature],
|
|
70
|
+
exposes: [exposes.climate().withSystemMode(['off', 'heat', 'cool', 'auto', 'dry', 'fan_only'])
|
|
71
|
+
.withSetpoint('occupied_heating_setpoint', 8, 30, 1).withSetpoint('occupied_cooling_setpoint', 8, 30, 1)
|
|
72
|
+
.withAcLouverPosition(['fully_open', 'fully_closed', 'half_open', 'quarter_open', 'three_quarters_open'])
|
|
73
|
+
.withLocalTemperature(), e.fan().withModes(['low', 'medium', 'high', 'on', 'auto'])],
|
|
74
|
+
configure: async (device, coordinatorEndpoint, logger) => {
|
|
75
|
+
const endpoint = device.getEndpoint(1);
|
|
76
|
+
await reporting.bind(endpoint, coordinatorEndpoint, ['hvacFanCtrl']);
|
|
77
|
+
await reporting.fanMode(endpoint);
|
|
78
|
+
await reporting.bind(endpoint, coordinatorEndpoint, ['hvacThermostat']);
|
|
79
|
+
await reporting.thermostatOccupiedHeatingSetpoint(endpoint);
|
|
80
|
+
await reporting.thermostatOccupiedHeatingSetpoint(endpoint);
|
|
81
|
+
await reporting.thermostatTemperature(endpoint, {min: 60, max: 600, change: 0.1});
|
|
82
|
+
await reporting.thermostatSystemMode(endpoint);
|
|
83
|
+
await reporting.thermostatAcLouverPosition(endpoint);
|
|
84
|
+
},
|
|
85
|
+
},
|
|
62
86
|
];
|
package/devices/philips.js
CHANGED
|
@@ -252,10 +252,10 @@ module.exports = [
|
|
|
252
252
|
ota: ota.zigbeeOTA,
|
|
253
253
|
},
|
|
254
254
|
{
|
|
255
|
-
zigbeeModel: ['4090330P9_01', '4090330P9_02'],
|
|
255
|
+
zigbeeModel: ['4090330P9_01', '4090330P9_02', '929003052501_01', '929003052501_02'],
|
|
256
256
|
model: '4090330P9',
|
|
257
257
|
vendor: 'Philips',
|
|
258
|
-
description: 'Hue Ensis',
|
|
258
|
+
description: 'Hue Ensis (black)',
|
|
259
259
|
meta: {turnsOffAtBrightness1: true},
|
|
260
260
|
extend: hueExtend.light_onoff_brightness_colortemp_color({colorTempRange: [153, 500]}),
|
|
261
261
|
ota: ota.zigbeeOTA,
|
|
@@ -404,6 +404,15 @@ module.exports = [
|
|
|
404
404
|
extend: hueExtend.light_onoff_brightness_colortemp_color(),
|
|
405
405
|
ota: ota.zigbeeOTA,
|
|
406
406
|
},
|
|
407
|
+
{
|
|
408
|
+
zigbeeModel: ['1740193P0'],
|
|
409
|
+
model: '1740193P0',
|
|
410
|
+
vendor: 'Philips',
|
|
411
|
+
description: 'Hue Lucca wall light',
|
|
412
|
+
meta: {turnsOffAtBrightness1: true},
|
|
413
|
+
extend: hueExtend.light_onoff_brightness(),
|
|
414
|
+
ota: ota.zigbeeOTA,
|
|
415
|
+
},
|
|
407
416
|
{
|
|
408
417
|
zigbeeModel: ['1740293P0'],
|
|
409
418
|
model: '1740293P0',
|
|
@@ -848,7 +857,7 @@ module.exports = [
|
|
|
848
857
|
vendor: 'Philips',
|
|
849
858
|
description: 'Hue white ambiance E14',
|
|
850
859
|
meta: {turnsOffAtBrightness1: true},
|
|
851
|
-
extend: hueExtend.light_onoff_brightness_colortemp(),
|
|
860
|
+
extend: hueExtend.light_onoff_brightness_colortemp({colorTempRange: [153, 454]}),
|
|
852
861
|
ota: ota.zigbeeOTA,
|
|
853
862
|
},
|
|
854
863
|
{
|
|
@@ -1203,7 +1212,7 @@ module.exports = [
|
|
|
1203
1212
|
ota: ota.zigbeeOTA,
|
|
1204
1213
|
},
|
|
1205
1214
|
{
|
|
1206
|
-
zigbeeModel: ['4096730P6'],
|
|
1215
|
+
zigbeeModel: ['4096730P6', '929003055601'],
|
|
1207
1216
|
model: '4096730P6',
|
|
1208
1217
|
vendor: 'Philips',
|
|
1209
1218
|
description: 'Hue Cher ceiling light',
|
|
@@ -1887,7 +1896,7 @@ module.exports = [
|
|
|
1887
1896
|
ota: ota.zigbeeOTA,
|
|
1888
1897
|
},
|
|
1889
1898
|
{
|
|
1890
|
-
zigbeeModel: ['LOM003'],
|
|
1899
|
+
zigbeeModel: ['LOM003', 'LOM009'],
|
|
1891
1900
|
model: '8718699689308',
|
|
1892
1901
|
vendor: 'Philips',
|
|
1893
1902
|
description: 'Hue smart plug - UK',
|
|
@@ -1942,6 +1951,20 @@ module.exports = [
|
|
|
1942
1951
|
},
|
|
1943
1952
|
ota: ota.zigbeeOTA,
|
|
1944
1953
|
},
|
|
1954
|
+
{
|
|
1955
|
+
zigbeeModel: ['LOM008'],
|
|
1956
|
+
model: '9290030509',
|
|
1957
|
+
vendor: 'Philips',
|
|
1958
|
+
description: 'Hue smart plug - EU',
|
|
1959
|
+
extend: extend.switch(),
|
|
1960
|
+
toZigbee: [tz.on_off].concat([tz.hue_power_on_behavior, tz.hue_power_on_error]),
|
|
1961
|
+
configure: async (device, coordinatorEndpoint, logger) => {
|
|
1962
|
+
const endpoint = device.getEndpoint(11);
|
|
1963
|
+
await reporting.bind(endpoint, coordinatorEndpoint, ['genOnOff']);
|
|
1964
|
+
await reporting.onOff(endpoint);
|
|
1965
|
+
},
|
|
1966
|
+
ota: ota.zigbeeOTA,
|
|
1967
|
+
},
|
|
1945
1968
|
{
|
|
1946
1969
|
zigbeeModel: ['LLC014'],
|
|
1947
1970
|
model: '7099860PH',
|
|
@@ -2419,4 +2442,21 @@ module.exports = [
|
|
|
2419
2442
|
extend: hueExtend.light_onoff_brightness(),
|
|
2420
2443
|
ota: ota.zigbeeOTA,
|
|
2421
2444
|
},
|
|
2445
|
+
{
|
|
2446
|
+
zigbeeModel: ['LCD003'],
|
|
2447
|
+
model: '8719514344723',
|
|
2448
|
+
vendor: 'Philips',
|
|
2449
|
+
description: 'Akari downlight',
|
|
2450
|
+
extend: hueExtend.light_onoff_brightness_colortemp_color({colorTempRange: [153, 500]}),
|
|
2451
|
+
meta: {turnsOffAtBrightness1: true},
|
|
2452
|
+
ota: ota.zigbeeOTA,
|
|
2453
|
+
},
|
|
2454
|
+
{
|
|
2455
|
+
zigbeeModel: ['LWE004'],
|
|
2456
|
+
model: '8719514302235',
|
|
2457
|
+
vendor: 'Philips',
|
|
2458
|
+
description: 'Hue White Filament Bulb E14',
|
|
2459
|
+
extend: hueExtend.light_onoff_brightness(),
|
|
2460
|
+
ota: ota.zigbeeOTA,
|
|
2461
|
+
},
|
|
2422
2462
|
];
|
|
@@ -273,6 +273,7 @@ module.exports = [
|
|
|
273
273
|
endpoint: (device) => {
|
|
274
274
|
return {'l1': 3, 's1': 21, 's2': 22, 's3': 23, 's4': 24};
|
|
275
275
|
},
|
|
276
|
+
meta: {multiEndpoint: true},
|
|
276
277
|
exposes: [e.light_brightness().withLevelConfig().withEndpoint('l1'),
|
|
277
278
|
exposes.numeric('ballast_minimum_level', ea.ALL).withValueMin(1).withValueMax(254)
|
|
278
279
|
.withDescription('Specifies the minimum light output of the ballast')
|
package/devices/tuya.js
CHANGED
|
@@ -820,7 +820,7 @@ module.exports = [
|
|
|
820
820
|
exposes.binary('online', ea.STATE_SET, 'ON', 'OFF').withDescription('Is the device online'),
|
|
821
821
|
exposes.numeric('holiday_mode_date', ea.STATE_SET).withDescription('The holiday mode( ⛱ ) will '+
|
|
822
822
|
'automatically start at the set time starting point and run the holiday temperature.'),
|
|
823
|
-
exposes.composite('programming'
|
|
823
|
+
exposes.composite('programming').withDescription('Auto Mode ⏱ - In this mode,'+
|
|
824
824
|
' the device executes a preset week programming temperature time and temperature. ')
|
|
825
825
|
.withFeature(exposes.text('schedule_monday', ea.STATE))
|
|
826
826
|
.withFeature(exposes.text('schedule_tuesday', ea.STATE))
|
|
@@ -969,49 +969,6 @@ module.exports = [
|
|
|
969
969
|
description: 'Smart water/gas valve',
|
|
970
970
|
extend: extend.switch(),
|
|
971
971
|
},
|
|
972
|
-
{
|
|
973
|
-
fingerprint: [
|
|
974
|
-
{modelID: 'TS011F', manufacturerName: '_TZ3000_dpo1ysak', applicationVersion: 69},
|
|
975
|
-
{modelID: 'TS011F', manufacturerName: '_TZ3000_cphmq0q7', applicationVersion: 69},
|
|
976
|
-
{modelID: 'TS011F', manufacturerName: '_TZ3000_5f43h46b', applicationVersion: 69},
|
|
977
|
-
{modelID: 'TS011F', manufacturerName: '_TZ3000_dpo1ysak', applicationVersion: 68},
|
|
978
|
-
{modelID: 'TS011F', manufacturerName: '_TZ3000_cphmq0q7', applicationVersion: 68},
|
|
979
|
-
{modelID: 'TS011F', manufacturerName: '_TZ3000_5f43h46b', applicationVersion: 68},
|
|
980
|
-
],
|
|
981
|
-
model: 'TS011F_plug_3',
|
|
982
|
-
description: 'Smart plug (with power monitoring by polling)',
|
|
983
|
-
vendor: 'TuYa',
|
|
984
|
-
whiteLabel: [{vendor: 'VIKEFON', model: 'TS011F'}],
|
|
985
|
-
fromZigbee: [fz.on_off, fz.electrical_measurement, fz.metering, fz.ignore_basic_report, fz.tuya_switch_power_outage_memory],
|
|
986
|
-
toZigbee: [tz.on_off, tz.tuya_switch_power_outage_memory],
|
|
987
|
-
configure: async (device, coordinatorEndpoint, logger) => {
|
|
988
|
-
const endpoint = device.getEndpoint(1);
|
|
989
|
-
await reporting.bind(endpoint, coordinatorEndpoint, ['genOnOff']);
|
|
990
|
-
endpoint.saveClusterAttributeKeyValue('haElectricalMeasurement', {acCurrentDivisor: 1000, acCurrentMultiplier: 1});
|
|
991
|
-
endpoint.saveClusterAttributeKeyValue('seMetering', {divisor: 100, multiplier: 1});
|
|
992
|
-
device.save();
|
|
993
|
-
},
|
|
994
|
-
options: [exposes.options.measurement_poll_interval()],
|
|
995
|
-
exposes: [e.switch(), e.power(), e.current(), e.voltage().withAccess(ea.STATE),
|
|
996
|
-
e.energy(), exposes.enum('power_outage_memory', ea.STATE_SET, ['on', 'off', 'restore'])
|
|
997
|
-
.withDescription('Recover state after power outage')],
|
|
998
|
-
onEvent: (type, data, device, options) => {
|
|
999
|
-
const endpoint = device.getEndpoint(1);
|
|
1000
|
-
if (type === 'stop') {
|
|
1001
|
-
clearInterval(globalStore.getValue(device, 'interval'));
|
|
1002
|
-
globalStore.clearValue(device, 'interval');
|
|
1003
|
-
} else if (!globalStore.hasValue(device, 'interval')) {
|
|
1004
|
-
const seconds = options && options.measurement_poll_interval ? options.measurement_poll_interval : 60;
|
|
1005
|
-
const interval = setInterval(async () => {
|
|
1006
|
-
try {
|
|
1007
|
-
await endpoint.read('haElectricalMeasurement', ['rmsVoltage', 'rmsCurrent', 'activePower']);
|
|
1008
|
-
await endpoint.read('seMetering', ['currentSummDelivered']);
|
|
1009
|
-
} catch (error) {/* Do nothing*/}
|
|
1010
|
-
}, seconds*1000);
|
|
1011
|
-
globalStore.putValue(device, 'interval', interval);
|
|
1012
|
-
}
|
|
1013
|
-
},
|
|
1014
|
-
},
|
|
1015
972
|
{
|
|
1016
973
|
fingerprint: [{modelID: 'TS011F', manufacturerName: '_TZ3000_cphmq0q7'},
|
|
1017
974
|
{modelID: 'TS011F', manufacturerName: '_TZ3000_ew3ldmgx'},
|
|
@@ -1057,6 +1014,51 @@ module.exports = [
|
|
|
1057
1014
|
exposes: [e.switch(), exposes.enum('power_outage_memory', ea.STATE_SET, ['on', 'off', 'restore'])
|
|
1058
1015
|
.withDescription('Recover state after power outage')],
|
|
1059
1016
|
},
|
|
1017
|
+
{
|
|
1018
|
+
fingerprint: [
|
|
1019
|
+
{modelID: 'TS011F', manufacturerName: '_TZ3000_dpo1ysak', applicationVersion: 69},
|
|
1020
|
+
{modelID: 'TS011F', manufacturerName: '_TZ3000_cphmq0q7', applicationVersion: 69},
|
|
1021
|
+
{modelID: 'TS011F', manufacturerName: '_TZ3000_5f43h46b', applicationVersion: 69},
|
|
1022
|
+
{modelID: 'TS011F', manufacturerName: '_TZ3000_dpo1ysak', applicationVersion: 68},
|
|
1023
|
+
{modelID: 'TS011F', manufacturerName: '_TZ3000_cphmq0q7', applicationVersion: 68},
|
|
1024
|
+
{modelID: 'TS011F', manufacturerName: '_TZ3000_5f43h46b', applicationVersion: 68},
|
|
1025
|
+
{modelID: 'TS011F', manufacturerName: '_TZ3000_ps3dmato', applicationVersion: 69},
|
|
1026
|
+
{modelID: 'TS011F', manufacturerName: '_TZ3000_w0qqde0g', applicationVersion: 68},
|
|
1027
|
+
],
|
|
1028
|
+
model: 'TS011F_plug_3',
|
|
1029
|
+
description: 'Smart plug (with power monitoring by polling)',
|
|
1030
|
+
vendor: 'TuYa',
|
|
1031
|
+
whiteLabel: [{vendor: 'VIKEFON', model: 'TS011F'}],
|
|
1032
|
+
fromZigbee: [fz.on_off, fz.electrical_measurement, fz.metering, fz.ignore_basic_report, fz.tuya_switch_power_outage_memory],
|
|
1033
|
+
toZigbee: [tz.on_off, tz.tuya_switch_power_outage_memory],
|
|
1034
|
+
configure: async (device, coordinatorEndpoint, logger) => {
|
|
1035
|
+
const endpoint = device.getEndpoint(1);
|
|
1036
|
+
await reporting.bind(endpoint, coordinatorEndpoint, ['genOnOff']);
|
|
1037
|
+
endpoint.saveClusterAttributeKeyValue('haElectricalMeasurement', {acCurrentDivisor: 1000, acCurrentMultiplier: 1});
|
|
1038
|
+
endpoint.saveClusterAttributeKeyValue('seMetering', {divisor: 100, multiplier: 1});
|
|
1039
|
+
device.save();
|
|
1040
|
+
},
|
|
1041
|
+
options: [exposes.options.measurement_poll_interval()],
|
|
1042
|
+
exposes: [e.switch(), e.power(), e.current(), e.voltage().withAccess(ea.STATE),
|
|
1043
|
+
e.energy(), exposes.enum('power_outage_memory', ea.STATE_SET, ['on', 'off', 'restore'])
|
|
1044
|
+
.withDescription('Recover state after power outage')],
|
|
1045
|
+
onEvent: (type, data, device, options) => {
|
|
1046
|
+
const endpoint = device.getEndpoint(1);
|
|
1047
|
+
if (type === 'stop') {
|
|
1048
|
+
clearInterval(globalStore.getValue(device, 'interval'));
|
|
1049
|
+
globalStore.clearValue(device, 'interval');
|
|
1050
|
+
} else if (!globalStore.hasValue(device, 'interval')) {
|
|
1051
|
+
const seconds = options && options.measurement_poll_interval ? options.measurement_poll_interval : 60;
|
|
1052
|
+
const interval = setInterval(async () => {
|
|
1053
|
+
try {
|
|
1054
|
+
await endpoint.read('haElectricalMeasurement', ['rmsVoltage', 'rmsCurrent', 'activePower']);
|
|
1055
|
+
await endpoint.read('seMetering', ['currentSummDelivered']);
|
|
1056
|
+
} catch (error) {/* Do nothing*/}
|
|
1057
|
+
}, seconds*1000);
|
|
1058
|
+
globalStore.putValue(device, 'interval', interval);
|
|
1059
|
+
}
|
|
1060
|
+
},
|
|
1061
|
+
},
|
|
1060
1062
|
{
|
|
1061
1063
|
zigbeeModel: ['5p1vj8r'],
|
|
1062
1064
|
fingerprint: [{modelID: 'TS0601', manufacturerName: '_TZE200_t5p1vj8r'}, {modelID: 'TS0601', manufacturerName: '_TZE200_uebojraa'}],
|
package/devices/xiaomi.js
CHANGED
|
@@ -45,7 +45,7 @@ module.exports = [
|
|
|
45
45
|
model: 'MCCGQ14LM',
|
|
46
46
|
vendor: 'Xiaomi',
|
|
47
47
|
description: 'Aqara E1 door & window contact sensor',
|
|
48
|
-
fromZigbee: [fz.ias_contact_alarm_1, fz.
|
|
48
|
+
fromZigbee: [fz.ias_contact_alarm_1, fz.aqara_opple],
|
|
49
49
|
toZigbee: [],
|
|
50
50
|
exposes: [e.contact(), e.battery(), e.battery_voltage()],
|
|
51
51
|
},
|
|
@@ -294,7 +294,7 @@ module.exports = [
|
|
|
294
294
|
.withDescription('Decoupled mode for left button').withEndpoint('left'),
|
|
295
295
|
exposes.enum('operation_mode', ea.ALL, ['control_relay', 'decoupled'])
|
|
296
296
|
.withDescription('Decoupled mode for right button').withEndpoint('right')],
|
|
297
|
-
fromZigbee: [fz.on_off, fz.xiaomi_power, fz.
|
|
297
|
+
fromZigbee: [fz.on_off, fz.xiaomi_power, fz.aqara_opple, fz.xiaomi_multistate_action],
|
|
298
298
|
toZigbee: [tz.on_off, tz.xiaomi_power, tz.xiaomi_switch_operation_mode_opple, tz.xiaomi_switch_power_outage_memory],
|
|
299
299
|
meta: {multiEndpoint: true},
|
|
300
300
|
endpoint: (device) => {
|
|
@@ -311,7 +311,7 @@ module.exports = [
|
|
|
311
311
|
model: 'WS-EUK01',
|
|
312
312
|
vendor: 'Xiaomi',
|
|
313
313
|
description: 'Aqara smart wall switch H1 EU (no neutral, single rocker)',
|
|
314
|
-
fromZigbee: [fz.on_off, fz.xiaomi_multistate_action, fz.
|
|
314
|
+
fromZigbee: [fz.on_off, fz.xiaomi_multistate_action, fz.aqara_opple],
|
|
315
315
|
toZigbee: [tz.on_off, tz.xiaomi_switch_operation_mode_opple, tz.xiaomi_switch_power_outage_memory],
|
|
316
316
|
exposes: [e.switch(), e.action(['single', 'double']), e.power_outage_memory(),
|
|
317
317
|
exposes.enum('operation_mode', ea.ALL, ['control_relay', 'decoupled']).withDescription('Decoupled mode')],
|
|
@@ -328,8 +328,7 @@ module.exports = [
|
|
|
328
328
|
model: 'WS-EUK02',
|
|
329
329
|
vendor: 'Xiaomi',
|
|
330
330
|
description: 'Aqara smart wall switch H1 EU (no neutral, double rocker)',
|
|
331
|
-
fromZigbee: [fz.on_off, fz.xiaomi_multistate_action, fz.
|
|
332
|
-
fz.xiaomi_operation_mode_opple],
|
|
331
|
+
fromZigbee: [fz.on_off, fz.xiaomi_multistate_action, fz.aqara_opple],
|
|
333
332
|
toZigbee: [tz.on_off, tz.xiaomi_switch_operation_mode_opple, tz.xiaomi_switch_power_outage_memory],
|
|
334
333
|
meta: {multiEndpoint: true},
|
|
335
334
|
endpoint: (_device) => {
|
|
@@ -354,7 +353,7 @@ module.exports = [
|
|
|
354
353
|
model: 'WS-EUK03',
|
|
355
354
|
vendor: 'Xiaomi',
|
|
356
355
|
description: 'Aqara smart wall switch H1 EU (with neutral, single rocker)',
|
|
357
|
-
fromZigbee: [fz.on_off, fz.xiaomi_power, fz.xiaomi_multistate_action, fz.
|
|
356
|
+
fromZigbee: [fz.on_off, fz.xiaomi_power, fz.xiaomi_multistate_action, fz.aqara_opple],
|
|
358
357
|
toZigbee: [tz.on_off, tz.xiaomi_power, tz.xiaomi_switch_operation_mode_opple, tz.xiaomi_switch_power_outage_memory],
|
|
359
358
|
exposes: [e.switch(), e.action(['single', 'double']), e.power().withAccess(ea.STATE_GET), e.energy(),
|
|
360
359
|
e.power_outage_memory(), e.temperature().withAccess(ea.STATE),
|
|
@@ -372,7 +371,7 @@ module.exports = [
|
|
|
372
371
|
model: 'WS-EUK04',
|
|
373
372
|
vendor: 'Xiaomi',
|
|
374
373
|
description: 'Aqara smart wall switch H1 EU (with neutral, double rocker)',
|
|
375
|
-
fromZigbee: [fz.on_off, fz.xiaomi_power, fz.xiaomi_multistate_action, fz.
|
|
374
|
+
fromZigbee: [fz.on_off, fz.xiaomi_power, fz.xiaomi_multistate_action, fz.aqara_opple],
|
|
376
375
|
toZigbee: [tz.on_off, tz.xiaomi_power, tz.xiaomi_switch_operation_mode_opple, tz.xiaomi_switch_power_outage_memory],
|
|
377
376
|
meta: {multiEndpoint: true},
|
|
378
377
|
endpoint: (device) => {
|
|
@@ -576,7 +575,7 @@ module.exports = [
|
|
|
576
575
|
model: 'QBKG25LM',
|
|
577
576
|
vendor: 'Xiaomi',
|
|
578
577
|
description: 'Aqara D1 3 gang smart wall switch (no neutral wire)',
|
|
579
|
-
fromZigbee: [fz.on_off, fz.legacy.QBKG25LM_click, fz.
|
|
578
|
+
fromZigbee: [fz.on_off, fz.legacy.QBKG25LM_click, fz.aqara_opple],
|
|
580
579
|
toZigbee: [tz.on_off, tz.xiaomi_switch_operation_mode_opple, tz.xiaomi_switch_power_outage_memory, tz.xiaomi_led_disabled_night,
|
|
581
580
|
tz.aqara_switch_mode_switch],
|
|
582
581
|
meta: {multiEndpoint: true},
|
|
@@ -631,9 +630,11 @@ module.exports = [
|
|
|
631
630
|
e.power().withAccess(ea.STATE), e.action([
|
|
632
631
|
'hold_left', 'single_left', 'double_left', 'triple_left', 'release_left',
|
|
633
632
|
'hold_center', 'single_center', 'double_center', 'triple_center', 'release_center',
|
|
634
|
-
'hold_right', 'single_right', 'double_right', 'triple_right', 'release_right'
|
|
633
|
+
'hold_right', 'single_right', 'double_right', 'triple_right', 'release_right',
|
|
634
|
+
'single_left_center', 'double_left_center', 'single_left_right', 'double_left_right',
|
|
635
|
+
'single_center_right', 'double_center_right', 'single_all', 'double_all']),
|
|
635
636
|
],
|
|
636
|
-
fromZigbee: [fz.on_off, fz.
|
|
637
|
+
fromZigbee: [fz.on_off, fz.aqara_opple, fz.xiaomi_multistate_action, fz.xiaomi_power],
|
|
637
638
|
toZigbee: [tz.on_off, tz.xiaomi_switch_operation_mode_opple],
|
|
638
639
|
meta: {multiEndpoint: true},
|
|
639
640
|
endpoint: (device) => {
|
|
@@ -703,7 +704,7 @@ module.exports = [
|
|
|
703
704
|
model: 'QBKG19LM',
|
|
704
705
|
vendor: 'Xiaomi',
|
|
705
706
|
description: 'Aqara smart wall switch T1 (with neutral, single rocker)',
|
|
706
|
-
fromZigbee: [fz.on_off, fz.xiaomi_power, fz.xiaomi_multistate_action, fz.
|
|
707
|
+
fromZigbee: [fz.on_off, fz.xiaomi_power, fz.xiaomi_multistate_action, fz.aqara_opple],
|
|
707
708
|
toZigbee: [tz.on_off, tz.xiaomi_switch_operation_mode_opple, tz.xiaomi_switch_power_outage_memory,
|
|
708
709
|
tz.xiaomi_led_disabled_night],
|
|
709
710
|
exposes: [
|
|
@@ -724,7 +725,7 @@ module.exports = [
|
|
|
724
725
|
model: 'QBKG20LM',
|
|
725
726
|
vendor: 'Xiaomi',
|
|
726
727
|
description: 'Aqara smart wall switch T1 (with neutral, double rocker)',
|
|
727
|
-
fromZigbee: [fz.on_off, fz.xiaomi_power, fz.xiaomi_multistate_action, fz.
|
|
728
|
+
fromZigbee: [fz.on_off, fz.xiaomi_power, fz.xiaomi_multistate_action, fz.aqara_opple],
|
|
728
729
|
toZigbee: [tz.on_off, tz.xiaomi_switch_operation_mode_opple, tz.xiaomi_switch_power_outage_memory,
|
|
729
730
|
tz.xiaomi_led_disabled_night],
|
|
730
731
|
meta: {multiEndpoint: true},
|
|
@@ -755,7 +756,7 @@ module.exports = [
|
|
|
755
756
|
model: 'QBKG34LM',
|
|
756
757
|
vendor: 'Xiaomi',
|
|
757
758
|
description: 'Aqara smart wall switch T1 (with neutral, three rocker)',
|
|
758
|
-
fromZigbee: [fz.on_off, fz.xiaomi_power, fz.xiaomi_multistate_action, fz.
|
|
759
|
+
fromZigbee: [fz.on_off, fz.xiaomi_power, fz.xiaomi_multistate_action, fz.aqara_opple],
|
|
759
760
|
toZigbee: [tz.on_off, tz.xiaomi_switch_operation_mode_opple, tz.xiaomi_switch_power_outage_memory,
|
|
760
761
|
tz.xiaomi_led_disabled_night],
|
|
761
762
|
meta: {multiEndpoint: true},
|
|
@@ -870,7 +871,7 @@ module.exports = [
|
|
|
870
871
|
model: 'RTCGQ13LM',
|
|
871
872
|
vendor: 'Xiaomi',
|
|
872
873
|
description: 'Aqara high precision motion sensor',
|
|
873
|
-
fromZigbee: [fz.occupancy, fz.occupancy_timeout, fz.
|
|
874
|
+
fromZigbee: [fz.occupancy, fz.occupancy_timeout, fz.aqara_opple, fz.battery],
|
|
874
875
|
toZigbee: [tz.occupancy_timeout, tz.RTCGQ13LM_motion_sensitivity],
|
|
875
876
|
exposes: [e.occupancy(), exposes.enum('motion_sensitivity', exposes.access.ALL, ['low', 'medium', 'high']),
|
|
876
877
|
exposes.numeric('occupancy_timeout', exposes.access.ALL).withValueMin(0).withValueMax(65535).withUnit('s')
|
|
@@ -963,7 +964,7 @@ module.exports = [
|
|
|
963
964
|
model: 'ZNCZ04LM',
|
|
964
965
|
description: 'Mi power plug ZigBee EU',
|
|
965
966
|
vendor: 'Xiaomi',
|
|
966
|
-
fromZigbee: [fz.on_off, fz.xiaomi_power, fz.
|
|
967
|
+
fromZigbee: [fz.on_off, fz.xiaomi_power, fz.aqara_opple, fz.ignore_occupancy_report, fz.ignore_illuminance_report,
|
|
967
968
|
fz.ignore_time_read],
|
|
968
969
|
toZigbee: [tz.on_off, tz.xiaomi_power, tz.xiaomi_switch_power_outage_memory, tz.xiaomi_auto_off, tz.xiaomi_led_disabled_night,
|
|
969
970
|
tz.xiaomi_overload_protection],
|
|
@@ -992,7 +993,7 @@ module.exports = [
|
|
|
992
993
|
description: 'Aqara EU smart plug',
|
|
993
994
|
vendor: 'Xiaomi',
|
|
994
995
|
fromZigbee: [fz.on_off, fz.xiaomi_switch_basic, fz.electrical_measurement, fz.metering,
|
|
995
|
-
fz.
|
|
996
|
+
fz.aqara_opple, fz.xiaomi_power, fz.device_temperature],
|
|
996
997
|
toZigbee: [tz.on_off],
|
|
997
998
|
configure: async (device, coordinatorEndpoint, logger) => {
|
|
998
999
|
const endpoint = device.getEndpoint(1);
|
|
@@ -1280,7 +1281,7 @@ module.exports = [
|
|
|
1280
1281
|
model: 'WXCJKG11LM',
|
|
1281
1282
|
vendor: 'Xiaomi',
|
|
1282
1283
|
description: 'Aqara Opple switch 1 band',
|
|
1283
|
-
fromZigbee: [fz.aqara_opple_on, fz.aqara_opple_off, fz.battery, fz.aqara_opple_multistate, fz.
|
|
1284
|
+
fromZigbee: [fz.aqara_opple_on, fz.aqara_opple_off, fz.battery, fz.aqara_opple_multistate, fz.aqara_opple],
|
|
1284
1285
|
exposes: [e.battery(), e.action([
|
|
1285
1286
|
'button_1_hold', 'button_1_release', 'button_1_single', 'button_1_double', 'button_1_triple',
|
|
1286
1287
|
'button_2_hold', 'button_2_release', 'button_2_single', 'button_2_double', 'button_2_triple',
|
|
@@ -1300,7 +1301,7 @@ module.exports = [
|
|
|
1300
1301
|
vendor: 'Xiaomi',
|
|
1301
1302
|
description: 'Aqara Opple switch 2 bands',
|
|
1302
1303
|
fromZigbee: [fz.aqara_opple_on, fz.aqara_opple_off, fz.aqara_opple_step, fz.aqara_opple_step_color_temp, fz.battery,
|
|
1303
|
-
fz.aqara_opple_multistate, fz.
|
|
1304
|
+
fz.aqara_opple_multistate, fz.aqara_opple],
|
|
1304
1305
|
exposes: [e.battery(), e.action([
|
|
1305
1306
|
'button_1_hold', 'button_1_release', 'button_1_single', 'button_1_double', 'button_1_triple',
|
|
1306
1307
|
'button_2_hold', 'button_2_release', 'button_2_single', 'button_2_double', 'button_2_triple',
|
|
@@ -1324,7 +1325,7 @@ module.exports = [
|
|
|
1324
1325
|
vendor: 'Xiaomi',
|
|
1325
1326
|
description: 'Aqara Opple switch 3 bands',
|
|
1326
1327
|
fromZigbee: [fz.aqara_opple_on, fz.aqara_opple_off, fz.aqara_opple_step, fz.aqara_opple_move, fz.aqara_opple_stop,
|
|
1327
|
-
fz.aqara_opple_step_color_temp, fz.aqara_opple_move_color_temp, fz.battery, fz.aqara_opple_multistate, fz.
|
|
1328
|
+
fz.aqara_opple_step_color_temp, fz.aqara_opple_move_color_temp, fz.battery, fz.aqara_opple_multistate, fz.aqara_opple],
|
|
1328
1329
|
exposes: [e.battery(), e.action([
|
|
1329
1330
|
'button_1_hold', 'button_1_release', 'button_1_single', 'button_1_double', 'button_1_triple',
|
|
1330
1331
|
'button_2_hold', 'button_2_release', 'button_2_single', 'button_2_double', 'button_2_triple',
|
|
@@ -1379,8 +1380,7 @@ module.exports = [
|
|
|
1379
1380
|
model: 'SSM-U01',
|
|
1380
1381
|
vendor: 'Xiaomi',
|
|
1381
1382
|
description: 'Aqara single switch module T1 (with neutral)',
|
|
1382
|
-
fromZigbee: [fz.on_off, fz.metering, fz.electrical_measurement, fz.device_temperature, fz.
|
|
1383
|
-
fz.xiaomi_switch_power_outage_memory],
|
|
1383
|
+
fromZigbee: [fz.on_off, fz.metering, fz.electrical_measurement, fz.device_temperature, fz.aqara_opple],
|
|
1384
1384
|
exposes: [e.switch(), e.energy(), e.power(), e.device_temperature(), e.power_outage_memory(), e.switch_type()],
|
|
1385
1385
|
toZigbee: [tz.xiaomi_switch_type, tz.on_off, tz.xiaomi_switch_power_outage_memory],
|
|
1386
1386
|
configure: async (device, coordinatorEndpoint, logger) => {
|
|
@@ -1402,7 +1402,7 @@ module.exports = [
|
|
|
1402
1402
|
model: 'DLKZMK11LM',
|
|
1403
1403
|
vendor: 'Xiaomi',
|
|
1404
1404
|
description: 'Aqara single switch module T1 (with neutral)',
|
|
1405
|
-
fromZigbee: [fz.on_off, fz.xiaomi_power, fz.
|
|
1405
|
+
fromZigbee: [fz.on_off, fz.xiaomi_power, fz.aqara_opple],
|
|
1406
1406
|
toZigbee: [tz.on_off, tz.xiaomi_power, tz.xiaomi_switch_type, tz.xiaomi_switch_power_outage_memory, tz.xiaomi_led_disabled_night],
|
|
1407
1407
|
exposes: [e.switch(), e.power().withAccess(ea.STATE_GET), e.energy(), e.temperature().withAccess(ea.STATE),
|
|
1408
1408
|
e.voltage().withAccess(ea.STATE), e.power_outage_memory(), e.led_disabled_night(), e.switch_type()],
|
|
@@ -1416,7 +1416,7 @@ module.exports = [
|
|
|
1416
1416
|
model: 'SSM-U02',
|
|
1417
1417
|
vendor: 'Xiaomi',
|
|
1418
1418
|
description: 'Aqara single switch module T1 (without neutral). Doesn\'t work as a router and doesn\'t support power meter',
|
|
1419
|
-
fromZigbee: [fz.on_off, fz.
|
|
1419
|
+
fromZigbee: [fz.on_off, fz.aqara_opple],
|
|
1420
1420
|
exposes: [e.switch(), e.power_outage_memory(), e.switch_type()],
|
|
1421
1421
|
toZigbee: [tz.xiaomi_switch_type, tz.on_off, tz.xiaomi_switch_power_outage_memory],
|
|
1422
1422
|
configure: async (device, coordinatorEndpoint, logger) => {
|
|
@@ -1432,7 +1432,7 @@ module.exports = [
|
|
|
1432
1432
|
model: 'DLKZMK12LM',
|
|
1433
1433
|
vendor: 'Xiaomi',
|
|
1434
1434
|
description: 'Aqara single switch module T1 (without neutral). Doesn\'t work as a router and doesn\'t support power meter',
|
|
1435
|
-
fromZigbee: [fz.on_off, fz.
|
|
1435
|
+
fromZigbee: [fz.on_off, fz.aqara_opple],
|
|
1436
1436
|
exposes: [e.switch(), e.power_outage_memory(), e.switch_type()],
|
|
1437
1437
|
toZigbee: [tz.xiaomi_switch_type, tz.on_off, tz.xiaomi_switch_power_outage_memory],
|
|
1438
1438
|
configure: async (device, coordinatorEndpoint, logger) => {
|
|
@@ -1502,7 +1502,7 @@ module.exports = [
|
|
|
1502
1502
|
model: 'WRS-R02',
|
|
1503
1503
|
vendor: 'Xiaomi',
|
|
1504
1504
|
description: 'Aqara wireless remote switch H1 (double rocker)',
|
|
1505
|
-
fromZigbee: [fz.battery, fz.aqara_opple_multistate, fz.
|
|
1505
|
+
fromZigbee: [fz.battery, fz.aqara_opple_multistate, fz.aqara_opple, fz.command_toggle],
|
|
1506
1506
|
exposes: [
|
|
1507
1507
|
e.battery(), e.action([
|
|
1508
1508
|
'button_1_hold', 'button_1_release', 'button_1_single', 'button_1_double', 'button_1_triple',
|
|
@@ -1535,7 +1535,7 @@ module.exports = [
|
|
|
1535
1535
|
model: 'QBKG38LM',
|
|
1536
1536
|
vendor: 'Xiaomi',
|
|
1537
1537
|
description: 'Aqara E1 1 gang switch (without neutral)',
|
|
1538
|
-
fromZigbee: [fz.on_off, fz.xiaomi_multistate_action, fz.
|
|
1538
|
+
fromZigbee: [fz.on_off, fz.xiaomi_multistate_action, fz.aqara_opple],
|
|
1539
1539
|
toZigbee: [tz.on_off, tz.xiaomi_switch_operation_mode_opple, tz.xiaomi_switch_power_outage_memory,
|
|
1540
1540
|
tz.aqara_switch_mode_switch],
|
|
1541
1541
|
exposes: [e.switch(), e.power_outage_memory(), e.action(['single', 'double']),
|
|
@@ -1554,7 +1554,7 @@ module.exports = [
|
|
|
1554
1554
|
model: 'QBKG39LM',
|
|
1555
1555
|
vendor: 'Xiaomi',
|
|
1556
1556
|
description: 'Aqara E1 2 gang switch (without neutral)',
|
|
1557
|
-
fromZigbee: [fz.on_off, fz.xiaomi_multistate_action, fz.
|
|
1557
|
+
fromZigbee: [fz.on_off, fz.xiaomi_multistate_action, fz.aqara_opple],
|
|
1558
1558
|
toZigbee: [tz.on_off, tz.xiaomi_switch_operation_mode_opple, tz.xiaomi_switch_power_outage_memory,
|
|
1559
1559
|
tz.aqara_switch_mode_switch],
|
|
1560
1560
|
meta: {multiEndpoint: true},
|
|
@@ -1606,7 +1606,7 @@ module.exports = [
|
|
|
1606
1606
|
model: 'QBKG41LM',
|
|
1607
1607
|
vendor: 'Xiaomi',
|
|
1608
1608
|
description: 'Aqara E1 2 gang switch (with neutral)',
|
|
1609
|
-
fromZigbee: [fz.on_off, fz.xiaomi_multistate_action, fz.
|
|
1609
|
+
fromZigbee: [fz.on_off, fz.xiaomi_multistate_action, fz.aqara_opple],
|
|
1610
1610
|
toZigbee: [tz.on_off, tz.xiaomi_switch_operation_mode_opple, tz.xiaomi_switch_power_outage_memory],
|
|
1611
1611
|
meta: {multiEndpoint: true},
|
|
1612
1612
|
endpoint: (device) => {
|
|
@@ -1634,7 +1634,7 @@ module.exports = [
|
|
|
1634
1634
|
model: 'ZNCZ15LM',
|
|
1635
1635
|
vendor: 'Xiaomi',
|
|
1636
1636
|
description: 'Aqara T1 power plug ZigBee',
|
|
1637
|
-
fromZigbee: [fz.on_off, fz.xiaomi_power, fz.
|
|
1637
|
+
fromZigbee: [fz.on_off, fz.xiaomi_power, fz.aqara_opple],
|
|
1638
1638
|
toZigbee: [tz.on_off, tz.xiaomi_switch_power_outage_memory, tz.xiaomi_led_disabled_night,
|
|
1639
1639
|
tz.xiaomi_overload_protection, tz.xiaomi_socket_button_lock],
|
|
1640
1640
|
exposes: [e.switch(), e.power().withAccess(ea.STATE), e.energy(), e.temperature().withAccess(ea.STATE),
|
|
@@ -1651,7 +1651,7 @@ module.exports = [
|
|
|
1651
1651
|
model: 'QBKG40LM',
|
|
1652
1652
|
vendor: 'Xiaomi',
|
|
1653
1653
|
description: 'Aqara E1 1 gang switch (with neutral)',
|
|
1654
|
-
fromZigbee: [fz.on_off, fz.xiaomi_multistate_action, fz.
|
|
1654
|
+
fromZigbee: [fz.on_off, fz.xiaomi_multistate_action, fz.aqara_opple],
|
|
1655
1655
|
toZigbee: [tz.on_off, tz.xiaomi_switch_operation_mode_opple, tz.xiaomi_switch_power_outage_memory],
|
|
1656
1656
|
exposes: [e.switch(), e.action(['single', 'double']), e.power_outage_memory(),
|
|
1657
1657
|
exposes.enum('operation_mode', ea.ALL, ['control_relay', 'decoupled']).withDescription('Decoupled mode')],
|
|
@@ -1667,7 +1667,7 @@ module.exports = [
|
|
|
1667
1667
|
vendor: 'Xiaomi',
|
|
1668
1668
|
description: 'Aqara T1 wireless mini switch',
|
|
1669
1669
|
meta: {battery: {voltageToPercentage: '3V_2500'}},
|
|
1670
|
-
fromZigbee: [fz.battery, fz.aqara_opple_multistate, fz.
|
|
1670
|
+
fromZigbee: [fz.battery, fz.aqara_opple_multistate, fz.aqara_opple],
|
|
1671
1671
|
toZigbee: [],
|
|
1672
1672
|
exposes: [e.battery(), e.battery_voltage(), e.action(['single', 'double', 'triple', 'quintuple', 'hold', 'release', 'many'])],
|
|
1673
1673
|
configure: async (device, coordinatorEndpoint, logger) => {
|
|
@@ -1680,7 +1680,7 @@ module.exports = [
|
|
|
1680
1680
|
model: 'GZCGQ11LM',
|
|
1681
1681
|
vendor: 'Xiaomi',
|
|
1682
1682
|
description: 'Aqara T1 light intensity sensor',
|
|
1683
|
-
fromZigbee: [fz.battery, fz.illuminance, fz.
|
|
1683
|
+
fromZigbee: [fz.battery, fz.illuminance, fz.aqara_opple],
|
|
1684
1684
|
toZigbee: [tz.GZCGQ11LM_detection_period],
|
|
1685
1685
|
meta: {battery: {voltageToPercentage: '3V_2500'}},
|
|
1686
1686
|
exposes: [e.battery(), e.battery_voltage(), e.illuminance(), e.illuminance_lux(),
|
|
@@ -1697,7 +1697,7 @@ module.exports = [
|
|
|
1697
1697
|
model: 'QBCZ15LM',
|
|
1698
1698
|
vendor: 'Xiaomi',
|
|
1699
1699
|
description: 'Aqara smart wall outlet H1 usb',
|
|
1700
|
-
fromZigbee: [fz.on_off, fz.xiaomi_power, fz.
|
|
1700
|
+
fromZigbee: [fz.on_off, fz.xiaomi_power, fz.aqara_opple],
|
|
1701
1701
|
toZigbee: [tz.on_off, tz.xiaomi_switch_power_outage_memory, tz.xiaomi_led_disabled_night,
|
|
1702
1702
|
tz.xiaomi_button_switch_mode, tz.xiaomi_overload_protection, tz.xiaomi_socket_button_lock],
|
|
1703
1703
|
meta: {multiEndpoint: true},
|
|
@@ -1736,7 +1736,7 @@ module.exports = [
|
|
|
1736
1736
|
model: 'QBCZ14LM',
|
|
1737
1737
|
vendor: 'Xiaomi',
|
|
1738
1738
|
description: 'Aqara smart wall outlet T1',
|
|
1739
|
-
fromZigbee: [fz.on_off, fz.xiaomi_power, fz.
|
|
1739
|
+
fromZigbee: [fz.on_off, fz.xiaomi_power, fz.aqara_opple],
|
|
1740
1740
|
toZigbee: [tz.on_off, tz.xiaomi_switch_power_outage_memory, tz.xiaomi_led_disabled_night,
|
|
1741
1741
|
tz.xiaomi_overload_protection, tz.xiaomi_socket_button_lock],
|
|
1742
1742
|
exposes: [
|
|
@@ -1764,8 +1764,7 @@ module.exports = [
|
|
|
1764
1764
|
exposes.numeric('action_rotation_percent_speed', ea.STATE).withUnit('%').withDescription('Rotation percent speed'),
|
|
1765
1765
|
exposes.numeric('action_rotation_time', ea.STATE).withUnit('ms').withDescription('Rotation time'),
|
|
1766
1766
|
],
|
|
1767
|
-
fromZigbee: [fz.xiaomi_on_off_action, fz.xiaomi_multistate_action, fz.xiaomi_battery, fz.
|
|
1768
|
-
fz.aqara_knob_rotation],
|
|
1767
|
+
fromZigbee: [fz.xiaomi_on_off_action, fz.xiaomi_multistate_action, fz.xiaomi_battery, fz.aqara_opple, fz.aqara_knob_rotation],
|
|
1769
1768
|
toZigbee: [tz.aqara_opple_operation_mode],
|
|
1770
1769
|
onEvent: preventReset,
|
|
1771
1770
|
configure: async (device, coordinatorEndpoint, logger) => {
|
|
@@ -1784,7 +1783,7 @@ module.exports = [
|
|
|
1784
1783
|
// eslint-disable-next-line max-len
|
|
1785
1784
|
exposes.enum('click_mode', ea.SET, ['fast', 'multi']).withDescription('Click mode, fast: only supports single click which will be send immediately after clicking, multi: supports more events like double and hold'),
|
|
1786
1785
|
],
|
|
1787
|
-
fromZigbee: [fz.xiaomi_multistate_action, fz.
|
|
1786
|
+
fromZigbee: [fz.xiaomi_multistate_action, fz.aqara_opple],
|
|
1788
1787
|
toZigbee: [tz.xiaomi_switch_click_mode],
|
|
1789
1788
|
onEvent: preventReset,
|
|
1790
1789
|
configure: async (device, coordinatorEndpoint, logger) => {
|
package/lib/constants.js
CHANGED
|
@@ -68,6 +68,15 @@ const thermostatRunningStates = {
|
|
|
68
68
|
22: 'cool',
|
|
69
69
|
};
|
|
70
70
|
|
|
71
|
+
const thermostatAcLouverPositions = {
|
|
72
|
+
0: 'fully_closed',
|
|
73
|
+
1: 'fully_closed',
|
|
74
|
+
2: 'fully_open',
|
|
75
|
+
3: 'quarter_open',
|
|
76
|
+
4: 'half_open',
|
|
77
|
+
5: 'three_quarters_open',
|
|
78
|
+
};
|
|
79
|
+
|
|
71
80
|
const fanMode = {
|
|
72
81
|
'off': 0,
|
|
73
82
|
'low': 1,
|
|
@@ -241,6 +250,7 @@ module.exports = {
|
|
|
241
250
|
thermostatSystemModes,
|
|
242
251
|
thermostatRunningStates,
|
|
243
252
|
thermostatRunningMode,
|
|
253
|
+
thermostatAcLouverPositions,
|
|
244
254
|
dayOfWeek,
|
|
245
255
|
fanMode,
|
|
246
256
|
temperatureDisplayMode,
|
package/lib/exposes.js
CHANGED
|
@@ -425,6 +425,14 @@ class Climate extends Base {
|
|
|
425
425
|
this.features.push(new Numeric('pi_heating_demand', access).withValueMin(0).withValueMax(100).withUnit('%').withDescription('Position of the valve (= demanded heat) where 0% is fully closed and 100% is fully open'));
|
|
426
426
|
return this;
|
|
427
427
|
}
|
|
428
|
+
|
|
429
|
+
withAcLouverPosition(positions, access=a.ALL) {
|
|
430
|
+
assert(!this.endpoint, 'Cannot add feature after adding endpoint');
|
|
431
|
+
const allowed = ['fully_open', 'fully_closed', 'half_open', 'quarter_open', 'three_quarters_open'];
|
|
432
|
+
positions.forEach((m) => assert(allowed.includes(m)));
|
|
433
|
+
this.features.push(new Enum('ac_louver_position', access, positions).withDescription('Ac louver position of this device'));
|
|
434
|
+
return this;
|
|
435
|
+
}
|
|
428
436
|
}
|
|
429
437
|
/**
|
|
430
438
|
* The access property is a 3-bit bitmask.
|
package/lib/reporting.js
CHANGED
|
@@ -163,6 +163,10 @@ module.exports = {
|
|
|
163
163
|
const p = payload('tempSetpointHoldDuration', 0, repInterval.HOUR, 10, overrides);
|
|
164
164
|
await endpoint.configureReporting('hvacThermostat', p);
|
|
165
165
|
},
|
|
166
|
+
thermostatAcLouverPosition: async (endpoint, overrides) => {
|
|
167
|
+
const p = payload('acLouverPosition', 0, repInterval.HOUR, null, overrides);
|
|
168
|
+
await endpoint.configureReporting('hvacThermostat', p);
|
|
169
|
+
},
|
|
166
170
|
presentValue: async (endpoint, overrides) => {
|
|
167
171
|
const p = payload('presentValue', 10, repInterval.MINUTE, 1, overrides);
|
|
168
172
|
await endpoint.configureReporting('genBinaryInput', p);
|
package/npm-shrinkwrap.json
CHANGED