zigbee-herdsman-converters 14.0.507 → 14.0.508
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/README.md +1 -1
- package/converters/fromZigbee.js +47 -24
- package/devices/kwikset.js +15 -0
- package/devices/nous.js +1 -1
- package/devices/tuya.js +24 -6
- package/devices/xiaomi.js +3 -2
- package/devices/zemismart.js +24 -0
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
Collection of device converters to be used with zigbee-herdsman.
|
|
5
5
|
|
|
6
6
|
## Contributing
|
|
7
|
-
See [Zigbee2MQTT how to support new devices](
|
|
7
|
+
See [Zigbee2MQTT how to support new devices](https://www.zigbee2mqtt.io/advanced/support-new-devices/01_support_new_devices.html).
|
|
8
8
|
|
|
9
9
|
## Submitting a pull request
|
|
10
10
|
If you'd like to submit a pull request, you should run the following commands to ensure your changes will pass the tests:
|
package/converters/fromZigbee.js
CHANGED
|
@@ -1909,34 +1909,57 @@ const converters = {
|
|
|
1909
1909
|
},
|
|
1910
1910
|
nous_lcd_temperature_humidity_sensor: {
|
|
1911
1911
|
cluster: 'manuSpecificTuya',
|
|
1912
|
-
type: ['commandDataResponse'],
|
|
1912
|
+
type: ['commandDataResponse', 'commandDataReport'],
|
|
1913
1913
|
options: [exposes.options.precision('temperature'), exposes.options.calibration('temperature'),
|
|
1914
1914
|
exposes.options.precision('humidity'), exposes.options.calibration('humidity')],
|
|
1915
1915
|
convert: (model, msg, publish, options, meta) => {
|
|
1916
|
-
const
|
|
1917
|
-
const
|
|
1918
|
-
|
|
1919
|
-
|
|
1920
|
-
|
|
1921
|
-
|
|
1922
|
-
|
|
1923
|
-
|
|
1924
|
-
|
|
1925
|
-
|
|
1926
|
-
|
|
1927
|
-
|
|
1928
|
-
|
|
1929
|
-
|
|
1930
|
-
|
|
1931
|
-
|
|
1932
|
-
|
|
1933
|
-
|
|
1934
|
-
|
|
1935
|
-
|
|
1936
|
-
|
|
1937
|
-
|
|
1938
|
-
|
|
1916
|
+
const result = {};
|
|
1917
|
+
for (const dpValue of msg.data.dpValues) {
|
|
1918
|
+
const dp = dpValue.dp;
|
|
1919
|
+
const value = tuya.getDataValue(dpValue);
|
|
1920
|
+
switch (dp) {
|
|
1921
|
+
case tuya.dataPoints.nousTemperature:
|
|
1922
|
+
result.temperature = calibrateAndPrecisionRoundOptions(value / 10, options, 'temperature');
|
|
1923
|
+
break;
|
|
1924
|
+
case tuya.dataPoints.nousHumidity:
|
|
1925
|
+
result.humidity = calibrateAndPrecisionRoundOptions(value, options, 'humidity');
|
|
1926
|
+
break;
|
|
1927
|
+
case tuya.dataPoints.nousBattery:
|
|
1928
|
+
result.battery = value;
|
|
1929
|
+
break;
|
|
1930
|
+
case tuya.dataPoints.nousTempUnitConvert:
|
|
1931
|
+
result.temperature_unit_convert = {0x00: 'celsius', 0x01: 'fahrenheit'}[value];
|
|
1932
|
+
break;
|
|
1933
|
+
case tuya.dataPoints.nousMaxTemp:
|
|
1934
|
+
result.max_temperature = calibrateAndPrecisionRoundOptions(value / 10, options, 'temperature');
|
|
1935
|
+
break;
|
|
1936
|
+
case tuya.dataPoints.nousMinTemp:
|
|
1937
|
+
result.min_temperature = calibrateAndPrecisionRoundOptions(value / 10, options, 'temperature');
|
|
1938
|
+
break;
|
|
1939
|
+
case tuya.dataPoints.nousMaxHumi:
|
|
1940
|
+
result.max_humidity = calibrateAndPrecisionRoundOptions(value / 10, options, 'humidity');
|
|
1941
|
+
break;
|
|
1942
|
+
case tuya.dataPoints.nousMinHumi:
|
|
1943
|
+
result.min_humidity = calibrateAndPrecisionRoundOptions(value / 10, options, 'humidity');
|
|
1944
|
+
break;
|
|
1945
|
+
case tuya.dataPoints.nousTempAlarm:
|
|
1946
|
+
result.temperature_alarm = {0x00: 'canceled', 0x01: 'lower_alarm', 0x02: 'upper_alarm'}[value];
|
|
1947
|
+
break;
|
|
1948
|
+
case tuya.dataPoints.nousHumiAlarm:
|
|
1949
|
+
result.humidity_alarm = {0x00: 'canceled', 0x01: 'lower_alarm', 0x02: 'upper_alarm'}[value];
|
|
1950
|
+
break;
|
|
1951
|
+
case tuya.dataPoints.nousTempSensitivity:
|
|
1952
|
+
result.temperature_sensitivity = calibrateAndPrecisionRoundOptions(value / 10, options, 'temperature');
|
|
1953
|
+
break;
|
|
1954
|
+
case tuya.dataPoints.nousReportInterval:
|
|
1955
|
+
result.report_interval = value;
|
|
1956
|
+
break;
|
|
1957
|
+
default:
|
|
1958
|
+
meta.logger.warn(`zigbee-herdsman-converters:nous_lcd_temperature_humidity_sensor: NOT RECOGNIZED ` +
|
|
1959
|
+
`DP #${dp} with data ${JSON.stringify(dpValue)}`);
|
|
1960
|
+
}
|
|
1939
1961
|
}
|
|
1962
|
+
return result;
|
|
1940
1963
|
},
|
|
1941
1964
|
},
|
|
1942
1965
|
tuya_illuminance_temperature_humidity_sensor: {
|
package/devices/kwikset.js
CHANGED
|
@@ -20,6 +20,21 @@ module.exports = [
|
|
|
20
20
|
},
|
|
21
21
|
exposes: [e.lock(), e.battery(), e.lock_action(), e.lock_action_source_name(), e.lock_action_source_user()],
|
|
22
22
|
},
|
|
23
|
+
{
|
|
24
|
+
zigbeeModel: ['SMARTCODE_CONVERT_GEN1_W3'],
|
|
25
|
+
model: '99140-139',
|
|
26
|
+
vendor: 'Kwikset',
|
|
27
|
+
description: 'Home connect smart lock conversion kit',
|
|
28
|
+
fromZigbee: [fz.lock, fz.lock_operation_event, fz.battery],
|
|
29
|
+
toZigbee: [tz.lock],
|
|
30
|
+
configure: async (device, coordinatorEndpoint, logger) => {
|
|
31
|
+
const endpoint = device.getEndpoint(2);
|
|
32
|
+
await reporting.bind(endpoint, coordinatorEndpoint, ['closuresDoorLock', 'genPowerCfg']);
|
|
33
|
+
await reporting.lockState(endpoint);
|
|
34
|
+
await reporting.batteryPercentageRemaining(endpoint);
|
|
35
|
+
},
|
|
36
|
+
exposes: [e.lock(), e.battery(), e.lock_action(), e.lock_action_source_name(), e.lock_action_source_user()],
|
|
37
|
+
},
|
|
23
38
|
{
|
|
24
39
|
zigbeeModel: ['SMARTCODE_DEADBOLT_10_L'],
|
|
25
40
|
model: '99140-002',
|
package/devices/nous.js
CHANGED
|
@@ -17,7 +17,7 @@ module.exports = [
|
|
|
17
17
|
exposes: [e.temperature(), e.humidity(), e.battery()],
|
|
18
18
|
},
|
|
19
19
|
{
|
|
20
|
-
fingerprint: [{modelID: 'TS0601', manufacturerName: '_TZE200_lve3dvpy'}],
|
|
20
|
+
fingerprint: [{modelID: 'TS0601', manufacturerName: '_TZE200_lve3dvpy'}, {modelID: 'TS0601', manufacturerName: '_TZE200_c7emyjom'}],
|
|
21
21
|
model: 'SZ-T04',
|
|
22
22
|
vendor: 'Nous',
|
|
23
23
|
description: 'Temperature and humidity sensor with clock',
|
package/devices/tuya.js
CHANGED
|
@@ -1417,11 +1417,12 @@ module.exports = [
|
|
|
1417
1417
|
.withDescription('Plug LED indicator mode'), e.child_lock()],
|
|
1418
1418
|
},
|
|
1419
1419
|
{
|
|
1420
|
-
fingerprint: [
|
|
1421
|
-
|
|
1422
|
-
return
|
|
1423
|
-
|
|
1424
|
-
|
|
1420
|
+
fingerprint: [{modelID: 'TS011F', manufacturerName: '_TZ3000_gjnozsaz', applicationVersion: 74}]
|
|
1421
|
+
.concat(...TS011Fplugs.map((manufacturerName) => {
|
|
1422
|
+
return [69, 68, 65, 64].map((applicationVersion) => {
|
|
1423
|
+
return {modelID: 'TS011F', manufacturerName, applicationVersion};
|
|
1424
|
+
});
|
|
1425
|
+
})),
|
|
1425
1426
|
model: 'TS011F_plug_3',
|
|
1426
1427
|
description: 'Smart plug (with power monitoring by polling)',
|
|
1427
1428
|
vendor: 'TuYa',
|
|
@@ -1946,6 +1947,22 @@ module.exports = [
|
|
|
1946
1947
|
e.energy(), exposes.enum('power_outage_memory', ea.STATE_SET, ['on', 'off', 'restore'])
|
|
1947
1948
|
.withDescription('Recover state after power outage')],
|
|
1948
1949
|
},
|
|
1950
|
+
{
|
|
1951
|
+
fingerprint: [{modelID: 'TS011F', manufacturerName: '_TZ3000_7issjl2q'}],
|
|
1952
|
+
model: 'ATMS1601Z',
|
|
1953
|
+
description: 'Din smart relay (without power monitoring)',
|
|
1954
|
+
vendor: 'TuYa',
|
|
1955
|
+
fromZigbee: [fz.on_off, fz.ignore_basic_report, fz.tuya_switch_power_outage_memory],
|
|
1956
|
+
toZigbee: [tz.on_off, tz.tuya_switch_power_outage_memory],
|
|
1957
|
+
configure: async (device, coordinatorEndpoint, logger) => {
|
|
1958
|
+
const endpoint = device.getEndpoint(1);
|
|
1959
|
+
await reporting.bind(endpoint, coordinatorEndpoint, ['genOnOff']);
|
|
1960
|
+
device.save();
|
|
1961
|
+
},
|
|
1962
|
+
exposes: [e.switch(),
|
|
1963
|
+
exposes.enum('power_outage_memory', ea.STATE_SET, ['on', 'off', 'restore'])
|
|
1964
|
+
.withDescription('Recover state after power outage')],
|
|
1965
|
+
},
|
|
1949
1966
|
{
|
|
1950
1967
|
fingerprint: [{modelID: 'TS0601', manufacturerName: '_TZE200_nklqjk62'}],
|
|
1951
1968
|
model: 'PJ-ZGD01',
|
|
@@ -2262,7 +2279,8 @@ module.exports = [
|
|
|
2262
2279
|
},
|
|
2263
2280
|
{
|
|
2264
2281
|
fingerprint: [{modelID: 'TS0601', manufacturerName: '_TZE200_ikvncluo'},
|
|
2265
|
-
{modelID: 'TS0601', manufacturerName: '_TZE200_lyetpprm'}
|
|
2282
|
+
{modelID: 'TS0601', manufacturerName: '_TZE200_lyetpprm'},
|
|
2283
|
+
{modelID: 'TS0601', manufacturerName: '_TZE200_ztc6ggyl'}],
|
|
2266
2284
|
model: 'TS0601_smart_human_presense_sensor',
|
|
2267
2285
|
vendor: 'TuYa',
|
|
2268
2286
|
description: 'Smart Human presence sensor',
|
package/devices/xiaomi.js
CHANGED
|
@@ -922,7 +922,8 @@ module.exports = [
|
|
|
922
922
|
description: 'Aqara P1 human body movement and illuminance sensor',
|
|
923
923
|
fromZigbee: [fz.aqara_occupancy_illuminance, fz.aqara_opple, fz.battery],
|
|
924
924
|
toZigbee: [tz.aqara_detection_interval, tz.aqara_motion_sensitivity],
|
|
925
|
-
exposes: [e.occupancy(), e.
|
|
925
|
+
exposes: [e.occupancy(), e.illuminance_lux().withProperty('illuminance'),
|
|
926
|
+
e.illuminance().withUnit('lx').withDescription('Measured illuminance in lux'),
|
|
926
927
|
exposes.enum('motion_sensitivity', ea.ALL, ['low', 'medium', 'high']),
|
|
927
928
|
exposes.numeric('detection_interval', ea.ALL).withValueMin(2).withValueMax(65535).withUnit('s')
|
|
928
929
|
.withDescription('Time interval for detecting actions'), e.temperature(), e.battery()],
|
|
@@ -1360,7 +1361,7 @@ module.exports = [
|
|
|
1360
1361
|
await device.getEndpoint(1).read('genAnalogOutput', ['presentValue']);
|
|
1361
1362
|
}
|
|
1362
1363
|
},
|
|
1363
|
-
exposes: [e.cover_position().setAccess('state', ea.ALL), e.battery().withAccess(ea.STATE_GET),
|
|
1364
|
+
exposes: [e.cover_position().setAccess('state', ea.ALL), e.battery().withAccess(ea.STATE_GET), e.temperature(),
|
|
1364
1365
|
exposes.binary('charging_status', ea.STATE_GET, true, false)
|
|
1365
1366
|
.withDescription('The current charging status.'),
|
|
1366
1367
|
exposes.enum('motor_state', ea.STATE, ['declining', 'rising', 'pause', 'blocked'])
|
package/devices/zemismart.js
CHANGED
|
@@ -75,6 +75,30 @@ module.exports = [
|
|
|
75
75
|
await reporting.bind(device.getEndpoint(3), coordinatorEndpoint, ['genOnOff']);
|
|
76
76
|
},
|
|
77
77
|
},
|
|
78
|
+
{
|
|
79
|
+
fingerprint: [{modelID: 'TS0003', manufacturerName: '_TZ3000_vjhcenzo'}],
|
|
80
|
+
model: 'TB25',
|
|
81
|
+
vendor: 'Zemismart',
|
|
82
|
+
description: 'Smart light switch and socket - 2 gang with neutral wire',
|
|
83
|
+
toZigbee: extend.switch().toZigbee.concat([tz.moes_power_on_behavior]),
|
|
84
|
+
fromZigbee: extend.switch().fromZigbee.concat([fz.moes_power_on_behavior]),
|
|
85
|
+
exposes: [e.switch().withEndpoint('left'), e.switch().withEndpoint('center'), e.switch().withEndpoint('right'),
|
|
86
|
+
exposes.enum('power_on_behavior', ea.ALL, ['on', 'off', 'previous']),
|
|
87
|
+
],
|
|
88
|
+
endpoint: () => {
|
|
89
|
+
return {'left': 1, 'center': 2, 'right': 3};
|
|
90
|
+
},
|
|
91
|
+
meta: {multiEndpoint: true},
|
|
92
|
+
configure: async (device, coordinatorEndpoint) => {
|
|
93
|
+
await device.getEndpoint(1).read('genBasic',
|
|
94
|
+
['manufacturerName', 'zclVersion', 'appVersion', 'modelId', 'powerSource', 0xfffe]);
|
|
95
|
+
for (const endpointID of [1, 2, 3]) {
|
|
96
|
+
const endpoint = device.getEndpoint(endpointID);
|
|
97
|
+
await reporting.bind(endpoint, coordinatorEndpoint, ['genOnOff']);
|
|
98
|
+
await reporting.onOff(endpoint);
|
|
99
|
+
}
|
|
100
|
+
},
|
|
101
|
+
},
|
|
78
102
|
{
|
|
79
103
|
zigbeeModel: ['LXN56-SS27LX1.1'],
|
|
80
104
|
model: 'LXN56-SS27LX1.1',
|