iobroker.device-watcher 2.12.2 → 2.12.4

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/lib/crud.js ADDED
@@ -0,0 +1,1942 @@
1
+ const translations = require("./translations");
2
+ const tools = require("./tools");
3
+
4
+ /**
5
+ * @param {object} adptName - Adaptername of devices
6
+ */
7
+ async function createDPsForEachAdapter(adaptr, adptName) {
8
+ await adaptr.setObjectNotExistsAsync(`devices.${adptName}`, {
9
+ type: 'channel',
10
+ common: {
11
+ name: adptName,
12
+ },
13
+ native: {},
14
+ });
15
+
16
+ await adaptr.setObjectNotExistsAsync(`devices.${adptName}.offlineCount`, {
17
+ type: 'state',
18
+ common: {
19
+ name: {
20
+ en: 'Number of devices offline',
21
+ de: 'Anzahl der Ger�te offline',
22
+ ru: '?????????? ????????? offline',
23
+ pt: 'N�mero de dispositivos offline',
24
+ nl: 'Nummer van apparatuur offline',
25
+ fr: 'Nombre de dispositifs hors ligne',
26
+ it: 'Numero di dispositivi offline',
27
+ es: 'N�mero de dispositivos sin conexi�n',
28
+ pl: 'Ilo?? urz?dze? offline',
29
+ 'zh-cn': '??????',
30
+ },
31
+ type: 'number',
32
+ role: 'value',
33
+ read: true,
34
+ write: false,
35
+ },
36
+ native: {},
37
+ });
38
+
39
+ await adaptr.setObjectNotExistsAsync(`devices.${adptName}.offlineList`, {
40
+ type: 'state',
41
+ common: {
42
+ name: {
43
+ en: 'List of offline devices',
44
+ de: 'Liste der Offline-Ger�te',
45
+ ru: '?????? ??????? ?????????',
46
+ pt: 'Lista de dispositivos off-line',
47
+ nl: 'List van offline apparatuur',
48
+ fr: 'Liste des dispositifs hors ligne',
49
+ it: 'Elenco dei dispositivi offline',
50
+ es: 'Lista de dispositivos sin conexi�n',
51
+ pl: 'Lista urz?dze? offline',
52
+ 'zh-cn': '?????',
53
+ },
54
+ type: 'array',
55
+ role: 'json',
56
+ read: true,
57
+ write: false,
58
+ },
59
+ native: {},
60
+ });
61
+
62
+ await adaptr.setObjectNotExistsAsync(`devices.${adptName}.oneDeviceOffline`, {
63
+ type: 'state',
64
+ common: {
65
+ name: {
66
+ en: 'Is one device with offline',
67
+ de: 'Ist ein Ger�t mit Offline',
68
+ ru: '??? ???? ?????????? ? offline',
69
+ pt: '� um dispositivo com offline',
70
+ nl: 'Is een apparaat met offline',
71
+ fr: 'Est un appareil avec hors ligne',
72
+ it: '� un dispositivo con offline',
73
+ es: 'Es un dispositivo sin conexi�n',
74
+ pl: 'Jest to jeden urz?dzenie z offlinem',
75
+ // @ts-ignore
76
+ uk: '? ???? ???????? ? ??????????',
77
+ 'zh-cn': '??????',
78
+ },
79
+ type: 'boolean',
80
+ role: 'state',
81
+ read: true,
82
+ write: false,
83
+ def: false,
84
+ },
85
+ native: {},
86
+ });
87
+
88
+ await adaptr.setObjectNotExistsAsync(`devices.${adptName}.listAllRawJSON`, {
89
+ type: 'state',
90
+ common: {
91
+ name: {
92
+ en: 'JSON RAW List of all devices',
93
+ de: 'JSON RAW Liste aller Ger�te',
94
+ ru: '????? ??? ?????? ???? ?????????',
95
+ pt: 'JSON RAW Lista de todos os dispositivos',
96
+ nl: 'JSON RAW List van alle apparaten',
97
+ fr: 'JSON RAW Liste de tous les dispositifs',
98
+ it: 'JSON RAW Elenco di tutti i dispositivi',
99
+ es: 'JSON RAW Lista de todos los dispositivos',
100
+ pl: 'JSON RAW Lista wszystkich urz?dze?',
101
+ // @ts-ignore
102
+ uk: '????? ??? ?????? ???? ?????????',
103
+ 'zh-cn': 'JSONRAW ??????',
104
+ },
105
+ type: 'array',
106
+ role: 'json',
107
+ read: true,
108
+ write: false,
109
+ },
110
+ native: {},
111
+ });
112
+
113
+ await adaptr.setObjectNotExistsAsync(`devices.${adptName}.listAll`, {
114
+ type: 'state',
115
+ common: {
116
+ name: {
117
+ en: 'List of all devices',
118
+ de: 'Liste aller Ger�te',
119
+ ru: '?????? ???? ?????????',
120
+ pt: 'Lista de todos os dispositivos',
121
+ nl: 'List van alle apparaten',
122
+ fr: 'Liste de tous les dispositifs',
123
+ it: 'Elenco di tutti i dispositivi',
124
+ es: 'Lista de todos los dispositivos',
125
+ pl: 'Lista wszystkich urz?dze?',
126
+ 'zh-cn': '??????',
127
+ },
128
+ type: 'array',
129
+ role: 'json',
130
+ read: true,
131
+ write: false,
132
+ },
133
+ native: {},
134
+ });
135
+
136
+ await adaptr.setObjectNotExistsAsync(`devices.${adptName}.linkQualityList`, {
137
+ type: 'state',
138
+ common: {
139
+ name: {
140
+ en: 'List of devices with signal strength',
141
+ de: 'Liste der Ger�te mit Signalst�rke',
142
+ ru: '?????? ????????? ? ????? ???????',
143
+ pt: 'Lista de dispositivos com for�a de sinal',
144
+ nl: 'List van apparaten met signaalkracht',
145
+ fr: 'Liste des dispositifs avec force de signal',
146
+ it: 'Elenco dei dispositivi con forza del segnale',
147
+ es: 'Lista de dispositivos con fuerza de se�al',
148
+ pl: 'Lista urz?dze? z si?? sygna?ow?',
149
+ 'zh-cn': '???????????',
150
+ },
151
+ type: 'array',
152
+ role: 'json',
153
+ read: true,
154
+ write: false,
155
+ },
156
+ native: {},
157
+ });
158
+
159
+ await adaptr.setObjectNotExistsAsync(`devices.${adptName}.countAll`, {
160
+ type: 'state',
161
+ common: {
162
+ name: {
163
+ en: 'Number of all devices',
164
+ de: 'Anzahl aller Ger�te',
165
+ ru: '?????????? ???? ?????????',
166
+ pt: 'N�mero de todos os dispositivos',
167
+ nl: 'Nummer van alle apparaten',
168
+ fr: 'Nombre de tous les appareils',
169
+ it: 'Numero di tutti i dispositivi',
170
+ es: 'N�mero de todos los dispositivos',
171
+ pl: 'Ilo?? wszystkich urz?dze?',
172
+ 'zh-cn': '???????',
173
+ },
174
+ type: 'number',
175
+ role: 'value',
176
+ read: true,
177
+ write: false,
178
+ },
179
+ native: {},
180
+ });
181
+
182
+ await adaptr.setObjectNotExistsAsync(`devices.${adptName}.batteryList`, {
183
+ type: 'state',
184
+ common: {
185
+ name: {
186
+ en: 'List of devices with battery state',
187
+ de: 'Liste der Ger�te mit Batteriezustand',
188
+ ru: '?????? ????????? ? ?????????? ???????',
189
+ pt: 'Lista de dispositivos com estado da bateria',
190
+ nl: 'List van apparaten met batterij staat',
191
+ fr: 'Liste des appareils avec �tat de batterie',
192
+ it: 'Elenco dei dispositivi con stato della batteria',
193
+ es: 'Lista de dispositivos con estado de bater�a',
194
+ pl: 'Lista urz?dze? z bateri? stanow?',
195
+ 'zh-cn': '???????',
196
+ },
197
+ type: 'array',
198
+ role: 'json',
199
+ read: true,
200
+ write: false,
201
+ },
202
+ native: {},
203
+ });
204
+
205
+ await adaptr.setObjectNotExistsAsync(`devices.${adptName}.lowBatteryList`, {
206
+ type: 'state',
207
+ common: {
208
+ name: {
209
+ en: 'List of devices with low battery state',
210
+ de: 'Liste der Ger�te mit niedrigem Batteriezustand',
211
+ ru: '?????? ????????? ? ?????? ?????????? ???????',
212
+ pt: 'Lista de dispositivos com baixo estado da bateria',
213
+ nl: 'List van apparaten met lage batterij staat',
214
+ fr: 'Liste des appareils � faible �tat de batterie',
215
+ it: 'Elenco di dispositivi con stato di batteria basso',
216
+ es: 'Lista de dispositivos con estado de bater�a bajo',
217
+ pl: 'Lista urz?dze? o niskim stanie baterii',
218
+ 'zh-cn': '?????????',
219
+ },
220
+ type: 'array',
221
+ role: 'json',
222
+ read: true,
223
+ write: false,
224
+ },
225
+ native: {},
226
+ });
227
+
228
+ await adaptr.setObjectNotExistsAsync(`devices.${adptName}.lowBatteryCount`, {
229
+ type: 'state',
230
+ common: {
231
+ name: {
232
+ en: 'Number of devices with low battery',
233
+ de: 'Anzahl der Ger�te mit niedriger Batterie',
234
+ ru: '?????????? ????????? c ?????? ????????',
235
+ pt: 'N�mero de dispositivos com bateria baixa',
236
+ nl: 'Nummer van apparaten met lage batterij',
237
+ fr: 'Nombre de dispositifs avec batterie basse',
238
+ it: 'Numero di dispositivi con batteria bassa',
239
+ es: 'N�mero de dispositivos con bater�a baja',
240
+ pl: 'Liczba urz?dze? z nisk? bateri?',
241
+ 'zh-cn': '????????',
242
+ },
243
+ type: 'number',
244
+ role: 'value',
245
+ read: true,
246
+ write: false,
247
+ },
248
+ native: {},
249
+ });
250
+
251
+ await adaptr.setObjectNotExistsAsync(`devices.${adptName}.oneDeviceLowBat`, {
252
+ type: 'state',
253
+ common: {
254
+ name: {
255
+ en: 'Is one device with low battery',
256
+ de: 'Ist ein Ger�t mit niedrigem Akku',
257
+ ru: '???? ?????? ? ?????? ????????',
258
+ pt: '� um dispositivo com bateria baixa',
259
+ nl: 'Is een apparaat met lage batterijen',
260
+ fr: 'Est un appareil avec batterie basse',
261
+ it: '� un dispositivo con batteria bassa',
262
+ es: 'Es un dispositivo con bater�a baja',
263
+ pl: 'Jest to jeden urz?dzenie z nisk? bateri?',
264
+ // @ts-ignore
265
+ uk: '? ????? ????????? ? ??????? ????????????',
266
+ 'zh-cn': '??????',
267
+ },
268
+ type: 'boolean',
269
+ role: 'state',
270
+ read: true,
271
+ write: false,
272
+ def: false,
273
+ },
274
+ native: {},
275
+ });
276
+
277
+ await adaptr.setObjectNotExistsAsync(`devices.${adptName}.batteryCount`, {
278
+ type: 'state',
279
+ common: {
280
+ name: {
281
+ en: 'Number of devices with battery',
282
+ de: 'Anzahl der Ger�te mit Batterie',
283
+ ru: '?????????? ????????? c ????????',
284
+ pt: 'N�mero de dispositivos com bateria',
285
+ nl: 'Nummer van apparaten met batterij',
286
+ fr: 'Nombre de dispositifs avec batterie',
287
+ it: 'Numero di dispositivi con batteria',
288
+ es: 'N�mero de dispositivos con bater�a',
289
+ pl: 'Liczba urz?dze? z bateri?',
290
+ 'zh-cn': '???????',
291
+ },
292
+ type: 'number',
293
+ role: 'value',
294
+ read: true,
295
+ write: false,
296
+ },
297
+ native: {},
298
+ });
299
+
300
+ await adaptr.setObjectNotExistsAsync(`devices.${adptName}.upgradableCount`, {
301
+ type: 'state',
302
+ common: {
303
+ name: {
304
+ en: 'Number of devices with available updates ',
305
+ de: 'Anzahl der Ger�te mit verf�gbaren Updates',
306
+ ru: '?????????? ????????? ? ?????????? ????????????',
307
+ pt: 'N�mero de dispositivos com atualiza��es dispon�veis',
308
+ nl: 'Nummer van apparatuur met beschikbare updates',
309
+ fr: 'Nombre de dispositifs avec mises � jour disponibles',
310
+ it: 'Numero di dispositivi con aggiornamenti disponibili',
311
+ es: 'N�mero de dispositivos con actualizaciones disponibles',
312
+ pl: 'Liczba urz?dze? z dost?pn? aktualizacj?',
313
+ // @ts-ignore
314
+ uk: '????????? ????????? ? ?????????? ???????????',
315
+ 'zh-cn': '?????????',
316
+ },
317
+ type: 'number',
318
+ role: 'value',
319
+ read: true,
320
+ write: false,
321
+ },
322
+ native: {},
323
+ });
324
+
325
+ await adaptr.setObjectNotExistsAsync(`devices.${adptName}.upgradableList`, {
326
+ type: 'state',
327
+ common: {
328
+ name: {
329
+ en: 'JSON List of devices with available updates ',
330
+ de: 'JSON Liste der Ger�te mit verf�gbaren Updates',
331
+ ru: '????? ?????? ????????? ? ?????????? ????????????',
332
+ pt: 'J. Lista de dispositivos com atualiza��es dispon�veis',
333
+ nl: 'JSON List van apparatuur met beschikbare updates',
334
+ fr: 'JSON Liste des appareils avec mises � jour disponibles',
335
+ it: 'JSON Elenco dei dispositivi con aggiornamenti disponibili',
336
+ es: 'JSON Lista de dispositivos con actualizaciones disponibles',
337
+ pl: 'JSON Lista urz?dze? korzystaj?cych z aktualizacji',
338
+ // @ts-ignore
339
+ uk: '????? ??????? ????????? ? ?????????? ???????????',
340
+ 'zh-cn': '? ? ????????',
341
+ },
342
+ type: 'array',
343
+ role: 'json',
344
+ read: true,
345
+ write: false,
346
+ },
347
+ native: {},
348
+ });
349
+
350
+ await adaptr.setObjectNotExistsAsync(`devices.${adptName}.oneDeviceUpdatable`, {
351
+ type: 'state',
352
+ common: {
353
+ name: {
354
+ en: 'Is one device updatable',
355
+ de: 'Ist ein Ger�t aufnehmbar',
356
+ ru: '???? ?????????? ???????????',
357
+ pt: '� um dispositivo updatable',
358
+ nl: 'Is een apparaat updat',
359
+ fr: "Est-ce qu'un appareil est ind�fectible",
360
+ it: '� un dispositivo updatable',
361
+ es: 'Es un dispositivo actualizado',
362
+ pl: 'Jest to jedno urz?dzenie updatable',
363
+ // @ts-ignore
364
+ uk: '? ????? ?????????',
365
+ 'zh-cn': '????',
366
+ },
367
+ type: 'boolean',
368
+ role: 'state',
369
+ read: true,
370
+ write: false,
371
+ def: false,
372
+ },
373
+ native: {},
374
+ });
375
+ }
376
+
377
+ /**
378
+ * delete datapoints for each adapter
379
+ * @param {object} adptName - Adaptername of devices
380
+ */
381
+ async function deleteDPsForEachAdapter(adaptr, adptName) {
382
+ await adaptr.delObjectAsync(`devices.${adptName}`);
383
+ await adaptr.delObjectAsync(`devices.${adptName}.offlineCount`);
384
+ await adaptr.delObjectAsync(`devices.${adptName}.offlineList`);
385
+ await adaptr.delObjectAsync(`devices.${adptName}.oneDeviceOffline`);
386
+ await adaptr.delObjectAsync(`devices.${adptName}.listAllRawJSON`);
387
+ await adaptr.delObjectAsync(`devices.${adptName}.listAll`);
388
+ await adaptr.delObjectAsync(`devices.${adptName}.linkQualityList`);
389
+ await adaptr.delObjectAsync(`devices.${adptName}.countAll`);
390
+ await adaptr.delObjectAsync(`devices.${adptName}.batteryList`);
391
+ await adaptr.delObjectAsync(`devices.${adptName}.lowBatteryList`);
392
+ await adaptr.delObjectAsync(`devices.${adptName}.lowBatteryCount`);
393
+ await adaptr.delObjectAsync(`devices.${adptName}.oneDeviceLowBat`);
394
+ await adaptr.delObjectAsync(`devices.${adptName}.batteryCount`);
395
+ await adaptr.delObjectAsync(`devices.${adptName}.upgradableCount`);
396
+ await adaptr.delObjectAsync(`devices.${adptName}.upgradableList`);
397
+ await adaptr.delObjectAsync(`devices.${adptName}.oneDeviceUpdatable`);
398
+ }
399
+
400
+ /**
401
+ * create HTML list datapoints
402
+ * @param {object} [adptName] - Adaptername of devices
403
+ **/
404
+ async function createHtmlListDatapoints(adaptr, adptName) {
405
+ let dpSubFolder;
406
+ //write the datapoints in subfolders with the adaptername otherwise write the dP's in the root folder
407
+ if (adptName) {
408
+ dpSubFolder = `${adptName}.`;
409
+ } else {
410
+ dpSubFolder = '';
411
+ }
412
+
413
+ await adaptr.setObjectNotExistsAsync(`devices.${dpSubFolder}offlineListHTML`, {
414
+ type: 'state',
415
+ common: {
416
+ name: {
417
+ en: 'HTML List of offline devices',
418
+ de: 'HTML Liste der Offline-Ger�te',
419
+ ru: 'HTML ?????? ??????? ?????????',
420
+ pt: 'HTML Lista de dispositivos off-line',
421
+ nl: 'HTML List van offline apparatuur',
422
+ fr: 'HTML Liste des dispositifs hors ligne',
423
+ it: 'HTML Elenco dei dispositivi offline',
424
+ es: 'HTML Lista de dispositivos sin conexi�n',
425
+ pl: 'HTML Lista urz?dze? offline',
426
+ 'zh-cn': 'HTML ?????',
427
+ },
428
+ type: 'string',
429
+ role: 'html',
430
+ read: true,
431
+ write: false,
432
+ },
433
+ native: {},
434
+ });
435
+
436
+ await adaptr.setObjectNotExistsAsync(`devices.${dpSubFolder}linkQualityListHTML`, {
437
+ type: 'state',
438
+ common: {
439
+ name: {
440
+ en: 'HTML List of devices with signal strength',
441
+ de: 'HTML Liste der Ger�te mit Signalst�rke',
442
+ ru: 'HTML ?????? ????????? ? ????? ???????',
443
+ pt: 'HTML Lista de dispositivos com for�a de sinal',
444
+ nl: 'HTML List van apparaten met signaalkracht',
445
+ fr: 'HTML Liste des dispositifs avec force de signal',
446
+ it: 'HTML Elenco dei dispositivi con forza del segnale',
447
+ es: 'HTML Lista de dispositivos con fuerza de se�al',
448
+ pl: 'HTML Lista urz?dze? z si?? sygna?ow?',
449
+ 'zh-cn': 'HTML ???????????',
450
+ },
451
+ type: 'string',
452
+ role: 'value',
453
+ read: true,
454
+ write: false,
455
+ },
456
+ native: {},
457
+ });
458
+
459
+ await adaptr.setObjectNotExistsAsync(`devices.${dpSubFolder}batteryListHTML`, {
460
+ type: 'state',
461
+ common: {
462
+ name: {
463
+ en: 'HTML List of devices with battery state',
464
+ de: 'HTML Liste der Ger�te mit Batteriezustand',
465
+ ru: 'HTML ?????? ????????? ? ?????????? ???????',
466
+ pt: 'HTML Lista de dispositivos com estado da bateria',
467
+ nl: 'HTML List van apparaten met batterij staat',
468
+ fr: 'HTML Liste des appareils avec �tat de batterie',
469
+ it: 'HTML Elenco dei dispositivi con stato della batteria',
470
+ es: 'HTML Lista de dispositivos con estado de bater�a',
471
+ pl: 'HTML Lista urz?dze? z bateri? stanow?',
472
+ 'zh-cn': 'HTML ???????',
473
+ },
474
+ type: 'string',
475
+ role: 'html',
476
+ read: true,
477
+ write: false,
478
+ },
479
+ native: {},
480
+ });
481
+
482
+ await adaptr.setObjectNotExistsAsync(`devices.${dpSubFolder}lowBatteryListHTML`, {
483
+ type: 'state',
484
+ common: {
485
+ name: {
486
+ en: 'HTML List of devices with low battery state',
487
+ de: 'HTML Liste der Ger�te mit niedrigem Batteriezustand',
488
+ ru: 'HTML ?????? ????????? ? ?????? ?????????? ???????',
489
+ pt: 'HTML Lista de dispositivos com baixo estado da bateria',
490
+ nl: 'HTML List van apparaten met lage batterij staat',
491
+ fr: 'HTML Liste des appareils � faible �tat de batterie',
492
+ it: 'HTML Elenco di dispositivi con stato di batteria basso',
493
+ es: 'HTML Lista de dispositivos con estado de bater�a bajo',
494
+ pl: 'HTML Lista urz?dze? o niskim stanie baterii',
495
+ 'zh-cn': 'HTML ?????????',
496
+ },
497
+ type: 'string',
498
+ role: 'html',
499
+ read: true,
500
+ write: false,
501
+ },
502
+ native: {},
503
+ });
504
+ }
505
+
506
+ /**
507
+ * delete html datapoints
508
+ * @param {object} [adptName] - Adaptername of devices
509
+ **/
510
+ async function deleteHtmlListDatapoints(adaptr, adptName) {
511
+ // delete the datapoints in subfolders with the adaptername otherwise delete the dP's in the root folder
512
+ let dpSubFolder;
513
+ if (adptName) {
514
+ dpSubFolder = `${adptName}.`;
515
+ } else {
516
+ dpSubFolder = '';
517
+ }
518
+
519
+ await adaptr.delObjectAsync(`devices.${dpSubFolder}offlineListHTML`);
520
+ await adaptr.delObjectAsync(`devices.${dpSubFolder}linkQualityListHTML`);
521
+ await adaptr.delObjectAsync(`devices.${dpSubFolder}batteryListHTML`);
522
+ await adaptr.delObjectAsync(`devices.${dpSubFolder}lowBatteryListHTML`);
523
+ }
524
+
525
+ /**
526
+ * create HTML list datapoints for instances
527
+ **/
528
+ async function createHtmlListDatapointsInstances(adaptr) {
529
+ await adaptr.setObjectNotExistsAsync(`adapterAndInstances.HTML_Lists`, {
530
+ type: 'channel',
531
+ common: {
532
+ name: {
533
+ en: 'HTML lists for adapter and instances',
534
+ de: 'HTML-Listen f�r Adapter und Instanzen',
535
+ ru: 'HTML-?????? ??? ????????? ? ?????????',
536
+ pt: 'Listas HTML para adaptador e inst�ncias',
537
+ nl: 'HTML lijsten voor adapter en instituut',
538
+ fr: "Listes HTML pour l'adaptateur et les instances",
539
+ it: 'Elenchi HTML per adattatore e istanze',
540
+ es: 'Listas HTML para adaptador y casos',
541
+ pl: 'Listy HTML dla adaptera i instancji',
542
+ // @ts-ignore
543
+ uk: '?????? HTML ??? ????????? ?? ???????????',
544
+ 'zh-cn': 'HTML??',
545
+ },
546
+ },
547
+ native: {},
548
+ });
549
+ await adaptr.setObjectNotExistsAsync(`adapterAndInstances.HTML_Lists.listAllInstancesHTML`, {
550
+ type: 'state',
551
+ common: {
552
+ name: {
553
+ en: 'HTML List of all instances',
554
+ de: 'HTML Liste aller Instanzen',
555
+ ru: 'HTML ?????? ???? ?????????',
556
+ pt: 'HTML Lista de todas as inst�ncias',
557
+ nl: 'HTM List van alle instanties',
558
+ fr: 'HTML Liste de tous les cas',
559
+ it: 'HTML Elenco di tutte le istanze',
560
+ es: 'HTML Lista de todos los casos',
561
+ pl: 'HTML Lista wszystkich instancji',
562
+ // @ts-ignore
563
+ uk: '?????????? ?????? ???? ???????????',
564
+ 'zh-cn': 'HTML ???????',
565
+ },
566
+ type: 'string',
567
+ role: 'html',
568
+ read: true,
569
+ write: false,
570
+ },
571
+ native: {},
572
+ });
573
+
574
+ await adaptr.setObjectNotExistsAsync(`adapterAndInstances.HTML_Lists.listAllActiveInstancesHTML`, {
575
+ type: 'state',
576
+ common: {
577
+ name: {
578
+ en: 'HTML List of all active instances',
579
+ de: 'HTML Liste aller aktiven Instanzen',
580
+ ru: 'HTML ?????? ???? ???????? ?????????',
581
+ pt: 'HTML Lista de todas as inst�ncias ativas',
582
+ nl: 'HTM List van alle actieve instanties',
583
+ fr: 'HTML Liste de tous les cas actifs',
584
+ it: 'HTML Elenco di tutte le istanze attive',
585
+ es: 'HTML Lista de todos los casos activos',
586
+ pl: 'HTML Lista wszystkich aktywnych instancji',
587
+ // @ts-ignore
588
+ uk: '?????????? ?????? ???? ???????? ???????????',
589
+ 'zh-cn': 'HTML ????????',
590
+ },
591
+ type: 'string',
592
+ role: 'value',
593
+ read: true,
594
+ write: false,
595
+ },
596
+ native: {},
597
+ });
598
+
599
+ await adaptr.setObjectNotExistsAsync(`adapterAndInstances.HTML_Lists.listDeactivatedInstancesHTML`, {
600
+ type: 'state',
601
+ common: {
602
+ name: {
603
+ en: 'HTML List of all deactivated instances',
604
+ de: 'HTML Liste aller deaktivierten Instanzen',
605
+ ru: 'HTML ?????? ???? ???????????????? ?????????',
606
+ pt: 'HTML Lista de todas as inst�ncias desativadas',
607
+ nl: 'HTM List van alle gedeactiveerde instanties',
608
+ fr: 'HTML Liste de tous les cas d�sactiv�s',
609
+ it: 'HTML Elenco di tutte le istanze disattivate',
610
+ es: 'HTML Lista de todos los casos desactivados',
611
+ pl: 'HTML Lista wszystkich przypadk�w deaktywowanych',
612
+ // @ts-ignore
613
+ uk: '?????????? ?????? ???? ????????????? ???????????',
614
+ 'zh-cn': 'HTML ????????',
615
+ },
616
+ type: 'string',
617
+ role: 'html',
618
+ read: true,
619
+ write: false,
620
+ },
621
+ native: {},
622
+ });
623
+
624
+ await adaptr.setObjectNotExistsAsync(`adapterAndInstances.HTML_Lists.listInstancesErrorHTML`, {
625
+ type: 'state',
626
+ common: {
627
+ name: {
628
+ en: 'HTML List of instances with error',
629
+ de: 'HTML Liste der F�lle mit Fehler',
630
+ ru: 'HTML ?????? ????????? ? ???????',
631
+ pt: 'HTML Lista de casos com erro',
632
+ nl: 'HTM List van instoringen met fouten',
633
+ fr: 'HTML Liste des instances avec erreur',
634
+ it: 'HTML Elenco delle istanze con errore',
635
+ es: 'HTML Lista de casos con error',
636
+ pl: 'HTML Lista przyk?ad�w z b??dem',
637
+ // @ts-ignore
638
+ uk: '?????????? ?????? ??????????? ? ????????',
639
+ 'zh-cn': 'HTML ?????????',
640
+ },
641
+ type: 'string',
642
+ role: 'html',
643
+ read: true,
644
+ write: false,
645
+ },
646
+ native: {},
647
+ });
648
+ await adaptr.setObjectNotExistsAsync(`adapterAndInstances.HTML_Lists.listAdapterUpdatesHTML`, {
649
+ type: 'state',
650
+ common: {
651
+ name: {
652
+ en: 'HTML list of adapters with available updates',
653
+ de: 'HTML-Liste der Adapter mit verf�gbaren Updates',
654
+ ru: 'HTML ?????? ????????? ? ?????????? ????????????',
655
+ pt: 'Lista HTML de adaptadores com atualiza��es dispon�veis',
656
+ nl: 'HTML lijst met beschikbare updates',
657
+ fr: 'Liste HTML des adaptateurs avec mises � jour disponibles',
658
+ it: 'Elenco HTML degli adattatori con aggiornamenti disponibili',
659
+ es: 'Lista HTML de adaptadores con actualizaciones disponibles',
660
+ pl: 'Lista adapter�w HTML z dost?pnymi aktualizacjami',
661
+ // @ts-ignore
662
+ uk: 'HTML ?????? ????????? ? ?????????? ???????????',
663
+ 'zh-cn': 'HTML ??????????',
664
+ },
665
+ type: 'string',
666
+ role: 'html',
667
+ read: true,
668
+ write: false,
669
+ },
670
+ native: {},
671
+ });
672
+ }
673
+
674
+ /**
675
+ * delete html datapoints for instances
676
+ **/
677
+ async function deleteHtmlListDatapointsInstances(adaptr) {
678
+ await adaptr.delObjectAsync(`adapterAndInstances.HTML_Lists.listAllInstancesHTML`);
679
+ await adaptr.delObjectAsync(`adapterAndInstances.HTML_Lists.listAllActiveInstancesHTML`);
680
+ await adaptr.delObjectAsync(`adapterAndInstances.HTML_Lists.listDeactivatedInstancesHTML`);
681
+ await adaptr.delObjectAsync(`adapterAndInstances.HTML_Lists.listInstancesErrorHTML`);
682
+ await adaptr.delObjectAsync(`adapterAndInstances.HTML_Lists.listAdapterUpdatesHTML`);
683
+ await adaptr.delObjectAsync(`adapterAndInstances.HTML_Lists`);
684
+ }
685
+
686
+
687
+ /*=============================================
688
+ = functions to create html lists =
689
+ =============================================*/
690
+ /**
691
+ * @param {string} type - type of list
692
+ * @param {object} devices - Device
693
+ * @param {number} deviceCount - Counted devices
694
+ * @param {object} isLowBatteryList - list Low Battery Devices
695
+ */
696
+ async function createListHTML(adaptr, type, devices, deviceCount, isLowBatteryList) {
697
+ let html;
698
+ switch (type) {
699
+ case 'linkQualityList':
700
+ devices = devices.sort((a, b) => {
701
+ a = a.Device || '';
702
+ b = b.Device || '';
703
+ return a.localeCompare(b);
704
+ });
705
+ html = `<center>
706
+ <b>${[translations.Link_quality_devices[adaptr.config.userSelectedLanguage]]}:<font> ${deviceCount}</b><small></small></font>
707
+ <p></p>
708
+ </center>
709
+ <table width=100%>
710
+ <tr>
711
+ <th align=left>${[translations.Device[adaptr.config.userSelectedLanguage]]}</th>
712
+ <th align=center width=120>${[translations.Adapter[adaptr.config.userSelectedLanguage]]}</th>
713
+ <th align=right>${[translations.Signal_strength[adaptr.config.userSelectedLanguage]]}</th>
714
+ </tr>
715
+ <tr>
716
+ <td colspan="5"><hr></td>
717
+ </tr>`;
718
+
719
+ for (const device of devices) {
720
+ html += `<tr>
721
+ <td><font>${device[translations.Device[adaptr.config.userSelectedLanguage]]}</font></td>
722
+ <td align=center><font>${device[translations.Adapter[adaptr.config.userSelectedLanguage]]}</font></td>
723
+ <td align=right><font>${device[translations.Signal_strength[adaptr.config.userSelectedLanguage]]}</font></td>
724
+ </tr>`;
725
+ }
726
+
727
+ html += '</table>';
728
+ break;
729
+
730
+ case 'offlineList':
731
+ devices = devices.sort((a, b) => {
732
+ a = a.Device || '';
733
+ b = b.Device || '';
734
+ return a.localeCompare(b);
735
+ });
736
+ html = `<center>
737
+ <b>${[translations.offline_devices[adaptr.config.userSelectedLanguage]]}: <font color=${deviceCount === 0 ? '#3bcf0e' : 'orange'}>${deviceCount}</b><small></small></font>
738
+ <p></p>
739
+ </center>
740
+ <table width=100%>
741
+ <tr>
742
+ <th align=left>${[translations.Device[adaptr.config.userSelectedLanguage]]}</th>
743
+ <th align=center width=120>${[translations.Adapter[adaptr.config.userSelectedLanguage]]}</th>
744
+ <th align=center>${[translations.Last_Contact[adaptr.config.userSelectedLanguage]]}</th>
745
+ </tr>
746
+ <tr>
747
+ <td colspan="5"><hr></td>
748
+ </tr>`;
749
+
750
+ for (const device of devices) {
751
+ html += `<tr>
752
+ <td><font>${device[translations.Device[adaptr.config.userSelectedLanguage]]}</font></td>
753
+ <td align=center><font>${device[translations.Adapter[adaptr.config.userSelectedLanguage]]}</font></td>
754
+ <td align=center><font color=orange>${device[translations.Last_Contact[adaptr.config.userSelectedLanguage]]}</font></td>
755
+ </tr>`;
756
+ }
757
+
758
+ html += '</table>';
759
+ break;
760
+
761
+ case 'batteryList':
762
+ devices = devices.sort((a, b) => {
763
+ a = a.Device || '';
764
+ b = b.Device || '';
765
+ return a.localeCompare(b);
766
+ });
767
+ html = `<center>
768
+ <b>${isLowBatteryList === true ? `${[translations.low[adaptr.config.userSelectedLanguage]]} ` : ''}${[translations.battery_devices[adaptr.config.userSelectedLanguage]]}:
769
+ <font color=${isLowBatteryList === true ? (deviceCount > 0 ? 'orange' : '#3bcf0e') : ''}>${deviceCount}</b></font>
770
+ <p></p>
771
+ </center>
772
+ <table width=100%>
773
+ <tr>
774
+ <th align=left>${[translations.Device[adaptr.config.userSelectedLanguage]]}</th>
775
+ <th align=center width=120>${[translations.Adapter[adaptr.config.userSelectedLanguage]]}</th>
776
+ <th align=${isLowBatteryList ? 'center' : 'right'}>${[translations.Battery[adaptr.config.userSelectedLanguage]]}</th>
777
+ </tr>
778
+ <tr>
779
+ <td colspan="5"><hr></td>
780
+ </tr>`;
781
+ for (const device of devices) {
782
+ html += `<tr>
783
+ <td><font>${device[translations.Device[adaptr.config.userSelectedLanguage]]}</font></td>
784
+ <td align=center><font>${device[translations.Adapter[adaptr.config.userSelectedLanguage]]}</font></td>`;
785
+
786
+ if (isLowBatteryList) {
787
+ html += `<td align=center><font color=orange>${device[translations.Battery[adaptr.config.userSelectedLanguage]]}</font></td>`;
788
+ } else {
789
+ html += `<td align=right><font color=#3bcf0e>${device[translations.Battery[adaptr.config.userSelectedLanguage]]}</font></td>`;
790
+ }
791
+ html += `</tr>`;
792
+ }
793
+
794
+ html += '</table>';
795
+ break;
796
+ }
797
+ return html;
798
+ }
799
+
800
+ /**
801
+ * @param {string} type - type of list
802
+ * @param {object} instances - Instance
803
+ * @param {number} instancesCount - Counted devices
804
+ */
805
+ async function createListHTMLInstances(adaptr, type, instances, instancesCount) {
806
+ let html;
807
+ switch (type) {
808
+ case 'allInstancesList':
809
+ instances = instances.sort((a, b) => {
810
+ a = a.Instance || '';
811
+ b = b.Instance || '';
812
+ return a.localeCompare(b);
813
+ });
814
+ html = `<center>
815
+ <b>${[translations.All_Instances[adaptr.config.userSelectedLanguage]]}:<font> ${instancesCount}</b><small></small></font>
816
+ <p></p>
817
+ </center>
818
+ <table width=100%>
819
+ <tr>
820
+ <th align=left>${[translations.Adapter[adaptr.config.userSelectedLanguage]]}</th>
821
+ <th align=center>${[translations.Instance[adaptr.config.userSelectedLanguage]]}</th>
822
+ <th align=center width=180>${[translations.Status[adaptr.config.userSelectedLanguage]]}</th>
823
+ </tr>
824
+ <tr>
825
+ <td colspan="5"><hr></td>
826
+ </tr>`;
827
+
828
+ for (const instanceData of instances) {
829
+ html += `<tr>
830
+ <td><font>${instanceData[translations.Adapter[adaptr.config.userSelectedLanguage]]}</font></td>
831
+ <td align=center><font>${instanceData[translations.Instance[adaptr.config.userSelectedLanguage]]}</font></td>
832
+ <td align=center><font>${instanceData[translations.Status[adaptr.config.userSelectedLanguage]]}</font></td>
833
+ </tr>`;
834
+ }
835
+
836
+ html += '</table>';
837
+ break;
838
+
839
+ case 'allActiveInstancesList':
840
+ instances = instances.sort((a, b) => {
841
+ a = a.Instance || '';
842
+ b = b.Instances || '';
843
+ return a.localeCompare(b);
844
+ });
845
+ html = `<center>
846
+ <b>${[translations.Active_Instances[adaptr.config.userSelectedLanguage]]}: <font> ${instancesCount}</b><small></small></font>
847
+ <p></p>
848
+ </center>
849
+ <table width=100%>
850
+ <tr>
851
+ <th align=left>${[translations.Adapter[adaptr.config.userSelectedLanguage]]}</th>
852
+ <th align=center>${[translations.Instance[adaptr.config.userSelectedLanguage]]}</th>
853
+ <th align=center width=180>${[translations.Status[adaptr.config.userSelectedLanguage]]}</th>
854
+ </tr>
855
+ <tr>
856
+ <td colspan="5"><hr></td>
857
+ </tr>`;
858
+
859
+ for (const instanceData of instances) {
860
+ html += `<tr>
861
+ <td><font>${instanceData[translations.Adapter[adaptr.config.userSelectedLanguage]]}</font></td>
862
+ <td align=center><font>${instanceData[translations.Instance[adaptr.config.userSelectedLanguage]]}</font></td>
863
+ <td align=center><font color=orange>${instanceData[translations.Status[adaptr.config.userSelectedLanguage]]}</font></td>
864
+ </tr>`;
865
+ }
866
+
867
+ html += '</table>';
868
+ break;
869
+
870
+ case 'errorInstanceList':
871
+ instances = instances.sort((a, b) => {
872
+ a = a.Instance || '';
873
+ b = b.Instances || '';
874
+ return a.localeCompare(b);
875
+ });
876
+ html = `<center>
877
+ <b>${[translations.Error_Instances[adaptr.config.userSelectedLanguage]]}: <font color=${instancesCount === 0 ? '#3bcf0e' : 'orange'}>${instancesCount}</b><small></small></font>
878
+ <p></p>
879
+ </center>
880
+ <table width=100%>
881
+ <tr>
882
+ <th align=left>${[translations.Adapter[adaptr.config.userSelectedLanguage]]}</th>
883
+ <th align=center>${[translations.Instance[adaptr.config.userSelectedLanguage]]}</th>
884
+ <th align=center width=180>${[translations.Status[adaptr.config.userSelectedLanguage]]}</th>
885
+ </tr>
886
+ <tr>
887
+ <td colspan="5"><hr></td>
888
+ </tr>`;
889
+
890
+ for (const instanceData of instances) {
891
+ html += `<tr>
892
+ <td><font>${instanceData[translations.Adapter[adaptr.config.userSelectedLanguage]]}</font></td>
893
+ <td align=center><font>${instanceData[translations.Instance[adaptr.config.userSelectedLanguage]]}</font></td>
894
+ <td align=center><font color=orange>${instanceData[translations.Status[adaptr.config.userSelectedLanguage]]}</font></td>
895
+ </tr>`;
896
+ }
897
+
898
+ html += '</table>';
899
+ break;
900
+
901
+ case 'deactivatedInstanceList':
902
+ instances = instances.sort((a, b) => {
903
+ a = a.Instance || '';
904
+ b = b.Instances || '';
905
+ return a.localeCompare(b);
906
+ });
907
+ html = `<center>
908
+ <b>${[translations.Deactivated_Instances[adaptr.config.userSelectedLanguage]]}: <font color=${instancesCount === 0 ? '#3bcf0e' : 'orange'}>${instancesCount}</b><small></small></font>
909
+ <p></p>
910
+ </center>
911
+ <table width=100%>
912
+ <tr>
913
+ <th align=left>${[translations.Adapter[adaptr.config.userSelectedLanguage]]}</th>
914
+ <th align=center>${[translations.Instance[adaptr.config.userSelectedLanguage]]}</th>
915
+ <th align=center width=180>${[translations.Status[adaptr.config.userSelectedLanguage]]}</th>
916
+ </tr>
917
+ <tr>
918
+ <td colspan="5"><hr></td>
919
+ </tr>`;
920
+
921
+ for (const instanceData of instances) {
922
+ if (!instanceData.isAlive) {
923
+ html += `<tr>
924
+ <td><font>${instanceData[translations.Adapter[adaptr.config.userSelectedLanguage]]}</font></td>
925
+ <td align=center><font>${instanceData[translations.Instance[adaptr.config.userSelectedLanguage]]}</font></td>
926
+ <td align=center><font color=orange>${instanceData[translations.Status[adaptr.config.userSelectedLanguage]]}</font></td>
927
+ </tr>`;
928
+ }
929
+ }
930
+
931
+ html += '</table>';
932
+ break;
933
+
934
+ case 'updateAdapterList':
935
+ html = `<center>
936
+ <b>${[translations.Updatable_adapters[adaptr.config.userSelectedLanguage]]}: <font color=${instancesCount === 0 ? '#3bcf0e' : 'orange'}>${instancesCount}</b><small></small></font>
937
+ <p></p>
938
+ </center>
939
+ <table width=100%>
940
+ <tr>
941
+ <th align=left>${[translations.Adapter[adaptr.config.userSelectedLanguage]]}</th>
942
+ <th align=center>${[translations.Installed_Version[adaptr.config.userSelectedLanguage]]}</th>
943
+ <th align=center>${[translations.Available_Version[adaptr.config.userSelectedLanguage]]}</th>
944
+ </tr>
945
+ <tr>
946
+ <td colspan="5"><hr></td>
947
+ </tr>`;
948
+
949
+ for (const instanceData of instances.values()) {
950
+ if (instanceData.updateAvailable !== ' - ') {
951
+ html += `<tr>
952
+ <td><font>${instanceData[translations.Adapter[adaptr.config.userSelectedLanguage]]}</font></td>
953
+ <td align=center><font>${instanceData[translations.Installed_Version[adaptr.config.userSelectedLanguage]]}</font></td>
954
+ <td align=center><font color=orange>${instanceData[translations.Available_Version[adaptr.config.userSelectedLanguage]]}</font></td>
955
+ </tr>`;
956
+ }
957
+ }
958
+
959
+ html += '</table>';
960
+ break;
961
+ }
962
+ return html;
963
+ }
964
+
965
+
966
+ /**
967
+ * create blacklist
968
+ */
969
+ async function createBlacklist(adaptr) {
970
+ adaptr.log.debug(`Start the function createBlacklist`);
971
+
972
+ // DEVICES
973
+ const myBlacklist = adaptr.config.tableBlacklist;
974
+ if (myBlacklist.length >= 1) {
975
+ for (const i in myBlacklist) {
976
+ try {
977
+ const blacklistParse = tools.parseData(myBlacklist[i].devices);
978
+ // push devices in list to ignor device in lists
979
+ if (myBlacklist[i].checkIgnorLists) {
980
+ adaptr.blacklistLists.push(blacklistParse.path);
981
+ }
982
+ if (myBlacklist[i].checkIgnorAdapterLists) {
983
+ adaptr.blacklistAdapterLists.push(blacklistParse.path);
984
+ }
985
+ // push devices in list to ignor device in notifications
986
+ if (myBlacklist[i].checkIgnorNotify) {
987
+ adaptr.blacklistNotify.push(blacklistParse.path);
988
+ }
989
+ } catch (error) {
990
+ adaptr.log.error(`[createBlacklist] - ${error}`);
991
+ }
992
+ if (adaptr.blacklistLists.length >= 1) adaptr.log.info(`Found devices/services on blacklist for lists: ${adaptr.blacklistLists}`);
993
+ if (adaptr.blacklistAdapterLists.length >= 1) adaptr.log.info(`Found devices/services on blacklist for own adapter lists: ${adaptr.blacklistAdapterLists}`);
994
+ if (adaptr.blacklistNotify.length >= 1) adaptr.log.info(`Found devices/services on blacklist for notifications: ${adaptr.blacklistNotify}`);
995
+ }
996
+ }
997
+
998
+ // INSTANCES
999
+ const myBlacklistInstances = adaptr.config.tableBlacklistInstances;
1000
+ if (myBlacklistInstances.length >= 1) {
1001
+ for (const i in myBlacklistInstances) {
1002
+ try {
1003
+ const blacklistParse = tools.parseData(myBlacklistInstances[i].instances);
1004
+ // push devices in list to ignor device in lists
1005
+ if (myBlacklistInstances[i].checkIgnorLists) {
1006
+ adaptr.blacklistInstancesLists.push(blacklistParse.instanceID);
1007
+ }
1008
+ // push devices in list to ignor device in notifications
1009
+ if (myBlacklistInstances[i].checkIgnorNotify) {
1010
+ adaptr.blacklistInstancesNotify.push(blacklistParse.instanceID);
1011
+ }
1012
+ } catch (error) {
1013
+ adaptr.log.error(`[createBlacklist] - ${error}`);
1014
+ }
1015
+ }
1016
+ if (adaptr.blacklistInstancesLists.length >= 1) adaptr.log.info(`Found instances items on blacklist for lists: ${adaptr.blacklistInstancesLists}`);
1017
+ if (adaptr.blacklistInstancesNotify.length >= 1) adaptr.log.info(`Found instances items on blacklist for notifications: ${adaptr.blacklistInstancesNotify}`);
1018
+ }
1019
+ }
1020
+
1021
+ /**
1022
+ * create list with time for instances
1023
+ */
1024
+ async function createTimeListInstances(adaptr) {
1025
+ // INSTANCES
1026
+ const userTimeListInstances = adaptr.config.tableTimeInstance;
1027
+ if (userTimeListInstances.length >= 1) {
1028
+ for (const i in userTimeListInstances) {
1029
+ try {
1030
+ const userTimeListparse = tools.parseData(userTimeListInstances[i].instancesTime);
1031
+ // push devices in list to ignor device in lists
1032
+ adaptr.userTimeInstancesList.set(userTimeListparse.instanceName, {
1033
+ deactivationTime: userTimeListInstances[i].deactivationTime,
1034
+ errorTime: userTimeListInstances[i].errorTime,
1035
+ });
1036
+ } catch (error) {
1037
+ adaptr.log.error(`[createTimeListInstances] - ${error}`);
1038
+ }
1039
+ }
1040
+ if (adaptr.userTimeInstancesList.size >= 1) adaptr.log.info(`Found instances items on lists for timesettings: ${Array.from(adaptr.userTimeInstancesList.keys())}`);
1041
+ }
1042
+ }
1043
+
1044
+ /**
1045
+ * @param {object} i - Device Object
1046
+ */
1047
+ async function createData(adaptr, i) {
1048
+ try {
1049
+ const devices = await adaptr.getForeignStatesAsync(adaptr.selAdapter[i].Selektor);
1050
+ const adapterID = adaptr.selAdapter[i].adapterID;
1051
+
1052
+ /*---------- Start of loop ----------*/
1053
+ for (const [id] of Object.entries(devices)) {
1054
+ if (id.endsWith('.')) continue;
1055
+ const mainSelector = id;
1056
+
1057
+ /*=============================================
1058
+ = get Instanz =
1059
+ =============================================*/
1060
+ const instance = id.slice(0, id.indexOf('.') + 2);
1061
+
1062
+ const instanceDeviceConnectionDP = `${instance}.info.connection`;
1063
+ const instancedeviceConnected = await tools.getInitValue(adaptr, instanceDeviceConnectionDP);
1064
+ adaptr.subscribeForeignStates(instanceDeviceConnectionDP);
1065
+ adaptr.subscribeForeignObjects(`${adaptr.selAdapter[i].Selektor}`);
1066
+ // adaptr.subscribeForeignObjects('*');
1067
+ //adaptr.subscribeForeignStates('*');
1068
+ /*=============================================
1069
+ = Get device name =
1070
+ =============================================*/
1071
+ const deviceName = await adaptr.getDeviceName(id, i);
1072
+
1073
+ /*=============================================
1074
+ = Get adapter name =
1075
+ =============================================*/
1076
+ const adapter = adaptr.selAdapter[i].adapter;
1077
+
1078
+ /*=============================================
1079
+ = Get path to datapoints =
1080
+ =============================================*/
1081
+ const currDeviceString = id.slice(0, id.lastIndexOf('.') + 1 - 1);
1082
+ const shortCurrDeviceString = currDeviceString.slice(0, currDeviceString.lastIndexOf('.') + 1 - 1);
1083
+
1084
+ // subscribe to object device path
1085
+ adaptr.subscribeForeignStates(currDeviceString);
1086
+
1087
+ /*=============================================
1088
+ = Get signal strength =
1089
+ =============================================*/
1090
+ let deviceQualityDP = currDeviceString + adaptr.selAdapter[i].rssiState;
1091
+ let deviceQualityState;
1092
+
1093
+ switch (adapterID) {
1094
+ case 'mihomeVacuum':
1095
+ deviceQualityDP = shortCurrDeviceString + adaptr.selAdapter[i].rssiState;
1096
+ deviceQualityState = await adaptr.getForeignStateAsync(deviceQualityDP);
1097
+ break;
1098
+
1099
+ case 'netatmo':
1100
+ deviceQualityState = await adaptr.getForeignStateAsync(deviceQualityDP);
1101
+ if (!deviceQualityState) {
1102
+ deviceQualityDP = currDeviceString + adaptr.selAdapter[i].rfState;
1103
+ deviceQualityState = await adaptr.getForeignStateAsync(deviceQualityDP);
1104
+ }
1105
+ break;
1106
+
1107
+ default:
1108
+ deviceQualityState = await adaptr.getForeignStateAsync(deviceQualityDP);
1109
+ break;
1110
+ }
1111
+ //subscribe to states
1112
+ adaptr.subscribeForeignStates(deviceQualityDP);
1113
+
1114
+ const signalData = await adaptr.calculateSignalStrength(deviceQualityState, adapterID);
1115
+ let linkQuality = signalData[0];
1116
+ const linkQualityRaw = signalData[1];
1117
+
1118
+ /*=============================================
1119
+ = Get battery data =
1120
+ =============================================*/
1121
+ let deviceBatteryStateDP;
1122
+ let deviceBatteryState;
1123
+ let batteryHealth;
1124
+ let batteryHealthRaw;
1125
+ let batteryUnitRaw;
1126
+ let lowBatIndicator;
1127
+ let isBatteryDevice;
1128
+ let isLowBatDP;
1129
+ let faultReportingDP;
1130
+ let faultReportingState;
1131
+
1132
+ const deviceChargerStateDP = currDeviceString + adaptr.selAdapter[i].charger;
1133
+ const deviceChargerState = await tools.getInitValue(adaptr, deviceChargerStateDP);
1134
+
1135
+ if (deviceChargerState === undefined || deviceChargerState === false) {
1136
+ // Get battery states
1137
+ switch (adapterID) {
1138
+ case 'hmrpc':
1139
+ deviceBatteryStateDP = currDeviceString + adaptr.selAdapter[i].battery;
1140
+ deviceBatteryState = await tools.getInitValue(adaptr, deviceBatteryStateDP);
1141
+
1142
+ if (deviceBatteryState === undefined) {
1143
+ deviceBatteryStateDP = shortCurrDeviceString + adaptr.selAdapter[i].hmDNBattery;
1144
+ deviceBatteryState = await tools.getInitValue(adaptr, deviceBatteryStateDP);
1145
+ }
1146
+ break;
1147
+ case 'hueExt':
1148
+ case 'mihomeVacuum':
1149
+ case 'mqttNuki':
1150
+ case 'loqedSmartLock':
1151
+ deviceBatteryStateDP = shortCurrDeviceString + adaptr.selAdapter[i].battery;
1152
+ deviceBatteryState = await tools.getInitValue(adaptr, deviceBatteryStateDP);
1153
+
1154
+ if (deviceBatteryState === undefined) {
1155
+ deviceBatteryStateDP = shortCurrDeviceString + adaptr.selAdapter[i].battery2;
1156
+ deviceBatteryState = await tools.getInitValue(adaptr, deviceBatteryStateDP);
1157
+ }
1158
+ break;
1159
+ default:
1160
+ deviceBatteryStateDP = currDeviceString + adaptr.selAdapter[i].battery;
1161
+ deviceBatteryState = await tools.getInitValue(adaptr, deviceBatteryStateDP);
1162
+
1163
+ if (deviceBatteryState === undefined) {
1164
+ deviceBatteryStateDP = currDeviceString + adaptr.selAdapter[i].battery2;
1165
+ deviceBatteryState = await tools.getInitValue(adaptr, deviceBatteryStateDP);
1166
+
1167
+ if (deviceBatteryState === undefined) {
1168
+ deviceBatteryStateDP = currDeviceString + adaptr.selAdapter[i].battery3;
1169
+ deviceBatteryState = await tools.getInitValue(adaptr, deviceBatteryStateDP);
1170
+ }
1171
+ }
1172
+ break;
1173
+ }
1174
+
1175
+ // Get low bat states
1176
+ isLowBatDP = currDeviceString + adaptr.selAdapter[i].isLowBat;
1177
+ let deviceLowBatState = await tools.getInitValue(adaptr, isLowBatDP);
1178
+
1179
+ if (deviceLowBatState === undefined) {
1180
+ isLowBatDP = currDeviceString + adaptr.selAdapter[i].isLowBat2;
1181
+ deviceLowBatState = await tools.getInitValue(adaptr, isLowBatDP);
1182
+
1183
+ if (deviceLowBatState === undefined) {
1184
+ isLowBatDP = currDeviceString + adaptr.selAdapter[i].isLowBat3;
1185
+ deviceLowBatState = await tools.getInitValue(adaptr, isLowBatDP);
1186
+ }
1187
+ }
1188
+ if (deviceLowBatState === undefined) isLowBatDP = 'none';
1189
+
1190
+ faultReportingDP = shortCurrDeviceString + adaptr.selAdapter[i].faultReporting;
1191
+ faultReportingState = await tools.getInitValue(adaptr, faultReportingDP);
1192
+
1193
+ //subscribe to states
1194
+ adaptr.subscribeForeignStates(deviceBatteryStateDP);
1195
+ adaptr.subscribeForeignStates(isLowBatDP);
1196
+ adaptr.subscribeForeignStates(faultReportingDP);
1197
+
1198
+ const batteryData = await adaptr.getBatteryData(deviceBatteryState, deviceLowBatState, faultReportingState, adapterID);
1199
+ batteryHealth = batteryData[0];
1200
+ batteryHealthRaw = batteryData[2];
1201
+ batteryUnitRaw = batteryData[3];
1202
+ isBatteryDevice = batteryData[1];
1203
+
1204
+ if (isBatteryDevice) {
1205
+ lowBatIndicator = await adaptr.setLowbatIndicator(deviceBatteryState, deviceLowBatState, faultReportingState, adapterID);
1206
+ }
1207
+ }
1208
+
1209
+ /*=============================================
1210
+ = Get last contact of device =
1211
+ =============================================*/
1212
+ let unreachDP = currDeviceString + adaptr.selAdapter[i].reach;
1213
+ const deviceStateSelectorHMRPC = shortCurrDeviceString + adaptr.selAdapter[i].stateValue;
1214
+ const rssiPeerSelectorHMRPC = currDeviceString + adaptr.selAdapter[i].rssiPeerState;
1215
+ let timeSelector = currDeviceString + adaptr.selAdapter[i].timeSelector;
1216
+
1217
+ const timeSelectorState = await tools.getInitValue(adaptr, timeSelector);
1218
+ if (timeSelectorState === undefined) {
1219
+ timeSelector = shortCurrDeviceString + adaptr.selAdapter[i].timeSelector;
1220
+ }
1221
+
1222
+ let deviceUnreachState = await tools.getInitValue(adaptr, unreachDP);
1223
+ if (deviceUnreachState === undefined) {
1224
+ unreachDP = shortCurrDeviceString + adaptr.selAdapter[i].reach;
1225
+ deviceUnreachState = await tools.getInitValue(adaptr, shortCurrDeviceString + adaptr.selAdapter[i].reach);
1226
+ }
1227
+
1228
+ // subscribe to states
1229
+ adaptr.subscribeForeignStates(timeSelector);
1230
+ adaptr.subscribeForeignStates(unreachDP);
1231
+ adaptr.subscribeForeignStates(deviceStateSelectorHMRPC);
1232
+ adaptr.subscribeForeignStates(rssiPeerSelectorHMRPC);
1233
+
1234
+ const onlineState = await adaptr.getOnlineState(timeSelector, adapterID, unreachDP, linkQuality, deviceUnreachState, deviceStateSelectorHMRPC, rssiPeerSelectorHMRPC);
1235
+ let deviceState;
1236
+ let lastContactString;
1237
+
1238
+ if (onlineState !== undefined && onlineState !== null) {
1239
+ lastContactString = onlineState[0];
1240
+ deviceState = onlineState[1];
1241
+ linkQuality = onlineState[2];
1242
+ }
1243
+
1244
+ /*=============================================
1245
+ = Get update data =
1246
+ =============================================*/
1247
+ let isUpgradable;
1248
+ let deviceUpdateDP;
1249
+
1250
+ if (adaptr.config.checkSendDeviceUpgrade) {
1251
+ deviceUpdateDP = currDeviceString + adaptr.selAdapter[i].upgrade;
1252
+ let deviceUpdateSelector = await tools.getInitValue(adaptr, deviceUpdateDP);
1253
+ if (deviceUpdateSelector === undefined) {
1254
+ deviceUpdateDP = shortCurrDeviceString + adaptr.selAdapter[i].upgrade;
1255
+ deviceUpdateSelector = await tools.getInitValue(adaptr, deviceUpdateDP);
1256
+ if (deviceUpdateSelector === undefined) {
1257
+ const shortShortCurrDeviceString = shortCurrDeviceString.slice(0, shortCurrDeviceString.lastIndexOf('.') + 1 - 1);
1258
+ deviceUpdateDP = shortShortCurrDeviceString + adaptr.selAdapter[i].upgrade;
1259
+ deviceUpdateSelector = await tools.getInitValue(adaptr, deviceUpdateDP);
1260
+ }
1261
+ }
1262
+
1263
+ if (deviceUpdateSelector !== undefined) {
1264
+ isUpgradable = await adaptr.checkDeviceUpdate(adapterID, deviceUpdateSelector);
1265
+ } else {
1266
+ isUpgradable = ' - ';
1267
+ }
1268
+
1269
+ // subscribe to states
1270
+ adaptr.subscribeForeignStates(deviceUpdateDP);
1271
+ // adaptr.subscribeForeignStates('*');
1272
+ }
1273
+
1274
+ /*=============================================
1275
+ = Fill Raw Lists =
1276
+ =============================================*/
1277
+ const setupList = () => {
1278
+ adaptr.listAllDevicesRaw.set(currDeviceString, {
1279
+ Path: id,
1280
+ mainSelector: mainSelector,
1281
+ instanceDeviceConnectionDP: instanceDeviceConnectionDP,
1282
+ instancedeviceConnected: instancedeviceConnected,
1283
+ instance: instance,
1284
+ Device: deviceName,
1285
+ adapterID: adapterID,
1286
+ Adapter: adapter,
1287
+ timeSelector: timeSelector,
1288
+ isBatteryDevice: isBatteryDevice,
1289
+ Battery: batteryHealth,
1290
+ BatteryRaw: batteryHealthRaw,
1291
+ BatteryUnitRaw: batteryUnitRaw,
1292
+ batteryDP: deviceBatteryStateDP,
1293
+ LowBat: lowBatIndicator,
1294
+ LowBatDP: isLowBatDP,
1295
+ faultReport: faultReportingState,
1296
+ faultReportDP: faultReportingDP,
1297
+ SignalStrengthDP: deviceQualityDP,
1298
+ SignalStrength: linkQuality,
1299
+ SignalStrengthRaw: linkQualityRaw,
1300
+ UnreachState: deviceUnreachState,
1301
+ UnreachDP: unreachDP,
1302
+ deviceStateSelectorHMRPC: deviceStateSelectorHMRPC,
1303
+ rssiPeerSelectorHMRPC: rssiPeerSelectorHMRPC,
1304
+ LastContact: lastContactString,
1305
+ Status: deviceState,
1306
+ UpdateDP: deviceUpdateDP,
1307
+ Upgradable: isUpgradable,
1308
+ });
1309
+ };
1310
+
1311
+ if (!adaptr.configListOnlyBattery) {
1312
+ // Add all devices
1313
+ setupList();
1314
+ } else {
1315
+ // Add only devices with battery in the rawlist
1316
+ if (!isBatteryDevice) {
1317
+ continue;
1318
+ }
1319
+
1320
+ setupList();
1321
+ }
1322
+ } // <-- end of loop
1323
+ } catch (error) {
1324
+ adaptr.log.error(`[createData - create data of devices] - ${error}`);
1325
+ }
1326
+ } // <-- end of createData
1327
+
1328
+
1329
+ /**
1330
+ * Create Lists
1331
+ * @param {string | undefined} [adptName]
1332
+ */
1333
+ async function createLists(adaptr, adptName) {
1334
+ adaptr.linkQualityDevices = [];
1335
+ adaptr.batteryPowered = [];
1336
+ adaptr.batteryLowPowered = [];
1337
+ adaptr.listAllDevicesUserRaw = [];
1338
+ adaptr.listAllDevices = [];
1339
+ adaptr.offlineDevices = [];
1340
+ adaptr.batteryLowPoweredRaw = [];
1341
+ adaptr.offlineDevicesRaw = [];
1342
+ adaptr.upgradableDevicesRaw = [];
1343
+ adaptr.upgradableList = [];
1344
+
1345
+ if (adptName === undefined) {
1346
+ adptName = '';
1347
+ }
1348
+
1349
+ for (const deviceData of adaptr.listAllDevicesRaw.values()) {
1350
+ /*---------- fill raw lists ----------*/
1351
+ // low bat list
1352
+ if (deviceData.LowBat && deviceData.Status !== 'Offline') {
1353
+ adaptr.batteryLowPoweredRaw.push({
1354
+ Path: deviceData.Path,
1355
+ Device: deviceData.Device,
1356
+ Adapter: deviceData.Adapter,
1357
+ Battery: deviceData.Battery,
1358
+ });
1359
+ }
1360
+ // offline raw list
1361
+ if (deviceData.Status === 'Offline') {
1362
+ adaptr.offlineDevicesRaw.push({
1363
+ Path: deviceData.Path,
1364
+ Device: deviceData.Device,
1365
+ Adapter: deviceData.Adapter,
1366
+ LastContact: deviceData.LastContact,
1367
+ });
1368
+ }
1369
+
1370
+ // upgradable raw list
1371
+ if (deviceData.Upgradable === true) {
1372
+ adaptr.upgradableDevicesRaw.push({
1373
+ Path: deviceData.Path,
1374
+ Device: deviceData.Device,
1375
+ Adapter: deviceData.Adapter,
1376
+ });
1377
+ }
1378
+
1379
+ if (adptName === '' && !adaptr.blacklistLists.includes(deviceData.Path)) {
1380
+ await adaptr.theLists(deviceData);
1381
+ }
1382
+
1383
+ if (adaptr.config.createOwnFolder && adptName !== '') {
1384
+ if (!deviceData.adapterID.includes(adptName)) continue;
1385
+ /*---------- fill user lists for each adapter ----------*/
1386
+ if (adaptr.blacklistAdapterLists.includes(deviceData.Path)) continue;
1387
+ await adaptr.theLists(deviceData);
1388
+ }
1389
+ }
1390
+ await tools.countDevices(adaptr);
1391
+ }
1392
+
1393
+
1394
+ /**
1395
+ * @param {string} [adptName] - Adaptername
1396
+ */
1397
+ async function writeDatapoints(adaptr, adptName) {
1398
+ // fill the datapoints
1399
+ adaptr.log.debug(`Start the function writeDatapoints`);
1400
+
1401
+ try {
1402
+ let dpSubFolder;
1403
+ //write the datapoints in subfolders with the adaptername otherwise write the dP's in the root folder
1404
+ if (adptName) {
1405
+ dpSubFolder = adptName + '.';
1406
+ } else {
1407
+ dpSubFolder = '';
1408
+ }
1409
+
1410
+ // Write Datapoints for counts
1411
+ await adaptr.setStateChangedAsync(`devices.${dpSubFolder}offlineCount`, { val: adaptr.offlineDevicesCount, ack: true });
1412
+ await adaptr.setStateChangedAsync(`devices.${dpSubFolder}countAll`, { val: adaptr.deviceCounter, ack: true });
1413
+ await adaptr.setStateChangedAsync(`devices.${dpSubFolder}batteryCount`, { val: adaptr.batteryPoweredCount, ack: true });
1414
+ await adaptr.setStateChangedAsync(`devices.${dpSubFolder}lowBatteryCount`, { val: adaptr.lowBatteryPoweredCount, ack: true });
1415
+ await adaptr.setStateChangedAsync(`devices.${dpSubFolder}upgradableCount`, { val: adaptr.upgradableDevicesCount, ack: true });
1416
+ // List all devices
1417
+ if (adaptr.deviceCounter === 0) {
1418
+ // if no device is count, write the JSON List with default value
1419
+ adaptr.listAllDevices = [
1420
+ {
1421
+ [translations.Device[adaptr.config.userSelectedLanguage]]: '--none--',
1422
+ [translations.Adapter[adaptr.config.userSelectedLanguage]]: '',
1423
+ [translations.Battery[adaptr.config.userSelectedLanguage]]: '',
1424
+ [translations.Signal_strength[adaptr.config.userSelectedLanguage]]: '',
1425
+ [translations.Last_Contact[adaptr.config.userSelectedLanguage]]: '',
1426
+ [translations.Status[adaptr.config.userSelectedLanguage]]: '',
1427
+ },
1428
+ ];
1429
+ adaptr.listAllDevicesUserRaw = [
1430
+ {
1431
+ Device: '--none--',
1432
+ Adapter: '',
1433
+ Instance: '',
1434
+ 'Instance connected': '',
1435
+ isBatteryDevice: '',
1436
+ Battery: '',
1437
+ BatteryRaw: '',
1438
+ isLowBat: '',
1439
+ 'Signal strength': '',
1440
+ 'Last contact': '',
1441
+ UpdateAvailable: '',
1442
+ Status: '',
1443
+ },
1444
+ ];
1445
+ }
1446
+ await adaptr.setStateChangedAsync(`devices.${dpSubFolder}listAll`, { val: JSON.stringify(adaptr.listAllDevices), ack: true });
1447
+ await adaptr.setStateChangedAsync(`devices.${dpSubFolder}listAllRawJSON`, { val: JSON.stringify(adaptr.listAllDevicesUserRaw), ack: true });
1448
+
1449
+ // List link quality
1450
+ if (adaptr.linkQualityCount === 0) {
1451
+ // if no device is count, write the JSON List with default value
1452
+ adaptr.linkQualityDevices = [
1453
+ {
1454
+ [translations.Device[adaptr.config.userSelectedLanguage]]: '--none--',
1455
+ [translations.Adapter[adaptr.config.userSelectedLanguage]]: '',
1456
+ [translations.Signal_strength[adaptr.config.userSelectedLanguage]]: '',
1457
+ },
1458
+ ];
1459
+ }
1460
+ //write JSON list
1461
+ await adaptr.setStateChangedAsync(`devices.${dpSubFolder}linkQualityList`, {
1462
+ val: JSON.stringify(adaptr.linkQualityDevices),
1463
+ ack: true,
1464
+ });
1465
+
1466
+ // List offline devices
1467
+ if (adaptr.offlineDevicesCount === 0) {
1468
+ // if no device is count, write the JSON List with default value
1469
+ adaptr.offlineDevices = [
1470
+ {
1471
+ [translations.Device[adaptr.config.userSelectedLanguage]]: '--none--',
1472
+ [translations.Adapter[adaptr.config.userSelectedLanguage]]: '',
1473
+ [translations.Last_Contact[adaptr.config.userSelectedLanguage]]: '',
1474
+ },
1475
+ ];
1476
+ }
1477
+ //write JSON list
1478
+ await adaptr.setStateChangedAsync(`devices.${dpSubFolder}offlineList`, {
1479
+ val: JSON.stringify(adaptr.offlineDevices),
1480
+ ack: true,
1481
+ });
1482
+
1483
+ // List updatable
1484
+ if (adaptr.upgradableDevicesCount === 0) {
1485
+ // if no device is count, write the JSON List with default value
1486
+ adaptr.upgradableList = [
1487
+ {
1488
+ [translations.Device[adaptr.config.userSelectedLanguage]]: '--none--',
1489
+ [translations.Adapter[adaptr.config.userSelectedLanguage]]: '',
1490
+ [translations.Last_Contact[adaptr.config.userSelectedLanguage]]: '',
1491
+ },
1492
+ ];
1493
+ }
1494
+ //write JSON list
1495
+ await adaptr.setStateChangedAsync(`devices.${dpSubFolder}upgradableList`, {
1496
+ val: JSON.stringify(adaptr.upgradableList),
1497
+ ack: true,
1498
+ });
1499
+
1500
+ // List battery powered
1501
+ if (adaptr.batteryPoweredCount === 0) {
1502
+ // if no device is count, write the JSON List with default value
1503
+ adaptr.batteryPowered = [
1504
+ {
1505
+ [translations.Device[adaptr.config.userSelectedLanguage]]: '--none--',
1506
+ [translations.Adapter[adaptr.config.userSelectedLanguage]]: '',
1507
+ [translations.Battery[adaptr.config.userSelectedLanguage]]: '',
1508
+ },
1509
+ ];
1510
+ }
1511
+ //write JSON list
1512
+ await adaptr.setStateChangedAsync(`devices.${dpSubFolder}batteryList`, {
1513
+ val: JSON.stringify(adaptr.batteryPowered),
1514
+ ack: true,
1515
+ });
1516
+
1517
+ // list battery low powered
1518
+ if (adaptr.lowBatteryPoweredCount === 0) {
1519
+ // if no device is count, write the JSON List with default value
1520
+ adaptr.batteryLowPowered = [
1521
+ {
1522
+ [translations.Device[adaptr.config.userSelectedLanguage]]: '--none--',
1523
+ [translations.Adapter[adaptr.config.userSelectedLanguage]]: '',
1524
+ [translations.Battery[adaptr.config.userSelectedLanguage]]: '',
1525
+ },
1526
+ ];
1527
+ }
1528
+ //write JSON list
1529
+ await adaptr.setStateChangedAsync(`devices.${dpSubFolder}lowBatteryList`, {
1530
+ val: JSON.stringify(adaptr.batteryLowPowered),
1531
+ ack: true,
1532
+ });
1533
+
1534
+ // set booleans datapoints
1535
+ if (adaptr.offlineDevicesCount === 0) {
1536
+ await adaptr.setStateChangedAsync(`devices.${dpSubFolder}oneDeviceOffline`, {
1537
+ val: false,
1538
+ ack: true,
1539
+ });
1540
+ } else {
1541
+ await adaptr.setStateChangedAsync(`devices.${dpSubFolder}oneDeviceOffline`, {
1542
+ val: true,
1543
+ ack: true,
1544
+ });
1545
+ }
1546
+
1547
+ if (adaptr.lowBatteryPoweredCount === 0) {
1548
+ await adaptr.setStateChangedAsync(`devices.${dpSubFolder}oneDeviceLowBat`, {
1549
+ val: false,
1550
+ ack: true,
1551
+ });
1552
+ } else {
1553
+ await adaptr.setStateChangedAsync(`devices.${dpSubFolder}oneDeviceLowBat`, {
1554
+ val: true,
1555
+ ack: true,
1556
+ });
1557
+ }
1558
+
1559
+ if (adaptr.upgradableDevicesCount === 0) {
1560
+ await adaptr.setStateChangedAsync(`devices.${dpSubFolder}oneDeviceUpdatable`, {
1561
+ val: false,
1562
+ ack: true,
1563
+ });
1564
+ } else {
1565
+ await adaptr.setStateChangedAsync(`devices.${dpSubFolder}oneDeviceUpdatable`, {
1566
+ val: true,
1567
+ ack: true,
1568
+ });
1569
+ }
1570
+
1571
+ //write HTML list
1572
+ if (adaptr.configCreateHtmlList) {
1573
+ await adaptr.setStateChangedAsync(`devices.${dpSubFolder}linkQualityListHTML`, {
1574
+ val: await crud.createListHTML(adaptr, 'linkQualityList', adaptr.linkQualityDevices, adaptr.linkQualityCount, null),
1575
+ ack: true,
1576
+ });
1577
+ await adaptr.setStateChangedAsync(`devices.${dpSubFolder}offlineListHTML`, {
1578
+ val: await crud.createListHTML(adaptr, 'offlineList', adaptr.offlineDevices, adaptr.offlineDevicesCount, null),
1579
+ ack: true,
1580
+ });
1581
+ await adaptr.setStateChangedAsync(`devices.${dpSubFolder}batteryListHTML`, {
1582
+ val: await crud.createListHTML(adaptr, 'batteryList', adaptr.batteryPowered, adaptr.batteryPoweredCount, false),
1583
+ ack: true,
1584
+ });
1585
+ await adaptr.setStateChangedAsync(`devices.${dpSubFolder}lowBatteryListHTML`, {
1586
+ val: await crud.createListHTML(adaptr, 'batteryList', adaptr.batteryLowPowered, adaptr.lowBatteryPoweredCount, true),
1587
+ ack: true,
1588
+ });
1589
+ if (adaptr.config.checkAdapterInstances) {
1590
+ await adaptr.setStateChangedAsync(`adapterAndInstances.HTML_Lists.listAllInstancesHTML`, {
1591
+ val: await adaptr.crud.createListHTMLInstances(adaptr, 'allInstancesList', adaptr.listAllInstances, adaptr.countAllInstances),
1592
+ ack: true,
1593
+ });
1594
+ await adaptr.setStateChangedAsync(`adapterAndInstances.HTML_Lists.listAllActiveInstancesHTML`, {
1595
+ val: await adaptr.crud.createListHTMLInstances(adaptr, 'allActiveInstancesList', adaptr.listAllActiveInstances, adaptr.countAllActiveInstances),
1596
+ ack: true,
1597
+ });
1598
+ await adaptr.setStateChangedAsync(`adapterAndInstances.HTML_Lists.listInstancesErrorHTML`, {
1599
+ val: await adaptr.crud.createListHTMLInstances(adaptr, 'errorInstanceList', adaptr.listErrorInstance, adaptr.countErrorInstance),
1600
+ ack: true,
1601
+ });
1602
+ await adaptr.setStateChangedAsync(`adapterAndInstances.HTML_Lists.listDeactivatedInstancesHTML`, {
1603
+ val: await adaptr.crud.createListHTMLInstances(adaptr, 'deactivatedInstanceList', adaptr.listDeactivatedInstances, adaptr.countDeactivatedInstances),
1604
+ ack: true,
1605
+ });
1606
+ await adaptr.setStateChangedAsync(`adapterAndInstances.HTML_Lists.listAdapterUpdatesHTML`, {
1607
+ val: await adaptr.crud.createListHTMLInstances(adaptr, 'updateAdapterList', adaptr.listAdapterUpdates, adaptr.countAdapterUpdates),
1608
+ ack: true,
1609
+ });
1610
+ }
1611
+ }
1612
+
1613
+ // create timestamp of last run
1614
+ const lastCheck = adaptr.formatDate(new Date(), 'DD.MM.YYYY') + ' - ' + adaptr.formatDate(new Date(), 'hh:mm:ss');
1615
+ await adaptr.setStateChangedAsync('lastCheck', lastCheck, true);
1616
+ } catch (error) {
1617
+ adaptr.log.error(`[writeDatapoints] - ${error}`);
1618
+ }
1619
+ } //<--End of writing Datapoints
1620
+
1621
+
1622
+ /**
1623
+ * create Datapoints for Instances
1624
+ */
1625
+ async function createDPsForInstances(adaptr) {
1626
+ await adaptr.setObjectNotExistsAsync(`adapterAndInstances`, {
1627
+ type: 'channel',
1628
+ common: {
1629
+ name: {
1630
+ en: 'Adapter and Instances',
1631
+ de: 'Adapter und Instanzen',
1632
+ ru: '??????? ? Instances',
1633
+ pt: 'Adaptador e inst�ncias',
1634
+ nl: 'Adapter en Instance',
1635
+ fr: 'Adaptateur et instances',
1636
+ it: 'Adattatore e istanze',
1637
+ es: 'Adaptador e instalaciones',
1638
+ pl: 'Adapter and Instances',
1639
+ // @ts-ignore
1640
+ uk: '??????? ?? ?????????',
1641
+ 'zh-cn': '????',
1642
+ },
1643
+ },
1644
+ native: {},
1645
+ });
1646
+
1647
+ // Instances
1648
+ await adaptr.setObjectNotExistsAsync(`adapterAndInstances.listAllInstances`, {
1649
+ type: 'state',
1650
+ common: {
1651
+ name: {
1652
+ en: 'JSON List of all instances',
1653
+ de: 'JSON Liste aller Instanzen',
1654
+ ru: '????? ?????? ???? ?????????',
1655
+ pt: 'J. Lista de todas as inst�ncias',
1656
+ nl: 'JSON List van alle instanties',
1657
+ fr: 'JSON Liste de tous les cas',
1658
+ it: 'JSON Elenco di tutte le istanze',
1659
+ es: 'JSON Lista de todos los casos',
1660
+ pl: 'JSON Lista wszystkich instancji',
1661
+ // @ts-ignore
1662
+ uk: '????? ?????? ???? ???????????',
1663
+ 'zh-cn': '? ? ???????',
1664
+ },
1665
+ type: 'array',
1666
+ role: 'json',
1667
+ read: true,
1668
+ write: false,
1669
+ },
1670
+ native: {},
1671
+ });
1672
+ await adaptr.setObjectNotExistsAsync(`adapterAndInstances.countAllInstances`, {
1673
+ type: 'state',
1674
+ common: {
1675
+ name: {
1676
+ en: 'Number of all instances',
1677
+ de: 'Anzahl aller Instanzen',
1678
+ ru: '?????????? ???? ?????????',
1679
+ pt: 'N�mero de todas as inst�ncias',
1680
+ nl: 'Nummer van alle gevallen',
1681
+ fr: 'Nombre de cas',
1682
+ it: 'Numero di tutte le istanze',
1683
+ es: 'N�mero de casos',
1684
+ pl: 'Liczba wszystkich instancji',
1685
+ // @ts-ignore
1686
+ uk: '????????? ???? ???????????',
1687
+ 'zh-cn': '??????',
1688
+ },
1689
+ type: 'number',
1690
+ role: 'value',
1691
+ read: true,
1692
+ write: false,
1693
+ },
1694
+ native: {},
1695
+ });
1696
+ // Instances
1697
+ await adaptr.setObjectNotExistsAsync(`adapterAndInstances.listAllActiveInstances`, {
1698
+ type: 'state',
1699
+ common: {
1700
+ name: {
1701
+ en: 'JSON List of all active instances',
1702
+ de: 'JSON Liste aller aktiven Instanzen',
1703
+ ru: '????? ?????? ???? ???????? ?????????',
1704
+ pt: 'J. Lista de todas as inst�ncias ativas',
1705
+ nl: 'JSON List van alle actieve instanties',
1706
+ fr: 'JSON Liste de tous les cas actifs',
1707
+ it: 'JSON Elenco di tutte le istanze attive',
1708
+ es: 'JSON Lista de todos los casos activos',
1709
+ pl: 'JSON Lista wszystkich aktywnych instancji',
1710
+ // @ts-ignore
1711
+ uk: '????? ?????? ???? ???????? ???????????',
1712
+ 'zh-cn': '? ? ????????',
1713
+ },
1714
+ type: 'array',
1715
+ role: 'json',
1716
+ read: true,
1717
+ write: false,
1718
+ },
1719
+ native: {},
1720
+ });
1721
+ await adaptr.setObjectNotExistsAsync(`adapterAndInstances.countAllActiveInstances`, {
1722
+ type: 'state',
1723
+ common: {
1724
+ name: {
1725
+ en: 'Number of all active instances',
1726
+ de: 'Anzahl aller aktiven Instanzen',
1727
+ ru: '?????????? ???? ???????? ?????????',
1728
+ pt: 'N�mero de todas as inst�ncias ativas',
1729
+ nl: 'Nummer van alle actieve instanties',
1730
+ fr: 'Nombre de toutes les instances actives',
1731
+ it: 'Numero di tutte le istanze attive',
1732
+ es: 'N�mero de casos activos',
1733
+ pl: 'Liczba wszystkich czynnych przypadk�w',
1734
+ // @ts-ignore
1735
+ uk: '????????? ???? ???????? ???????????',
1736
+ 'zh-cn': '?????????',
1737
+ },
1738
+ type: 'number',
1739
+ role: 'value',
1740
+ read: true,
1741
+ write: false,
1742
+ },
1743
+ native: {},
1744
+ });
1745
+ await adaptr.setObjectNotExistsAsync(`adapterAndInstances.listDeactivatedInstances`, {
1746
+ type: 'state',
1747
+ common: {
1748
+ name: {
1749
+ en: 'JSON List of deactivated instances',
1750
+ de: 'JSON Liste der deaktivierten Instanzen',
1751
+ ru: '????? ?????? ???????????????? ?????????',
1752
+ pt: 'J. Lista de inst�ncias desativadas',
1753
+ nl: 'JSON List van gedeactiveerde instanties',
1754
+ fr: 'JSON Liste des cas d�sactiv�s',
1755
+ it: 'JSON Elenco delle istanze disattivate',
1756
+ es: 'JSON Lista de casos desactivados',
1757
+ pl: 'JSON Lista przypadk�w deaktywowanych',
1758
+ // @ts-ignore
1759
+ uk: '????? ??????? ????????????? ???????????',
1760
+ 'zh-cn': '? ? ??????',
1761
+ },
1762
+ type: 'array',
1763
+ role: 'json',
1764
+ read: true,
1765
+ write: false,
1766
+ },
1767
+ native: {},
1768
+ });
1769
+ await adaptr.setObjectNotExistsAsync(`adapterAndInstances.countDeactivatedInstances`, {
1770
+ type: 'state',
1771
+ common: {
1772
+ name: {
1773
+ en: 'Number of deactivated instances',
1774
+ de: 'Anzahl deaktivierter Instanzen',
1775
+ ru: '?????????? ???????????????? ?????????',
1776
+ pt: 'N�mero de inst�ncias desativadas',
1777
+ nl: 'Nummer van gedeactiveerde instanties',
1778
+ fr: 'Nombre de cas d�sactiv�s',
1779
+ it: 'Numero di istanze disattivate',
1780
+ es: 'N�mero de casos desactivados',
1781
+ pl: 'Liczba deaktywowanych instancji',
1782
+ // @ts-ignore
1783
+ uk: '????????? ????????????? ???????????',
1784
+ 'zh-cn': 'A. ???????',
1785
+ },
1786
+ type: 'number',
1787
+ role: 'value',
1788
+ read: true,
1789
+ write: false,
1790
+ },
1791
+ native: {},
1792
+ });
1793
+ await adaptr.setObjectNotExistsAsync(`adapterAndInstances.listInstancesError`, {
1794
+ type: 'state',
1795
+ common: {
1796
+ name: {
1797
+ en: 'JSON list of instances with error',
1798
+ de: 'JSON-Liste von Instanzen mit Fehler',
1799
+ ru: 'JSON ?????? ????????? ? ???????',
1800
+ pt: 'Lista de inst�ncias JSON com erro',
1801
+ nl: 'JSON lijst met fouten',
1802
+ fr: 'Liste des instances avec erreur',
1803
+ it: 'Elenco JSON delle istanze con errore',
1804
+ es: 'JSON lista de casos con error',
1805
+ pl: 'Lista b??d�w JSON',
1806
+ // @ts-ignore
1807
+ uk: 'JSON ?????? ??????????? ? ????????',
1808
+ 'zh-cn': '??????????????',
1809
+ },
1810
+ type: 'array',
1811
+ role: 'json',
1812
+ read: true,
1813
+ write: false,
1814
+ },
1815
+ native: {},
1816
+ });
1817
+ await adaptr.setObjectNotExistsAsync(`adapterAndInstances.countInstancesError`, {
1818
+ type: 'state',
1819
+ common: {
1820
+ name: {
1821
+ en: 'Count of instances with error',
1822
+ de: 'Anzahl der Instanzen mit Fehler',
1823
+ ru: '?????????? ????????? ? ???????',
1824
+ pt: 'Contagem de inst�ncias com erro',
1825
+ nl: 'Graaf van instoringen met fouten',
1826
+ fr: 'Nombre de cas avec erreur',
1827
+ it: 'Conteggio di istanze con errore',
1828
+ es: 'Cuenta de casos con error',
1829
+ pl: 'Liczba przyk?ad�w w przypadku b??d�w',
1830
+ // @ts-ignore
1831
+ uk: '????????? ??????????? ? ????????',
1832
+ 'zh-cn': '???????',
1833
+ },
1834
+ type: 'number',
1835
+ role: 'value',
1836
+ read: true,
1837
+ write: false,
1838
+ },
1839
+ native: {},
1840
+ });
1841
+
1842
+ // Adapter
1843
+ await adaptr.setObjectNotExistsAsync(`adapterAndInstances.listAdapterUpdates`, {
1844
+ type: 'state',
1845
+ common: {
1846
+ name: {
1847
+ en: 'JSON list of adapters with available updates',
1848
+ de: 'JSON-Liste der Adapter mit verf�gbaren Updates',
1849
+ ru: 'JSON ?????? ????????? ? ?????????? ????????????',
1850
+ pt: 'Lista de adaptadores JSON com atualiza��es dispon�veis',
1851
+ nl: 'JSON lijst met beschikbare updates',
1852
+ fr: 'Liste JSON des adaptateurs avec mises � jour disponibles',
1853
+ it: 'Elenco di adattatori JSON con aggiornamenti disponibili',
1854
+ es: 'JSON lista de adaptadores con actualizaciones disponibles',
1855
+ pl: 'JSON lista adapter�w z dost?pnymi aktualizacjami',
1856
+ // @ts-ignore
1857
+ uk: 'JSON ?????? ????????? ? ?????????? ???????????',
1858
+ 'zh-cn': '??A',
1859
+ },
1860
+ type: 'array',
1861
+ role: 'json',
1862
+ read: true,
1863
+ write: false,
1864
+ },
1865
+ native: {},
1866
+ });
1867
+ await adaptr.setObjectNotExistsAsync(`adapterAndInstances.countAdapterUpdates`, {
1868
+ type: 'state',
1869
+ common: {
1870
+ name: {
1871
+ en: 'Number of adapters with available updates',
1872
+ de: 'Anzahl der Adapter mit verf�gbaren Updates',
1873
+ ru: '?????????? ????????? ? ?????????? ????????????',
1874
+ pt: 'N�mero de adaptadores com atualiza��es dispon�veis',
1875
+ nl: 'Nummer van adapters met beschikbare updates',
1876
+ fr: "Nombre d'adaptateurs avec mises � jour disponibles",
1877
+ it: 'Numero di adattatori con aggiornamenti disponibili',
1878
+ es: 'N�mero de adaptadores con actualizaciones disponibles',
1879
+ pl: 'Liczba adapter�w z dost?pn? aktualizacj?',
1880
+ // @ts-ignore
1881
+ uk: '????????? ????????? ? ?????????? ???????????',
1882
+ 'zh-cn': '????????',
1883
+ },
1884
+ type: 'number',
1885
+ role: 'value',
1886
+ read: true,
1887
+ write: false,
1888
+ },
1889
+ native: {},
1890
+ });
1891
+ }
1892
+
1893
+ /**
1894
+ * delete Datapoints for Instances
1895
+ */
1896
+ async function deleteDPsForInstances(adaptr) {
1897
+ await adaptr.delObjectAsync(`adapterAndInstances`);
1898
+ await adaptr.delObjectAsync(`adapterAndInstances.listAllInstances`);
1899
+ await adaptr.delObjectAsync(`adapterAndInstances.countAllInstances`);
1900
+ await adaptr.delObjectAsync(`adapterAndInstances.listAllActiveInstances`);
1901
+ await adaptr.delObjectAsync(`adapterAndInstances.countAllActiveInstances`);
1902
+ await adaptr.delObjectAsync(`adapterAndInstances.listDeactivatedInstances`);
1903
+ await adaptr.delObjectAsync(`adapterAndInstances.countDeactivatedInstances`);
1904
+ await adaptr.delObjectAsync(`adapterAndInstances.listInstancesError`);
1905
+ await adaptr.delObjectAsync(`adapterAndInstances.countInstancesError`);
1906
+ await adaptr.delObjectAsync(`adapterAndInstances.listAdapterUpdates`);
1907
+ await adaptr.delObjectAsync(`adapterAndInstances.countAdapterUpdates`);
1908
+ }
1909
+
1910
+ /**
1911
+ * create adapter update data
1912
+ */
1913
+ async function createAdapterUpdateData(adaptr, adapterUpdateListDP) {
1914
+
1915
+ // subscribe to datapoint
1916
+ adaptr.subscribeForeignStates(adapterUpdateListDP);
1917
+
1918
+ await adaptr.getAdapterUpdateData(adapterUpdateListDP);
1919
+
1920
+ await adaptr.createAdapterUpdateList();
1921
+ }
1922
+
1923
+
1924
+ module.exports = {
1925
+ createDPsForEachAdapter,
1926
+ deleteDPsForEachAdapter,
1927
+ createHtmlListDatapoints,
1928
+ deleteHtmlListDatapoints,
1929
+ createHtmlListDatapointsInstances,
1930
+ deleteHtmlListDatapointsInstances,
1931
+ createListHTML,
1932
+ createListHTMLInstances,
1933
+ createBlacklist,
1934
+ createTimeListInstances,
1935
+ createData,
1936
+ createLists,
1937
+ writeDatapoints,
1938
+ createDPsForInstances,
1939
+ deleteDPsForInstances,
1940
+ createAdapterUpdateData,
1941
+
1942
+ };