iobroker.devices 1.2.12 → 2.0.2

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 (36) hide show
  1. package/README.md +17 -6
  2. package/admin/assets/index-Csa94g2Q.js +845 -0
  3. package/admin/assets/index-pCeIEsc7.css +1 -0
  4. package/admin/assets/ioBrokerLogo-D4L_xR2G.png +0 -0
  5. package/admin/index_m.html +2 -2
  6. package/admin/tab.html +2 -2
  7. package/build/lib/DeviceManagement.js +618 -0
  8. package/build/lib/DeviceManagement.js.map +1 -0
  9. package/build/lib/WidgetsManagement.js +627 -0
  10. package/build/lib/WidgetsManagement.js.map +1 -0
  11. package/build/main.js +53 -0
  12. package/build/main.js.map +1 -0
  13. package/build/widget-utils/WidgetsManagement.js +121 -0
  14. package/build/widget-utils/WidgetsManagement.js.map +1 -0
  15. package/build/widget-utils/index.js +18 -0
  16. package/build/widget-utils/index.js.map +1 -0
  17. package/build/widget-utils/types/api.js +3 -0
  18. package/build/widget-utils/types/api.js.map +1 -0
  19. package/build/widget-utils/types/base.js +3 -0
  20. package/build/widget-utils/types/base.js.map +1 -0
  21. package/build/widget-utils/types/common.js +3 -0
  22. package/build/widget-utils/types/common.js.map +1 -0
  23. package/build/widget-utils/types/index.js +3 -0
  24. package/build/widget-utils/types/index.js.map +1 -0
  25. package/img/ioBrokerLogo.png +0 -0
  26. package/io-package.json +59 -31
  27. package/package.json +27 -15
  28. package/www/assets/index-CmwOqvIb.css +1 -0
  29. package/www/assets/index-DHISOGRL.js +748 -0
  30. package/www/assets/ioBrokerLogo-D4L_xR2G.png +0 -0
  31. package/www/devices.svg +26 -0
  32. package/www/favicon.ico +0 -0
  33. package/www/index.html +30 -0
  34. package/www/manifest.json +15 -0
  35. package/admin/assets/index-CKue6Ph0.css +0 -1
  36. package/admin/assets/index-ChCHYkC8.js +0 -826
@@ -0,0 +1,618 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ const dm_utils_1 = require("@iobroker/dm-utils");
7
+ const type_detector_1 = __importDefault(require("@iobroker/type-detector"));
8
+ const ALIAS = 'alias.';
9
+ const LINKEDDEVICES = 'linkeddevices.';
10
+ function findMainStateId(device) {
11
+ const state = device.states.find(s => s.id && s.required);
12
+ return state?.id;
13
+ }
14
+ function getParentId(id) {
15
+ const pos = id.lastIndexOf('.');
16
+ return pos !== -1 ? id.substring(0, pos) : '';
17
+ }
18
+ /**
19
+ * Create a handler that writes a value to a writable state.
20
+ */
21
+ function makeHandler(adapter, writeId) {
22
+ return async (_deviceId, _actionId, value, _context) => {
23
+ await adapter.setForeignStateAsync(writeId, value, false);
24
+ return { val: value, ack: true };
25
+ };
26
+ }
27
+ /**
28
+ * Create a getStateHandler that reads the current value from a state.
29
+ */
30
+ function makeGetStateHandler(adapter, readId, defaultVal = null) {
31
+ return async (_deviceId, _actionId, _context) => {
32
+ const state = await adapter.getForeignStateAsync(readId);
33
+ return state || { val: defaultVal, ack: true };
34
+ };
35
+ }
36
+ /**
37
+ * Build dm-utils controls from the detected device states.
38
+ * Every writable control gets a handler (writes SET) and getStateHandler (reads ACTUAL or SET).
39
+ * Read-only controls get only getStateHandler.
40
+ */
41
+ function buildControls(adapter, device) {
42
+ const controls = [];
43
+ const stateMap = new Map();
44
+ for (const s of device.states) {
45
+ if (s.id) {
46
+ stateMap.set(s.name, s);
47
+ }
48
+ }
49
+ const type = device.type;
50
+ // ── ON/OFF switches ────────────────────────────────────────────
51
+ // light, socket, lock, gate — boolean SET with ACTUAL/ON_ACTUAL feedback
52
+ const setState = stateMap.get('SET');
53
+ if (setState?.id && setState.write) {
54
+ if (type === 'light' || type === 'socket' || type === 'lock' || type === 'gate') {
55
+ const getState = type === 'light' ? stateMap.get('ON_ACTUAL') : stateMap.get('ACTUAL');
56
+ const readId = getState?.id || setState.id;
57
+ controls.push({
58
+ id: 'power',
59
+ type: 'switch',
60
+ stateId: readId,
61
+ label: { en: 'Power', de: 'Strom' },
62
+ handler: makeHandler(adapter, setState.id),
63
+ getStateHandler: makeGetStateHandler(adapter, readId, false),
64
+ });
65
+ }
66
+ }
67
+ // dimmer, ct, hue, cie, rgb*, percentage, volume, volumeGroup — ON_SET or ON switch
68
+ const onSetState = stateMap.get('ON_SET') || stateMap.get('ON');
69
+ if (onSetState?.id && onSetState.write) {
70
+ const onActual = stateMap.get('ON_ACTUAL');
71
+ const readId = onActual?.id || onSetState.id;
72
+ controls.push({
73
+ id: 'power',
74
+ type: 'switch',
75
+ stateId: readId,
76
+ label: { en: 'Power', de: 'Strom' },
77
+ handler: makeHandler(adapter, onSetState.id),
78
+ getStateHandler: makeGetStateHandler(adapter, readId, false),
79
+ });
80
+ }
81
+ // thermostat / airCondition — POWER
82
+ const powerState = stateMap.get('POWER');
83
+ if (powerState?.id && powerState.write) {
84
+ if (!controls.find(c => c.id === 'power')) {
85
+ controls.push({
86
+ id: 'power',
87
+ type: 'switch',
88
+ stateId: powerState.id,
89
+ label: { en: 'Power', de: 'Strom' },
90
+ handler: makeHandler(adapter, powerState.id),
91
+ getStateHandler: makeGetStateHandler(adapter, powerState.id, false),
92
+ });
93
+ }
94
+ }
95
+ // ── Sliders ────────────────────────────────────────────────────
96
+ // dimmer, blind, percentage, etc. — SET (level) with ACTUAL feedback
97
+ if (setState?.id && setState.write) {
98
+ if (type === 'dimmer' ||
99
+ type === 'ct' ||
100
+ type === 'hue' ||
101
+ type === 'cie' ||
102
+ type === 'blind' ||
103
+ type === 'percentage' ||
104
+ type === 'slider') {
105
+ const actualLevel = stateMap.get('ACTUAL');
106
+ const readId = actualLevel?.id || setState.id;
107
+ controls.push({
108
+ id: 'level',
109
+ type: 'slider',
110
+ stateId: readId,
111
+ min: 0,
112
+ max: 100,
113
+ unit: '%',
114
+ label: type === 'blind' ? { en: 'Position', de: 'Position' } : { en: 'Level', de: 'Stufe' },
115
+ handler: makeHandler(adapter, setState.id),
116
+ getStateHandler: makeGetStateHandler(adapter, readId, 0),
117
+ });
118
+ }
119
+ }
120
+ // volume / volumeGroup — SET with ACTUAL feedback
121
+ if (setState?.id && setState.write && (type === 'volume' || type === 'volumeGroup')) {
122
+ const actualVol = stateMap.get('ACTUAL');
123
+ const readId = actualVol?.id || setState.id;
124
+ controls.push({
125
+ id: 'volume',
126
+ type: 'slider',
127
+ stateId: readId,
128
+ min: 0,
129
+ max: 100,
130
+ unit: '%',
131
+ label: { en: 'Volume', de: 'Lautstärke' },
132
+ handler: makeHandler(adapter, setState.id),
133
+ getStateHandler: makeGetStateHandler(adapter, readId, 0),
134
+ });
135
+ }
136
+ // thermostat / airCondition — SET (temperature setpoint) with ACTUAL feedback
137
+ if (setState?.id && setState.write && (type === 'thermostat' || type === 'airCondition')) {
138
+ const actualTemp = stateMap.get('ACTUAL');
139
+ const readId = actualTemp?.id || setState.id;
140
+ controls.push({
141
+ id: 'setpoint',
142
+ type: 'slider',
143
+ stateId: readId,
144
+ min: 5,
145
+ max: 35,
146
+ step: 0.5,
147
+ unit: '°C',
148
+ label: { en: 'Setpoint', de: 'Sollwert' },
149
+ handler: makeHandler(adapter, setState.id),
150
+ getStateHandler: makeGetStateHandler(adapter, readId, 20),
151
+ });
152
+ }
153
+ // DIMMER / BRIGHTNESS state for color devices
154
+ const dimmerState = stateMap.get('DIMMER') || stateMap.get('BRIGHTNESS');
155
+ if (dimmerState?.id && dimmerState.write && !controls.find(c => c.id === 'level')) {
156
+ controls.push({
157
+ id: 'level',
158
+ type: 'slider',
159
+ stateId: dimmerState.id,
160
+ min: 0,
161
+ max: 100,
162
+ unit: '%',
163
+ label: { en: 'Brightness', de: 'Helligkeit' },
164
+ handler: makeHandler(adapter, dimmerState.id),
165
+ getStateHandler: makeGetStateHandler(adapter, dimmerState.id, 0),
166
+ });
167
+ }
168
+ // Color temperature
169
+ const ctState = stateMap.get('TEMPERATURE');
170
+ if (ctState?.id &&
171
+ ctState.write &&
172
+ (type === 'ct' ||
173
+ type === 'hue' ||
174
+ type === 'cie' ||
175
+ type === 'rgb' ||
176
+ type === 'rgbSingle' ||
177
+ type === 'rgbwSingle')) {
178
+ controls.push({
179
+ id: 'colorTemp',
180
+ type: 'slider',
181
+ stateId: ctState.id,
182
+ min: 2700,
183
+ max: 6500,
184
+ unit: 'K',
185
+ label: { en: 'Color temperature', de: 'Farbtemperatur' },
186
+ handler: makeHandler(adapter, ctState.id),
187
+ getStateHandler: makeGetStateHandler(adapter, ctState.id, 4000),
188
+ });
189
+ }
190
+ // ── Color control ──────────────────────────────────────────────
191
+ const rgbState = stateMap.get('RGB') || stateMap.get('RGBW');
192
+ if (rgbState?.id && rgbState.write) {
193
+ controls.push({
194
+ id: 'color',
195
+ type: 'color',
196
+ stateId: rgbState.id,
197
+ label: { en: 'Color', de: 'Farbe' },
198
+ handler: makeHandler(adapter, rgbState.id),
199
+ getStateHandler: makeGetStateHandler(adapter, rgbState.id, '#000000'),
200
+ });
201
+ }
202
+ // ── Mute ───────────────────────────────────────────────────────
203
+ const muteState = stateMap.get('MUTE');
204
+ if (muteState?.id && muteState.write) {
205
+ controls.push({
206
+ id: 'mute',
207
+ type: 'switch',
208
+ stateId: muteState.id,
209
+ label: { en: 'Mute', de: 'Stumm' },
210
+ handler: makeHandler(adapter, muteState.id),
211
+ getStateHandler: makeGetStateHandler(adapter, muteState.id, false),
212
+ });
213
+ }
214
+ // ── Info controls (read-only sensors) ──────────────────────────
215
+ const actualState = stateMap.get('ACTUAL');
216
+ if (actualState?.id) {
217
+ // Sensors: temperature, humidity, door, window, motion, fire, flood
218
+ if (type === 'temperature' ||
219
+ type === 'humidity' ||
220
+ type === 'door' ||
221
+ type === 'window' ||
222
+ type === 'windowTilt' ||
223
+ type === 'motion' ||
224
+ type === 'fireAlarm' ||
225
+ type === 'floodAlarm') {
226
+ let unit;
227
+ let defaultVal = null;
228
+ if (type === 'temperature') {
229
+ unit = '°C';
230
+ defaultVal = 0;
231
+ }
232
+ else if (type === 'humidity') {
233
+ unit = '%';
234
+ defaultVal = 0;
235
+ }
236
+ else {
237
+ defaultVal = false;
238
+ }
239
+ controls.push({
240
+ id: 'value',
241
+ type: 'info',
242
+ stateId: actualState.id,
243
+ unit,
244
+ label: type === 'temperature'
245
+ ? { en: 'Temperature', de: 'Temperatur' }
246
+ : type === 'humidity'
247
+ ? { en: 'Humidity', de: 'Feuchtigkeit' }
248
+ : type === 'door'
249
+ ? { en: 'Door', de: 'Tür' }
250
+ : type === 'window' || type === 'windowTilt'
251
+ ? { en: 'Window', de: 'Fenster' }
252
+ : type === 'motion'
253
+ ? { en: 'Motion', de: 'Bewegung' }
254
+ : type === 'fireAlarm'
255
+ ? { en: 'Fire', de: 'Feuer' }
256
+ : { en: 'Flood', de: 'Überflutung' },
257
+ getStateHandler: makeGetStateHandler(adapter, actualState.id, defaultVal),
258
+ });
259
+ }
260
+ // Thermostat actual temperature
261
+ if (type === 'thermostat' || type === 'airCondition') {
262
+ controls.push({
263
+ id: 'actualTemp',
264
+ type: 'info',
265
+ stateId: actualState.id,
266
+ unit: '°C',
267
+ label: { en: 'Temperature', de: 'Temperatur' },
268
+ getStateHandler: makeGetStateHandler(adapter, actualState.id, 0),
269
+ });
270
+ }
271
+ }
272
+ // ── Electric power info ────────────────────────────────────────
273
+ const powerInfo = stateMap.get('ELECTRIC_POWER');
274
+ if (powerInfo?.id) {
275
+ controls.push({
276
+ id: 'electricPower',
277
+ type: 'info',
278
+ stateId: powerInfo.id,
279
+ unit: 'W',
280
+ label: { en: 'Power', de: 'Leistung' },
281
+ getStateHandler: makeGetStateHandler(adapter, powerInfo.id, 0),
282
+ });
283
+ }
284
+ // If only one control, the label is redundant — remove it
285
+ if (controls.length === 1) {
286
+ delete controls[0].label;
287
+ }
288
+ return controls;
289
+ }
290
+ class DevicesDeviceManagement extends dm_utils_1.DeviceManagement {
291
+ detector = new type_detector_1.default();
292
+ objects = {};
293
+ enumIds = [];
294
+ /** IDs collected from enum members only */
295
+ enumMemberIds = [];
296
+ idsInEnums = [];
297
+ /** All detected devices */
298
+ allDevices = [];
299
+ /** Only devices with common.custom[namespace].enabled === true */
300
+ enabledDevices = [];
301
+ loaded = null;
302
+ notifyTimeout = null;
303
+ /** Lazily rebuilt sorted keys cache */
304
+ _sortedKeys = null;
305
+ getInstanceInfo() {
306
+ return {
307
+ apiVersion: 'v3',
308
+ actions: [],
309
+ };
310
+ }
311
+ // ── Sorted keys cache ──────────────────────────────────────────────
312
+ getSortedKeys() {
313
+ this._sortedKeys ||= Object.keys(this.objects).sort();
314
+ return this._sortedKeys;
315
+ }
316
+ invalidateKeys() {
317
+ this._sortedKeys = null;
318
+ }
319
+ // ── Helpers ────────────────────────────────────────────────────────
320
+ /**
321
+ * Resolve the channelId for a detected device (same logic as updateEnumsForOneDevice).
322
+ */
323
+ resolveChannelId(device) {
324
+ const mainStateId = findMainStateId(device);
325
+ if (!mainStateId) {
326
+ device.channelId = '';
327
+ return;
328
+ }
329
+ const statesCount = device.states.filter(s => s.id).length;
330
+ let channelId = mainStateId;
331
+ if (mainStateId.includes('.') &&
332
+ (statesCount > 1 || channelId.startsWith(ALIAS) || channelId.startsWith(LINKEDDEVICES))) {
333
+ channelId = getParentId(mainStateId);
334
+ if (!this.objects[channelId]?.common ||
335
+ (this.objects[channelId].type !== 'channel' &&
336
+ this.objects[channelId].type !== 'device' &&
337
+ this.objects[channelId].type !== 'folder')) {
338
+ channelId = mainStateId;
339
+ }
340
+ }
341
+ device.channelId = channelId;
342
+ }
343
+ /**
344
+ * Rebuild enumIds and enumMemberIds by scanning all objects for enums.
345
+ * This is the expensive part — only call when enums actually changed.
346
+ */
347
+ rebuildEnumMemberIds() {
348
+ this.enumIds = [];
349
+ const ids = [];
350
+ for (const [id, obj] of Object.entries(this.objects)) {
351
+ if (obj.type === 'enum') {
352
+ this.enumIds.push(id);
353
+ const members = obj.common?.members;
354
+ if (members) {
355
+ for (const m of members) {
356
+ if (!ids.includes(m)) {
357
+ ids.push(m);
358
+ }
359
+ }
360
+ }
361
+ }
362
+ }
363
+ this.enumIds.sort();
364
+ this.enumMemberIds = ids;
365
+ }
366
+ /**
367
+ * Rebuild idsInEnums by adding alias/linkeddevices channels/devices
368
+ * not already covered by enumMemberIds. Cheap — only scans the relevant key range.
369
+ */
370
+ rebuildAliasIds() {
371
+ const ids = [...this.enumMemberIds];
372
+ const keys = this.getSortedKeys();
373
+ const END = `${LINKEDDEVICES}\u9999`;
374
+ for (const key of keys) {
375
+ if (key < ALIAS) {
376
+ continue;
377
+ }
378
+ if (key > END) {
379
+ break;
380
+ }
381
+ if ((key.startsWith(ALIAS) || key.startsWith(LINKEDDEVICES)) && this.objects[key] && !ids.includes(key)) {
382
+ if (this.objects[key].type === 'device') {
383
+ ids.push(key);
384
+ }
385
+ else if (this.objects[key].type === 'channel') {
386
+ const parentId = getParentId(key);
387
+ if (!this.objects[parentId] || !ids.includes(parentId)) {
388
+ ids.push(key);
389
+ }
390
+ }
391
+ }
392
+ }
393
+ this.idsInEnums = ids.sort();
394
+ }
395
+ /**
396
+ * Full rebuild of idsInEnums (enum scan + alias scan). Only used for initial load.
397
+ */
398
+ rebuildIdsInEnums() {
399
+ this.rebuildEnumMemberIds();
400
+ this.rebuildAliasIds();
401
+ }
402
+ /**
403
+ * Run ChannelDetector.detect() only for the given IDs. Returns newly detected devices.
404
+ */
405
+ detectForIds(ids) {
406
+ if (!ids.length) {
407
+ return [];
408
+ }
409
+ const keys = this.getSortedKeys();
410
+ const usedIds = [];
411
+ const result = [];
412
+ for (const id of ids) {
413
+ const detected = this.detector.detect({
414
+ id,
415
+ objects: this.objects,
416
+ _usedIdsOptional: usedIds,
417
+ _keysOptional: keys,
418
+ ignoreCache: true,
419
+ });
420
+ if (detected) {
421
+ for (const device of detected) {
422
+ const d = device;
423
+ this.resolveChannelId(d);
424
+ if (d.channelId) {
425
+ result.push(d);
426
+ }
427
+ }
428
+ }
429
+ }
430
+ return result;
431
+ }
432
+ /**
433
+ * Remove devices from allDevices whose channelId matches any of the given IDs.
434
+ */
435
+ removeDevicesForChannelIds(channelIds) {
436
+ if (!channelIds.length) {
437
+ return;
438
+ }
439
+ const set = new Set(channelIds);
440
+ this.allDevices = this.allDevices.filter(d => !set.has(d.channelId));
441
+ }
442
+ /**
443
+ * Rebuild enabledDevices from allDevices (cheap, no I/O, no detection).
444
+ * Only devices with common.custom[namespace].enabled === true are included.
445
+ */
446
+ rebuildEnabledDevices() {
447
+ const customKey = this.adapter.namespace;
448
+ this.enabledDevices = this.allDevices.filter(d => d.channelId && this.objects[d.channelId]?.common?.custom?.[customKey]?.enabled);
449
+ }
450
+ /**
451
+ * For a given changed object ID, find the detection IDs (from idsInEnums) that are affected.
452
+ * A state change affects its parent channel/device.
453
+ */
454
+ getAffectedChannelIds(id) {
455
+ // Direct match in idsInEnums
456
+ if (this.idsInEnums.includes(id)) {
457
+ return [id];
458
+ }
459
+ // Parent is a detection ID (state changed under a channel)
460
+ const parentId = getParentId(id);
461
+ if (parentId && this.idsInEnums.includes(parentId)) {
462
+ return [parentId];
463
+ }
464
+ // Grandparent (state under device>channel hierarchy)
465
+ const grandParentId = getParentId(parentId);
466
+ if (grandParentId && this.idsInEnums.includes(grandParentId)) {
467
+ return [grandParentId];
468
+ }
469
+ // Check if any existing device references this ID in its states
470
+ const affected = [];
471
+ for (const device of this.allDevices) {
472
+ if (device.channelId === id || device.states.some(s => s.id === id)) {
473
+ if (!affected.includes(device.channelId)) {
474
+ affected.push(device.channelId);
475
+ }
476
+ }
477
+ }
478
+ return affected;
479
+ }
480
+ // ── GUI notification ───────────────────────────────────────────────
481
+ /**
482
+ * Debounced GUI notification (100ms) to batch rapid changes.
483
+ */
484
+ scheduleNotify() {
485
+ if (this.notifyTimeout) {
486
+ clearTimeout(this.notifyTimeout);
487
+ }
488
+ this.notifyTimeout = setTimeout(async () => {
489
+ this.notifyTimeout = null;
490
+ try {
491
+ await this.sendCommandToGui({ command: 'all' });
492
+ }
493
+ catch {
494
+ // GUI may not be open — ignore
495
+ }
496
+ }, 100);
497
+ }
498
+ // ── Object change (incremental) ───────────────────────────────────
499
+ objectChange(id, obj) {
500
+ const oldObj = this.objects[id];
501
+ if (!oldObj && !obj) {
502
+ return;
503
+ }
504
+ // Update local cache
505
+ if (obj) {
506
+ this.objects[id] = obj;
507
+ }
508
+ else {
509
+ delete this.objects[id];
510
+ }
511
+ this.invalidateKeys();
512
+ // Case 1: Enum changed — rebuild enum member IDs + alias IDs, detect only the diff
513
+ if (oldObj?.type === 'enum' || obj?.type === 'enum') {
514
+ const oldIds = [...this.idsInEnums];
515
+ this.rebuildEnumMemberIds();
516
+ this.rebuildAliasIds();
517
+ const removed = oldIds.filter(x => !this.idsInEnums.includes(x));
518
+ const added = this.idsInEnums.filter(x => !oldIds.includes(x));
519
+ if (removed.length) {
520
+ this.removeDevicesForChannelIds(removed);
521
+ }
522
+ if (added.length) {
523
+ this.allDevices.push(...this.detectForIds(added));
524
+ }
525
+ this.rebuildEnabledDevices();
526
+ this.scheduleNotify();
527
+ return;
528
+ }
529
+ // Case 2: Object under alias.* or linkeddevices.* — only alias scan needed, enum members unchanged
530
+ if (id.startsWith(ALIAS) || id.startsWith(LINKEDDEVICES)) {
531
+ const oldIds = [...this.idsInEnums];
532
+ this.rebuildAliasIds();
533
+ const affected = this.getAffectedChannelIds(id);
534
+ const removedFromEnums = oldIds.filter(x => !this.idsInEnums.includes(x));
535
+ const addedToEnums = this.idsInEnums.filter(x => !oldIds.includes(x));
536
+ const toRemove = [...new Set([...affected, ...removedFromEnums])];
537
+ this.removeDevicesForChannelIds(toRemove);
538
+ const toDetect = [...new Set([...affected.filter(x => this.idsInEnums.includes(x)), ...addedToEnums])];
539
+ if (toDetect.length) {
540
+ this.allDevices.push(...this.detectForIds(toDetect));
541
+ }
542
+ this.rebuildEnabledDevices();
543
+ this.scheduleNotify();
544
+ return;
545
+ }
546
+ // Case 3: Only the enabled flag changed — just rebuild the filter (no detection)
547
+ const customKey = this.adapter.namespace;
548
+ const oldEnabled = oldObj?.common?.custom?.[customKey]?.enabled;
549
+ const newEnabled = obj?.common?.custom?.[customKey]?.enabled;
550
+ if (oldEnabled !== newEnabled) {
551
+ this.rebuildEnabledDevices();
552
+ this.scheduleNotify();
553
+ return;
554
+ }
555
+ // Case 4: Object referenced by idsInEnums or existing device changed
556
+ const affected = this.getAffectedChannelIds(id);
557
+ if (affected.length) {
558
+ this.removeDevicesForChannelIds(affected);
559
+ if (obj) {
560
+ this.allDevices.push(...this.detectForIds(affected));
561
+ }
562
+ this.rebuildEnabledDevices();
563
+ this.scheduleNotify();
564
+ }
565
+ }
566
+ // ── Initial full detection (called once) ──────────────────────────
567
+ async initialLoad() {
568
+ // Read all objects from DB — only done ONCE
569
+ const res = await this.adapter.getObjectListAsync({ include_docs: true });
570
+ const rows = res?.rows || [];
571
+ for (const row of rows) {
572
+ this.objects[row.doc._id] = row.doc;
573
+ }
574
+ this.invalidateKeys();
575
+ // Build idsInEnums
576
+ this.rebuildIdsInEnums();
577
+ // Detect ALL devices
578
+ this.allDevices = this.detectForIds(this.idsInEnums);
579
+ // Filter enabled
580
+ this.rebuildEnabledDevices();
581
+ // Subscribe to all object changes for incremental updates
582
+ await this.adapter.subscribeForeignObjectsAsync('*');
583
+ }
584
+ // ── loadDevices (called by dm-utils framework) ────────────────────
585
+ async loadDevices(context) {
586
+ if (!this.loaded) {
587
+ this.loaded = this.initialLoad();
588
+ }
589
+ await this.loaded;
590
+ context.setTotalDevices(this.enabledDevices.length);
591
+ for (const device of this.enabledDevices) {
592
+ const obj = this.objects[device.channelId];
593
+ if (!obj) {
594
+ continue;
595
+ }
596
+ const name = typeof obj.common.name === 'object'
597
+ ? obj.common.name[this.adapter.language || 'en'] || obj.common.name.en || device.channelId
598
+ : obj.common.name || device.channelId;
599
+ const icon = obj.common.icon || undefined;
600
+ const color = obj.common.color || undefined;
601
+ const role = 'role' in obj.common ? obj.common.role : undefined;
602
+ const controls = buildControls(this.adapter, device);
603
+ const deviceInfo = {
604
+ id: device.channelId,
605
+ name,
606
+ icon,
607
+ color,
608
+ model: role || device.type || '',
609
+ hasDetails: false,
610
+ actions: [],
611
+ controls,
612
+ };
613
+ context.addDevice(deviceInfo);
614
+ }
615
+ }
616
+ }
617
+ exports.default = DevicesDeviceManagement;
618
+ //# sourceMappingURL=DeviceManagement.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DeviceManagement.js","sourceRoot":"","sources":["../../src/lib/DeviceManagement.ts"],"names":[],"mappings":"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"}