iobroker.zigbee 1.7.5 → 1.8.0
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/LICENSE +1 -1
- package/README.md +22 -29
- package/admin/admin.js +494 -469
- package/admin/i18n/de/translations.json +108 -0
- package/admin/i18n/en/translations.json +108 -0
- package/admin/i18n/es/translations.json +102 -0
- package/admin/i18n/fr/translations.json +108 -0
- package/admin/i18n/it/translations.json +102 -0
- package/admin/i18n/nl/translations.json +108 -0
- package/admin/i18n/pl/translations.json +108 -0
- package/admin/i18n/pt/translations.json +102 -0
- package/admin/i18n/ru/translations.json +108 -0
- package/admin/i18n/uk/translations.json +108 -0
- package/admin/i18n/zh-cn/translations.json +102 -0
- package/admin/index_m.html +1 -1
- package/admin/tab_m.html +44 -3
- package/admin/words.js +107 -108
- package/io-package.json +326 -357
- package/lib/backup.js +2 -2
- package/lib/binding.js +23 -24
- package/lib/colors.js +16 -14
- package/lib/commands.js +89 -82
- package/lib/developer.js +6 -7
- package/lib/devices.js +145 -154
- package/lib/exclude.js +30 -36
- package/lib/exposes.js +106 -111
- package/lib/groups.js +53 -54
- package/lib/json.js +3 -4
- package/lib/networkmap.js +2 -2
- package/lib/ota.js +23 -15
- package/lib/rgb.js +47 -44
- package/lib/seriallist.js +21 -10
- package/lib/states.js +488 -498
- package/lib/statescontroller.js +170 -164
- package/lib/utils.js +22 -21
- package/lib/zbBaseExtension.js +4 -4
- package/lib/zbDelayedAction.js +5 -13
- package/lib/zbDeviceAvailability.js +47 -44
- package/lib/zbDeviceConfigure.js +18 -23
- package/lib/zbDeviceEvent.js +3 -4
- package/lib/zigbeecontroller.js +97 -100
- package/main.js +149 -133
- package/package.json +33 -19
- package/.eslintignore +0 -2
- package/.eslintrc.json +0 -37
- package/.github/FUNDING.yml +0 -3
- package/.github/stale.yml +0 -13
- package/.github/workflows/test-and-release.yml +0 -151
- package/.travis/wiki.sh +0 -28
- package/admin/adapter-settings.js +0 -244
package/lib/devices.js
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
-
const states = require(
|
|
4
|
-
const utils = require(
|
|
5
|
-
const rgb = require(
|
|
6
|
-
const applyExposes = require(
|
|
3
|
+
const states = require('./states.js').states;
|
|
4
|
+
const utils = require('./utils.js');
|
|
5
|
+
const rgb = require('./rgb.js');
|
|
6
|
+
const applyExposes = require('./exposes.js').applyExposes;
|
|
7
7
|
|
|
8
8
|
|
|
9
9
|
// return list of changing states when incoming state is changed
|
|
@@ -23,7 +23,7 @@ const comb = {
|
|
|
23
23
|
// index: -1, // before main change
|
|
24
24
|
// timeout: 0,
|
|
25
25
|
index: 1, // after main change
|
|
26
|
-
timeout
|
|
26
|
+
timeout,
|
|
27
27
|
}];
|
|
28
28
|
}
|
|
29
29
|
} else if (disableQueue || options.state) {
|
|
@@ -32,7 +32,7 @@ const comb = {
|
|
|
32
32
|
stateDesc: states.state,
|
|
33
33
|
value: false,
|
|
34
34
|
index: 1, // after main change
|
|
35
|
-
timeout
|
|
35
|
+
timeout,
|
|
36
36
|
}];
|
|
37
37
|
}
|
|
38
38
|
}
|
|
@@ -42,20 +42,22 @@ const comb = {
|
|
|
42
42
|
if (state.id === states.effect_json.id) {
|
|
43
43
|
const effectjson = {};
|
|
44
44
|
try {
|
|
45
|
-
if (options.hasOwnProperty('effect_speed'))
|
|
45
|
+
if (options.hasOwnProperty('effect_speed')) {
|
|
46
46
|
effectjson.speed = options.effect_speed;
|
|
47
|
-
|
|
47
|
+
}
|
|
48
|
+
if (options.hasOwnProperty('effect_type')) {
|
|
48
49
|
effectjson.effect = options.effect_type;
|
|
49
|
-
|
|
50
|
-
if (options.hasOwnProperty('effect_colors'))
|
|
50
|
+
}
|
|
51
|
+
if (options.hasOwnProperty('effect_colors')) {
|
|
51
52
|
effectjson.colors = rgb.colorsArrayFromString(options.effect_colors);
|
|
53
|
+
}
|
|
52
54
|
// effectjson = JSON.parse(value);
|
|
53
55
|
}
|
|
54
56
|
catch {
|
|
55
57
|
const effectjson = {
|
|
56
|
-
colors:[{r: 255,g: 0,b: 0},{r: 0,g: 255,b: 0},{r: 0,g: 0,b: 255}],
|
|
57
|
-
speed:10,
|
|
58
|
-
effect:'glow',
|
|
58
|
+
colors: [{r: 255, g: 0, b: 0}, {r: 0, g: 255, b: 0}, {r: 0, g: 0, b: 255}],
|
|
59
|
+
speed: 10,
|
|
60
|
+
effect: 'glow',
|
|
59
61
|
};
|
|
60
62
|
if (options.hasOwnProperty('effect_speed'))
|
|
61
63
|
effectjson.speed = options.effect_speed;
|
|
@@ -131,29 +133,30 @@ const freepad_states = [states.battery];
|
|
|
131
133
|
|
|
132
134
|
function getKey(object, value) {
|
|
133
135
|
for (const key in object) {
|
|
134
|
-
if (object[key]==value)
|
|
136
|
+
if (object[key] == value) {
|
|
137
|
+
return key;
|
|
138
|
+
}
|
|
135
139
|
}
|
|
136
140
|
}
|
|
137
141
|
|
|
138
142
|
const unitLookup = {
|
|
139
143
|
'temperature': 'C',
|
|
140
|
-
'humidity':'%',
|
|
141
|
-
'altitude':'m',
|
|
142
|
-
'pressure':'Pa',
|
|
143
|
-
'quality':'ppm',
|
|
144
|
-
'particle_size':'psize',
|
|
145
|
-
'voltage':'V',
|
|
146
|
-
'current':'A',
|
|
147
|
-
'energy':'Wh',
|
|
148
|
-
'power':'W',
|
|
149
|
-
'frequency':'Hz',
|
|
150
|
-
'power_factor':'pf',
|
|
151
|
-
'illuminance_lux':'lx',
|
|
152
|
-
|
|
144
|
+
'humidity': '%',
|
|
145
|
+
'altitude': 'm',
|
|
146
|
+
'pressure': 'Pa',
|
|
147
|
+
'quality': 'ppm',
|
|
148
|
+
'particle_size': 'psize',
|
|
149
|
+
'voltage': 'V',
|
|
150
|
+
'current': 'A',
|
|
151
|
+
'energy': 'Wh',
|
|
152
|
+
'power': 'W',
|
|
153
|
+
'frequency': 'Hz',
|
|
154
|
+
'power_factor': 'pf',
|
|
155
|
+
'illuminance_lux': 'lx',
|
|
153
156
|
};
|
|
154
157
|
|
|
155
158
|
const generator = {
|
|
156
|
-
gledopto:
|
|
159
|
+
gledopto: entity => {
|
|
157
160
|
if (entity.mapped.model === 'GL-C-008-2ID') {
|
|
158
161
|
return gl_lightStatesWithColor.concat(gl8_white_channel);
|
|
159
162
|
} else if (entity.mapped.model === 'GL-C-007-2ID') {
|
|
@@ -162,86 +165,75 @@ const generator = {
|
|
|
162
165
|
return lightStatesWithColor;
|
|
163
166
|
}
|
|
164
167
|
},
|
|
165
|
-
freepad:
|
|
168
|
+
freepad: entity => {
|
|
166
169
|
const freepad_st = [];
|
|
167
170
|
const ecount = entity.device.endpoints.length;
|
|
168
171
|
for (let i = 1; i <= ecount; i++) {
|
|
169
|
-
freepad_st.push(
|
|
170
|
-
{
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
{
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
icon: undefined,
|
|
231
|
-
role: 'button',
|
|
232
|
-
write: false,
|
|
233
|
-
read: true,
|
|
234
|
-
type: 'boolean',
|
|
235
|
-
isEvent: true,
|
|
236
|
-
getter: payload => (payload.action === `button_${i}_quadruple`) ? true : undefined,
|
|
237
|
-
lazy: true,
|
|
238
|
-
}
|
|
239
|
-
);
|
|
240
|
-
|
|
172
|
+
freepad_st.push({
|
|
173
|
+
id: `btn${i}_single`,
|
|
174
|
+
prop: 'action',
|
|
175
|
+
name: `Button ${i} click event`,
|
|
176
|
+
icon: undefined,
|
|
177
|
+
role: 'button',
|
|
178
|
+
write: false,
|
|
179
|
+
read: true,
|
|
180
|
+
type: 'boolean',
|
|
181
|
+
isEvent: true,
|
|
182
|
+
getter: payload => (payload.action === `button_${i}_single`) ? true : undefined,
|
|
183
|
+
});
|
|
184
|
+
freepad_st.push({
|
|
185
|
+
id: `btn${i}_double`,
|
|
186
|
+
prop: 'action',
|
|
187
|
+
name: `Button ${i} double click event`,
|
|
188
|
+
icon: undefined,
|
|
189
|
+
role: 'button',
|
|
190
|
+
write: false,
|
|
191
|
+
read: true,
|
|
192
|
+
type: 'boolean',
|
|
193
|
+
isEvent: true,
|
|
194
|
+
getter: payload => (payload.action === `button_${i}_double`) ? true : undefined,
|
|
195
|
+
});
|
|
196
|
+
freepad_st.push({
|
|
197
|
+
id: `btn${i}_hold`,
|
|
198
|
+
prop: 'action',
|
|
199
|
+
name: `Button ${i} hold`,
|
|
200
|
+
icon: undefined,
|
|
201
|
+
role: 'button',
|
|
202
|
+
write: false,
|
|
203
|
+
read: true,
|
|
204
|
+
type: 'boolean',
|
|
205
|
+
getter: payload => (payload.action === `button_${i}_hold`) ? true : (payload.action === `button_${i}_release`) ? false : undefined,
|
|
206
|
+
});
|
|
207
|
+
freepad_st.push({
|
|
208
|
+
id: `btn${i}_triple`,
|
|
209
|
+
prop: 'action',
|
|
210
|
+
name: `Button ${i} triple click event`,
|
|
211
|
+
icon: undefined,
|
|
212
|
+
role: 'button',
|
|
213
|
+
write: false,
|
|
214
|
+
read: true,
|
|
215
|
+
type: 'boolean',
|
|
216
|
+
isEvent: true,
|
|
217
|
+
getter: payload => (payload.action === `button_${i}_triple`) ? true : undefined,
|
|
218
|
+
lazy: true,
|
|
219
|
+
});
|
|
220
|
+
freepad_st.push({
|
|
221
|
+
id: `btn${i}_quadruple`,
|
|
222
|
+
prop: 'action',
|
|
223
|
+
name: `Button ${i} quadruple click event`,
|
|
224
|
+
icon: undefined,
|
|
225
|
+
role: 'button',
|
|
226
|
+
write: false,
|
|
227
|
+
read: true,
|
|
228
|
+
type: 'boolean',
|
|
229
|
+
isEvent: true,
|
|
230
|
+
getter: payload => (payload.action === `button_${i}_quadruple`) ? true : undefined,
|
|
231
|
+
lazy: true,
|
|
232
|
+
});
|
|
241
233
|
}
|
|
242
234
|
return freepad_states.concat(freepad_st);
|
|
243
235
|
},
|
|
244
|
-
ptvo_switch_channels:
|
|
236
|
+
ptvo_switch_channels: entity =>{
|
|
245
237
|
const devstates = [states.ptvo_trigger,states.ptvo_interval];
|
|
246
238
|
for (const endpoint of entity.device.endpoints) {
|
|
247
239
|
const epID = endpoint.ID;
|
|
@@ -269,7 +261,9 @@ const generator = {
|
|
|
269
261
|
|
|
270
262
|
if (payload.hasOwnProperty(`device_${epName}`)) {
|
|
271
263
|
id = (typeof(payload[`device_${epName}`]) == 'string' ? payload[`device_${epName}`].replace(/[-. ]/g, ''):'unset');
|
|
272
|
-
} else if (payload.hasOwnProperty(`voltage_${epName}`))
|
|
264
|
+
} else if (payload.hasOwnProperty(`voltage_${epName}`)) {
|
|
265
|
+
id = 'voltage';
|
|
266
|
+
}
|
|
273
267
|
let unit = undefined;
|
|
274
268
|
let measurement = undefined;
|
|
275
269
|
for (const item in payload) {
|
|
@@ -283,12 +277,12 @@ const generator = {
|
|
|
283
277
|
}
|
|
284
278
|
}
|
|
285
279
|
}
|
|
286
|
-
if (measurement && id
|
|
287
|
-
rv.stateid = id
|
|
280
|
+
if (measurement && id !== 'voltage')
|
|
281
|
+
rv.stateid = `${id}_${measurement}`;
|
|
288
282
|
else
|
|
289
283
|
rv.stateid = id;
|
|
290
284
|
rv.value = payload[epName];
|
|
291
|
-
rv.name =
|
|
285
|
+
rv.name = measurement? `${measurement} 0x${id}`: `0x${id}`;
|
|
292
286
|
rv.unit = unit;
|
|
293
287
|
rv.role = measurement;
|
|
294
288
|
|
|
@@ -306,8 +300,8 @@ const generator = {
|
|
|
306
300
|
write: true,
|
|
307
301
|
read: true,
|
|
308
302
|
type: 'boolean',
|
|
309
|
-
getter: payload =>
|
|
310
|
-
setter:
|
|
303
|
+
getter: payload => payload[`state_${epName}`] === 'ON',
|
|
304
|
+
setter: value => value ? 'ON' : 'OFF',
|
|
311
305
|
epname: epName,
|
|
312
306
|
setattr: 'state',
|
|
313
307
|
});
|
|
@@ -323,7 +317,7 @@ const generator = {
|
|
|
323
317
|
read: true,
|
|
324
318
|
type: 'boolean',
|
|
325
319
|
isEvent: true,
|
|
326
|
-
getter: payload =>
|
|
320
|
+
getter: payload => payload.action === `single_${epName}` ? true : undefined,
|
|
327
321
|
});
|
|
328
322
|
devstates.push({
|
|
329
323
|
id: `channel_${epID}.double`,
|
|
@@ -335,7 +329,7 @@ const generator = {
|
|
|
335
329
|
read: true,
|
|
336
330
|
type: 'boolean',
|
|
337
331
|
isEvent: true,
|
|
338
|
-
getter: payload =>
|
|
332
|
+
getter: payload => payload.action === `double_${epName}` ? true : undefined,
|
|
339
333
|
});
|
|
340
334
|
devstates.push({
|
|
341
335
|
id: `channel_${epID}.tripple`,
|
|
@@ -347,7 +341,7 @@ const generator = {
|
|
|
347
341
|
read: true,
|
|
348
342
|
type: 'boolean',
|
|
349
343
|
isEvent: true,
|
|
350
|
-
getter: payload =>
|
|
344
|
+
getter: payload => payload.action === `tripple_${epName}` ? true : undefined,
|
|
351
345
|
});
|
|
352
346
|
}
|
|
353
347
|
if (endpoint.supportsOutputCluster('genLevelCtrl')) {
|
|
@@ -362,12 +356,8 @@ const generator = {
|
|
|
362
356
|
unit: '',
|
|
363
357
|
min: 0,
|
|
364
358
|
max: 100,
|
|
365
|
-
getter: payload => {
|
|
366
|
-
|
|
367
|
-
},
|
|
368
|
-
setter: (value) => {
|
|
369
|
-
return utils.adapterLevelToBulbLevel(value);
|
|
370
|
-
},
|
|
359
|
+
getter: payload => utils.bulbLevelToAdapterLevel(payload[`brightness_${epName}`]),
|
|
360
|
+
setter: value => utils.adapterLevelToBulbLevel(value),
|
|
371
361
|
epname: epName,
|
|
372
362
|
setattr: 'brightness',
|
|
373
363
|
});
|
|
@@ -386,9 +376,7 @@ const generator = {
|
|
|
386
376
|
getter: payload => { //l3=0 brightness_l3=0
|
|
387
377
|
return payload[`${epName}`]; //return payload[`brightness_${epName}`];
|
|
388
378
|
},
|
|
389
|
-
setter:
|
|
390
|
-
return value;
|
|
391
|
-
},
|
|
379
|
+
setter: value => value,
|
|
392
380
|
epname: epName
|
|
393
381
|
});
|
|
394
382
|
}
|
|
@@ -438,9 +426,15 @@ const generator = {
|
|
|
438
426
|
read: true,
|
|
439
427
|
type: 'boolean',
|
|
440
428
|
getter: payload => {
|
|
441
|
-
if ((payload.action_group % ecount) != (epidx % ecount))
|
|
442
|
-
|
|
443
|
-
|
|
429
|
+
if ((payload.action_group % ecount) != (epidx % ecount)) {
|
|
430
|
+
return undefined;
|
|
431
|
+
}
|
|
432
|
+
if (payload.action === 'brightness_move_up') {
|
|
433
|
+
return true;
|
|
434
|
+
}
|
|
435
|
+
if (payload.action === 'brightness_stop') {
|
|
436
|
+
return false;
|
|
437
|
+
}
|
|
444
438
|
return undefined;
|
|
445
439
|
},
|
|
446
440
|
});
|
|
@@ -454,9 +448,15 @@ const generator = {
|
|
|
454
448
|
read: true,
|
|
455
449
|
type: 'boolean',
|
|
456
450
|
getter: payload => {
|
|
457
|
-
if ((payload.action_group % ecount) != (epidx % ecount))
|
|
458
|
-
|
|
459
|
-
|
|
451
|
+
if ((payload.action_group % ecount) != (epidx % ecount)) {
|
|
452
|
+
return undefined;
|
|
453
|
+
}
|
|
454
|
+
if (payload.action === 'brightness_move_down') {
|
|
455
|
+
return true;
|
|
456
|
+
}
|
|
457
|
+
if (payload.action === 'brightness_stop') {
|
|
458
|
+
return false;
|
|
459
|
+
}
|
|
460
460
|
return undefined;
|
|
461
461
|
},
|
|
462
462
|
});
|
|
@@ -502,8 +502,8 @@ const generator = {
|
|
|
502
502
|
write: true,
|
|
503
503
|
read: true,
|
|
504
504
|
type: 'boolean',
|
|
505
|
-
getter: payload =>
|
|
506
|
-
setter:
|
|
505
|
+
getter: payload => payload[`state_${epName}`] === 'ON',
|
|
506
|
+
setter: value => value ? 'ON' : 'OFF',
|
|
507
507
|
epname: epName,
|
|
508
508
|
setattr: 'state',
|
|
509
509
|
});
|
|
@@ -519,7 +519,7 @@ const generator = {
|
|
|
519
519
|
read: true,
|
|
520
520
|
type: 'boolean',
|
|
521
521
|
isEvent: true,
|
|
522
|
-
getter: payload =>
|
|
522
|
+
getter: payload => payload.action === `single_${epName}` ? true : undefined,
|
|
523
523
|
});
|
|
524
524
|
devstates.push({
|
|
525
525
|
id: `btn_${epID}_double`,
|
|
@@ -531,7 +531,7 @@ const generator = {
|
|
|
531
531
|
read: true,
|
|
532
532
|
type: 'boolean',
|
|
533
533
|
isEvent: true,
|
|
534
|
-
getter: payload =>
|
|
534
|
+
getter: payload => payload.action === `double_${epName}` ? true : undefined,
|
|
535
535
|
});
|
|
536
536
|
devstates.push({
|
|
537
537
|
id: `btn_${epID}_tripple`,
|
|
@@ -543,7 +543,7 @@ const generator = {
|
|
|
543
543
|
read: true,
|
|
544
544
|
type: 'boolean',
|
|
545
545
|
isEvent: true,
|
|
546
|
-
getter: payload =>
|
|
546
|
+
getter: payload => payload.action === `tripple_${epName}` ? true : undefined,
|
|
547
547
|
});
|
|
548
548
|
}
|
|
549
549
|
if (endpoint.supportsOutputCluster('genLevelCtrl')) {
|
|
@@ -558,12 +558,8 @@ const generator = {
|
|
|
558
558
|
unit: '',
|
|
559
559
|
min: 0,
|
|
560
560
|
max: 100,
|
|
561
|
-
getter: payload => {
|
|
562
|
-
|
|
563
|
-
},
|
|
564
|
-
setter: (value) => {
|
|
565
|
-
return utils.adapterLevelToBulbLevel(value);
|
|
566
|
-
},
|
|
561
|
+
getter: payload => utils.bulbLevelToAdapterLevel(payload[`brightness_${epName}`]),
|
|
562
|
+
setter: value => utils.adapterLevelToBulbLevel(value),
|
|
567
563
|
epname: epName,
|
|
568
564
|
setattr: 'brightness',
|
|
569
565
|
});
|
|
@@ -817,14 +813,14 @@ const devices = [
|
|
|
817
813
|
{
|
|
818
814
|
models: ['LLKZMK11LM'],
|
|
819
815
|
icon: 'img/lumi_relay.png',
|
|
820
|
-
states: [states.channel1_state, states.channel2_state, states.load_power,
|
|
816
|
+
states: [states.voltage, states.channel1_state, states.channel2_state, states.load_power,
|
|
821
817
|
states.temperature, states.interlock, states.plug_consumption],
|
|
822
818
|
},
|
|
823
819
|
{
|
|
824
820
|
models: ['ZNCLDJ11LM'],
|
|
825
821
|
icon: 'img/aqara_curtain.png',
|
|
826
822
|
states: [states.curtain_position, states.curtain_running, states.curtain_stop, states.curtain_xiaomi_reverse_direction,
|
|
827
|
-
|
|
823
|
+
states.curtain_xiaomi_reset_limits, states.curtain_xiaomi_hand_open],
|
|
828
824
|
},
|
|
829
825
|
{
|
|
830
826
|
models: ['WXCJKG11LM'],
|
|
@@ -3044,7 +3040,7 @@ const devices = [
|
|
|
3044
3040
|
states: generator.icasa_remote,
|
|
3045
3041
|
},
|
|
3046
3042
|
|
|
3047
|
-
|
|
3043
|
+
/* ------------ images only for admin ------------------- */
|
|
3048
3044
|
{
|
|
3049
3045
|
models: ['E1812'],
|
|
3050
3046
|
icon: 'img/ikea_E1812.png',
|
|
@@ -3075,13 +3071,12 @@ const devices = [
|
|
|
3075
3071
|
},
|
|
3076
3072
|
{
|
|
3077
3073
|
models: ['TI0001-cover'],
|
|
3078
|
-
|
|
3074
|
+
icon: 'img/TI0001-cover.png',
|
|
3079
3075
|
},
|
|
3080
3076
|
{
|
|
3081
3077
|
models: ['E1603/E1702/E1708'],
|
|
3082
3078
|
icon: 'img/ikea_control_outlet.png',
|
|
3083
3079
|
},
|
|
3084
|
-
|
|
3085
3080
|
];
|
|
3086
3081
|
|
|
3087
3082
|
const commonStates = [
|
|
@@ -3094,12 +3089,11 @@ const commonStates = [
|
|
|
3094
3089
|
|
|
3095
3090
|
const groupStates = [states.brightness_step].concat(lightStatesWithColor);
|
|
3096
3091
|
|
|
3097
|
-
|
|
3098
3092
|
function getByModel() {
|
|
3099
3093
|
const byModel = new Map();
|
|
3100
3094
|
for (const device of devices) {
|
|
3101
3095
|
for (const model of device.models) {
|
|
3102
|
-
const stripModel = model.replace(
|
|
3096
|
+
const stripModel = model.replace(/0.*$/g, '').trim();
|
|
3103
3097
|
byModel.set(stripModel, device);
|
|
3104
3098
|
}
|
|
3105
3099
|
}
|
|
@@ -3121,25 +3115,22 @@ function fillStatesWithExposes(allExcludesObj) {
|
|
|
3121
3115
|
function removeEmptyStates(devices) {
|
|
3122
3116
|
for (const device of devices) {
|
|
3123
3117
|
if (Array.isArray(device.states)) {
|
|
3124
|
-
device.states = device.states.filter(
|
|
3118
|
+
device.states = device.states.filter(el => el !== undefined);
|
|
3125
3119
|
}
|
|
3126
3120
|
}
|
|
3127
3121
|
}
|
|
3128
3122
|
|
|
3129
|
-
|
|
3130
3123
|
function findModel(model) {
|
|
3131
3124
|
const byModel = getByModel();
|
|
3132
|
-
const stripModel = (model) ? model.replace(
|
|
3125
|
+
const stripModel = (model) ? model.replace(/0.*$/g, '').trim() : '';
|
|
3133
3126
|
return byModel.get(stripModel);
|
|
3134
3127
|
}
|
|
3135
3128
|
|
|
3136
|
-
|
|
3137
|
-
|
|
3138
3129
|
module.exports = {
|
|
3139
|
-
devices
|
|
3140
|
-
commonStates
|
|
3141
|
-
groupStates
|
|
3130
|
+
devices,
|
|
3131
|
+
commonStates,
|
|
3132
|
+
groupStates,
|
|
3142
3133
|
groupsState: states.groups,
|
|
3143
|
-
fillStatesWithExposes
|
|
3144
|
-
findModel
|
|
3134
|
+
fillStatesWithExposes,
|
|
3135
|
+
findModel,
|
|
3145
3136
|
};
|
package/lib/exclude.js
CHANGED
|
@@ -27,13 +27,12 @@ class Exclude {
|
|
|
27
27
|
debug(msg) {
|
|
28
28
|
this.adapter.log.debug(msg);
|
|
29
29
|
}
|
|
30
|
-
|
|
30
|
+
|
|
31
31
|
warn(msg) {
|
|
32
32
|
this.adapter.log.warn(msg);
|
|
33
33
|
}
|
|
34
34
|
|
|
35
35
|
|
|
36
|
-
|
|
37
36
|
/**
|
|
38
37
|
* @param {ioBroker.Message} obj
|
|
39
38
|
*/
|
|
@@ -42,24 +41,21 @@ class Exclude {
|
|
|
42
41
|
switch (obj.command) {
|
|
43
42
|
case 'addExclude':
|
|
44
43
|
if (obj && obj.message && typeof obj.message === 'object') {
|
|
45
|
-
this.addExclude(obj.from, obj.command, obj.message,
|
|
46
|
-
this.adapter.sendTo(obj.from, obj.command, err, obj.callback);
|
|
47
|
-
});
|
|
44
|
+
this.addExclude(obj.from, obj.command, obj.message, err =>
|
|
45
|
+
this.adapter.sendTo(obj.from, obj.command, err, obj.callback));
|
|
48
46
|
}
|
|
49
47
|
break;
|
|
50
48
|
|
|
51
49
|
case 'getExclude':
|
|
52
50
|
if (obj && obj.message && typeof obj.message === 'object') {
|
|
53
|
-
this.getExclude(
|
|
54
|
-
this.adapter.sendTo(obj.from, obj.command, exclude, obj.callback);
|
|
55
|
-
});
|
|
51
|
+
this.getExclude(exclude =>
|
|
52
|
+
this.adapter.sendTo(obj.from, obj.command, exclude, obj.callback));
|
|
56
53
|
}
|
|
57
54
|
break;
|
|
58
55
|
case 'delExclude':
|
|
59
56
|
if (obj && obj.message) {
|
|
60
|
-
this.delExclude(obj.from, obj.command, obj.message,
|
|
61
|
-
this.adapter.sendTo(obj.from, obj.command, err, obj.callback);
|
|
62
|
-
});
|
|
57
|
+
this.delExclude(obj.from, obj.command, obj.message, err =>
|
|
58
|
+
this.adapter.sendTo(obj.from, obj.command, err, obj.callback));
|
|
63
59
|
}
|
|
64
60
|
break;
|
|
65
61
|
}
|
|
@@ -69,13 +65,14 @@ class Exclude {
|
|
|
69
65
|
getExcludeId(exclude_target) {
|
|
70
66
|
return `${this.extractDeviceId(exclude_target)}`;
|
|
71
67
|
}
|
|
72
|
-
|
|
68
|
+
|
|
73
69
|
extractDeviceId(stateId) {
|
|
74
|
-
if (stateId)
|
|
70
|
+
if (stateId) {
|
|
75
71
|
return stateId.replace(`${this.adapter.namespace}.`, '');
|
|
72
|
+
}
|
|
76
73
|
return '';
|
|
77
74
|
}
|
|
78
|
-
|
|
75
|
+
|
|
79
76
|
extractExcludeId(stateId) {
|
|
80
77
|
return stateId.replace(`${this.adapter.namespace}.exclude.`, '');
|
|
81
78
|
}
|
|
@@ -94,27 +91,25 @@ class Exclude {
|
|
|
94
91
|
{
|
|
95
92
|
type: 'state',
|
|
96
93
|
common: {name: exclude_mod},
|
|
97
|
-
},
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
});
|
|
101
|
-
}
|
|
94
|
+
},
|
|
95
|
+
() => this.adapter.setState(stateId, exclude_mod, true, () =>
|
|
96
|
+
callback()),
|
|
102
97
|
);
|
|
103
98
|
} catch (error) {
|
|
104
99
|
this.error(`Failed to addExclude ${error.stack}`);
|
|
105
100
|
throw new Error(`Failed to addExclude ${error.stack}`);
|
|
106
101
|
}
|
|
107
102
|
}
|
|
103
|
+
|
|
108
104
|
async delExclude(from, command, exclude_id, callback) {
|
|
109
105
|
try {
|
|
110
|
-
this.debug(
|
|
106
|
+
this.debug(`delExclude message: ${JSON.stringify(exclude_id)}`);
|
|
111
107
|
const stateId = `exclude.${exclude_id}`;
|
|
112
108
|
this.adapter.getStateAsync(stateId)
|
|
113
109
|
.then(async (stateV) => {
|
|
114
|
-
this.debug(
|
|
115
|
-
this.adapter.deleteState(null, 'exclude', exclude_id, async () =>
|
|
116
|
-
callback();
|
|
117
|
-
});
|
|
110
|
+
this.debug(`found state: ${JSON.stringify(stateV)}`);
|
|
111
|
+
this.adapter.deleteState(null, 'exclude', exclude_id, async () =>
|
|
112
|
+
callback());
|
|
118
113
|
});
|
|
119
114
|
} catch (error) {
|
|
120
115
|
this.error(`Failed to delExclude ${error.stack}`);
|
|
@@ -130,32 +125,31 @@ class Exclude {
|
|
|
130
125
|
const exc = [];
|
|
131
126
|
states.forEach(state => {
|
|
132
127
|
if (state._id.startsWith(`${this.adapter.namespace}.exclude`)) {
|
|
133
|
-
exc.push(new Promise(resolve =>
|
|
134
|
-
|
|
128
|
+
exc.push(new Promise(resolve =>
|
|
129
|
+
this.adapter.getStateAsync(state._id)
|
|
135
130
|
.then(stateVa => {
|
|
136
131
|
if (stateVa !== null) {
|
|
137
132
|
const val = {
|
|
138
133
|
id: this.extractExcludeId(state._id),
|
|
139
|
-
name
|
|
134
|
+
name: stateVa.val
|
|
140
135
|
};
|
|
141
136
|
if (this.extractExcludeId(state._id) !== 'all') {
|
|
142
137
|
exclude.push(val);
|
|
143
138
|
}
|
|
144
139
|
}
|
|
145
140
|
resolve();
|
|
146
|
-
});
|
|
147
|
-
}));
|
|
141
|
+
})));
|
|
148
142
|
}
|
|
149
143
|
});
|
|
150
|
-
return Promise.all(exc)
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
144
|
+
return Promise.all(exc)
|
|
145
|
+
.then(() => {
|
|
146
|
+
const arrExclude = JSON.stringify(exclude);
|
|
147
|
+
this.debug(`getExclude result: ${arrExclude}`);
|
|
148
|
+
this.adapter.setState('exclude.all', arrExclude, true, () =>
|
|
149
|
+
callback(exclude));
|
|
155
150
|
});
|
|
156
|
-
});
|
|
157
151
|
} else {
|
|
158
|
-
this.debug(
|
|
152
|
+
this.debug(`getExclude result: ${JSON.stringify(exclude)}`);
|
|
159
153
|
callback(exclude);
|
|
160
154
|
}
|
|
161
155
|
});
|