zigbee-herdsman-converters 14.0.683 → 14.0.685
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/ecodim.js +2 -0
- package/devices/immax.js +18 -0
- package/devices/philips.js +32 -4
- package/devices/quotra.js +18 -0
- package/devices/saswell.js +3 -1
- package/devices/sinope.js +76 -62
- package/devices/siterwell.js +6 -4
- package/devices/smartthings.js +1 -2
- package/devices/third_reality.js +7 -2
- package/devices/tuya.js +48 -8
- package/devices/wyze.js +23 -0
- package/lib/tuya.js +23 -1
- package/package.json +1 -1
package/devices/ecodim.js
CHANGED
|
@@ -3,6 +3,7 @@ const fz = {...require('../converters/fromZigbee'), legacy: require('../lib/lega
|
|
|
3
3
|
const e = exposes.presets;
|
|
4
4
|
const reporting = require('../lib/reporting');
|
|
5
5
|
const extend = require('../lib/extend');
|
|
6
|
+
const ota = require('../lib/ota');
|
|
6
7
|
|
|
7
8
|
module.exports = [
|
|
8
9
|
{
|
|
@@ -48,6 +49,7 @@ module.exports = [
|
|
|
48
49
|
model: 'Eco-Dim.07/Eco-Dim.10',
|
|
49
50
|
vendor: 'EcoDim',
|
|
50
51
|
description: 'Zigbee & Z-wave dimmer',
|
|
52
|
+
ota: ota.zigbeeOTA,
|
|
51
53
|
extend: extend.light_onoff_brightness({noConfigure: true, disableEffect: true}),
|
|
52
54
|
configure: async (device, coordinatorEndpoint, logger) => {
|
|
53
55
|
await extend.light_onoff_brightness().configure(device, coordinatorEndpoint, logger);
|
package/devices/immax.js
CHANGED
|
@@ -182,4 +182,22 @@ module.exports = [
|
|
|
182
182
|
// eslint-disable-next-line
|
|
183
183
|
exposes.enum('keep_time', ea.STATE_SET, ['0', '30', '60', '120', '240']).withDescription('PIR keep time in seconds')],
|
|
184
184
|
},
|
|
185
|
+
{
|
|
186
|
+
fingerprint: tuya.fingerprint('TS0601', ['_TZE200_n9clpsht']),
|
|
187
|
+
model: '07505L',
|
|
188
|
+
vendor: 'Immax',
|
|
189
|
+
description: 'Neo smart keypad',
|
|
190
|
+
fromZigbee: [tuya.fz.datapoints],
|
|
191
|
+
toZigbee: [],
|
|
192
|
+
exposes: [e.action(['disarm', 'arm_home', 'arm_away', 'sos']), e.tamper()],
|
|
193
|
+
meta: {
|
|
194
|
+
tuyaDatapoints: [
|
|
195
|
+
[24, 'tamper', tuya.valueConverter.trueFalse],
|
|
196
|
+
[26, 'action', tuya.valueConverter.static('disarm')],
|
|
197
|
+
[27, 'action', tuya.valueConverter.static('arm_away')],
|
|
198
|
+
[28, 'action', tuya.valueConverter.static('arm_home')],
|
|
199
|
+
[29, 'action', tuya.valueConverter.static('sos')],
|
|
200
|
+
],
|
|
201
|
+
},
|
|
202
|
+
},
|
|
185
203
|
];
|
package/devices/philips.js
CHANGED
|
@@ -662,9 +662,16 @@ module.exports = [
|
|
|
662
662
|
zigbeeModel: ['1740193P0'],
|
|
663
663
|
model: '1740193P0',
|
|
664
664
|
vendor: 'Philips',
|
|
665
|
-
description: 'Hue Lucca wall light',
|
|
665
|
+
description: 'Hue White Lucca wall light',
|
|
666
666
|
extend: hueExtend.light_onoff_brightness(),
|
|
667
667
|
},
|
|
668
|
+
{
|
|
669
|
+
zigbeeModel: ['929003089301'],
|
|
670
|
+
model: '929003089301',
|
|
671
|
+
vendor: 'Philips',
|
|
672
|
+
description: 'Hue White and Color Ambiance Lucca wall light',
|
|
673
|
+
extend: hueExtend.light_onoff_brightness_colortemp_color({colorTempRange: [153, 500]}),
|
|
674
|
+
},
|
|
668
675
|
{
|
|
669
676
|
zigbeeModel: ['1740293P0'],
|
|
670
677
|
model: '1740293P0',
|
|
@@ -1271,8 +1278,15 @@ module.exports = [
|
|
|
1271
1278
|
zigbeeModel: ['LCW002', '4090230P9', '929003053101'],
|
|
1272
1279
|
model: '4090230P9',
|
|
1273
1280
|
vendor: 'Philips',
|
|
1274
|
-
description: 'Hue Liane',
|
|
1275
|
-
extend: hueExtend.light_onoff_brightness_colortemp_color(),
|
|
1281
|
+
description: 'Hue Liane (black)',
|
|
1282
|
+
extend: hueExtend.light_onoff_brightness_colortemp_color({colorTempRange: [153, 500]}),
|
|
1283
|
+
},
|
|
1284
|
+
{
|
|
1285
|
+
zigbeeModel: ['929003053201'],
|
|
1286
|
+
model: '929003053201',
|
|
1287
|
+
vendor: 'Philips',
|
|
1288
|
+
description: 'Hue Liane (white)',
|
|
1289
|
+
extend: hueExtend.light_onoff_brightness_colortemp_color({colorTempRange: [153, 500]}),
|
|
1276
1290
|
},
|
|
1277
1291
|
{
|
|
1278
1292
|
zigbeeModel: ['4090231P9'],
|
|
@@ -2372,7 +2386,7 @@ module.exports = [
|
|
|
2372
2386
|
extend: hueExtend.light_onoff_brightness_colortemp_color({colorTempRange: [153, 500]}),
|
|
2373
2387
|
},
|
|
2374
2388
|
{
|
|
2375
|
-
zigbeeModel: ['5041131P9', '5041148P9'],
|
|
2389
|
+
zigbeeModel: ['5041131P9', '5041148P9', '929003047301'],
|
|
2376
2390
|
model: '5041131P9',
|
|
2377
2391
|
vendor: 'Philips',
|
|
2378
2392
|
description: 'Hue White ambiance Milliskin',
|
|
@@ -2955,4 +2969,18 @@ module.exports = [
|
|
|
2955
2969
|
...hueExtend.light_onoff_brightness_colortemp_color({colorTempRange: [153, 500]}).exposes],
|
|
2956
2970
|
extend: hueExtend.light_onoff_brightness_colortemp_color({colorTempRange: [153, 500]}),
|
|
2957
2971
|
},
|
|
2972
|
+
{
|
|
2973
|
+
zigbeeModel: ['929003526301'],
|
|
2974
|
+
model: '929003526301',
|
|
2975
|
+
vendor: 'Philips',
|
|
2976
|
+
description: 'Hue White & Color Ambiance Xamento M',
|
|
2977
|
+
extend: hueExtend.light_onoff_brightness_colortemp_color({colorTempRange: [153, 500]}),
|
|
2978
|
+
},
|
|
2979
|
+
{
|
|
2980
|
+
zigbeeModel: ['LWE008'],
|
|
2981
|
+
model: '929003021301',
|
|
2982
|
+
vendor: 'Philips',
|
|
2983
|
+
description: 'Hue White E17 470 lumen',
|
|
2984
|
+
extend: hueExtend.light_onoff_brightness(),
|
|
2985
|
+
},
|
|
2958
2986
|
];
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
const extend = require('../lib/extend');
|
|
2
|
+
|
|
3
|
+
module.exports = [
|
|
4
|
+
{
|
|
5
|
+
zigbeeModel: ['Dimmer_us'],
|
|
6
|
+
model: 'B07CVL9SZF',
|
|
7
|
+
vendor: 'Quotra',
|
|
8
|
+
description: 'Dimmer',
|
|
9
|
+
extend: extend.light_onoff_brightness(),
|
|
10
|
+
},
|
|
11
|
+
{
|
|
12
|
+
zigbeeModel: ['QV-RGBCCT'],
|
|
13
|
+
model: 'B07JHL6DRV',
|
|
14
|
+
vendor: 'Quotra',
|
|
15
|
+
description: 'RGB WW LED strip',
|
|
16
|
+
extend: extend.light_onoff_brightness_colortemp_color({colorTempRange: [150, 500]}),
|
|
17
|
+
},
|
|
18
|
+
];
|
package/devices/saswell.js
CHANGED
|
@@ -15,6 +15,7 @@ module.exports = [
|
|
|
15
15
|
{modelID: 'w7cahqs', manufacturerName: '_TYST11_yw7cahqs'},
|
|
16
16
|
{modelID: 'TS0601', manufacturerName: '_TZE200_c88teujp'},
|
|
17
17
|
{modelID: 'TS0601', manufacturerName: '_TZE200_yw7cahqs'},
|
|
18
|
+
{modelID: 'aj4jz0i\u0000', manufacturerName: '_TYST11_caj4jz0i'},
|
|
18
19
|
{modelID: 'TS0601', manufacturerName: '_TZE200_azqp6ssj'},
|
|
19
20
|
{modelID: 'TS0601', manufacturerName: '_TZE200_zuhszj9s'},
|
|
20
21
|
{modelID: 'TS0601', manufacturerName: '_TZE200_9gvruqf5'},
|
|
@@ -22,12 +23,13 @@ module.exports = [
|
|
|
22
23
|
{modelID: 'TS0601', manufacturerName: '_TZE200_0dvm9mva'},
|
|
23
24
|
{modelID: 'TS0601', manufacturerName: '_TZE200_h4cgnbzg'},
|
|
24
25
|
{modelID: 'TS0601', manufacturerName: '_TZE200_exfrnlow'},
|
|
26
|
+
{modelID: 'TS0601', manufacturerName: '_TZE200_9m4kmbfu'},
|
|
25
27
|
],
|
|
26
28
|
model: 'SEA801-Zigbee/SEA802-Zigbee',
|
|
27
29
|
vendor: 'Saswell',
|
|
28
30
|
description: 'Thermostatic radiator valve',
|
|
29
31
|
whiteLabel: [{vendor: 'HiHome', model: 'WZB-TRVL'}, {vendor: 'Hama', model: '00176592'},
|
|
30
|
-
{vendor: 'RTX', model: 'ZB-RT1'}],
|
|
32
|
+
{vendor: 'RTX', model: 'ZB-RT1'}, {vendor: 'SETTI+', model: 'TRV001'}],
|
|
31
33
|
fromZigbee: [fz.saswell_thermostat, fz.ignore_tuya_set_time, fz.ignore_basic_report, fz.legacy.tuya_thermostat_weekly_schedule],
|
|
32
34
|
toZigbee: [tz.saswell_thermostat_current_heating_setpoint, tz.saswell_thermostat_mode, tz.saswell_thermostat_away,
|
|
33
35
|
tz.saswell_thermostat_child_lock, tz.saswell_thermostat_window_detection, tz.saswell_thermostat_frost_detection,
|
package/devices/sinope.js
CHANGED
|
@@ -20,13 +20,24 @@ const fzLocal = {
|
|
|
20
20
|
const lookup = {0: 'unoccupied', 1: 'occupied'};
|
|
21
21
|
result.thermostat_occupancy = lookup[msg.data['1024']];
|
|
22
22
|
}
|
|
23
|
+
if (msg.data.hasOwnProperty('SinopeOccupancy')) {
|
|
24
|
+
const lookup = {0: 'unoccupied', 1: 'occupied'};
|
|
25
|
+
result.thermostat_occupancy = lookup[msg.data['SinopeOccupancy']];
|
|
26
|
+
}
|
|
23
27
|
if (msg.data.hasOwnProperty('1025')) {
|
|
24
28
|
result.main_cycle_output = cycleOutputLookup[msg.data['1025']];
|
|
25
29
|
}
|
|
30
|
+
if (msg.data.hasOwnProperty('SinopeMainCycleOutput')) {
|
|
31
|
+
result.main_cycle_output = cycleOutputLookup[msg.data['SinopeMainCycleOutput']];
|
|
32
|
+
}
|
|
26
33
|
if (msg.data.hasOwnProperty('1026')) {
|
|
27
34
|
const lookup = {0: 'on_demand', 1: 'sensing'};
|
|
28
35
|
result.backlight_auto_dim = lookup[msg.data['1026']];
|
|
29
36
|
}
|
|
37
|
+
if (msg.data.hasOwnProperty('SinopeBacklight')) {
|
|
38
|
+
const lookup = {0: 'on_demand', 1: 'sensing'};
|
|
39
|
+
result.backlight_auto_dim = lookup[msg.data['SinopeBacklight']];
|
|
40
|
+
}
|
|
30
41
|
if (msg.data.hasOwnProperty('1028')) {
|
|
31
42
|
result.aux_cycle_output = cycleOutputLookup[msg.data['1028']];
|
|
32
43
|
}
|
|
@@ -112,11 +123,11 @@ const tzLocal = {
|
|
|
112
123
|
convertSet: async (entity, key, value, meta) => {
|
|
113
124
|
const sinopeOccupancy = {0: 'unoccupied', 1: 'occupied'};
|
|
114
125
|
const SinopeOccupancy = utils.getKey(sinopeOccupancy, value, value, Number);
|
|
115
|
-
await entity.write('hvacThermostat', {SinopeOccupancy});
|
|
126
|
+
await entity.write('hvacThermostat', {SinopeOccupancy}, {manufacturerCode: 0x119C});
|
|
116
127
|
return {state: {'thermostat_occupancy': value}};
|
|
117
128
|
},
|
|
118
129
|
convertGet: async (entity, key, meta) => {
|
|
119
|
-
await entity.read('hvacThermostat', ['SinopeOccupancy']);
|
|
130
|
+
await entity.read('hvacThermostat', ['SinopeOccupancy'], {manufacturerCode: 0x119C});
|
|
120
131
|
},
|
|
121
132
|
},
|
|
122
133
|
sinope_thermostat_backlight_autodim_param: {
|
|
@@ -124,11 +135,11 @@ const tzLocal = {
|
|
|
124
135
|
convertSet: async (entity, key, value, meta) => {
|
|
125
136
|
const sinopeBacklightParam = {0: 'on_demand', 1: 'sensing'};
|
|
126
137
|
const SinopeBacklight = utils.getKey(sinopeBacklightParam, value, value, Number);
|
|
127
|
-
await entity.write('hvacThermostat', {SinopeBacklight});
|
|
138
|
+
await entity.write('hvacThermostat', {SinopeBacklight}, {manufacturerCode: 0x119C});
|
|
128
139
|
return {state: {'backlight_auto_dim': value}};
|
|
129
140
|
},
|
|
130
141
|
convertGet: async (entity, key, meta) => {
|
|
131
|
-
await entity.read('hvacThermostat', ['SinopeBacklight']);
|
|
142
|
+
await entity.read('hvacThermostat', ['SinopeBacklight'], {manufacturerCode: 0x119C});
|
|
132
143
|
},
|
|
133
144
|
},
|
|
134
145
|
sinope_thermostat_main_cycle_output: {
|
|
@@ -136,11 +147,11 @@ const tzLocal = {
|
|
|
136
147
|
key: ['main_cycle_output'],
|
|
137
148
|
convertSet: async (entity, key, value, meta) => {
|
|
138
149
|
const lookup = {'15_sec': 15, '5_min': 300, '10_min': 600, '15_min': 900, '20_min': 1200, '30_min': 1800};
|
|
139
|
-
await entity.write('hvacThermostat', {SinopeMainCycleOutput: lookup[value]});
|
|
150
|
+
await entity.write('hvacThermostat', {SinopeMainCycleOutput: lookup[value]}, {manufacturerCode: 0x119C});
|
|
140
151
|
return {state: {'main_cycle_output': value}};
|
|
141
152
|
},
|
|
142
153
|
convertGet: async (entity, key, meta) => {
|
|
143
|
-
await entity.read('hvacThermostat', ['SinopeMainCycleOutput']);
|
|
154
|
+
await entity.read('hvacThermostat', ['SinopeMainCycleOutput'], {manufacturerCode: 0x119C});
|
|
144
155
|
},
|
|
145
156
|
},
|
|
146
157
|
sinope_thermostat_aux_cycle_output: {
|
|
@@ -385,21 +396,20 @@ module.exports = [
|
|
|
385
396
|
fz.electrical_measurement, fz.metering, fz.ignore_temperature_report, fzLocal.sinope_thermostat],
|
|
386
397
|
toZigbee: [tz.thermostat_local_temperature, tz.thermostat_occupied_heating_setpoint, tz.thermostat_unoccupied_heating_setpoint,
|
|
387
398
|
tz.thermostat_temperature_display_mode, tz.thermostat_keypad_lockout, tz.thermostat_system_mode,
|
|
388
|
-
|
|
389
|
-
tzLocal.
|
|
390
|
-
tzLocal.
|
|
391
|
-
tz.electrical_measurement_power],
|
|
399
|
+
tzLocal.sinope_thermostat_backlight_autodim_param, tzLocal.sinope_thermostat_time, tzLocal.sinope_time_format,
|
|
400
|
+
tzLocal.sinope_thermostat_enable_outdoor_temperature, tzLocal.sinope_thermostat_outdoor_temperature,
|
|
401
|
+
tzLocal.sinope_thermostat_occupancy, tzLocal.sinope_thermostat_main_cycle_output, tz.electrical_measurement_power],
|
|
392
402
|
exposes: [
|
|
393
403
|
exposes.climate()
|
|
394
404
|
.withSetpoint('occupied_heating_setpoint', 5, 30, 0.5)
|
|
395
405
|
.withSetpoint('unoccupied_heating_setpoint', 5, 30, 0.5)
|
|
396
406
|
.withLocalTemperature()
|
|
397
407
|
.withSystemMode(['off', 'heat'], ea.ALL, 'Mode of the thermostat')
|
|
398
|
-
.withPiHeatingDemand(
|
|
399
|
-
.withRunningState(['idle', 'heat']),
|
|
408
|
+
.withPiHeatingDemand()
|
|
409
|
+
.withRunningState(['idle', 'heat'], ea.STATE),
|
|
400
410
|
exposes.enum('thermostat_occupancy', ea.ALL, ['unoccupied', 'occupied'])
|
|
401
411
|
.withDescription('Occupancy state of the thermostat'),
|
|
402
|
-
exposes.enum('backlight_auto_dim', ea.ALL, ['
|
|
412
|
+
exposes.enum('backlight_auto_dim', ea.ALL, ['on_demand', 'sensing'])
|
|
403
413
|
.withDescription('Control backlight dimming behavior'),
|
|
404
414
|
exposes.enum('keypad_lockout', ea.ALL, ['unlock', 'lock1'])
|
|
405
415
|
.withDescription('Enables or disables the device’s buttons'),
|
|
@@ -450,21 +460,20 @@ module.exports = [
|
|
|
450
460
|
fz.electrical_measurement, fz.metering, fz.ignore_temperature_report, fzLocal.sinope_thermostat],
|
|
451
461
|
toZigbee: [tz.thermostat_local_temperature, tz.thermostat_occupied_heating_setpoint, tz.thermostat_unoccupied_heating_setpoint,
|
|
452
462
|
tz.thermostat_temperature_display_mode, tz.thermostat_keypad_lockout, tz.thermostat_system_mode,
|
|
453
|
-
|
|
454
|
-
tzLocal.
|
|
455
|
-
tzLocal.
|
|
456
|
-
tz.electrical_measurement_power],
|
|
463
|
+
tzLocal.sinope_thermostat_backlight_autodim_param, tzLocal.sinope_thermostat_time, tzLocal.sinope_time_format,
|
|
464
|
+
tzLocal.sinope_thermostat_enable_outdoor_temperature, tzLocal.sinope_thermostat_outdoor_temperature,
|
|
465
|
+
tzLocal.sinope_thermostat_occupancy, tzLocal.sinope_thermostat_main_cycle_output, tz.electrical_measurement_power],
|
|
457
466
|
exposes: [
|
|
458
467
|
exposes.climate()
|
|
459
468
|
.withSetpoint('occupied_heating_setpoint', 5, 30, 0.5)
|
|
460
469
|
.withSetpoint('unoccupied_heating_setpoint', 5, 30, 0.5)
|
|
461
470
|
.withLocalTemperature()
|
|
462
471
|
.withSystemMode(['off', 'heat'], ea.ALL, 'Mode of the thermostat')
|
|
463
|
-
.withPiHeatingDemand(
|
|
464
|
-
.withRunningState(['idle', 'heat']),
|
|
472
|
+
.withPiHeatingDemand()
|
|
473
|
+
.withRunningState(['idle', 'heat'], ea.STATE),
|
|
465
474
|
exposes.enum('thermostat_occupancy', ea.ALL, ['unoccupied', 'occupied'])
|
|
466
475
|
.withDescription('Occupancy state of the thermostat'),
|
|
467
|
-
exposes.enum('backlight_auto_dim', ea.ALL, ['
|
|
476
|
+
exposes.enum('backlight_auto_dim', ea.ALL, ['on_demand', 'sensing'])
|
|
468
477
|
.withDescription('Control backlight dimming behavior'),
|
|
469
478
|
exposes.enum('keypad_lockout', ea.ALL, ['unlock', 'lock1'])
|
|
470
479
|
.withDescription('Enables or disables the device’s buttons'),
|
|
@@ -512,55 +521,61 @@ module.exports = [
|
|
|
512
521
|
description: 'Zigbee line volt thermostat',
|
|
513
522
|
meta: {thermostat: {dontMapPIHeatingDemand: true}},
|
|
514
523
|
fromZigbee: [fz.legacy.sinope_thermostat_att_report, fz.legacy.hvac_user_interface, fz.legacy.sinope_thermostat_state,
|
|
515
|
-
fz.electrical_measurement, fz.metering, fz.ignore_temperature_report],
|
|
516
|
-
toZigbee: [tz.thermostat_local_temperature, tz.thermostat_occupied_heating_setpoint, tz.
|
|
517
|
-
tz.
|
|
518
|
-
tzLocal.
|
|
519
|
-
tzLocal.
|
|
524
|
+
fz.electrical_measurement, fz.metering, fz.ignore_temperature_report, fzLocal.sinope_thermostat],
|
|
525
|
+
toZigbee: [tz.thermostat_local_temperature, tz.thermostat_occupied_heating_setpoint, tz.thermostat_unoccupied_heating_setpoint,
|
|
526
|
+
tz.thermostat_temperature_display_mode, tz.thermostat_keypad_lockout, tz.thermostat_system_mode,
|
|
527
|
+
tzLocal.sinope_thermostat_backlight_autodim_param, tzLocal.sinope_thermostat_time, tzLocal.sinope_time_format,
|
|
528
|
+
tzLocal.sinope_thermostat_enable_outdoor_temperature, tzLocal.sinope_thermostat_outdoor_temperature,
|
|
529
|
+
tzLocal.sinope_thermostat_occupancy, tzLocal.sinope_thermostat_main_cycle_output, tz.electrical_measurement_power],
|
|
520
530
|
exposes: [
|
|
521
531
|
exposes.climate()
|
|
522
532
|
.withSetpoint('occupied_heating_setpoint', 5, 30, 0.5)
|
|
533
|
+
.withSetpoint('unoccupied_heating_setpoint', 5, 30, 0.5)
|
|
523
534
|
.withLocalTemperature()
|
|
524
535
|
.withSystemMode(['off', 'heat'], ea.ALL, 'Mode of the thermostat')
|
|
525
|
-
.withPiHeatingDemand(
|
|
526
|
-
.withRunningState(['idle', 'heat']),
|
|
536
|
+
.withPiHeatingDemand()
|
|
537
|
+
.withRunningState(['idle', 'heat'], ea.STATE),
|
|
538
|
+
exposes.enum('thermostat_occupancy', ea.ALL, ['unoccupied', 'occupied'])
|
|
539
|
+
.withDescription('Occupancy state of the thermostat'),
|
|
540
|
+
exposes.enum('backlight_auto_dim', ea.ALL, ['on_demand', 'sensing'])
|
|
541
|
+
.withDescription('Control backlight dimming behavior'),
|
|
527
542
|
exposes.enum('keypad_lockout', ea.ALL, ['unlock', 'lock1'])
|
|
528
543
|
.withDescription('Enables or disables the device’s buttons'),
|
|
529
|
-
|
|
544
|
+
exposes.enum('main_cycle_output', ea.ALL, ['15_sec', '15_min'])
|
|
545
|
+
.withDescription('The length of the control cycle: 15_sec=normal 15_min=fan'),
|
|
546
|
+
e.power().withAccess(ea.STATE_GET), e.current(), e.voltage(), e.energy(),
|
|
530
547
|
],
|
|
531
548
|
|
|
532
549
|
configure: async (device, coordinatorEndpoint, logger) => {
|
|
533
550
|
const endpoint = device.getEndpoint(1);
|
|
534
551
|
const binds = [
|
|
535
|
-
'genBasic', 'genIdentify', '
|
|
552
|
+
'genBasic', 'genIdentify', 'hvacThermostat', 'hvacUserInterfaceCfg',
|
|
536
553
|
'msTemperatureMeasurement', 'haElectricalMeasurement', 'seMetering',
|
|
537
554
|
'manuSpecificSinope'];
|
|
538
555
|
await reporting.bind(endpoint, coordinatorEndpoint, binds);
|
|
539
556
|
await reporting.thermostatTemperature(endpoint);
|
|
540
557
|
await reporting.thermostatPIHeatingDemand(endpoint);
|
|
541
558
|
await reporting.thermostatOccupiedHeatingSetpoint(endpoint);
|
|
559
|
+
await reporting.thermostatUnoccupiedHeatingSetpoint(endpoint);
|
|
560
|
+
await reporting.thermostatSystemMode(endpoint);
|
|
542
561
|
|
|
543
|
-
try {
|
|
544
|
-
await reporting.thermostatSystemMode(endpoint);
|
|
545
|
-
} catch (error) {/* Not all support this */}
|
|
546
|
-
try {
|
|
547
|
-
await reporting.thermostatRunningState(endpoint);
|
|
548
|
-
} catch (error) {/* Not all support this */}
|
|
549
562
|
await reporting.readMeteringMultiplierDivisor(endpoint);
|
|
550
563
|
await reporting.currentSummDelivered(endpoint, {min: 10, max: 303, change: [1, 1]});
|
|
551
|
-
|
|
552
564
|
await reporting.readEletricalMeasurementMultiplierDivisors(endpoint);
|
|
553
|
-
|
|
554
|
-
|
|
555
|
-
|
|
556
|
-
|
|
557
|
-
|
|
558
|
-
|
|
559
|
-
|
|
560
|
-
|
|
561
|
-
|
|
565
|
+
await reporting.activePower(endpoint, {min: 10, max: 305, change: 1}); // divider 1: 1W
|
|
566
|
+
await reporting.rmsCurrent(endpoint, {min: 10, max: 306, change: 100}); // divider 1000: 0.1Arms
|
|
567
|
+
await reporting.rmsVoltage(endpoint, {min: 10, max: 307, change: 5}); // divider 10: 0.5Vrms
|
|
568
|
+
|
|
569
|
+
const thermostatDate = new Date();
|
|
570
|
+
const thermostatTimeSec = thermostatDate.getTime() / 1000;
|
|
571
|
+
const thermostatTimezoneOffsetSec = thermostatDate.getTimezoneOffset() * 60;
|
|
572
|
+
const currentTimeToDisplay = Math.round(thermostatTimeSec - thermostatTimezoneOffsetSec - 946684800);
|
|
573
|
+
await endpoint.write('manuSpecificSinope', {currentTimeToDisplay}, {manufacturerCode: 0x119C});
|
|
562
574
|
|
|
563
575
|
await reporting.temperature(endpoint, {min: 1, max: 0xFFFF}); // Disable default reporting
|
|
576
|
+
try {
|
|
577
|
+
await reporting.thermostatRunningState(endpoint);
|
|
578
|
+
} catch (error) {/* Do nothing */} // Not enought space
|
|
564
579
|
},
|
|
565
580
|
},
|
|
566
581
|
{
|
|
@@ -573,22 +588,21 @@ module.exports = [
|
|
|
573
588
|
fz.electrical_measurement, fz.metering, fz.ignore_temperature_report, fzLocal.sinope_TH1300ZB_specific],
|
|
574
589
|
toZigbee: [tz.thermostat_local_temperature, tz.thermostat_occupied_heating_setpoint, tz.thermostat_unoccupied_heating_setpoint,
|
|
575
590
|
tz.thermostat_temperature_display_mode, tz.thermostat_keypad_lockout, tz.thermostat_system_mode,
|
|
576
|
-
|
|
577
|
-
tzLocal.
|
|
578
|
-
tzLocal.
|
|
579
|
-
tzLocal.
|
|
580
|
-
tzLocal.sinope_temperature_sensor],
|
|
591
|
+
tzLocal.sinope_thermostat_backlight_autodim_param, tzLocal.sinope_thermostat_time, tzLocal.sinope_time_format,
|
|
592
|
+
tzLocal.sinope_thermostat_enable_outdoor_temperature, tzLocal.sinope_thermostat_outdoor_temperature,
|
|
593
|
+
tzLocal.sinope_thermostat_occupancy, tzLocal.sinope_floor_control_mode, tzLocal.sinope_ambiant_max_heat_setpoint,
|
|
594
|
+
tzLocal.sinope_floor_min_heat_setpoint, tzLocal.sinope_floor_max_heat_setpoint, tzLocal.sinope_temperature_sensor],
|
|
581
595
|
exposes: [
|
|
582
596
|
exposes.climate()
|
|
583
|
-
.withSetpoint('occupied_heating_setpoint', 5,
|
|
584
|
-
.withSetpoint('unoccupied_heating_setpoint', 5,
|
|
597
|
+
.withSetpoint('occupied_heating_setpoint', 5, 36, 0.5)
|
|
598
|
+
.withSetpoint('unoccupied_heating_setpoint', 5, 36, 0.5)
|
|
585
599
|
.withLocalTemperature()
|
|
586
600
|
.withSystemMode(['off', 'heat'], ea.ALL, 'Mode of the thermostat')
|
|
587
|
-
.withPiHeatingDemand(
|
|
588
|
-
.withRunningState(['idle', 'heat']),
|
|
601
|
+
.withPiHeatingDemand()
|
|
602
|
+
.withRunningState(['idle', 'heat'], ea.STATE),
|
|
589
603
|
exposes.enum('thermostat_occupancy', ea.ALL, ['unoccupied', 'occupied'])
|
|
590
604
|
.withDescription('Occupancy state of the thermostat'),
|
|
591
|
-
exposes.enum('backlight_auto_dim', ea.ALL, ['
|
|
605
|
+
exposes.enum('backlight_auto_dim', ea.ALL, ['on_demand', 'sensing'])
|
|
592
606
|
.withDescription('Control backlight dimming behavior'),
|
|
593
607
|
exposes.enum('keypad_lockout', ea.ALL, ['unlock', 'lock1'])
|
|
594
608
|
.withDescription('Enables or disables the device’s buttons'),
|
|
@@ -653,7 +667,7 @@ module.exports = [
|
|
|
653
667
|
tzLocal.sinope_thermostat_main_cycle_output, tzLocal.sinope_thermostat_aux_cycle_output, tzLocal.sinope_pump_protection],
|
|
654
668
|
exposes: [
|
|
655
669
|
exposes.climate()
|
|
656
|
-
.withSetpoint('occupied_heating_setpoint', 5, 36,
|
|
670
|
+
.withSetpoint('occupied_heating_setpoint', 5, 36, 0.5)
|
|
657
671
|
.withLocalTemperature()
|
|
658
672
|
.withSystemMode(['off', 'heat'])
|
|
659
673
|
.withRunningState(['idle', 'heat'])
|
|
@@ -742,20 +756,20 @@ module.exports = [
|
|
|
742
756
|
fromZigbee: [fz.legacy.thermostat_att_report],
|
|
743
757
|
toZigbee: [tz.thermostat_local_temperature, tz.thermostat_occupied_heating_setpoint, tz.thermostat_unoccupied_heating_setpoint,
|
|
744
758
|
tz.thermostat_temperature_display_mode, tz.thermostat_keypad_lockout, tz.thermostat_system_mode,
|
|
745
|
-
|
|
746
|
-
tzLocal.
|
|
747
|
-
tzLocal.
|
|
759
|
+
tzLocal.sinope_thermostat_backlight_autodim_param, tzLocal.sinope_thermostat_time, tzLocal.sinope_time_format,
|
|
760
|
+
tzLocal.sinope_thermostat_enable_outdoor_temperature, tzLocal.sinope_thermostat_outdoor_temperature,
|
|
761
|
+
tzLocal.sinope_thermostat_occupancy],
|
|
748
762
|
exposes: [
|
|
749
763
|
exposes.climate()
|
|
750
764
|
.withSetpoint('occupied_heating_setpoint', 5, 30, 0.5)
|
|
751
765
|
.withSetpoint('unoccupied_heating_setpoint', 5, 30, 0.5)
|
|
752
766
|
.withLocalTemperature()
|
|
753
767
|
.withSystemMode(['off', 'heat'], ea.ALL, 'Mode of the thermostat')
|
|
754
|
-
.withPiHeatingDemand(
|
|
755
|
-
.withRunningState(['idle', 'heat']),
|
|
768
|
+
.withPiHeatingDemand()
|
|
769
|
+
.withRunningState(['idle', 'heat'], ea.STATE),
|
|
756
770
|
exposes.enum('thermostat_occupancy', ea.ALL, ['unoccupied', 'occupied'])
|
|
757
771
|
.withDescription('Occupancy state of the thermostat'),
|
|
758
|
-
exposes.enum('backlight_auto_dim', ea.ALL, ['
|
|
772
|
+
exposes.enum('backlight_auto_dim', ea.ALL, ['on_demand', 'sensing'])
|
|
759
773
|
.withDescription('Control backlight dimming behavior'),
|
|
760
774
|
exposes.enum('keypad_lockout', ea.ALL, ['unlock', 'lock1'])
|
|
761
775
|
.withDescription('Enables or disables the device’s buttons'),
|
package/devices/siterwell.js
CHANGED
|
@@ -34,9 +34,11 @@ module.exports = [
|
|
|
34
34
|
{vendor: 'Nedis', description: 'Thermostatic Radiator Valve Controller', model: 'ZBHTR10WT'},
|
|
35
35
|
{vendor: 'TCP Smart', description: 'Smart Thermostatic Radiator Valve', model: 'TBUWTRV'},
|
|
36
36
|
{vendor: 'Brennenstuhl', description: 'Radiator Thermostat', model: 'HT CZ 01'}],
|
|
37
|
-
exposes: [e.child_lock(), e.window_detection(), e.battery(), e.valve_detection(),
|
|
38
|
-
.
|
|
39
|
-
.
|
|
40
|
-
|
|
37
|
+
exposes: [e.child_lock(), e.window_detection(), e.battery(), e.valve_detection(),
|
|
38
|
+
e.position().withDescription('TRV valve position in %.'),
|
|
39
|
+
exposes.climate()
|
|
40
|
+
.withSetpoint('current_heating_setpoint', 5, 30, 0.5, ea.STATE_SET).withLocalTemperature(ea.STATE)
|
|
41
|
+
.withSystemMode(['off', 'auto', 'heat'], ea.STATE_SET)
|
|
42
|
+
.withRunningState(['idle', 'heat'], ea.STATE)],
|
|
41
43
|
},
|
|
42
44
|
];
|
package/devices/smartthings.js
CHANGED
|
@@ -393,12 +393,11 @@ module.exports = [
|
|
|
393
393
|
description: 'Water leak sensor (2018 model)',
|
|
394
394
|
fromZigbee: [fz.temperature, fz.ias_water_leak_alarm_1, fz.battery, fz.ias_water_leak_alarm_1_report],
|
|
395
395
|
toZigbee: [],
|
|
396
|
-
meta: {battery: {voltageToPercentage: '3V_2500'}},
|
|
397
396
|
configure: async (device, coordinatorEndpoint, logger) => {
|
|
398
397
|
const endpoint = device.getEndpoint(1);
|
|
399
398
|
await reporting.bind(endpoint, coordinatorEndpoint, ['msTemperatureMeasurement', 'genPowerCfg']);
|
|
400
399
|
await reporting.temperature(endpoint);
|
|
401
|
-
await reporting.
|
|
400
|
+
await reporting.batteryPercentageRemaining(endpoint);
|
|
402
401
|
},
|
|
403
402
|
exposes: [e.temperature(), e.water_leak(), e.battery_low(), e.tamper(), e.battery()],
|
|
404
403
|
},
|
package/devices/third_reality.js
CHANGED
|
@@ -102,12 +102,17 @@ module.exports = [
|
|
|
102
102
|
model: '3RSP019BZ',
|
|
103
103
|
vendor: 'Third Reality',
|
|
104
104
|
description: 'Zigbee / BLE smart plug',
|
|
105
|
-
|
|
105
|
+
fromZigbee: [fz.on_off, fz.electrical_measurement],
|
|
106
|
+
toZigbee: [tz.on_off],
|
|
106
107
|
ota: ota.zigbeeOTA,
|
|
108
|
+
exposes: [e.switch(), e.power(), e.current(), e.voltage()],
|
|
107
109
|
configure: async (device, coordinatorEndpoint, logger) => {
|
|
108
110
|
const endpoint = device.getEndpoint(1);
|
|
109
|
-
await reporting.bind(endpoint, coordinatorEndpoint, ['genOnOff']);
|
|
111
|
+
await reporting.bind(endpoint, coordinatorEndpoint, ['genOnOff', 'haElectricalMeasurement']);
|
|
110
112
|
await reporting.onOff(endpoint);
|
|
113
|
+
await reporting.activePower(endpoint);
|
|
114
|
+
await reporting.rmsCurrent(endpoint);
|
|
115
|
+
await reporting.rmsVoltage(endpoint);
|
|
111
116
|
},
|
|
112
117
|
},
|
|
113
118
|
{
|
package/devices/tuya.js
CHANGED
|
@@ -2088,7 +2088,6 @@ module.exports = [
|
|
|
2088
2088
|
'_TZE200_mudxchsu', /* model: 'TV05-ZG curve', vendor: 'TuYa' */
|
|
2089
2089
|
'_TZE200_7yoranx2', /* model: 'TV01-ZB', vendor: 'Moes' */
|
|
2090
2090
|
'_TZE200_kds0pmmv', /* model: 'TV01-ZB', vendor: 'Moes' */
|
|
2091
|
-
'_TZE200_bvu2wnxz', /* model: 'ME167', vendor: 'Avatto' */
|
|
2092
2091
|
]),
|
|
2093
2092
|
model: 'TV02-Zigbee',
|
|
2094
2093
|
vendor: 'TuYa',
|
|
@@ -2157,7 +2156,7 @@ module.exports = [
|
|
|
2157
2156
|
[10, 'frost_protection', tuya.valueConverter.onOff],
|
|
2158
2157
|
[16, 'current_heating_setpoint', tuya.valueConverter.divideBy10],
|
|
2159
2158
|
[24, 'local_temperature', tuya.valueConverter.divideBy10],
|
|
2160
|
-
[27, 'local_temperature_calibration', tuya.valueConverter.
|
|
2159
|
+
[27, 'local_temperature_calibration', tuya.valueConverter.localTempCalibration1],
|
|
2161
2160
|
[31, 'working_day', tuya.valueConverterBasic.lookup({'mon_sun': tuya.enum(0), 'mon_fri+sat+sun': tuya.enum(1),
|
|
2162
2161
|
'separate': tuya.enum(2)})],
|
|
2163
2162
|
[32, 'holiday_temperature', tuya.valueConverter.divideBy10],
|
|
@@ -2207,7 +2206,7 @@ module.exports = [
|
|
|
2207
2206
|
[10, 'frost_protection', tuya.valueConverter.onOff],
|
|
2208
2207
|
[16, 'current_heating_setpoint', tuya.valueConverter.divideBy10],
|
|
2209
2208
|
[24, 'local_temperature', tuya.valueConverter.divideBy10],
|
|
2210
|
-
[27, 'local_temperature_calibration', tuya.valueConverter.
|
|
2209
|
+
[27, 'local_temperature_calibration', tuya.valueConverter.localTempCalibration1],
|
|
2211
2210
|
[35, 'battery_low', tuya.valueConverter.true0ElseFalse],
|
|
2212
2211
|
[40, 'child_lock', tuya.valueConverter.lockUnlock],
|
|
2213
2212
|
[45, 'error_status', tuya.valueConverter.raw],
|
|
@@ -2231,6 +2230,49 @@ module.exports = [
|
|
|
2231
2230
|
...tuya.exposes.scheduleAllDays(ea.STATE_SET, 'HH:MM/C HH:MM/C HH:MM/C HH:MM/C'),
|
|
2232
2231
|
],
|
|
2233
2232
|
},
|
|
2233
|
+
{
|
|
2234
|
+
fingerprint: tuya.fingerprint('TS0601', [
|
|
2235
|
+
'_TZE200_bvu2wnxz', /* model: 'ME167', vendor: 'Avatto' */
|
|
2236
|
+
]),
|
|
2237
|
+
model: 'TS0601_thermostat_3',
|
|
2238
|
+
vendor: 'TuYa',
|
|
2239
|
+
description: 'Thermostatic radiator valve',
|
|
2240
|
+
fromZigbee: [tuya.fzDataPoints],
|
|
2241
|
+
toZigbee: [tuya.tzDataPoints],
|
|
2242
|
+
whiteLabel: [{vendor: 'Avatto', model: 'ME167'}],
|
|
2243
|
+
onEvent: tuya.onEventSetTime,
|
|
2244
|
+
configure: tuya.configureMagicPacket,
|
|
2245
|
+
exposes: [
|
|
2246
|
+
e.child_lock(), e.battery_low(),
|
|
2247
|
+
exposes.climate()
|
|
2248
|
+
.withSetpoint('current_heating_setpoint', 5, 35, 1, ea.STATE_SET)
|
|
2249
|
+
.withLocalTemperature(ea.STATE)
|
|
2250
|
+
.withSystemMode(['auto', 'heat', 'off'], ea.STATE_SET)
|
|
2251
|
+
.withRunningState(['idle', 'heat'], ea.STATE)
|
|
2252
|
+
.withLocalTemperatureCalibration(-3, 3, 1, ea.STATE_SET),
|
|
2253
|
+
exposes.binary('scale_protection', ea.STATE_SET, 'ON', 'OFF').withDescription('If the heat sink is not fully opened within ' +
|
|
2254
|
+
'two weeks or is not used for a long time, the valve will be blocked due to silting up and the heat sink will not be ' +
|
|
2255
|
+
'able to be used. To ensure normal use of the heat sink, the controller will automatically open the valve fully every ' +
|
|
2256
|
+
'two weeks. It will run for 30 seconds per time with the screen displaying "Ad", then return to its normal working state ' +
|
|
2257
|
+
'again.'),
|
|
2258
|
+
exposes.binary('frost_protection', ea.STATE_SET, 'ON', 'OFF').withDescription('When the room temperature is lower than ' +
|
|
2259
|
+
'5 °C, the valve opens; when the temperature rises to 8 °C, the valve closes.'),
|
|
2260
|
+
exposes.numeric('error', ea.STATE).withDescription('If NTC is damaged, "Er" will be on the TRV display.'),
|
|
2261
|
+
],
|
|
2262
|
+
meta: {
|
|
2263
|
+
tuyaDatapoints: [
|
|
2264
|
+
[2, 'system_mode', tuya.valueConverterBasic.lookup({'auto': tuya.enum(0), 'heat': tuya.enum(1), 'off': tuya.enum(2)})],
|
|
2265
|
+
[3, 'running_state', tuya.valueConverterBasic.lookup({'heat': tuya.enum(0), 'idle': tuya.enum(1)})],
|
|
2266
|
+
[4, 'current_heating_setpoint', tuya.valueConverter.divideBy10],
|
|
2267
|
+
[5, 'local_temperature', tuya.valueConverter.divideBy10],
|
|
2268
|
+
[7, 'child_lock', tuya.valueConverter.lockUnlock],
|
|
2269
|
+
[35, null, tuya.valueConverter.errorOrBatteryLow],
|
|
2270
|
+
[36, 'frost_protection', tuya.valueConverter.onOff],
|
|
2271
|
+
[39, 'scale_protection', tuya.valueConverter.onOff],
|
|
2272
|
+
[47, 'local_temperature_calibration', tuya.valueConverter.localTempCalibration2],
|
|
2273
|
+
],
|
|
2274
|
+
},
|
|
2275
|
+
},
|
|
2234
2276
|
{
|
|
2235
2277
|
fingerprint: [
|
|
2236
2278
|
{modelID: 'v90ladg\u0000', manufacturerName: '_TYST11_wv90ladg'},
|
|
@@ -2782,10 +2824,8 @@ module.exports = [
|
|
|
2782
2824
|
},
|
|
2783
2825
|
},
|
|
2784
2826
|
{
|
|
2785
|
-
fingerprint:
|
|
2786
|
-
|
|
2787
|
-
{modelID: 'TS0014', manufacturerName: '_TZ3000_r0pmi2p3'}, {modelID: 'TS0014', manufacturerName: '_TZ3000_fxjdcikv'},
|
|
2788
|
-
{modelID: 'TS0014', manufacturerName: '_TZ3000_q6vxaod1'}],
|
|
2827
|
+
fingerprint: tuya.fingerprint('TS0014', ['_TZ3000_jr2atpww', '_TYZB01_dvakyzhd',
|
|
2828
|
+
'_TZ3210_w3hl6rao', '_TYZB01_bagt1e4o', '_TZ3000_r0pmi2p3', '_TZ3000_fxjdcikv', '_TZ3000_q6vxaod1']),
|
|
2789
2829
|
model: 'TS0014',
|
|
2790
2830
|
vendor: 'TuYa',
|
|
2791
2831
|
description: 'Smart light switch - 4 gang without neutral wire',
|
|
@@ -3211,7 +3251,7 @@ module.exports = [
|
|
|
3211
3251
|
model: 'TS0046',
|
|
3212
3252
|
vendor: 'TuYa',
|
|
3213
3253
|
description: 'Wireless switch with 6 buttons',
|
|
3214
|
-
whiteLabel: [{vendor: 'LoraTap', model: '
|
|
3254
|
+
whiteLabel: [{vendor: 'LoraTap', model: 'SS9600ZB'}],
|
|
3215
3255
|
fromZigbee: [fz.tuya_on_off_action, fz.battery],
|
|
3216
3256
|
exposes: [e.battery(), e.action(['1_single', '1_double', '1_hold', '2_single', '2_double', '2_hold',
|
|
3217
3257
|
'3_single', '3_double', '3_hold', '4_single', '4_double', '4_hold',
|
package/devices/wyze.js
ADDED
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
const exposes = require('../lib/exposes');
|
|
2
|
+
const fz = require('../converters/fromZigbee');
|
|
3
|
+
const tz = require('../converters/toZigbee');
|
|
4
|
+
const reporting = require('../lib/reporting');
|
|
5
|
+
const e = exposes.presets;
|
|
6
|
+
|
|
7
|
+
module.exports = [
|
|
8
|
+
{
|
|
9
|
+
zigbeeModel: ['Ford'],
|
|
10
|
+
model: 'WLCKG1',
|
|
11
|
+
vendor: 'Wyze',
|
|
12
|
+
description: 'Lock',
|
|
13
|
+
fromZigbee: [fz.lock, fz.lock_operation_event, fz.battery],
|
|
14
|
+
toZigbee: [tz.lock],
|
|
15
|
+
configure: async (device, coordinatorEndpoint, logger) => {
|
|
16
|
+
const endpoint = device.endpoints[0];
|
|
17
|
+
await reporting.bind(endpoint, coordinatorEndpoint, ['closuresDoorLock', 'genPowerCfg']);
|
|
18
|
+
await reporting.lockState(endpoint);
|
|
19
|
+
await reporting.batteryPercentageRemaining(endpoint);
|
|
20
|
+
},
|
|
21
|
+
exposes: [e.lock(), e.battery()],
|
|
22
|
+
},
|
|
23
|
+
];
|
package/lib/tuya.js
CHANGED
|
@@ -1254,6 +1254,13 @@ const valueConverter = {
|
|
|
1254
1254
|
divideBy10: valueConverterBasic.divideBy(10),
|
|
1255
1255
|
divideBy1000: valueConverterBasic.divideBy(1000),
|
|
1256
1256
|
raw: valueConverterBasic.raw(),
|
|
1257
|
+
static: (value) => {
|
|
1258
|
+
return {
|
|
1259
|
+
from: (v) => {
|
|
1260
|
+
return value;
|
|
1261
|
+
},
|
|
1262
|
+
};
|
|
1263
|
+
},
|
|
1257
1264
|
phaseVariant1: {
|
|
1258
1265
|
from: (v) => {
|
|
1259
1266
|
const buffer = Buffer.from(v, 'base64');
|
|
@@ -1295,7 +1302,7 @@ const valueConverter = {
|
|
|
1295
1302
|
true0ElseFalse: {from: (v) => v === 0},
|
|
1296
1303
|
selfTestResult: valueConverterBasic.lookup({'checking': 0, 'success': 1, 'failure': 2, 'others': 3}),
|
|
1297
1304
|
lockUnlock: valueConverterBasic.lookup({'LOCK': true, 'UNLOCK': false}),
|
|
1298
|
-
|
|
1305
|
+
localTempCalibration1: {
|
|
1299
1306
|
from: (v) => {
|
|
1300
1307
|
if (v > 55) v -= 0x100000000;
|
|
1301
1308
|
return v / 10;
|
|
@@ -1306,6 +1313,13 @@ const valueConverter = {
|
|
|
1306
1313
|
return v;
|
|
1307
1314
|
},
|
|
1308
1315
|
},
|
|
1316
|
+
localTempCalibration2: {
|
|
1317
|
+
from: (v) => v,
|
|
1318
|
+
to: (v) => {
|
|
1319
|
+
if (v < 0) return v + 0x100000000;
|
|
1320
|
+
return v;
|
|
1321
|
+
},
|
|
1322
|
+
},
|
|
1309
1323
|
thermostatHolidayStartStop: {
|
|
1310
1324
|
from: (v) => {
|
|
1311
1325
|
const start = {
|
|
@@ -1462,6 +1476,13 @@ const valueConverter = {
|
|
|
1462
1476
|
},
|
|
1463
1477
|
inverse: {to: (v) => !v, from: (v) => !v},
|
|
1464
1478
|
onOffNotStrict: {from: (v) => v ? 'ON' : 'OFF', to: (v) => v === 'ON'},
|
|
1479
|
+
errorOrBatteryLow: {
|
|
1480
|
+
from: (v) => {
|
|
1481
|
+
if (v === 0) return {'battery_low': false};
|
|
1482
|
+
if (v === 1) return {'battery_low': true};
|
|
1483
|
+
return {'error': v};
|
|
1484
|
+
},
|
|
1485
|
+
},
|
|
1465
1486
|
};
|
|
1466
1487
|
|
|
1467
1488
|
const tuyaTz = {
|
|
@@ -1521,6 +1542,7 @@ const tuyaTz = {
|
|
|
1521
1542
|
'holiday_start_stop', 'holiday_temperature', 'comfort_temperature', 'eco_temperature', 'working_day',
|
|
1522
1543
|
'week_schedule_programming', 'online', 'holiday_mode_date', 'schedule', 'schedule_monday', 'schedule_tuesday',
|
|
1523
1544
|
'schedule_wednesday', 'schedule_thursday', 'schedule_friday', 'schedule_saturday', 'schedule_sunday', 'clear_fault',
|
|
1545
|
+
'scale_protection', 'error',
|
|
1524
1546
|
],
|
|
1525
1547
|
convertSet: async (entity, key, value, meta) => {
|
|
1526
1548
|
// A set converter is only called once; therefore we need to loop
|