zigbee-herdsman-converters 14.0.576 → 14.0.579
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/devices/ajax_online.js +8 -0
- package/devices/bitron.js +5 -1
- package/devices/legrand.js +18 -0
- package/devices/mecrator.js +24 -0
- package/devices/miboxer.js +16 -0
- package/devices/philips.js +1 -1
- package/devices/plugwise.js +23 -0
- package/devices/rademacher.js +7 -0
- package/devices/robb.js +1 -1
- package/devices/sunricher.js +188 -0
- package/devices/tuya.js +8 -3
- package/devices/xiaomi.js +16 -1
- package/lib/exposes.js +1 -1
- package/lib/xiaomi.js +5 -5
- package/package.json +2 -2
package/converters/fromZigbee.js
CHANGED
|
@@ -7338,7 +7338,7 @@ const converters = {
|
|
|
7338
7338
|
const dpValue = tuya.firstDpValue(msg, meta, 'SLUXZB');
|
|
7339
7339
|
const dp = dpValue.dp;
|
|
7340
7340
|
const value = tuya.getDataValue(dpValue);
|
|
7341
|
-
const brightnesStateLookup = {'0': '
|
|
7341
|
+
const brightnesStateLookup = {'0': 'low', '1': 'middle', '2': 'high'};
|
|
7342
7342
|
switch (dp) {
|
|
7343
7343
|
case 2:
|
|
7344
7344
|
return {illuminance_lux: value};
|
package/devices/ajax_online.js
CHANGED
|
@@ -30,4 +30,12 @@ module.exports = [
|
|
|
30
30
|
description: 'Smart Zigbee pro 12W A60 RGBCW bulb',
|
|
31
31
|
extend: extend.light_onoff_brightness_colortemp_color({colorTempRange: [153, 500]}),
|
|
32
32
|
},
|
|
33
|
+
{
|
|
34
|
+
fingerprint: [{modelID: 'TS0505B', manufacturerName: '_TZ3210_hzy4rjz3'}],
|
|
35
|
+
model: 'AJ_RGBCCT_CTRL',
|
|
36
|
+
vendor: 'Ajax Online',
|
|
37
|
+
description: 'Smart Zigbee LED strip RGB+CCT',
|
|
38
|
+
extend: extend.light_onoff_brightness_colortemp_color({colorTempRange: [153, 500], disableColorTempStartup: true}),
|
|
39
|
+
meta: {applyRedFix: true, enhancedHue: false},
|
|
40
|
+
},
|
|
33
41
|
];
|
package/devices/bitron.js
CHANGED
|
@@ -136,7 +136,11 @@ module.exports = [
|
|
|
136
136
|
await reporting.bind(endpoint, coordinatorEndpoint, ['genOnOff', 'seMetering']);
|
|
137
137
|
await reporting.instantaneousDemand(endpoint);
|
|
138
138
|
await reporting.currentSummDelivered(endpoint);
|
|
139
|
-
|
|
139
|
+
try {
|
|
140
|
+
await reporting.currentSummReceived(endpoint);
|
|
141
|
+
} catch (error) {
|
|
142
|
+
/* fails for some: https://github.com/Koenkk/zigbee2mqtt/issues/13258 */
|
|
143
|
+
}
|
|
140
144
|
endpoint.saveClusterAttributeKeyValue('seMetering', {divisor: 10000, multiplier: 1});
|
|
141
145
|
},
|
|
142
146
|
},
|
package/devices/legrand.js
CHANGED
|
@@ -266,6 +266,24 @@ module.exports = [
|
|
|
266
266
|
// Read configuration values that are not sent periodically as well as current power (activePower).
|
|
267
267
|
await endpoint.read('haElectricalMeasurement', ['activePower', 0xf000, 0xf001, 0xf002]);
|
|
268
268
|
},
|
|
269
|
+
onEvent: async (type, data, device, options, state) => {
|
|
270
|
+
/**
|
|
271
|
+
* The DIN power consumption module loses the configure reporting
|
|
272
|
+
* after device restart/powerloss.
|
|
273
|
+
*
|
|
274
|
+
* We reconfigure the reporting at deviceAnnounce.
|
|
275
|
+
*/
|
|
276
|
+
if (type === 'deviceAnnounce') {
|
|
277
|
+
for (const endpoint of device.endpoints) {
|
|
278
|
+
for (const c of endpoint.configuredReportings) {
|
|
279
|
+
await endpoint.configureReporting(c.cluster.name, [{
|
|
280
|
+
attribute: c.attribute.name, minimumReportInterval: c.minimumReportInterval,
|
|
281
|
+
maximumReportInterval: c.maximumReportInterval, reportableChange: c.reportableChange,
|
|
282
|
+
}]);
|
|
283
|
+
}
|
|
284
|
+
}
|
|
285
|
+
}
|
|
286
|
+
},
|
|
269
287
|
},
|
|
270
288
|
{
|
|
271
289
|
zigbeeModel: ['Remote switch Wake up / Sleep'],
|
package/devices/mecrator.js
CHANGED
|
@@ -6,6 +6,30 @@ const e = exposes.presets;
|
|
|
6
6
|
const ea = exposes.access;
|
|
7
7
|
|
|
8
8
|
module.exports = [
|
|
9
|
+
{
|
|
10
|
+
fingerprint: [{modelID: 'TS011F', manufacturerName: '_TZ3210_yvxjawlt'}],
|
|
11
|
+
model: 'SPP04G',
|
|
12
|
+
vendor: 'Mercator',
|
|
13
|
+
description: 'Ikuü Quad Power Point',
|
|
14
|
+
fromZigbee: [fz.on_off, fz.electrical_measurement, fz.metering, fz.ignore_basic_report, fz.tuya_switch_power_outage_memory],
|
|
15
|
+
toZigbee: [tz.on_off, tz.tuya_switch_power_outage_memory],
|
|
16
|
+
exposes: [e.switch().withEndpoint('left'), e.switch().withEndpoint('right'),
|
|
17
|
+
e.power().withEndpoint('left'), e.current().withEndpoint('left'),
|
|
18
|
+
e.voltage().withEndpoint('left').withAccess(ea.STATE), e.energy(),
|
|
19
|
+
exposes.enum('power_outage_memory', ea.ALL, ['on', 'off', 'restore'])
|
|
20
|
+
.withDescription('Recover state after power outage')],
|
|
21
|
+
endpoint: (device) => {
|
|
22
|
+
return {left: 1, right: 2};
|
|
23
|
+
},
|
|
24
|
+
meta: {multiEndpoint: true},
|
|
25
|
+
configure: async (device, coordinatorEndpoint, logger) => {
|
|
26
|
+
const endpoint = device.getEndpoint(1);
|
|
27
|
+
await endpoint.read('genBasic', ['manufacturerName', 'zclVersion', 'appVersion', 'modelId', 'powerSource', 0xfffe]);
|
|
28
|
+
endpoint.saveClusterAttributeKeyValue('haElectricalMeasurement', {acCurrentDivisor: 1000, acCurrentMultiplier: 1});
|
|
29
|
+
endpoint.saveClusterAttributeKeyValue('seMetering', {divisor: 100, multiplier: 1});
|
|
30
|
+
device.save();
|
|
31
|
+
},
|
|
32
|
+
},
|
|
9
33
|
{
|
|
10
34
|
fingerprint: [{modelID: 'TS011F', manufacturerName: '_TZ3210_7jnk7l3k'}],
|
|
11
35
|
model: 'SPP02GIP',
|
package/devices/miboxer.js
CHANGED
|
@@ -7,6 +7,22 @@ const extend = require('../lib/extend');
|
|
|
7
7
|
const tuya = require('../lib/tuya');
|
|
8
8
|
|
|
9
9
|
module.exports = [
|
|
10
|
+
{
|
|
11
|
+
fingerprint: [{modelID: 'TS0505B', manufacturerName: '_TZ3210_zrvxvydd'}],
|
|
12
|
+
model: 'FUT066Z',
|
|
13
|
+
vendor: 'MiBoxer',
|
|
14
|
+
description: 'RGB+CCT LED Downlight',
|
|
15
|
+
toZigbee: extend.light_onoff_brightness_colortemp_color().toZigbee.concat([
|
|
16
|
+
tz.tuya_do_not_disturb, tz.tuya_color_power_on_behavior]),
|
|
17
|
+
meta: {applyRedFix: true, enhancedHue: false},
|
|
18
|
+
fromZigbee: extend.light_onoff_brightness_colortemp_color().fromZigbee,
|
|
19
|
+
exposes: [e.light_brightness_colortemp_colorhs([153, 500]).removeFeature('color_temp_startup'),
|
|
20
|
+
exposes.binary('do_not_disturb', ea.STATE_SET, true, false)
|
|
21
|
+
.withDescription('Do not disturb mode'),
|
|
22
|
+
exposes.enum('color_power_on_behavior', ea.STATE_SET, ['initial', 'previous', 'cutomized'])
|
|
23
|
+
.withDescription('Power on behavior state'),
|
|
24
|
+
],
|
|
25
|
+
},
|
|
10
26
|
{
|
|
11
27
|
fingerprint: [{modelID: 'TS0505B', manufacturerName: '_TZ3210_jicmoite'}],
|
|
12
28
|
model: 'FUT039Z',
|
package/devices/philips.js
CHANGED
|
@@ -406,7 +406,7 @@ module.exports = [
|
|
|
406
406
|
extend: hueExtend.light_onoff_brightness(),
|
|
407
407
|
},
|
|
408
408
|
{
|
|
409
|
-
zigbeeModel: ['LCT026', '7602031P7', '7602031U7'],
|
|
409
|
+
zigbeeModel: ['LCT026', '7602031P7', '7602031U7', '7602031PU'],
|
|
410
410
|
model: '7602031P7',
|
|
411
411
|
vendor: 'Philips',
|
|
412
412
|
description: 'Hue Go with Bluetooth',
|
package/devices/plugwise.js
CHANGED
|
@@ -149,4 +149,27 @@ module.exports = [
|
|
|
149
149
|
.withDescription('Calibrates valve on next wakeup'),
|
|
150
150
|
],
|
|
151
151
|
},
|
|
152
|
+
{
|
|
153
|
+
zigbeeModel: ['158-01'],
|
|
154
|
+
model: '158-01',
|
|
155
|
+
vendor: 'Plugwise',
|
|
156
|
+
description: 'Lisa zone thermostat',
|
|
157
|
+
fromZigbee: [fz.thermostat, fz.temperature, fz.battery],
|
|
158
|
+
toZigbee: [
|
|
159
|
+
tz.thermostat_system_mode,
|
|
160
|
+
tz.thermostat_occupied_heating_setpoint,
|
|
161
|
+
],
|
|
162
|
+
configure: async (device, coordinatorEndpoint, logger) => {
|
|
163
|
+
const endpoint = device.getEndpoint(1);
|
|
164
|
+
await reporting.bind(endpoint, coordinatorEndpoint, ['genBasic', 'genPowerCfg', 'hvacThermostat']);
|
|
165
|
+
await reporting.batteryPercentageRemaining(endpoint);
|
|
166
|
+
await reporting.thermostatTemperature(endpoint);
|
|
167
|
+
},
|
|
168
|
+
exposes: [e.battery(),
|
|
169
|
+
exposes.climate()
|
|
170
|
+
.withSetpoint('occupied_heating_setpoint', 5, 30, 0.5, ea.ALL)
|
|
171
|
+
.withLocalTemperature(ea.STATE)
|
|
172
|
+
.withSystemMode(['off', 'auto'], ea.ALL),
|
|
173
|
+
],
|
|
174
|
+
},
|
|
152
175
|
];
|
package/devices/rademacher.js
CHANGED
|
@@ -8,4 +8,11 @@ module.exports = [
|
|
|
8
8
|
description: 'addZ white + colour',
|
|
9
9
|
extend: extend.light_onoff_brightness_colortemp_color({colorTempRange: [153, 555]}),
|
|
10
10
|
},
|
|
11
|
+
{
|
|
12
|
+
zigbeeModel: ['RDM-35144001'],
|
|
13
|
+
model: '35144001',
|
|
14
|
+
vendor: 'Rademacher',
|
|
15
|
+
description: 'addZ white + colour',
|
|
16
|
+
extend: extend.light_onoff_brightness_colortemp_color({colorTempRange: [153, 555]}),
|
|
17
|
+
},
|
|
11
18
|
];
|
package/devices/robb.js
CHANGED
|
@@ -195,7 +195,7 @@ module.exports = [
|
|
|
195
195
|
whiteLabel: [{vendor: 'Sunricher', model: 'SR-ZG2835'}],
|
|
196
196
|
},
|
|
197
197
|
{
|
|
198
|
-
zigbeeModel: ['ROB_200-017-0'],
|
|
198
|
+
zigbeeModel: ['ROB_200-017-0', 'HK-PLUG-A'],
|
|
199
199
|
model: 'ROB_200-017-0',
|
|
200
200
|
vendor: 'ROBB',
|
|
201
201
|
description: 'Zigbee smart plug',
|
package/devices/sunricher.js
CHANGED
|
@@ -2,9 +2,11 @@ const exposes = require('../lib/exposes');
|
|
|
2
2
|
const fz = {...require('../converters/fromZigbee'), legacy: require('../lib/legacy').fromZigbee};
|
|
3
3
|
const tz = require('../converters/toZigbee');
|
|
4
4
|
const reporting = require('../lib/reporting');
|
|
5
|
+
const constants = require('../lib/constants');
|
|
5
6
|
const extend = require('../lib/extend');
|
|
6
7
|
const utils = require('../lib/utils');
|
|
7
8
|
const e = exposes.presets;
|
|
9
|
+
const ea = exposes.access;
|
|
8
10
|
|
|
9
11
|
const fzLocal = {
|
|
10
12
|
sunricher_SRZGP2801K45C: {
|
|
@@ -344,4 +346,190 @@ module.exports = [
|
|
|
344
346
|
exposes: [e.action(['press_on', 'press_off', 'press_high', 'press_low', 'hold_high', 'hold_low', 'high_low_release',
|
|
345
347
|
'cw_ww_release', 'cw_dec_ww_inc', 'ww_inc_cw_dec', 'r_g_b', 'b_g_r', 'rgb_release'])],
|
|
346
348
|
},
|
|
349
|
+
{
|
|
350
|
+
zigbeeModel: ['ZG9092'],
|
|
351
|
+
model: 'SR-ZG9092A',
|
|
352
|
+
vendor: 'Sunricher',
|
|
353
|
+
description: 'Touch thermostat',
|
|
354
|
+
fromZigbee: [fz.thermostat, fz.namron_thermostat, fz.metering, fz.electrical_measurement],
|
|
355
|
+
toZigbee: [tz.thermostat_occupied_heating_setpoint, tz.thermostat_unoccupied_heating_setpoint, tz.thermostat_occupancy,
|
|
356
|
+
tz.thermostat_local_temperature_calibration, tz.thermostat_local_temperature, tz.thermostat_outdoor_temperature,
|
|
357
|
+
tz.thermostat_system_mode, tz.thermostat_control_sequence_of_operation, tz.thermostat_running_state,
|
|
358
|
+
tz.namron_thermostat],
|
|
359
|
+
exposes: [
|
|
360
|
+
e.local_temperature(),
|
|
361
|
+
exposes.numeric('outdoor_temperature', ea.STATE_GET).withUnit('°C')
|
|
362
|
+
.withDescription('Current temperature measured from the floor sensor'),
|
|
363
|
+
exposes.climate()
|
|
364
|
+
.withSetpoint('occupied_heating_setpoint', 0, 40, 0.1)
|
|
365
|
+
.withSetpoint('unoccupied_heating_setpoint', 0, 40, 0.1)
|
|
366
|
+
.withLocalTemperature()
|
|
367
|
+
.withLocalTemperatureCalibration(-3, 3, 0.1)
|
|
368
|
+
.withSystemMode(['off', 'auto', 'heat'])
|
|
369
|
+
.withRunningState(['idle', 'heat']),
|
|
370
|
+
exposes.binary('away_mode', ea.ALL, 'ON', 'OFF')
|
|
371
|
+
.withDescription('Enable/disable away mode'),
|
|
372
|
+
e.power(), e.current(), e.voltage(), e.energy(),
|
|
373
|
+
exposes.enum('button_vibration_level', ea.ALL, ['off', 'low', 'high'])
|
|
374
|
+
.withDescription('Key beep volume and vibration level. Default: Low.'),
|
|
375
|
+
exposes.enum('floor_sensor_type', ea.ALL, ['10k', '15k', '50k', '100k', '12k'])
|
|
376
|
+
.withDescription('Type of the external floor sensor. Default: NTC 10K/25.'),
|
|
377
|
+
exposes.enum('sensor', ea.ALL, ['air', 'floor', 'both'])
|
|
378
|
+
.withDescription('The sensor used for heat control. Default: Room Sensor.'),
|
|
379
|
+
exposes.enum('powerup_status', ea.ALL, ['default', 'last_status'])
|
|
380
|
+
.withDescription('The mode after a power reset. Default: Previous Mode.'),
|
|
381
|
+
exposes.numeric('floor_sensor_calibration', ea.ALL)
|
|
382
|
+
.withUnit('°C')
|
|
383
|
+
.withValueMin(-3).withValueMax(3).withValueStep(0.1)
|
|
384
|
+
.withDescription('The tempearatue calibration for the exernal floor sensor, between -3 and 3 in 0.1°C. Default: 0.'),
|
|
385
|
+
exposes.numeric('dry_time', ea.ALL)
|
|
386
|
+
.withUnit('min')
|
|
387
|
+
.withValueMin(5).withValueMax(100)
|
|
388
|
+
.withDescription('The duration of Dry Mode, between 5 and 100 minutes. Default: 5.'),
|
|
389
|
+
exposes.enum('mode_after_dry', ea.ALL, ['off', 'manual', 'auto', 'away'])
|
|
390
|
+
.withDescription('The mode after Dry Mode. Default: Auto.'),
|
|
391
|
+
exposes.enum('temperature_display', ea.ALL, ['room', 'floor'])
|
|
392
|
+
.withDescription('The temperature on the display. Default: Room Temperature.'),
|
|
393
|
+
exposes.numeric('window_open_check', ea.ALL)
|
|
394
|
+
.withUnit('°C')
|
|
395
|
+
.withValueMin(0).withValueMax(8).withValueStep(0.5)
|
|
396
|
+
.withDescription('The threshold to detect window open, between 0.0 and 8.0 in 0.5 °C. Default: 0 (disabled).'),
|
|
397
|
+
exposes.numeric('hysterersis', ea.ALL)
|
|
398
|
+
.withUnit('°C')
|
|
399
|
+
.withValueMin(0.5).withValueMax(2).withValueStep(0.1)
|
|
400
|
+
.withDescription('Hysteresis setting, between 0.5 and 2 in 0.1 °C. Default: 0.5.'),
|
|
401
|
+
exposes.numeric('alarm_airtemp_overvalue', ea.ALL)
|
|
402
|
+
.withUnit('°C')
|
|
403
|
+
.withValueMin(20).withValueMax(60)
|
|
404
|
+
.withDescription('Room temperature alarm threshold, between 20 and 60 in °C. 0 means disabled. Default: 45.'),
|
|
405
|
+
],
|
|
406
|
+
configure: async (device, coordinatorEndpoint, logger) => {
|
|
407
|
+
const endpoint = device.getEndpoint(1);
|
|
408
|
+
const binds = [
|
|
409
|
+
'genBasic', 'genIdentify', 'hvacThermostat', 'seMetering', 'haElectricalMeasurement', 'genAlarms',
|
|
410
|
+
'msOccupancySensing', 'genTime', 'hvacUserInterfaceCfg',
|
|
411
|
+
];
|
|
412
|
+
await reporting.bind(endpoint, coordinatorEndpoint, binds);
|
|
413
|
+
|
|
414
|
+
// standard ZCL attributes
|
|
415
|
+
await reporting.thermostatTemperature(endpoint);
|
|
416
|
+
await reporting.thermostatOccupiedHeatingSetpoint(endpoint);
|
|
417
|
+
await reporting.thermostatUnoccupiedHeatingSetpoint(endpoint);
|
|
418
|
+
|
|
419
|
+
await endpoint.configureReporting('hvacThermostat', [{
|
|
420
|
+
attribute: 'ocupancy',
|
|
421
|
+
minimumReportInterval: 0,
|
|
422
|
+
maximumReportInterval: constants.repInterval.HOUR,
|
|
423
|
+
reportableChange: null,
|
|
424
|
+
}]);
|
|
425
|
+
|
|
426
|
+
await endpoint.read('haElectricalMeasurement', ['acVoltageMultiplier', 'acVoltageDivisor', 'acCurrentMultiplier']);
|
|
427
|
+
await endpoint.read('haElectricalMeasurement', ['acCurrentDivisor']);
|
|
428
|
+
|
|
429
|
+
await reporting.activePower(endpoint);
|
|
430
|
+
await reporting.rmsCurrent(endpoint, {min: 10, change: 10});
|
|
431
|
+
await reporting.rmsVoltage(endpoint, {min: 10});
|
|
432
|
+
await reporting.currentSummDelivered(endpoint);
|
|
433
|
+
|
|
434
|
+
// Custom attributes
|
|
435
|
+
const options = {manufacturerCode: 0x1224}; // Sunricher Manufacturer Code
|
|
436
|
+
|
|
437
|
+
// OperateDisplayLcdBrightnesss - removed as it has no effect
|
|
438
|
+
// ButtonVibrationLevel
|
|
439
|
+
await endpoint.configureReporting('hvacThermostat', [{
|
|
440
|
+
attribute: {ID: 0x1001, type: 0x30},
|
|
441
|
+
minimumReportInterval: 0,
|
|
442
|
+
maximumReportInterval: constants.repInterval.HOUR,
|
|
443
|
+
reportableChange: null}],
|
|
444
|
+
options);
|
|
445
|
+
// FloorSensorType
|
|
446
|
+
await endpoint.configureReporting('hvacThermostat', [{
|
|
447
|
+
attribute: {ID: 0x1002, type: 0x30},
|
|
448
|
+
minimumReportInterval: 0,
|
|
449
|
+
maximumReportInterval: constants.repInterval.HOUR,
|
|
450
|
+
reportableChange: null}],
|
|
451
|
+
options);
|
|
452
|
+
// ControlType
|
|
453
|
+
await endpoint.configureReporting('hvacThermostat', [{
|
|
454
|
+
attribute: {ID: 0x1003, type: 0x30},
|
|
455
|
+
minimumReportInterval: 0,
|
|
456
|
+
maximumReportInterval: constants.repInterval.HOUR,
|
|
457
|
+
reportableChange: null}],
|
|
458
|
+
options);
|
|
459
|
+
// PowerUpStatus
|
|
460
|
+
await endpoint.configureReporting('hvacThermostat', [{
|
|
461
|
+
attribute: {ID: 0x1004, type: 0x30},
|
|
462
|
+
minimumReportInterval: 0,
|
|
463
|
+
maximumReportInterval: constants.repInterval.HOUR,
|
|
464
|
+
reportableChange: null}],
|
|
465
|
+
options);
|
|
466
|
+
// FloorSensorCalibration
|
|
467
|
+
await endpoint.configureReporting('hvacThermostat', [{
|
|
468
|
+
attribute: {ID: 0x1005, type: 0x28},
|
|
469
|
+
minimumReportInterval: 0,
|
|
470
|
+
maximumReportInterval: constants.repInterval.HOUR,
|
|
471
|
+
reportableChange: 0}],
|
|
472
|
+
options);
|
|
473
|
+
// DryTime
|
|
474
|
+
await endpoint.configureReporting('hvacThermostat', [{
|
|
475
|
+
attribute: {ID: 0x1006, type: 0x20},
|
|
476
|
+
minimumReportInterval: 0,
|
|
477
|
+
maximumReportInterval: constants.repInterval.HOUR,
|
|
478
|
+
reportableChange: 0}],
|
|
479
|
+
options);
|
|
480
|
+
// ModeAfterDry
|
|
481
|
+
await endpoint.configureReporting('hvacThermostat', [{
|
|
482
|
+
attribute: {ID: 0x1007, type: 0x30},
|
|
483
|
+
minimumReportInterval: 0,
|
|
484
|
+
maximumReportInterval: constants.repInterval.HOUR,
|
|
485
|
+
reportableChange: null}],
|
|
486
|
+
options);
|
|
487
|
+
// TemperatureDisplay
|
|
488
|
+
await endpoint.configureReporting('hvacThermostat', [{
|
|
489
|
+
attribute: {ID: 0x1008, type: 0x30},
|
|
490
|
+
minimumReportInterval: 0,
|
|
491
|
+
maximumReportInterval: constants.repInterval.HOUR,
|
|
492
|
+
reportableChange: null}],
|
|
493
|
+
options);
|
|
494
|
+
// WindowOpenCheck
|
|
495
|
+
await endpoint.configureReporting('hvacThermostat', [{
|
|
496
|
+
attribute: {ID: 0x1009, type: 0x20},
|
|
497
|
+
minimumReportInterval: 0,
|
|
498
|
+
maximumReportInterval: constants.repInterval.HOUR,
|
|
499
|
+
reportableChange: 0}],
|
|
500
|
+
options);
|
|
501
|
+
|
|
502
|
+
// Hysterersis
|
|
503
|
+
await endpoint.configureReporting('hvacThermostat', [{
|
|
504
|
+
attribute: {ID: 0x100A, type: 0x20},
|
|
505
|
+
minimumReportInterval: 0,
|
|
506
|
+
maximumReportInterval: constants.repInterval.HOUR,
|
|
507
|
+
reportableChange: 0}],
|
|
508
|
+
options);
|
|
509
|
+
|
|
510
|
+
// AlarmAirTempOverValue
|
|
511
|
+
await endpoint.configureReporting('hvacThermostat', [{
|
|
512
|
+
attribute: {ID: 0x2001, type: 0x20},
|
|
513
|
+
minimumReportInterval: 0,
|
|
514
|
+
maximumReportInterval: constants.repInterval.HOUR,
|
|
515
|
+
reportableChange: 0}],
|
|
516
|
+
options);
|
|
517
|
+
// Away Mode Set
|
|
518
|
+
await endpoint.configureReporting('hvacThermostat', [{
|
|
519
|
+
attribute: {ID: 0x2002, type: 0x30},
|
|
520
|
+
minimumReportInterval: 0,
|
|
521
|
+
maximumReportInterval: constants.repInterval.HOUR,
|
|
522
|
+
reportableChange: null}],
|
|
523
|
+
options);
|
|
524
|
+
|
|
525
|
+
// Device does not asks for the time with binding, we need to write time during configure
|
|
526
|
+
|
|
527
|
+
// Trigger initial read
|
|
528
|
+
await endpoint.read('hvacThermostat', ['systemMode', 'runningState', 'occupiedHeatingSetpoint']);
|
|
529
|
+
await endpoint.read('hvacThermostat', [0x1001, 0x1002, 0x1003], options);
|
|
530
|
+
await endpoint.read('hvacThermostat', [0x1004, 0x1005, 0x1006, 0x1007], options);
|
|
531
|
+
await endpoint.read('hvacThermostat', [0x1008, 0x1009, 0x100A], options);
|
|
532
|
+
await endpoint.read('hvacThermostat', [0x2001, 0x2002], options);
|
|
533
|
+
},
|
|
534
|
+
},
|
|
347
535
|
];
|
package/devices/tuya.js
CHANGED
|
@@ -908,17 +908,21 @@ module.exports = [
|
|
|
908
908
|
},
|
|
909
909
|
{
|
|
910
910
|
fingerprint: [{modelID: 'TS0215A', manufacturerName: '_TZ3000_4fsgukof'},
|
|
911
|
-
{modelID: 'TS0215A', manufacturerName: '_TZ3000_wr2ucaj9'}
|
|
911
|
+
{modelID: 'TS0215A', manufacturerName: '_TZ3000_wr2ucaj9'},
|
|
912
|
+
{modelID: 'TS0215A', manufacturerName: '_TZ3000_tj4pwzzm'}],
|
|
912
913
|
model: 'TS0215A_sos',
|
|
913
914
|
vendor: 'TuYa',
|
|
914
915
|
description: 'SOS button',
|
|
915
916
|
fromZigbee: [fz.command_emergency, fz.battery],
|
|
916
917
|
exposes: [e.battery(), e.action(['emergency'])],
|
|
917
918
|
toZigbee: [],
|
|
919
|
+
configure: async (device, coordinatorEndpoint, logger) => {
|
|
920
|
+
const endpoint = device.getEndpoint(1);
|
|
921
|
+
await reporting.bind(endpoint, coordinatorEndpoint, ['genPowerCfg', 'genTime', 'genBasic', 'ssIasAce', 'ssIasZone']);
|
|
922
|
+
},
|
|
918
923
|
},
|
|
919
924
|
{
|
|
920
925
|
fingerprint: [{modelID: 'TS0215A', manufacturerName: '_TZ3000_p6ju8myv'},
|
|
921
|
-
{modelID: 'TS0215A', manufacturerName: '_TZ3000_tj4pwzzm'},
|
|
922
926
|
{modelID: 'TS0215A', manufacturerName: '_TZ3000_fsiepnrh'}],
|
|
923
927
|
model: 'TS0215A_remote',
|
|
924
928
|
vendor: 'TuYa',
|
|
@@ -977,6 +981,7 @@ module.exports = [
|
|
|
977
981
|
{modelID: 'TS0502B', manufacturerName: '_TZ3210_2p6wbry3'},
|
|
978
982
|
{modelID: 'TS0502B', manufacturerName: '_TZ3210_qamcypen'},
|
|
979
983
|
{modelID: 'TS0502B', manufacturerName: '_TZ3210_zdrhqmo0'},
|
|
984
|
+
{modelID: 'TS0502B', manufacturerName: '_TZ3210_2cjfbpy0'},
|
|
980
985
|
],
|
|
981
986
|
model: 'TS0502B',
|
|
982
987
|
vendor: 'TuYa',
|
|
@@ -2516,7 +2521,7 @@ module.exports = [
|
|
|
2516
2521
|
},
|
|
2517
2522
|
{
|
|
2518
2523
|
fingerprint: [{modelID: 'TS004F', manufacturerName: '_TZ3000_4fjiwweb'}, {modelID: 'TS004F', manufacturerName: '_TZ3000_uri7ongn'},
|
|
2519
|
-
{modelID: 'TS004F', manufacturerName: '_TZ3000_ixla93vd'}],
|
|
2524
|
+
{modelID: 'TS004F', manufacturerName: '_TZ3000_ixla93vd'}, {modelID: 'TS004F', manufacturerName: '_TZ3000_qja6nq5z'}],
|
|
2520
2525
|
model: 'ERS-10TZBVK-AA',
|
|
2521
2526
|
vendor: 'TuYa',
|
|
2522
2527
|
description: 'Smart knob',
|
package/devices/xiaomi.js
CHANGED
|
@@ -40,6 +40,21 @@ const preventReset = async (type, data, device) => {
|
|
|
40
40
|
};
|
|
41
41
|
|
|
42
42
|
module.exports = [
|
|
43
|
+
{
|
|
44
|
+
zigbeeModel: ['lumi.flood.acn001'],
|
|
45
|
+
model: 'SJCGQ13LM',
|
|
46
|
+
vendor: 'Xiaomi',
|
|
47
|
+
description: 'Aqara E1 water leak sensor',
|
|
48
|
+
fromZigbee: [fz.ias_water_leak_alarm_1, fz.aqara_opple, fz.battery],
|
|
49
|
+
toZigbee: [],
|
|
50
|
+
exposes: [e.water_leak(), e.battery(), e.battery_low(), e.battery_voltage(), e.device_temperature(), e.power_outage_count(false)],
|
|
51
|
+
meta: {battery: {voltageToPercentage: '3V_2850_3200'}},
|
|
52
|
+
configure: async (device, coordinatorEndpoint, logger) => {
|
|
53
|
+
const endpoint = device.getEndpoint(1);
|
|
54
|
+
await endpoint.read('genPowerCfg', ['batteryVoltage']);
|
|
55
|
+
},
|
|
56
|
+
ota: ota.zigbeeOTA,
|
|
57
|
+
},
|
|
43
58
|
{
|
|
44
59
|
zigbeeModel: ['lumi.magnet.acn001'],
|
|
45
60
|
model: 'MCCGQ14LM',
|
|
@@ -1313,7 +1328,7 @@ module.exports = [
|
|
|
1313
1328
|
'the normal monitoring state, the green indicator light flashes every 60 seconds'),
|
|
1314
1329
|
exposes.binary('linkage_alarm', ea.ALL, true, false).withDescription('When this option is enabled and a smoke ' +
|
|
1315
1330
|
'is detected, other detectors with this option enabled will also sound the alarm buzzer'),
|
|
1316
|
-
e.
|
|
1331
|
+
e.battery(), e.battery_voltage(), e.power_outage_count(false)],
|
|
1317
1332
|
meta: {battery: {voltageToPercentage: '3V_2850_3200'}},
|
|
1318
1333
|
configure: async (device, coordinatorEndpoint, logger) => {
|
|
1319
1334
|
const endpoint = device.getEndpoint(1);
|
package/lib/exposes.js
CHANGED
|
@@ -372,7 +372,7 @@ class Climate extends Base {
|
|
|
372
372
|
|
|
373
373
|
withSetpoint(property, min, max, step, access=a.ALL) {
|
|
374
374
|
assert(!this.endpoint, 'Cannot add feature after adding endpoint');
|
|
375
|
-
assert(['occupied_heating_setpoint', 'current_heating_setpoint', 'occupied_cooling_setpoint'].includes(property));
|
|
375
|
+
assert(['occupied_heating_setpoint', 'current_heating_setpoint', 'occupied_cooling_setpoint', 'unoccupied_heating_setpoint', 'unoccupied_cooling_setpoint'].includes(property));
|
|
376
376
|
this.features.push(new Numeric(property, access)
|
|
377
377
|
.withValueMin(min).withValueMax(max).withValueStep(step).withUnit('°C').withDescription('Temperature setpoint'));
|
|
378
378
|
return this;
|
package/lib/xiaomi.js
CHANGED
|
@@ -158,10 +158,11 @@ const numericAttributes2Payload = (msg, meta, model, options, dataObject) => {
|
|
|
158
158
|
}
|
|
159
159
|
break;
|
|
160
160
|
case '3':
|
|
161
|
-
if (['WXCJKG11LM', 'WXCJKG12LM', 'WXCJKG13LM', 'MCCGQ14LM', 'GZCGQ01LM'].includes(model.model)) {
|
|
161
|
+
if (['WXCJKG11LM', 'WXCJKG12LM', 'WXCJKG13LM', 'MCCGQ14LM', 'GZCGQ01LM', 'JY-GZ-01AQ'].includes(model.model)) {
|
|
162
162
|
// The temperature value is constant 25 °C and does not change, so we ignore it
|
|
163
163
|
// https://github.com/Koenkk/zigbee2mqtt/issues/11126
|
|
164
164
|
// https://github.com/Koenkk/zigbee-herdsman-converters/pull/3585
|
|
165
|
+
// https://github.com/Koenkk/zigbee2mqtt/issues/13253
|
|
165
166
|
} else {
|
|
166
167
|
payload.device_temperature = calibrateAndPrecisionRoundOptions(value, options, 'device_temperature'); // 0x03
|
|
167
168
|
}
|
|
@@ -190,10 +191,7 @@ const numericAttributes2Payload = (msg, meta, model, options, dataObject) => {
|
|
|
190
191
|
}
|
|
191
192
|
break;
|
|
192
193
|
case '11':
|
|
193
|
-
if (['
|
|
194
|
-
// We don't know what the value means for these devices.
|
|
195
|
-
// https://github.com/Koenkk/zigbee2mqtt/issues/12451
|
|
196
|
-
} else {
|
|
194
|
+
if (['RTCGQ11LM'].includes(model.model)) {
|
|
197
195
|
payload.illuminance = calibrateAndPrecisionRoundOptions(value, options, 'illuminance');
|
|
198
196
|
// DEPRECATED: remove illuminance_lux here.
|
|
199
197
|
payload.illuminance_lux = calibrateAndPrecisionRoundOptions(value, options, 'illuminance_lux');
|
|
@@ -240,6 +238,8 @@ const numericAttributes2Payload = (msg, meta, model, options, dataObject) => {
|
|
|
240
238
|
} else if (['SJCGQ11LM'].includes(model.model)) {
|
|
241
239
|
// Ignore the message. It seems not reliable. See discussion here https://github.com/Koenkk/zigbee2mqtt/issues/12018
|
|
242
240
|
// payload.water_leak = value === 1;
|
|
241
|
+
} else if (['SJCGQ13LM'].includes(model.model)) {
|
|
242
|
+
payload.water_leak = value === 1;
|
|
243
243
|
} else if (['JTYJ-GD-01LM/BW'].includes(model.model)) {
|
|
244
244
|
payload.smoke_density = value;
|
|
245
245
|
} else if (['GZCGQ01LM'].includes(model.model)) {
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "zigbee-herdsman-converters",
|
|
3
|
-
"version": "14.0.
|
|
3
|
+
"version": "14.0.579",
|
|
4
4
|
"description": "Collection of device converters to be used with zigbee-herdsman",
|
|
5
5
|
"main": "index.js",
|
|
6
6
|
"files": [
|
|
@@ -38,7 +38,7 @@
|
|
|
38
38
|
"buffer-crc32": "^0.2.13",
|
|
39
39
|
"https-proxy-agent": "^5.0.1",
|
|
40
40
|
"tar-stream": "^2.2.0",
|
|
41
|
-
"zigbee-herdsman": "^0.14.
|
|
41
|
+
"zigbee-herdsman": "^0.14.46"
|
|
42
42
|
},
|
|
43
43
|
"devDependencies": {
|
|
44
44
|
"eslint": "*",
|