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 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: {[operationModeProperty]: value.toLowerCase()}};
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(),
@@ -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.read(64635, [0, 1]);
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
  ],
@@ -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: {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "zigbee-herdsman-converters",
3
- "version": "14.0.608",
3
+ "version": "14.0.609",
4
4
  "description": "Collection of device converters to be used with zigbee-herdsman",
5
5
  "main": "index.js",
6
6
  "files": [