zigbee-herdsman-converters 14.0.575 → 14.0.578
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/dresden_elektronik.js +8 -0
- package/devices/heiman.js +17 -0
- package/devices/kurvia.js +21 -0
- package/devices/led_trading.js +36 -0
- package/devices/miboxer.js +16 -0
- package/devices/osram.js +1 -1
- package/devices/rademacher.js +7 -0
- package/devices/robb.js +1 -1
- package/devices/sunricher.js +188 -0
- package/devices/tuya.js +19 -1
- package/devices/xiaomi.js +1 -1
- package/lib/exposes.js +1 -1
- package/lib/ota/ubisys.js +2 -2
- package/lib/reporting.js +4 -0
- package/lib/xiaomi.js +2 -1
- 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};
|
|
@@ -23,4 +23,12 @@ module.exports = [
|
|
|
23
23
|
description: 'ZigBee Light Link wireless electronic ballast color temperature',
|
|
24
24
|
extend: extend.light_onoff_brightness_colortemp(),
|
|
25
25
|
},
|
|
26
|
+
{
|
|
27
|
+
zigbeeModel: ['Kobold'],
|
|
28
|
+
model: 'BN-600110',
|
|
29
|
+
vendor: 'Dresden Elektronik',
|
|
30
|
+
description: 'Zigbee 3.0 dimm actuator',
|
|
31
|
+
extend: extend.light_onoff_brightness(),
|
|
32
|
+
ota: ota.zigbeeOTA,
|
|
33
|
+
},
|
|
26
34
|
];
|
package/devices/heiman.js
CHANGED
|
@@ -699,4 +699,21 @@ module.exports = [
|
|
|
699
699
|
},
|
|
700
700
|
exposes: [e.battery(), e.action(['pressed']), e.battery_low(), e.tamper()],
|
|
701
701
|
},
|
|
702
|
+
{
|
|
703
|
+
zigbeeModel: ['HS3AQ-EFA-3.0'],
|
|
704
|
+
model: 'HS3AQ',
|
|
705
|
+
vendor: 'HEIMAN',
|
|
706
|
+
description: 'Smart air quality monitor',
|
|
707
|
+
fromZigbee: [fz.co2, fz.humidity, fz.battery, fz.temperature],
|
|
708
|
+
toZigbee: [],
|
|
709
|
+
configure: async (device, coordinatorEndpoint, logger) => {
|
|
710
|
+
const endpoint = device.getEndpoint(1);
|
|
711
|
+
await reporting.bind(endpoint, coordinatorEndpoint, ['msRelativeHumidity', 'genPowerCfg', 'msTemperatureMeasurement', 'msCO2']);
|
|
712
|
+
await reporting.batteryPercentageRemaining(endpoint);
|
|
713
|
+
await reporting.temperature(endpoint, {min: 1, max: constants.repInterval.MINUTES_5, change: 10}); // 0.1 degree change
|
|
714
|
+
await reporting.humidity(endpoint, {min: 1, max: constants.repInterval.MINUTES_5, change: 10}); // 0.1 % change
|
|
715
|
+
await reporting.co2(endpoint, {min: 5, max: constants.repInterval.MINUTES_5, change: 0.00005}); // 50 ppm change
|
|
716
|
+
},
|
|
717
|
+
exposes: [e.co2(), e.battery(), e.humidity(), e.temperature()],
|
|
718
|
+
},
|
|
702
719
|
];
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
const tz = require('../converters/toZigbee');
|
|
2
|
+
const exposes = require('../lib/exposes');
|
|
3
|
+
const extend = require('../lib/extend');
|
|
4
|
+
const e = exposes.presets;
|
|
5
|
+
|
|
6
|
+
const extendData = extend.light_onoff_brightness_colortemp_color({colorTempRange: [250, 454]});
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
module.exports = [
|
|
10
|
+
{
|
|
11
|
+
zigbeeModel: ['ZB-CL01'],
|
|
12
|
+
model: 'ZB-CL01',
|
|
13
|
+
vendor: 'KURVIA',
|
|
14
|
+
description: 'GU10 GRBWC built from AliExpress',
|
|
15
|
+
exposes: extendData.exposes.concat(e.power_on_behavior()),
|
|
16
|
+
toZigbee: [tz.on_off].concat(extendData.toZigbee),
|
|
17
|
+
fromZigbee: extendData.fromZigbee,
|
|
18
|
+
meta: {applyRedFix: true, enhancedHue: false},
|
|
19
|
+
},
|
|
20
|
+
];
|
|
21
|
+
|
package/devices/led_trading.js
CHANGED
|
@@ -21,6 +21,31 @@ const fzLocal = {
|
|
|
21
21
|
}
|
|
22
22
|
},
|
|
23
23
|
},
|
|
24
|
+
led_trading_9125: {
|
|
25
|
+
cluster: 'greenPower',
|
|
26
|
+
type: ['commandNotification', 'commandCommisioningNotification'],
|
|
27
|
+
convert: (model, msg, publish, options, meta) => {
|
|
28
|
+
const commandID = msg.data.commandID;
|
|
29
|
+
if (utils.hasAlreadyProcessedMessage(msg, msg.data.frameCounter, `${msg.device.ieeeAddr}_${commandID}`)) return;
|
|
30
|
+
if (commandID === 104) return; // Skip commisioning command.
|
|
31
|
+
|
|
32
|
+
// Button 1: A0 (top left)
|
|
33
|
+
// Button 2: A1 (bottom left)
|
|
34
|
+
// Button 3: B0 (top right)
|
|
35
|
+
// Button 4: B1 (bottom right)
|
|
36
|
+
const lookup = {
|
|
37
|
+
0x10: 'press_1', 0x14: 'release_1', 0x11: 'press_2', 0x15: 'release_2', 0x13: 'press_3', 0x17: 'release_3',
|
|
38
|
+
0x12: 'press_4', 0x16: 'release_4', 0x64: 'press_1_and_3', 0x65: 'release_1_and_3', 0x62: 'press_2_and_4',
|
|
39
|
+
0x63: 'release_2_and_4',
|
|
40
|
+
};
|
|
41
|
+
|
|
42
|
+
if (!lookup.hasOwnProperty(commandID)) {
|
|
43
|
+
meta.logger.error(`LED Trading 9125: missing command '${commandID}'`);
|
|
44
|
+
} else {
|
|
45
|
+
return {action: lookup[commandID]};
|
|
46
|
+
}
|
|
47
|
+
},
|
|
48
|
+
},
|
|
24
49
|
};
|
|
25
50
|
|
|
26
51
|
module.exports = [
|
|
@@ -66,4 +91,15 @@ module.exports = [
|
|
|
66
91
|
await reporting.bind(device.getEndpoint(5), coordinatorEndpoint, ['genOnOff']);
|
|
67
92
|
},
|
|
68
93
|
},
|
|
94
|
+
{
|
|
95
|
+
fingerprint: [{modelID: 'GreenPower_2', ieeeAddr: /^0x00000000017.....$/, manufId: null}],
|
|
96
|
+
model: '9125',
|
|
97
|
+
vendor: 'LED Trading',
|
|
98
|
+
description: 'FOH smart switch',
|
|
99
|
+
whiteLabel: [{vendor: 'Sunricher', model: 'SR-ZGP2801K4-FOH-E'}],
|
|
100
|
+
fromZigbee: [fzLocal.led_trading_9125],
|
|
101
|
+
toZigbee: [],
|
|
102
|
+
exposes: [e.action(['press_1', 'release_1', 'press_2', 'release_2', 'press_3', 'release_3', 'press_4', 'release_4',
|
|
103
|
+
'press_1_and_3', 'release_1_and_3', 'press_2_and_4', 'release_2_and_4'])],
|
|
104
|
+
},
|
|
69
105
|
];
|
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/osram.js
CHANGED
|
@@ -83,7 +83,7 @@ module.exports = [
|
|
|
83
83
|
model: 'AC03642',
|
|
84
84
|
vendor: 'OSRAM',
|
|
85
85
|
description: 'SMART+ CLASSIC A 60 TW',
|
|
86
|
-
extend: extend.ledvance.light_onoff_brightness_colortemp(),
|
|
86
|
+
extend: extend.ledvance.light_onoff_brightness_colortemp({colorTempRange: [153, 370]}),
|
|
87
87
|
ota: ota.ledvance,
|
|
88
88
|
},
|
|
89
89
|
{
|
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
|
@@ -916,6 +916,10 @@ module.exports = [
|
|
|
916
916
|
fromZigbee: [fz.command_emergency, fz.battery],
|
|
917
917
|
exposes: [e.battery(), e.action(['emergency'])],
|
|
918
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
|
+
},
|
|
919
923
|
},
|
|
920
924
|
{
|
|
921
925
|
fingerprint: [{modelID: 'TS0215A', manufacturerName: '_TZ3000_p6ju8myv'},
|
|
@@ -1026,7 +1030,6 @@ module.exports = [
|
|
|
1026
1030
|
fingerprint: [
|
|
1027
1031
|
{modelID: 'TS0201', manufacturerName: '_TZ3000_bguser20'},
|
|
1028
1032
|
{modelID: 'TS0201', manufacturerName: '_TZ3000_fllyghyj'},
|
|
1029
|
-
{modelID: 'TS0201', manufacturerName: '_TZ3000_dowj6gyi'},
|
|
1030
1033
|
{modelID: 'TS0201', manufacturerName: '_TZ3000_yd2e749y'},
|
|
1031
1034
|
{modelID: 'TS0201', manufacturerName: '_TZ3000_6uzkisv2'},
|
|
1032
1035
|
],
|
|
@@ -1041,6 +1044,21 @@ module.exports = [
|
|
|
1041
1044
|
await endpoint.read('genBasic', ['manufacturerName', 'zclVersion', 'appVersion', 'modelId', 'powerSource', 0xfffe]);
|
|
1042
1045
|
},
|
|
1043
1046
|
},
|
|
1047
|
+
{
|
|
1048
|
+
fingerprint: [
|
|
1049
|
+
{modelID: 'TS0201', manufacturerName: '_TZ3000_dowj6gyi'},
|
|
1050
|
+
],
|
|
1051
|
+
model: 'IH-K009',
|
|
1052
|
+
vendor: 'TuYa',
|
|
1053
|
+
description: 'Temperature & humidity sensor',
|
|
1054
|
+
fromZigbee: [fzLocal.TS0201_battery, fz.temperature, fz.humidity],
|
|
1055
|
+
toZigbee: [],
|
|
1056
|
+
exposes: [e.battery(), e.temperature(), e.humidity(), e.battery_voltage()],
|
|
1057
|
+
configure: async (device, coordinatorEndpoint, logger) => {
|
|
1058
|
+
const endpoint = device.getEndpoint(1);
|
|
1059
|
+
await endpoint.read('genBasic', ['manufacturerName', 'zclVersion', 'appVersion', 'modelId', 'powerSource', 0xfffe]);
|
|
1060
|
+
},
|
|
1061
|
+
},
|
|
1044
1062
|
{
|
|
1045
1063
|
fingerprint: [{modelID: 'SM0201', manufacturerName: '_TYZB01_cbiezpds'}],
|
|
1046
1064
|
model: 'SM0201',
|
package/devices/xiaomi.js
CHANGED
|
@@ -1313,7 +1313,7 @@ module.exports = [
|
|
|
1313
1313
|
'the normal monitoring state, the green indicator light flashes every 60 seconds'),
|
|
1314
1314
|
exposes.binary('linkage_alarm', ea.ALL, true, false).withDescription('When this option is enabled and a smoke ' +
|
|
1315
1315
|
'is detected, other detectors with this option enabled will also sound the alarm buzzer'),
|
|
1316
|
-
e.
|
|
1316
|
+
e.battery(), e.battery_voltage(), e.power_outage_count(false)],
|
|
1317
1317
|
meta: {battery: {voltageToPercentage: '3V_2850_3200'}},
|
|
1318
1318
|
configure: async (device, coordinatorEndpoint, logger) => {
|
|
1319
1319
|
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/ota/ubisys.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
const firmwareHtmlPageUrl = '
|
|
2
|
-
const imageRegex = /
|
|
1
|
+
const firmwareHtmlPageUrl = 'http://fwu.ubisys.de/smarthome/OTA/release/index';
|
|
2
|
+
const imageRegex = /10F2-([0-9a-f]{4})-([0-9a-f]{4})-([0-9a-f]{4})-([0-9a-f]{8})\S*ota1?\.zigbee/gi;
|
|
3
3
|
const assert = require('assert');
|
|
4
4
|
const url = require('url');
|
|
5
5
|
const common = require('./common');
|
package/lib/reporting.js
CHANGED
|
@@ -94,6 +94,10 @@ module.exports = {
|
|
|
94
94
|
const p = payload('measuredValue', 10, repInterval.HOUR, 100, overrides);
|
|
95
95
|
await endpoint.configureReporting('msTemperatureMeasurement', p);
|
|
96
96
|
},
|
|
97
|
+
co2: async (endpoint, overrides) => {
|
|
98
|
+
const p = payload('measuredValue', 10, repInterval.HOUR, 1, overrides);
|
|
99
|
+
await endpoint.configureReporting('msCO2', p);
|
|
100
|
+
},
|
|
97
101
|
deviceTemperature: async (endpoint, overrides) => {
|
|
98
102
|
const p = payload('currentTemperature', 300, repInterval.HOUR, 1, overrides);
|
|
99
103
|
await endpoint.configureReporting('genDeviceTempCfg', p);
|
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
|
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "zigbee-herdsman-converters",
|
|
3
|
-
"version": "14.0.
|
|
3
|
+
"version": "14.0.578",
|
|
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": "*",
|