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,421 @@
1
+ import chalk from 'chalk';
2
+ import { condensedSensorTypeItems } from './items.js';
3
+ import { condensePanelStates, stackTracer } from './utility.js';
4
+ export class ADTPulseAccessory {
5
+ #accessory;
6
+ #api;
7
+ #characteristic;
8
+ #instance;
9
+ #log;
10
+ #services;
11
+ #state;
12
+ constructor(accessory, state, instance, service, characteristic, api, log) {
13
+ this.#accessory = accessory;
14
+ this.#api = api;
15
+ this.#characteristic = characteristic;
16
+ this.#instance = instance;
17
+ this.#log = log;
18
+ this.#services = {};
19
+ this.#state = state;
20
+ const { context } = this.#accessory;
21
+ const { firmware, hardware, id, manufacturer, model, name, serial, software, type, uuid, } = context;
22
+ this.#services.Information = this.#accessory.getService(service.AccessoryInformation) ?? this.#accessory.addService(service.AccessoryInformation);
23
+ this.#services.Information
24
+ .setCharacteristic(this.#characteristic.Identify, false)
25
+ .setCharacteristic(this.#characteristic.Manufacturer, manufacturer ?? 'ADT')
26
+ .setCharacteristic(this.#characteristic.Model, model ?? 'N/A')
27
+ .setCharacteristic(this.#characteristic.Name, name)
28
+ .setCharacteristic(this.#characteristic.SerialNumber, serial ?? 'N/A')
29
+ .setCharacteristic(this.#characteristic.FirmwareRevision, firmware ?? 'N/A')
30
+ .setCharacteristic(this.#characteristic.HardwareRevision, hardware ?? 'N/A')
31
+ .setCharacteristic(this.#characteristic.SoftwareRevision, software ?? 'N/A');
32
+ switch (type) {
33
+ case 'gateway':
34
+ break;
35
+ case 'panel':
36
+ this.#services.Primary = this.#accessory.getService(service.SecuritySystem) ?? this.#accessory.addService(service.SecuritySystem);
37
+ break;
38
+ default:
39
+ break;
40
+ }
41
+ switch (type) {
42
+ case 'co':
43
+ this.#services.Primary = this.#accessory.getService(service.CarbonMonoxideSensor) ?? this.#accessory.addService(service.CarbonMonoxideSensor);
44
+ break;
45
+ case 'doorWindow':
46
+ this.#services.Primary = this.#accessory.getService(service.ContactSensor) ?? this.#accessory.addService(service.ContactSensor);
47
+ break;
48
+ case 'fire':
49
+ this.#services.Primary = this.#accessory.getService(service.SmokeSensor) ?? this.#accessory.addService(service.SmokeSensor);
50
+ break;
51
+ case 'flood':
52
+ this.#services.Primary = this.#accessory.getService(service.LeakSensor) ?? this.#accessory.addService(service.LeakSensor);
53
+ break;
54
+ case 'glass':
55
+ this.#services.Primary = this.#accessory.getService(service.OccupancySensor) ?? this.#accessory.addService(service.OccupancySensor);
56
+ break;
57
+ case 'heat':
58
+ this.#services.Primary = this.#accessory.getService(service.OccupancySensor) ?? this.#accessory.addService(service.OccupancySensor);
59
+ break;
60
+ case 'keypad':
61
+ this.#services.Primary = this.#accessory.getService(service.OccupancySensor) ?? this.#accessory.addService(service.OccupancySensor);
62
+ break;
63
+ case 'motion':
64
+ this.#services.Primary = this.#accessory.getService(service.MotionSensor) ?? this.#accessory.addService(service.MotionSensor);
65
+ break;
66
+ case 'panic':
67
+ this.#services.Primary = this.#accessory.getService(service.OccupancySensor) ?? this.#accessory.addService(service.OccupancySensor);
68
+ break;
69
+ case 'shock':
70
+ this.#services.Primary = this.#accessory.getService(service.OccupancySensor) ?? this.#accessory.addService(service.OccupancySensor);
71
+ break;
72
+ case 'supervisory':
73
+ this.#services.Primary = this.#accessory.getService(service.OccupancySensor) ?? this.#accessory.addService(service.OccupancySensor);
74
+ break;
75
+ case 'temperature':
76
+ this.#services.Primary = this.#accessory.getService(service.TemperatureSensor) ?? this.#accessory.addService(service.TemperatureSensor);
77
+ break;
78
+ case 'unknown':
79
+ this.#services.Primary = this.#accessory.getService(service.OccupancySensor) ?? this.#accessory.addService(service.OccupancySensor);
80
+ break;
81
+ default:
82
+ break;
83
+ }
84
+ if (this.#services.Primary === undefined) {
85
+ if (type !== 'gateway') {
86
+ this.#log.error(`Failed to initialize ${chalk.underline(name)} (id: ${id}, uuid: ${uuid}) accessory services ...`);
87
+ }
88
+ return;
89
+ }
90
+ switch (type) {
91
+ case 'gateway':
92
+ break;
93
+ case 'panel':
94
+ this.#services.Primary.getCharacteristic(this.#characteristic.SecuritySystemCurrentState)
95
+ .updateValue(this.getPanelStatus('current', context));
96
+ this.#services.Primary.getCharacteristic(this.#characteristic.SecuritySystemTargetState)
97
+ .updateValue(this.getPanelStatus('target', context))
98
+ .onSet((value) => this.setPanelStatus(value, context));
99
+ break;
100
+ default:
101
+ break;
102
+ }
103
+ switch (type) {
104
+ case 'co':
105
+ this.#services.Primary.getCharacteristic(this.#characteristic.CarbonMonoxideDetected)
106
+ .updateValue(this.getSensorStatus('status', context));
107
+ break;
108
+ case 'doorWindow':
109
+ this.#services.Primary.getCharacteristic(this.#characteristic.ContactSensorState)
110
+ .updateValue(this.getSensorStatus('status', context));
111
+ break;
112
+ case 'fire':
113
+ this.#services.Primary.getCharacteristic(this.#characteristic.SmokeDetected)
114
+ .updateValue(this.getSensorStatus('status', context));
115
+ break;
116
+ case 'flood':
117
+ this.#services.Primary.getCharacteristic(this.#characteristic.LeakDetected)
118
+ .updateValue(this.getSensorStatus('status', context));
119
+ break;
120
+ case 'glass':
121
+ this.#services.Primary.getCharacteristic(this.#characteristic.OccupancyDetected)
122
+ .updateValue(this.getSensorStatus('status', context));
123
+ break;
124
+ case 'heat':
125
+ this.#services.Primary.getCharacteristic(this.#characteristic.OccupancyDetected)
126
+ .updateValue(this.getSensorStatus('status', context));
127
+ break;
128
+ case 'keypad':
129
+ this.#services.Primary.getCharacteristic(this.#characteristic.OccupancyDetected)
130
+ .updateValue(this.getSensorStatus('status', context));
131
+ break;
132
+ case 'motion':
133
+ this.#services.Primary.getCharacteristic(this.#characteristic.MotionDetected)
134
+ .updateValue(this.getSensorStatus('status', context));
135
+ break;
136
+ case 'panic':
137
+ this.#services.Primary.getCharacteristic(this.#characteristic.OccupancyDetected)
138
+ .updateValue(this.getSensorStatus('status', context));
139
+ break;
140
+ case 'shock':
141
+ this.#services.Primary.getCharacteristic(this.#characteristic.OccupancyDetected)
142
+ .updateValue(this.getSensorStatus('status', context));
143
+ break;
144
+ case 'supervisory':
145
+ this.#services.Primary.getCharacteristic(this.#characteristic.OccupancyDetected)
146
+ .updateValue(this.getSensorStatus('status', context));
147
+ break;
148
+ case 'temperature':
149
+ this.#services.Primary.getCharacteristic(this.#characteristic.CurrentTemperature)
150
+ .updateValue(this.getSensorStatus('status', context));
151
+ break;
152
+ case 'unknown':
153
+ this.#services.Primary.getCharacteristic(this.#characteristic.OccupancyDetected)
154
+ .updateValue(this.getSensorStatus('status', context));
155
+ break;
156
+ default:
157
+ break;
158
+ }
159
+ switch (type) {
160
+ case 'gateway':
161
+ break;
162
+ case 'panel':
163
+ this.#services.Primary.getCharacteristic(this.#characteristic.SecuritySystemAlarmType)
164
+ .updateValue(this.getPanelStatus('alarmType', context));
165
+ this.#services.Primary.getCharacteristic(this.#characteristic.StatusFault)
166
+ .updateValue(this.getPanelStatus('fault', context));
167
+ this.#services.Primary.getCharacteristic(this.#characteristic.StatusTampered)
168
+ .updateValue(this.getPanelStatus('tamper', context));
169
+ break;
170
+ default:
171
+ break;
172
+ }
173
+ switch (type) {
174
+ case 'co':
175
+ case 'doorWindow':
176
+ case 'fire':
177
+ case 'flood':
178
+ case 'glass':
179
+ case 'heat':
180
+ case 'keypad':
181
+ case 'motion':
182
+ case 'panic':
183
+ case 'shock':
184
+ case 'supervisory':
185
+ case 'temperature':
186
+ case 'unknown':
187
+ this.#services.Primary.getCharacteristic(this.#characteristic.StatusActive)
188
+ .updateValue(this.getSensorStatus('active', context));
189
+ this.#services.Primary.getCharacteristic(this.#characteristic.StatusFault)
190
+ .updateValue(this.getSensorStatus('fault', context));
191
+ this.#services.Primary.getCharacteristic(this.#characteristic.StatusLowBattery)
192
+ .updateValue(this.getSensorStatus('lowBattery', context));
193
+ this.#services.Primary.getCharacteristic(this.#characteristic.StatusTampered)
194
+ .updateValue(this.getSensorStatus('tamper', context));
195
+ break;
196
+ default:
197
+ break;
198
+ }
199
+ }
200
+ getSensorStatus(mode, context) {
201
+ const { id, name, originalName, type, uuid, zone, } = context;
202
+ const matchedSensorStatus = this.#state.data.sensorsStatus.find((sensorStatus) => originalName === sensorStatus.name && zone !== null && sensorStatus.zone === zone);
203
+ if (matchedSensorStatus === undefined
204
+ || type === 'gateway'
205
+ || type === 'panel'
206
+ || !condensedSensorTypeItems.includes(type)) {
207
+ this.#log.error(`Attempted to get sensor status on ${chalk.underline(name)} (id: ${id}, uuid: ${uuid}) accessory but sensor is not found or sensor type is not supported.`);
208
+ return new this.#api.hap.HapStatusError(-70409);
209
+ }
210
+ const { icon, statuses } = matchedSensorStatus;
211
+ if (mode === 'active') {
212
+ return !statuses.includes('Offline')
213
+ && !statuses.includes('Unknown')
214
+ && icon !== 'devStatOffline'
215
+ && icon !== 'devStatUnknown';
216
+ }
217
+ if (mode === 'fault') {
218
+ if (statuses.includes('Bypassed')
219
+ || statuses.includes('Trouble')) {
220
+ return this.#characteristic.StatusFault.GENERAL_FAULT;
221
+ }
222
+ return this.#characteristic.StatusFault.NO_FAULT;
223
+ }
224
+ if (mode === 'lowBattery') {
225
+ if (statuses.includes('Low Battery')
226
+ || icon === 'devStatLowBatt') {
227
+ return this.#characteristic.StatusLowBattery.BATTERY_LEVEL_LOW;
228
+ }
229
+ return this.#characteristic.StatusLowBattery.BATTERY_LEVEL_NORMAL;
230
+ }
231
+ if (mode === 'tamper') {
232
+ if (icon === 'devStatTamper') {
233
+ return this.#characteristic.StatusTampered.TAMPERED;
234
+ }
235
+ return this.#characteristic.StatusTampered.NOT_TAMPERED;
236
+ }
237
+ switch (type) {
238
+ case 'co':
239
+ if (statuses.includes('Tripped')) {
240
+ return this.#characteristic.CarbonMonoxideDetected.CO_LEVELS_ABNORMAL;
241
+ }
242
+ if (statuses.includes('Okay')) {
243
+ return this.#characteristic.CarbonMonoxideDetected.CO_LEVELS_NORMAL;
244
+ }
245
+ break;
246
+ case 'doorWindow':
247
+ if (statuses.includes('Open')) {
248
+ return this.#characteristic.ContactSensorState.CONTACT_NOT_DETECTED;
249
+ }
250
+ if (statuses.includes('Closed')) {
251
+ return this.#characteristic.ContactSensorState.CONTACT_DETECTED;
252
+ }
253
+ break;
254
+ case 'fire':
255
+ if (statuses.includes('Okay')) {
256
+ return this.#characteristic.SmokeDetected.SMOKE_NOT_DETECTED;
257
+ }
258
+ break;
259
+ case 'flood':
260
+ if (statuses.includes('Okay')) {
261
+ return this.#characteristic.LeakDetected.LEAK_NOT_DETECTED;
262
+ }
263
+ break;
264
+ case 'glass':
265
+ if (statuses.includes('Tripped')) {
266
+ return true;
267
+ }
268
+ if (statuses.includes('Okay')) {
269
+ return false;
270
+ }
271
+ break;
272
+ case 'heat':
273
+ break;
274
+ case 'keypad':
275
+ break;
276
+ case 'motion':
277
+ if (statuses.includes('No Motion') || statuses.includes('Okay')) {
278
+ return false;
279
+ }
280
+ if (statuses.includes('Motion')) {
281
+ return true;
282
+ }
283
+ break;
284
+ case 'panic':
285
+ break;
286
+ case 'shock':
287
+ break;
288
+ case 'supervisory':
289
+ break;
290
+ case 'temperature':
291
+ break;
292
+ case 'unknown':
293
+ break;
294
+ default:
295
+ break;
296
+ }
297
+ if (statuses.includes('Offline') || statuses.includes('Unknown')) {
298
+ this.#log.warn(`Attempted to get sensor status on ${chalk.underline(name)} (id: ${id}, uuid: ${uuid}) accessory but sensor is currently "Offline" or "Unknown".`);
299
+ return new this.#api.hap.HapStatusError(-70412);
300
+ }
301
+ this.#log.warn(`Attempted to get sensor status on ${chalk.underline(name)} (id: ${id}, uuid: ${uuid}) accessory but actions have not been implemented yet.`);
302
+ return new this.#api.hap.HapStatusError(-70410);
303
+ }
304
+ getPanelStatus(mode, context) {
305
+ const { id, name, type, uuid, } = context;
306
+ if (type !== 'panel') {
307
+ this.#log.error(`Attempted to get panel status on ${chalk.underline(name)} (id: ${id}, uuid: ${uuid}) accessory but device is not a security panel.`);
308
+ return new this.#api.hap.HapStatusError(-70410);
309
+ }
310
+ if (this.#state.data.panelStatus === null
311
+ || this.#state.data.panelStatus.panelStates.length === 0
312
+ || this.#state.data.panelStatus.panelStatuses.length === 0) {
313
+ this.#log.debug(`Attempted to get panel status on ${chalk.underline(name)} (id: ${id}, uuid: ${uuid}) accessory but panel status has not been retrieved yet.`);
314
+ return new this.#api.hap.HapStatusError(-70403);
315
+ }
316
+ const { panelStates, panelStatuses } = this.#state.data.panelStatus;
317
+ if (mode === 'alarmType') {
318
+ if (panelStatuses.includes('BURGLARY ALARM')
319
+ || panelStatuses.includes('Carbon Monoxide Alarm')
320
+ || panelStatuses.includes('FIRE ALARM')
321
+ || panelStatuses.includes('Uncleared Alarm')
322
+ || panelStatuses.includes('WATER ALARM')) {
323
+ return 1;
324
+ }
325
+ return 0;
326
+ }
327
+ if (mode === 'fault') {
328
+ if (!panelStatuses.includes('All Quiet')) {
329
+ return this.#characteristic.StatusFault.GENERAL_FAULT;
330
+ }
331
+ return this.#characteristic.StatusFault.NO_FAULT;
332
+ }
333
+ if (mode === 'tamper') {
334
+ return this.#characteristic.StatusTampered.NOT_TAMPERED;
335
+ }
336
+ switch (true) {
337
+ case mode === 'current' && panelStatuses.includes('BURGLARY ALARM'):
338
+ case mode === 'current' && panelStatuses.includes('Carbon Monoxide Alarm'):
339
+ case mode === 'current' && panelStatuses.includes('FIRE ALARM'):
340
+ case mode === 'current' && panelStatuses.includes('Uncleared Alarm'):
341
+ case mode === 'current' && panelStatuses.includes('WATER ALARM'):
342
+ return this.#characteristic.SecuritySystemCurrentState.ALARM_TRIGGERED;
343
+ case mode === 'current' && panelStates.includes('Armed Away'):
344
+ return this.#characteristic.SecuritySystemCurrentState.AWAY_ARM;
345
+ case mode === 'current' && panelStates.includes('Armed Stay'):
346
+ return this.#characteristic.SecuritySystemCurrentState.STAY_ARM;
347
+ case mode === 'current' && panelStates.includes('Armed Night'):
348
+ return this.#characteristic.SecuritySystemCurrentState.NIGHT_ARM;
349
+ case mode === 'current' && panelStates.includes('Disarmed'):
350
+ return this.#characteristic.SecuritySystemCurrentState.DISARMED;
351
+ default:
352
+ break;
353
+ }
354
+ switch (true) {
355
+ case mode === 'target' && panelStates.includes('Armed Away'):
356
+ return this.#characteristic.SecuritySystemTargetState.AWAY_ARM;
357
+ case mode === 'target' && panelStates.includes('Armed Stay'):
358
+ return this.#characteristic.SecuritySystemTargetState.STAY_ARM;
359
+ case mode === 'target' && panelStates.includes('Armed Night'):
360
+ return this.#characteristic.SecuritySystemTargetState.NIGHT_ARM;
361
+ case mode === 'target' && panelStates.includes('Disarmed'):
362
+ return this.#characteristic.SecuritySystemTargetState.DISARM;
363
+ default:
364
+ break;
365
+ }
366
+ if (panelStates.includes('Status Unavailable')) {
367
+ this.#log.warn(`Attempted to get panel status on ${chalk.underline(name)} (id: ${id}, uuid: ${uuid}) accessory but panel state is "Status Unavailable".`);
368
+ return new this.#api.hap.HapStatusError(-70403);
369
+ }
370
+ this.#log.warn(`Attempted to get panel status on ${chalk.underline(name)} (id: ${id}, uuid: ${uuid}) accessory but actions have not been implemented yet.`);
371
+ return new this.#api.hap.HapStatusError(-70402);
372
+ }
373
+ async setPanelStatus(arm, context) {
374
+ const { id, name, type, uuid, } = context;
375
+ let result = {
376
+ success: false,
377
+ };
378
+ let unknownArmValue = false;
379
+ if (type !== 'panel') {
380
+ this.#log.error(`Attempted to set panel status on ${chalk.underline(name)} (id: ${id}, uuid: ${uuid}) accessory but device is not a security panel.`);
381
+ throw new this.#api.hap.HapStatusError(-70410);
382
+ }
383
+ if (this.#state.data.panelStatus === null || this.#state.data.panelStatus.panelStates.length === 0) {
384
+ this.#log.warn(`Attempted to set panel status on ${chalk.underline(name)} (id: ${id}, uuid: ${uuid}) accessory but panel status has not been retrieved yet.`);
385
+ throw new this.#api.hap.HapStatusError(-70403);
386
+ }
387
+ const { panelStates } = this.#state.data.panelStatus;
388
+ const armFrom = condensePanelStates(panelStates);
389
+ if (armFrom === undefined) {
390
+ this.#log.warn(`Attempted to set panel status on ${chalk.underline(name)} (id: ${id}, uuid: ${uuid}) accessory but panel status cannot be found or most likely "Status Unavailable".`);
391
+ throw new this.#api.hap.HapStatusError(-70403);
392
+ }
393
+ switch (arm) {
394
+ case this.#characteristic.SecuritySystemTargetState.STAY_ARM:
395
+ result = await this.#instance.setPanelStatus(armFrom, 'stay');
396
+ break;
397
+ case this.#characteristic.SecuritySystemTargetState.AWAY_ARM:
398
+ result = await this.#instance.setPanelStatus(armFrom, 'away');
399
+ break;
400
+ case this.#characteristic.SecuritySystemTargetState.NIGHT_ARM:
401
+ result = await this.#instance.setPanelStatus(armFrom, 'night');
402
+ break;
403
+ case this.#characteristic.SecuritySystemTargetState.DISARM:
404
+ result = await this.#instance.setPanelStatus(armFrom, 'off');
405
+ break;
406
+ default:
407
+ unknownArmValue = true;
408
+ break;
409
+ }
410
+ if (unknownArmValue) {
411
+ this.#log.error(`Attempted to set panel status on ${chalk.underline(name)} (id: ${id}, uuid: ${uuid}) accessory but request has unknown arm value.`);
412
+ throw new this.#api.hap.HapStatusError(-70410);
413
+ }
414
+ if (!result.success) {
415
+ this.#log.error(`Attempted to set panel status on ${chalk.underline(name)} (id: ${id}, uuid: ${uuid}) accessory but request was not successful.`);
416
+ stackTracer('api-response', result);
417
+ throw new this.#api.hap.HapStatusError(-70408);
418
+ }
419
+ }
420
+ }
421
+ //# sourceMappingURL=accessory.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"accessory.js","sourceRoot":"","sources":["../../../src/lib/accessory.ts"],"names":[],"mappings":"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"}