zigbee-herdsman-converters 14.0.642 → 14.0.644
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 -2
- package/converters/toZigbee.js +1 -1
- package/devices/adurosmart.js +7 -0
- package/devices/awox.js +1 -0
- package/devices/develco.js +12 -11
- package/devices/fantem.js +3 -2
- package/devices/heiman.js +2 -2
- package/devices/lidl.js +2 -1
- package/devices/lixee.js +3 -3
- package/devices/lonsonho.js +1 -1
- package/devices/mecrator.js +1 -1
- package/devices/moes.js +0 -13
- package/devices/philips.js +21 -0
- package/devices/sercomm.js +17 -0
- package/devices/sunricher.js +52 -9
- package/devices/tuya.js +24 -11
- package/devices/villeroy_boch.js +8 -1
- package/lib/exposes.js +1 -0
- package/package.json +2 -2
- package/devices/lerlink.js +0 -19
package/converters/fromZigbee.js
CHANGED
|
@@ -1760,8 +1760,7 @@ const converters = {
|
|
|
1760
1760
|
result.hysterersis = precisionRound(data[0x100A], 2) / 10;
|
|
1761
1761
|
}
|
|
1762
1762
|
if (data.hasOwnProperty(0x100B)) { // DisplayAutoOffEnable
|
|
1763
|
-
|
|
1764
|
-
result.display_auto_off_enabled = lookup[data[0x100B]];
|
|
1763
|
+
result.display_auto_off_enabled = data[0x100B] ? 'enabled' : 'disabled';
|
|
1765
1764
|
}
|
|
1766
1765
|
if (data.hasOwnProperty(0x2001)) { // AlarmAirTempOverValue
|
|
1767
1766
|
result.alarm_airtemp_overvalue = data[0x2001];
|
package/converters/toZigbee.js
CHANGED
|
@@ -3182,7 +3182,7 @@ const converters = {
|
|
|
3182
3182
|
const payload = {0x100A: {value: value * 10, type: 0x20}};
|
|
3183
3183
|
await entity.write('hvacThermostat', payload, manufacturerOptions.sunricher);
|
|
3184
3184
|
} else if (key==='display_auto_off_enabled') {
|
|
3185
|
-
const lookup = {'
|
|
3185
|
+
const lookup = {'disabled': 0, 'enabled': 1};
|
|
3186
3186
|
const payload = {0x100B: {value: lookup[value], type: herdsman.Zcl.DataType.enum8}};
|
|
3187
3187
|
await entity.write('hvacThermostat', payload, manufacturerOptions.sunricher);
|
|
3188
3188
|
} else if (key==='alarm_airtemp_overvalue') {
|
package/devices/adurosmart.js
CHANGED
|
@@ -59,6 +59,13 @@ module.exports = [
|
|
|
59
59
|
description: 'ERIA E14 Candle Color',
|
|
60
60
|
extend: extend.light_onoff_brightness_colortemp_color({colorTempRange: [153, 500]}),
|
|
61
61
|
},
|
|
62
|
+
{
|
|
63
|
+
zigbeeModel: ['AD-DimmableLight3001'],
|
|
64
|
+
model: '81810',
|
|
65
|
+
vendor: 'AduroSmart',
|
|
66
|
+
description: 'Zigbee Aduro Eria B22 bulb - warm white',
|
|
67
|
+
extend: extend.light_onoff_brightness(),
|
|
68
|
+
},
|
|
62
69
|
{
|
|
63
70
|
zigbeeModel: ['Adurolight_NCC'],
|
|
64
71
|
model: '81825',
|
package/devices/awox.js
CHANGED
package/devices/develco.js
CHANGED
|
@@ -91,14 +91,14 @@ const develco = {
|
|
|
91
91
|
type: ['attributeReport', 'readResponse'],
|
|
92
92
|
convert: (model, msg, publish, options, meta) => {
|
|
93
93
|
const result = {};
|
|
94
|
-
if (
|
|
95
|
-
const firmware = msg.data
|
|
94
|
+
if (msg.data.hasOwnProperty('develcoPrimarySwVersion')) {
|
|
95
|
+
const firmware = msg.data.develcoPrimarySwVersion.join('.');
|
|
96
96
|
result.current_firmware = firmware;
|
|
97
97
|
meta.device.softwareBuildID = firmware;
|
|
98
98
|
}
|
|
99
99
|
|
|
100
|
-
if (
|
|
101
|
-
meta.device.hardwareVersion = msg.data
|
|
100
|
+
if (msg.data.hasOwnProperty('develcoPrimaryHwVersion')) {
|
|
101
|
+
meta.device.hardwareVersion = msg.data.develcoPrimaryHwVersion.join('.');
|
|
102
102
|
}
|
|
103
103
|
|
|
104
104
|
return result;
|
|
@@ -218,7 +218,7 @@ const develco = {
|
|
|
218
218
|
key: ['interface_mode'],
|
|
219
219
|
convertSet: async (entity, key, value, meta) => {
|
|
220
220
|
const payload = {'develcoInterfaceMode': utils.getKey(constants.develcoInterfaceMode, value, undefined, Number)};
|
|
221
|
-
await entity.write('seMetering', payload, manufacturerOptions
|
|
221
|
+
await entity.write('seMetering', payload, manufacturerOptions);
|
|
222
222
|
return {readAfterWriteTime: 200, state: {'interface_mode': value}};
|
|
223
223
|
},
|
|
224
224
|
convertGet: async (entity, key, meta) => {
|
|
@@ -379,7 +379,7 @@ module.exports = [
|
|
|
379
379
|
ota: ota.zigbeeOTA,
|
|
380
380
|
configure: async (device, coordinatorEndpoint, logger) => {
|
|
381
381
|
const endpoint = device.getEndpoint(2);
|
|
382
|
-
await endpoint.read('genBasic', [
|
|
382
|
+
await endpoint.read('genBasic', ['develcoPrimarySwVersion', 'develcoPrimaryHwVersion'], manufacturerOptions);
|
|
383
383
|
await reporting.bind(endpoint, coordinatorEndpoint, ['haElectricalMeasurement', 'seMetering']);
|
|
384
384
|
|
|
385
385
|
try {
|
|
@@ -424,7 +424,7 @@ module.exports = [
|
|
|
424
424
|
|
|
425
425
|
await reporting.bind(endpoint, coordinatorEndpoint, ['genPowerCfg', 'ssIasZone', 'ssIasWd', 'genBasic', 'genBinaryInput']);
|
|
426
426
|
await reporting.batteryVoltage(endpoint);
|
|
427
|
-
await endpoint.read('genBasic', [
|
|
427
|
+
await endpoint.read('genBasic', ['develcoPrimarySwVersion', 'develcoPrimaryHwVersion'], manufacturerOptions);
|
|
428
428
|
await endpoint.read('ssIasZone', ['iasCieAddr', 'zoneState', 'zoneId']);
|
|
429
429
|
await endpoint.read('genBinaryInput', ['reliability', 'statusFlags']);
|
|
430
430
|
await endpoint.read('ssIasWd', ['maxDuration']);
|
|
@@ -457,7 +457,7 @@ module.exports = [
|
|
|
457
457
|
|
|
458
458
|
await reporting.bind(endpoint, coordinatorEndpoint, ['genPowerCfg', 'ssIasZone', 'ssIasWd', 'genBasic', 'genBinaryInput']);
|
|
459
459
|
await reporting.batteryVoltage(endpoint);
|
|
460
|
-
await endpoint.read('genBasic', [
|
|
460
|
+
await endpoint.read('genBasic', ['develcoPrimarySwVersion'], manufacturerOptions);
|
|
461
461
|
await endpoint.read('ssIasZone', ['iasCieAddr', 'zoneState', 'zoneId']);
|
|
462
462
|
await endpoint.read('genBinaryInput', ['reliability', 'statusFlags']);
|
|
463
463
|
await endpoint.read('ssIasWd', ['maxDuration']);
|
|
@@ -519,7 +519,7 @@ module.exports = [
|
|
|
519
519
|
description: 'Motion sensor',
|
|
520
520
|
fromZigbee: [
|
|
521
521
|
fz.temperature, fz.illuminance, fz.ias_occupancy_alarm_1, fz.battery,
|
|
522
|
-
develco.fz.led_control, develco.fz.ias_occupancy_timeout,
|
|
522
|
+
develco.fz.led_control, develco.fz.ias_occupancy_timeout, develco.fz.firmware_version,
|
|
523
523
|
],
|
|
524
524
|
toZigbee: [develco.tz.led_control, develco.tz.ias_occupancy_timeout],
|
|
525
525
|
exposes: [
|
|
@@ -538,6 +538,7 @@ module.exports = [
|
|
|
538
538
|
await reporting.bind(endpoint35, coordinatorEndpoint, ['genPowerCfg']);
|
|
539
539
|
await reporting.batteryVoltage(endpoint35, {min: constants.repInterval.HOUR, max: 43200, change: 100});
|
|
540
540
|
try {
|
|
541
|
+
await endpoint35.read('genBasic', ['develcoPrimarySwVersion', 'develcoPrimaryHwVersion'], manufacturerOptions);
|
|
541
542
|
await endpoint35.read('ssIasZone', ['develcoAlarmOffDelay'], manufacturerOptions);
|
|
542
543
|
await endpoint35.read('genBasic', ['develcoLedControl'], manufacturerOptions);
|
|
543
544
|
} catch (error) {/* some reports of timeouts on reading these */}
|
|
@@ -682,7 +683,7 @@ module.exports = [
|
|
|
682
683
|
const endpoint = device.getEndpoint(43);
|
|
683
684
|
await reporting.bind(endpoint, coordinatorEndpoint, ['genPowerCfg', 'ssIasZone', 'ssIasWd', 'genBasic']);
|
|
684
685
|
await reporting.batteryVoltage(endpoint);
|
|
685
|
-
await endpoint.read('genBasic', [
|
|
686
|
+
await endpoint.read('genBasic', ['develcoPrimarySwVersion', 'develcoPrimaryHwVersion'], manufacturerOptions);
|
|
686
687
|
await endpoint.read('ssIasZone', ['iasCieAddr', 'zoneState', 'zoneId']);
|
|
687
688
|
await endpoint.read('ssIasWd', ['maxDuration']);
|
|
688
689
|
|
|
@@ -758,7 +759,7 @@ module.exports = [
|
|
|
758
759
|
const ep2 = device.getEndpoint(112);
|
|
759
760
|
await reporting.bind(ep2, coordinatorEndpoint, ['genBinaryInput', 'genBasic']);
|
|
760
761
|
await reporting.presentValue(ep2, {min: 0});
|
|
761
|
-
await ep2.read('genBasic', [
|
|
762
|
+
await ep2.read('genBasic', ['develcoPrimarySwVersion', 'develcoPrimaryHwVersion'], options);
|
|
762
763
|
|
|
763
764
|
const ep3 = device.getEndpoint(113);
|
|
764
765
|
await reporting.bind(ep3, coordinatorEndpoint, ['genBinaryInput']);
|
package/devices/fantem.js
CHANGED
|
@@ -9,10 +9,11 @@ const tuya = require('../lib/tuya');
|
|
|
9
9
|
|
|
10
10
|
module.exports = [
|
|
11
11
|
{
|
|
12
|
-
fingerprint: [{modelID: 'TS110F', manufacturerName: '_TZ3210_lfbz816s'}
|
|
12
|
+
fingerprint: [{modelID: 'TS110F', manufacturerName: '_TZ3210_lfbz816s'},
|
|
13
|
+
{modelID: 'TS110F', manufacturerName: '_TZ3210_ebbfkvoy'}],
|
|
13
14
|
model: 'ZB006-X',
|
|
14
15
|
vendor: 'Fantem',
|
|
15
|
-
description: 'Smart dimmer module
|
|
16
|
+
description: 'Smart dimmer module',
|
|
16
17
|
extend: extend.light_onoff_brightness({noConfigure: true}),
|
|
17
18
|
fromZigbee: [...extend.light_onoff_brightness({noConfigure: true}).fromZigbee,
|
|
18
19
|
fz.command_on, fz.command_off, fz.command_move, fz.command_stop, fz.ZB006X_settings],
|
package/devices/heiman.js
CHANGED
|
@@ -11,7 +11,7 @@ const tuya = require('../lib/tuya');
|
|
|
11
11
|
module.exports = [
|
|
12
12
|
{
|
|
13
13
|
fingerprint: [{modelID: 'TS0212', manufacturerName: '_TYZB01_wpmo3ja3'}],
|
|
14
|
-
zigbeeModel: ['CO_V15', 'CO_YDLV10', 'CO_V16', '1ccaa94c49a84abaa9e38687913947ba'],
|
|
14
|
+
zigbeeModel: ['CO_V15', 'CO_YDLV10', 'CO_V16', '1ccaa94c49a84abaa9e38687913947ba', 'CO_CTPG'],
|
|
15
15
|
model: 'HS1CA-M',
|
|
16
16
|
description: 'Smart carbon monoxide sensor',
|
|
17
17
|
vendor: 'HEIMAN',
|
|
@@ -104,7 +104,7 @@ module.exports = [
|
|
|
104
104
|
model: 'HS3CG',
|
|
105
105
|
vendor: 'HEIMAN',
|
|
106
106
|
description: 'Combustible gas sensor',
|
|
107
|
-
fromZigbee: [fz.
|
|
107
|
+
fromZigbee: [fz.ias_gas_alarm_2],
|
|
108
108
|
toZigbee: [],
|
|
109
109
|
exposes: [e.gas(), e.battery_low(), e.tamper()],
|
|
110
110
|
},
|
package/devices/lidl.js
CHANGED
|
@@ -716,7 +716,8 @@ module.exports = [
|
|
|
716
716
|
},
|
|
717
717
|
},
|
|
718
718
|
{
|
|
719
|
-
fingerprint: [{modelID: 'TS0502A', manufacturerName: '_TZ3000_rylaozuc'}
|
|
719
|
+
fingerprint: [{modelID: 'TS0502A', manufacturerName: '_TZ3000_rylaozuc'},
|
|
720
|
+
{modelID: 'TS0502A', manufacturerName: '_TZ3000_5fkufhn1'}],
|
|
720
721
|
model: '14147206L',
|
|
721
722
|
vendor: 'Lidl',
|
|
722
723
|
description: 'Livarno Lux ceiling light',
|
package/devices/lixee.js
CHANGED
|
@@ -48,7 +48,7 @@ const fzLocal = {
|
|
|
48
48
|
|
|
49
49
|
for (const at of elements) {
|
|
50
50
|
const at_snake = at.split(/(?=[A-Z])/).join('_').toLowerCase();
|
|
51
|
-
if (msg.data[at]) {
|
|
51
|
+
if (msg.data[at] != null) {
|
|
52
52
|
result[at_snake] = msg.data[at];
|
|
53
53
|
}
|
|
54
54
|
}
|
|
@@ -104,7 +104,7 @@ const fzLocal = {
|
|
|
104
104
|
for (const at of elements) {
|
|
105
105
|
const at_snake = at.split(/(?=[A-Z])/).join('_').toLowerCase();
|
|
106
106
|
let val = msg.data[at];
|
|
107
|
-
if (val) {
|
|
107
|
+
if (val != null) {
|
|
108
108
|
if (val.hasOwnProperty('type') && val.type === 'Buffer') {
|
|
109
109
|
val = Buffer.from(val.data);
|
|
110
110
|
}
|
|
@@ -155,7 +155,7 @@ const fzLocal = {
|
|
|
155
155
|
for (const at of elements) {
|
|
156
156
|
const at_snake = at.split(/(?=[A-Z])/).join('_').toLowerCase();
|
|
157
157
|
const val = msg.data[at];
|
|
158
|
-
if (val) {
|
|
158
|
+
if (val != null) {
|
|
159
159
|
result[at_snake] = val; // By default we assign raw value
|
|
160
160
|
switch (at) {
|
|
161
161
|
// If we receive a Buffer, transform to human readable text
|
package/devices/lonsonho.js
CHANGED
|
@@ -260,7 +260,7 @@ module.exports = [
|
|
|
260
260
|
extend: extend.light_onoff_brightness(),
|
|
261
261
|
},
|
|
262
262
|
{
|
|
263
|
-
fingerprint: [{modelID: 'TS110E', manufacturerName: '_TZ3210_wdexaypg'}],
|
|
263
|
+
fingerprint: [{modelID: 'TS110E', manufacturerName: '_TZ3210_wdexaypg'}, {modelID: 'TS110E', manufacturerName: '_TZ3210_3mpwqzuu'}],
|
|
264
264
|
model: 'TS110E_2gang',
|
|
265
265
|
vendor: 'Lonsonho',
|
|
266
266
|
description: 'Zigbee smart dimmer module 2 gang with neutral',
|
package/devices/mecrator.js
CHANGED
|
@@ -81,7 +81,7 @@ module.exports = [
|
|
|
81
81
|
},
|
|
82
82
|
{
|
|
83
83
|
fingerprint: [{modelID: 'TS011F', manufacturerName: '_TZ3210_pfbzs1an'}],
|
|
84
|
-
model: '
|
|
84
|
+
model: 'SPPUSB02',
|
|
85
85
|
vendor: 'Mercator',
|
|
86
86
|
description: 'Ikuü double power point with USB',
|
|
87
87
|
fromZigbee: [fz.on_off, fz.electrical_measurement, fz.metering, fz.ignore_basic_report, fz.tuya_switch_power_outage_memory],
|
package/devices/moes.js
CHANGED
|
@@ -391,19 +391,6 @@ module.exports = [
|
|
|
391
391
|
exposes.numeric('boost_heating_countdown_time_set', ea.STATE_SET).withUnit('second')
|
|
392
392
|
.withDescription('Boost Time Setting 100 sec - 900 sec, (default = 300 sec)').withValueMin(100).withValueMax(900)],
|
|
393
393
|
},
|
|
394
|
-
{
|
|
395
|
-
fingerprint: [{modelID: 'TS0601', manufacturerName: '_TZE200_la2c2uo9'}],
|
|
396
|
-
model: 'MS-105Z',
|
|
397
|
-
vendor: 'Moes',
|
|
398
|
-
description: '1 gang 2 way Zigbee dimmer switch',
|
|
399
|
-
fromZigbee: [fz.moes_105_dimmer, fz.ignore_basic_report],
|
|
400
|
-
toZigbee: [tz.moes_105_dimmer],
|
|
401
|
-
meta: {turnsOffAtBrightness1: true},
|
|
402
|
-
configure: async (device, coordinatorEndpoint, logger) => {
|
|
403
|
-
await reporting.bind(device.getEndpoint(1), coordinatorEndpoint, ['genOnOff', 'genLevelCtrl']);
|
|
404
|
-
},
|
|
405
|
-
exposes: [e.light_brightness().setAccess('state', ea.STATE_SET).setAccess('brightness', ea.STATE_SET)],
|
|
406
|
-
},
|
|
407
394
|
{
|
|
408
395
|
fingerprint: [{modelID: 'TS0601', manufacturerName: '_TZE200_fjjbhx9d'}],
|
|
409
396
|
model: 'ZS-EUD',
|
package/devices/philips.js
CHANGED
|
@@ -2841,4 +2841,25 @@ module.exports = [
|
|
|
2841
2841
|
description: 'Hue white ambiance Fair ceiling with Bluetooth white',
|
|
2842
2842
|
extend: hueExtend.light_onoff_brightness_colortemp({colorTempRange: [153, 454]}),
|
|
2843
2843
|
},
|
|
2844
|
+
{
|
|
2845
|
+
zigbeeModel: ['929003048301_01', '929003048301_02', '929003048301_03', '929003048301_04'],
|
|
2846
|
+
model: '8719514339163',
|
|
2847
|
+
vendor: 'Philips',
|
|
2848
|
+
description: 'Hue white ambiance Buckram quadruple spotlight with Bluetooth',
|
|
2849
|
+
extend: hueExtend.light_onoff_brightness_colortemp({colorTempRange: [153, 454]}),
|
|
2850
|
+
},
|
|
2851
|
+
{
|
|
2852
|
+
zigbeeModel: ['929003048101_01', '929003048101_02', '929003048101_03'],
|
|
2853
|
+
model: '8719514339125',
|
|
2854
|
+
vendor: 'Philips',
|
|
2855
|
+
description: 'Hue white ambiance Buckram triple spotlight with Bluetooth',
|
|
2856
|
+
extend: hueExtend.light_onoff_brightness_colortemp({colorTempRange: [153, 454]}),
|
|
2857
|
+
},
|
|
2858
|
+
{
|
|
2859
|
+
zigbeeModel: ['929003047901_01', '929003047901_02'],
|
|
2860
|
+
model: '871951433908',
|
|
2861
|
+
vendor: 'Philips',
|
|
2862
|
+
description: 'Hue white ambiance Buckram double spotlight with Bluetooth',
|
|
2863
|
+
extend: hueExtend.light_onoff_brightness_colortemp({colorTempRange: [153, 454]}),
|
|
2864
|
+
},
|
|
2844
2865
|
];
|
package/devices/sercomm.js
CHANGED
|
@@ -120,4 +120,21 @@ module.exports = [
|
|
|
120
120
|
},
|
|
121
121
|
exposes: [e.occupancy(), e.battery_low(), e.tamper(), e.battery()],
|
|
122
122
|
},
|
|
123
|
+
{
|
|
124
|
+
zigbeeModel: ['SZ-PIR04N', 'SZ-PIR04N_EU'],
|
|
125
|
+
model: 'SZ-PIR04N',
|
|
126
|
+
vendor: 'Sercomm',
|
|
127
|
+
description: 'PIR motion & temperature sensor',
|
|
128
|
+
fromZigbee: [fz.ias_occupancy_alarm_1, fz.illuminance, fz.temperature, fz.battery],
|
|
129
|
+
toZigbee: [],
|
|
130
|
+
meta: {battery: {voltageToPercent: '3V_2500_3200'}},
|
|
131
|
+
configure: async (device, coordinatorEndpoint, logger) => {
|
|
132
|
+
const endpoint = device.getEndpoint(1);
|
|
133
|
+
await reporting.bind(endpoint, coordinatorEndpoint, ['msIlluminanceMeasurement', 'msTemperatureMeasurement', 'genPowerCfg']);
|
|
134
|
+
await reporting.illuminance(endpoint);
|
|
135
|
+
await reporting.temperature(endpoint);
|
|
136
|
+
await reporting.batteryVoltage(endpoint);
|
|
137
|
+
},
|
|
138
|
+
exposes: [e.occupancy(), e.tamper(), e.illuminance(), e.temperature(), e.battery(), e.battery_voltage()],
|
|
139
|
+
},
|
|
123
140
|
];
|
package/devices/sunricher.js
CHANGED
|
@@ -2,6 +2,7 @@ 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 globalStore = require('../lib/store');
|
|
5
6
|
const constants = require('../lib/constants');
|
|
6
7
|
const extend = require('../lib/extend');
|
|
7
8
|
const utils = require('../lib/utils');
|
|
@@ -40,6 +41,14 @@ const fzLocal = {
|
|
|
40
41
|
},
|
|
41
42
|
};
|
|
42
43
|
|
|
44
|
+
function syncTime(endpoint) {
|
|
45
|
+
try {
|
|
46
|
+
const time = Math.round(((new Date()).getTime() - constants.OneJanuary2000) / 1000 + ((new Date()).getTimezoneOffset() * -1) * 60);
|
|
47
|
+
const values = {time: time};
|
|
48
|
+
endpoint.write('genTime', values);
|
|
49
|
+
} catch (error) {/* Do nothing*/}
|
|
50
|
+
}
|
|
51
|
+
|
|
43
52
|
module.exports = [
|
|
44
53
|
{
|
|
45
54
|
zigbeeModel: ['SR-ZG9023A-EU'],
|
|
@@ -351,13 +360,12 @@ module.exports = [
|
|
|
351
360
|
model: 'SR-ZG9092A',
|
|
352
361
|
vendor: 'Sunricher',
|
|
353
362
|
description: 'Touch thermostat',
|
|
354
|
-
fromZigbee: [fz.thermostat, fz.namron_thermostat, fz.metering, fz.electrical_measurement],
|
|
363
|
+
fromZigbee: [fz.thermostat, fz.namron_thermostat, fz.metering, fz.electrical_measurement, fz.namron_hvac_user_interface],
|
|
355
364
|
toZigbee: [tz.thermostat_occupied_heating_setpoint, tz.thermostat_unoccupied_heating_setpoint, tz.thermostat_occupancy,
|
|
356
365
|
tz.thermostat_local_temperature_calibration, tz.thermostat_local_temperature, tz.thermostat_outdoor_temperature,
|
|
357
366
|
tz.thermostat_system_mode, tz.thermostat_control_sequence_of_operation, tz.thermostat_running_state,
|
|
358
|
-
tz.namron_thermostat],
|
|
367
|
+
tz.namron_thermostat, tz.namron_thermostat_child_lock],
|
|
359
368
|
exposes: [
|
|
360
|
-
e.local_temperature(),
|
|
361
369
|
exposes.numeric('outdoor_temperature', ea.STATE_GET).withUnit('°C')
|
|
362
370
|
.withDescription('Current temperature measured from the floor sensor'),
|
|
363
371
|
exposes.climate()
|
|
@@ -369,7 +377,11 @@ module.exports = [
|
|
|
369
377
|
.withRunningState(['idle', 'heat']),
|
|
370
378
|
exposes.binary('away_mode', ea.ALL, 'ON', 'OFF')
|
|
371
379
|
.withDescription('Enable/disable away mode'),
|
|
380
|
+
exposes.binary('child_lock', ea.ALL, 'UNLOCK', 'LOCK')
|
|
381
|
+
.withDescription('Enables/disables physical input on the device'),
|
|
372
382
|
e.power(), e.current(), e.voltage(), e.energy(),
|
|
383
|
+
exposes.enum('lcd_brightness', ea.ALL, ['low', 'mid', 'high'])
|
|
384
|
+
.withDescription('OLED brightness when operating the buttons. Default: Medium.'),
|
|
373
385
|
exposes.enum('button_vibration_level', ea.ALL, ['off', 'low', 'high'])
|
|
374
386
|
.withDescription('Key beep volume and vibration level. Default: Low.'),
|
|
375
387
|
exposes.enum('floor_sensor_type', ea.ALL, ['10k', '15k', '50k', '100k', '12k'])
|
|
@@ -398,11 +410,24 @@ module.exports = [
|
|
|
398
410
|
.withUnit('°C')
|
|
399
411
|
.withValueMin(0.5).withValueMax(2).withValueStep(0.1)
|
|
400
412
|
.withDescription('Hysteresis setting, between 0.5 and 2 in 0.1 °C. Default: 0.5.'),
|
|
413
|
+
exposes.enum('display_auto_off_enabled', ea.ALL, ['disabled', 'enabled']),
|
|
401
414
|
exposes.numeric('alarm_airtemp_overvalue', ea.ALL)
|
|
402
415
|
.withUnit('°C')
|
|
403
416
|
.withValueMin(20).withValueMax(60)
|
|
404
417
|
.withDescription('Room temperature alarm threshold, between 20 and 60 in °C. 0 means disabled. Default: 45.'),
|
|
405
418
|
],
|
|
419
|
+
onEvent: async (type, data, device, options) => {
|
|
420
|
+
if (type === 'stop') {
|
|
421
|
+
clearInterval(globalStore.getValue(device, 'time'));
|
|
422
|
+
globalStore.clearValue(device, 'time');
|
|
423
|
+
} else if (!globalStore.hasValue(device, 'time')) {
|
|
424
|
+
const endpoint = device.getEndpoint(1);
|
|
425
|
+
const hours24 = 1000 * 60 * 60 * 24;
|
|
426
|
+
// Device does not ask for the time with binding, therefore we write the time every 24 hours
|
|
427
|
+
const interval = setInterval(async () => syncTime(endpoint), hours24);
|
|
428
|
+
globalStore.putValue(device, 'time', interval);
|
|
429
|
+
}
|
|
430
|
+
},
|
|
406
431
|
configure: async (device, coordinatorEndpoint, logger) => {
|
|
407
432
|
const endpoint = device.getEndpoint(1);
|
|
408
433
|
const binds = [
|
|
@@ -415,6 +440,7 @@ module.exports = [
|
|
|
415
440
|
await reporting.thermostatTemperature(endpoint);
|
|
416
441
|
await reporting.thermostatOccupiedHeatingSetpoint(endpoint);
|
|
417
442
|
await reporting.thermostatUnoccupiedHeatingSetpoint(endpoint);
|
|
443
|
+
await reporting.thermostatKeypadLockMode(endpoint);
|
|
418
444
|
|
|
419
445
|
await endpoint.configureReporting('hvacThermostat', [{
|
|
420
446
|
attribute: 'ocupancy',
|
|
@@ -425,16 +451,24 @@ module.exports = [
|
|
|
425
451
|
|
|
426
452
|
await endpoint.read('haElectricalMeasurement', ['acVoltageMultiplier', 'acVoltageDivisor', 'acCurrentMultiplier']);
|
|
427
453
|
await endpoint.read('haElectricalMeasurement', ['acCurrentDivisor']);
|
|
454
|
+
await endpoint.read('seMetering', ['multiplier', 'divisor']);
|
|
428
455
|
|
|
429
|
-
await reporting.activePower(endpoint);
|
|
430
|
-
await reporting.rmsCurrent(endpoint, {min:
|
|
431
|
-
await reporting.rmsVoltage(endpoint, {min:
|
|
456
|
+
await reporting.activePower(endpoint, {min: 30, change: 10}); // Min report change 10W
|
|
457
|
+
await reporting.rmsCurrent(endpoint, {min: 30, change: 50}); // Min report change 0.05A
|
|
458
|
+
await reporting.rmsVoltage(endpoint, {min: 30, change: 20}); // Min report change 2V
|
|
459
|
+
await reporting.readMeteringMultiplierDivisor(endpoint);
|
|
432
460
|
await reporting.currentSummDelivered(endpoint);
|
|
433
461
|
|
|
434
462
|
// Custom attributes
|
|
435
463
|
const options = {manufacturerCode: 0x1224}; // Sunricher Manufacturer Code
|
|
436
464
|
|
|
437
|
-
// OperateDisplayLcdBrightnesss
|
|
465
|
+
// OperateDisplayLcdBrightnesss
|
|
466
|
+
await endpoint.configureReporting('hvacThermostat', [{
|
|
467
|
+
attribute: {ID: 0x1000, type: 0x30},
|
|
468
|
+
minimumReportInterval: 0,
|
|
469
|
+
maximumReportInterval: constants.repInterval.HOUR,
|
|
470
|
+
reportableChange: null}],
|
|
471
|
+
options);
|
|
438
472
|
// ButtonVibrationLevel
|
|
439
473
|
await endpoint.configureReporting('hvacThermostat', [{
|
|
440
474
|
attribute: {ID: 0x1001, type: 0x30},
|
|
@@ -507,6 +541,14 @@ module.exports = [
|
|
|
507
541
|
reportableChange: 0}],
|
|
508
542
|
options);
|
|
509
543
|
|
|
544
|
+
// DisplayAutoOffEnable
|
|
545
|
+
await endpoint.configureReporting('hvacThermostat', [{
|
|
546
|
+
attribute: {ID: 0x100B, type: 0x30},
|
|
547
|
+
minimumReportInterval: 0,
|
|
548
|
+
maximumReportInterval: constants.repInterval.HOUR,
|
|
549
|
+
reportableChange: null}],
|
|
550
|
+
options);
|
|
551
|
+
|
|
510
552
|
// AlarmAirTempOverValue
|
|
511
553
|
await endpoint.configureReporting('hvacThermostat', [{
|
|
512
554
|
attribute: {ID: 0x2001, type: 0x20},
|
|
@@ -523,12 +565,13 @@ module.exports = [
|
|
|
523
565
|
options);
|
|
524
566
|
|
|
525
567
|
// Device does not asks for the time with binding, we need to write time during configure
|
|
568
|
+
syncTime(endpoint);
|
|
526
569
|
|
|
527
570
|
// Trigger initial read
|
|
528
571
|
await endpoint.read('hvacThermostat', ['systemMode', 'runningState', 'occupiedHeatingSetpoint']);
|
|
529
|
-
await endpoint.read('hvacThermostat', [0x1001, 0x1002, 0x1003], options);
|
|
572
|
+
await endpoint.read('hvacThermostat', [0x1000, 0x1001, 0x1002, 0x1003], options);
|
|
530
573
|
await endpoint.read('hvacThermostat', [0x1004, 0x1005, 0x1006, 0x1007], options);
|
|
531
|
-
await endpoint.read('hvacThermostat', [0x1008, 0x1009, 0x100A], options);
|
|
574
|
+
await endpoint.read('hvacThermostat', [0x1008, 0x1009, 0x100A, 0x100B], options);
|
|
532
575
|
await endpoint.read('hvacThermostat', [0x2001, 0x2002], options);
|
|
533
576
|
},
|
|
534
577
|
},
|
package/devices/tuya.js
CHANGED
|
@@ -793,6 +793,7 @@ module.exports = [
|
|
|
793
793
|
fingerprint: [{modelID: 'TS0001', manufacturerName: '_TZ3000_hktqahrq'}, {manufacturerName: '_TZ3000_hktqahrq'},
|
|
794
794
|
{manufacturerName: '_TZ3000_q6a3tepg'}, {modelID: 'TS000F', manufacturerName: '_TZ3000_m9af2l6g'},
|
|
795
795
|
{modelID: 'TS000F', manufacturerName: '_TZ3000_mx3vgyea'},
|
|
796
|
+
{modelID: 'TS000F', manufacturerName: '_TZ3000_xkap8wtb'},
|
|
796
797
|
{modelID: 'TS0001', manufacturerName: '_TZ3000_npzfdcof'},
|
|
797
798
|
{modelID: 'TS0001', manufacturerName: '_TZ3000_5ng23zjs'},
|
|
798
799
|
{modelID: 'TS0001', manufacturerName: '_TZ3000_rmjr4ufz'},
|
|
@@ -1168,7 +1169,7 @@ module.exports = [
|
|
|
1168
1169
|
],
|
|
1169
1170
|
},
|
|
1170
1171
|
{
|
|
1171
|
-
fingerprint: tuya.fingerprint('TS0601', ['_TZE200_ip2akl4w', '_TZE200_1agwnems']),
|
|
1172
|
+
fingerprint: tuya.fingerprint('TS0601', ['_TZE200_ip2akl4w', '_TZE200_1agwnems', '_TZE200_la2c2uo9', '_TZE200_579lguh2']),
|
|
1172
1173
|
model: 'TS0601_dimmer_1',
|
|
1173
1174
|
vendor: 'TuYa',
|
|
1174
1175
|
description: 'Zigbee smart dimmer',
|
|
@@ -1188,6 +1189,10 @@ module.exports = [
|
|
|
1188
1189
|
[14, 'power_on_behavior', tuya.valueConverter.powerOnBehavior],
|
|
1189
1190
|
],
|
|
1190
1191
|
},
|
|
1192
|
+
whiteLabel: [
|
|
1193
|
+
{vendor: 'Moes', model: 'MS-105Z'},
|
|
1194
|
+
{vendor: 'Lerlink', model: 'X706U'},
|
|
1195
|
+
],
|
|
1191
1196
|
},
|
|
1192
1197
|
{
|
|
1193
1198
|
fingerprint: [{modelID: 'TS011F', manufacturerName: '_TZ3000_oiymh3qu'}],
|
|
@@ -1327,7 +1332,10 @@ module.exports = [
|
|
|
1327
1332
|
},
|
|
1328
1333
|
},
|
|
1329
1334
|
{
|
|
1330
|
-
fingerprint: [
|
|
1335
|
+
fingerprint: [
|
|
1336
|
+
{modelID: 'TS0601', manufacturerName: '_TZE200_nkjintbl'},
|
|
1337
|
+
{modelID: 'TS0601', manufacturerName: '_TZE200_ji1gn7rw'},
|
|
1338
|
+
],
|
|
1331
1339
|
model: 'TS0601_switch_2_gang',
|
|
1332
1340
|
vendor: 'TuYa',
|
|
1333
1341
|
description: '2 gang switch',
|
|
@@ -1516,9 +1524,7 @@ module.exports = [
|
|
|
1516
1524
|
},
|
|
1517
1525
|
},
|
|
1518
1526
|
{
|
|
1519
|
-
fingerprint: [
|
|
1520
|
-
{modelID: 'TS0201', manufacturerName: '_TZ3000_dowj6gyi'},
|
|
1521
|
-
],
|
|
1527
|
+
fingerprint: tuya.fingerprint('TS0201', ['_TZ3000_dowj6gyi', '_TZ3000_8ybe88nf']),
|
|
1522
1528
|
model: 'IH-K009',
|
|
1523
1529
|
vendor: 'TuYa',
|
|
1524
1530
|
description: 'Temperature & humidity sensor',
|
|
@@ -1817,14 +1823,16 @@ module.exports = [
|
|
|
1817
1823
|
e.switch().withEndpoint('l1'),
|
|
1818
1824
|
e.switch().withEndpoint('l2'),
|
|
1819
1825
|
e.switch().withEndpoint('l3'),
|
|
1820
|
-
|
|
1821
|
-
|
|
1826
|
+
e.power_on_behavior(),
|
|
1827
|
+
e.switch_type_2(),
|
|
1822
1828
|
],
|
|
1823
1829
|
endpoint: (device) => {
|
|
1824
1830
|
return {'l1': 1, 'l2': 2, 'l3': 3};
|
|
1825
1831
|
},
|
|
1826
1832
|
meta: {multiEndpoint: true},
|
|
1827
1833
|
configure: async (device, coordinatorEndpoint, logger) => {
|
|
1834
|
+
await device.getEndpoint(1).read('genBasic',
|
|
1835
|
+
['manufacturerName', 'zclVersion', 'appVersion', 'modelId', 'powerSource', 0xfffe]);
|
|
1828
1836
|
await reporting.bind(device.getEndpoint(1), coordinatorEndpoint, ['genOnOff']);
|
|
1829
1837
|
await reporting.bind(device.getEndpoint(2), coordinatorEndpoint, ['genOnOff']);
|
|
1830
1838
|
await reporting.bind(device.getEndpoint(3), coordinatorEndpoint, ['genOnOff']);
|
|
@@ -1843,14 +1851,16 @@ module.exports = [
|
|
|
1843
1851
|
e.switch().withEndpoint('l2'),
|
|
1844
1852
|
e.switch().withEndpoint('l3'),
|
|
1845
1853
|
e.switch().withEndpoint('l4'),
|
|
1846
|
-
|
|
1847
|
-
|
|
1854
|
+
e.power_on_behavior(),
|
|
1855
|
+
e.switch_type_2(),
|
|
1848
1856
|
],
|
|
1849
1857
|
endpoint: (device) => {
|
|
1850
1858
|
return {'l1': 1, 'l2': 2, 'l3': 3, 'l4': 4};
|
|
1851
1859
|
},
|
|
1852
1860
|
meta: {multiEndpoint: true},
|
|
1853
1861
|
configure: async (device, coordinatorEndpoint, logger) => {
|
|
1862
|
+
await device.getEndpoint(1).read('genBasic',
|
|
1863
|
+
['manufacturerName', 'zclVersion', 'appVersion', 'modelId', 'powerSource', 0xfffe]);
|
|
1854
1864
|
await reporting.bind(device.getEndpoint(1), coordinatorEndpoint, ['genOnOff']);
|
|
1855
1865
|
await reporting.bind(device.getEndpoint(2), coordinatorEndpoint, ['genOnOff']);
|
|
1856
1866
|
await reporting.bind(device.getEndpoint(3), coordinatorEndpoint, ['genOnOff']);
|
|
@@ -1950,6 +1960,7 @@ module.exports = [
|
|
|
1950
1960
|
{vendor: 'SHOJZJ', model: '378RT'},
|
|
1951
1961
|
{vendor: 'Silvercrest', model: 'TVR01'},
|
|
1952
1962
|
{vendor: 'Immax', model: '07732B'},
|
|
1963
|
+
{vendor: 'Evolveo', model: 'Heat M30'},
|
|
1953
1964
|
],
|
|
1954
1965
|
meta: {tuyaThermostatPreset: tuya.thermostatPresets, tuyaThermostatSystemMode: tuya.thermostatSystemModes3},
|
|
1955
1966
|
ota: ota.zigbeeOTA,
|
|
@@ -2315,19 +2326,20 @@ module.exports = [
|
|
|
2315
2326
|
fromZigbee: [tuya.fzDataPoints],
|
|
2316
2327
|
toZigbee: [tuya.tzDataPoints],
|
|
2317
2328
|
configure: tuya.configureMagicPacket,
|
|
2318
|
-
exposes: [tuya.exposes.switch(), e.ac_frequency(), e.energy(), e.power(), e.power_factor(), e.voltage(), e.current()
|
|
2329
|
+
exposes: [tuya.exposes.switch(), e.ac_frequency(), e.energy(), e.power(), e.power_factor(), e.voltage(), e.current(),
|
|
2330
|
+
e.produced_energy()],
|
|
2319
2331
|
meta: {
|
|
2320
2332
|
tuyaDatapoints: [
|
|
2321
2333
|
[1, 'energy', tuya.valueConverter.divideBy100],
|
|
2322
2334
|
[6, null, tuya.valueConverter.phaseA], // voltage and current
|
|
2323
2335
|
[16, 'state', tuya.valueConverter.onOff],
|
|
2336
|
+
[102, 'produced_energy', tuya.valueConverter.divideBy100],
|
|
2324
2337
|
[103, 'power', tuya.valueConverter.raw],
|
|
2325
2338
|
[105, 'ac_frequency', tuya.valueConverter.divideBy100],
|
|
2326
2339
|
[111, 'power_factor', tuya.valueConverter.divideBy10],
|
|
2327
2340
|
// Ignored for now; we don't know what the values mean
|
|
2328
2341
|
[109, null, null], // reactive_power in VArh, ignored for now
|
|
2329
2342
|
[101, null, null], // total active power (translated from chinese) - same as energy dp 1??
|
|
2330
|
-
[102, null, null], // Reverse active power (translated from chinese), produced power? (e.g. if solar panels are connected)
|
|
2331
2343
|
[9, null, null], // Fault - we don't know the possible values here
|
|
2332
2344
|
[110, null, null], // total reactive power (translated from chinese) - value is 0.03kvar, we already have kvarh on dp 109
|
|
2333
2345
|
[17, null, null], // Alarm set1 - value seems garbage "AAAAAAAAAAAAAABkAAEOAACqAAAAAAAKAAAAAAAA"
|
|
@@ -3221,6 +3233,7 @@ module.exports = [
|
|
|
3221
3233
|
fingerprint: [{modelID: 'TS0601', manufacturerName: '_TZE200_ikvncluo'},
|
|
3222
3234
|
{modelID: 'TS0601', manufacturerName: '_TZE200_lyetpprm'},
|
|
3223
3235
|
{modelID: 'TS0601', manufacturerName: '_TZE200_jva8ink8'},
|
|
3236
|
+
{modelID: 'TS0601', manufacturerName: '_TZE200_holel4dk'},
|
|
3224
3237
|
{modelID: 'TS0601', manufacturerName: '_TZE200_wukb7rhc'},
|
|
3225
3238
|
{modelID: 'TS0601', manufacturerName: '_TZE200_ztc6ggyl'}],
|
|
3226
3239
|
model: 'TS0601_smart_human_presense_sensor',
|
package/devices/villeroy_boch.js
CHANGED
|
@@ -5,7 +5,14 @@ module.exports = [
|
|
|
5
5
|
zigbeeModel: ['5991711'],
|
|
6
6
|
model: 'C5850000',
|
|
7
7
|
vendor: 'Villeroy & Boch',
|
|
8
|
-
description: 'Subway 3.0 Zigbee home
|
|
8
|
+
description: 'Subway 3.0 Zigbee home automation kit',
|
|
9
|
+
extend: extend.light_onoff_brightness_colortemp({colorTempRange: [160, 450]}),
|
|
10
|
+
},
|
|
11
|
+
{
|
|
12
|
+
zigbeeModel: ['EC1300'],
|
|
13
|
+
model: 'C0040000',
|
|
14
|
+
vendor: 'Villeroy & Boch',
|
|
15
|
+
description: 'Zigbee home automation kit for mirror',
|
|
9
16
|
extend: extend.light_onoff_brightness_colortemp({colorTempRange: [160, 450]}),
|
|
10
17
|
},
|
|
11
18
|
];
|
package/lib/exposes.js
CHANGED
|
@@ -549,6 +549,7 @@ module.exports = {
|
|
|
549
549
|
eco_temperature: () => new Numeric('eco_temperature', access.STATE_SET).withUnit('°C').withDescription('Eco temperature').withValueMin(0).withValueMax(35),
|
|
550
550
|
effect: () => new Enum('effect', access.SET, ['blink', 'breathe', 'okay', 'channel_change', 'finish_effect', 'stop_effect']).withDescription('Triggers an effect on the light (e.g. make light blink for a few seconds)'),
|
|
551
551
|
energy: () => new Numeric('energy', access.STATE).withUnit('kWh').withDescription('Sum of consumed energy'),
|
|
552
|
+
produced_energy: () => new Numeric('produced_energy', access.STATE).withUnit('kWh').withDescription('Sum of produced energy'),
|
|
552
553
|
fan: () => new Fan(),
|
|
553
554
|
flip_indicator_light: () => new Binary('flip_indicator_light', access.ALL, 'ON', 'OFF').withDescription('After turn on, the indicator light turns on while switch is off, and vice versa'),
|
|
554
555
|
force: () => new Enum('force', access.STATE_SET, ['normal', 'open', 'close']).withDescription('Force the valve position'),
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "zigbee-herdsman-converters",
|
|
3
|
-
"version": "14.0.
|
|
3
|
+
"version": "14.0.644",
|
|
4
4
|
"description": "Collection of device converters to be used with zigbee-herdsman",
|
|
5
5
|
"main": "index.js",
|
|
6
6
|
"files": [
|
|
@@ -34,7 +34,7 @@
|
|
|
34
34
|
},
|
|
35
35
|
"homepage": "https://github.com/Koenkk/zigbee-herdsman-converters",
|
|
36
36
|
"dependencies": {
|
|
37
|
-
"axios": "^1.1.
|
|
37
|
+
"axios": "^1.1.3",
|
|
38
38
|
"buffer-crc32": "^0.2.13",
|
|
39
39
|
"https-proxy-agent": "^5.0.1",
|
|
40
40
|
"tar-stream": "^2.2.0",
|
package/devices/lerlink.js
DELETED
|
@@ -1,19 +0,0 @@
|
|
|
1
|
-
const exposes = require('../lib/exposes');
|
|
2
|
-
const fz = {...require('../converters/fromZigbee'), legacy: require('../lib/legacy').fromZigbee};
|
|
3
|
-
const tz = require('../converters/toZigbee');
|
|
4
|
-
const e = exposes.presets;
|
|
5
|
-
const ea = exposes.access;
|
|
6
|
-
|
|
7
|
-
module.exports = [
|
|
8
|
-
{
|
|
9
|
-
fingerprint: [
|
|
10
|
-
{modelID: 'TS0601', manufacturerName: '_TZE200_579lguh2'},
|
|
11
|
-
],
|
|
12
|
-
model: 'X706U',
|
|
13
|
-
vendor: 'Lerlink',
|
|
14
|
-
description: 'Zigbee dimmer switch',
|
|
15
|
-
fromZigbee: [fz.moes_105_dimmer, fz.ignore_basic_report],
|
|
16
|
-
toZigbee: [tz.moes_105_dimmer],
|
|
17
|
-
exposes: [e.light_brightness().setAccess('state', ea.STATE_SET).setAccess('brightness', ea.STATE_SET)],
|
|
18
|
-
},
|
|
19
|
-
];
|