zigbee-herdsman-converters 15.0.79 → 15.0.81
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/devices/bitron.js +59 -2
- package/devices/essentialb.js +1 -1
- package/devices/gledopto.js +7 -0
- package/devices/ledvance.js +1 -1
- package/devices/owon.js +1 -1
- package/devices/philips.js +2 -2
- package/devices/tuya.js +21 -2
- package/devices/ubisys.js +10 -0
- package/lib/tuya.js +10 -2
- package/package.json +1 -1
package/devices/bitron.js
CHANGED
|
@@ -5,6 +5,55 @@ const reporting = require('../lib/reporting');
|
|
|
5
5
|
const extend = require('../lib/extend');
|
|
6
6
|
const e = exposes.presets;
|
|
7
7
|
const ea = exposes.access;
|
|
8
|
+
const herdsman = require('zigbee-herdsman');
|
|
9
|
+
|
|
10
|
+
const manufacturerOptions = {manufacturerCode: herdsman.Zcl.ManufacturerCode._4_NOKS};
|
|
11
|
+
|
|
12
|
+
const bitron = {
|
|
13
|
+
fz: {
|
|
14
|
+
thermostat_hysteresis: {
|
|
15
|
+
cluster: 'hvacThermostat',
|
|
16
|
+
type: ['attributeReport', 'readResponse'],
|
|
17
|
+
convert: (model, msg, publish, options, meta) => {
|
|
18
|
+
const result = {};
|
|
19
|
+
|
|
20
|
+
if (msg.data.hasOwnProperty('fourNoksHysteresisHigh')) {
|
|
21
|
+
if (!result.hasOwnProperty('hysteresis')) result.hysteresis = {};
|
|
22
|
+
result.hysteresis.high = msg.data.fourNoksHysteresisHigh;
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
if (msg.data.hasOwnProperty('fourNoksHysteresisLow')) {
|
|
26
|
+
if (!result.hasOwnProperty('hysteresis')) result.hysteresis = {};
|
|
27
|
+
result.hysteresis.low = msg.data.fourNoksHysteresisLow;
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
return result;
|
|
31
|
+
},
|
|
32
|
+
},
|
|
33
|
+
},
|
|
34
|
+
tz: {
|
|
35
|
+
thermostat_hysteresis: {
|
|
36
|
+
key: ['hysteresis', 'hysteresis'],
|
|
37
|
+
convertSet: async (entity, key, value, meta) => {
|
|
38
|
+
const result = {state: {hysteresis: {}}};
|
|
39
|
+
if (value.hasOwnProperty('high')) {
|
|
40
|
+
await entity.write('hvacThermostat', {'fourNoksHysteresisHigh': value.high}, manufacturerOptions);
|
|
41
|
+
result.state.hysteresis.high = value.high;
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
if (value.hasOwnProperty('low')) {
|
|
45
|
+
await entity.write('hvacThermostat', {'fourNoksHysteresisLow': value.low}, manufacturerOptions);
|
|
46
|
+
result.state.hysteresis.low = value.low;
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
return result;
|
|
50
|
+
},
|
|
51
|
+
convertGet: async (entity, key, meta) => {
|
|
52
|
+
await entity.read('hvacThermostat', ['fourNoksHysteresisHigh', 'fourNoksHysteresisLow'], manufacturerOptions);
|
|
53
|
+
},
|
|
54
|
+
},
|
|
55
|
+
},
|
|
56
|
+
};
|
|
8
57
|
|
|
9
58
|
module.exports = [
|
|
10
59
|
{
|
|
@@ -190,12 +239,12 @@ module.exports = [
|
|
|
190
239
|
model: 'AV2010/32',
|
|
191
240
|
vendor: 'SMaBiT (Bitron Video)',
|
|
192
241
|
description: 'Wireless wall thermostat with relay',
|
|
193
|
-
fromZigbee: [fz.legacy.thermostat_att_report, fz.battery, fz.hvac_user_interface],
|
|
242
|
+
fromZigbee: [fz.legacy.thermostat_att_report, fz.battery, fz.hvac_user_interface, bitron.fz.thermostat_hysteresis],
|
|
194
243
|
toZigbee: [
|
|
195
244
|
tz.thermostat_control_sequence_of_operation, tz.thermostat_occupied_heating_setpoint,
|
|
196
245
|
tz.thermostat_occupied_cooling_setpoint, tz.thermostat_local_temperature_calibration,
|
|
197
246
|
tz.thermostat_local_temperature, tz.thermostat_running_state, tz.thermostat_temperature_display_mode,
|
|
198
|
-
tz.thermostat_keypad_lockout, tz.thermostat_system_mode, tz.battery_voltage,
|
|
247
|
+
tz.thermostat_keypad_lockout, tz.thermostat_system_mode, tz.battery_voltage, bitron.tz.thermostat_hysteresis,
|
|
199
248
|
],
|
|
200
249
|
exposes: (device, options) => {
|
|
201
250
|
const dynExposes = [];
|
|
@@ -214,6 +263,11 @@ module.exports = [
|
|
|
214
263
|
modes.push('cool');
|
|
215
264
|
}
|
|
216
265
|
|
|
266
|
+
const hysteresisExposes = exposes.composite('hysteresis', 'hysteresis', ea.ALL)
|
|
267
|
+
.withFeature(exposes.numeric('low', ea.SET))
|
|
268
|
+
.withFeature(exposes.numeric('high', ea.SET))
|
|
269
|
+
.withDescription('Set thermostat hysteresis low and high trigger values. (1 = 0.01ºC)');
|
|
270
|
+
|
|
217
271
|
dynExposes.push(exposes.climate()
|
|
218
272
|
.withSetpoint('occupied_heating_setpoint', 7, 30, 0.5)
|
|
219
273
|
.withLocalTemperature()
|
|
@@ -222,9 +276,11 @@ module.exports = [
|
|
|
222
276
|
.withLocalTemperatureCalibration()
|
|
223
277
|
.withControlSequenceOfOperation(['heating_only', 'cooling_only'], ea.ALL));
|
|
224
278
|
dynExposes.push(e.keypad_lockout());
|
|
279
|
+
dynExposes.push(hysteresisExposes);
|
|
225
280
|
dynExposes.push(e.battery().withAccess(ea.STATE_GET));
|
|
226
281
|
dynExposes.push(e.battery_low());
|
|
227
282
|
dynExposes.push(e.linkquality());
|
|
283
|
+
|
|
228
284
|
return dynExposes;
|
|
229
285
|
},
|
|
230
286
|
meta: {battery: {voltageToPercentage: '3V_2500'}},
|
|
@@ -241,6 +297,7 @@ module.exports = [
|
|
|
241
297
|
await reporting.batteryAlarmState(endpoint);
|
|
242
298
|
await reporting.batteryVoltage(endpoint);
|
|
243
299
|
await endpoint.read('hvacThermostat', ['ctrlSeqeOfOper', 'localTemperatureCalibration']);
|
|
300
|
+
await endpoint.read('hvacThermostat', ['fourNoksHysteresisHigh', 'fourNoksHysteresisLow'], manufacturerOptions);
|
|
244
301
|
},
|
|
245
302
|
},
|
|
246
303
|
{
|
package/devices/essentialb.js
CHANGED
|
@@ -10,7 +10,7 @@ module.exports = [
|
|
|
10
10
|
model: 'EB-E14-P45-RGBW',
|
|
11
11
|
vendor: 'EssentielB',
|
|
12
12
|
description: 'Smart LED bulb',
|
|
13
|
-
extend: extend.
|
|
13
|
+
extend: extend.light_onoff_brightness_colortemp_color({colorTempRange: [153, 370]}),
|
|
14
14
|
},
|
|
15
15
|
{
|
|
16
16
|
zigbeeModel: ['EB-E14-FLA-CCT'],
|
package/devices/gledopto.js
CHANGED
|
@@ -451,6 +451,13 @@ module.exports = [
|
|
|
451
451
|
description: 'Zigbee 6W E26/E27 Bulb RGB+CCT',
|
|
452
452
|
extend: gledoptoExtend.light_onoff_brightness_colortemp_color(),
|
|
453
453
|
},
|
|
454
|
+
{
|
|
455
|
+
zigbeeModel: ['GL-C-103P'],
|
|
456
|
+
model: 'GL-C-103P',
|
|
457
|
+
vendor: 'Gledopto',
|
|
458
|
+
description: 'Zigbee LED controller (pro)',
|
|
459
|
+
extend: extend.light_onoff_brightness_colortemp_color({colorTempRange: [158, 495]}),
|
|
460
|
+
},
|
|
454
461
|
{
|
|
455
462
|
zigbeeModel: ['GL-G-004P'],
|
|
456
463
|
model: 'GL-G-004P',
|
package/devices/ledvance.js
CHANGED
|
@@ -198,7 +198,7 @@ module.exports = [
|
|
|
198
198
|
zigbeeModel: ['CLA60 RGBW JP'],
|
|
199
199
|
model: 'SMARTZBA60RGBW',
|
|
200
200
|
vendor: 'LEDVANCE',
|
|
201
|
-
description: 'SMART+ lamp
|
|
201
|
+
description: 'SMART+ lamp B22D RGBTW',
|
|
202
202
|
extend: extend.ledvance.light_onoff_brightness_colortemp_color({colorTempRange: [153, 526]}),
|
|
203
203
|
ota: ota.ledvance,
|
|
204
204
|
},
|
package/devices/owon.js
CHANGED
package/devices/philips.js
CHANGED
|
@@ -887,9 +887,9 @@ module.exports = [
|
|
|
887
887
|
},
|
|
888
888
|
{
|
|
889
889
|
zigbeeModel: ['LCA006'],
|
|
890
|
-
model: '
|
|
890
|
+
model: '9290024688',
|
|
891
891
|
vendor: 'Philips',
|
|
892
|
-
description: 'Hue white and color ambiance
|
|
892
|
+
description: 'Hue white and color ambiance E27 1100lm',
|
|
893
893
|
extend: philips.extend.light_onoff_brightness_colortemp_color({colorTempRange: [153, 500]}),
|
|
894
894
|
},
|
|
895
895
|
{
|
package/devices/tuya.js
CHANGED
|
@@ -1491,8 +1491,7 @@ module.exports = [
|
|
|
1491
1491
|
},
|
|
1492
1492
|
},
|
|
1493
1493
|
{
|
|
1494
|
-
fingerprint:
|
|
1495
|
-
{modelID: 'TS0601', manufacturerName: '_TZE200_di3tfv5b'}],
|
|
1494
|
+
fingerprint: tuya.fingerprint('TS0601', ['_TZE200_aqnazj70', '_TZE200_k6jhsr0q', '_TZE200_di3tfv5b', '_TZE200_mexisfik']),
|
|
1496
1495
|
model: 'TS0601_switch_4_gang',
|
|
1497
1496
|
vendor: 'TuYa',
|
|
1498
1497
|
description: '4 gang switch',
|
|
@@ -2665,6 +2664,26 @@ module.exports = [
|
|
|
2665
2664
|
[66, 100, 160].includes(device.applicationVersion), // polling for energy
|
|
2666
2665
|
),
|
|
2667
2666
|
},
|
|
2667
|
+
{
|
|
2668
|
+
fingerprint: [{modelID: 'TS011F', manufacturerName: '_TZ3000_wbloefbf'}],
|
|
2669
|
+
model: 'TS011F_switch_5_gang',
|
|
2670
|
+
description: '2 gang 2 usb 1 wall ac outlet',
|
|
2671
|
+
whiteLabel: [{vendor: 'Milfra', model: 'M11Z'}],
|
|
2672
|
+
vendor: 'TuYa',
|
|
2673
|
+
extend: tuya.extend.switch({powerOutageMemory: true, childLock: true, endpoints: ['l1', 'l2', 'l3', 'l4', 'l5']}),
|
|
2674
|
+
endpoint: (device) => {
|
|
2675
|
+
return {l1: 1, l2: 2, l3: 3, l4: 4, l5: 5};
|
|
2676
|
+
},
|
|
2677
|
+
meta: {multiEndpoint: true},
|
|
2678
|
+
configure: async (device, coordinatorEndpoint, logger) => {
|
|
2679
|
+
await tuya.configureMagicPacket(device, coordinatorEndpoint, logger);
|
|
2680
|
+
await reporting.bind(device.getEndpoint(1), coordinatorEndpoint, ['genOnOff']);
|
|
2681
|
+
await reporting.bind(device.getEndpoint(2), coordinatorEndpoint, ['genOnOff']);
|
|
2682
|
+
await reporting.bind(device.getEndpoint(3), coordinatorEndpoint, ['genOnOff']);
|
|
2683
|
+
await reporting.bind(device.getEndpoint(4), coordinatorEndpoint, ['genOnOff']);
|
|
2684
|
+
await reporting.bind(device.getEndpoint(5), coordinatorEndpoint, ['genOnOff']);
|
|
2685
|
+
},
|
|
2686
|
+
},
|
|
2668
2687
|
{
|
|
2669
2688
|
fingerprint: tuya.fingerprint('TS0601', ['_TZE200_ntcy3xu1', '_TZE200_ytibqbra']),
|
|
2670
2689
|
model: 'TS0601_smoke_1',
|
package/devices/ubisys.js
CHANGED
|
@@ -925,4 +925,14 @@ module.exports = [
|
|
|
925
925
|
},
|
|
926
926
|
ota: ota.ubisys,
|
|
927
927
|
},
|
|
928
|
+
{
|
|
929
|
+
zigbeeModel: ['R0 (5501)'],
|
|
930
|
+
model: 'R0',
|
|
931
|
+
vendor: 'Ubisys',
|
|
932
|
+
description: 'Zigbee Router',
|
|
933
|
+
fromZigbee: [fz.linkquality_from_basic],
|
|
934
|
+
toZigbee: [],
|
|
935
|
+
exposes: [],
|
|
936
|
+
ota: ota.ubisys,
|
|
937
|
+
},
|
|
928
938
|
];
|
package/lib/tuya.js
CHANGED
|
@@ -1245,6 +1245,14 @@ const valueConverter = {
|
|
|
1245
1245
|
divideBy10: valueConverterBasic.divideBy(10),
|
|
1246
1246
|
divideBy1000: valueConverterBasic.divideBy(1000),
|
|
1247
1247
|
raw: valueConverterBasic.raw(),
|
|
1248
|
+
coverPosition: {
|
|
1249
|
+
to: async (v, meta) => {
|
|
1250
|
+
return meta.options.invert_cover ? 100 - v : v;
|
|
1251
|
+
},
|
|
1252
|
+
from: (v, meta, options) => {
|
|
1253
|
+
return options.invert_cover ? 100 - v : v;
|
|
1254
|
+
},
|
|
1255
|
+
},
|
|
1248
1256
|
plus1: {
|
|
1249
1257
|
from: (v) => v + 1,
|
|
1250
1258
|
to: (v) => v - 1,
|
|
@@ -1824,9 +1832,9 @@ const tuyaFz = {
|
|
|
1824
1832
|
if (dpEntry) {
|
|
1825
1833
|
const value = getDataValue(dpValue);
|
|
1826
1834
|
if (dpEntry[1]) {
|
|
1827
|
-
result[dpEntry[1]] = dpEntry[2].from(value, meta);
|
|
1835
|
+
result[dpEntry[1]] = dpEntry[2].from(value, meta, options);
|
|
1828
1836
|
} else if (dpEntry[2]) {
|
|
1829
|
-
result = {...result, ...dpEntry[2].from(value, meta)};
|
|
1837
|
+
result = {...result, ...dpEntry[2].from(value, meta, options)};
|
|
1830
1838
|
}
|
|
1831
1839
|
} else {
|
|
1832
1840
|
meta.logger.debug(`Datapoint ${dpId} not defined for '${meta.device.manufacturerName}' ` +
|