zigbee-herdsman-converters 14.0.507 → 14.0.510
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 +66 -27
- package/converters/toZigbee.js +15 -4
- package/devices/aurora_lighting.js +13 -2
- package/devices/bticino.js +2 -2
- package/devices/gledopto.js +7 -0
- package/devices/heiman.js +1 -1
- package/devices/keen_home.js +2 -1
- package/devices/kwikset.js +15 -0
- package/devices/legrand.js +2 -2
- package/devices/namron.js +6 -6
- package/devices/nous.js +1 -1
- package/devices/philips.js +14 -0
- package/devices/rtx.js +2 -1
- package/devices/tuya.js +42 -9
- 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
|
@@ -1693,10 +1693,10 @@ const converters = {
|
|
|
1693
1693
|
result.temperature_display = lookup[data[0x1008]];
|
|
1694
1694
|
}
|
|
1695
1695
|
if (data.hasOwnProperty(0x1009)) { // WindowOpenCheck
|
|
1696
|
-
result.window_open_check = data[0x1009];
|
|
1696
|
+
result.window_open_check = data[0x1009] / 2;
|
|
1697
1697
|
}
|
|
1698
1698
|
if (data.hasOwnProperty(0x100A)) { // Hysterersis
|
|
1699
|
-
result.hysterersis = data[0x100A];
|
|
1699
|
+
result.hysterersis = precisionRound(data[0x100A], 2) / 10;
|
|
1700
1700
|
}
|
|
1701
1701
|
if (data.hasOwnProperty(0x100B)) { // DisplayAutoOffEnable
|
|
1702
1702
|
const lookup = {0: 'enable', 1: 'disable'};
|
|
@@ -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: {
|
|
@@ -5385,7 +5408,7 @@ const converters = {
|
|
|
5385
5408
|
payload.device_mode = 'unknown';
|
|
5386
5409
|
}
|
|
5387
5410
|
}
|
|
5388
|
-
if (msg.data.hasOwnProperty('1')) payload.
|
|
5411
|
+
if (msg.data.hasOwnProperty('1')) payload.led_when_off = msg.data['1'] === 0x00 ? 'OFF' : 'ON';
|
|
5389
5412
|
if (msg.data.hasOwnProperty('2')) payload.led_when_on = msg.data['2'] === 0x00 ? 'OFF' : 'ON';
|
|
5390
5413
|
return payload;
|
|
5391
5414
|
},
|
|
@@ -7168,6 +7191,22 @@ const converters = {
|
|
|
7168
7191
|
}
|
|
7169
7192
|
},
|
|
7170
7193
|
},
|
|
7194
|
+
tuya_relay_din_led_indicator: {
|
|
7195
|
+
cluster: 'genOnOff',
|
|
7196
|
+
type: ['attributeReport', 'readResponse'],
|
|
7197
|
+
convert: (model, msg, publish, options, meta) => {
|
|
7198
|
+
const property = 0x8001;
|
|
7199
|
+
|
|
7200
|
+
if (msg.data.hasOwnProperty(property)) {
|
|
7201
|
+
const dict = {0x00: 'off', 0x01: 'on_off', 0x02: 'off_on'};
|
|
7202
|
+
const value = msg.data[property];
|
|
7203
|
+
|
|
7204
|
+
if (dict.hasOwnProperty(value)) {
|
|
7205
|
+
return {[postfixWithEndpointName('indicator_mode', msg, model)]: dict[value]};
|
|
7206
|
+
}
|
|
7207
|
+
}
|
|
7208
|
+
},
|
|
7209
|
+
},
|
|
7171
7210
|
ias_keypad: {
|
|
7172
7211
|
cluster: 'ssIasZone',
|
|
7173
7212
|
type: 'commandStatusChangeNotification',
|
package/converters/toZigbee.js
CHANGED
|
@@ -2531,6 +2531,17 @@ const converters = {
|
|
|
2531
2531
|
return {state: {power_outage_memory: value}};
|
|
2532
2532
|
},
|
|
2533
2533
|
},
|
|
2534
|
+
tuya_relay_din_led_indicator: {
|
|
2535
|
+
key: ['indicator_mode'],
|
|
2536
|
+
convertSet: async (entity, key, value, meta) => {
|
|
2537
|
+
value = value.toLowerCase();
|
|
2538
|
+
const lookup = {'off': 0x00, 'on_off': 0x01, 'off_on': 0x02};
|
|
2539
|
+
utils.validateValue(value, Object.keys(lookup));
|
|
2540
|
+
const payload = lookup[value];
|
|
2541
|
+
await entity.write('genOnOff', {0x8001: {value: payload, type: 0x30}});
|
|
2542
|
+
return {state: {indicator_mode: value}};
|
|
2543
|
+
},
|
|
2544
|
+
},
|
|
2534
2545
|
kmpcil_res005_on_off: {
|
|
2535
2546
|
key: ['state'],
|
|
2536
2547
|
convertSet: async (entity, key, value, meta) => {
|
|
@@ -3062,10 +3073,10 @@ const converters = {
|
|
|
3062
3073
|
const payload = {0x1008: {value: lookup[value], type: herdsman.Zcl.DataType.enum8}};
|
|
3063
3074
|
await entity.write('hvacThermostat', payload, manufacturerOptions.sunricher);
|
|
3064
3075
|
} else if (key==='window_open_check') {
|
|
3065
|
-
const payload = {0x1009: {value:
|
|
3076
|
+
const payload = {0x1009: {value: value * 2, type: 0x20}};
|
|
3066
3077
|
await entity.write('hvacThermostat', payload, manufacturerOptions.sunricher);
|
|
3067
3078
|
} else if (key==='hysterersis') {
|
|
3068
|
-
const payload = {0x100A: {value:
|
|
3079
|
+
const payload = {0x100A: {value: value* 10, type: 0x20}};
|
|
3069
3080
|
await entity.write('hvacThermostat', payload, manufacturerOptions.sunricher);
|
|
3070
3081
|
} else if (key==='display_auto_off_enabled') {
|
|
3071
3082
|
const lookup = {'enable': 0, 'disabled': 1};
|
|
@@ -4839,13 +4850,13 @@ const converters = {
|
|
|
4839
4850
|
},
|
|
4840
4851
|
legrand_settingAlwaysEnableLed: {
|
|
4841
4852
|
// connected power outlet is on attribute 2 and not 1
|
|
4842
|
-
key: ['
|
|
4853
|
+
key: ['led_when_off'],
|
|
4843
4854
|
convertSet: async (entity, key, value, meta) => {
|
|
4844
4855
|
// enable or disable the LED (blue) when permitJoin=false (LED off)
|
|
4845
4856
|
const enableLedIfOn = value === 'ON' || (value === 'OFF' ? false : !!value);
|
|
4846
4857
|
const payload = {1: {value: enableLedIfOn, type: 16}};
|
|
4847
4858
|
await entity.write('manuSpecificLegrandDevices', payload, manufacturerOptions.legrand);
|
|
4848
|
-
return {state: {'
|
|
4859
|
+
return {state: {'led_when_off': value}};
|
|
4849
4860
|
},
|
|
4850
4861
|
convertGet: async (entity, key, meta) => {
|
|
4851
4862
|
await entity.read('manuSpecificLegrandDevices', [0x0001], manufacturerOptions.legrand);
|
|
@@ -18,6 +18,17 @@ const tzLocal = {
|
|
|
18
18
|
return {state: {backlight_led: state.toUpperCase()}};
|
|
19
19
|
},
|
|
20
20
|
},
|
|
21
|
+
backlight_brightness: {
|
|
22
|
+
key: ['brightness'],
|
|
23
|
+
options: [exposes.options.transition()],
|
|
24
|
+
convertSet: async (entity, key, value, meta) => {
|
|
25
|
+
await entity.command('genLevelCtrl', 'moveToLevel', {level: value, transtime: 0}, utils.getOptions(meta.mapped, entity));
|
|
26
|
+
return {state: {brightness: value}};
|
|
27
|
+
},
|
|
28
|
+
convertGet: async (entity, key, meta) => {
|
|
29
|
+
await entity.read('genLevelCtrl', ['currentLevel']);
|
|
30
|
+
},
|
|
31
|
+
},
|
|
21
32
|
};
|
|
22
33
|
|
|
23
34
|
const disableBatteryRotaryDimmerReporting = async (endpoint) => {
|
|
@@ -181,12 +192,12 @@ module.exports = [
|
|
|
181
192
|
model: 'AU-A1ZBDSS',
|
|
182
193
|
vendor: 'Aurora Lighting',
|
|
183
194
|
description: 'Double smart socket UK',
|
|
184
|
-
fromZigbee: [fz.identify, fz.on_off, fz.electrical_measurement],
|
|
195
|
+
fromZigbee: [fz.identify, fz.on_off, fz.electrical_measurement, fz.brightness],
|
|
185
196
|
exposes: [e.switch().withEndpoint('left'), e.switch().withEndpoint('right'),
|
|
186
197
|
e.power().withEndpoint('left'), e.power().withEndpoint('right'),
|
|
187
198
|
exposes.numeric('brightness', ea.ALL).withValueMin(0).withValueMax(254)
|
|
188
199
|
.withDescription('Brightness of this backlight LED')],
|
|
189
|
-
toZigbee: [tz.
|
|
200
|
+
toZigbee: [tzLocal.backlight_brightness, tz.on_off],
|
|
190
201
|
meta: {multiEndpoint: true},
|
|
191
202
|
endpoint: (device) => {
|
|
192
203
|
return {'left': 1, 'right': 2};
|
package/devices/bticino.js
CHANGED
|
@@ -16,7 +16,7 @@ module.exports = [
|
|
|
16
16
|
toZigbee: [tz.on_off, tz.legrand_settingAlwaysEnableLed, tz.legrand_settingEnableLedIfOn, tz.legrand_identify],
|
|
17
17
|
exposes: [
|
|
18
18
|
e.switch(), e.action(['identify', 'on', 'off']),
|
|
19
|
-
exposes.binary('
|
|
19
|
+
exposes.binary('led_when_off', ea.ALL, 'ON', 'OFF').withDescription('Enables the LED when the light is off'),
|
|
20
20
|
exposes.binary('led_when_on', ea.ALL, 'ON', 'OFF').withDescription('Enables the LED when the light is on'),
|
|
21
21
|
],
|
|
22
22
|
configure: async (device, coordinatorEndpoint, logger) => {
|
|
@@ -39,7 +39,7 @@ module.exports = [
|
|
|
39
39
|
exposes.numeric('ballast_maximum_level', ea.ALL).withValueMin(1).withValueMax(254)
|
|
40
40
|
.withDescription('Specifies the maximum brightness value'),
|
|
41
41
|
exposes.binary('device_mode', ea.ALL, 'dimmer_on', 'dimmer_off').withDescription('Allow the device to change brightness'),
|
|
42
|
-
exposes.binary('
|
|
42
|
+
exposes.binary('led_when_off', ea.ALL, 'ON', 'OFF').withDescription('Enables the LED when the light is off'),
|
|
43
43
|
exposes.binary('led_when_on', ea.ALL, 'ON', 'OFF').withDescription('Enables the LED when the light is on')],
|
|
44
44
|
configure: async (device, coordinatorEndpoint, logger) => {
|
|
45
45
|
await extend.light_onoff_brightness().configure(device, coordinatorEndpoint, logger);
|
package/devices/gledopto.js
CHANGED
|
@@ -315,6 +315,13 @@ module.exports = [
|
|
|
315
315
|
extend: gledoptoExtend.light_onoff_brightness_colortemp_color(),
|
|
316
316
|
meta: {disableDefaultResponse: true},
|
|
317
317
|
},
|
|
318
|
+
{
|
|
319
|
+
zigbeeModel: ['GL-B-002P'],
|
|
320
|
+
model: 'GL-B-002P',
|
|
321
|
+
vendor: 'Gledopto',
|
|
322
|
+
description: 'Zigbee smart filament LED bulb',
|
|
323
|
+
extend: extend.light_onoff_brightness_colortemp_color({colorTempRange: [158, 495]}),
|
|
324
|
+
},
|
|
318
325
|
{
|
|
319
326
|
zigbeeModel: ['GL-MC-001P'],
|
|
320
327
|
model: 'GL-MC-001P',
|
package/devices/heiman.js
CHANGED
|
@@ -287,7 +287,7 @@ module.exports = [
|
|
|
287
287
|
description: 'Smart motion sensor',
|
|
288
288
|
fromZigbee: [fz.ias_occupancy_alarm_1, fz.battery],
|
|
289
289
|
toZigbee: [],
|
|
290
|
-
exposes: [e.occupancy(), e.battery_low(), e.battery(), e.battery_voltage()],
|
|
290
|
+
exposes: [e.occupancy(), e.battery_low(), e.battery(), e.battery_voltage(), e.tamper()],
|
|
291
291
|
meta: {battery: {voltageToPercentage: '3V_2500'}},
|
|
292
292
|
configure: async (device, coordinatorEndpoint, logger) => {
|
|
293
293
|
const endpoint = device.getEndpoint(1);
|
package/devices/keen_home.js
CHANGED
|
@@ -41,7 +41,8 @@ module.exports = [
|
|
|
41
41
|
exposes: [e.cover_position().setAccess('state', ea.ALL), e.temperature(), e.battery(), e.pressure()],
|
|
42
42
|
},
|
|
43
43
|
{
|
|
44
|
-
zigbeeModel: ['SV02-410-MP-1.3', 'SV02-412-MP-1.3', 'SV02-610-MP-1.3', 'SV02-612-MP-1.
|
|
44
|
+
zigbeeModel: ['SV02-410-MP-1.3', 'SV02-412-MP-1.3', 'SV02-610-MP-1.3', 'SV02-612-MP-1.2', 'SV02-612-MP-1.3', 'SV02-410-MP-1.0',
|
|
45
|
+
'SV02-410-MP-1.2'],
|
|
45
46
|
model: 'SV02',
|
|
46
47
|
vendor: 'Keen Home',
|
|
47
48
|
description: 'Smart vent',
|
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/legrand.js
CHANGED
|
@@ -182,7 +182,7 @@ module.exports = [
|
|
|
182
182
|
exposes.numeric('ballast_maximum_level', ea.ALL).withValueMin(1).withValueMax(254)
|
|
183
183
|
.withDescription('Specifies the maximum brightness value'),
|
|
184
184
|
exposes.binary('device_mode', ea.ALL, 'dimmer_on', 'dimmer_off').withDescription('Allow the device to change brightness'),
|
|
185
|
-
exposes.binary('
|
|
185
|
+
exposes.binary('led_when_off', ea.ALL, 'ON', 'OFF').withDescription('Enable the LED when the light is off'),
|
|
186
186
|
exposes.binary('led_when_on', ea.ALL, 'ON', 'OFF').withDescription('Enables the LED when the light is on')],
|
|
187
187
|
configure: async (device, coordinatorEndpoint, logger) => {
|
|
188
188
|
await extend.light_onoff_brightness().configure(device, coordinatorEndpoint, logger);
|
|
@@ -328,7 +328,7 @@ module.exports = [
|
|
|
328
328
|
toZigbee: [tz.on_off, tz.legrand_settingAlwaysEnableLed, tz.legrand_settingEnableLedIfOn],
|
|
329
329
|
exposes: [e.switch().withEndpoint('left'),
|
|
330
330
|
e.switch().withEndpoint('right'),
|
|
331
|
-
exposes.binary('
|
|
331
|
+
exposes.binary('led_when_off', ea.ALL, 'ON', 'OFF').withDescription('Enable the LED when the light is off'),
|
|
332
332
|
exposes.binary('led_when_on', ea.ALL, 'ON', 'OFF').withDescription('Enables the LED when the light is on')],
|
|
333
333
|
meta: {multiEndpoint: true},
|
|
334
334
|
configure: async (device, coordinatorEndpoint, logger) => {
|
package/devices/namron.js
CHANGED
|
@@ -276,7 +276,7 @@ module.exports = [
|
|
|
276
276
|
exposes.climate()
|
|
277
277
|
.withSetpoint('occupied_heating_setpoint', 0, 40, 0.1)
|
|
278
278
|
.withLocalTemperature()
|
|
279
|
-
.withLocalTemperatureCalibration(-
|
|
279
|
+
.withLocalTemperatureCalibration(-3, 3, 0.1)
|
|
280
280
|
.withSystemMode(['off', 'auto', 'heat'])
|
|
281
281
|
.withRunningState(['idle', 'heat']),
|
|
282
282
|
exposes.binary('away_mode', ea.ALL, 'ON', 'OFF')
|
|
@@ -308,16 +308,16 @@ module.exports = [
|
|
|
308
308
|
.withDescription('The temperature on the display. Default: Room Temperature.'),
|
|
309
309
|
exposes.numeric('window_open_check', ea.ALL)
|
|
310
310
|
.withUnit('°C')
|
|
311
|
-
.withValueMin(
|
|
312
|
-
.withDescription('The threshold to detect window open, between
|
|
311
|
+
.withValueMin(1.5).withValueMax(4).withValueStep(0.5)
|
|
312
|
+
.withDescription('The threshold to detect window open, between 1.5 and 4 in 0.5 °C. Default: 0 (disabled).'),
|
|
313
313
|
exposes.numeric('hysterersis', ea.ALL)
|
|
314
314
|
.withUnit('°C')
|
|
315
|
-
.withValueMin(5).withValueMax(
|
|
316
|
-
.withDescription('Hysteresis setting, between 5 and
|
|
315
|
+
.withValueMin(0.5).withValueMax(2).withValueStep(0.1)
|
|
316
|
+
.withDescription('Hysteresis setting, between 0.5 and 2 in 0.1 °C. Default: 0.5.'),
|
|
317
317
|
exposes.enum('display_auto_off_enabled', ea.ALL, ['enable', 'disabled']),
|
|
318
318
|
exposes.numeric('alarm_airtemp_overvalue', ea.ALL)
|
|
319
319
|
.withUnit('°C')
|
|
320
|
-
.withValueMin(20).withValueMax(60)
|
|
320
|
+
.withValueMin(20).withValueMax(60)
|
|
321
321
|
.withDescription('Room temperature alarm threshold, between 20 and 60 in °C. 0 means disabled. Default: 45.'),
|
|
322
322
|
],
|
|
323
323
|
configure: async (device, coordinatorEndpoint, logger) => {
|
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/philips.js
CHANGED
|
@@ -2258,6 +2258,20 @@ module.exports = [
|
|
|
2258
2258
|
},
|
|
2259
2259
|
ota: ota.zigbeeOTA,
|
|
2260
2260
|
},
|
|
2261
|
+
{
|
|
2262
|
+
zigbeeModel: ['LOM011'],
|
|
2263
|
+
model: '8719514342361',
|
|
2264
|
+
vendor: 'Philips',
|
|
2265
|
+
description: 'Hue smart plug - AU',
|
|
2266
|
+
extend: extend.switch(),
|
|
2267
|
+
toZigbee: [tz.on_off].concat([tz.hue_power_on_behavior, tz.hue_power_on_error]),
|
|
2268
|
+
configure: async (device, coordinatorEndpoint, logger) => {
|
|
2269
|
+
const endpoint = device.getEndpoint(11);
|
|
2270
|
+
await reporting.bind(endpoint, coordinatorEndpoint, ['genOnOff']);
|
|
2271
|
+
await reporting.onOff(endpoint);
|
|
2272
|
+
},
|
|
2273
|
+
ota: ota.zigbeeOTA,
|
|
2274
|
+
},
|
|
2261
2275
|
{
|
|
2262
2276
|
zigbeeModel: ['LOM006'],
|
|
2263
2277
|
model: '9290024426',
|
package/devices/rtx.js
CHANGED
|
@@ -6,7 +6,8 @@ const ea = exposes.access;
|
|
|
6
6
|
|
|
7
7
|
module.exports = [
|
|
8
8
|
{
|
|
9
|
-
fingerprint: [{modelID: 'TS0601', manufacturerName: '_TZE200_akjefhj5'}, {modelID: 'TS0601', manufacturerName: '_TZE200_2wg5qrjy'}
|
|
9
|
+
fingerprint: [{modelID: 'TS0601', manufacturerName: '_TZE200_akjefhj5'}, {modelID: 'TS0601', manufacturerName: '_TZE200_2wg5qrjy'},
|
|
10
|
+
{modelID: 'TS0601', manufacturerName: '_TZE200_81isopgh'}],
|
|
10
11
|
model: 'ZVG1',
|
|
11
12
|
vendor: 'RTX',
|
|
12
13
|
description: 'Zigbee smart water valve',
|
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',
|
|
@@ -1928,8 +1929,9 @@ module.exports = [
|
|
|
1928
1929
|
model: 'TS011F_din_smart_relay',
|
|
1929
1930
|
description: 'Din smart relay (with power monitoring)',
|
|
1930
1931
|
vendor: 'TuYa',
|
|
1931
|
-
fromZigbee: [fz.on_off, fz.electrical_measurement, fz.metering, fz.ignore_basic_report, fz.tuya_switch_power_outage_memory
|
|
1932
|
-
|
|
1932
|
+
fromZigbee: [fz.on_off, fz.electrical_measurement, fz.metering, fz.ignore_basic_report, fz.tuya_switch_power_outage_memory,
|
|
1933
|
+
fz.tuya_relay_din_led_indicator],
|
|
1934
|
+
toZigbee: [tz.on_off, tz.tuya_switch_power_outage_memory, tz.tuya_relay_din_led_indicator],
|
|
1933
1935
|
whiteLabel: [{vendor: 'MatSee Plus', model: 'ATMS1602Z'}],
|
|
1934
1936
|
configure: async (device, coordinatorEndpoint, logger) => {
|
|
1935
1937
|
const endpoint = device.getEndpoint(1);
|
|
@@ -1944,7 +1946,27 @@ module.exports = [
|
|
|
1944
1946
|
},
|
|
1945
1947
|
exposes: [e.switch(), e.power(), e.current(), e.voltage().withAccess(ea.STATE),
|
|
1946
1948
|
e.energy(), exposes.enum('power_outage_memory', ea.STATE_SET, ['on', 'off', 'restore'])
|
|
1947
|
-
.withDescription('Recover state after power outage')
|
|
1949
|
+
.withDescription('Recover state after power outage'),
|
|
1950
|
+
exposes.enum('indicator_mode', ea.STATE_SET, ['off', 'on_off', 'off_on'])
|
|
1951
|
+
.withDescription('Relay LED indicator mode')],
|
|
1952
|
+
},
|
|
1953
|
+
{
|
|
1954
|
+
fingerprint: [{modelID: 'TS011F', manufacturerName: '_TZ3000_7issjl2q'}],
|
|
1955
|
+
model: 'ATMS1601Z',
|
|
1956
|
+
description: 'Din smart relay (without power monitoring)',
|
|
1957
|
+
vendor: 'TuYa',
|
|
1958
|
+
fromZigbee: [fz.on_off, fz.ignore_basic_report, fz.tuya_switch_power_outage_memory, fz.tuya_relay_din_led_indicator],
|
|
1959
|
+
toZigbee: [tz.on_off, tz.tuya_switch_power_outage_memory, tz.tuya_relay_din_led_indicator],
|
|
1960
|
+
configure: async (device, coordinatorEndpoint, logger) => {
|
|
1961
|
+
const endpoint = device.getEndpoint(1);
|
|
1962
|
+
await reporting.bind(endpoint, coordinatorEndpoint, ['genOnOff']);
|
|
1963
|
+
device.save();
|
|
1964
|
+
},
|
|
1965
|
+
exposes: [e.switch(),
|
|
1966
|
+
exposes.enum('power_outage_memory', ea.STATE_SET, ['on', 'off', 'restore'])
|
|
1967
|
+
.withDescription('Recover state after power outage'),
|
|
1968
|
+
exposes.enum('indicator_mode', ea.STATE_SET, ['off', 'on_off', 'off_on'])
|
|
1969
|
+
.withDescription('Relay LED indicator mode')],
|
|
1948
1970
|
},
|
|
1949
1971
|
{
|
|
1950
1972
|
fingerprint: [{modelID: 'TS0601', manufacturerName: '_TZE200_nklqjk62'}],
|
|
@@ -2262,7 +2284,8 @@ module.exports = [
|
|
|
2262
2284
|
},
|
|
2263
2285
|
{
|
|
2264
2286
|
fingerprint: [{modelID: 'TS0601', manufacturerName: '_TZE200_ikvncluo'},
|
|
2265
|
-
{modelID: 'TS0601', manufacturerName: '_TZE200_lyetpprm'}
|
|
2287
|
+
{modelID: 'TS0601', manufacturerName: '_TZE200_lyetpprm'},
|
|
2288
|
+
{modelID: 'TS0601', manufacturerName: '_TZE200_ztc6ggyl'}],
|
|
2266
2289
|
model: 'TS0601_smart_human_presense_sensor',
|
|
2267
2290
|
vendor: 'TuYa',
|
|
2268
2291
|
description: 'Smart Human presence sensor',
|
|
@@ -2317,4 +2340,14 @@ module.exports = [
|
|
|
2317
2340
|
.withDescription('Alarm humidity min'),
|
|
2318
2341
|
],
|
|
2319
2342
|
},
|
|
2343
|
+
{
|
|
2344
|
+
fingerprint: [{modelID: 'TS0601', manufacturerName: '_TZE200_qoy0ekbd'}],
|
|
2345
|
+
model: 'CX-0726',
|
|
2346
|
+
vendor: 'TuYa',
|
|
2347
|
+
description: 'Temperature & humidity LCD sensor',
|
|
2348
|
+
fromZigbee: [fz.tuya_temperature_humidity_sensor, fz.ignore_tuya_set_time],
|
|
2349
|
+
toZigbee: [],
|
|
2350
|
+
onEvent: tuya.onEventSetLocalTime,
|
|
2351
|
+
exposes: [e.temperature(), e.humidity(), e.battery()],
|
|
2352
|
+
},
|
|
2320
2353
|
];
|
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',
|