zigbee-herdsman-converters 14.0.639 → 14.0.641
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/converters/toZigbee.js +1 -3
- package/devices/develco.js +68 -1
- package/devices/keen_home.js +1 -1
- package/devices/m/303/274ller_licht.js +3 -2
- package/devices/namron.js +1 -1
- package/devices/perenio.js +4 -0
- package/devices/philips.js +2 -2
- package/devices/third_reality.js +9 -0
- package/devices/tuya.js +34 -3
- package/devices/xiaomi.js +123 -14
- package/lib/tuya.js +5 -5
- package/package.json +3 -3
package/converters/fromZigbee.js
CHANGED
|
@@ -7039,7 +7039,7 @@ const converters = {
|
|
|
7039
7039
|
type: ['attributeReport', 'readResponse'],
|
|
7040
7040
|
convert: (model, msg, publish, options, meta) => {
|
|
7041
7041
|
if (msg.data.hasOwnProperty('48')) {
|
|
7042
|
-
const lookup = ['low', 'medium', 'high'];
|
|
7042
|
+
const lookup = ['low', 'medium', 'high', 'very_high', 'max'];
|
|
7043
7043
|
return {motion_sensitivity: lookup[msg.data['48']]};
|
|
7044
7044
|
}
|
|
7045
7045
|
},
|
package/converters/toZigbee.js
CHANGED
|
@@ -2106,10 +2106,8 @@ const converters = {
|
|
|
2106
2106
|
// motion detect sensitivity, philips specific
|
|
2107
2107
|
key: ['motion_sensitivity'],
|
|
2108
2108
|
convertSet: async (entity, key, value, meta) => {
|
|
2109
|
-
// hue_sml:
|
|
2110
|
-
// 0: low, 1: medium, 2: high (default)
|
|
2111
2109
|
// make sure you write to second endpoint!
|
|
2112
|
-
const lookup = {'low': 0, 'medium': 1, 'high': 2};
|
|
2110
|
+
const lookup = {'low': 0, 'medium': 1, 'high': 2, 'very_high': 3, 'max': 4};
|
|
2113
2111
|
value = value.toLowerCase();
|
|
2114
2112
|
utils.validateValue(value, Object.keys(lookup));
|
|
2115
2113
|
|
package/devices/develco.js
CHANGED
|
@@ -190,6 +190,18 @@ const develco = {
|
|
|
190
190
|
return state;
|
|
191
191
|
},
|
|
192
192
|
},
|
|
193
|
+
input: {
|
|
194
|
+
cluster: 'genBinaryInput',
|
|
195
|
+
type: ['attributeReport', 'readResponse'],
|
|
196
|
+
convert: (model, msg, publish, options, meta) => {
|
|
197
|
+
const result = {};
|
|
198
|
+
if (msg.data.hasOwnProperty('presentValue')) {
|
|
199
|
+
const value = msg.data['presentValue'];
|
|
200
|
+
result[utils.postfixWithEndpointName('input', msg, model, meta)] = value == 1;
|
|
201
|
+
}
|
|
202
|
+
return result;
|
|
203
|
+
},
|
|
204
|
+
},
|
|
193
205
|
},
|
|
194
206
|
tz: {
|
|
195
207
|
pulse_configuration: {
|
|
@@ -246,6 +258,12 @@ const develco = {
|
|
|
246
258
|
await entity.read('ssIasZone', ['develcoAlarmOffDelay'], manufacturerOptions);
|
|
247
259
|
},
|
|
248
260
|
},
|
|
261
|
+
input: {
|
|
262
|
+
key: ['input'],
|
|
263
|
+
convertGet: async (entity, key, meta) => {
|
|
264
|
+
await entity.read('genBinaryInput', ['presentValue']);
|
|
265
|
+
},
|
|
266
|
+
},
|
|
249
267
|
},
|
|
250
268
|
};
|
|
251
269
|
|
|
@@ -655,7 +673,7 @@ module.exports = [
|
|
|
655
673
|
{
|
|
656
674
|
zigbeeModel: ['SIRZB-110'],
|
|
657
675
|
model: 'SIRZB-110',
|
|
658
|
-
vendor: 'Develco
|
|
676
|
+
vendor: 'Develco',
|
|
659
677
|
description: 'Customizable siren',
|
|
660
678
|
fromZigbee: [fz.temperature, fz.battery, fz.ias_enroll, fz.ias_wd, develco.fz.firmware_version, fz.ias_siren],
|
|
661
679
|
toZigbee: [tz.warning, tz.warning_simple, tz.ias_max_duration, tz.squawk],
|
|
@@ -718,4 +736,53 @@ module.exports = [
|
|
|
718
736
|
}
|
|
719
737
|
},
|
|
720
738
|
},
|
|
739
|
+
{
|
|
740
|
+
zigbeeModel: ['IOMZB-110'],
|
|
741
|
+
model: 'IOMZB-110',
|
|
742
|
+
vendor: 'Develco',
|
|
743
|
+
description: 'IO module',
|
|
744
|
+
fromZigbee: [fz.on_off, develco.fz.input, develco.fz.firmware_version],
|
|
745
|
+
toZigbee: [tz.on_off, develco.tz.input],
|
|
746
|
+
meta: {multiEndpoint: true},
|
|
747
|
+
exposes: [
|
|
748
|
+
exposes.binary('input', ea.STATE_GET, true, false).withEndpoint('l1').withDescription('State of input 1'),
|
|
749
|
+
exposes.binary('input', ea.STATE_GET, true, false).withEndpoint('l2').withDescription('State of input 2'),
|
|
750
|
+
exposes.binary('input', ea.STATE_GET, true, false).withEndpoint('l3').withDescription('State of input 3'),
|
|
751
|
+
exposes.binary('input', ea.STATE_GET, true, false).withEndpoint('l4').withDescription('State of input 4'),
|
|
752
|
+
exposes.switch().withState('state', true, 'On/off state of switch 1').withEndpoint('l11'),
|
|
753
|
+
exposes.switch().withState('state', true, 'On/off state of switch 2').withEndpoint('l12'),
|
|
754
|
+
],
|
|
755
|
+
configure: async (device, coordinatorEndpoint, logger) => {
|
|
756
|
+
const options = {manufacturerCode: 4117};
|
|
757
|
+
|
|
758
|
+
const ep2 = device.getEndpoint(112);
|
|
759
|
+
await reporting.bind(ep2, coordinatorEndpoint, ['genBinaryInput', 'genBasic']);
|
|
760
|
+
await reporting.presentValue(ep2, {min: 0});
|
|
761
|
+
await ep2.read('genBasic', [0x8000, 0x8010, 0x8020], options);
|
|
762
|
+
|
|
763
|
+
const ep3 = device.getEndpoint(113);
|
|
764
|
+
await reporting.bind(ep3, coordinatorEndpoint, ['genBinaryInput']);
|
|
765
|
+
await reporting.presentValue(ep3, {min: 0});
|
|
766
|
+
|
|
767
|
+
const ep4 = device.getEndpoint(114);
|
|
768
|
+
await reporting.bind(ep4, coordinatorEndpoint, ['genBinaryInput']);
|
|
769
|
+
await reporting.presentValue(ep4, {min: 0});
|
|
770
|
+
|
|
771
|
+
const ep5 = device.getEndpoint(115);
|
|
772
|
+
await reporting.bind(ep5, coordinatorEndpoint, ['genBinaryInput']);
|
|
773
|
+
await reporting.presentValue(ep5, {min: 0});
|
|
774
|
+
|
|
775
|
+
const ep6 = device.getEndpoint(116);
|
|
776
|
+
await reporting.bind(ep6, coordinatorEndpoint, ['genOnOff', 'genBinaryInput']);
|
|
777
|
+
await reporting.onOff(ep6);
|
|
778
|
+
|
|
779
|
+
const ep7 = device.getEndpoint(117);
|
|
780
|
+
await reporting.bind(ep7, coordinatorEndpoint, ['genOnOff']);
|
|
781
|
+
await reporting.onOff(ep7);
|
|
782
|
+
},
|
|
783
|
+
|
|
784
|
+
endpoint: (device) => {
|
|
785
|
+
return {'l1': 112, 'l2': 113, 'l3': 114, 'l4': 115, 'l11': 116, 'l12': 117};
|
|
786
|
+
},
|
|
787
|
+
},
|
|
721
788
|
];
|
package/devices/keen_home.js
CHANGED
|
@@ -42,7 +42,7 @@ module.exports = [
|
|
|
42
42
|
},
|
|
43
43
|
{
|
|
44
44
|
zigbeeModel: ['SV02-410-MP-1.3', 'SV02-412-MP-1.3', 'SV02-610-MP-1.3', 'SV02-612-MP-1.2', 'SV02-612-MP-1.3', 'SV02-410-MP-1.0',
|
|
45
|
-
'SV02-410-MP-1.2'],
|
|
45
|
+
'SV02-410-MP-1.2', 'SV02-412-MP-1.2'],
|
|
46
46
|
model: 'SV02',
|
|
47
47
|
vendor: 'Keen Home',
|
|
48
48
|
description: 'Smart vent',
|
|
@@ -160,9 +160,10 @@ module.exports = [
|
|
|
160
160
|
model: '404022/404049C',
|
|
161
161
|
description: 'Tint dim remote control',
|
|
162
162
|
vendor: 'Müller Licht',
|
|
163
|
-
fromZigbee: [fz.command_on, fz.command_off, fz.command_step, fz.command_move, fz.command_stop, fz.command_move_to_color_temp
|
|
163
|
+
fromZigbee: [fz.command_on, fz.command_off, fz.command_step, fz.command_move, fz.command_stop, fz.command_move_to_color_temp,
|
|
164
|
+
fz.command_move_to_color, fz.tint_scene],
|
|
164
165
|
exposes: [e.action(['on', 'off', 'brightness_step_up', 'brightness_step_down', 'brightness_move_up', 'brightness_move_down',
|
|
165
|
-
'brightness_stop', 'color_temperature_move'])],
|
|
166
|
+
'brightness_stop', 'color_temperature_move', 'color_move', 'scene_1', 'scene_2', 'scene_3', 'scene_4', 'scene_5', 'scene_6'])],
|
|
166
167
|
toZigbee: [],
|
|
167
168
|
configure: async (device, coordinatorEndpoint, logger) => {
|
|
168
169
|
device.powerSource = 'Battery';
|
package/devices/namron.js
CHANGED
|
@@ -588,7 +588,7 @@ module.exports = [
|
|
|
588
588
|
},
|
|
589
589
|
},
|
|
590
590
|
{
|
|
591
|
-
zigbeeModel: ['5401392', '5401396', '5401393', '5401397', '5401394', '5401398', '5401395', '5401399'],
|
|
591
|
+
zigbeeModel: ['5401392', '5401396', '5401393', '5401397', '5401394', '5401398', '5401395', '5401399', '5401395'],
|
|
592
592
|
model: '540139X',
|
|
593
593
|
vendor: 'Namron',
|
|
594
594
|
description: 'Panel heater 400/600/800/1000 W',
|
package/devices/perenio.js
CHANGED
|
@@ -5,6 +5,7 @@ const reporting = require('../lib/reporting');
|
|
|
5
5
|
const utils = require('../lib/utils');
|
|
6
6
|
const e = exposes.presets;
|
|
7
7
|
const ea = exposes.access;
|
|
8
|
+
const ota = require('../lib/ota');
|
|
8
9
|
|
|
9
10
|
const switchTypeValues = [
|
|
10
11
|
'maintained_state',
|
|
@@ -254,6 +255,7 @@ module.exports = [
|
|
|
254
255
|
await reporting.batteryPercentageRemaining(endpoint);
|
|
255
256
|
},
|
|
256
257
|
exposes: [e.water_leak(), e.battery_low(), e.tamper(), e.battery()],
|
|
258
|
+
ota: ota.zigbeeOTA,
|
|
257
259
|
},
|
|
258
260
|
{
|
|
259
261
|
zigbeeModel: ['ZHA-DoorLockSensor'],
|
|
@@ -283,6 +285,7 @@ module.exports = [
|
|
|
283
285
|
await reporting.bind(endpoint, coordinatorEndpoint, ['genPowerCfg']);
|
|
284
286
|
await reporting.batteryPercentageRemaining(endpoint);
|
|
285
287
|
},
|
|
288
|
+
ota: ota.zigbeeOTA,
|
|
286
289
|
},
|
|
287
290
|
{
|
|
288
291
|
zigbeeModel: ['PEHWE20', 'PEHWE2X'],
|
|
@@ -405,6 +408,7 @@ module.exports = [
|
|
|
405
408
|
exposes.numeric('rssi', ea.STATE).withUnit('dB')
|
|
406
409
|
.withDescription('RSSI seen by the device').withValueMin(-128).withValueMax(127),
|
|
407
410
|
],
|
|
411
|
+
ota: ota.zigbeeOTA,
|
|
408
412
|
},
|
|
409
413
|
];
|
|
410
414
|
|
package/devices/philips.js
CHANGED
|
@@ -1988,7 +1988,7 @@ module.exports = [
|
|
|
1988
1988
|
fromZigbee: [fz.battery, fz.occupancy, fz.temperature, fz.occupancy_timeout, fz.illuminance,
|
|
1989
1989
|
fz.hue_motion_sensitivity, fz.hue_motion_led_indication],
|
|
1990
1990
|
exposes: [e.temperature(), e.occupancy(), e.battery(), e.illuminance_lux(), e.illuminance(),
|
|
1991
|
-
exposes.enum('motion_sensitivity', ea.ALL, ['low', 'medium', 'high']),
|
|
1991
|
+
exposes.enum('motion_sensitivity', ea.ALL, ['low', 'medium', 'high', 'very_high', 'max']),
|
|
1992
1992
|
exposes.binary('led_indication', ea.ALL, true, false).withDescription('Blink green LED on motion detection'),
|
|
1993
1993
|
exposes.numeric('occupancy_timeout', ea.ALL).withUnit('second').withValueMin(0).withValueMax(65535)],
|
|
1994
1994
|
toZigbee: [tz.occupancy_timeout, tz.hue_motion_sensitivity, tz.hue_motion_led_indication],
|
|
@@ -2021,7 +2021,7 @@ module.exports = [
|
|
|
2021
2021
|
fromZigbee: [fz.battery, fz.occupancy, fz.temperature, fz.illuminance, fz.occupancy_timeout,
|
|
2022
2022
|
fz.hue_motion_sensitivity, fz.hue_motion_led_indication],
|
|
2023
2023
|
exposes: [e.temperature(), e.occupancy(), e.battery(), e.illuminance_lux(), e.illuminance(),
|
|
2024
|
-
exposes.enum('motion_sensitivity', ea.ALL, ['low', 'medium', 'high']),
|
|
2024
|
+
exposes.enum('motion_sensitivity', ea.ALL, ['low', 'medium', 'high', 'very_high', 'max']),
|
|
2025
2025
|
exposes.binary('led_indication', ea.ALL, true, false).withDescription('Blink green LED on motion detection'),
|
|
2026
2026
|
exposes.numeric('occupancy_timeout', ea.ALL).withUnit('second').withValueMin(0).withValueMax(65535)],
|
|
2027
2027
|
toZigbee: [tz.occupancy_timeout, tz.hue_motion_sensitivity, tz.hue_motion_led_indication],
|
package/devices/third_reality.js
CHANGED
|
@@ -136,4 +136,13 @@ module.exports = [
|
|
|
136
136
|
device.save();
|
|
137
137
|
},
|
|
138
138
|
},
|
|
139
|
+
{
|
|
140
|
+
zigbeeModel: ['3RTHS24BZ'],
|
|
141
|
+
model: '3RTHS24BZ',
|
|
142
|
+
vendor: 'Third Reality',
|
|
143
|
+
description: 'Temperature and humidity sensor',
|
|
144
|
+
fromZigbee: [fz.battery, fz.temperature, fz.humidity],
|
|
145
|
+
toZigbee: [],
|
|
146
|
+
exposes: [e.battery(), e.temperature(), e.humidity(), e.battery_voltage()],
|
|
147
|
+
},
|
|
139
148
|
];
|
package/devices/tuya.js
CHANGED
|
@@ -21,7 +21,7 @@ const TS011Fplugs = ['_TZ3000_5f43h46b', '_TZ3000_cphmq0q7', '_TZ3000_dpo1ysak',
|
|
|
21
21
|
'_TZ3000_1h2x4akh', '_TZ3000_9vo5icau', '_TZ3000_cehuw1lw', '_TZ3000_ko6v90pg', '_TZ3000_f1bapcit', '_TZ3000_cjrngdr3',
|
|
22
22
|
'_TZ3000_zloso4jk', '_TZ3000_r6buo8ba', '_TZ3000_iksasdbv', '_TZ3000_idrffznf', '_TZ3000_okaz9tjs', '_TZ3210_q7oryllx',
|
|
23
23
|
'_TZ3000_ss98ec5d', '_TZ3000_gznh2xla', '_TZ3000_hdopuwv6', '_TZ3000_gvn91tmx', '_TZ3000_dksbtrzs', '_TZ3000_b28wrpvx',
|
|
24
|
-
'_TZ3000_aim0ztek', '_TZ3000_mlswgkc3', '_TZ3000_7dndcnnb', '_TZ3000_waho4jtj', '_TZ3000_nmsciidq'];
|
|
24
|
+
'_TZ3000_aim0ztek', '_TZ3000_mlswgkc3', '_TZ3000_7dndcnnb', '_TZ3000_waho4jtj', '_TZ3000_nmsciidq', '_TZ3000_jtgxgmks'];
|
|
25
25
|
|
|
26
26
|
const tzLocal = {
|
|
27
27
|
SA12IZL_silence_siren: {
|
|
@@ -890,6 +890,7 @@ module.exports = [
|
|
|
890
890
|
{modelID: 'TS0505B', manufacturerName: '_TZ3210_it1u8ahz'},
|
|
891
891
|
{modelID: 'TS0505B', manufacturerName: '_TZ3210_k1pe6ibm'},
|
|
892
892
|
{modelID: 'TS0505B', manufacturerName: '_TZB210_1ecortg6'},
|
|
893
|
+
{modelID: 'TS0505B', manufacturerName: '_TZ3210_e020aaaj'},
|
|
893
894
|
{modelID: 'TS0505B', manufacturerName: '_TZ3210_bfwvfyx1'},
|
|
894
895
|
{modelID: 'TS0505B', manufacturerName: '_TZ3210_leyz4rju'},
|
|
895
896
|
{modelID: 'TS0505B', manufacturerName: '_TZ3210_jd3z4yig'},
|
|
@@ -1173,7 +1174,8 @@ module.exports = [
|
|
|
1173
1174
|
fromZigbee: [tuya.fzDataPoints],
|
|
1174
1175
|
toZigbee: [tuya.tzDataPoints],
|
|
1175
1176
|
configure: tuya.configureMagicPacket,
|
|
1176
|
-
exposes: [tuya.exposes.lightBrightnessWithMinMax, tuya.exposes.powerOnBehavior,
|
|
1177
|
+
exposes: [tuya.exposes.lightBrightnessWithMinMax(), tuya.exposes.powerOnBehavior(),
|
|
1178
|
+
tuya.exposes.countdown(), tuya.exposes.lightType()],
|
|
1177
1179
|
meta: {
|
|
1178
1180
|
tuyaDatapoints: [
|
|
1179
1181
|
[1, 'state', tuya.valueConverter.onOff, {skip: tuya.skip.stateOnAndBrightnessPresent}],
|
|
@@ -1294,6 +1296,35 @@ module.exports = [
|
|
|
1294
1296
|
return {'l1': 1, 'l2': 1, 'l3': 1, 'l4': 1};
|
|
1295
1297
|
},
|
|
1296
1298
|
},
|
|
1299
|
+
{
|
|
1300
|
+
fingerprint: tuya.fingerprint('TS0601', ['_TZE200_jwsjbxjs']),
|
|
1301
|
+
model: 'TS0601_switch_5_gang',
|
|
1302
|
+
vendor: 'TuYa',
|
|
1303
|
+
description: '5 gang switch',
|
|
1304
|
+
fromZigbee: [tuya.fzDataPoints],
|
|
1305
|
+
toZigbee: [tuya.tzDataPoints],
|
|
1306
|
+
configure: tuya.configureMagicPacket,
|
|
1307
|
+
exposes: [
|
|
1308
|
+
tuya.exposes.switch().withEndpoint('l1'),
|
|
1309
|
+
tuya.exposes.switch().withEndpoint('l2'),
|
|
1310
|
+
tuya.exposes.switch().withEndpoint('l3'),
|
|
1311
|
+
tuya.exposes.switch().withEndpoint('l4'),
|
|
1312
|
+
tuya.exposes.switch().withEndpoint('l5'),
|
|
1313
|
+
],
|
|
1314
|
+
endpoint: (device) => {
|
|
1315
|
+
return {'l1': 1, 'l2': 1, 'l3': 1, 'l4': 1, 'l5': 1};
|
|
1316
|
+
},
|
|
1317
|
+
meta: {
|
|
1318
|
+
multiEndpoint: true,
|
|
1319
|
+
tuyaDatapoints: [
|
|
1320
|
+
[1, 'state_l1', tuya.valueConverter.onOff],
|
|
1321
|
+
[2, 'state_l2', tuya.valueConverter.onOff],
|
|
1322
|
+
[3, 'state_l3', tuya.valueConverter.onOff],
|
|
1323
|
+
[4, 'state_l4', tuya.valueConverter.onOff],
|
|
1324
|
+
[5, 'state_l5', tuya.valueConverter.onOff],
|
|
1325
|
+
],
|
|
1326
|
+
},
|
|
1327
|
+
},
|
|
1297
1328
|
{
|
|
1298
1329
|
fingerprint: [{modelID: 'TS0601', manufacturerName: '_TZE200_nkjintbl'}],
|
|
1299
1330
|
model: 'TS0601_switch_2_gang',
|
|
@@ -2281,7 +2312,7 @@ module.exports = [
|
|
|
2281
2312
|
fromZigbee: [tuya.fzDataPoints],
|
|
2282
2313
|
toZigbee: [tuya.tzDataPoints],
|
|
2283
2314
|
configure: tuya.configureMagicPacket,
|
|
2284
|
-
exposes: [tuya.exposes.switch, e.ac_frequency(), e.energy(), e.power(), e.power_factor(), e.voltage(), e.current()],
|
|
2315
|
+
exposes: [tuya.exposes.switch(), e.ac_frequency(), e.energy(), e.power(), e.power_factor(), e.voltage(), e.current()],
|
|
2285
2316
|
meta: {
|
|
2286
2317
|
tuyaDatapoints: [
|
|
2287
2318
|
[1, 'energy', tuya.valueConverter.divideBy100],
|
package/devices/xiaomi.js
CHANGED
|
@@ -50,7 +50,7 @@ const fzLocal = {
|
|
|
50
50
|
Object.entries(msg.data).forEach(([key, value]) => {
|
|
51
51
|
switch (parseInt(key)) {
|
|
52
52
|
case 0x0271:
|
|
53
|
-
result['
|
|
53
|
+
result['system_mode'] = {1: 'heat', 0: 'off'}[value];
|
|
54
54
|
break;
|
|
55
55
|
case 0x0272:
|
|
56
56
|
result['preset'] = {2: 'away', 1: 'auto', 0: 'manual'}[value];
|
|
@@ -68,20 +68,27 @@ const fzLocal = {
|
|
|
68
68
|
result['away_preset_temperature'] = (value / 100).toFixed(1);
|
|
69
69
|
break;
|
|
70
70
|
case 0x027b:
|
|
71
|
-
result['
|
|
71
|
+
result['calibrated'] = {1: true, 0: false}[value];
|
|
72
72
|
break;
|
|
73
73
|
case 0x027e:
|
|
74
74
|
result['sensor'] = {1: 'external', 0: 'internal'}[value];
|
|
75
75
|
break;
|
|
76
|
+
case 0x040a:
|
|
77
|
+
result['battery'] = value;
|
|
78
|
+
break;
|
|
79
|
+
case 0x027a:
|
|
80
|
+
result['window_open'] = {1: true, 0: false}[value];
|
|
81
|
+
break;
|
|
82
|
+
case 0x0275:
|
|
83
|
+
result['valve_alarm'] = {1: true, 0: false}[value];
|
|
84
|
+
break;
|
|
85
|
+
case 0xfff2:
|
|
76
86
|
case 0x00ff: // 4e:27:49:bb:24:b6:30:dd:74:de:53:76:89:44:c4:81
|
|
77
87
|
case 0x00f7: // 03:28:1f:05:21:01:00:0a:21:00:00:0d:23:19:08:00:00:11:23...
|
|
78
|
-
case 0x0275: // 0x00000001
|
|
79
88
|
case 0x0276: // 04:3e:01:e0:00:00:09:60:04:38:00:00:06:a4:05:64:00:00:08:98:81:e0:00:00:08:98
|
|
80
|
-
case 0x027a: // 0x00
|
|
81
89
|
case 0x027c: // 0x00
|
|
82
90
|
case 0x027d: // 0x00
|
|
83
91
|
case 0x0280: // 0x00/0x01
|
|
84
|
-
case 0x040a: // 0x64
|
|
85
92
|
meta.logger.debug(`zigbee-herdsman-converters:aqara_trv: Unhandled key ${key} = ${value}`);
|
|
86
93
|
break;
|
|
87
94
|
default:
|
|
@@ -95,11 +102,19 @@ const fzLocal = {
|
|
|
95
102
|
|
|
96
103
|
const tzLocal = {
|
|
97
104
|
aqara_trv: {
|
|
98
|
-
key: ['
|
|
105
|
+
key: ['system_mode', 'preset', 'window_detection', 'valve_detection', 'child_lock', 'away_preset_temperature',
|
|
106
|
+
'calibrate', 'sensor', 'sensor_temp', 'identify'],
|
|
99
107
|
convertSet: async (entity, key, value, meta) => {
|
|
108
|
+
const aqaraHeader = (counter, params, action) => {
|
|
109
|
+
const header = [0xaa, 0x71, params.length + 3, 0x44, counter];
|
|
110
|
+
const integrity = 512 - header.reduce((sum, elem) => sum + elem, 0);
|
|
111
|
+
return [...header, integrity, action, 0x41, params.length];
|
|
112
|
+
};
|
|
113
|
+
const sensor = Buffer.from('00158d00019d1b98', 'hex');
|
|
114
|
+
|
|
100
115
|
switch (key) {
|
|
101
|
-
case '
|
|
102
|
-
await entity.write('aqaraOpple', {0x0271: {value: {'
|
|
116
|
+
case 'system_mode':
|
|
117
|
+
await entity.write('aqaraOpple', {0x0271: {value: {'off': 0, 'heat': 1}[value], type: 0x20}},
|
|
103
118
|
{manufacturerCode: 0x115f});
|
|
104
119
|
break;
|
|
105
120
|
case 'preset':
|
|
@@ -121,10 +136,93 @@ const tzLocal = {
|
|
|
121
136
|
case 'away_preset_temperature':
|
|
122
137
|
await entity.write('aqaraOpple', {0x0279: {value: Math.round(value * 100), type: 0x23}}, {manufacturerCode: 0x115f});
|
|
123
138
|
break;
|
|
139
|
+
case 'sensor': {
|
|
140
|
+
const device = Buffer.from(entity.deviceIeeeAddress.substring(2), 'hex');
|
|
141
|
+
const timestamp = Buffer.alloc(4);
|
|
142
|
+
timestamp.writeUint32BE(Date.now()/1000);
|
|
143
|
+
|
|
144
|
+
if (value === 'external') {
|
|
145
|
+
const params1 = [
|
|
146
|
+
...timestamp,
|
|
147
|
+
0x3d, 0x04,
|
|
148
|
+
...device,
|
|
149
|
+
...sensor,
|
|
150
|
+
0x00, 0x01, 0x00, 0x55,
|
|
151
|
+
0x13, 0x0a, 0x02, 0x00, 0x00, 0x64, 0x04, 0xce, 0xc2, 0xb6, 0xc8,
|
|
152
|
+
0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x3d,
|
|
153
|
+
0x64,
|
|
154
|
+
0x65,
|
|
155
|
+
];
|
|
156
|
+
const params2 = [
|
|
157
|
+
...timestamp,
|
|
158
|
+
0x3d, 0x05,
|
|
159
|
+
...device,
|
|
160
|
+
...sensor,
|
|
161
|
+
0x08, 0x00, 0x07, 0xfd,
|
|
162
|
+
0x16, 0x0a, 0x02, 0x0a, 0xc9, 0xe8, 0xb1, 0xb8, 0xd4, 0xda, 0xcf, 0xdf, 0xc0, 0xeb,
|
|
163
|
+
0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x3d,
|
|
164
|
+
0x04,
|
|
165
|
+
0x65,
|
|
166
|
+
];
|
|
167
|
+
|
|
168
|
+
const val1 = [...(aqaraHeader(0x12, params1, 0x02)), ...params1];
|
|
169
|
+
const val2 = [...(aqaraHeader(0x13, params2, 0x02)), ...params2];
|
|
170
|
+
|
|
171
|
+
await entity.write('aqaraOpple', {0xfff2: {value: val1, type: 0x41}}, {manufacturerCode: 0x115f});
|
|
172
|
+
await entity.write('aqaraOpple', {0xfff2: {value: val2, type: 0x41}}, {manufacturerCode: 0x115f});
|
|
173
|
+
} else if (value === 'internal') {
|
|
174
|
+
const params1 = [
|
|
175
|
+
...timestamp,
|
|
176
|
+
0x3d, 0x05,
|
|
177
|
+
...device,
|
|
178
|
+
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
179
|
+
];
|
|
180
|
+
const params2 = [
|
|
181
|
+
...timestamp,
|
|
182
|
+
0x3d, 0x04,
|
|
183
|
+
...device,
|
|
184
|
+
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
185
|
+
];
|
|
186
|
+
|
|
187
|
+
const val1 = [...(aqaraHeader(0x12, params1, 0x04)), ...params1];
|
|
188
|
+
const val2 = [...(aqaraHeader(0x13, params2, 0x04)), ...params2];
|
|
189
|
+
|
|
190
|
+
await entity.write('aqaraOpple', {0xfff2: {value: val1, type: 0x41}}, {manufacturerCode: 0x115f});
|
|
191
|
+
await entity.write('aqaraOpple', {0xfff2: {value: val2, type: 0x41}}, {manufacturerCode: 0x115f});
|
|
192
|
+
|
|
193
|
+
await entity.read('hvacThermostat', ['localTemp']);
|
|
194
|
+
}
|
|
195
|
+
break;
|
|
196
|
+
}
|
|
197
|
+
case 'sensor_temp':
|
|
198
|
+
if (meta.state['sensor'] === 'external') {
|
|
199
|
+
const temperatureBuf = Buffer.alloc(4);
|
|
200
|
+
temperatureBuf.writeFloatBE(Math.round(value * 100));
|
|
201
|
+
|
|
202
|
+
const params = [...sensor, 0x00, 0x01, 0x00, 0x55, ...temperatureBuf];
|
|
203
|
+
const data = [...(aqaraHeader(0x12, params, 0x05)), ...params];
|
|
204
|
+
|
|
205
|
+
await entity.write('aqaraOpple', {0xfff2: {value: data, type: 0x41}}, {manufacturerCode: 0x115f});
|
|
206
|
+
}
|
|
207
|
+
break;
|
|
208
|
+
case 'calibrate':
|
|
209
|
+
await entity.write('aqaraOpple', {0x0270: {value: 1, type: 0x20}}, {manufacturerCode: 0x115F});
|
|
210
|
+
break;
|
|
211
|
+
case 'identify':
|
|
212
|
+
await entity.command('genIdentify', 'identify', {identifytime: 5}, {});
|
|
213
|
+
break;
|
|
124
214
|
default: // Unknown key
|
|
125
215
|
meta.logger.warn(`zigbee-herdsman-converters:aqara_trv: Unhandled key ${key}`);
|
|
126
216
|
}
|
|
127
217
|
},
|
|
218
|
+
convertGet: async (entity, key, meta) => {
|
|
219
|
+
const dict = {'system_mode': 0x0271, 'preset': 0x0272, 'window_detection': 0x0273, 'valve_detection': 0x0274,
|
|
220
|
+
'child_lock': 0x0277, 'away_preset_temperature': 0x0279, 'calibrated': 0x027b, 'sensor': 0x027e};
|
|
221
|
+
|
|
222
|
+
if (dict.hasOwnProperty(key)) {
|
|
223
|
+
await entity.read('aqaraOpple', [dict[key]], {manufacturerCode: 0x115F});
|
|
224
|
+
}
|
|
225
|
+
},
|
|
128
226
|
},
|
|
129
227
|
VOCKQJK11LM_display_unit: {
|
|
130
228
|
key: ['display_unit'],
|
|
@@ -2282,16 +2380,27 @@ module.exports = [
|
|
|
2282
2380
|
description: 'Aqara Smart Radiator Thermostat E1',
|
|
2283
2381
|
fromZigbee: [fzLocal.aqara_trv, fz.thermostat, fz.battery],
|
|
2284
2382
|
toZigbee: [tzLocal.aqara_trv, tz.thermostat_occupied_heating_setpoint],
|
|
2285
|
-
exposes: [
|
|
2286
|
-
exposes.climate()
|
|
2287
|
-
.
|
|
2288
|
-
|
|
2289
|
-
|
|
2383
|
+
exposes: [
|
|
2384
|
+
exposes.climate()
|
|
2385
|
+
.withSetpoint('occupied_heating_setpoint', 5, 30, 0.5)
|
|
2386
|
+
.withLocalTemperature(ea.STATE)
|
|
2387
|
+
.withSystemMode(['off', 'heat'], ea.ALL)
|
|
2388
|
+
.withPreset(['manual', 'away', 'auto']).setAccess('preset', ea.ALL),
|
|
2389
|
+
e.temperature_sensor_select(['internal', 'external']).withAccess(ea.ALL),
|
|
2390
|
+
exposes.binary('calibrated', ea.STATE, true, false)
|
|
2391
|
+
.withDescription('Is the valve calibrated'),
|
|
2392
|
+
e.child_lock().setAccess('state', ea.ALL),
|
|
2393
|
+
e.window_detection().setAccess('state', ea.ALL),
|
|
2394
|
+
exposes.binary('window_open', ea.STATE, true, false),
|
|
2395
|
+
e.valve_detection().setAccess('state', ea.ALL),
|
|
2396
|
+
e.away_preset_temperature().withAccess(ea.ALL),
|
|
2397
|
+
e.battery_voltage(),
|
|
2398
|
+
e.battery(),
|
|
2290
2399
|
],
|
|
2291
2400
|
meta: {battery: {voltageToPercentage: '3V_2850_3000'}},
|
|
2292
2401
|
configure: async (device, coordinatorEndpoint, logger) => {
|
|
2293
2402
|
const endpoint = device.getEndpoint(1);
|
|
2294
|
-
await endpoint.read('
|
|
2403
|
+
await endpoint.read('aqaraOpple', [0x040a], {manufacturerCode: 0x115f});
|
|
2295
2404
|
},
|
|
2296
2405
|
},
|
|
2297
2406
|
];
|
package/lib/tuya.js
CHANGED
|
@@ -1137,16 +1137,16 @@ async function sendDataPointStringBuffer(entity, dp, value, cmd, seq=undefined)
|
|
|
1137
1137
|
}
|
|
1138
1138
|
|
|
1139
1139
|
const tuyaExposes = {
|
|
1140
|
-
powerOnBehavior: exposes.enum('power_on_behavior', ea.STATE_SET, ['off', 'on', 'previous'])
|
|
1140
|
+
powerOnBehavior: () => exposes.enum('power_on_behavior', ea.STATE_SET, ['off', 'on', 'previous'])
|
|
1141
1141
|
.withDescription('Controls the behavior when the device is powered on'),
|
|
1142
|
-
lightType: exposes.enum('light_type', ea.STATE_SET, ['led', 'incandescent', 'halogen'])
|
|
1142
|
+
lightType: () => exposes.enum('light_type', ea.STATE_SET, ['led', 'incandescent', 'halogen'])
|
|
1143
1143
|
.withDescription('Type of light attached to the device'),
|
|
1144
|
-
lightBrightnessWithMinMax: e.light_brightness().withMinBrightness().withMaxBrightness().setAccess(
|
|
1144
|
+
lightBrightnessWithMinMax: () => e.light_brightness().withMinBrightness().withMaxBrightness().setAccess(
|
|
1145
1145
|
'state', ea.STATE_SET).setAccess('brightness', ea.STATE_SET).setAccess(
|
|
1146
1146
|
'min_brightness', ea.STATE_SET).setAccess('max_brightness', ea.STATE_SET),
|
|
1147
|
-
countdown: exposes.numeric('countdown', ea.STATE_SET).withValueMin(0).withValueMax(43200).withValueStep(1).withUnit('s')
|
|
1147
|
+
countdown: () => exposes.numeric('countdown', ea.STATE_SET).withValueMin(0).withValueMax(43200).withValueStep(1).withUnit('s')
|
|
1148
1148
|
.withDescription('Countdown to turn device off after a certain time'),
|
|
1149
|
-
switch: e.switch().setAccess('state', ea.STATE_SET),
|
|
1149
|
+
switch: () => e.switch().setAccess('state', ea.STATE_SET),
|
|
1150
1150
|
};
|
|
1151
1151
|
|
|
1152
1152
|
const skip = {
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "zigbee-herdsman-converters",
|
|
3
|
-
"version": "14.0.
|
|
3
|
+
"version": "14.0.641",
|
|
4
4
|
"description": "Collection of device converters to be used with zigbee-herdsman",
|
|
5
5
|
"main": "index.js",
|
|
6
6
|
"files": [
|
|
@@ -34,11 +34,11 @@
|
|
|
34
34
|
},
|
|
35
35
|
"homepage": "https://github.com/Koenkk/zigbee-herdsman-converters",
|
|
36
36
|
"dependencies": {
|
|
37
|
-
"axios": "^
|
|
37
|
+
"axios": "^1.1.2",
|
|
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.64"
|
|
42
42
|
},
|
|
43
43
|
"devDependencies": {
|
|
44
44
|
"eslint": "*",
|