homebridge-ttlock-accesscode 1.0.1 → 2.0.0-beta.0

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 (53) hide show
  1. package/README.md +5 -5
  2. package/config.schema.json +31 -4
  3. package/dist/api/ttlockApi.d.ts +9 -8
  4. package/dist/api/ttlockApi.js +128 -67
  5. package/dist/api/ttlockApi.js.map +1 -1
  6. package/dist/api/usageTracker.d.ts +37 -0
  7. package/dist/api/usageTracker.js +276 -0
  8. package/dist/api/usageTracker.js.map +1 -0
  9. package/dist/config.d.ts +6 -0
  10. package/dist/config.js +23 -11
  11. package/dist/config.js.map +1 -1
  12. package/dist/devices/accessoryInformation.d.ts +3 -0
  13. package/dist/devices/accessoryInformation.js +28 -0
  14. package/dist/devices/accessoryInformation.js.map +1 -0
  15. package/dist/devices/baseDevice.d.ts +58 -0
  16. package/dist/devices/baseDevice.js +376 -0
  17. package/dist/devices/baseDevice.js.map +1 -0
  18. package/dist/devices/create.d.ts +4 -0
  19. package/dist/devices/create.js +27 -0
  20. package/dist/devices/create.js.map +1 -0
  21. package/dist/devices/descriptorHelpers.d.ts +5 -0
  22. package/dist/devices/descriptorHelpers.js +82 -0
  23. package/dist/devices/descriptorHelpers.js.map +1 -0
  24. package/dist/devices/deviceManager.d.ts +19 -0
  25. package/dist/devices/deviceManager.js +74 -0
  26. package/dist/devices/deviceManager.js.map +1 -0
  27. package/dist/devices/deviceTypes.d.ts +44 -0
  28. package/dist/devices/deviceTypes.js +2 -0
  29. package/dist/devices/deviceTypes.js.map +1 -0
  30. package/dist/devices/homekitLock.d.ts +18 -0
  31. package/dist/devices/homekitLock.js +191 -0
  32. package/dist/devices/homekitLock.js.map +1 -0
  33. package/dist/index.js +1 -1
  34. package/dist/index.js.map +1 -1
  35. package/dist/platform.d.ts +45 -19
  36. package/dist/platform.js +397 -234
  37. package/dist/platform.js.map +1 -1
  38. package/dist/taskQueue.d.ts +12 -0
  39. package/dist/taskQueue.js +50 -0
  40. package/dist/taskQueue.js.map +1 -0
  41. package/dist/utils.d.ts +10 -2
  42. package/dist/utils.js +50 -5
  43. package/dist/utils.js.map +1 -1
  44. package/package.json +32 -21
  45. package/dist/homekitDevice.d.ts +0 -44
  46. package/dist/homekitDevice.js +0 -502
  47. package/dist/homekitDevice.js.map +0 -1
  48. package/dist/platformAccessoryInformation.d.ts +0 -3
  49. package/dist/platformAccessoryInformation.js +0 -35
  50. package/dist/platformAccessoryInformation.js.map +0 -1
  51. package/dist/types/index.d.ts +0 -39
  52. package/dist/types/index.js +0 -2
  53. package/dist/types/index.js.map +0 -1
@@ -0,0 +1,276 @@
1
+ import fs from 'node:fs/promises';
2
+ import path from 'node:path';
3
+ import { Mutex } from 'async-mutex';
4
+ import { EventEmitter } from 'node:events';
5
+ export class UsageTracker extends EventEmitter {
6
+ totalAllowed;
7
+ storageFilePath;
8
+ state = null;
9
+ log;
10
+ api;
11
+ mutex = new Mutex();
12
+ rolloverInterval;
13
+ currentTier = 0;
14
+ pendingReserved = 0;
15
+ constructor(api, log, totalAllowed) {
16
+ super();
17
+ this.totalAllowed = totalAllowed;
18
+ this.api = api;
19
+ this.log = log;
20
+ }
21
+ async init() {
22
+ const base = this.api.user.storagePath();
23
+ const dir = path.join(base, 'ttlock-accesscode');
24
+ await fs.mkdir(dir, { recursive: true });
25
+ this.storageFilePath = path.join(dir, 'ttlock-accesscode-usage.json');
26
+ await this.loadOrInit();
27
+ this.scheduleRolloverCheck();
28
+ }
29
+ async loadOrInit() {
30
+ try {
31
+ const data = await fs.readFile(this.storageFilePath, 'utf8');
32
+ const parsed = JSON.parse(data);
33
+ const now = new Date();
34
+ if (parsed.year !== now.getFullYear() || parsed.month !== now.getMonth() + 1) {
35
+ this.log.debug('Usage file month mismatch, resetting usage for new month');
36
+ this.state = {
37
+ year: now.getFullYear(),
38
+ month: now.getMonth() + 1,
39
+ totalAllowed: this.totalAllowed,
40
+ used: 0,
41
+ lastUpdatedISO: now.toISOString(),
42
+ };
43
+ await this.persist();
44
+ }
45
+ else {
46
+ if (parsed.totalAllowed !== this.totalAllowed) {
47
+ this.log.debug('Updating stored totalAllowed to current config value');
48
+ parsed.totalAllowed = this.totalAllowed;
49
+ }
50
+ parsed.lastUpdatedISO = new Date().toISOString();
51
+ this.state = parsed;
52
+ await this.persist();
53
+ }
54
+ }
55
+ catch (err) {
56
+ this.log.warn('Failed to load usage data, initializing new state', err);
57
+ const now = new Date();
58
+ this.state = {
59
+ year: now.getFullYear(),
60
+ month: now.getMonth() + 1,
61
+ totalAllowed: this.totalAllowed,
62
+ used: 0,
63
+ lastUpdatedISO: now.toISOString(),
64
+ };
65
+ await this.persist();
66
+ }
67
+ }
68
+ async persist() {
69
+ if (!this.storageFilePath || !this.state) {
70
+ return;
71
+ }
72
+ const tempPath = `${this.storageFilePath}.tmp`;
73
+ try {
74
+ await fs.writeFile(tempPath, JSON.stringify(this.state), 'utf8');
75
+ await fs.rename(tempPath, this.storageFilePath);
76
+ }
77
+ catch (err) {
78
+ this.log.error('Failed to persist usage data', err);
79
+ }
80
+ }
81
+ getUsage() {
82
+ if (!this.state) {
83
+ throw new Error('UsageTracker not initialized');
84
+ }
85
+ const remaining = Math.max(0, this.state.totalAllowed - this.state.used);
86
+ const now = new Date();
87
+ const daysInMonth = new Date(this.state.year, this.state.month, 0).getDate();
88
+ const currentDay = now.getDate();
89
+ const daysRemaining = Math.max(1, daysInMonth - (currentDay - 1));
90
+ const remainingDailyAllowance = daysRemaining > 0 ? Math.floor(remaining / daysRemaining) : 0;
91
+ return {
92
+ used: this.state.used,
93
+ totalAllowed: this.state.totalAllowed,
94
+ daysInMonth,
95
+ remaining,
96
+ daysRemaining,
97
+ remainingDailyAllowance,
98
+ lastUpdatedISO: this.state.lastUpdatedISO,
99
+ };
100
+ }
101
+ async increment(n = 1, reason) {
102
+ if (!this.state) {
103
+ throw new Error('UsageTracker not initialized');
104
+ }
105
+ const release = await this.mutex.acquire();
106
+ try {
107
+ this.state.used += n;
108
+ this.state.lastUpdatedISO = new Date().toISOString();
109
+ await this.persist();
110
+ if (reason) {
111
+ this.log.debug(`Usage incremented by ${n} (${reason}). New used=${this.state.used}`);
112
+ }
113
+ const newTier = this.computeTier();
114
+ if (newTier !== this.currentTier) {
115
+ const old = this.currentTier;
116
+ this.currentTier = newTier;
117
+ this.emit('tierChanged', { old, new: newTier, usage: this.getUsage() });
118
+ this.log.info(`Usage tier changed: ${old} -> ${newTier}`);
119
+ }
120
+ }
121
+ finally {
122
+ release();
123
+ }
124
+ }
125
+ async tryReserve(n = 1, reason) {
126
+ if (!this.state) {
127
+ throw new Error('UsageTracker not initialized');
128
+ }
129
+ const release = await this.mutex.acquire();
130
+ try {
131
+ const remaining = this.state.totalAllowed - this.state.used;
132
+ if (remaining >= n) {
133
+ this.state.used += n;
134
+ this.state.lastUpdatedISO = new Date().toISOString();
135
+ await this.persist();
136
+ if (reason) {
137
+ this.log.debug(`Reserved ${n} calls (${reason}). New used=${this.state.used}`);
138
+ }
139
+ const newTier = this.computeTier();
140
+ if (newTier !== this.currentTier) {
141
+ const old = this.currentTier;
142
+ this.currentTier = newTier;
143
+ this.emit('tierChanged', { old, new: newTier, usage: this.getUsage() });
144
+ }
145
+ return true;
146
+ }
147
+ this.log.debug('Not enough calls remaining, returning false');
148
+ return false;
149
+ }
150
+ finally {
151
+ release();
152
+ }
153
+ }
154
+ async beginBatch(n = 1, reason) {
155
+ if (!this.state) {
156
+ throw new Error('UsageTracker not initialized');
157
+ }
158
+ const release = await this.mutex.acquire();
159
+ try {
160
+ const remaining = this.state.totalAllowed - this.state.used;
161
+ if (remaining >= n) {
162
+ this.state.used += n;
163
+ this.pendingReserved += n;
164
+ this.state.lastUpdatedISO = new Date().toISOString();
165
+ await this.persist();
166
+ if (reason) {
167
+ this.log.debug(`Reserve ${n} calls (${reason}). New used=${this.state.used}`);
168
+ }
169
+ const newTier = this.computeTier();
170
+ if (newTier !== this.currentTier) {
171
+ const old = this.currentTier;
172
+ this.currentTier = newTier;
173
+ this.emit('tierChanged', { old, new: newTier, usage: this.getUsage() });
174
+ this.log.info(`Usage tier changed: ${old} -> ${newTier}`);
175
+ }
176
+ return true;
177
+ }
178
+ return false;
179
+ }
180
+ finally {
181
+ release();
182
+ }
183
+ }
184
+ async consumePendingReservation(n = 1) {
185
+ const release = await this.mutex.acquire();
186
+ try {
187
+ if (this.pendingReserved >= n) {
188
+ this.pendingReserved -= n;
189
+ return true;
190
+ }
191
+ return false;
192
+ }
193
+ finally {
194
+ release();
195
+ }
196
+ }
197
+ computeTier() {
198
+ if (!this.state) {
199
+ return 0;
200
+ }
201
+ const remaining = Math.max(0, this.state.totalAllowed - this.state.used);
202
+ const remainingFraction = this.state.totalAllowed === 0 ? 0 : remaining / this.state.totalAllowed;
203
+ if (remainingFraction < 0.05) {
204
+ return 4;
205
+ }
206
+ if (remainingFraction < 0.10) {
207
+ return 3;
208
+ }
209
+ if (remainingFraction < 0.20) {
210
+ return 2;
211
+ }
212
+ if (remainingFraction < 0.50) {
213
+ return 1;
214
+ }
215
+ return 0;
216
+ }
217
+ canReserve(n = 1) {
218
+ if (!this.state) {
219
+ throw new Error('UsageTracker not initialized');
220
+ }
221
+ const remaining = this.state.totalAllowed - this.state.used;
222
+ return remaining >= n;
223
+ }
224
+ async resetForNewMonth() {
225
+ if (!this.state) {
226
+ throw new Error('UsageTracker not initialized');
227
+ }
228
+ const release = await this.mutex.acquire();
229
+ try {
230
+ const now = new Date();
231
+ this.state.year = now.getFullYear();
232
+ this.state.month = now.getMonth() + 1;
233
+ this.state.used = 0;
234
+ this.state.totalAllowed = this.totalAllowed;
235
+ this.state.lastUpdatedISO = now.toISOString();
236
+ await this.persist();
237
+ this.log.info('UsageTracker: month reset performed');
238
+ }
239
+ finally {
240
+ release();
241
+ }
242
+ }
243
+ scheduleRolloverCheck() {
244
+ this.rolloverInterval = setInterval(() => void this.checkRollover(), 60 * 60 * 1000);
245
+ }
246
+ async checkRollover() {
247
+ if (!this.state) {
248
+ return;
249
+ }
250
+ const now = new Date();
251
+ if (now.getFullYear() !== this.state.year || (now.getMonth() + 1) !== this.state.month) {
252
+ this.log.info('Detected month change - performing usage reset');
253
+ await this.resetForNewMonth();
254
+ }
255
+ }
256
+ async updateTotalAllowed(newTotal) {
257
+ if (!this.state) {
258
+ throw new Error('UsageTracker not initialized');
259
+ }
260
+ const release = await this.mutex.acquire();
261
+ try {
262
+ this.totalAllowed = newTotal;
263
+ this.state.totalAllowed = newTotal;
264
+ await this.persist();
265
+ }
266
+ finally {
267
+ release();
268
+ }
269
+ }
270
+ stop() {
271
+ if (this.rolloverInterval) {
272
+ clearInterval(this.rolloverInterval);
273
+ }
274
+ }
275
+ }
276
+ //# sourceMappingURL=usageTracker.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"usageTracker.js","sourceRoot":"","sources":["../../src/api/usageTracker.ts"],"names":[],"mappings":"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"}
package/dist/config.d.ts CHANGED
@@ -10,9 +10,11 @@ export interface TTLockAccessCodeConfigInput {
10
10
  clientSecret?: string;
11
11
  username?: string;
12
12
  password?: string;
13
+ totalApiCallsPerMonth?: number;
13
14
  pollingInterval?: number;
14
15
  discoveryPollingInterval?: number;
15
16
  offlineInterval?: number;
17
+ waitTimeUpdate?: number;
16
18
  }
17
19
  export type TTLockAccessCodeConfig = {
18
20
  name: string;
@@ -20,11 +22,15 @@ export type TTLockAccessCodeConfig = {
20
22
  clientSecret: string;
21
23
  username: string;
22
24
  password: string;
25
+ totalApiCallsPerMonth: number;
23
26
  discoveryOptions: {
24
27
  pollingInterval: number;
25
28
  discoveryPollingInterval: number;
26
29
  offlineInterval: number;
27
30
  };
31
+ advancedOptions: {
32
+ waitTimeUpdate: number;
33
+ };
28
34
  };
29
35
  export declare const defaultConfig: TTLockAccessCodeConfig;
30
36
  export declare function parseConfig(config: Record<string, unknown>): TTLockAccessCodeConfig;
package/dist/config.js CHANGED
@@ -31,11 +31,15 @@ export const defaultConfig = {
31
31
  clientSecret: '',
32
32
  username: '',
33
33
  password: '',
34
+ totalApiCallsPerMonth: 100000,
34
35
  discoveryOptions: {
35
- pollingInterval: 5,
36
- discoveryPollingInterval: 300,
36
+ pollingInterval: 90,
37
+ discoveryPollingInterval: 6,
37
38
  offlineInterval: 7,
38
39
  },
40
+ advancedOptions: {
41
+ waitTimeUpdate: 100,
42
+ },
39
43
  };
40
44
  function validateConfig(config) {
41
45
  const errors = [];
@@ -44,9 +48,11 @@ function validateConfig(config) {
44
48
  validateType(config, 'clientSecret', 'string', errors);
45
49
  validateType(config, 'username', 'string', errors);
46
50
  validateType(config, 'password', 'string', errors);
51
+ validateType(config, 'totalApiCallsPerMonth', 'number', errors);
47
52
  validateType(config, 'pollingInterval', 'number', errors);
48
53
  validateType(config, 'discoveryPollingInterval', 'number', errors);
49
54
  validateType(config, 'offlineInterval', 'number', errors);
55
+ validateType(config, 'waitTimeUpdate', 'number', errors);
50
56
  return errors;
51
57
  }
52
58
  function validateType(config, key, expectedType, errors) {
@@ -62,17 +68,23 @@ export function parseConfig(config) {
62
68
  if (!isObjectLike(config)) {
63
69
  throw new ConfigParseError('Error parsing config');
64
70
  }
65
- const c = { ...defaultConfig, ...config };
71
+ const parsedConfig = { ...defaultConfig, ...config };
66
72
  return {
67
- name: c.name ?? defaultConfig.name,
68
- clientId: c.clientId ?? defaultConfig.clientId,
69
- clientSecret: c.clientSecret ?? defaultConfig.clientSecret,
70
- username: c.username ?? defaultConfig.username,
71
- password: c.password ?? defaultConfig.password,
73
+ name: parsedConfig.name ?? defaultConfig.name,
74
+ clientId: parsedConfig.clientId ?? defaultConfig.clientId,
75
+ clientSecret: parsedConfig.clientSecret ?? defaultConfig.clientSecret,
76
+ username: parsedConfig.username ?? defaultConfig.username,
77
+ password: parsedConfig.password ?? defaultConfig.password,
78
+ totalApiCallsPerMonth: parsedConfig.totalApiCallsPerMonth ?? defaultConfig.totalApiCallsPerMonth,
72
79
  discoveryOptions: {
73
- pollingInterval: (c.pollingInterval ?? defaultConfig.discoveryOptions.pollingInterval) * 1000,
74
- discoveryPollingInterval: (c.discoveryPollingInterval ?? defaultConfig.discoveryOptions.discoveryPollingInterval) * 1000,
75
- offlineInterval: (c.offlineInterval ?? defaultConfig.discoveryOptions.offlineInterval) * 24 * 60 * 60 * 1000,
80
+ pollingInterval: (parsedConfig.pollingInterval ?? defaultConfig.discoveryOptions.pollingInterval) * 1000,
81
+ discoveryPollingInterval: ((parsedConfig.discoveryPollingInterval ??
82
+ defaultConfig.discoveryOptions.discoveryPollingInterval)
83
+ * 60 * 60 * 1000),
84
+ offlineInterval: (parsedConfig.offlineInterval ?? defaultConfig.discoveryOptions.offlineInterval) * 24 * 60 * 60 * 1000,
85
+ },
86
+ advancedOptions: {
87
+ waitTimeUpdate: parsedConfig.waitTimeUpdate ?? defaultConfig.advancedOptions.waitTimeUpdate,
76
88
  },
77
89
  };
78
90
  }
@@ -1 +1 @@
1
- {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { HAP, PlatformAccessory, Service } from 'homebridge';
2
+ import type HomeKitDevice from './baseDevice.js';
3
+ export default function accessoryInformation(hap: HAP): (accessory: PlatformAccessory, homekitDevice: HomeKitDevice) => Service | undefined;
@@ -0,0 +1,28 @@
1
+ export default function accessoryInformation(hap) {
2
+ const { Characteristic, Service: { AccessoryInformation } } = hap;
3
+ return (accessory, homekitDevice) => {
4
+ const infoService = accessory.getService(AccessoryInformation) ?? accessory.addService(AccessoryInformation);
5
+ const nameCharacteristic = infoService.getCharacteristic(Characteristic.Name);
6
+ const manufacturerCharacteristic = infoService.getCharacteristic(Characteristic.Manufacturer);
7
+ const modelCharacteristic = infoService.getCharacteristic(Characteristic.Model);
8
+ const serialCharacteristic = infoService.getCharacteristic(Characteristic.SerialNumber);
9
+ const firmwareCharacteristic = infoService.getCharacteristic(Characteristic.FirmwareRevision);
10
+ if ((nameCharacteristic.value ?? '') !== (homekitDevice.name ?? '')) {
11
+ infoService.setCharacteristic(Characteristic.Name, homekitDevice.name);
12
+ }
13
+ if ((manufacturerCharacteristic.value ?? '') !== (homekitDevice.manufacturer ?? '')) {
14
+ infoService.setCharacteristic(Characteristic.Manufacturer, homekitDevice.manufacturer);
15
+ }
16
+ if ((modelCharacteristic.value ?? '') !== (homekitDevice.model ?? '')) {
17
+ infoService.setCharacteristic(Characteristic.Model, homekitDevice.model);
18
+ }
19
+ if ((serialCharacteristic.value ?? '') !== (homekitDevice.serialNumber ?? '')) {
20
+ infoService.setCharacteristic(Characteristic.SerialNumber, homekitDevice.serialNumber);
21
+ }
22
+ if ((firmwareCharacteristic.value ?? '') !== (homekitDevice.firmwareRevision ?? '')) {
23
+ infoService.setCharacteristic(Characteristic.FirmwareRevision, homekitDevice.firmwareRevision);
24
+ }
25
+ return infoService;
26
+ };
27
+ }
28
+ //# sourceMappingURL=accessoryInformation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"accessoryInformation.js","sourceRoot":"","sources":["../../src/devices/accessoryInformation.ts"],"names":[],"mappings":"AAIA,MAAM,CAAC,OAAO,UAAU,oBAAoB,CAC1C,GAAQ;IAER,MAAM,EAAE,cAAc,EAAE,OAAO,EAAE,EAAE,oBAAoB,EAAE,EAAE,GAAG,GAAG,CAAC;IAElE,OAAO,CAAC,SAA4B,EAAE,aAA4B,EAAE,EAAE;QACpE,MAAM,WAAW,GAAG,SAAS,CAAC,UAAU,CAAC,oBAAoB,CAAC,IAAI,SAAS,CAAC,UAAU,CAAC,oBAAoB,CAAC,CAAC;QAE7G,MAAM,kBAAkB,GAAG,WAAW,CAAC,iBAAiB,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC;QAC9E,MAAM,0BAA0B,GAAG,WAAW,CAAC,iBAAiB,CAAC,cAAc,CAAC,YAAY,CAAC,CAAC;QAC9F,MAAM,mBAAmB,GAAG,WAAW,CAAC,iBAAiB,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC;QAChF,MAAM,oBAAoB,GAAG,WAAW,CAAC,iBAAiB,CAAC,cAAc,CAAC,YAAY,CAAC,CAAC;QACxF,MAAM,sBAAsB,GAAG,WAAW,CAAC,iBAAiB,CAAC,cAAc,CAAC,gBAAgB,CAAC,CAAC;QAE9F,IAAI,CAAC,kBAAkB,CAAC,KAAe,IAAI,EAAE,CAAC,KAAK,CAAC,aAAa,CAAC,IAAI,IAAI,EAAE,CAAC,EAAE,CAAC;YAC9E,WAAW,CAAC,iBAAiB,CAAC,cAAc,CAAC,IAAI,EAAE,aAAa,CAAC,IAA2B,CAAC,CAAC;QAChG,CAAC;QACD,IAAI,CAAC,0BAA0B,CAAC,KAAe,IAAI,EAAE,CAAC,KAAK,CAAC,aAAa,CAAC,YAAY,IAAI,EAAE,CAAC,EAAE,CAAC;YAC9F,WAAW,CAAC,iBAAiB,CAAC,cAAc,CAAC,YAAY,EAAE,aAAa,CAAC,YAAmC,CAAC,CAAC;QAChH,CAAC;QACD,IAAI,CAAC,mBAAmB,CAAC,KAAe,IAAI,EAAE,CAAC,KAAK,CAAC,aAAa,CAAC,KAAK,IAAI,EAAE,CAAC,EAAE,CAAC;YAChF,WAAW,CAAC,iBAAiB,CAAC,cAAc,CAAC,KAAK,EAAE,aAAa,CAAC,KAA4B,CAAC,CAAC;QAClG,CAAC;QACD,IAAI,CAAC,oBAAoB,CAAC,KAAe,IAAI,EAAE,CAAC,KAAK,CAAC,aAAa,CAAC,YAAY,IAAI,EAAE,CAAC,EAAE,CAAC;YACxF,WAAW,CAAC,iBAAiB,CAAC,cAAc,CAAC,YAAY,EAAE,aAAa,CAAC,YAAmC,CAAC,CAAC;QAChH,CAAC;QACD,IAAI,CAAC,sBAAsB,CAAC,KAAe,IAAI,EAAE,CAAC,KAAK,CAAC,aAAa,CAAC,gBAAgB,IAAI,EAAE,CAAC,EAAE,CAAC;YAC9F,WAAW,CAAC,iBAAiB,CAAC,cAAc,CAAC,gBAAgB,EAAE,aAAa,CAAC,gBAAuC,CAAC,CAAC;QACxH,CAAC;QAED,OAAO,WAAW,CAAC;IACrB,CAAC,CAAC;AACJ,CAAC"}
@@ -0,0 +1,58 @@
1
+ import type { Categories, Characteristic, CharacteristicValue, HapStatusError, Logger, Nullable, PlatformAccessory, Service, WithUUID } from 'homebridge';
2
+ import { EventEmitter } from 'node:events';
3
+ import DeviceManager from './deviceManager.js';
4
+ import type TTLockAccessCodePlatform from '../platform.js';
5
+ import type { CharacteristicDescriptor, DescriptorContext, TTLockDevice, SysInfo } from './deviceTypes.js';
6
+ import type { TTLockAccessCodeAccessoryContext } from '../platform.js';
7
+ export default abstract class HomeKitDevice {
8
+ readonly platform: TTLockAccessCodePlatform;
9
+ ttlockDevice: TTLockDevice;
10
+ readonly category: Categories;
11
+ readonly categoryName: string;
12
+ readonly log: Logger;
13
+ protected deviceManager: DeviceManager | undefined;
14
+ homebridgeAccessory: PlatformAccessory<TTLockAccessCodeAccessoryContext>;
15
+ isUpdating: boolean;
16
+ protected previousSnapshot?: HomeKitDevice;
17
+ protected pollingInterval?: NodeJS.Timeout;
18
+ protected updateEmitter: EventEmitter<any>;
19
+ private static locks;
20
+ protected getSysInfoDeferred: () => Promise<void>;
21
+ private services;
22
+ constructor(platform: TTLockAccessCodePlatform, ttlockDevice: TTLockDevice, category: Categories, categoryName: string);
23
+ private initializeAccessory;
24
+ private updateAccessory;
25
+ get id(): string;
26
+ get name(): string;
27
+ get manufacturer(): string;
28
+ get model(): string;
29
+ get serialNumber(): string;
30
+ get firmwareRevision(): string;
31
+ protected makeLockKey(): string;
32
+ protected withLock<T>(key: string, action: () => Promise<T>): Promise<T>;
33
+ protected shouldSkipUpdate(): boolean;
34
+ protected waitForUpdateOrDiscovery(): Promise<void>;
35
+ protected getSysInfo(): Promise<void>;
36
+ private fetchSysInfoInternal;
37
+ protected refreshAndUpdateCharacteristics(forceUpdate: boolean): Promise<void>;
38
+ startPolling(): Promise<void>;
39
+ stopPolling(): Promise<void>;
40
+ updateAfterPeriodicDiscovery(): void;
41
+ protected setupServices(): void;
42
+ protected getServiceTypes(): WithUUID<typeof Service>[];
43
+ protected buildDescriptors(service: Service): CharacteristicDescriptor[];
44
+ protected registerCharacteristic(service: Service, type: WithUUID<new () => Characteristic>, onGet: () => Promise<CharacteristicValue>, onSet?: (value: CharacteristicValue) => Promise<void | string>): void;
45
+ protected initializeCharacteristic(service: Service, descriptor: CharacteristicDescriptor): void;
46
+ protected buildDescriptorContext(): DescriptorContext;
47
+ updateDeviceField<K extends keyof SysInfo>(key: K, value: SysInfo[K]): void;
48
+ private genericOnGet;
49
+ private genericOnSet;
50
+ private executeDescriptorSet;
51
+ protected updateAllServicesAndCharacteristics(forceUpdate: boolean): Promise<void>;
52
+ protected defaultValueForCharacteristic(type: WithUUID<new () => Characteristic>): CharacteristicValue;
53
+ protected updateIfChanged<T extends CharacteristicValue>(service: Service, characteristic: Characteristic, alias: string, previousValue: T, nextValue: T, label?: string, force?: boolean): void;
54
+ protected addService(serviceCtor: WithUUID<typeof this.platform.Service>, name: string): Service;
55
+ protected updateValue(service: Service, characteristic: Characteristic, deviceAlias: string, value: Nullable<CharacteristicValue> | Error | HapStatusError): void;
56
+ abstract initialize(): Promise<void>;
57
+ abstract identify(): void;
58
+ }