homebridge-kasa-python 2.9.1 → 3.0.0-beta.1

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 (57) hide show
  1. package/README.md +1 -1
  2. package/config.schema.json +17 -2
  3. package/dist/accessoryInformation.d.ts +2 -2
  4. package/dist/accessoryInformation.js +24 -28
  5. package/dist/accessoryInformation.js.map +1 -1
  6. package/dist/config.d.ts +5 -1
  7. package/dist/config.js +24 -16
  8. package/dist/config.js.map +1 -1
  9. package/dist/devices/baseDevice.d.ts +61 -0
  10. package/dist/devices/baseDevice.js +361 -0
  11. package/dist/devices/baseDevice.js.map +1 -0
  12. package/dist/devices/baseParent.d.ts +19 -0
  13. package/dist/devices/baseParent.js +150 -0
  14. package/dist/devices/baseParent.js.map +1 -0
  15. package/dist/devices/create.d.ts +3 -3
  16. package/dist/devices/create.js +21 -27
  17. package/dist/devices/create.js.map +1 -1
  18. package/dist/devices/descriptorHelpers.d.ts +14 -0
  19. package/dist/devices/descriptorHelpers.js +146 -0
  20. package/dist/devices/descriptorHelpers.js.map +1 -0
  21. package/dist/devices/deviceManager.d.ts +13 -13
  22. package/dist/devices/deviceManager.js +115 -137
  23. package/dist/devices/deviceManager.js.map +1 -1
  24. package/dist/devices/{kasaDevices.d.ts → deviceTypes.d.ts} +58 -42
  25. package/dist/devices/deviceTypes.js +20 -0
  26. package/dist/devices/deviceTypes.js.map +1 -0
  27. package/dist/devices/homekitLightBulb.d.ts +7 -28
  28. package/dist/devices/homekitLightBulb.js +42 -365
  29. package/dist/devices/homekitLightBulb.js.map +1 -1
  30. package/dist/devices/homekitPlug.d.ts +6 -25
  31. package/dist/devices/homekitPlug.js +21 -322
  32. package/dist/devices/homekitPlug.js.map +1 -1
  33. package/dist/devices/homekitPowerStrip.d.ts +6 -26
  34. package/dist/devices/homekitPowerStrip.js +25 -345
  35. package/dist/devices/homekitPowerStrip.js.map +1 -1
  36. package/dist/devices/homekitSwitch.d.ts +5 -26
  37. package/dist/devices/homekitSwitch.js +18 -302
  38. package/dist/devices/homekitSwitch.js.map +1 -1
  39. package/dist/devices/homekitSwitchWithChildren.d.ts +5 -29
  40. package/dist/devices/homekitSwitchWithChildren.js +24 -371
  41. package/dist/devices/homekitSwitchWithChildren.js.map +1 -1
  42. package/dist/energyCharacteristics.d.ts +8 -0
  43. package/dist/energyCharacteristics.js +88 -0
  44. package/dist/energyCharacteristics.js.map +1 -0
  45. package/dist/platform.d.ts +4 -2
  46. package/dist/platform.js +68 -63
  47. package/dist/platform.js.map +1 -1
  48. package/dist/python/kasaApi.py +68 -55
  49. package/dist/python/pythonChecker.js +2 -2
  50. package/dist/python/pythonChecker.js.map +1 -1
  51. package/package.json +15 -15
  52. package/requirements.txt +2 -2
  53. package/dist/devices/index.d.ts +0 -33
  54. package/dist/devices/index.js +0 -100
  55. package/dist/devices/index.js.map +0 -1
  56. package/dist/devices/kasaDevices.js +0 -102
  57. package/dist/devices/kasaDevices.js.map +0 -1
@@ -0,0 +1,361 @@
1
+ import { EventEmitter } from 'node:events';
2
+ import AccessoryInformation from '../accessoryInformation.js';
3
+ import { deferAndCombine, prefixLogger } from '../utils.js';
4
+ export default class HomeKitDevice {
5
+ platform;
6
+ kasaDevice;
7
+ category;
8
+ categoryName;
9
+ log;
10
+ deviceManager;
11
+ homebridgeAccessory;
12
+ isUpdating = false;
13
+ previousSnapshot;
14
+ pollingInterval;
15
+ updateEmitter = new EventEmitter();
16
+ static locks = new Map();
17
+ getSysInfoDeferred;
18
+ primaryDescriptors = [];
19
+ primaryService;
20
+ constructor(platform, kasaDevice, category, categoryName) {
21
+ this.platform = platform;
22
+ this.kasaDevice = kasaDevice;
23
+ this.category = category;
24
+ this.categoryName = categoryName;
25
+ this.deviceManager = platform.deviceManager;
26
+ this.log = prefixLogger(platform.log, `[${this.name}]`);
27
+ this.homebridgeAccessory = this.initializeAccessory();
28
+ this.homebridgeAccessory.on("identify" /* PlatformAccessoryEvent.IDENTIFY */, () => this.identify());
29
+ platform.periodicDeviceDiscoveryEmitter.on('periodicDeviceDiscoveryComplete', () => {
30
+ this.updateEmitter.emit('periodicDeviceDiscoveryComplete');
31
+ });
32
+ this.getSysInfoDeferred = deferAndCombine(this.fetchSysInfoInternal.bind(this), platform.config.advancedOptions.waitTimeUpdate);
33
+ try {
34
+ this.previousSnapshot = JSON.parse(JSON.stringify(this.kasaDevice));
35
+ }
36
+ catch {
37
+ this.previousSnapshot = { ...this.kasaDevice };
38
+ }
39
+ }
40
+ initializeAccessory() {
41
+ const uuid = this.platform.api.hap.uuid.generate(this.id);
42
+ const existingAccessory = this.platform.configuredAccessories.get(uuid);
43
+ let accessory;
44
+ if (!existingAccessory) {
45
+ this.log.debug(`Creating new Platform Accessory [${this.id}] [${uuid}] category: ${this.categoryName}`);
46
+ accessory = new this.platform.api.platformAccessory(this.name, uuid, this.category);
47
+ accessory.context.deviceId = this.id;
48
+ accessory.context.lastSeen = this.kasaDevice.last_seen;
49
+ accessory.context.offline = this.kasaDevice.offline;
50
+ this.platform.registerPlatformAccessory(accessory);
51
+ }
52
+ else {
53
+ accessory = existingAccessory;
54
+ this.updateAccessory(accessory);
55
+ }
56
+ const info = AccessoryInformation(this.platform.api.hap)(accessory, this);
57
+ if (!info) {
58
+ this.log.error('Could not retrieve default AccessoryInformation');
59
+ }
60
+ return accessory;
61
+ }
62
+ updateAccessory(accessory) {
63
+ accessory.displayName = this.name;
64
+ accessory.context.deviceId = this.id;
65
+ accessory.context.lastSeen = this.kasaDevice.last_seen;
66
+ accessory.context.offline = this.kasaDevice.offline;
67
+ this.platform.configuredAccessories.set(accessory.UUID, accessory);
68
+ this.platform.api.updatePlatformAccessories([accessory]);
69
+ }
70
+ get id() {
71
+ return this.kasaDevice.sys_info.device_id;
72
+ }
73
+ get name() {
74
+ return this.kasaDevice.sys_info.alias;
75
+ }
76
+ get manufacturer() {
77
+ return 'TP-Link';
78
+ }
79
+ get model() {
80
+ return `${this.kasaDevice.sys_info.model} ${this.kasaDevice.sys_info.hw_ver}`;
81
+ }
82
+ get serialNumber() {
83
+ return this.kasaDevice.sys_info.mac;
84
+ }
85
+ get firmwareRevision() {
86
+ return this.kasaDevice.sys_info.sw_ver;
87
+ }
88
+ extractChildIndex(child) {
89
+ const idString = String(child?.id ?? '');
90
+ const match = idString.match(/(\d{1,2})$/);
91
+ return match ? parseInt(match[1], 10) : 0;
92
+ }
93
+ makeLockKey(childId) {
94
+ return childId !== undefined && childId !== null
95
+ ? `${this.kasaDevice.sys_info.device_id}:${childId}`
96
+ : `${this.kasaDevice.sys_info.device_id}`;
97
+ }
98
+ async withLock(key, action) {
99
+ const previousPromise = HomeKitDevice.locks.get(key) ?? Promise.resolve();
100
+ const currentPromise = previousPromise.then(async () => {
101
+ try {
102
+ return await action();
103
+ }
104
+ finally {
105
+ if (HomeKitDevice.locks.get(key) === currentPromise) {
106
+ HomeKitDevice.locks.delete(key);
107
+ }
108
+ }
109
+ });
110
+ HomeKitDevice.locks.set(key, currentPromise);
111
+ return currentPromise;
112
+ }
113
+ shouldSkipUpdate() {
114
+ return this.kasaDevice.offline || this.platform.isShuttingDown;
115
+ }
116
+ async waitForUpdateOrDiscovery() {
117
+ let discoveryFinished = false;
118
+ await Promise.race([
119
+ new Promise(resolve => this.updateEmitter.once('updateComplete', resolve)),
120
+ new Promise(resolve => {
121
+ this.updateEmitter.once('periodicDeviceDiscoveryComplete', () => {
122
+ discoveryFinished = true;
123
+ resolve();
124
+ });
125
+ }),
126
+ ]);
127
+ if (discoveryFinished && this.pollingInterval) {
128
+ await new Promise(r => setTimeout(r, this.platform.config.discoveryOptions.pollingInterval));
129
+ }
130
+ }
131
+ async getSysInfo() {
132
+ await this.getSysInfoDeferred();
133
+ }
134
+ async fetchSysInfoInternal() {
135
+ if (!this.deviceManager) {
136
+ this.log.warn('Device manager not available');
137
+ return;
138
+ }
139
+ const host = this.kasaDevice.sys_info?.host;
140
+ if (!host) {
141
+ this.log.warn('No host in sys_info');
142
+ return;
143
+ }
144
+ try {
145
+ this.previousSnapshot = JSON.parse(JSON.stringify(this.kasaDevice));
146
+ const updatedSysInfo = await this.deviceManager.getSysInfo(host);
147
+ if (!updatedSysInfo) {
148
+ this.log.warn('getSysInfo returned undefined');
149
+ return;
150
+ }
151
+ this.kasaDevice.sys_info = updatedSysInfo;
152
+ this.log.debug(`Updated sys_info: ${updatedSysInfo.alias ?? host}`);
153
+ }
154
+ catch (error) {
155
+ this.log.error('Error updating sys_info', error);
156
+ }
157
+ }
158
+ async refreshAndUpdateCharacteristics(forceUpdate) {
159
+ const deviceKey = this.kasaDevice.sys_info.device_id;
160
+ if (!forceUpdate && HomeKitDevice.locks.has(deviceKey)) {
161
+ this.log.debug('Skipping poll; active update lock');
162
+ return;
163
+ }
164
+ await this.withLock(deviceKey, async () => {
165
+ if (this.shouldSkipUpdate()) {
166
+ await this.stopPolling();
167
+ return;
168
+ }
169
+ if (this.isUpdating || this.platform.periodicDeviceDiscovering) {
170
+ await this.waitForUpdateOrDiscovery();
171
+ }
172
+ this.isUpdating = true;
173
+ try {
174
+ await this.getSysInfo();
175
+ await this.updateAllServicesAndCharacteristics(forceUpdate);
176
+ }
177
+ catch (error) {
178
+ this.log.error('Error during poll update:', error);
179
+ this.kasaDevice.offline = true;
180
+ await this.stopPolling();
181
+ }
182
+ finally {
183
+ this.isUpdating = false;
184
+ this.updateEmitter.emit('updateComplete');
185
+ }
186
+ });
187
+ }
188
+ async startPolling() {
189
+ if (this.shouldSkipUpdate()) {
190
+ await this.stopPolling();
191
+ return;
192
+ }
193
+ if (this.pollingInterval) {
194
+ clearInterval(this.pollingInterval);
195
+ }
196
+ this.pollingInterval = setInterval(() => void this.refreshAndUpdateCharacteristics(false), this.platform.config.discoveryOptions.pollingInterval);
197
+ }
198
+ async stopPolling() {
199
+ if (this.pollingInterval) {
200
+ clearInterval(this.pollingInterval);
201
+ this.pollingInterval = undefined;
202
+ }
203
+ if (this.isUpdating) {
204
+ await new Promise(resolve => {
205
+ this.isUpdating = false;
206
+ this.updateEmitter.once('updateComplete', resolve);
207
+ });
208
+ }
209
+ }
210
+ updateAfterPeriodicDiscovery() {
211
+ void this.refreshAndUpdateCharacteristics(true);
212
+ }
213
+ setupPrimaryService() {
214
+ const serviceType = this.getPrimaryServiceType();
215
+ if (!serviceType) {
216
+ return;
217
+ }
218
+ this.primaryService = this.homebridgeAccessory.getService(serviceType)
219
+ ?? this.addService(serviceType, this.name);
220
+ this.primaryDescriptors = this.buildPrimaryDescriptors();
221
+ for (const descriptor of this.primaryDescriptors) {
222
+ this.registerCharacteristic(this.primaryService, descriptor.type, () => this.genericOnGet(descriptor), descriptor.writable ? (value) => this.genericOnSet(descriptor, value) : undefined);
223
+ }
224
+ }
225
+ getPrimaryServiceType() {
226
+ return null;
227
+ }
228
+ buildPrimaryDescriptors() {
229
+ return [];
230
+ }
231
+ registerCharacteristic(service, type, onGet, onSet) {
232
+ const characteristic = service.getCharacteristic(type) ?? service.addCharacteristic(type);
233
+ characteristic.onGet(onGet);
234
+ if (onSet) {
235
+ characteristic.onSet(onSet);
236
+ }
237
+ }
238
+ buildDescriptorContext(child) {
239
+ return {
240
+ platform: this.platform,
241
+ device: this.kasaDevice.sys_info,
242
+ child,
243
+ alias: child ? child.alias : this.name,
244
+ };
245
+ }
246
+ updateDeviceField(key, value) {
247
+ this.kasaDevice.sys_info[key] = value;
248
+ }
249
+ async genericOnGet(descriptor) {
250
+ const context = this.buildDescriptorContext();
251
+ try {
252
+ const characteristic = this.primaryService.getCharacteristic(descriptor.type);
253
+ let value = characteristic.value;
254
+ if (value === undefined || value === null) {
255
+ value = descriptor.getInitial(context);
256
+ characteristic.updateValue(value);
257
+ }
258
+ return value;
259
+ }
260
+ catch (error) {
261
+ this.log.error(`OnGet error for ${descriptor.name ?? descriptor.type.UUID}`, error);
262
+ this.kasaDevice.offline = true;
263
+ await this.stopPolling();
264
+ return this.defaultValueForCharacteristic(descriptor.type);
265
+ }
266
+ }
267
+ async genericOnSet(descriptor, value) {
268
+ const context = this.buildDescriptorContext();
269
+ if (!descriptor.applySet) {
270
+ return;
271
+ }
272
+ await this.executeDescriptorSet(descriptor, value, context);
273
+ }
274
+ async executeDescriptorSet(descriptor, value, context, isGrouped = false) {
275
+ const lockKey = this.makeLockKey();
276
+ await this.withLock(lockKey, async () => {
277
+ if (this.shouldSkipUpdate()) {
278
+ return;
279
+ }
280
+ if (!this.deviceManager) {
281
+ throw new Error('Device manager undefined');
282
+ }
283
+ try {
284
+ this.isUpdating = true;
285
+ await descriptor.applySet(value, context);
286
+ const postSetValue = descriptor.getCurrent(context);
287
+ if (this.primaryService) {
288
+ this.updateValue(this.primaryService, this.primaryService.getCharacteristic(descriptor.type), context.alias, postSetValue);
289
+ }
290
+ this.previousSnapshot = JSON.parse(JSON.stringify(this.kasaDevice));
291
+ }
292
+ catch (error) {
293
+ this.log.error(`OnSet error for ${descriptor.name ?? descriptor.type.UUID}`, error);
294
+ this.kasaDevice.offline = true;
295
+ await this.stopPolling();
296
+ }
297
+ finally {
298
+ if (!isGrouped) {
299
+ this.isUpdating = false;
300
+ this.updateEmitter.emit('updateComplete');
301
+ }
302
+ }
303
+ });
304
+ }
305
+ async updateAllServicesAndCharacteristics(forceUpdate) {
306
+ if (!this.primaryService) {
307
+ return;
308
+ }
309
+ for (const descriptor of this.primaryDescriptors) {
310
+ const context = this.buildDescriptorContext();
311
+ try {
312
+ const previousSysInfo = this.previousSnapshot?.sys_info;
313
+ const previousContext = {
314
+ platform: this.platform,
315
+ device: previousSysInfo || {},
316
+ alias: this.name,
317
+ };
318
+ previousContext.device.__snapshot = true;
319
+ const previousValue = previousSysInfo ? descriptor.getCurrent(previousContext) : descriptor.getInitial(context);
320
+ const nextValue = descriptor.getCurrent(context);
321
+ this.updateIfChanged(this.primaryService, this.primaryService.getCharacteristic(descriptor.type), context.alias, previousValue, nextValue, descriptor.name, forceUpdate);
322
+ }
323
+ catch (error) {
324
+ this.log.error(`Update diff error for ${descriptor.name ?? descriptor.type.UUID}`, error);
325
+ }
326
+ }
327
+ }
328
+ defaultValueForCharacteristic(type) {
329
+ const C = this.platform.Characteristic;
330
+ const zeroish = new Set([
331
+ C.Brightness.UUID, C.ColorTemperature.UUID, C.Hue.UUID,
332
+ C.Saturation.UUID, C.RotationSpeed.UUID,
333
+ ]);
334
+ if (zeroish.has(type.UUID)) {
335
+ return 0;
336
+ }
337
+ if (type.UUID === C.Active.UUID) {
338
+ return C.Active.INACTIVE;
339
+ }
340
+ return false;
341
+ }
342
+ updateIfChanged(service, characteristic, alias, previousValue, nextValue, label, force = false) {
343
+ const needsInit = characteristic.value === undefined || characteristic.value === null;
344
+ if (force || needsInit || previousValue !== nextValue) {
345
+ if (label) {
346
+ this.log.debug(`[${alias}] Updating ${label}: ${previousValue} → ${nextValue}`);
347
+ }
348
+ this.updateValue(service, characteristic, alias, nextValue);
349
+ }
350
+ }
351
+ addService(serviceCtor, name, subType) {
352
+ const friendly = this.platform.getServiceName(serviceCtor);
353
+ this.log.debug(`Creating ${friendly} Service on ${name}${subType ? ` [${subType}]` : ''}`);
354
+ return this.homebridgeAccessory.addService(serviceCtor, name, subType ?? '');
355
+ }
356
+ updateValue(service, characteristic, deviceAlias, value) {
357
+ this.log.info(`Updating ${this.platform.lsc(service, characteristic)} on ${deviceAlias} to ${value}`);
358
+ characteristic.updateValue(value);
359
+ }
360
+ }
361
+ //# sourceMappingURL=baseDevice.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"baseDevice.js","sourceRoot":"","sources":["../../src/devices/baseDevice.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ import type { WithUUID } from 'homebridge';
2
+ import HomeKitDevice from './baseDevice.js';
3
+ import type { ChildDevice, CharacteristicDescriptor } from './deviceTypes.js';
4
+ export default abstract class HomeKitParentDevice extends HomeKitDevice {
5
+ private childDescriptorMap;
6
+ protected setupChildServices(): void;
7
+ private ensureChildService;
8
+ private childKey;
9
+ private resolveLiveChild;
10
+ protected updateChildField<K extends keyof ChildDevice>(childId: string, key: K, value: ChildDevice[K]): void;
11
+ private buildChildDescriptorContext;
12
+ private childOnGet;
13
+ private childOnSet;
14
+ private getChildService;
15
+ private executeChildDescriptorSet;
16
+ protected updateAllServicesAndCharacteristics(forceUpdate: boolean): Promise<void>;
17
+ protected abstract getChildServiceType(child: ChildDevice): WithUUID<typeof this.platform.Service>;
18
+ protected abstract buildChildDescriptors(child: ChildDevice): CharacteristicDescriptor[];
19
+ }
@@ -0,0 +1,150 @@
1
+ import HomeKitDevice from './baseDevice.js';
2
+ export default class HomeKitParentDevice extends HomeKitDevice {
3
+ childDescriptorMap = new Map();
4
+ setupChildServices() {
5
+ const children = this.kasaDevice.sys_info.children;
6
+ if (!Array.isArray(children)) {
7
+ return;
8
+ }
9
+ for (const child of children) {
10
+ this.ensureChildService(child);
11
+ }
12
+ }
13
+ ensureChildService(child) {
14
+ const serviceType = this.getChildServiceType(child);
15
+ const childIndex = this.extractChildIndex(child);
16
+ const subType = `child-${childIndex + 1}`;
17
+ let service = this.homebridgeAccessory.getServiceById(serviceType, subType);
18
+ if (!service) {
19
+ service = this.addService(serviceType, child.alias, subType);
20
+ }
21
+ const descriptors = this.buildChildDescriptors(child);
22
+ this.childDescriptorMap.set(this.childKey(child), descriptors);
23
+ for (const descriptor of descriptors) {
24
+ const onSet = descriptor.writable
25
+ ? (value) => this.childOnSet(service, child, descriptor, value)
26
+ : undefined;
27
+ this.registerCharacteristic(service, descriptor.type, () => this.childOnGet(service, child, descriptor), onSet);
28
+ }
29
+ }
30
+ childKey(child) {
31
+ return String(child.id ?? child.alias);
32
+ }
33
+ resolveLiveChild(snapshotChild) {
34
+ const id = snapshotChild?.id;
35
+ const children = this.kasaDevice.sys_info.children;
36
+ if (!Array.isArray(children)) {
37
+ return undefined;
38
+ }
39
+ return children.find(c => c.id === id);
40
+ }
41
+ updateChildField(childId, key, value) {
42
+ const children = this.kasaDevice.sys_info.children;
43
+ if (!Array.isArray(children)) {
44
+ return;
45
+ }
46
+ const idx = children.findIndex(c => c.id === childId);
47
+ if (idx >= 0) {
48
+ children[idx][key] = value;
49
+ }
50
+ }
51
+ buildChildDescriptorContext(child) {
52
+ const live = this.resolveLiveChild(child) ?? child;
53
+ return this.buildDescriptorContext(live);
54
+ }
55
+ async childOnGet(service, child, descriptor) {
56
+ const context = this.buildChildDescriptorContext(child);
57
+ try {
58
+ let value = service.getCharacteristic(descriptor.type).value;
59
+ if (value === undefined || value === null) {
60
+ value = descriptor.getInitial(context);
61
+ service.getCharacteristic(descriptor.type).updateValue(value);
62
+ }
63
+ return value;
64
+ }
65
+ catch (error) {
66
+ this.log.error(`Child OnGet error (${child.alias}) ${descriptor.name}`, error);
67
+ this.kasaDevice.offline = true;
68
+ await this.stopPolling();
69
+ return this.defaultValueForCharacteristic(descriptor.type);
70
+ }
71
+ }
72
+ async childOnSet(service, child, descriptor, value) {
73
+ const context = this.buildChildDescriptorContext(child);
74
+ if (!descriptor.applySet) {
75
+ return;
76
+ }
77
+ await this.executeChildDescriptorSet(service, child, descriptor, value, context);
78
+ }
79
+ getChildService(child) {
80
+ const serviceType = this.getChildServiceType(child);
81
+ const childIndex = this.extractChildIndex(child);
82
+ return this.homebridgeAccessory.getServiceById(serviceType, `child-${childIndex + 1}`);
83
+ }
84
+ async executeChildDescriptorSet(service, child, descriptor, value, context, isGrouped = false) {
85
+ const lockKey = this.makeLockKey();
86
+ await this.withLock(lockKey, async () => {
87
+ if (this.shouldSkipUpdate()) {
88
+ return;
89
+ }
90
+ if (!this.deviceManager) {
91
+ throw new Error('Device manager undefined');
92
+ }
93
+ try {
94
+ this.isUpdating = true;
95
+ await descriptor.applySet(value, context);
96
+ const postSetValue = descriptor.getCurrent(context);
97
+ this.updateValue(service, service.getCharacteristic(descriptor.type), context.alias, postSetValue);
98
+ this.previousSnapshot = JSON.parse(JSON.stringify(this.kasaDevice));
99
+ }
100
+ catch (error) {
101
+ this.log.error(`Child OnSet error (${child.alias}) ${descriptor.name}`, error);
102
+ this.kasaDevice.offline = true;
103
+ await this.stopPolling();
104
+ }
105
+ finally {
106
+ if (!isGrouped) {
107
+ this.isUpdating = false;
108
+ this.updateEmitter.emit('updateComplete');
109
+ }
110
+ }
111
+ });
112
+ }
113
+ async updateAllServicesAndCharacteristics(forceUpdate) {
114
+ const children = this.kasaDevice.sys_info.children;
115
+ if (!Array.isArray(children)) {
116
+ return;
117
+ }
118
+ for (const child of children) {
119
+ const service = this.getChildService(child);
120
+ if (!service) {
121
+ continue;
122
+ }
123
+ const key = this.childKey(child);
124
+ const descriptors = this.childDescriptorMap.get(key);
125
+ if (!descriptors) {
126
+ continue;
127
+ }
128
+ for (const descriptor of descriptors) {
129
+ const context = this.buildChildDescriptorContext(child);
130
+ try {
131
+ const previousChild = this.previousSnapshot?.sys_info.children?.find(c => c.id === child.id);
132
+ const previousContext = {
133
+ platform: this.platform,
134
+ device: this.previousSnapshot?.sys_info ?? {},
135
+ child: previousChild,
136
+ alias: child.alias,
137
+ };
138
+ previousContext.device.__snapshot = true;
139
+ const previousValue = previousChild ? descriptor.getCurrent(previousContext) : descriptor.getInitial(context);
140
+ const nextValue = descriptor.getCurrent(context);
141
+ this.updateIfChanged(service, service.getCharacteristic(descriptor.type), context.alias, previousValue, nextValue, descriptor.name, forceUpdate);
142
+ }
143
+ catch (error) {
144
+ this.log.error(`Child update diff error (${child.alias}) ${descriptor.name}`, error);
145
+ }
146
+ }
147
+ }
148
+ }
149
+ }
150
+ //# sourceMappingURL=baseParent.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"baseParent.js","sourceRoot":"","sources":["../../src/devices/baseParent.ts"],"names":[],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- import HomeKitDevice from './index.js';
1
+ import HomeKitDevice from './baseDevice.js';
2
+ import type { KasaDevice } from './deviceTypes.js';
2
3
  import type KasaPythonPlatform from '../platform.js';
3
- import type { KasaDevice } from './kasaDevices.js';
4
- export default function create(platform: KasaPythonPlatform, kasaDevice: KasaDevice): Promise<HomeKitDevice | undefined>;
4
+ export default function createDevice(platform: KasaPythonPlatform, kasaDevice: KasaDevice): Promise<HomeKitDevice | undefined>;
@@ -1,9 +1,9 @@
1
+ import { LightBulbs, Plugs, PowerStrips, Switches } from './deviceTypes.js';
1
2
  import HomeKitDeviceLightBulb from './homekitLightBulb.js';
2
3
  import HomeKitDevicePlug from './homekitPlug.js';
3
4
  import HomeKitDevicePowerStrip from './homekitPowerStrip.js';
4
5
  import HomeKitDeviceSwitch from './homekitSwitch.js';
5
6
  import HomeKitDeviceSwitchWithChildren from './homekitSwitchWithChildren.js';
6
- import { LightBulbs, Plugs, PowerStrips, Switches } from './kasaDevices.js';
7
7
  function isLightBulb(device) {
8
8
  return LightBulbs.includes(device.sys_info.model);
9
9
  }
@@ -16,46 +16,40 @@ function isPowerStrip(device) {
16
16
  function isSwitch(device) {
17
17
  return Switches.includes(device.sys_info.model);
18
18
  }
19
- export default async function create(platform, kasaDevice) {
20
- let homeKitDevice;
19
+ export default async function createDevice(platform, kasaDevice) {
20
+ let instance;
21
21
  if (isLightBulb(kasaDevice)) {
22
- const lightBulb = kasaDevice;
23
- platform.log.debug('HomeKit device is a LightBulb:', lightBulb.sys_info.model);
24
- homeKitDevice = new HomeKitDeviceLightBulb(platform, lightBulb);
22
+ platform.log.debug('Device classified as LightBulb:', kasaDevice.sys_info.model);
23
+ instance = new HomeKitDeviceLightBulb(platform, kasaDevice);
25
24
  }
26
25
  else if (isPlug(kasaDevice)) {
27
- const plug = kasaDevice;
28
- platform.log.debug('HomeKit device is a Plug:', plug.sys_info.model);
29
- homeKitDevice = new HomeKitDevicePlug(platform, plug);
26
+ platform.log.debug('Device classified as Plug:', kasaDevice.sys_info.model);
27
+ instance = new HomeKitDevicePlug(platform, kasaDevice);
30
28
  }
31
29
  else if (isPowerStrip(kasaDevice)) {
32
- const powerStrip = kasaDevice;
33
- platform.log.debug('HomeKit device is a PowerStrip:', powerStrip.sys_info.model);
34
- homeKitDevice = new HomeKitDevicePowerStrip(platform, powerStrip);
30
+ platform.log.debug('Device classified as PowerStrip:', kasaDevice.sys_info.model);
31
+ instance = new HomeKitDevicePowerStrip(platform, kasaDevice);
35
32
  }
36
33
  else if (isSwitch(kasaDevice)) {
37
- const switchDevice = kasaDevice;
38
- platform.log.debug('HomeKit device is a Switch:', switchDevice.sys_info.model);
39
- if (switchDevice.sys_info.child_num > 0) {
40
- homeKitDevice = new HomeKitDeviceSwitchWithChildren(platform, switchDevice);
34
+ platform.log.debug('Device classified as Switch:', kasaDevice.sys_info.model);
35
+ if (kasaDevice.sys_info.child_num > 0) {
36
+ instance = new HomeKitDeviceSwitchWithChildren(platform, kasaDevice);
41
37
  }
42
38
  else {
43
- homeKitDevice = new HomeKitDeviceSwitch(platform, switchDevice);
39
+ instance = new HomeKitDeviceSwitch(platform, kasaDevice);
44
40
  }
45
41
  }
46
42
  else {
47
- platform.log.error('Unknown device type:', kasaDevice);
43
+ platform.log.error('Unknown device type; skipping:', kasaDevice.sys_info.model);
48
44
  return undefined;
49
45
  }
50
- if (homeKitDevice) {
51
- try {
52
- await homeKitDevice.initialize();
53
- }
54
- catch (error) {
55
- platform.log.error(`Error initializing device [${kasaDevice.sys_info.device_id}]:`, error);
56
- return undefined;
57
- }
46
+ try {
47
+ await instance.initialize();
48
+ }
49
+ catch (error) {
50
+ platform.log.error(`Error initializing device [${kasaDevice.sys_info.device_id}]:`, error);
51
+ return undefined;
58
52
  }
59
- return homeKitDevice;
53
+ return instance;
60
54
  }
61
55
  //# sourceMappingURL=create.js.map