zigbee-herdsman-converters 14.0.372 → 14.0.376
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 +67 -16
- package/converters/toZigbee.js +34 -3
- package/devices/bticino.js +12 -9
- package/devices/evanell.js +29 -0
- package/devices/iris.js +17 -0
- package/devices/jasco.js +18 -0
- package/devices/legrand.js +1 -1
- package/devices/lidl.js +1 -1
- package/devices/moes.js +1 -1
- package/devices/osram.js +7 -4
- package/devices/philips.js +10 -1
- package/devices/tuya.js +9 -3
- package/devices/xiaomi.js +6 -6
- package/devices/zemismart.js +10 -6
- package/lib/exposes.js +2 -1
- package/lib/tuya.js +6 -4
- package/npm-shrinkwrap.json +1 -1
- package/package.json +1 -1
package/converters/fromZigbee.js
CHANGED
|
@@ -3672,7 +3672,7 @@ const converters = {
|
|
|
3672
3672
|
case tuya.dataPoints.moesSboostHeatingCountdown:
|
|
3673
3673
|
return {boost_heating_countdown: value};
|
|
3674
3674
|
case tuya.dataPoints.moesSreset:
|
|
3675
|
-
|
|
3675
|
+
return {valve_state: value ? 'CLOSED' : 'OPEN'};
|
|
3676
3676
|
case tuya.dataPoints.moesSwindowDetectionFunktion_A2:
|
|
3677
3677
|
return {window_detection: value ? 'ON' : 'OFF'};
|
|
3678
3678
|
case tuya.dataPoints.moesSwindowDetection:
|
|
@@ -4136,6 +4136,51 @@ const converters = {
|
|
|
4136
4136
|
}
|
|
4137
4137
|
},
|
|
4138
4138
|
},
|
|
4139
|
+
evanell_thermostat: {
|
|
4140
|
+
cluster: 'manuSpecificTuya',
|
|
4141
|
+
type: ['commandDataResponse', 'commandDataReport'],
|
|
4142
|
+
convert: (model, msg, publish, options, meta) => {
|
|
4143
|
+
const result = {};
|
|
4144
|
+
for (const dpValue of msg.data.dpValues) {
|
|
4145
|
+
const value = tuya.getDataValue(dpValue);
|
|
4146
|
+
switch (dpValue.dp) {
|
|
4147
|
+
case tuya.dataPoints.evanellChildLock:
|
|
4148
|
+
result.child_lock = value ? 'LOCK' : 'UNLOCK';
|
|
4149
|
+
break;
|
|
4150
|
+
case tuya.dataPoints.evanellBattery:
|
|
4151
|
+
result.battery = value;
|
|
4152
|
+
break;
|
|
4153
|
+
case tuya.dataPoints.evanellHeatingSetpoint:
|
|
4154
|
+
result.current_heating_setpoint = value/10;
|
|
4155
|
+
break;
|
|
4156
|
+
case tuya.dataPoints.evanellLocalTemp:
|
|
4157
|
+
result.local_temperature = value/10;
|
|
4158
|
+
break;
|
|
4159
|
+
case tuya.dataPoints.evanellMode:
|
|
4160
|
+
switch (value) {
|
|
4161
|
+
case 0: // manual
|
|
4162
|
+
result.system_mode = 'auto';
|
|
4163
|
+
break;
|
|
4164
|
+
case 2: // away
|
|
4165
|
+
result.system_mode = 'heat';
|
|
4166
|
+
break;
|
|
4167
|
+
case 3: // auto
|
|
4168
|
+
result.system_mode = 'off';
|
|
4169
|
+
break;
|
|
4170
|
+
default:
|
|
4171
|
+
meta.logger.warn('zigbee-herdsman-converters:evanell_thermostat: ' +
|
|
4172
|
+
`Mode ${value} is not recognized.`);
|
|
4173
|
+
break;
|
|
4174
|
+
}
|
|
4175
|
+
break;
|
|
4176
|
+
default:
|
|
4177
|
+
meta.logger.warn(`zigbee-herdsman-converters:evanell_thermostat: NOT RECOGNIZED ` +
|
|
4178
|
+
`DP #${dpValue.dp} with data ${JSON.stringify(dpValue)}`);
|
|
4179
|
+
}
|
|
4180
|
+
}
|
|
4181
|
+
return result;
|
|
4182
|
+
},
|
|
4183
|
+
},
|
|
4139
4184
|
etop_thermostat: {
|
|
4140
4185
|
cluster: 'manuSpecificTuya',
|
|
4141
4186
|
type: ['commandDataResponse', 'commandDataReport'],
|
|
@@ -5160,7 +5205,7 @@ const converters = {
|
|
|
5160
5205
|
if (msg.data.hasOwnProperty('0')) payload.detection_period = msg.data['0'];
|
|
5161
5206
|
if (msg.data.hasOwnProperty('4')) payload.mode_switch = {4: 'anti_flicker_mode', 1: 'quick_mode'}[msg.data['4']];
|
|
5162
5207
|
if (msg.data.hasOwnProperty('10')) payload.switch_type = {1: 'toggle', 2: 'momentary'}[msg.data['10']];
|
|
5163
|
-
if (msg.data.hasOwnProperty('258')) payload.
|
|
5208
|
+
if (msg.data.hasOwnProperty('258')) payload.detection_interval = msg.data['258'];
|
|
5164
5209
|
if (msg.data.hasOwnProperty('268')) payload.motion_sensitivity = {1: 'low', 2: 'medium', 3: 'high'}[msg.data['268']];
|
|
5165
5210
|
if (msg.data.hasOwnProperty('512')) {
|
|
5166
5211
|
if (['ZNCZ15LM', 'QBCZ14LM', 'QBCZ15LM'].includes(model.model)) {
|
|
@@ -5321,7 +5366,7 @@ const converters = {
|
|
|
5321
5366
|
if (msg.data.hasOwnProperty('illuminance')) {
|
|
5322
5367
|
// The occupancy sensor only sends a message when motion detected.
|
|
5323
5368
|
// Therefore we need to publish the no_motion detected by ourselves.
|
|
5324
|
-
const timeout = meta && meta.state && meta.state.hasOwnProperty('
|
|
5369
|
+
const timeout = meta && meta.state && meta.state.hasOwnProperty('detection_interval') ? meta.state.detection_interval : 60;
|
|
5325
5370
|
|
|
5326
5371
|
// Stop existing timers because motion is detected and set a new one.
|
|
5327
5372
|
globalStore.getValue(msg.endpoint, 'timers', []).forEach((t) => clearTimeout(t));
|
|
@@ -5355,7 +5400,7 @@ const converters = {
|
|
|
5355
5400
|
|
|
5356
5401
|
// The occupancy sensor only sends a message when motion detected.
|
|
5357
5402
|
// Therefore we need to publish the no_motion detected by ourselves.
|
|
5358
|
-
const timeout = meta && meta.state && meta.state.hasOwnProperty('
|
|
5403
|
+
const timeout = meta && meta.state && meta.state.hasOwnProperty('detection_interval') ? meta.state.detection_interval : 60;
|
|
5359
5404
|
|
|
5360
5405
|
// Stop existing timers because motion is detected and set a new one.
|
|
5361
5406
|
globalStore.getValue(msg.endpoint, 'timers', []).forEach((t) => clearTimeout(t));
|
|
@@ -7538,19 +7583,25 @@ const converters = {
|
|
|
7538
7583
|
cluster: 'manuSpecificTuya',
|
|
7539
7584
|
type: ['commandGetData', 'commandDataResponse', 'raw'],
|
|
7540
7585
|
convert: (model, msg, publish, options, meta) => {
|
|
7541
|
-
const
|
|
7542
|
-
const
|
|
7543
|
-
|
|
7544
|
-
|
|
7545
|
-
|
|
7546
|
-
|
|
7547
|
-
|
|
7548
|
-
|
|
7549
|
-
|
|
7550
|
-
|
|
7551
|
-
|
|
7552
|
-
|
|
7586
|
+
const result = {};
|
|
7587
|
+
for (const dpValue of msg.data.dpValues) {
|
|
7588
|
+
const value = tuya.getDataValue(dpValue);
|
|
7589
|
+
switch (dpValue.dp) {
|
|
7590
|
+
case tuya.dataPoints.state:
|
|
7591
|
+
result.contact = Boolean(value);
|
|
7592
|
+
break;
|
|
7593
|
+
case tuya.dataPoints.thitBatteryPercentage:
|
|
7594
|
+
result.battery = value;
|
|
7595
|
+
break;
|
|
7596
|
+
case tuya.dataPoints.tuyaVibration:
|
|
7597
|
+
result.vibration = Boolean(value);
|
|
7598
|
+
break;
|
|
7599
|
+
default:
|
|
7600
|
+
meta.logger.warn(`zigbee-herdsman-converters:tuya_smart_vibration_sensor: NOT RECOGNIZED ` +
|
|
7601
|
+
`DP #${dpValue.dp} with data ${JSON.stringify(dpValue)}`);
|
|
7602
|
+
}
|
|
7553
7603
|
}
|
|
7604
|
+
return result;
|
|
7554
7605
|
},
|
|
7555
7606
|
},
|
|
7556
7607
|
moes_thermostat_tv: {
|
package/converters/toZigbee.js
CHANGED
|
@@ -1915,6 +1915,8 @@ const converters = {
|
|
|
1915
1915
|
}
|
|
1916
1916
|
}
|
|
1917
1917
|
}
|
|
1918
|
+
|
|
1919
|
+
return {state: {hue_power_on_behavior: value}};
|
|
1918
1920
|
},
|
|
1919
1921
|
},
|
|
1920
1922
|
hue_power_on_error: {
|
|
@@ -2076,12 +2078,12 @@ const converters = {
|
|
|
2076
2078
|
await entity.read('aqaraOpple', [0x0000], manufacturerOptions.xiaomi);
|
|
2077
2079
|
},
|
|
2078
2080
|
},
|
|
2079
|
-
|
|
2080
|
-
key: ['
|
|
2081
|
+
aqara_detection_interval: {
|
|
2082
|
+
key: ['detection_interval'],
|
|
2081
2083
|
convertSet: async (entity, key, value, meta) => {
|
|
2082
2084
|
value *= 1;
|
|
2083
2085
|
await entity.write('aqaraOpple', {0x0102: {value: [value], type: 0x20}}, manufacturerOptions.xiaomi);
|
|
2084
|
-
return {state: {
|
|
2086
|
+
return {state: {detection_interval: value}};
|
|
2085
2087
|
},
|
|
2086
2088
|
convertGet: async (entity, key, meta) => {
|
|
2087
2089
|
await entity.read('aqaraOpple', [0x0102], manufacturerOptions.xiaomi);
|
|
@@ -5409,6 +5411,35 @@ const converters = {
|
|
|
5409
5411
|
await tuya.sendDataPointValue(entity, tuya.dataPoints.saswellTempCalibration, value);
|
|
5410
5412
|
},
|
|
5411
5413
|
},
|
|
5414
|
+
evanell_thermostat_current_heating_setpoint: {
|
|
5415
|
+
key: ['current_heating_setpoint'],
|
|
5416
|
+
convertSet: async (entity, key, value, meta) => {
|
|
5417
|
+
const temp = Math.round(value * 10);
|
|
5418
|
+
await tuya.sendDataPointValue(entity, tuya.dataPoints.evanellHeatingSetpoint, temp);
|
|
5419
|
+
},
|
|
5420
|
+
},
|
|
5421
|
+
evanell_thermostat_system_mode: {
|
|
5422
|
+
key: ['system_mode'],
|
|
5423
|
+
convertSet: async (entity, key, value, meta) => {
|
|
5424
|
+
switch (value) {
|
|
5425
|
+
case 'off':
|
|
5426
|
+
await tuya.sendDataPointEnum(entity, tuya.dataPoints.evanellMode, 3 /* off */);
|
|
5427
|
+
break;
|
|
5428
|
+
case 'heat':
|
|
5429
|
+
await tuya.sendDataPointEnum(entity, tuya.dataPoints.evanellMode, 2 /* manual */);
|
|
5430
|
+
break;
|
|
5431
|
+
case 'auto':
|
|
5432
|
+
await tuya.sendDataPointEnum(entity, tuya.dataPoints.evanellMode, 0 /* auto */);
|
|
5433
|
+
break;
|
|
5434
|
+
}
|
|
5435
|
+
},
|
|
5436
|
+
},
|
|
5437
|
+
evanell_thermostat_child_lock: {
|
|
5438
|
+
key: ['child_lock'],
|
|
5439
|
+
convertSet: async (entity, key, value, meta) => {
|
|
5440
|
+
await tuya.sendDataPointBool(entity, tuya.dataPoints.evanellChildLock, value === 'LOCK');
|
|
5441
|
+
},
|
|
5442
|
+
},
|
|
5412
5443
|
silvercrest_smart_led_string: {
|
|
5413
5444
|
key: ['color', 'brightness', 'effect'],
|
|
5414
5445
|
convertSet: async (entity, key, value, meta) => {
|
package/devices/bticino.js
CHANGED
|
@@ -30,19 +30,22 @@ module.exports = [
|
|
|
30
30
|
vendor: 'BTicino',
|
|
31
31
|
description: 'Dimmer switch with neutral',
|
|
32
32
|
extend: extend.light_onoff_brightness({noConfigure: true}),
|
|
33
|
-
|
|
34
|
-
|
|
33
|
+
fromZigbee: [fz.brightness, fz.identify, fz.on_off, fz.lighting_ballast_configuration],
|
|
34
|
+
toZigbee: [tz.light_onoff_brightness, tz.legrand_settingAlwaysEnableLed, tz.legrand_settingEnableLedIfOn,
|
|
35
|
+
tz.legrand_settingEnableDimmer, tz.legrand_identify, tz.ballast_config],
|
|
36
|
+
exposes: [e.light_brightness(),
|
|
37
|
+
exposes.numeric('ballast_minimum_level', ea.ALL).withValueMin(1).withValueMax(254)
|
|
38
|
+
.withDescription('Specifies the minimum brightness value'),
|
|
39
|
+
exposes.numeric('ballast_maximum_level', ea.ALL).withValueMin(1).withValueMax(254)
|
|
40
|
+
.withDescription('Specifies the maximum brightness value'),
|
|
35
41
|
exposes.binary('dimmer_enabled', ea.STATE_SET, 'ON', 'OFF').withDescription('Allow the device to change brightness'),
|
|
36
42
|
exposes.binary('permanent_led', ea.STATE_SET, 'ON', 'OFF').withDescription('Enable or disable the permanent blue LED'),
|
|
37
|
-
exposes.binary('led_when_on', ea.STATE_SET, 'ON', 'OFF').withDescription('Enables the LED when the light is on'),
|
|
38
|
-
],
|
|
39
|
-
fromZigbee: [fz.brightness, fz.identify, fz.on_off],
|
|
40
|
-
toZigbee: [tz.light_onoff_brightness, tz.legrand_settingAlwaysEnableLed, tz.legrand_settingEnableLedIfOn,
|
|
41
|
-
tz.legrand_settingEnableDimmer, tz.legrand_identify],
|
|
43
|
+
exposes.binary('led_when_on', ea.STATE_SET, 'ON', 'OFF').withDescription('Enables the LED when the light is on')],
|
|
42
44
|
configure: async (device, coordinatorEndpoint, logger) => {
|
|
43
45
|
await extend.light_onoff_brightness().configure(device, coordinatorEndpoint, logger);
|
|
44
46
|
const endpoint = device.getEndpoint(1);
|
|
45
|
-
await reporting.bind(endpoint, coordinatorEndpoint, ['genIdentify', 'genOnOff', 'genLevelCtrl',
|
|
47
|
+
await reporting.bind(endpoint, coordinatorEndpoint, ['genIdentify', 'genOnOff', 'genLevelCtrl',
|
|
48
|
+
'genBinaryInput', 'lightingBallastCfg']);
|
|
46
49
|
await reporting.onOff(endpoint);
|
|
47
50
|
await reporting.brightness(endpoint);
|
|
48
51
|
},
|
|
@@ -70,7 +73,7 @@ module.exports = [
|
|
|
70
73
|
{
|
|
71
74
|
zigbeeModel: ['Bticino Din power consumption module '],
|
|
72
75
|
model: 'F20T60A',
|
|
73
|
-
description: 'DIN power consumption module',
|
|
76
|
+
description: 'DIN power consumption module (same as Legrand 412015)',
|
|
74
77
|
vendor: 'BTicino',
|
|
75
78
|
extend: extend.switch(),
|
|
76
79
|
fromZigbee: [fz.identify, fz.on_off, fz.electrical_measurement, fz.legrand_device_mode, fz.ignore_basic_report, fz.ignore_genOta],
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
const exposes = require('../lib/exposes');
|
|
2
|
+
const fz = require('../converters/fromZigbee');
|
|
3
|
+
const tz = require('../converters/toZigbee');
|
|
4
|
+
const tuya = require('../lib/tuya');
|
|
5
|
+
const reporting = require('../lib/reporting');
|
|
6
|
+
const e = exposes.presets;
|
|
7
|
+
const ea = exposes.access;
|
|
8
|
+
|
|
9
|
+
module.exports = [
|
|
10
|
+
{
|
|
11
|
+
fingerprint: [{modelID: 'TS0601', manufacturerName: '_TZE200_dmfguuli'}],
|
|
12
|
+
model: 'EZ200',
|
|
13
|
+
vendor: 'Evanell',
|
|
14
|
+
description: 'Thermostatic radiator valve',
|
|
15
|
+
fromZigbee: [fz.evanell_thermostat],
|
|
16
|
+
toZigbee: [tz.evanell_thermostat_current_heating_setpoint, tz.evanell_thermostat_system_mode,
|
|
17
|
+
tz.evanell_thermostat_child_lock],
|
|
18
|
+
onEvent: tuya.onEventSetTime,
|
|
19
|
+
configure: async (device, coordinatorEndpoint, logger) => {
|
|
20
|
+
const endpoint = device.getEndpoint(1);
|
|
21
|
+
await reporting.bind(endpoint, coordinatorEndpoint, ['genBasic']);
|
|
22
|
+
},
|
|
23
|
+
exposes: [e.child_lock(), e.battery(),
|
|
24
|
+
exposes.climate()
|
|
25
|
+
.withSetpoint('current_heating_setpoint', 5, 30, 0.5, ea.STATE_SET).withLocalTemperature(ea.STATE)
|
|
26
|
+
.withSystemMode(['off', 'heat', 'auto'], ea.STATE_SET),
|
|
27
|
+
],
|
|
28
|
+
},
|
|
29
|
+
];
|
package/devices/iris.js
CHANGED
|
@@ -3,6 +3,7 @@ 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 e = exposes.presets;
|
|
6
|
+
const extend = require('../lib/extend');
|
|
6
7
|
|
|
7
8
|
module.exports = [
|
|
8
9
|
{
|
|
@@ -18,6 +19,8 @@ module.exports = [
|
|
|
18
19
|
await reporting.bind(endpoint, coordinatorEndpoint, ['msTemperatureMeasurement', 'genPowerCfg']);
|
|
19
20
|
await reporting.temperature(endpoint);
|
|
20
21
|
await reporting.batteryVoltage(endpoint);
|
|
22
|
+
device.powerSource = 'Battery';
|
|
23
|
+
device.save();
|
|
21
24
|
},
|
|
22
25
|
exposes: [e.contact(), e.battery_low(), e.tamper(), e.temperature(), e.battery()],
|
|
23
26
|
},
|
|
@@ -144,4 +147,18 @@ module.exports = [
|
|
|
144
147
|
},
|
|
145
148
|
exposes: [e.switch(), e.battery()],
|
|
146
149
|
},
|
|
150
|
+
{
|
|
151
|
+
zigbeeModel: ['1113-S'],
|
|
152
|
+
model: 'iL03_1',
|
|
153
|
+
vendor: 'Iris',
|
|
154
|
+
description: 'Smart plug',
|
|
155
|
+
extend: extend.switch(),
|
|
156
|
+
configure: async (device, coordinatorEndpoint, logger) => {
|
|
157
|
+
const endpoint = device.getEndpoint(1);
|
|
158
|
+
await reporting.bind(endpoint, coordinatorEndpoint, ['genOnOff']);
|
|
159
|
+
await reporting.onOff(endpoint);
|
|
160
|
+
device.powerSource = 'Mains (single phase)';
|
|
161
|
+
device.save();
|
|
162
|
+
},
|
|
163
|
+
},
|
|
147
164
|
];
|
package/devices/jasco.js
ADDED
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
const reporting = require('../lib/reporting');
|
|
2
|
+
const extend = require('../lib/extend');
|
|
3
|
+
|
|
4
|
+
module.exports = [
|
|
5
|
+
{
|
|
6
|
+
zigbeeModel: ['35938'],
|
|
7
|
+
model: 'ZB3102',
|
|
8
|
+
vendor: 'Jasco Products',
|
|
9
|
+
description: 'Zigbee plug-in smart dimmer',
|
|
10
|
+
extend: extend.light_onoff_brightness({noConfigure: true}),
|
|
11
|
+
configure: async (device, coordinatorEndpoint, logger) => {
|
|
12
|
+
await extend.light_onoff_brightness().configure(device, coordinatorEndpoint, logger);
|
|
13
|
+
const endpoint = device.getEndpoint(1);
|
|
14
|
+
await reporting.bind(endpoint, coordinatorEndpoint, ['genOnOff']);
|
|
15
|
+
await reporting.onOff(endpoint);
|
|
16
|
+
},
|
|
17
|
+
},
|
|
18
|
+
];
|
package/devices/legrand.js
CHANGED
|
@@ -19,7 +19,7 @@ module.exports = [
|
|
|
19
19
|
zigbeeModel: [' Contactor\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000'+
|
|
20
20
|
'\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000'],
|
|
21
21
|
model: 'FC80CC',
|
|
22
|
-
description: 'Legrand (or Bticino) DIN contactor module
|
|
22
|
+
description: 'Legrand (or Bticino) DIN contactor module',
|
|
23
23
|
vendor: 'Legrand',
|
|
24
24
|
extend: extend.switch(),
|
|
25
25
|
fromZigbee: [fz.identify, fz.on_off, fz.electrical_measurement, fz.legrand_device_mode, fz.ignore_basic_report, fz.ignore_genOta],
|
package/devices/lidl.js
CHANGED
|
@@ -667,7 +667,7 @@ module.exports = [
|
|
|
667
667
|
fingerprint: [{modelID: 'TS0101', manufacturerName: '_TZ3000_pnzfdr9y'}],
|
|
668
668
|
model: 'HG06619',
|
|
669
669
|
vendor: 'Lidl',
|
|
670
|
-
description: 'Silvercrest
|
|
670
|
+
description: 'Silvercrest outdoor plug',
|
|
671
671
|
extend: extend.switch(),
|
|
672
672
|
configure: async (device, coordinatorEndpoint, logger) => {
|
|
673
673
|
const endpoint = device.getEndpoint(1);
|
package/devices/moes.js
CHANGED
|
@@ -206,7 +206,7 @@ module.exports = [
|
|
|
206
206
|
tz.moesS_thermostat_system_mode, tz.moesS_thermostat_schedule_programming],
|
|
207
207
|
exposes: [
|
|
208
208
|
e.battery(), e.child_lock(), e.eco_mode(), e.eco_temperature(), e.max_temperature(), e.min_temperature(),
|
|
209
|
-
e.position(), e.window_detection(),
|
|
209
|
+
e.valve_state(), e.position(), e.window_detection(),
|
|
210
210
|
exposes.binary('window', ea.STATE, 'CLOSED', 'OPEN').withDescription('Window status closed or open '),
|
|
211
211
|
exposes.climate()
|
|
212
212
|
.withLocalTemperature(ea.STATE).withSetpoint('current_heating_setpoint', 5, 35, 0.5, ea.STATE_SET)
|
package/devices/osram.js
CHANGED
|
@@ -390,14 +390,15 @@ module.exports = [
|
|
|
390
390
|
ota: ota.ledvance,
|
|
391
391
|
},
|
|
392
392
|
{
|
|
393
|
-
zigbeeModel: ['Zigbee 3.0 DALI CONV LI'],
|
|
393
|
+
zigbeeModel: ['Zigbee 3.0 DALI CONV LI', 'Zigbee 3.0 DALI CONV LI\u0000'],
|
|
394
394
|
model: '4062172044776_1',
|
|
395
395
|
vendor: 'OSRAM',
|
|
396
396
|
description: 'Zigbee 3.0 DALI CONV LI dimmer for DALI-based luminaires (only one device)',
|
|
397
397
|
extend: extend.ledvance.light_onoff_brightness(),
|
|
398
398
|
},
|
|
399
399
|
{
|
|
400
|
-
fingerprint: [{modelID: 'Zigbee 3.0 DALI CONV LI', endpoints: [{ID: 10}, {ID: 25}, {ID: 242}]}
|
|
400
|
+
fingerprint: [{modelID: 'Zigbee 3.0 DALI CONV LI', endpoints: [{ID: 10}, {ID: 25}, {ID: 242}]},
|
|
401
|
+
{modelID: 'Zigbee 3.0 DALI CONV LI\u0000', endpoints: [{ID: 10}, {ID: 25}, {ID: 242}]}],
|
|
401
402
|
model: '4062172044776_2',
|
|
402
403
|
vendor: 'OSRAM',
|
|
403
404
|
description: 'Zigbee 3.0 DALI CONV LI dimmer for DALI-based luminaires (one device and pushbutton)',
|
|
@@ -410,7 +411,8 @@ module.exports = [
|
|
|
410
411
|
},
|
|
411
412
|
},
|
|
412
413
|
{
|
|
413
|
-
fingerprint: [{modelID: 'Zigbee 3.0 DALI CONV LI', endpoints: [{ID: 10}, {ID: 11}, {ID: 242}]}
|
|
414
|
+
fingerprint: [{modelID: 'Zigbee 3.0 DALI CONV LI', endpoints: [{ID: 10}, {ID: 11}, {ID: 242}]},
|
|
415
|
+
{modelID: 'Zigbee 3.0 DALI CONV LI\u0000', endpoints: [{ID: 10}, {ID: 11}, {ID: 242}]}],
|
|
414
416
|
model: '4062172044776_3',
|
|
415
417
|
vendor: 'OSRAM',
|
|
416
418
|
description: 'Zigbee 3.0 DALI CONV LI dimmer for DALI-based luminaires (with two devices)',
|
|
@@ -430,7 +432,8 @@ module.exports = [
|
|
|
430
432
|
},
|
|
431
433
|
},
|
|
432
434
|
{
|
|
433
|
-
fingerprint: [{modelID: 'Zigbee 3.0 DALI CONV LI', endpoints: [{ID: 10}, {ID: 11}, {ID: 25}, {ID: 242}]}
|
|
435
|
+
fingerprint: [{modelID: 'Zigbee 3.0 DALI CONV LI', endpoints: [{ID: 10}, {ID: 11}, {ID: 25}, {ID: 242}]},
|
|
436
|
+
{modelID: 'Zigbee 3.0 DALI CONV LI\u0000', endpoints: [{ID: 10}, {ID: 11}, {ID: 25}, {ID: 242}]}],
|
|
434
437
|
model: '4062172044776_4',
|
|
435
438
|
vendor: 'OSRAM',
|
|
436
439
|
description: 'Zigbee 3.0 DALI CONV LI dimmer for DALI-based luminaires (with two devices and pushbutton)',
|
package/devices/philips.js
CHANGED
|
@@ -35,7 +35,7 @@ module.exports = [
|
|
|
35
35
|
vendor: 'Philips',
|
|
36
36
|
description: 'Centura recessed spotlight',
|
|
37
37
|
meta: {turnsOffAtBrightness1: true},
|
|
38
|
-
extend: hueExtend.
|
|
38
|
+
extend: hueExtend.light_onoff_brightness_colortemp_color({colorTempRange: [153, 500]}),
|
|
39
39
|
ota: ota.zigbeeOTA,
|
|
40
40
|
},
|
|
41
41
|
{
|
|
@@ -2574,4 +2574,13 @@ module.exports = [
|
|
|
2574
2574
|
extend: hueExtend.light_onoff_brightness(),
|
|
2575
2575
|
ota: ota.zigbeeOTA,
|
|
2576
2576
|
},
|
|
2577
|
+
{
|
|
2578
|
+
zigbeeModel: ['LWA019'],
|
|
2579
|
+
model: '9290024691',
|
|
2580
|
+
vendor: 'Philips',
|
|
2581
|
+
description: 'Hue white single filament bulb A19 E26 with Bluetooth (1100 Lumen)',
|
|
2582
|
+
meta: {turnsOffAtBrightness1: true},
|
|
2583
|
+
extend: hueExtend.light_onoff_brightness(),
|
|
2584
|
+
ota: ota.zigbeeOTA,
|
|
2585
|
+
},
|
|
2577
2586
|
];
|
package/devices/tuya.js
CHANGED
|
@@ -209,6 +209,7 @@ module.exports = [
|
|
|
209
209
|
fingerprint: [{modelID: 'TS0202', manufacturerName: '_TYZB01_ef5xlc9q'},
|
|
210
210
|
{modelID: 'TS0202', manufacturerName: '_TYZB01_vwqnz1sn'},
|
|
211
211
|
{modelID: 'TS0202', manufacturerName: '_TYZB01_2b8f6cio'},
|
|
212
|
+
{modelID: 'TS0202', manufacturerName: '_TZE200_bq5c8xfe'},
|
|
212
213
|
{modelID: 'TS0202', manufacturerName: '_TYZB01_dl7cejts'},
|
|
213
214
|
{modelID: 'TS0202', manufacturerName: '_TYZB01_qjqgmqxr'},
|
|
214
215
|
{modelID: 'TS0202', manufacturerName: '_TZ3000_mmtwjmaq'},
|
|
@@ -222,7 +223,7 @@ module.exports = [
|
|
|
222
223
|
model: 'TS0202',
|
|
223
224
|
vendor: 'TuYa',
|
|
224
225
|
description: 'Motion sensor',
|
|
225
|
-
whiteLabel: [{vendor: 'Mercator Ikuü', model: 'SMA02P'}],
|
|
226
|
+
whiteLabel: [{vendor: 'Mercator Ikuü', model: 'SMA02P'}, {vendor: 'TuYa ', model: 'TY-ZPR06'}],
|
|
226
227
|
fromZigbee: [fz.ias_occupancy_alarm_1, fz.battery, fz.ignore_basic_report, fz.ias_occupancy_alarm_1_report],
|
|
227
228
|
toZigbee: [],
|
|
228
229
|
exposes: [e.occupancy(), e.battery_low(), e.tamper(), e.battery()],
|
|
@@ -1142,7 +1143,9 @@ module.exports = [
|
|
|
1142
1143
|
toZigbee: [tz.on_off, tz.tuya_switch_power_outage_memory],
|
|
1143
1144
|
configure: async (device, coordinatorEndpoint, logger) => {
|
|
1144
1145
|
const endpoint = device.getEndpoint(1);
|
|
1145
|
-
|
|
1146
|
+
// Enables reporting of physical state changes
|
|
1147
|
+
// https://github.com/Koenkk/zigbee2mqtt/issues/9057#issuecomment-1007742130
|
|
1148
|
+
await endpoint.read('genBasic', ['manufacturerName', 'zclVersion', 'appVersion', 'modelId', 'powerSource', 0xfffe]);
|
|
1146
1149
|
endpoint.saveClusterAttributeKeyValue('haElectricalMeasurement', {acCurrentDivisor: 1000, acCurrentMultiplier: 1});
|
|
1147
1150
|
endpoint.saveClusterAttributeKeyValue('seMetering', {divisor: 100, multiplier: 1});
|
|
1148
1151
|
device.save();
|
|
@@ -1658,7 +1661,10 @@ module.exports = [
|
|
|
1658
1661
|
toZigbee: [],
|
|
1659
1662
|
configure: async (device, coordinatorEndpoint, logger) => {
|
|
1660
1663
|
const endpoint = device.getEndpoint(1);
|
|
1661
|
-
|
|
1664
|
+
// Enables reporting of measurement state changes
|
|
1665
|
+
await endpoint.read('genBasic', ['manufacturerName', 'zclVersion', 'appVersion', 'modelId', 'powerSource', 0xfffe]);
|
|
1666
|
+
await reporting.bind(endpoint, coordinatorEndpoint, ['genBasic', 'genPowerCfg',
|
|
1667
|
+
'msTemperatureMeasurement', 'msIlluminanceMeasurement', 'msRelativeHumidity', 'manuSpecificTuya_2']);
|
|
1662
1668
|
},
|
|
1663
1669
|
exposes: [e.temperature(), e.humidity(), e.battery(), e.illuminance(), e.illuminance_lux(),
|
|
1664
1670
|
exposes.numeric('alarm_temperature_max', ea.STATE).withUnit('°C').withDescription('Alarm temperature max'),
|
package/devices/xiaomi.js
CHANGED
|
@@ -875,10 +875,10 @@ module.exports = [
|
|
|
875
875
|
vendor: 'Xiaomi',
|
|
876
876
|
description: 'Aqara T1 human body movement and illuminance sensor',
|
|
877
877
|
fromZigbee: [fz.RTCGQ12LM_occupancy_illuminance, fz.aqara_opple, fz.battery],
|
|
878
|
-
toZigbee: [tz.
|
|
878
|
+
toZigbee: [tz.aqara_detection_interval],
|
|
879
879
|
exposes: [e.occupancy(), e.illuminance().withUnit('lx').withDescription('Measured illuminance in lux'),
|
|
880
|
-
exposes.numeric('
|
|
881
|
-
.withDescription('Time
|
|
880
|
+
exposes.numeric('detection_interval', ea.ALL).withValueMin(2).withValueMax(65535).withUnit('s')
|
|
881
|
+
.withDescription('Time interval for detecting actions'), e.battery()],
|
|
882
882
|
meta: {battery: {voltageToPercentage: '3V_2100'}},
|
|
883
883
|
configure: async (device, coordinatorEndpoint, logger) => {
|
|
884
884
|
const endpoint = device.getEndpoint(1);
|
|
@@ -892,10 +892,10 @@ module.exports = [
|
|
|
892
892
|
vendor: 'Xiaomi',
|
|
893
893
|
description: 'Aqara high precision motion sensor',
|
|
894
894
|
fromZigbee: [fz.RTCGQ13LM_occupancy, fz.aqara_opple, fz.battery],
|
|
895
|
-
toZigbee: [tz.
|
|
895
|
+
toZigbee: [tz.aqara_detection_interval, tz.RTCGQ13LM_motion_sensitivity],
|
|
896
896
|
exposes: [e.occupancy(), exposes.enum('motion_sensitivity', ea.ALL, ['low', 'medium', 'high']),
|
|
897
|
-
exposes.numeric('
|
|
898
|
-
.withDescription('Time
|
|
897
|
+
exposes.numeric('detection_interval', ea.ALL).withValueMin(2).withValueMax(65535).withUnit('s')
|
|
898
|
+
.withDescription('Time interval for detecting actions'), e.battery()],
|
|
899
899
|
meta: {battery: {voltageToPercentage: '3V_2100'}},
|
|
900
900
|
configure: async (device, coordinatorEndpoint, logger) => {
|
|
901
901
|
const endpoint = device.getEndpoint(1);
|
package/devices/zemismart.js
CHANGED
|
@@ -12,11 +12,15 @@ const fzLocal = {
|
|
|
12
12
|
type: ['commandGetData', 'commandSetDataResponse', 'commandDataResponse'],
|
|
13
13
|
convert: (model, msg, publish, options, meta) => {
|
|
14
14
|
const dpValue = tuya.firstDpValue(msg, meta, 'ZMRM02');
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
15
|
+
if (dpValue.dp === 10) {
|
|
16
|
+
return {battery: tuya.getDataValue(dpValue)};
|
|
17
|
+
} else {
|
|
18
|
+
const button = dpValue.dp;
|
|
19
|
+
const actionValue = tuya.getDataValue(dpValue);
|
|
20
|
+
const lookup = {0: 'single', 1: 'double', 2: 'hold'};
|
|
21
|
+
const action = lookup[actionValue];
|
|
22
|
+
return {action: `button_${button}_${action}`};
|
|
23
|
+
}
|
|
20
24
|
},
|
|
21
25
|
},
|
|
22
26
|
};
|
|
@@ -90,7 +94,7 @@ module.exports = [
|
|
|
90
94
|
fromZigbee: [fzLocal.ZMRM02],
|
|
91
95
|
toZigbee: [],
|
|
92
96
|
onEvent: tuya.onEventSetTime,
|
|
93
|
-
exposes: [e.action([
|
|
97
|
+
exposes: [e.battery(), e.action([
|
|
94
98
|
'button_1_hold', 'button_1_single', 'button_1_double',
|
|
95
99
|
'button_2_hold', 'button_2_single', 'button_2_double',
|
|
96
100
|
'button_3_hold', 'button_3_single', 'button_3_double',
|
package/lib/exposes.js
CHANGED
|
@@ -557,7 +557,7 @@ module.exports = {
|
|
|
557
557
|
linkquality: () => new Numeric('linkquality', access.STATE).withUnit('lqi').withDescription('Link quality (signal strength)').withValueMin(0).withValueMax(255),
|
|
558
558
|
local_temperature: () => new Numeric('local_temperature', access.STATE_GET).withUnit('°C').withDescription('Current temperature measured on the device'),
|
|
559
559
|
lock: () => new Lock().withState('state', 'LOCK', 'UNLOCK', 'State of the lock').withLockState('lock_state', 'Actual state of the lock'),
|
|
560
|
-
max_temperature: () => new Numeric('max_temperature', access.STATE_SET).withUnit('°C').withDescription('Maximum temperature').withValueMin(15).withValueMax(
|
|
560
|
+
max_temperature: () => new Numeric('max_temperature', access.STATE_SET).withUnit('°C').withDescription('Maximum temperature').withValueMin(15).withValueMax(35),
|
|
561
561
|
max_temperature_limit: () => new Numeric('max_temperature_limit', access.STATE_SET).withUnit('°C').withDescription('Maximum temperature limit').withValueMin(0).withValueMax(35),
|
|
562
562
|
min_temperature: () => new Numeric('min_temperature', access.STATE_SET).withUnit('°C').withDescription('Minimum temperature').withValueMin(1).withValueMax(15),
|
|
563
563
|
noise: () => new Numeric('noise', access.STATE).withUnit('dBA').withDescription('The measured noise value'),
|
|
@@ -585,6 +585,7 @@ module.exports = {
|
|
|
585
585
|
tamper: () => new Binary('tamper', access.STATE, true, false).withDescription('Indicates whether the device is tampered'),
|
|
586
586
|
temperature: () => new Numeric('temperature', access.STATE).withUnit('°C').withDescription('Measured temperature value'),
|
|
587
587
|
test: () => new Binary('test', access.STATE, true, false).withDescription('Indicates whether the device is being tested'),
|
|
588
|
+
valve_state: () => new Binary('valve_state', access.STATE, 'OPEN', 'CLOSED').withDescription('Valve state if open or closed'),
|
|
588
589
|
valve_detection: () => new Switch().withState('valve_detection', true).setAccess('state', access.STATE_SET),
|
|
589
590
|
vibration: () => new Binary('vibration', access.STATE, true, false).withDescription('Indicates whether the device detected vibration'),
|
|
590
591
|
voc: () => new Numeric('voc', access.STATE).withUnit('ppb').withDescription('Measured VOC value'),
|
package/lib/tuya.js
CHANGED
|
@@ -85,10 +85,6 @@ async function onEventMeasurementPoll(type, data, device, options) {
|
|
|
85
85
|
const interval = setInterval(async () => {
|
|
86
86
|
try {
|
|
87
87
|
await endpoint.read('haElectricalMeasurement', ['rmsVoltage', 'rmsCurrent', 'activePower']);
|
|
88
|
-
await endpoint.read('seMetering', ['currentSummDelivered']);
|
|
89
|
-
if (device.manufacturerName === '_TZ3000_u5u4cakc') {
|
|
90
|
-
await endpoint.read('genOnOff', ['onOff']);
|
|
91
|
-
}
|
|
92
88
|
} catch (error) {/* Do nothing*/}
|
|
93
89
|
}, seconds*1000);
|
|
94
90
|
globalStore.putValue(device, 'interval', interval);
|
|
@@ -535,6 +531,12 @@ const dataPoints = {
|
|
|
535
531
|
// TUYA WLS-100z Water Leak Sensor
|
|
536
532
|
wlsWaterLeak: 1,
|
|
537
533
|
wlsBatteryPercentage: 4,
|
|
534
|
+
// Evanell
|
|
535
|
+
evanellMode: 2,
|
|
536
|
+
evanellHeatingSetpoint: 4,
|
|
537
|
+
evanellLocalTemp: 5,
|
|
538
|
+
evanellBattery: 6,
|
|
539
|
+
evanellChildLock: 8,
|
|
538
540
|
};
|
|
539
541
|
|
|
540
542
|
const thermostatWeekFormat = {
|
package/npm-shrinkwrap.json
CHANGED