zigbee-herdsman-converters 14.0.604 → 14.0.607
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 +17 -16
- package/devices/garza.js +11 -0
- package/devices/moes.js +2 -1
- package/devices/ozsmartthings.js +11 -0
- package/devices/philips.js +7 -0
- package/devices/rtx.js +9 -0
- package/devices/saswell.js +0 -1
- package/devices/shinasystem.js +45 -4
- package/devices/sonoff.js +14 -1
- package/devices/tuya.js +57 -1
- package/devices/yale.js +2 -2
- package/lib/tuya.js +5 -0
- package/package.json +1 -1
package/converters/fromZigbee.js
CHANGED
|
@@ -4839,7 +4839,8 @@ const converters = {
|
|
|
4839
4839
|
}
|
|
4840
4840
|
return {brightness: mapNumberRange(value, 10, 1000, 0, 254)};
|
|
4841
4841
|
}
|
|
4842
|
-
} else if (['_TZE200_3p5ydos3', '_TZE200_9i9dt8is', '_TZE200_dfxkcots']
|
|
4842
|
+
} else if (['_TZE200_3p5ydos3', '_TZE200_9i9dt8is', '_TZE200_dfxkcots', '_TZE200_w4cryh2i']
|
|
4843
|
+
.includes(meta.device.manufacturerName)) {
|
|
4843
4844
|
if (dpValue.dp === tuya.dataPoints.eardaDimmerLevel) {
|
|
4844
4845
|
return {brightness: mapNumberRange(value, 0, 1000, 0, 254)};
|
|
4845
4846
|
} else if (dpValue.dp === tuya.dataPoints.dimmerMinLevel) {
|
package/converters/toZigbee.js
CHANGED
|
@@ -176,7 +176,7 @@ const converters = {
|
|
|
176
176
|
if (!utils.isInRange(0, meta.mapped.meta.pinCodeCount - 1, user)) throw new Error('user must be in range for device');
|
|
177
177
|
|
|
178
178
|
if (pinCode == null) {
|
|
179
|
-
await entity.command('closuresDoorLock', 'clearPinCode', {'userid': user}, utils.getOptions(meta.mapped));
|
|
179
|
+
await entity.command('closuresDoorLock', 'clearPinCode', {'userid': user}, utils.getOptions(meta.mapped, entity));
|
|
180
180
|
} else {
|
|
181
181
|
if (isNaN(pinCode)) throw new Error('pinCode must be a number');
|
|
182
182
|
const typeLookup = {'unrestricted': 0, 'year_day_schedule': 1, 'week_day_schedule': 2, 'master': 3, 'non_access': 4};
|
|
@@ -187,7 +187,7 @@ const converters = {
|
|
|
187
187
|
'usertype': typeLookup[userType],
|
|
188
188
|
'pincodevalue': pinCode.toString(),
|
|
189
189
|
};
|
|
190
|
-
await entity.command('closuresDoorLock', 'setPinCode', payload, utils.getOptions(meta.mapped));
|
|
190
|
+
await entity.command('closuresDoorLock', 'setPinCode', payload, utils.getOptions(meta.mapped, entity));
|
|
191
191
|
}
|
|
192
192
|
},
|
|
193
193
|
convertGet: async (entity, key, meta) => {
|
|
@@ -235,7 +235,7 @@ const converters = {
|
|
|
235
235
|
'userid': user,
|
|
236
236
|
'userstatus': status,
|
|
237
237
|
},
|
|
238
|
-
utils.getOptions(meta.mapped),
|
|
238
|
+
utils.getOptions(meta.mapped, entity),
|
|
239
239
|
);
|
|
240
240
|
},
|
|
241
241
|
convertGet: async (entity, key, meta) => {
|
|
@@ -3070,24 +3070,24 @@ const converters = {
|
|
|
3070
3070
|
|
|
3071
3071
|
const oldPosition = meta.state.position;
|
|
3072
3072
|
if (value == 100) {
|
|
3073
|
-
await entity.command('closuresWindowCovering', 'upOpen', {}, utils.getOptions(meta.mapped));
|
|
3073
|
+
await entity.command('closuresWindowCovering', 'upOpen', {}, utils.getOptions(meta.mapped, entity));
|
|
3074
3074
|
} else if (value == 0) {
|
|
3075
|
-
await entity.command('closuresWindowCovering', 'downClose', {}, utils.getOptions(meta.mapped));
|
|
3075
|
+
await entity.command('closuresWindowCovering', 'downClose', {}, utils.getOptions(meta.mapped, entity));
|
|
3076
3076
|
} else {
|
|
3077
3077
|
if (oldPosition > value) {
|
|
3078
3078
|
const delta = oldPosition - value;
|
|
3079
3079
|
const mutiplicateur = meta.options.time_open / 100;
|
|
3080
3080
|
const timeBeforeStop = delta * mutiplicateur;
|
|
3081
|
-
await entity.command('closuresWindowCovering', 'downClose', {}, utils.getOptions(meta.mapped));
|
|
3081
|
+
await entity.command('closuresWindowCovering', 'downClose', {}, utils.getOptions(meta.mapped, entity));
|
|
3082
3082
|
await sleepSeconds(timeBeforeStop);
|
|
3083
|
-
await entity.command('closuresWindowCovering', 'stop', {}, utils.getOptions(meta.mapped));
|
|
3083
|
+
await entity.command('closuresWindowCovering', 'stop', {}, utils.getOptions(meta.mapped, entity));
|
|
3084
3084
|
} else if (oldPosition < value) {
|
|
3085
3085
|
const delta = value - oldPosition;
|
|
3086
3086
|
const mutiplicateur = meta.options.time_close / 100;
|
|
3087
3087
|
const timeBeforeStop = delta * mutiplicateur;
|
|
3088
|
-
await entity.command('closuresWindowCovering', 'upOpen', {}, utils.getOptions(meta.mapped));
|
|
3088
|
+
await entity.command('closuresWindowCovering', 'upOpen', {}, utils.getOptions(meta.mapped, entity));
|
|
3089
3089
|
await sleepSeconds(timeBeforeStop);
|
|
3090
|
-
await entity.command('closuresWindowCovering', 'stop', {}, utils.getOptions(meta.mapped));
|
|
3090
|
+
await entity.command('closuresWindowCovering', 'stop', {}, utils.getOptions(meta.mapped, entity));
|
|
3091
3091
|
}
|
|
3092
3092
|
}
|
|
3093
3093
|
|
|
@@ -3825,7 +3825,7 @@ const converters = {
|
|
|
3825
3825
|
// upscale to 1000
|
|
3826
3826
|
let newValue;
|
|
3827
3827
|
let dp = tuya.dataPoints.dimmerLevel;
|
|
3828
|
-
if (['_TZE200_3p5ydos3', '_TZE200_9i9dt8is', '_TZE200_dfxkcots'].includes(meta.device.manufacturerName)) {
|
|
3828
|
+
if (['_TZE200_3p5ydos3', '_TZE200_9i9dt8is', '_TZE200_dfxkcots', '_TZE200_w4cryh2i'].includes(meta.device.manufacturerName)) {
|
|
3829
3829
|
dp = tuya.dataPoints.eardaDimmerLevel;
|
|
3830
3830
|
}
|
|
3831
3831
|
if (key === 'brightness_min') {
|
|
@@ -5545,7 +5545,7 @@ const converters = {
|
|
|
5545
5545
|
scenename = value.name;
|
|
5546
5546
|
}
|
|
5547
5547
|
|
|
5548
|
-
const response = await entity.command('genScenes', 'store', {groupid, sceneid}, utils.getOptions(meta.mapped));
|
|
5548
|
+
const response = await entity.command('genScenes', 'store', {groupid, sceneid}, utils.getOptions(meta.mapped, entity));
|
|
5549
5549
|
|
|
5550
5550
|
if (isGroup) {
|
|
5551
5551
|
if (meta.membersState) {
|
|
@@ -5567,7 +5567,7 @@ const converters = {
|
|
|
5567
5567
|
convertSet: async (entity, key, value, meta) => {
|
|
5568
5568
|
const groupid = entity.constructor.name === 'Group' ? entity.groupID : 0;
|
|
5569
5569
|
const sceneid = value;
|
|
5570
|
-
await entity.command('genScenes', 'recall', {groupid, sceneid}, utils.getOptions(meta.mapped));
|
|
5570
|
+
await entity.command('genScenes', 'recall', {groupid, sceneid}, utils.getOptions(meta.mapped, entity));
|
|
5571
5571
|
|
|
5572
5572
|
const addColorMode = (newState) => {
|
|
5573
5573
|
if (newState.hasOwnProperty('color_temp')) {
|
|
@@ -5736,12 +5736,13 @@ const converters = {
|
|
|
5736
5736
|
* We accept a SUCESS or NOT_FOUND as a result of the remove call.
|
|
5737
5737
|
*/
|
|
5738
5738
|
const removeresp = await entity.command(
|
|
5739
|
-
'genScenes', 'remove', {groupid, sceneid}, utils.getOptions(meta.mapped),
|
|
5739
|
+
'genScenes', 'remove', {groupid, sceneid}, utils.getOptions(meta.mapped, entity),
|
|
5740
5740
|
);
|
|
5741
5741
|
|
|
5742
5742
|
if (isGroup || (removeresp.status === 0 || removeresp.status == 133 || removeresp.status == 139)) {
|
|
5743
5743
|
const response = await entity.command(
|
|
5744
|
-
'genScenes', 'add', {groupid, sceneid, scenename: '', transtime, extensionfieldsets},
|
|
5744
|
+
'genScenes', 'add', {groupid, sceneid, scenename: '', transtime, extensionfieldsets},
|
|
5745
|
+
utils.getOptions(meta.mapped, entity),
|
|
5745
5746
|
);
|
|
5746
5747
|
|
|
5747
5748
|
if (isGroup) {
|
|
@@ -5768,7 +5769,7 @@ const converters = {
|
|
|
5768
5769
|
const groupid = entity.constructor.name === 'Group' ? entity.groupID : 0;
|
|
5769
5770
|
const sceneid = value;
|
|
5770
5771
|
const response = await entity.command(
|
|
5771
|
-
'genScenes', 'remove', {groupid, sceneid}, utils.getOptions(meta.mapped),
|
|
5772
|
+
'genScenes', 'remove', {groupid, sceneid}, utils.getOptions(meta.mapped, entity),
|
|
5772
5773
|
);
|
|
5773
5774
|
const isGroup = entity.constructor.name === 'Group';
|
|
5774
5775
|
if (isGroup) {
|
|
@@ -5790,7 +5791,7 @@ const converters = {
|
|
|
5790
5791
|
convertSet: async (entity, key, value, meta) => {
|
|
5791
5792
|
const groupid = entity.constructor.name === 'Group' ? entity.groupID : 0;
|
|
5792
5793
|
const response = await entity.command(
|
|
5793
|
-
'genScenes', 'removeAll', {groupid}, utils.getOptions(meta.mapped),
|
|
5794
|
+
'genScenes', 'removeAll', {groupid}, utils.getOptions(meta.mapped, entity),
|
|
5794
5795
|
);
|
|
5795
5796
|
const isGroup = entity.constructor.name === 'Group';
|
|
5796
5797
|
if (isGroup) {
|
package/devices/garza.js
ADDED
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
const extend = require('../lib/extend');
|
|
2
|
+
|
|
3
|
+
module.exports = [
|
|
4
|
+
{
|
|
5
|
+
fingerprint: [{modelID: 'TS0505B', manufacturerName: '_TZ3210_sln7ah6r'}],
|
|
6
|
+
model: 'Garza-Standard-A60',
|
|
7
|
+
vendor: 'Garza Smart',
|
|
8
|
+
description: 'Standard A60 bulb',
|
|
9
|
+
extend: extend.light_onoff_brightness_colortemp_color({colorTempRange: [153, 500]}),
|
|
10
|
+
},
|
|
11
|
+
];
|
package/devices/moes.js
CHANGED
|
@@ -285,7 +285,8 @@ module.exports = [
|
|
|
285
285
|
exposes: [e.light_brightness().setAccess('state', ea.STATE_SET).setAccess('brightness', ea.STATE_SET)],
|
|
286
286
|
},
|
|
287
287
|
{
|
|
288
|
-
fingerprint: [{modelID: 'TS0601', manufacturerName: '_TZE200_e3oitdyu'}
|
|
288
|
+
fingerprint: [{modelID: 'TS0601', manufacturerName: '_TZE200_e3oitdyu'},
|
|
289
|
+
{modelID: 'TS0601', manufacturerName: '_TZE200_fjjbhx9d'}],
|
|
289
290
|
model: 'MS-105B',
|
|
290
291
|
vendor: 'Moes',
|
|
291
292
|
description: 'Smart dimmer module (2 gang)',
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
const extend = require('../lib/extend');
|
|
2
|
+
|
|
3
|
+
module.exports = [
|
|
4
|
+
{
|
|
5
|
+
fingerprint: [{modelID: 'TS0505B', manufacturerName: '_TZ3210_mcm6m1ma'}],
|
|
6
|
+
model: 'DL41-03-10-R-ZB',
|
|
7
|
+
vendor: 'Oz Smart Things',
|
|
8
|
+
description: 'Oz Smart RGBW Zigbee downlight 10w',
|
|
9
|
+
extend: extend.light_onoff_brightness_colortemp_color({colorTempRange: [153, 500]}),
|
|
10
|
+
},
|
|
11
|
+
];
|
package/devices/philips.js
CHANGED
|
@@ -2741,4 +2741,11 @@ module.exports = [
|
|
|
2741
2741
|
description: 'Hue White E26 806 lumen',
|
|
2742
2742
|
extend: hueExtend.light_onoff_brightness(),
|
|
2743
2743
|
},
|
|
2744
|
+
{
|
|
2745
|
+
zigbeeModel: ['3402931P7'],
|
|
2746
|
+
model: '3402931P7',
|
|
2747
|
+
vendor: 'Philips',
|
|
2748
|
+
description: 'Philips Hue Adore Bathroom Mirror Light',
|
|
2749
|
+
extend: hueExtend.light_onoff_brightness_colortemp({colorTempRange: [153, 454]}),
|
|
2750
|
+
},
|
|
2744
2751
|
];
|
package/devices/rtx.js
CHANGED
|
@@ -76,4 +76,13 @@ module.exports = [
|
|
|
76
76
|
'MoTu..= active weekdays ' +
|
|
77
77
|
'1 = deactivate timer with 0)')],
|
|
78
78
|
},
|
|
79
|
+
{
|
|
80
|
+
fingerprint: [{modelID: 'TS0202', manufacturerName: '_TZ3000_mwd3c2at'}],
|
|
81
|
+
model: 'ZMS4',
|
|
82
|
+
vendor: 'RTX',
|
|
83
|
+
description: 'Zigbee PIR sensor',
|
|
84
|
+
fromZigbee: [fz.ias_occupancy_alarm_1],
|
|
85
|
+
toZigbee: [],
|
|
86
|
+
exposes: [e.battery_low(), e.occupancy()],
|
|
87
|
+
},
|
|
79
88
|
];
|
package/devices/saswell.js
CHANGED
|
@@ -16,7 +16,6 @@ module.exports = [
|
|
|
16
16
|
{modelID: 'TS0601', manufacturerName: '_TZE200_c88teujp'},
|
|
17
17
|
{modelID: 'TS0601', manufacturerName: '_TZE200_yw7cahqs'},
|
|
18
18
|
{modelID: 'TS0601', manufacturerName: '_TZE200_azqp6ssj'},
|
|
19
|
-
{modelID: 'TS0601', manufacturerName: '_TZE200_bvu2wnxz'},
|
|
20
19
|
{modelID: 'TS0601', manufacturerName: '_TZE200_zuhszj9s'},
|
|
21
20
|
{modelID: 'TS0601', manufacturerName: '_TZE200_9gvruqf5'},
|
|
22
21
|
{modelID: 'TS0601', manufacturerName: '_TZE200_zr9c0day'},
|
package/devices/shinasystem.js
CHANGED
|
@@ -4,9 +4,41 @@ const tz = require('../converters/toZigbee');
|
|
|
4
4
|
const reporting = require('../lib/reporting');
|
|
5
5
|
const extend = require('../lib/extend');
|
|
6
6
|
const ota = require('../lib/ota');
|
|
7
|
+
const globalStore = require('../lib/store');
|
|
7
8
|
const e = exposes.presets;
|
|
8
9
|
const ea = exposes.access;
|
|
9
10
|
|
|
11
|
+
const fzLocal = {
|
|
12
|
+
DMS300_IN: {
|
|
13
|
+
cluster: 'msOccupancySensing',
|
|
14
|
+
type: ['attributeReport', 'readResponse'],
|
|
15
|
+
options: [exposes.options.no_occupancy_since_false()],
|
|
16
|
+
convert: (model, msg, publish, options, meta) => {
|
|
17
|
+
const occupancyIn = msg.data.occupancy;
|
|
18
|
+
globalStore.putValue(msg.endpoint, 'occupancy_in', occupancyIn);
|
|
19
|
+
const occupancy = occupancyIn | globalStore.getValue(msg.endpoint, 'occupancy_out', 0);
|
|
20
|
+
return {
|
|
21
|
+
occupancy_in: (occupancyIn & 1) > 0,
|
|
22
|
+
occupancy: (occupancy & 1) > 0,
|
|
23
|
+
};
|
|
24
|
+
},
|
|
25
|
+
},
|
|
26
|
+
DMS300_OUT: {
|
|
27
|
+
cluster: 'ssIasZone',
|
|
28
|
+
type: 'commandStatusChangeNotification',
|
|
29
|
+
convert: (model, msg, publish, options, meta) => {
|
|
30
|
+
const occupancyOut = msg.data.zonestatus;
|
|
31
|
+
globalStore.putValue(msg.endpoint, 'occupancy_out', occupancyOut);
|
|
32
|
+
const occupancy = occupancyOut | globalStore.getValue(msg.endpoint, 'occupancy_in', 0);
|
|
33
|
+
return {
|
|
34
|
+
occupancy_out: (occupancyOut & 1) > 0,
|
|
35
|
+
occupancy: (occupancy & 1) > 0,
|
|
36
|
+
};
|
|
37
|
+
},
|
|
38
|
+
},
|
|
39
|
+
};
|
|
40
|
+
|
|
41
|
+
|
|
10
42
|
module.exports = [
|
|
11
43
|
{
|
|
12
44
|
fingerprint: [
|
|
@@ -397,18 +429,27 @@ module.exports = [
|
|
|
397
429
|
ota: ota.zigbeeOTA,
|
|
398
430
|
description: 'SiHAS dual motion sensor',
|
|
399
431
|
meta: {battery: {voltageToPercentage: '3V_2100'}},
|
|
400
|
-
fromZigbee: [fz.battery,
|
|
432
|
+
fromZigbee: [fz.battery, fzLocal.DMS300_OUT, fzLocal.DMS300_IN, fz.occupancy_timeout],
|
|
401
433
|
toZigbee: [tz.occupancy_timeout],
|
|
402
434
|
configure: async (device, coordinatorEndpoint, logger) => {
|
|
403
435
|
const endpoint = device.getEndpoint(1);
|
|
404
|
-
const binds = ['genPowerCfg', 'msOccupancySensing'];
|
|
436
|
+
const binds = ['genPowerCfg', 'msOccupancySensing', 'ssIasZone'];
|
|
405
437
|
await reporting.bind(endpoint, coordinatorEndpoint, binds);
|
|
406
438
|
await reporting.batteryVoltage(endpoint, {min: 30, max: 21600, change: 1});
|
|
407
439
|
await reporting.occupancy(endpoint, {min: 1, max: 600, change: 1});
|
|
440
|
+
const payload = [{
|
|
441
|
+
attribute: 'zoneStatus', minimumReportInterval: 1, maximumReportInterval: 600, reportableChange: 1}];
|
|
442
|
+
await endpoint.configureReporting('ssIasZone', payload);
|
|
408
443
|
await endpoint.read('msOccupancySensing', ['pirOToUDelay']);
|
|
409
444
|
},
|
|
410
|
-
exposes: [e.battery(), e.battery_voltage(),
|
|
411
|
-
exposes.
|
|
445
|
+
exposes: [e.battery(), e.battery_voltage(),
|
|
446
|
+
exposes.binary('occupancy_in', ea.STATE, true, false)
|
|
447
|
+
.withDescription('Indicates whether "IN" Sensor of the device detected occupancy'),
|
|
448
|
+
exposes.binary('occupancy_out', ea.STATE, true, false)
|
|
449
|
+
.withDescription('Indicates whether "OUT" Sensor of the device detected occupancy'),
|
|
450
|
+
exposes.binary('occupancy', ea.STATE, true, false)
|
|
451
|
+
.withDescription('Indicates whether "IN or OUT" Sensor of the device detected occupancy'),
|
|
452
|
+
exposes.numeric('occupancy_timeout', ea.ALL).withUnit('second').withValueMin(0).withValueMax(3600)],
|
|
412
453
|
},
|
|
413
454
|
{
|
|
414
455
|
zigbeeModel: ['ISM300Z3'],
|
package/devices/sonoff.js
CHANGED
|
@@ -7,6 +7,19 @@ const extend = require('../lib/extend');
|
|
|
7
7
|
const e = exposes.presets;
|
|
8
8
|
const ota = require('../lib/ota');
|
|
9
9
|
|
|
10
|
+
const fzLocal = {
|
|
11
|
+
// SNZB-02 reports stranges values sometimes
|
|
12
|
+
// https://github.com/Koenkk/zigbee2mqtt/issues/13640
|
|
13
|
+
SNZB02_temperature: {
|
|
14
|
+
...fz.temperature,
|
|
15
|
+
convert: (model, msg, publish, options, meta) => {
|
|
16
|
+
if (msg.data.measuredValue > -10000 && msg.data.measuredValue < 10000) {
|
|
17
|
+
return fz.temperature.convert(model, msg, publish, options, meta);
|
|
18
|
+
}
|
|
19
|
+
},
|
|
20
|
+
},
|
|
21
|
+
};
|
|
22
|
+
|
|
10
23
|
module.exports = [
|
|
11
24
|
{
|
|
12
25
|
zigbeeModel: ['BASICZBR3'],
|
|
@@ -119,7 +132,7 @@ module.exports = [
|
|
|
119
132
|
whiteLabel: [{vendor: 'eWeLink', model: 'RHK08'}],
|
|
120
133
|
description: 'Temperature and humidity sensor',
|
|
121
134
|
exposes: [e.battery(), e.temperature(), e.humidity(), e.battery_voltage()],
|
|
122
|
-
fromZigbee: [
|
|
135
|
+
fromZigbee: [fzLocal.SNZB02_temperature, fz.humidity, fz.battery],
|
|
123
136
|
toZigbee: [],
|
|
124
137
|
configure: async (device, coordinatorEndpoint, logger) => {
|
|
125
138
|
try {
|
package/devices/tuya.js
CHANGED
|
@@ -23,6 +23,14 @@ const TS011Fplugs = ['_TZ3000_5f43h46b', '_TZ3000_cphmq0q7', '_TZ3000_dpo1ysak',
|
|
|
23
23
|
'_TZ3000_ss98ec5d', '_TZ3000_gznh2xla'];
|
|
24
24
|
|
|
25
25
|
const tzLocal = {
|
|
26
|
+
hpsz: {
|
|
27
|
+
key: ['led_state'],
|
|
28
|
+
convertSet: async (entity, key, value, meta) => {
|
|
29
|
+
const ledState = value.toUpperCase() === 'ON' ? true : false;
|
|
30
|
+
await tuya.sendDataPointBool(entity, tuya.dataPoints.HPSZLEDState, ledState);
|
|
31
|
+
return {led_state: value};
|
|
32
|
+
},
|
|
33
|
+
},
|
|
26
34
|
TS0504B_color: {
|
|
27
35
|
key: ['color'],
|
|
28
36
|
convertSet: async (entity, key, value, meta) => {
|
|
@@ -271,6 +279,34 @@ const tzLocal = {
|
|
|
271
279
|
};
|
|
272
280
|
|
|
273
281
|
const fzLocal = {
|
|
282
|
+
hpsz: {
|
|
283
|
+
cluster: 'manuSpecificTuya',
|
|
284
|
+
type: ['commandDataResponse', 'commandDataReport'],
|
|
285
|
+
convert: (model, msg, publish, options, meta) => {
|
|
286
|
+
const dpValue = tuya.firstDpValue(msg, meta, 'hpsz');
|
|
287
|
+
const dp = dpValue.dp;
|
|
288
|
+
const value = tuya.getDataValue(dpValue);
|
|
289
|
+
let result = null;
|
|
290
|
+
switch (dp) {
|
|
291
|
+
case tuya.dataPoints.HPSZInductionState:
|
|
292
|
+
result = {presence: value === 1};
|
|
293
|
+
break;
|
|
294
|
+
case tuya.dataPoints.HPSZPresenceTime:
|
|
295
|
+
result = {duration_of_attendance: value};
|
|
296
|
+
break;
|
|
297
|
+
case tuya.dataPoints.HPSZLeavingTime:
|
|
298
|
+
result = {duration_of_absence: value};
|
|
299
|
+
break;
|
|
300
|
+
case tuya.dataPoints.HPSZLEDState:
|
|
301
|
+
result = {led_state: value};
|
|
302
|
+
break;
|
|
303
|
+
default:
|
|
304
|
+
meta.logger.warn(`zigbee-herdsman-converters:hpsz: NOT RECOGNIZED DP #${
|
|
305
|
+
dp} with data ${JSON.stringify(dpValue)}`);
|
|
306
|
+
}
|
|
307
|
+
return result;
|
|
308
|
+
},
|
|
309
|
+
},
|
|
274
310
|
metering_skip_duplicate: {
|
|
275
311
|
...fz.metering,
|
|
276
312
|
convert: (model, msg, publish, options, meta) => {
|
|
@@ -591,7 +627,7 @@ module.exports = [
|
|
|
591
627
|
fromZigbee: [fz.ias_contact_alarm_1, fz.battery, fz.ignore_basic_report, fz.ias_contact_alarm_1_report],
|
|
592
628
|
toZigbee: [],
|
|
593
629
|
exposes: [e.contact(), e.battery_low(), e.tamper(), e.battery(), e.battery_voltage()],
|
|
594
|
-
whiteLabel: [{vendor: 'CR Smart Home', model: 'TS0203'}],
|
|
630
|
+
whiteLabel: [{vendor: 'CR Smart Home', model: 'TS0203'}, {vendor: 'TuYa', model: 'iH-F001'}],
|
|
595
631
|
configure: async (device, coordinatorEndpoint, logger) => {
|
|
596
632
|
try {
|
|
597
633
|
const endpoint = device.getEndpoint(1);
|
|
@@ -874,6 +910,7 @@ module.exports = [
|
|
|
874
910
|
{modelID: 'TS0202', manufacturerName: '_TYZB01_ef5xlc9q'},
|
|
875
911
|
{modelID: 'TS0202', manufacturerName: '_TYZB01_vwqnz1sn'},
|
|
876
912
|
{modelID: 'TS0202', manufacturerName: '_TYZB01_2b8f6cio'},
|
|
913
|
+
{modelID: 'TS0202', manufacturerName: '_TYZB01_71kfvvma'},
|
|
877
914
|
{modelID: 'TS0202', manufacturerName: '_TZE200_bq5c8xfe'},
|
|
878
915
|
{modelID: 'TS0202', manufacturerName: '_TYZB01_dl7cejts'},
|
|
879
916
|
{modelID: 'TS0202', manufacturerName: '_TYZB01_qjqgmqxr'},
|
|
@@ -991,6 +1028,7 @@ module.exports = [
|
|
|
991
1028
|
{modelID: 'TS0601', manufacturerName: '_TZE200_ebwgzdqq'},
|
|
992
1029
|
{modelID: 'TS0601', manufacturerName: '_TZE200_9i9dt8is'},
|
|
993
1030
|
{modelID: 'TS0601', manufacturerName: '_TZE200_dfxkcots'},
|
|
1031
|
+
{modelID: 'TS0601', manufacturerName: '_TZE200_w4cryh2i'},
|
|
994
1032
|
{modelID: 'TS0601', manufacturerName: '_TZE200_ojzhk75b'},
|
|
995
1033
|
{modelID: 'TS0601', manufacturerName: '_TZE200_swaamsoy'},
|
|
996
1034
|
{modelID: 'TS0601', manufacturerName: '_TZE200_3p5ydos3'},
|
|
@@ -1650,6 +1688,7 @@ module.exports = [
|
|
|
1650
1688
|
{modelID: 'TS0601', manufacturerName: '_TZE200_tvrvdj6o'},
|
|
1651
1689
|
{modelID: 'zo2pocs\u0000', manufacturerName: '_TYST11_fzo2pocs'},
|
|
1652
1690
|
{modelID: 'TS0601', manufacturerName: '_TZE200_cf1sl3tj'},
|
|
1691
|
+
{modelID: 'TS0601', manufacturerName: '_TZE200_b2u1drdv'},
|
|
1653
1692
|
// Roller blinds:
|
|
1654
1693
|
{modelID: 'TS0601', manufacturerName: '_TZE200_fctwhugx'},
|
|
1655
1694
|
{modelID: 'TS0601', manufacturerName: '_TZE200_zah67ekd'},
|
|
@@ -3081,4 +3120,21 @@ module.exports = [
|
|
|
3081
3120
|
await reporting.bind(endpoint, coordinatorEndpoint, ['genPowerCfg', 'msTemperatureMeasurement', 'msRelativeHumidity']);
|
|
3082
3121
|
},
|
|
3083
3122
|
},
|
|
3123
|
+
{
|
|
3124
|
+
fingerprint: [{modelID: 'TS0601', manufacturerName: '_TZE200_0u3bj3rc'}],
|
|
3125
|
+
model: 'TS0601_human_presence_sensor',
|
|
3126
|
+
vendor: 'TuYa',
|
|
3127
|
+
description: 'Human presence sensor Zigbee',
|
|
3128
|
+
fromZigbee: [fzLocal.hpsz],
|
|
3129
|
+
toZigbee: [tzLocal.hpsz],
|
|
3130
|
+
onEvent: tuya.onEventSetLocalTime,
|
|
3131
|
+
exposes: [e.presence(),
|
|
3132
|
+
exposes.numeric('duration_of_attendance', ea.STATE).withUnit('minutes')
|
|
3133
|
+
.withDescription('Shows the presence duration in minutes'),
|
|
3134
|
+
exposes.numeric('duration_of_absence', ea.STATE).withUnit('minutes')
|
|
3135
|
+
.withDescription('Shows the duration of the absence in minutes'),
|
|
3136
|
+
exposes.enum('led_state', ea.STATE_SET, ['on', 'off'])
|
|
3137
|
+
.withDescription('Turns the onboard LED on or off'),
|
|
3138
|
+
],
|
|
3139
|
+
},
|
|
3084
3140
|
];
|
package/devices/yale.js
CHANGED
|
@@ -55,7 +55,7 @@ module.exports = [
|
|
|
55
55
|
vendor: 'Yale',
|
|
56
56
|
description: 'Real living lock / Intelligent biometric digital lock',
|
|
57
57
|
// Increased timeout needed: https://github.com/Koenkk/zigbee2mqtt/issues/3290 for YDM4109+
|
|
58
|
-
extend: lockExtend({timeout: 20000}),
|
|
58
|
+
extend: lockExtend({battery: {dontDividePercentage: true}}, {timeout: 20000}),
|
|
59
59
|
},
|
|
60
60
|
{
|
|
61
61
|
zigbeeModel: ['YRD210 PB DB'],
|
|
@@ -129,7 +129,7 @@ module.exports = [
|
|
|
129
129
|
model: 'YDF40',
|
|
130
130
|
vendor: 'Yale',
|
|
131
131
|
description: 'Real living lock / Intelligent biometric digital lock',
|
|
132
|
-
extend: lockExtend({}, {max: 900}, ['closuresDoorLock']),
|
|
132
|
+
extend: lockExtend({battery: {dontDividePercentage: true}}, {max: 900}, ['closuresDoorLock']),
|
|
133
133
|
},
|
|
134
134
|
{
|
|
135
135
|
zigbeeModel: ['06ffff2027'],
|
package/lib/tuya.js
CHANGED
|
@@ -842,6 +842,11 @@ const dataPoints = {
|
|
|
842
842
|
alectoSilence: 16,
|
|
843
843
|
// BAC-002-ALZB - Moes like thermostat with Fan control
|
|
844
844
|
bacFanMode: 28,
|
|
845
|
+
// Human Presence Sensor Zigbee Radiowave Tuya
|
|
846
|
+
HPSZInductionState: 1,
|
|
847
|
+
HPSZPresenceTime: 101,
|
|
848
|
+
HPSZLeavingTime: 102,
|
|
849
|
+
HPSZLEDState: 103,
|
|
845
850
|
};
|
|
846
851
|
|
|
847
852
|
const thermostatWeekFormat = {
|