homebridge-adt-pulse 3.0.0-beta.2 → 3.0.0-beta.20

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 (39) hide show
  1. package/LICENSE +198 -12
  2. package/README.md +173 -114
  3. package/build/config.schema.json +343 -0
  4. package/build/src/index.js +6 -0
  5. package/build/src/index.js.map +1 -0
  6. package/build/src/lib/accessory.js +421 -0
  7. package/build/src/lib/accessory.js.map +1 -0
  8. package/build/src/lib/api.js +1782 -0
  9. package/build/src/lib/api.js.map +1 -0
  10. package/build/src/lib/detect.js +480 -0
  11. package/build/src/lib/detect.js.map +1 -0
  12. package/build/src/lib/items.js +267 -0
  13. package/build/src/lib/items.js.map +1 -0
  14. package/build/src/lib/platform.js +495 -0
  15. package/build/src/lib/platform.js.map +1 -0
  16. package/{src/lib/regex.ts → build/src/lib/regex.js} +3 -145
  17. package/build/src/lib/regex.js.map +1 -0
  18. package/build/src/lib/schema.js +44 -0
  19. package/build/src/lib/schema.js.map +1 -0
  20. package/build/src/lib/utility.js +528 -0
  21. package/build/src/lib/utility.js.map +1 -0
  22. package/build/src/scripts/repl.js +176 -0
  23. package/build/src/scripts/repl.js.map +1 -0
  24. package/build/src/scripts/test-api.js +171 -0
  25. package/build/src/scripts/test-api.js.map +1 -0
  26. package/config.schema.json +324 -218
  27. package/package.json +34 -20
  28. package/src/index.ts +0 -18
  29. package/src/lib/accessory.ts +0 -405
  30. package/src/lib/api.ts +0 -3483
  31. package/src/lib/detect.ts +0 -728
  32. package/src/lib/platform.ts +0 -890
  33. package/src/lib/schema.ts +0 -34
  34. package/src/lib/utility.ts +0 -933
  35. package/src/scripts/repl.ts +0 -300
  36. package/src/scripts/test-api.ts +0 -278
  37. package/src/types/constant.d.ts +0 -308
  38. package/src/types/index.d.ts +0 -1472
  39. package/src/types/shared.d.ts +0 -517
@@ -0,0 +1,495 @@
1
+ import chalk from 'chalk';
2
+ import { arch, argv, platform, versions, } from 'node:process';
3
+ import { serializeError } from 'serialize-error';
4
+ import { ADTPulseAccessory } from './accessory.js';
5
+ import { ADTPulse } from './api.js';
6
+ import { detectedUnknownSensorsAction } from './detect.js';
7
+ import { platformConfig } from './schema.js';
8
+ import { condenseSensorType, findIndexWithValue, generateHash, getAccessoryCategory, getPackageVersion, getPluralForm, sleep, stackTracer, } from './utility.js';
9
+ export class ADTPulsePlatform {
10
+ accessories;
11
+ #api;
12
+ #characteristic;
13
+ #config;
14
+ #constants;
15
+ #debugMode;
16
+ #handlers;
17
+ #instance;
18
+ #log;
19
+ #service;
20
+ #state;
21
+ constructor(log, config, api) {
22
+ this.accessories = [];
23
+ this.#api = api;
24
+ this.#characteristic = api.hap.Characteristic;
25
+ this.#config = null;
26
+ this.#constants = {
27
+ intervalTimestamps: {
28
+ adtKeepAlive: 538000,
29
+ adtSyncCheck: 3000,
30
+ suspendSyncing: 1800000,
31
+ synchronize: 1000,
32
+ },
33
+ maxLoginRetries: 3,
34
+ };
35
+ this.#debugMode = argv.includes('-D') || argv.includes('--debug');
36
+ this.#handlers = {};
37
+ this.#instance = null;
38
+ this.#log = log;
39
+ this.#service = api.hap.Service;
40
+ this.#state = {
41
+ activity: {
42
+ isAdtKeepingAlive: false,
43
+ isAdtSyncChecking: false,
44
+ isLoggingIn: false,
45
+ isSyncing: false,
46
+ },
47
+ data: {
48
+ gatewayInfo: null,
49
+ panelInfo: null,
50
+ panelStatus: null,
51
+ sensorsInfo: [],
52
+ sensorsStatus: [],
53
+ syncCode: '1-0-0',
54
+ },
55
+ eventCounters: {
56
+ failedLogins: 0,
57
+ },
58
+ intervals: {
59
+ synchronize: undefined,
60
+ },
61
+ lastRunOn: {
62
+ adtKeepAlive: 0,
63
+ adtSyncCheck: 0,
64
+ },
65
+ reportedHashes: [],
66
+ };
67
+ const parsedConfig = platformConfig.safeParse(config);
68
+ if (!parsedConfig.success) {
69
+ this.#log.error('Plugin is unable to initialize due to an invalid platform configuration.');
70
+ this.#log.warn('If you just upgraded from v2 to v3, please update your configuration structure.');
71
+ stackTracer('zod-error', parsedConfig.error.errors);
72
+ return;
73
+ }
74
+ api.on('didFinishLaunching', async () => {
75
+ this.#config = parsedConfig.data;
76
+ this.printSystemInformation();
77
+ this.#log.info('The API gathers anonymous analytics to detect potential bugs or issues. All personally identifiable information will be redacted.');
78
+ if (this.#config.mode === 'paused') {
79
+ this.#log.warn('Plugin is now paused and all related accessories will no longer respond.');
80
+ return;
81
+ }
82
+ if (this.#config.mode === 'reset') {
83
+ let warningCount = 0;
84
+ let warningTerm = '';
85
+ this.#log.warn('Plugin started in reset mode and will remove all accessories shortly.');
86
+ await sleep(10000);
87
+ for (let i = 3; i >= 1; i -= 1) {
88
+ const seconds = 10 * i;
89
+ warningCount += 1;
90
+ switch (warningCount) {
91
+ case 1:
92
+ warningTerm = 'FIRST';
93
+ break;
94
+ case 2:
95
+ warningTerm = 'SECOND';
96
+ break;
97
+ case 3:
98
+ default:
99
+ warningTerm = 'FINAL';
100
+ break;
101
+ }
102
+ this.#log.warn(`${warningTerm} WARNING! ${seconds} SECONDS REMAINING before all related accessories are removed.`);
103
+ await sleep(10000);
104
+ }
105
+ this.#log.warn('Plugin is now removing all related accessories from Homebridge ...');
106
+ for (let i = this.accessories.length - 1; i >= 0; i -= 1) {
107
+ this.removeAccessory(this.accessories[i], 'plugin is in "reset" mode');
108
+ }
109
+ this.#log.info('Plugin finished removing all related accessories from Homebridge.');
110
+ return;
111
+ }
112
+ if (this.#config.speed !== 1) {
113
+ this.#log.warn(`Plugin is now running under ${this.#config.speed}x operational speed. You may see slower device updates.`);
114
+ this.#constants.intervalTimestamps.synchronize *= (1 / this.#config.speed);
115
+ }
116
+ this.#instance = new ADTPulse(this.#config, {
117
+ debug: this.#debugMode === true,
118
+ logger: this.#log,
119
+ });
120
+ this.synchronize();
121
+ });
122
+ }
123
+ configureAccessory(accessory) {
124
+ this.#log.info(`Configuring cached accessory for ${chalk.underline(accessory.context.name)} (id: ${accessory.context.id}, uuid: ${accessory.context.uuid}) ...`);
125
+ this.accessories.push(accessory);
126
+ }
127
+ addAccessory(device) {
128
+ const accessoryIndex = this.accessories.findIndex((accessory) => device.uuid === accessory.context.uuid);
129
+ if (accessoryIndex >= 0) {
130
+ this.#log.error(`Cannot add ${chalk.underline(device.name)} (id: ${device.id}, uuid: ${device.uuid}) accessory that already exists.`);
131
+ return;
132
+ }
133
+ if (this.#instance === null) {
134
+ this.#log.error(`Attempted to add ${chalk.underline(device.name)} (id: ${device.id}, uuid: ${device.uuid}) accessory but API instance is not available.`);
135
+ return;
136
+ }
137
+ const newAccessory = new this.#api.platformAccessory(device.name, device.uuid, getAccessoryCategory(device.category));
138
+ newAccessory.context = device;
139
+ const typedAccessory = newAccessory;
140
+ this.#log.info(`Adding ${chalk.underline(typedAccessory.context.name)} (id: ${typedAccessory.context.id}, uuid: ${typedAccessory.context.uuid}) accessory ...`);
141
+ if (this.#handlers[device.id] === undefined) {
142
+ this.#handlers[device.id] = new ADTPulseAccessory(typedAccessory, this.#state, this.#instance, this.#service, this.#characteristic, this.#api, this.#log);
143
+ }
144
+ this.accessories.push(typedAccessory);
145
+ this.#api.registerPlatformAccessories('homebridge-adt-pulse', 'ADTPulse', [typedAccessory]);
146
+ }
147
+ updateAccessory(device) {
148
+ const { index, value } = findIndexWithValue(this.accessories, (accessory) => device.uuid === accessory.context.uuid);
149
+ if (index < 0 || value === undefined) {
150
+ this.#log.warn(`Attempted to update ${chalk.underline(device.name)} (id: ${device.id}, uuid: ${device.uuid}) accessory that does not exist.`);
151
+ return;
152
+ }
153
+ if (this.#instance === null) {
154
+ this.#log.error(`Attempted to updated ${chalk.underline(device.name)} (id: ${device.id}, uuid: ${device.uuid}) accessory but API instance is not available.`);
155
+ return;
156
+ }
157
+ this.#log.debug(`Updating ${chalk.underline(value.context.name)} (id: ${value.context.id}, uuid: ${value.context.uuid}) accessory ...`);
158
+ value.context = device;
159
+ value.displayName = device.name;
160
+ if (this.#handlers[device.id] === undefined) {
161
+ this.#handlers[device.id] = new ADTPulseAccessory(value, this.#state, this.#instance, this.#service, this.#characteristic, this.#api, this.#log);
162
+ }
163
+ this.accessories[index] = value;
164
+ this.#api.updatePlatformAccessories([value]);
165
+ }
166
+ removeAccessory(accessory, reason) {
167
+ this.#log.info(`Removing ${chalk.underline(accessory.context.name)} (id: ${accessory.context.id}, uuid: ${accessory.context.uuid}) accessory ...`);
168
+ this.#log.debug(`${chalk.underline(accessory.context.name)} (id: ${accessory.context.id}, uuid: ${accessory.context.uuid}) is removed because ${reason}.`);
169
+ this.accessories = this.accessories.filter((existingAccessory) => existingAccessory.context.uuid !== accessory.context.uuid);
170
+ this.#api.unregisterPlatformAccessories('homebridge-adt-pulse', 'ADTPulse', [accessory]);
171
+ }
172
+ printSystemInformation() {
173
+ const homebridgeVersion = chalk.yellowBright(`v${this.#api.serverVersion}`);
174
+ const nodeVersion = chalk.blueBright(`v${versions.node}`);
175
+ const opensslVersion = chalk.magentaBright(`v${versions.openssl}`);
176
+ const packageVersion = chalk.greenBright(`v${getPackageVersion()}`);
177
+ const platformPlusArch = chalk.redBright(`${platform} (${arch})`);
178
+ this.#log.info([
179
+ `running on ${platformPlusArch}`,
180
+ `homebridge-adt-pulse ${packageVersion}`,
181
+ `homebridge ${homebridgeVersion}`,
182
+ `node ${nodeVersion}`,
183
+ `openssl ${opensslVersion}`,
184
+ ].join(chalk.gray(' // ')));
185
+ }
186
+ synchronize() {
187
+ this.#state.intervals.synchronize = setInterval(async () => {
188
+ if (this.#state.activity.isSyncing) {
189
+ return;
190
+ }
191
+ if (this.#instance === null) {
192
+ this.#log.warn('synchronize() was called but API is not available.');
193
+ return;
194
+ }
195
+ try {
196
+ this.#state.activity.isSyncing = true;
197
+ if (!this.#instance.isAuthenticated()) {
198
+ if (!this.#state.activity.isLoggingIn) {
199
+ this.#state.activity.isLoggingIn = true;
200
+ const login = await this.#instance.login();
201
+ if (login.success) {
202
+ const currentTimestamp = Date.now();
203
+ this.#state.lastRunOn.adtKeepAlive = currentTimestamp;
204
+ this.#state.lastRunOn.adtSyncCheck = currentTimestamp;
205
+ }
206
+ if (!login.success) {
207
+ this.#state.eventCounters.failedLogins += 1;
208
+ const attemptsLeft = this.#constants.maxLoginRetries - this.#state.eventCounters.failedLogins;
209
+ if (attemptsLeft > 0) {
210
+ this.#log.error(`Login attempt has failed. Trying ${attemptsLeft} more ${getPluralForm(attemptsLeft, 'time', 'times')} ...`);
211
+ }
212
+ else {
213
+ const suspendMinutes = this.#constants.intervalTimestamps.suspendSyncing / 1000 / 60;
214
+ this.#log.error(`Login attempt has failed for ${this.#constants.maxLoginRetries} ${getPluralForm(this.#constants.maxLoginRetries, 'time', 'times')}. Sleeping for ${suspendMinutes} ${getPluralForm(suspendMinutes, 'minute', 'minutes')} before resuming ...`);
215
+ }
216
+ stackTracer('api-response', login);
217
+ }
218
+ this.#state.activity.isLoggingIn = false;
219
+ }
220
+ if (this.#state.eventCounters.failedLogins >= this.#constants.maxLoginRetries) {
221
+ await sleep(this.#constants.intervalTimestamps.suspendSyncing);
222
+ this.#state.eventCounters.failedLogins = 0;
223
+ return;
224
+ }
225
+ if (!this.#instance.isAuthenticated()) {
226
+ return;
227
+ }
228
+ }
229
+ const currentTimestamp = Date.now();
230
+ if (currentTimestamp - this.#state.lastRunOn.adtKeepAlive >= this.#constants.intervalTimestamps.adtKeepAlive) {
231
+ this.synchronizeKeepAlive();
232
+ }
233
+ if (currentTimestamp - this.#state.lastRunOn.adtSyncCheck >= this.#constants.intervalTimestamps.adtSyncCheck) {
234
+ this.synchronizeSyncCheck();
235
+ }
236
+ }
237
+ catch (error) {
238
+ this.#log.error('synchronize() has unexpectedly thrown an error, will continue to sync.');
239
+ stackTracer('serialize-error', serializeError(error));
240
+ }
241
+ finally {
242
+ this.#state.activity.isSyncing = false;
243
+ }
244
+ }, this.#constants.intervalTimestamps.synchronize);
245
+ }
246
+ synchronizeKeepAlive() {
247
+ (async () => {
248
+ if (this.#state.activity.isAdtKeepingAlive) {
249
+ return;
250
+ }
251
+ if (this.#instance === null) {
252
+ this.#log.warn('synchronizeKeepAlive() was called but API instance is not available.');
253
+ return;
254
+ }
255
+ try {
256
+ this.#state.activity.isAdtKeepingAlive = true;
257
+ const keepAlive = await this.#instance.performKeepAlive();
258
+ if (keepAlive.success) {
259
+ this.#log.debug('Keep alive request was successful. The login session should now be extended.');
260
+ }
261
+ if (!keepAlive.success) {
262
+ this.#log.error('Keeping alive attempt has failed. Trying again later.');
263
+ stackTracer('api-response', keepAlive);
264
+ }
265
+ this.#state.lastRunOn.adtKeepAlive = Date.now();
266
+ }
267
+ catch (error) {
268
+ this.#log.error('synchronizeKeepAlive() has unexpectedly thrown an error, will continue to keep alive.');
269
+ stackTracer('serialize-error', serializeError(error));
270
+ }
271
+ finally {
272
+ this.#state.activity.isAdtKeepingAlive = false;
273
+ }
274
+ })();
275
+ }
276
+ synchronizeSyncCheck() {
277
+ (async () => {
278
+ if (this.#state.activity.isAdtSyncChecking) {
279
+ return;
280
+ }
281
+ if (this.#instance === null) {
282
+ this.#log.warn('synchronizeSyncCheck() was called but API instance is not available.');
283
+ return;
284
+ }
285
+ try {
286
+ this.#state.activity.isAdtSyncChecking = true;
287
+ const syncCheck = await this.#instance.performSyncCheck();
288
+ if (syncCheck.success) {
289
+ this.#log.debug('Sync check request was successful. Determining if panel and sensor data is outdated ...');
290
+ if (syncCheck.info.syncCode !== this.#state.data.syncCode) {
291
+ this.#log.debug(`Panel and sensor data is outdated (cached: ${this.#state.data.syncCode}, fetched: ${syncCheck.info.syncCode}). Preparing to retrieve the latest panel and sensor data ...`);
292
+ this.#state.data.syncCode = syncCheck.info.syncCode;
293
+ await this.fetchUpdatedInformation();
294
+ }
295
+ else {
296
+ this.#log.debug(`Panel and sensor data is up to date (cached: ${this.#state.data.syncCode}, fetched: ${syncCheck.info.syncCode}).`);
297
+ }
298
+ }
299
+ if (!syncCheck.success) {
300
+ const { error } = syncCheck.info;
301
+ const { message } = error ?? {};
302
+ if (message !== undefined) {
303
+ switch (true) {
304
+ case message.includes('ECONNABORTED'):
305
+ this.#log.debug('Sync checking attempt has failed because the connection timed out. Trying again later.');
306
+ break;
307
+ case message.includes('ECONNRESET'):
308
+ this.#log.debug('Sync checking attempt has failed because the connection was reset. Trying again later.');
309
+ break;
310
+ default:
311
+ break;
312
+ }
313
+ }
314
+ else {
315
+ this.#log.error('Sync checking attempt has failed. Trying again later.');
316
+ stackTracer('api-response', syncCheck);
317
+ }
318
+ }
319
+ this.#state.lastRunOn.adtSyncCheck = Date.now();
320
+ }
321
+ catch (error) {
322
+ this.#log.error('synchronizeSyncCheck() has unexpectedly thrown an error, will continue to sync check.');
323
+ stackTracer('serialize-error', serializeError(error));
324
+ }
325
+ finally {
326
+ this.#state.activity.isAdtSyncChecking = false;
327
+ }
328
+ })();
329
+ }
330
+ async fetchUpdatedInformation() {
331
+ if (this.#instance === null) {
332
+ this.#log.warn('fetchUpdatedInformation() was called but API instance is not available.');
333
+ return;
334
+ }
335
+ try {
336
+ const requests = await Promise.all([
337
+ this.#instance.getGatewayInformation(),
338
+ this.#instance.getPanelInformation(),
339
+ this.#instance.getPanelStatus(),
340
+ this.#instance.getSensorsInformation(),
341
+ this.#instance.getSensorsStatus(),
342
+ ]);
343
+ if (requests[0].success) {
344
+ const { info } = requests[0];
345
+ this.#state.data.gatewayInfo = info;
346
+ }
347
+ if (requests[1].success) {
348
+ const { info } = requests[1];
349
+ this.#state.data.panelInfo = info;
350
+ }
351
+ if (requests[2].success) {
352
+ const { info } = requests[2];
353
+ this.#state.data.panelStatus = info;
354
+ }
355
+ if (requests[3].success) {
356
+ const { sensors } = requests[3].info;
357
+ this.#state.data.sensorsInfo = sensors;
358
+ }
359
+ if (requests[4].success) {
360
+ const { sensors } = requests[4].info;
361
+ this.#state.data.sensorsStatus = sensors;
362
+ }
363
+ await this.unknownInformationDispatcher();
364
+ await this.unifyDevices();
365
+ }
366
+ catch (error) {
367
+ this.#log.error('fetchUpdatedInformation() has unexpectedly thrown an error, will continue to fetch.');
368
+ stackTracer('serialize-error', serializeError(error));
369
+ }
370
+ }
371
+ async unknownInformationDispatcher() {
372
+ const { sensorsInfo, sensorsStatus } = this.#state.data;
373
+ const sensors = sensorsInfo.map((sensorInfo, sensorsInfoKey) => {
374
+ const sensorInfoZone = sensorInfo.zone;
375
+ const sensorStatusZone = sensorsStatus[sensorsInfoKey].zone;
376
+ const sensor = {
377
+ info: sensorInfo,
378
+ status: sensorsStatus[sensorsInfoKey],
379
+ type: condenseSensorType(sensorInfo.deviceType),
380
+ };
381
+ if (sensorInfoZone === sensorStatusZone) {
382
+ return sensor;
383
+ }
384
+ this.#log.error(`Sensor mismatch detected for zones ${sensorInfoZone} and ${sensorStatusZone}. This should not be happening.`);
385
+ stackTracer('sensor-mismatch', sensor);
386
+ return null;
387
+ });
388
+ const dataHash = generateHash(JSON.stringify(sensors));
389
+ const matchedSensors = sensors.filter((sensor) => sensor !== null);
390
+ if (this.#state.reportedHashes.find((reportedHash) => dataHash === reportedHash) === undefined) {
391
+ const detectedNew = await detectedUnknownSensorsAction(matchedSensors, this.#log, this.#debugMode);
392
+ if (detectedNew) {
393
+ this.#state.reportedHashes.push(dataHash);
394
+ }
395
+ }
396
+ }
397
+ async unifyDevices() {
398
+ const { gatewayInfo, panelInfo, sensorsInfo } = this.#state.data;
399
+ const devices = [];
400
+ if (gatewayInfo !== null) {
401
+ const id = 'adt-device-0';
402
+ devices.push({
403
+ id,
404
+ name: 'ADT Pulse Gateway',
405
+ originalName: 'ADT Pulse Gateway',
406
+ type: 'gateway',
407
+ zone: null,
408
+ category: 'OTHER',
409
+ manufacturer: gatewayInfo.manufacturer,
410
+ model: gatewayInfo.model,
411
+ serial: gatewayInfo.serialNumber,
412
+ firmware: gatewayInfo.versions.firmware,
413
+ hardware: gatewayInfo.versions.hardware,
414
+ software: getPackageVersion(),
415
+ uuid: this.#api.hap.uuid.generate(id),
416
+ });
417
+ }
418
+ if (panelInfo !== null) {
419
+ const id = 'adt-device-1';
420
+ devices.push({
421
+ id,
422
+ name: 'Security Panel',
423
+ originalName: 'Security Panel',
424
+ type: 'panel',
425
+ zone: null,
426
+ category: 'SECURITY_SYSTEM',
427
+ manufacturer: panelInfo.manufacturer,
428
+ model: panelInfo.model,
429
+ serial: 'N/A',
430
+ firmware: null,
431
+ hardware: null,
432
+ software: getPackageVersion(),
433
+ uuid: this.#api.hap.uuid.generate(id),
434
+ });
435
+ }
436
+ if (this.#config !== null && sensorsInfo !== null) {
437
+ for (let i = 0; i < this.#config.sensors.length; i += 1) {
438
+ const { adtName, adtType, adtZone, name, } = this.#config.sensors[i];
439
+ const sensor = sensorsInfo.find((sensorInfo) => {
440
+ const sensorInfoName = sensorInfo.name;
441
+ const sensorInfoType = condenseSensorType(sensorInfo.deviceType);
442
+ const sensorInfoZone = sensorInfo.zone;
443
+ return (adtName === sensorInfoName
444
+ && adtType === sensorInfoType
445
+ && adtZone === sensorInfoZone);
446
+ });
447
+ if (sensor === undefined) {
448
+ this.#log.warn(`Attempted to add or update ${chalk.underline(name)} (adtName: ${adtName}, adtType: ${adtType}, adtZone: ${adtZone}) accessory that does not exist on the portal.`);
449
+ continue;
450
+ }
451
+ const id = `adt-device-${sensor.deviceId}`;
452
+ devices.push({
453
+ id,
454
+ name: name ?? adtName,
455
+ originalName: adtName,
456
+ type: adtType,
457
+ zone: adtZone,
458
+ category: 'SENSOR',
459
+ manufacturer: 'ADT',
460
+ model: sensor.deviceType,
461
+ serial: null,
462
+ firmware: null,
463
+ hardware: null,
464
+ software: getPackageVersion(),
465
+ uuid: this.#api.hap.uuid.generate(id),
466
+ });
467
+ }
468
+ }
469
+ if (this.#config !== null) {
470
+ const { sensors } = this.#config;
471
+ for (let i = this.accessories.length - 1; i >= 0; i -= 1) {
472
+ const { originalName, type, zone } = this.accessories[i].context;
473
+ if (type === 'gateway' || type === 'panel') {
474
+ continue;
475
+ }
476
+ if (!sensors.some((sensor) => originalName === sensor.adtName && zone !== null && zone === sensor.adtZone)) {
477
+ this.removeAccessory(this.accessories[i], 'accessory is missing in config');
478
+ }
479
+ }
480
+ }
481
+ await this.pollAccessories(devices);
482
+ }
483
+ async pollAccessories(devices) {
484
+ for (let i = 0; i < devices.length; i += 1) {
485
+ const accessoryIndex = this.accessories.findIndex((accessory) => devices[i].uuid === accessory.context.uuid);
486
+ if (accessoryIndex >= 0) {
487
+ this.updateAccessory(devices[i]);
488
+ }
489
+ else {
490
+ this.addAccessory(devices[i]);
491
+ }
492
+ }
493
+ }
494
+ }
495
+ //# sourceMappingURL=platform.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"platform.js","sourceRoot":"","sources":["../../../src/lib/platform.ts"],"names":[],"mappings":"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"}