zigbee-herdsman-converters 14.0.614 → 14.0.617
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 +1 -1
- package/converters/toZigbee.js +36 -0
- package/devices/aurora_lighting.js +7 -0
- package/devices/ecodim.js +5 -0
- package/devices/ikea.js +1 -0
- package/devices/kwikset.js +4 -3
- package/devices/ledvance.js +24 -1
- package/devices/owon.js +48 -0
- package/devices/salus_controls.js +6 -1
- package/devices/sengled.js +15 -1
- package/devices/sonoff.js +24 -0
- package/devices/tuya.js +44 -2
- package/lib/constants.js +1 -0
- package/lib/exposes.js +5 -1
- package/lib/tuya.js +2 -0
- package/package.json +1 -1
package/converters/fromZigbee.js
CHANGED
|
@@ -5119,7 +5119,7 @@ const converters = {
|
|
|
5119
5119
|
'105_14': 'press_2_and_3_and_4', '105_15': 'press_all', '105_16': 'press_energy_bar', '106_0': 'release',
|
|
5120
5120
|
};
|
|
5121
5121
|
|
|
5122
|
-
const ID = `${commandID}_${msg.data.commandFrame.raw.join('_')}`;
|
|
5122
|
+
const ID = `${commandID}_${msg.data.commandFrame.raw.slice(0, 1).join('_')}`;
|
|
5123
5123
|
if (!lookup.hasOwnProperty(ID)) {
|
|
5124
5124
|
meta.logger.error(`PTM 216Z: missing command '${ID}'`);
|
|
5125
5125
|
} else {
|
package/converters/toZigbee.js
CHANGED
|
@@ -1430,6 +1430,7 @@ const converters = {
|
|
|
1430
1430
|
}
|
|
1431
1431
|
const minHeatSetpointLimit = result;
|
|
1432
1432
|
await entity.write('hvacThermostat', {minHeatSetpointLimit});
|
|
1433
|
+
return {state: {min_heat_setpoint_limit: value}};
|
|
1433
1434
|
},
|
|
1434
1435
|
convertGet: async (entity, key, meta) => {
|
|
1435
1436
|
await entity.read('hvacThermostat', ['minHeatSetpointLimit']);
|
|
@@ -1446,11 +1447,46 @@ const converters = {
|
|
|
1446
1447
|
}
|
|
1447
1448
|
const maxHeatSetpointLimit = result;
|
|
1448
1449
|
await entity.write('hvacThermostat', {maxHeatSetpointLimit});
|
|
1450
|
+
return {state: {max_heat_setpoint_limit: value}};
|
|
1449
1451
|
},
|
|
1450
1452
|
convertGet: async (entity, key, meta) => {
|
|
1451
1453
|
await entity.read('hvacThermostat', ['maxHeatSetpointLimit']);
|
|
1452
1454
|
},
|
|
1453
1455
|
},
|
|
1456
|
+
thermostat_min_cool_setpoint_limit: {
|
|
1457
|
+
key: ['min_cool_setpoint_limit'],
|
|
1458
|
+
convertSet: async (entity, key, value, meta) => {
|
|
1459
|
+
let result;
|
|
1460
|
+
if (meta.options.thermostat_unit === 'fahrenheit') {
|
|
1461
|
+
result = Math.round(utils.normalizeCelsiusVersionOfFahrenheit(value) * 100);
|
|
1462
|
+
} else {
|
|
1463
|
+
result = (Math.round((value * 2).toFixed(1)) / 2).toFixed(1) * 100;
|
|
1464
|
+
}
|
|
1465
|
+
const minCoolSetpointLimit = result;
|
|
1466
|
+
await entity.write('hvacThermostat', {minCoolSetpointLimit});
|
|
1467
|
+
return {state: {min_cool_setpoint_limit: value}};
|
|
1468
|
+
},
|
|
1469
|
+
convertGet: async (entity, key, meta) => {
|
|
1470
|
+
await entity.read('hvacThermostat', ['minCoolSetpointLimit']);
|
|
1471
|
+
},
|
|
1472
|
+
},
|
|
1473
|
+
thermostat_max_cool_setpoint_limit: {
|
|
1474
|
+
key: ['max_cool_setpoint_limit'],
|
|
1475
|
+
convertSet: async (entity, key, value, meta) => {
|
|
1476
|
+
let result;
|
|
1477
|
+
if (meta.options.thermostat_unit === 'fahrenheit') {
|
|
1478
|
+
result = Math.round(utils.normalizeCelsiusVersionOfFahrenheit(value) * 100);
|
|
1479
|
+
} else {
|
|
1480
|
+
result = (Math.round((value * 2).toFixed(1)) / 2).toFixed(1) * 100;
|
|
1481
|
+
}
|
|
1482
|
+
const maxCoolSetpointLimit = result;
|
|
1483
|
+
await entity.write('hvacThermostat', {maxCoolSetpointLimit});
|
|
1484
|
+
return {state: {max_cool_setpoint_limit: value}};
|
|
1485
|
+
},
|
|
1486
|
+
convertGet: async (entity, key, meta) => {
|
|
1487
|
+
await entity.read('hvacThermostat', ['maxCoolSetpointLimit']);
|
|
1488
|
+
},
|
|
1489
|
+
},
|
|
1454
1490
|
thermostat_ac_louver_position: {
|
|
1455
1491
|
key: ['ac_louver_position'],
|
|
1456
1492
|
convertSet: async (entity, key, value, meta) => {
|
|
@@ -79,6 +79,13 @@ const batteryRotaryDimmer = (...endpointsIds) => ({
|
|
|
79
79
|
});
|
|
80
80
|
|
|
81
81
|
module.exports = [
|
|
82
|
+
{
|
|
83
|
+
zigbeeModel: ['RGBCXStrip50AU'],
|
|
84
|
+
model: 'AU-A1ZBSCRGBCX',
|
|
85
|
+
vendor: 'Aurora',
|
|
86
|
+
description: 'RGBW LED strip controller',
|
|
87
|
+
extend: extend.light_onoff_brightness_colortemp_color({colorTempRange: [166, 400]}),
|
|
88
|
+
},
|
|
82
89
|
{
|
|
83
90
|
zigbeeModel: ['TWGU10Bulb50AU'],
|
|
84
91
|
model: 'AU-A1GUZBCX5',
|
package/devices/ecodim.js
CHANGED
|
@@ -38,6 +38,11 @@ module.exports = [
|
|
|
38
38
|
{ID: 1, profileID: 260, deviceID: 257, inputClusters: [0, 3, 4, 5, 6, 8, 2821, 4096], outputClusters: [25]},
|
|
39
39
|
{ID: 242, profileID: 41440, deviceID: 97, inputClusters: [], outputClusters: [33]},
|
|
40
40
|
]},
|
|
41
|
+
{type: 'Router', manufacturerName: 'EcoDim BV', modelID: 'EcoDim-Zigbee 3.0', endpoints: [
|
|
42
|
+
{ID: 1, profileID: 260, deviceID: 257, inputClusters: [0, 3, 4, 5, 6, 8, 2821, 4096], outputClusters: [25]},
|
|
43
|
+
{ID: 67, inputClusters: [], outputClusters: []},
|
|
44
|
+
{ID: 242, profileID: 41440, deviceID: 97, inputClusters: [], outputClusters: [33]},
|
|
45
|
+
]},
|
|
41
46
|
],
|
|
42
47
|
zigbeeModel: ['Dimmer-Switch-ZB3.0'],
|
|
43
48
|
model: 'Eco-Dim.07/Eco-Dim.10',
|
package/devices/ikea.js
CHANGED
|
@@ -924,6 +924,7 @@ module.exports = [
|
|
|
924
924
|
|
|
925
925
|
await endpoint.read('manuSpecificIkeaAirPurifier', ['controlPanelLight', 'childLock', 'filterRunTime']);
|
|
926
926
|
},
|
|
927
|
+
ota: ota.tradfri,
|
|
927
928
|
},
|
|
928
929
|
{
|
|
929
930
|
zigbeeModel: ['TRADFRIbulbE14WScandleopal470lm', 'TRADFRIbulbE12WScandleopal450lm'],
|
package/devices/kwikset.js
CHANGED
|
@@ -55,15 +55,16 @@ module.exports = [
|
|
|
55
55
|
model: '99140-031',
|
|
56
56
|
vendor: 'Kwikset',
|
|
57
57
|
description: 'SmartCode traditional electronic deadbolt',
|
|
58
|
-
fromZigbee: [fz.lock, fz.lock_operation_event, fz.battery],
|
|
59
|
-
toZigbee: [tz.lock],
|
|
58
|
+
fromZigbee: [fz.lock, fz.lock_operation_event, fz.battery, fz.lock_programming_event, fz.lock_pin_code_response],
|
|
59
|
+
toZigbee: [tz.lock, tz.pincode_lock],
|
|
60
|
+
meta: {pinCodeCount: 30},
|
|
60
61
|
configure: async (device, coordinatorEndpoint, logger) => {
|
|
61
62
|
const endpoint = device.getEndpoint(2);
|
|
62
63
|
await reporting.bind(endpoint, coordinatorEndpoint, ['closuresDoorLock', 'genPowerCfg']);
|
|
63
64
|
await reporting.lockState(endpoint);
|
|
64
65
|
await reporting.batteryPercentageRemaining(endpoint);
|
|
65
66
|
},
|
|
66
|
-
exposes: [e.lock(), e.battery(), e.lock_action(), e.lock_action_source_name(), e.lock_action_user()],
|
|
67
|
+
exposes: [e.lock(), e.battery(), e.pincode(), e.lock_action(), e.lock_action_source_name(), e.lock_action_user()],
|
|
67
68
|
},
|
|
68
69
|
{
|
|
69
70
|
zigbeeModel: ['SMARTCODE_DEADBOLT_5'],
|
package/devices/ledvance.js
CHANGED
|
@@ -199,6 +199,29 @@ module.exports = [
|
|
|
199
199
|
extend: extend.ledvance.light_onoff_brightness(),
|
|
200
200
|
ota: ota.ledvance,
|
|
201
201
|
},
|
|
202
|
-
|
|
202
|
+
{
|
|
203
|
+
zigbeeModel: ['A60 FIL DIM T'],
|
|
204
|
+
model: '4058075729209',
|
|
205
|
+
vendor: 'LEDVANCE',
|
|
206
|
+
description: 'SMART+ Filament Classic A 52 E27 Amber dimmable',
|
|
207
|
+
extend: extend.ledvance.light_onoff_brightness(),
|
|
208
|
+
ota: ota.ledvance,
|
|
209
|
+
},
|
|
210
|
+
{
|
|
211
|
+
zigbeeModel: ['EDISON60 FIL DIM T'],
|
|
212
|
+
model: '4058075729223',
|
|
213
|
+
vendor: 'LEDVANCE',
|
|
214
|
+
description: 'SMART+ Filament Edison 52 E27 Amber dimmable',
|
|
215
|
+
extend: extend.ledvance.light_onoff_brightness(),
|
|
216
|
+
ota: ota.ledvance,
|
|
217
|
+
},
|
|
218
|
+
{
|
|
219
|
+
zigbeeModel: ['GLOBE60 FIL DIM T'],
|
|
220
|
+
model: '4058075729247',
|
|
221
|
+
vendor: 'LEDVANCE',
|
|
222
|
+
description: 'SMART+ Filament Globe125 52 E27 Amber dimmable',
|
|
223
|
+
extend: extend.ledvance.light_onoff_brightness(),
|
|
224
|
+
ota: ota.ledvance,
|
|
225
|
+
},
|
|
203
226
|
|
|
204
227
|
];
|
package/devices/owon.js
CHANGED
|
@@ -227,4 +227,52 @@ module.exports = [
|
|
|
227
227
|
exposes.numeric('reactive_power_l3', ea.STATE).withUnit('VAr').withDescription('Phase 3 reactive power'),
|
|
228
228
|
],
|
|
229
229
|
},
|
|
230
|
+
{
|
|
231
|
+
zigbeeModel: ['PCT504'],
|
|
232
|
+
model: 'PCT504',
|
|
233
|
+
vendor: 'OWON',
|
|
234
|
+
description: 'HVAC fan coil',
|
|
235
|
+
fromZigbee: [fz.fan, fz.thermostat, fz.humidity, fz.occupancy, fz.legacy.hvac_user_interface],
|
|
236
|
+
toZigbee: [tz.fan_mode, tz.thermostat_system_mode,
|
|
237
|
+
tz.thermostat_occupied_heating_setpoint, tz.thermostat_unoccupied_heating_setpoint,
|
|
238
|
+
tz.thermostat_occupied_cooling_setpoint, tz.thermostat_unoccupied_cooling_setpoint,
|
|
239
|
+
tz.thermostat_min_heat_setpoint_limit, tz.thermostat_max_heat_setpoint_limit,
|
|
240
|
+
tz.thermostat_min_cool_setpoint_limit, tz.thermostat_max_cool_setpoint_limit,
|
|
241
|
+
tz.thermostat_local_temperature, tz.thermostat_running_state,
|
|
242
|
+
tz.thermostat_keypad_lockout],
|
|
243
|
+
exposes: [e.humidity(), e.occupancy(),
|
|
244
|
+
exposes.climate().withSystemMode(['off', 'heat', 'cool', 'fan_only']).withRunningState(['idle', 'heat', 'cool', 'fan_only'])
|
|
245
|
+
.withSetpoint('occupied_heating_setpoint', 5, 30, 0.5).withSetpoint('unoccupied_heating_setpoint', 5, 30, 0.5)
|
|
246
|
+
.withSetpoint('occupied_cooling_setpoint', 7, 35, 0.5).withSetpoint('unoccupied_cooling_setpoint', 7, 35, 0.5)
|
|
247
|
+
.withLocalTemperature(),
|
|
248
|
+
e.fan().withModes(['low', 'medium', 'high', 'on', 'auto']), e.keypad_lockout(),
|
|
249
|
+
e.max_heat_setpoint_limit(5, 30, 0.5), e.min_heat_setpoint_limit(5, 30, 0.5),
|
|
250
|
+
e.max_cool_setpoint_limit(7, 35, 0.5), e.min_cool_setpoint_limit(7, 35, 0.5)],
|
|
251
|
+
configure: async (device, coordinatorEndpoint, logger) => {
|
|
252
|
+
const endpoint = device.getEndpoint(1);
|
|
253
|
+
const binds = ['genBasic', 'genIdentify', 'genGroups', 'hvacThermostat', 'hvacUserInterfaceCfg', 'hvacFanCtrl',
|
|
254
|
+
'msTemperatureMeasurement', 'msOccupancySensing'];
|
|
255
|
+
await reporting.bind(endpoint, coordinatorEndpoint, binds);
|
|
256
|
+
await reporting.fanMode(endpoint);
|
|
257
|
+
await reporting.bind(endpoint, coordinatorEndpoint, ['hvacThermostat']);
|
|
258
|
+
await reporting.thermostatOccupiedHeatingSetpoint(endpoint);
|
|
259
|
+
await reporting.thermostatUnoccupiedHeatingSetpoint(endpoint);
|
|
260
|
+
await reporting.thermostatOccupiedCoolingSetpoint(endpoint);
|
|
261
|
+
await reporting.thermostatUnoccupiedCoolingSetpoint(endpoint);
|
|
262
|
+
await reporting.thermostatTemperature(endpoint, {min: 60, max: 600, change: 0.1});
|
|
263
|
+
await reporting.thermostatSystemMode(endpoint);
|
|
264
|
+
await reporting.humidity(endpoint, {min: 60, max: 600, change: 1});
|
|
265
|
+
await reporting.thermostatKeypadLockMode(endpoint);
|
|
266
|
+
|
|
267
|
+
await endpoint.read('hvacThermostat', ['systemMode', 'runningState', 'occupiedHeatingSetpoint', 'unoccupiedHeatingSetpoint',
|
|
268
|
+
'occupiedCoolingSetpoint', 'unoccupiedCoolingSetpoint', 'localTemp'],
|
|
269
|
+
'minHeatSetpointLimit', 'maxHeatSetpointLimit', 'minCoolSetpointLimit', 'maxCoolSetpointLimit');
|
|
270
|
+
await endpoint.read('msRelativeHumidity', ['measuredValue']);
|
|
271
|
+
|
|
272
|
+
const endpoint2 = device.getEndpoint(2);
|
|
273
|
+
await reporting.bind(endpoint2, coordinatorEndpoint, ['msOccupancySensing']);
|
|
274
|
+
await reporting.occupancy(endpoint2, {min: 1, max: 600, change: 1});
|
|
275
|
+
await endpoint2.read('msOccupancySensing', ['occupancy']);
|
|
276
|
+
},
|
|
277
|
+
},
|
|
230
278
|
];
|
|
@@ -87,7 +87,12 @@ module.exports = [
|
|
|
87
87
|
ota: ota.salus,
|
|
88
88
|
},
|
|
89
89
|
{
|
|
90
|
-
zigbeeModel: [
|
|
90
|
+
zigbeeModel: [
|
|
91
|
+
'SS909ZB',
|
|
92
|
+
'PS600\u0000\u0000 �\u0001 ��\u0000\u0000\t\u0001@\u0011�u\u0000\u0000\u0018&\n\u0005\u0000B',
|
|
93
|
+
'PS600\u0000\u0000 �\u0001 ��\u0000\u0000\t\u0001@\u0011�u\u0000\u0000\u0018\u0006\n\u0005\u0000',
|
|
94
|
+
'PS600\u0000\u0000 �\u0001 ��\u0000\u0000\t\u0001@\u0011�u\u0000\u0000\u0018\u0006\n\u0005\u0000B',
|
|
95
|
+
],
|
|
91
96
|
model: 'PS600',
|
|
92
97
|
vendor: 'Salus Controls',
|
|
93
98
|
description: 'Pipe temperature sensor',
|
package/devices/sengled.js
CHANGED
|
@@ -61,8 +61,22 @@ module.exports = [
|
|
|
61
61
|
model: 'E12-N1E',
|
|
62
62
|
vendor: 'Sengled',
|
|
63
63
|
description: 'Smart LED multicolor (BR30)',
|
|
64
|
-
|
|
64
|
+
fromZigbee: sengledExtend.light_onoff_brightness_colortemp_color({colorTempRange: [154, 500]}).fromZigbee.concat([fz.metering]),
|
|
65
|
+
toZigbee: sengledExtend.light_onoff_brightness_colortemp_color({colorTempRange: [154, 500]}).toZigbee,
|
|
66
|
+
exposes: sengledExtend.light_onoff_brightness_colortemp_color({colorTempRange: [154, 500]}).exposes.concat([e.power(), e.energy()]),
|
|
65
67
|
ota: ota.zigbeeOTA,
|
|
68
|
+
configure: async (device, coordinatorEndpoint, logger) => {
|
|
69
|
+
await sengledExtend.light_onoff_brightness_colortemp_color({colorTempRange: [154, 500]})
|
|
70
|
+
.configure(device, coordinatorEndpoint, logger);
|
|
71
|
+
device.powerSource = 'Mains (single phase)';
|
|
72
|
+
device.save();
|
|
73
|
+
|
|
74
|
+
const endpoint = device.getEndpoint(1);
|
|
75
|
+
await reporting.bind(endpoint, coordinatorEndpoint, ['genOnOff', 'seMetering']);
|
|
76
|
+
await reporting.readMeteringMultiplierDivisor(endpoint);
|
|
77
|
+
await reporting.currentSummDelivered(endpoint);
|
|
78
|
+
await reporting.instantaneousDemand(endpoint);
|
|
79
|
+
},
|
|
66
80
|
},
|
|
67
81
|
{
|
|
68
82
|
zigbeeModel: ['E1G-G8E'],
|
package/devices/sonoff.js
CHANGED
|
@@ -5,6 +5,7 @@ const constants = require('../lib/constants');
|
|
|
5
5
|
const reporting = require('../lib/reporting');
|
|
6
6
|
const extend = require('../lib/extend');
|
|
7
7
|
const e = exposes.presets;
|
|
8
|
+
const ea = exposes.access;
|
|
8
9
|
const ota = require('../lib/ota');
|
|
9
10
|
|
|
10
11
|
const fzLocal = {
|
|
@@ -18,6 +19,16 @@ const fzLocal = {
|
|
|
18
19
|
}
|
|
19
20
|
},
|
|
20
21
|
},
|
|
22
|
+
router_config: {
|
|
23
|
+
cluster: 'genLevelCtrl',
|
|
24
|
+
type: ['attributeReport', 'readResponse'],
|
|
25
|
+
convert: (model, msg, publish, options, meta) => {
|
|
26
|
+
const result = {};
|
|
27
|
+
if (msg.data.hasOwnProperty('currentLevel')) {
|
|
28
|
+
result.light_indicator_level = msg.data['currentLevel'];
|
|
29
|
+
}
|
|
30
|
+
},
|
|
31
|
+
},
|
|
21
32
|
};
|
|
22
33
|
|
|
23
34
|
module.exports = [
|
|
@@ -189,4 +200,17 @@ module.exports = [
|
|
|
189
200
|
await reporting.bind(endpoint, coordinatorEndpoint, ['genOnOff']);
|
|
190
201
|
},
|
|
191
202
|
},
|
|
203
|
+
{
|
|
204
|
+
zigbeeModel: ['DONGLE-E_R'],
|
|
205
|
+
model: 'ZBDongle-E',
|
|
206
|
+
vendor: 'SONOFF',
|
|
207
|
+
description: 'Sonoff Zigbee 3.0 USB Dongle Plus (EFR32MG21) with router firmware',
|
|
208
|
+
fromZigbee: [fz.linkquality_from_basic, fzLocal.router_config],
|
|
209
|
+
toZigbee: [],
|
|
210
|
+
exposes: [exposes.numeric('light_indicator_level').withDescription('Brightness of the indicator light').withAccess(ea.STATE)],
|
|
211
|
+
configure: async (device, coordinatorEndpoint, logger) => {
|
|
212
|
+
device.powerSource = 'Mains (single phase)';
|
|
213
|
+
device.save();
|
|
214
|
+
},
|
|
215
|
+
},
|
|
192
216
|
];
|
package/devices/tuya.js
CHANGED
|
@@ -277,6 +277,28 @@ const tzLocal = {
|
|
|
277
277
|
};
|
|
278
278
|
|
|
279
279
|
const fzLocal = {
|
|
280
|
+
tuya_dinrail_switch2: {
|
|
281
|
+
cluster: 'manuSpecificTuya',
|
|
282
|
+
type: ['commandDataReport', 'commandDataResponse', 'commandActiveStatusReport'],
|
|
283
|
+
convert: (model, msg, publish, options, meta) => {
|
|
284
|
+
const dpValue = tuya.firstDpValue(msg, meta, 'tuya_dinrail_switch2');
|
|
285
|
+
const dp = dpValue.dp;
|
|
286
|
+
const value = tuya.getDataValue(dpValue);
|
|
287
|
+
const state = value ? 'ON' : 'OFF';
|
|
288
|
+
|
|
289
|
+
switch (dp) {
|
|
290
|
+
case tuya.dataPoints.state: // DPID that we added to common
|
|
291
|
+
return {state: state};
|
|
292
|
+
case tuya.dataPoints.dinrailPowerMeterTotalEnergy2:
|
|
293
|
+
return {energy: value/100};
|
|
294
|
+
case tuya.dataPoints.dinrailPowerMeterPower2:
|
|
295
|
+
return {power: value};
|
|
296
|
+
default:
|
|
297
|
+
meta.logger.warn(`zigbee-herdsman-converters:TuyaDinRailSwitch: NOT RECOGNIZED DP ` +
|
|
298
|
+
`#${dp} with data ${JSON.stringify(dpValue)}`);
|
|
299
|
+
}
|
|
300
|
+
},
|
|
301
|
+
},
|
|
280
302
|
hpsz: {
|
|
281
303
|
cluster: 'manuSpecificTuya',
|
|
282
304
|
type: ['commandDataResponse', 'commandDataReport'],
|
|
@@ -918,7 +940,12 @@ module.exports = [
|
|
|
918
940
|
// Requires alarm_1_with_timeout https://github.com/Koenkk/zigbee2mqtt/issues/2818#issuecomment-776119586
|
|
919
941
|
fromZigbee: [fz.ias_occupancy_alarm_1_with_timeout, fz.battery, fz.ignore_basic_report],
|
|
920
942
|
toZigbee: [],
|
|
921
|
-
exposes: [e.occupancy(), e.battery_low(), e.linkquality()],
|
|
943
|
+
exposes: [e.occupancy(), e.battery_low(), e.linkquality(), e.battery(), e.battery_voltage()],
|
|
944
|
+
configure: async (device, coordinatorEndpoint, logger) => {
|
|
945
|
+
const endpoint = device.getEndpoint(1);
|
|
946
|
+
await reporting.bind(endpoint, coordinatorEndpoint, ['genPowerCfg']);
|
|
947
|
+
await reporting.batteryPercentageRemaining(endpoint);
|
|
948
|
+
},
|
|
922
949
|
},
|
|
923
950
|
{
|
|
924
951
|
fingerprint: [{modelID: 'TS0202', manufacturerName: '_TYZB01_dr6sduka'},
|
|
@@ -987,6 +1014,7 @@ module.exports = [
|
|
|
987
1014
|
fingerprint: [{modelID: 'TS0207', manufacturerName: '_TZ3000_m0vaazab'},
|
|
988
1015
|
{modelID: 'TS0207', manufacturerName: '_TZ3000_ufttklsz'},
|
|
989
1016
|
{modelID: 'TS0207', manufacturerName: '_TZ3000_nkkl7uzv'},
|
|
1017
|
+
{modelID: 'TS0207', manufacturerName: '_TZ3000_gszjt2xx'},
|
|
990
1018
|
{modelID: 'TS0207', manufacturerName: '_TZ3000_5k5vh43t'}],
|
|
991
1019
|
model: 'TS0207_repeater',
|
|
992
1020
|
vendor: 'TuYa',
|
|
@@ -2104,6 +2132,19 @@ module.exports = [
|
|
|
2104
2132
|
},
|
|
2105
2133
|
exposes: [e.switch().setAccess('state', ea.STATE_SET), e.voltage(), e.power(), e.current(), e.energy()],
|
|
2106
2134
|
},
|
|
2135
|
+
{
|
|
2136
|
+
fingerprint: [{modelID: 'TS0601', manufacturerName: '_TZE200_bkkmqmyo'}],
|
|
2137
|
+
model: 'DDS238-2',
|
|
2138
|
+
vendor: 'TuYa',
|
|
2139
|
+
description: 'Zigbee smart energy meter',
|
|
2140
|
+
fromZigbee: [fzLocal.tuya_dinrail_switch2],
|
|
2141
|
+
toZigbee: [tz.tuya_switch_state],
|
|
2142
|
+
configure: async (device, coordinatorEndpoint, logger) => {
|
|
2143
|
+
const endpoint = device.getEndpoint(1);
|
|
2144
|
+
await reporting.bind(endpoint, coordinatorEndpoint, ['genBasic']);
|
|
2145
|
+
},
|
|
2146
|
+
exposes: [e.switch().setAccess('state', ea.STATE_SET), e.energy(), e.power()],
|
|
2147
|
+
},
|
|
2107
2148
|
{
|
|
2108
2149
|
fingerprint: [{modelID: 'TS1101', manufacturerName: '_TZ3000_xfs39dbf'}],
|
|
2109
2150
|
model: 'TS1101_dimmer_module_1ch',
|
|
@@ -3028,7 +3069,8 @@ module.exports = [
|
|
|
3028
3069
|
],
|
|
3029
3070
|
},
|
|
3030
3071
|
{
|
|
3031
|
-
fingerprint: [{modelID: 'TS0601', manufacturerName: '_TZE200_qoy0ekbd'}
|
|
3072
|
+
fingerprint: [{modelID: 'TS0601', manufacturerName: '_TZE200_qoy0ekbd'},
|
|
3073
|
+
{modelID: 'TS0601', manufacturerName: '_TZE200_znbl8dj5'}],
|
|
3032
3074
|
model: 'CX-0726',
|
|
3033
3075
|
vendor: 'TuYa',
|
|
3034
3076
|
description: 'Temperature & humidity LCD sensor',
|
package/lib/constants.js
CHANGED
package/lib/exposes.js
CHANGED
|
@@ -588,6 +588,10 @@ module.exports = {
|
|
|
588
588
|
lock_action: () => new Enum('action', access.STATE, ['unknown', 'lock', 'unlock', 'lock_failure_invalid_pin_or_id', 'lock_failure_invalid_schedule', 'unlock_failure_invalid_pin_or_id', 'unlock_failure_invalid_schedule', 'one_touch_lock', 'key_lock', 'key_unlock', 'auto_lock', 'schedule_lock', 'schedule_unlock', 'manual_lock', 'manual_unlock', 'non_access_user_operational_event']).withDescription('Triggered action on the lock'),
|
|
589
589
|
lock_action_source_name: () => new Enum('action_source_name', access.STATE, ['keypad', 'rfid', 'manual', 'rf']).withDescription('Source of the triggered action on the lock'),
|
|
590
590
|
lock_action_user: () => new Numeric('action_user', access.STATE).withDescription('ID of user that triggered the action on the lock'),
|
|
591
|
+
max_cool_setpoint_limit: (min, max, step) => new Numeric('max_cool_setpoint_limit', access.ALL).withUnit('°C').withDescription('Maximum Cooling set point limit').withValueMin(min).withValueMax(max).withValueStep(step),
|
|
592
|
+
min_cool_setpoint_limit: (min, max, step) => new Numeric('min_cool_setpoint_limit', access.ALL).withUnit('°C').withDescription('Minimum Cooling point limit').withValueMin(min).withValueMax(max).withValueStep(step),
|
|
593
|
+
max_heat_setpoint_limit: (min, max, step) => new Numeric('max_heat_setpoint_limit', access.ALL).withUnit('°C').withDescription('Maximum Heating set point limit').withValueMin(min).withValueMax(max).withValueStep(step),
|
|
594
|
+
min_heat_setpoint_limit: (min, max, step) => new Numeric('min_heat_setpoint_limit', access.ALL).withUnit('°C').withDescription('Minimum Heating set point limit').withValueMin(min).withValueMax(max).withValueStep(step),
|
|
591
595
|
max_temperature: () => new Numeric('max_temperature', access.STATE_SET).withUnit('°C').withDescription('Maximum temperature').withValueMin(15).withValueMax(35),
|
|
592
596
|
max_temperature_limit: () => new Numeric('max_temperature_limit', access.STATE_SET).withUnit('°C').withDescription('Maximum temperature limit').withValueMin(0).withValueMax(35),
|
|
593
597
|
min_temperature: () => new Numeric('min_temperature', access.STATE_SET).withUnit('°C').withDescription('Minimum temperature').withValueMin(1).withValueMax(15),
|
|
@@ -608,7 +612,7 @@ module.exports = {
|
|
|
608
612
|
power_outage_memory: () => new Binary('power_outage_memory', access.ALL, true, false).withDescription('Enable/disable the power outage memory, this recovers the on/off mode after power failure'),
|
|
609
613
|
presence: () => new Binary('presence', access.STATE, true, false).withDescription('Indicates whether the device detected presence'),
|
|
610
614
|
pressure: () => new Numeric('pressure', access.STATE).withUnit('hPa').withDescription('The measured atmospheric pressure'),
|
|
611
|
-
programming_operation_mode: () => new Enum('programming_operation_mode', access.ALL, ['setpoint', 'schedule']).withDescription('Controls how programming affects the thermostat. Possible values: setpoint (only use specified setpoint), schedule (follow programmed setpoint schedule). Changing this value does not clear programmed schedules.'),
|
|
615
|
+
programming_operation_mode: () => new Enum('programming_operation_mode', access.ALL, ['setpoint', 'schedule', 'eco']).withDescription('Controls how programming affects the thermostat. Possible values: setpoint (only use specified setpoint), schedule (follow programmed setpoint schedule). Changing this value does not clear programmed schedules.'),
|
|
612
616
|
smoke: () => new Binary('smoke', access.STATE, true, false).withDescription('Indicates whether the device detected smoke'),
|
|
613
617
|
soil_moisture: () => new Numeric('soil_moisture', access.STATE).withUnit('%').withDescription('Measured soil moisture value'),
|
|
614
618
|
sos: () => new Binary('sos', access.STATE, true, false).withDescription('SOS alarm'),
|
package/lib/tuya.js
CHANGED
|
@@ -595,6 +595,8 @@ const dataPoints = {
|
|
|
595
595
|
dinrailPowerMeterCurrent: 18,
|
|
596
596
|
dinrailPowerMeterPower: 19,
|
|
597
597
|
dinrailPowerMeterVoltage: 20,
|
|
598
|
+
dinrailPowerMeterTotalEnergy2: 101,
|
|
599
|
+
dinrailPowerMeterPower2: 103,
|
|
598
600
|
// tuya smart air box
|
|
599
601
|
tuyaSabCO2: 2,
|
|
600
602
|
tuyaSabTemp: 18,
|