iobroker.zigbee 1.8.3 → 1.8.7

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.
Files changed (87) hide show
  1. package/README.md +6 -0
  2. package/admin/adapter-settings.js +244 -0
  3. package/admin/admin.js +520 -494
  4. package/admin/index_m.html +1171 -1001
  5. package/admin/tab_m.html +44 -2
  6. package/docs/de/img/CC2531.png +0 -0
  7. package/docs/de/img/CC2538_CC2592_PA.PNG +0 -0
  8. package/docs/de/img/CC2591.png +0 -0
  9. package/docs/de/img/boards.jpg +0 -0
  10. package/docs/de/img/cc26x2r.PNG +0 -0
  11. package/docs/de/img/results.jpg +0 -0
  12. package/docs/de/img/sku_429478_2.png +0 -0
  13. package/docs/de/img/sku_429601_2.png +0 -0
  14. package/docs/de/readme.md +27 -0
  15. package/docs/en/img/CC2531.png +0 -0
  16. package/docs/en/img/CC2591.png +0 -0
  17. package/docs/en/img/deconz.png +0 -0
  18. package/docs/en/img/sku_429478_2.png +0 -0
  19. package/docs/en/img/sku_429601_2.png +0 -0
  20. package/docs/en/readme.md +30 -0
  21. package/docs/flashing_via_arduino_(en).md +110 -0
  22. package/docs/ru/img/CC2531.png +0 -0
  23. package/docs/ru/img/CC2591.png +0 -0
  24. package/docs/ru/img/sku_429478_2.png +0 -0
  25. package/docs/ru/img/sku_429601_2.png +0 -0
  26. package/docs/ru/readme.md +28 -0
  27. package/docs/tutorial/CC2530_20190425.zip +0 -0
  28. package/docs/tutorial/CC2530_CC2591_20190515.zip +0 -0
  29. package/docs/tutorial/CC2530_CC2592_20190515.zip +0 -0
  30. package/docs/tutorial/CC2531_20190425.zip +0 -0
  31. package/docs/tutorial/adm5_1.PNG +0 -0
  32. package/docs/tutorial/adm5_2.PNG +0 -0
  33. package/docs/tutorial/cat.PNG +0 -0
  34. package/docs/tutorial/groups-1.png +0 -0
  35. package/docs/tutorial/groups-2.png +0 -0
  36. package/docs/tutorial/inst.PNG +0 -0
  37. package/docs/tutorial/reflash-finish.PNG +0 -0
  38. package/docs/tutorial/reflash-step0.png +0 -0
  39. package/docs/tutorial/reflash-step1.PNG +0 -0
  40. package/docs/tutorial/reflash-step2.PNG +0 -0
  41. package/docs/tutorial/settings.png +0 -0
  42. package/docs/tutorial/tab-dev-1.png +0 -0
  43. package/docs/tutorial/zigbee.png +0 -0
  44. package/docs/tutorial/zigbee15.png +0 -0
  45. package/io-package.json +34 -33
  46. package/lib/backup.js +2 -2
  47. package/lib/binding.js +32 -37
  48. package/lib/colors.js +163 -158
  49. package/lib/commands.js +100 -91
  50. package/lib/developer.js +9 -12
  51. package/lib/devices.js +168 -178
  52. package/lib/exclude.js +30 -36
  53. package/lib/exposes.js +168 -143
  54. package/lib/groups.js +81 -83
  55. package/lib/json.js +5 -6
  56. package/lib/networkmap.js +2 -3
  57. package/lib/ota.js +34 -18
  58. package/lib/rgb.js +114 -72
  59. package/lib/seriallist.js +25 -20
  60. package/lib/statescontroller.js +206 -183
  61. package/lib/utils.js +29 -23
  62. package/lib/zbBaseExtension.js +4 -4
  63. package/lib/zbDelayedAction.js +5 -13
  64. package/lib/zbDeviceAvailability.js +69 -65
  65. package/lib/zbDeviceConfigure.js +9 -21
  66. package/lib/zbDeviceEvent.js +3 -4
  67. package/lib/zigbeecontroller.js +133 -128
  68. package/main.js +169 -154
  69. package/package.json +28 -14
  70. package/.eslintignore +0 -2
  71. package/.eslintrc.json +0 -37
  72. package/.github/FUNDING.yml +0 -3
  73. package/.github/auto-merge.yml +0 -17
  74. package/.github/dependabot.yml +0 -24
  75. package/.github/stale.yml +0 -13
  76. package/.github/workflows/codeql.yml +0 -41
  77. package/.github/workflows/dependabot-automerge.yml +0 -22
  78. package/.github/workflows/test-and-release.yml +0 -149
  79. package/.releaseconfig.json +0 -3
  80. package/.travis/wiki.sh +0 -28
  81. package/.travis.yml +0 -41
  82. package/gulpfile.js +0 -464
  83. package/test/integration.js +0 -5
  84. package/test/mocha.custom.opts +0 -2
  85. package/test/mocha.setup.js +0 -14
  86. package/test/package.js +0 -5
  87. package/test/unit.js +0 -5
package/gulpfile.js DELETED
@@ -1,464 +0,0 @@
1
- /*!
2
- * ioBroker gulpfile
3
- * Date: 2019-01-22
4
- */
5
- /*eslint no-unused-vars: ['off']*/
6
- 'use strict';
7
-
8
- const gulp = require('gulp');
9
- const fs = require('fs');
10
- const pkg = require('./package.json');
11
- const iopackage = require('./io-package.json');
12
- const version = (pkg && pkg.version) ? pkg.version : iopackage.common.version;
13
- const fileName = 'words.js';
14
- const EMPTY = '';
15
- const translate = require('./lib/tools.js').translateText;
16
- const languages = {
17
- en: {},
18
- de: {},
19
- ru: {},
20
- pt: {},
21
- nl: {},
22
- fr: {},
23
- it: {},
24
- es: {},
25
- pl: {},
26
- 'zh-cn': {}
27
- };
28
-
29
- function lang2data(lang, isFlat) {
30
- let str = isFlat ? '' : '{\n';
31
- let count = 0;
32
- for (const w in lang) {
33
- if (lang.hasOwnProperty(w)) {
34
- count++;
35
- if (isFlat) {
36
- str += (lang[w] === '' ? (isFlat[w] || w) : lang[w]) + '\n';
37
- } else {
38
- const key = ' "' + w.replace(/"/g, '\\"') + '": ';
39
- str += key + '"' + lang[w].replace(/"/g, '\\"') + '",\n';
40
- }
41
- }
42
- }
43
- if (!count)
44
- return isFlat ? '' : '{\n}';
45
- if (isFlat) {
46
- return str;
47
- } else {
48
- return str.substring(0, str.length - 2) + '\n}';
49
- }
50
- }
51
-
52
- function readWordJs(src) {
53
- try {
54
- let words;
55
- if (fs.existsSync(src + 'js/' + fileName)) {
56
- words = fs.readFileSync(src + 'js/' + fileName).toString();
57
- } else {
58
- words = fs.readFileSync(src + fileName).toString();
59
- }
60
- words = words.substring(words.indexOf('{'), words.length);
61
- words = words.substring(0, words.lastIndexOf(';'));
62
-
63
- const resultFunc = new Function('return ' + words + ';');
64
-
65
- return resultFunc();
66
- } catch (e) {
67
- return null;
68
- }
69
- }
70
-
71
- function padRight(text, totalLength) {
72
- return text + (text.length < totalLength ? new Array(totalLength - text.length).join(' ') : '');
73
- }
74
-
75
- function writeWordJs(data, src) {
76
- let text = '';
77
- text += '/*global systemDictionary:true */\n';
78
- text += '\'use strict\';\n\n';
79
- text += 'systemDictionary = {\n';
80
- for (const word in data) {
81
- if (data.hasOwnProperty(word)) {
82
- text += ' ' + padRight('"' + word.replace(/"/g, '\\"') + '": {', 50);
83
- let line = '';
84
- for (const lang in data[word]) {
85
- if (data[word].hasOwnProperty(lang)) {
86
- line += '"' + lang + '": "' + padRight(data[word][lang].replace(/"/g, '\\"') + '",', 50) + ' ';
87
- }
88
- }
89
- if (line) {
90
- line = line.trim();
91
- line = line.substring(0, line.length - 1);
92
- }
93
- text += line + '},\n';
94
- }
95
- }
96
- text += '};';
97
- if (fs.existsSync(src + 'js/' + fileName)) {
98
- fs.writeFileSync(src + 'js/' + fileName, text);
99
- } else {
100
- fs.writeFileSync(src + '' + fileName, text);
101
- }
102
- }
103
-
104
- function words2languages(src) {
105
- const langs = Object.assign({}, languages);
106
- const data = readWordJs(src);
107
- if (data) {
108
- for (const word in data) {
109
- if (data.hasOwnProperty(word)) {
110
- for (const lang in data[word]) {
111
- if (data[word].hasOwnProperty(lang)) {
112
- langs[lang][word] = data[word][lang];
113
- // pre-fill all other languages
114
- for (const j in langs) {
115
- if (langs.hasOwnProperty(j)) {
116
- langs[j][word] = langs[j][word] || EMPTY;
117
- }
118
- }
119
- }
120
- }
121
- }
122
- }
123
- if (!fs.existsSync(src + 'i18n/')) {
124
- fs.mkdirSync(src + 'i18n/');
125
- }
126
- for (const l in langs) {
127
- if (!langs.hasOwnProperty(l))
128
- continue;
129
- const keys = Object.keys(langs[l]);
130
- keys.sort();
131
- const obj = {};
132
- for (let k = 0; k < keys.length; k++) {
133
- obj[keys[k]] = langs[l][keys[k]];
134
- }
135
- if (!fs.existsSync(src + 'i18n/' + l)) {
136
- fs.mkdirSync(src + 'i18n/' + l);
137
- }
138
-
139
- fs.writeFileSync(src + 'i18n/' + l + '/translations.json', lang2data(obj));
140
- }
141
- } else {
142
- console.error('Cannot read or parse ' + fileName);
143
- }
144
- }
145
-
146
- function words2languagesFlat(src) {
147
- const langs = Object.assign({}, languages);
148
- const data = readWordJs(src);
149
- if (data) {
150
- for (const word in data) {
151
- if (data.hasOwnProperty(word)) {
152
- for (const lang in data[word]) {
153
- if (data[word].hasOwnProperty(lang)) {
154
- langs[lang][word] = data[word][lang];
155
- // pre-fill all other languages
156
- for (const j in langs) {
157
- if (langs.hasOwnProperty(j)) {
158
- langs[j][word] = langs[j][word] || EMPTY;
159
- }
160
- }
161
- }
162
- }
163
- }
164
- }
165
- const keys = Object.keys(langs.en);
166
- keys.sort();
167
- for (const l in langs) {
168
- if (!langs.hasOwnProperty(l))
169
- continue;
170
- const obj = {};
171
- for (let k = 0; k < keys.length; k++) {
172
- obj[keys[k]] = langs[l][keys[k]];
173
- }
174
- langs[l] = obj;
175
- }
176
- if (!fs.existsSync(src + 'i18n/')) {
177
- fs.mkdirSync(src + 'i18n/');
178
- }
179
- for (const ll in langs) {
180
- if (!langs.hasOwnProperty(ll))
181
- continue;
182
- if (!fs.existsSync(src + 'i18n/' + ll)) {
183
- fs.mkdirSync(src + 'i18n/' + ll);
184
- }
185
-
186
- fs.writeFileSync(src + 'i18n/' + ll + '/flat.txt', lang2data(langs[ll], langs.en));
187
- }
188
- fs.writeFileSync(src + 'i18n/flat.txt', keys.join('\n'));
189
- } else {
190
- console.error('Cannot read or parse ' + fileName);
191
- }
192
- }
193
-
194
- function languagesFlat2words(src) {
195
- const dirs = fs.readdirSync(src + 'i18n/');
196
- const langs = {};
197
- const bigOne = {};
198
- const order = Object.keys(languages);
199
- dirs.sort(function (a, b) {
200
- const posA = order.indexOf(a);
201
- const posB = order.indexOf(b);
202
- if (posA === -1 && posB === -1) {
203
- if (a > b)
204
- return 1;
205
- if (a < b)
206
- return -1;
207
- return 0;
208
- } else if (posA === -1) {
209
- return -1;
210
- } else if (posB === -1) {
211
- return 1;
212
- } else {
213
- if (posA > posB)
214
- return 1;
215
- if (posA < posB)
216
- return -1;
217
- return 0;
218
- }
219
- });
220
- const keys = fs.readFileSync(src + 'i18n/flat.txt').toString().split('\n');
221
-
222
- for (let l = 0; l < dirs.length; l++) {
223
- if (dirs[l] === 'flat.txt')
224
- continue;
225
- const lang = dirs[l];
226
- const values = fs.readFileSync(src + 'i18n/' + lang + '/flat.txt').toString().split('\n');
227
- langs[lang] = {};
228
- keys.forEach(function (word, i) {
229
- langs[lang][word] = values[i];
230
- });
231
-
232
- const words = langs[lang];
233
- for (const word in words) {
234
- if (words.hasOwnProperty(word)) {
235
- bigOne[word] = bigOne[word] || {};
236
- if (words[word] !== EMPTY) {
237
- bigOne[word][lang] = words[word];
238
- }
239
- }
240
- }
241
- }
242
- // read actual words.js
243
- const aWords = readWordJs();
244
-
245
- const temporaryIgnore = ['flat.txt'];
246
- if (aWords) {
247
- // Merge words together
248
- for (const w in aWords) {
249
- if (aWords.hasOwnProperty(w)) {
250
- if (!bigOne[w]) {
251
- console.warn('Take from actual words.js: ' + w);
252
- bigOne[w] = aWords[w];
253
- }
254
- dirs.forEach(function (lang) {
255
- if (temporaryIgnore.indexOf(lang) !== -1)
256
- return;
257
- if (!bigOne[w][lang]) {
258
- console.warn('Missing "' + lang + '": ' + w);
259
- }
260
- });
261
- }
262
- }
263
-
264
- }
265
-
266
- writeWordJs(bigOne, src);
267
- }
268
-
269
- function languages2words(src) {
270
- const dirs = fs.readdirSync(src + 'i18n/');
271
- const langs = {};
272
- const bigOne = {};
273
- const order = Object.keys(languages);
274
- dirs.sort(function (a, b) {
275
- const posA = order.indexOf(a);
276
- const posB = order.indexOf(b);
277
- if (posA === -1 && posB === -1) {
278
- if (a > b)
279
- return 1;
280
- if (a < b)
281
- return -1;
282
- return 0;
283
- } else if (posA === -1) {
284
- return -1;
285
- } else if (posB === -1) {
286
- return 1;
287
- } else {
288
- if (posA > posB)
289
- return 1;
290
- if (posA < posB)
291
- return -1;
292
- return 0;
293
- }
294
- });
295
- for (let l = 0; l < dirs.length; l++) {
296
- if (dirs[l] === 'flat.txt')
297
- continue;
298
- const lang = dirs[l];
299
- langs[lang] = fs.readFileSync(src + 'i18n/' + lang + '/translations.json').toString();
300
- langs[lang] = JSON.parse(langs[lang]);
301
- const words = langs[lang];
302
- for (const word in words) {
303
- if (words.hasOwnProperty(word)) {
304
- bigOne[word] = bigOne[word] || {};
305
- if (words[word] !== EMPTY) {
306
- bigOne[word][lang] = words[word];
307
- }
308
- }
309
- }
310
- }
311
- // read actual words.js
312
- const aWords = readWordJs();
313
-
314
- const temporaryIgnore = ['flat.txt'];
315
- if (aWords) {
316
- // Merge words together
317
- for (const w in aWords) {
318
- if (aWords.hasOwnProperty(w)) {
319
- if (!bigOne[w]) {
320
- console.warn('Take from actual words.js: ' + w);
321
- bigOne[w] = aWords[w];
322
- }
323
- dirs.forEach(function (lang) {
324
- if (temporaryIgnore.indexOf(lang) !== -1)
325
- return;
326
- if (!bigOne[w][lang]) {
327
- console.warn('Missing "' + lang + '": ' + w);
328
- }
329
- });
330
- }
331
- }
332
-
333
- }
334
-
335
- writeWordJs(bigOne, src);
336
- }
337
-
338
- async function translateNotExisting(obj, baseText) {
339
- let t = obj['en'];
340
- if (!t) {
341
- t = baseText;
342
- }
343
-
344
- if (t) {
345
- for (const l in languages) {
346
- if (!obj[l]) {
347
- obj[l] = await translate(t, l);
348
- }
349
- }
350
- }
351
- }
352
-
353
- //TASKS
354
-
355
- gulp.task('adminWords2languages', function (done) {
356
- words2languages('./admin/');
357
- done();
358
- });
359
-
360
- gulp.task('adminWords2languagesFlat', function (done) {
361
- words2languagesFlat('./admin/');
362
- done();
363
- });
364
-
365
- gulp.task('adminLanguagesFlat2words', function (done) {
366
- languagesFlat2words('./admin/');
367
- done();
368
- });
369
-
370
- gulp.task('adminLanguages2words', function (done) {
371
- languages2words('./admin/');
372
- done();
373
- });
374
-
375
- gulp.task('updatePackages', function (done) {
376
- iopackage.common.version = pkg.version;
377
- iopackage.common.news = iopackage.common.news || {};
378
- if (!iopackage.common.news[pkg.version]) {
379
- const news = iopackage.common.news;
380
- const newNews = {};
381
-
382
- newNews[pkg.version] = {
383
- en: 'news',
384
- de: 'neues',
385
- ru: 'новое',
386
- pt: 'novidades',
387
- nl: 'nieuws',
388
- fr: 'nouvelles',
389
- it: 'notizie',
390
- es: 'noticias',
391
- pl: 'nowości',
392
- 'zh-cn': '新'
393
- };
394
- iopackage.common.news = Object.assign(newNews, news);
395
- }
396
- fs.writeFileSync('io-package.json', JSON.stringify(iopackage, null, 4));
397
- done();
398
- });
399
-
400
- gulp.task('updateReadme', function (done) {
401
- const readme = fs.readFileSync('README.md').toString();
402
- const pos = readme.indexOf('## Changelog\n');
403
- if (pos !== -1) {
404
- const readmeStart = readme.substring(0, pos + '## Changelog\n'.length);
405
- const readmeEnd = readme.substring(pos + '## Changelog\n'.length);
406
-
407
- if (readme.indexOf(version) === -1) {
408
- const timestamp = new Date();
409
- const date = timestamp.getFullYear() + '-' +
410
- ('0' + (timestamp.getMonth() + 1).toString(10)).slice(-2) + '-' +
411
- ('0' + (timestamp.getDate()).toString(10)).slice(-2);
412
-
413
- let news = '';
414
- if (iopackage.common.news && iopackage.common.news[pkg.version]) {
415
- news += '* ' + iopackage.common.news[pkg.version].en;
416
- }
417
-
418
- fs.writeFileSync('README.md', readmeStart + '### ' + version + ' (' + date + ')\n' + (news ? news + '\n\n' : '\n') + readmeEnd);
419
- }
420
- }
421
- done();
422
- });
423
-
424
- gulp.task('translate', async function (done) {
425
- if (iopackage && iopackage.common) {
426
- if (iopackage.common.news) {
427
- for (const k in iopackage.common.news) {
428
- const nw = iopackage.common.news[k];
429
- await translateNotExisting(nw);
430
- }
431
- }
432
- if (iopackage.common.titleLang) {
433
- await translateNotExisting(iopackage.common.titleLang, iopackage.common.title);
434
- }
435
- if (iopackage.common.desc) {
436
- await translateNotExisting(iopackage.common.desc);
437
- }
438
-
439
- if (fs.existsSync('./admin/i18n/en/translations.json')) {
440
- const enTranslations = require('./admin/i18n/en/translations.json');
441
- for (const l in languages) {
442
- let existing = {};
443
- if (fs.existsSync('./admin/i18n/' + l + '/translations.json')) {
444
- existing = require('./admin/i18n/' + l + '/translations.json');
445
- }
446
- for (const t in enTranslations) {
447
- if (!existing[t]) {
448
- existing[t] = await translate(enTranslations[t], l);
449
- }
450
- }
451
- if (!fs.existsSync('./admin/i18n/' + l + '/')) {
452
- fs.mkdirSync('./admin/i18n/' + l + '/');
453
- }
454
- fs.writeFileSync('./admin/i18n/' + l + '/translations.json', JSON.stringify(existing, null, 4));
455
- }
456
- }
457
-
458
- }
459
- fs.writeFileSync('io-package.json', JSON.stringify(iopackage, null, 4));
460
- });
461
-
462
- gulp.task('translateAndUpdateWordsJS', gulp.series('translate', 'adminLanguages2words', 'adminWords2languages'));
463
-
464
- gulp.task('default', gulp.series('updatePackages', 'updateReadme'));
@@ -1,5 +0,0 @@
1
- const path = require('path');
2
- const { tests } = require('@iobroker/testing');
3
-
4
- // Run integration tests - See https://github.com/ioBroker/testing for a detailed explanation and further options
5
- tests.integration(path.join(__dirname, '..'));
@@ -1,2 +0,0 @@
1
- --require test/mocha.setup.js
2
- {!(node_modules|test)/**/*.test.js,*.test.js,test/**/test!(PackageFiles|Startup).js}
@@ -1,14 +0,0 @@
1
- // Don't silently swallow unhandled rejections
2
- process.on('unhandledRejection', (e) => {
3
- throw e;
4
- });
5
-
6
- // enable the should interface with sinon
7
- // and load chai-as-promised and sinon-chai by default
8
- const sinonChai = require('sinon-chai');
9
- const chaiAsPromised = require('chai-as-promised');
10
- const { should, use } = require('chai');
11
-
12
- should();
13
- use(sinonChai);
14
- use(chaiAsPromised);
package/test/package.js DELETED
@@ -1,5 +0,0 @@
1
- const path = require('path');
2
- const { tests } = require('@iobroker/testing');
3
-
4
- // Validate the package files
5
- tests.packageFiles(path.join(__dirname, '..'));
package/test/unit.js DELETED
@@ -1,5 +0,0 @@
1
- const path = require('path');
2
- const { tests } = require('@iobroker/testing');
3
-
4
- // Run unit tests - See https://github.com/ioBroker/testing for a detailed explanation and further options
5
- tests.unit(path.join(__dirname, '..'));