zigbee-herdsman-converters 14.0.608 → 14.0.609
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/niko.js +1 -2
- package/devices/onesti.js +3 -1
- package/devices/perenio.js +90 -5
- package/devices/qoto.js +113 -0
- package/devices/tuya.js +1 -1
- package/package.json +1 -1
package/devices/niko.js
CHANGED
|
@@ -61,9 +61,8 @@ const local = {
|
|
|
61
61
|
if (!operationModeLookup.hasOwnProperty(value)) {
|
|
62
62
|
throw new Error(`operation_mode was called with an invalid value (${value})`);
|
|
63
63
|
} else {
|
|
64
|
-
const operationModeProperty = `operation_mode${meta.endpoint_name ? `_${meta.endpoint_name}` : ''}`;
|
|
65
64
|
await entity.write('manuSpecificNiko1', {'switchOperationMode': operationModeLookup[value]});
|
|
66
|
-
return {state: {
|
|
65
|
+
return {state: {operation_mode: value.toLowerCase()}};
|
|
67
66
|
}
|
|
68
67
|
},
|
|
69
68
|
convertGet: async (entity, key, meta) => {
|
package/devices/onesti.js
CHANGED
|
@@ -8,7 +8,7 @@ const constants = require('../lib/constants');
|
|
|
8
8
|
|
|
9
9
|
module.exports = [
|
|
10
10
|
{
|
|
11
|
-
zigbeeModel: ['easyCodeTouch_v1', 'EasyCodeTouch'],
|
|
11
|
+
zigbeeModel: ['easyCodeTouch_v1', 'EasyCodeTouch', 'EasyFingerTouch'],
|
|
12
12
|
model: 'easyCodeTouch_v1',
|
|
13
13
|
vendor: 'Onesti Products AS',
|
|
14
14
|
description: 'Zigbee module for EasyAccess code touch series',
|
|
@@ -21,6 +21,8 @@ module.exports = [
|
|
|
21
21
|
await reporting.lockState(endpoint);
|
|
22
22
|
await reporting.batteryPercentageRemaining(endpoint);
|
|
23
23
|
await endpoint.read('closuresDoorLock', ['lockState', 'soundVolume']);
|
|
24
|
+
device.powerSource = 'Battery';
|
|
25
|
+
device.save();
|
|
24
26
|
},
|
|
25
27
|
exposes: [e.lock(), e.battery(), e.sound_volume(),
|
|
26
28
|
e.lock_action_source_name(), e.lock_action_user(),
|
package/devices/perenio.js
CHANGED
|
@@ -59,15 +59,30 @@ const fzPerenio = {
|
|
|
59
59
|
type: ['attributeReport', 'readResponse'],
|
|
60
60
|
convert: (model, msg, publish, options, meta) => {
|
|
61
61
|
const result = {};
|
|
62
|
+
if (msg.data.hasOwnProperty(2)) {
|
|
63
|
+
result['rms_current'] = msg.data[2];
|
|
64
|
+
}
|
|
62
65
|
if (msg.data.hasOwnProperty(3)) {
|
|
63
66
|
result['rms_voltage'] = msg.data[3];
|
|
64
67
|
}
|
|
68
|
+
if (msg.data.hasOwnProperty(4)) {
|
|
69
|
+
result['voltage_min'] = msg.data[4];
|
|
70
|
+
}
|
|
71
|
+
if (msg.data.hasOwnProperty(5)) {
|
|
72
|
+
result['voltage_max'] = msg.data[5];
|
|
73
|
+
}
|
|
65
74
|
if (msg.data.hasOwnProperty(10)) {
|
|
66
75
|
result['active_power'] = msg.data[10];
|
|
67
76
|
}
|
|
77
|
+
if (msg.data.hasOwnProperty(11)) {
|
|
78
|
+
result['power_max'] = msg.data[11];
|
|
79
|
+
}
|
|
68
80
|
if (msg.data.hasOwnProperty(14)) {
|
|
69
81
|
result['consumed_energy'] = msg.data[14];
|
|
70
82
|
}
|
|
83
|
+
if (msg.data.hasOwnProperty(15)) {
|
|
84
|
+
result['consumed_energy_limit'] = msg.data[15];
|
|
85
|
+
}
|
|
71
86
|
if (msg.data.hasOwnProperty(24)) {
|
|
72
87
|
result['rssi'] = msg.data[24];
|
|
73
88
|
}
|
|
@@ -84,6 +99,7 @@ const fzPerenio = {
|
|
|
84
99
|
result['alarm_voltage_min'] = false;
|
|
85
100
|
result['alarm_voltage_max'] = false;
|
|
86
101
|
result['alarm_power_max'] = false;
|
|
102
|
+
result['alarm_consumed_energy'] = false;
|
|
87
103
|
} else {
|
|
88
104
|
if (msg.data[1] & 1) {
|
|
89
105
|
result['alarm_voltage_min'] = true;
|
|
@@ -94,6 +110,9 @@ const fzPerenio = {
|
|
|
94
110
|
if (msg.data[1] & 4) {
|
|
95
111
|
result['alarm_power_max'] = true;
|
|
96
112
|
}
|
|
113
|
+
if (msg.data[1] & 8) {
|
|
114
|
+
result['alarm_consumed_energy'] = true;
|
|
115
|
+
}
|
|
97
116
|
}
|
|
98
117
|
}
|
|
99
118
|
return result;
|
|
@@ -135,15 +154,51 @@ const tzPerenio = {
|
|
|
135
154
|
},
|
|
136
155
|
},
|
|
137
156
|
alarms_reset: {
|
|
138
|
-
key: ['alarm_voltage_min', 'alarm_voltage_max', 'alarm_power_max'],
|
|
157
|
+
key: ['alarm_voltage_min', 'alarm_voltage_max', 'alarm_power_max', 'alarm_consumed_energy'],
|
|
139
158
|
convertSet: async (entity, key, val, meta) => {
|
|
140
159
|
await entity.write(64635, {1: {value: 0, type: 0x20}}, {manufacturerCode: 0x007B});
|
|
141
|
-
return {state: {alarm_voltage_min: false, alarm_voltage_max: false, alarm_power_max: false}};
|
|
160
|
+
return {state: {alarm_voltage_min: false, alarm_voltage_max: false, alarm_power_max: false, alarm_consumed_energy: false}};
|
|
142
161
|
},
|
|
143
162
|
convertGet: async (entity, key, meta) => {
|
|
144
163
|
await entity.read(64635, [1]);
|
|
145
164
|
},
|
|
146
165
|
},
|
|
166
|
+
alarms_limits: {
|
|
167
|
+
key: ['voltage_min', 'voltage_max', 'power_max', 'consumed_energy_limit'],
|
|
168
|
+
convertSet: async (entity, key, val, meta) => {
|
|
169
|
+
switch (key) {
|
|
170
|
+
case 'voltage_min':
|
|
171
|
+
await entity.write(64635, {4: {value: val, type: 0x21}}, {manufacturerCode: 0x007B});
|
|
172
|
+
break;
|
|
173
|
+
case 'voltage_max':
|
|
174
|
+
await entity.write(64635, {5: {value: val, type: 0x21}}, {manufacturerCode: 0x007B});
|
|
175
|
+
break;
|
|
176
|
+
case 'power_max':
|
|
177
|
+
await entity.write(64635, {11: {value: val, type: 0x21}}, {manufacturerCode: 0x007B});
|
|
178
|
+
break;
|
|
179
|
+
case 'consumed_energy_limit':
|
|
180
|
+
await entity.write(64635, {15: {value: val, type: 0x21}}, {manufacturerCode: 0x007B});
|
|
181
|
+
break;
|
|
182
|
+
}
|
|
183
|
+
return {state: {[key]: val}};
|
|
184
|
+
},
|
|
185
|
+
convertGet: async (entity, key, meta) => {
|
|
186
|
+
switch (key) {
|
|
187
|
+
case 'voltage_min':
|
|
188
|
+
await entity.read(64635, [4]);
|
|
189
|
+
break;
|
|
190
|
+
case 'voltage_max':
|
|
191
|
+
await entity.read(64635, [5]);
|
|
192
|
+
break;
|
|
193
|
+
case 'power_max':
|
|
194
|
+
await entity.read(64635, [11]);
|
|
195
|
+
break;
|
|
196
|
+
case 'consumed_energy_limit':
|
|
197
|
+
await entity.read(64635, [15]);
|
|
198
|
+
break;
|
|
199
|
+
}
|
|
200
|
+
},
|
|
201
|
+
},
|
|
147
202
|
on_off_mod: {
|
|
148
203
|
key: ['state', 'on_time', 'off_wait_time'],
|
|
149
204
|
convertSet: async (entity, key, value, meta) => {
|
|
@@ -291,8 +346,8 @@ module.exports = [
|
|
|
291
346
|
model: 'PEHPL0X',
|
|
292
347
|
vendor: 'Perenio',
|
|
293
348
|
description: 'Power link',
|
|
294
|
-
fromZigbee: [fz.on_off, fzPerenio.smart_plug],
|
|
295
|
-
toZigbee: [tzPerenio.on_off_mod, tzPerenio.default_state, tzPerenio.alarms_reset],
|
|
349
|
+
fromZigbee: [fz.on_off, fzPerenio.smart_plug, fz.metering],
|
|
350
|
+
toZigbee: [tzPerenio.on_off_mod, tzPerenio.default_state, tzPerenio.alarms_reset, tzPerenio.alarms_limits],
|
|
296
351
|
configure: async (device, coordinatorEndpoint, logger) => {
|
|
297
352
|
const endpoint = device.getEndpoint(1);
|
|
298
353
|
await reporting.bind(endpoint, coordinatorEndpoint, ['genOnOff', 64635]);
|
|
@@ -303,7 +358,26 @@ module.exports = [
|
|
|
303
358
|
reportableChange: 0,
|
|
304
359
|
}];
|
|
305
360
|
await endpoint.configureReporting('genOnOff', payload);
|
|
306
|
-
await endpoint.
|
|
361
|
+
await endpoint.configureReporting(64635, [{
|
|
362
|
+
attribute: {ID: 0x000a, type: 0x21},
|
|
363
|
+
minimumReportInterval: 5,
|
|
364
|
+
maximumReportInterval: 60,
|
|
365
|
+
reportableChange: 0,
|
|
366
|
+
}]);
|
|
367
|
+
await endpoint.configureReporting(64635, [{
|
|
368
|
+
attribute: {ID: 0x000e, type: 0x23},
|
|
369
|
+
minimumReportInterval: 5,
|
|
370
|
+
maximumReportInterval: 60,
|
|
371
|
+
reportableChange: 0,
|
|
372
|
+
}]);
|
|
373
|
+
await endpoint.configureReporting(64635, [{
|
|
374
|
+
attribute: {ID: 0x0003, type: 0x21},
|
|
375
|
+
minimumReportInterval: 5,
|
|
376
|
+
maximumReportInterval: 5,
|
|
377
|
+
reportableChange: 0,
|
|
378
|
+
}]);
|
|
379
|
+
await endpoint.read(64635, [0, 1, 2, 3]);
|
|
380
|
+
await endpoint.read(64635, [4, 5, 11, 15]);
|
|
307
381
|
},
|
|
308
382
|
exposes: [
|
|
309
383
|
e.switch(),
|
|
@@ -317,6 +391,17 @@ module.exports = [
|
|
|
317
391
|
.withDescription('Indicates if the alarm is triggered on the voltage rise above the limit, allows to reset alarms'),
|
|
318
392
|
exposes.binary('alarm_power_max', ea.ALL, true, false)
|
|
319
393
|
.withDescription('Indicates if the alarm is triggered on the active power rise above the limit, allows to reset alarms'),
|
|
394
|
+
exposes.binary('alarm_consumed_energy', ea.ALL, true, false)
|
|
395
|
+
.withDescription(
|
|
396
|
+
'Indicates if the alarm is triggered when the consumption energy limit is reached, allows to reset alarms'),
|
|
397
|
+
exposes.numeric('voltage_min', ea.ALL).withValueMin(0).withValueMax(253)
|
|
398
|
+
.withDescription('Minimum allowable voltage limit for alarms.'),
|
|
399
|
+
exposes.numeric('voltage_max', ea.ALL).withValueMin(0).withValueMax(253)
|
|
400
|
+
.withDescription('Maximum allowable voltage limit for alarms.'),
|
|
401
|
+
exposes.numeric('power_max', ea.ALL).withValueMin(0).withValueMax(65534)
|
|
402
|
+
.withDescription('Maximum allowable power limit for alarms.'),
|
|
403
|
+
exposes.numeric('consumed_energy_limit', ea.ALL).withValueMin(0).withValueMax(65534)
|
|
404
|
+
.withDescription('Limit of electric energy consumption in kW*h. 0 value represents no limit'),
|
|
320
405
|
exposes.numeric('rssi', ea.STATE).withUnit('dB')
|
|
321
406
|
.withDescription('RSSI seen by the device').withValueMin(-128).withValueMax(127),
|
|
322
407
|
],
|
package/devices/qoto.js
ADDED
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
const fz = require('../converters/fromZigbee');
|
|
2
|
+
const exposes = require('../lib/exposes');
|
|
3
|
+
const tuya = require('../lib/tuya');
|
|
4
|
+
const e = exposes.presets;
|
|
5
|
+
const ea = exposes.access;
|
|
6
|
+
|
|
7
|
+
const dataPoints = {
|
|
8
|
+
valve_state_auto_shutdown: 2,
|
|
9
|
+
water_flow: 3,
|
|
10
|
+
shutdown_timer: 11,
|
|
11
|
+
remaining_watering_time: 101,
|
|
12
|
+
valve_state: 102,
|
|
13
|
+
last_watering_duration: 107,
|
|
14
|
+
battery: 110,
|
|
15
|
+
};
|
|
16
|
+
|
|
17
|
+
const fzLocal = {
|
|
18
|
+
watering_timer: {
|
|
19
|
+
cluster: 'manuSpecificTuya',
|
|
20
|
+
type: ['commandDataReport'],
|
|
21
|
+
convert: (model, msg, publish, options, meta) => {
|
|
22
|
+
const result = {};
|
|
23
|
+
for (const dpValue of msg.data.dpValues) {
|
|
24
|
+
const dp = dpValue.dp; // First we get the data point ID
|
|
25
|
+
const value = tuya.getDataValue(dpValue); // This function will take care of converting the data to proper JS type
|
|
26
|
+
switch (dp) {
|
|
27
|
+
case dataPoints.water_flow: {
|
|
28
|
+
result.water_flow = value;
|
|
29
|
+
break;
|
|
30
|
+
}
|
|
31
|
+
case dataPoints.remaining_watering_time: {
|
|
32
|
+
result.remaining_watering_time = value;
|
|
33
|
+
break;
|
|
34
|
+
}
|
|
35
|
+
case dataPoints.last_watering_duration: {
|
|
36
|
+
result.last_watering_duration = value;
|
|
37
|
+
break;
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
case dataPoints.valve_state: {
|
|
41
|
+
result.valve_state = value;
|
|
42
|
+
break;
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
case dataPoints.shutdown_timer: {
|
|
46
|
+
result.shutdown_timer = value;
|
|
47
|
+
break;
|
|
48
|
+
}
|
|
49
|
+
case dataPoints.valve_state_auto_shutdown: {
|
|
50
|
+
result.valve_state_auto_shutdown = value;
|
|
51
|
+
result.valve_state = value;
|
|
52
|
+
break;
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
case dataPoints.battery: {
|
|
56
|
+
result.battery = value;
|
|
57
|
+
break;
|
|
58
|
+
}
|
|
59
|
+
default: {
|
|
60
|
+
meta.logger.debug(`>>> UNKNOWN DP #${dp} with data "${JSON.stringify(dpValue)}"`);
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
return result;
|
|
65
|
+
},
|
|
66
|
+
},
|
|
67
|
+
};
|
|
68
|
+
|
|
69
|
+
const tzLocal = {
|
|
70
|
+
valve_state: {
|
|
71
|
+
key: ['valve_state'],
|
|
72
|
+
convertSet: async (entity, key, value, meta) => {
|
|
73
|
+
await tuya.sendDataPointValue(entity, dataPoints.valve_state, value);
|
|
74
|
+
},
|
|
75
|
+
},
|
|
76
|
+
shutdown_timer: {
|
|
77
|
+
key: ['shutdown_timer'],
|
|
78
|
+
convertSet: async (entity, key, value, meta) => {
|
|
79
|
+
await tuya.sendDataPointValue(entity, dataPoints.shutdown_timer, value);
|
|
80
|
+
},
|
|
81
|
+
},
|
|
82
|
+
valve_state_auto_shutdown: {
|
|
83
|
+
key: ['valve_state_auto_shutdown'],
|
|
84
|
+
convertSet: async (entity, key, value, meta) => {
|
|
85
|
+
await tuya.sendDataPointValue(entity, dataPoints.valve_state_auto_shutdown, value);
|
|
86
|
+
},
|
|
87
|
+
},
|
|
88
|
+
};
|
|
89
|
+
|
|
90
|
+
module.exports = [
|
|
91
|
+
{
|
|
92
|
+
fingerprint: [{modelID: 'TS0601', manufacturerName: '_TZE200_arge1ptm'}],
|
|
93
|
+
model: 'QT-05M',
|
|
94
|
+
vendor: 'QOTO',
|
|
95
|
+
description: 'Solar powered garden watering timer',
|
|
96
|
+
fromZigbee: [fz.ignore_basic_report, fz.ignore_tuya_set_time, fz.ignore_onoff_report, fzLocal.watering_timer],
|
|
97
|
+
toZigbee: [tzLocal.valve_state, tzLocal.shutdown_timer, tzLocal.valve_state_auto_shutdown],
|
|
98
|
+
exposes: [
|
|
99
|
+
exposes.numeric('water_flow', ea.STATE).withUnit('%').withValueMin(0).withDescription('Current water flow in %.'),
|
|
100
|
+
exposes.numeric('last_watering_duration', ea.STATE).withUnit('sec').withValueMin(0)
|
|
101
|
+
.withDescription('Last watering duration in seconds.'),
|
|
102
|
+
exposes.numeric('remaining_watering_time', ea.STATE).withUnit('sec').withValueMin(0)
|
|
103
|
+
.withDescription('Remaning watering time (for auto shutdown). Updates every minute, and every 10s in the last minute.'),
|
|
104
|
+
exposes.numeric('valve_state', ea.STATE_SET).withValueMin(0).withValueMax(100).withValueStep(5).withUnit('%')
|
|
105
|
+
.withDescription('Set valve to %.'),
|
|
106
|
+
exposes.numeric('shutdown_timer', ea.STATE_SET).withValueMin(0).withValueMax(14400).withUnit('sec')
|
|
107
|
+
.withDescription('Auto shutdown in seconds.'),
|
|
108
|
+
exposes.numeric('valve_state_auto_shutdown', ea.STATE_SET).withValueMin(0).withValueMax(100).withValueStep(5).withUnit('%')
|
|
109
|
+
.withDescription('Set valve to % with auto shutdown.'),
|
|
110
|
+
e.battery(),
|
|
111
|
+
],
|
|
112
|
+
},
|
|
113
|
+
];
|
package/devices/tuya.js
CHANGED
|
@@ -20,7 +20,7 @@ const TS011Fplugs = ['_TZ3000_5f43h46b', '_TZ3000_cphmq0q7', '_TZ3000_dpo1ysak',
|
|
|
20
20
|
'_TZ3000_rdtixbnu', '_TZ3000_typdpbpg', '_TZ3000_kx0pris5', '_TZ3000_amdymr7l', '_TZ3000_z1pnpsdo', '_TZ3000_ksw8qtmt',
|
|
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
|
-
'_TZ3000_ss98ec5d', '_TZ3000_gznh2xla'];
|
|
23
|
+
'_TZ3000_ss98ec5d', '_TZ3000_gznh2xla', '_TZ3000_hdopuwv6'];
|
|
24
24
|
|
|
25
25
|
const tzLocal = {
|
|
26
26
|
hpsz: {
|