homebridge-kasa-python 2.7.0-beta.2 → 2.7.0-beta.4

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.
@@ -1,19 +1,124 @@
1
1
  import HomekitDevice from './index.js';
2
+ import { deferAndCombine } from '../utils.js';
2
3
  export default class HomeKitDevicePlug extends HomekitDevice {
3
4
  kasaDevice;
5
+ isUpdating = false;
6
+ previousKasaDevice;
7
+ getSysInfo;
4
8
  constructor(platform, kasaDevice) {
5
9
  super(platform, kasaDevice, 7 /* Categories.OUTLET */, 'OUTLET');
6
10
  this.kasaDevice = kasaDevice;
7
11
  this.log.debug(`Initializing HomeKitDevicePlug for device: ${kasaDevice.sys_info.alias}`);
8
- this.addOutletService();
12
+ this.checkService();
13
+ this.getSysInfo = deferAndCombine(async () => {
14
+ if (this.deviceManager) {
15
+ this.previousKasaDevice = JSON.parse(JSON.stringify(this.kasaDevice));
16
+ this.kasaDevice.sys_info = await this.deviceManager.getSysInfo(this.deviceConfig);
17
+ }
18
+ else {
19
+ this.log.warn('Device manager is not available');
20
+ }
21
+ }, platform.config.waitTimeUpdate);
22
+ this.startPolling();
9
23
  }
10
- addOutletService() {
24
+ checkService() {
11
25
  const { Outlet } = this.platform.Service;
12
- const outletService = this.homebridgeAccessory.getService(Outlet) ?? this.addService(Outlet, this.name);
13
- this.log.debug(`Adding characteristics for outlet service: ${this.name}`);
14
- this.addCharacteristic(outletService, this.platform.Characteristic.On);
15
- this.addCharacteristic(outletService, this.platform.Characteristic.OutletInUse);
16
- return outletService;
26
+ const service = this.homebridgeAccessory.getService(Outlet) ?? this.addService(Outlet, this.name);
27
+ this.checkCharacteristics(service);
28
+ return service;
29
+ }
30
+ checkCharacteristics(service) {
31
+ const characteristics = [
32
+ {
33
+ type: this.platform.Characteristic.On,
34
+ name: this.platform.getCharacteristicName(this.platform.Characteristic.On),
35
+ },
36
+ {
37
+ type: this.platform.Characteristic.OutletInUse,
38
+ name: this.platform.getCharacteristicName(this.platform.Characteristic.OutletInUse),
39
+ },
40
+ ].filter(Boolean);
41
+ characteristics.forEach(({ type, name }) => {
42
+ this.getOrAddCharacteristic(service, type, name);
43
+ });
44
+ }
45
+ getOrAddCharacteristic(service, characteristicType, characteristicName) {
46
+ const characteristic = service.getCharacteristic(characteristicType) ??
47
+ service.addCharacteristic(characteristicType);
48
+ characteristic.onGet(this.handleOnGet.bind(this, service, characteristicType, characteristicName));
49
+ if (characteristicType === this.platform.Characteristic.On) {
50
+ characteristic.onSet(this.handleOnSet.bind(this, service, characteristicType, characteristicName));
51
+ }
52
+ return service;
53
+ }
54
+ async handleOnGet(service, characteristicType, characteristicName) {
55
+ try {
56
+ const characteristicValue = service.getCharacteristic(characteristicType).value;
57
+ return characteristicValue ?? false;
58
+ }
59
+ catch (error) {
60
+ this.log.error(`Error getting current value for characteristic ${characteristicName} for device: ${this.name}:`, error);
61
+ }
62
+ return false;
63
+ }
64
+ async handleOnSet(service, characteristicType, characteristicName, value) {
65
+ if (this.deviceManager) {
66
+ try {
67
+ this.isUpdating = true;
68
+ const characteristicMap = {
69
+ On: 'state',
70
+ };
71
+ const characteristicKey = characteristicMap[characteristicName ?? ''];
72
+ if (!characteristicKey) {
73
+ throw new Error(`Characteristic key not found for ${characteristicName}`);
74
+ }
75
+ await this.deviceManager.controlDevice(this.deviceConfig, characteristicKey, value);
76
+ this.kasaDevice.sys_info[characteristicKey] = value;
77
+ this.updateValue(service, service.getCharacteristic(characteristicType), this.name, value);
78
+ this.updateValue(service, service.getCharacteristic(this.platform.Characteristic.OutletInUse), this.name, value);
79
+ this.previousKasaDevice = JSON.parse(JSON.stringify(this.kasaDevice));
80
+ }
81
+ catch (error) {
82
+ this.logRejection(error);
83
+ }
84
+ finally {
85
+ this.isUpdating = false;
86
+ }
87
+ }
88
+ else {
89
+ throw new Error('Device manager is undefined.');
90
+ }
91
+ }
92
+ async updateState() {
93
+ if (this.isUpdating) {
94
+ this.log.debug('Update already in progress, skipping updateState');
95
+ return;
96
+ }
97
+ this.isUpdating = true;
98
+ try {
99
+ await this.getSysInfo();
100
+ const service = this.homebridgeAccessory.getService(this.platform.Service.Outlet);
101
+ if (service && this.previousKasaDevice) {
102
+ const { state } = this.kasaDevice.sys_info;
103
+ const prevState = this.previousKasaDevice.sys_info;
104
+ if (prevState.state !== state) {
105
+ this.updateValue(service, service.getCharacteristic(this.platform.Characteristic.On), this.name, state ?? false);
106
+ this.updateValue(service, service.getCharacteristic(this.platform.Characteristic.OutletInUse), this.name, state ?? false);
107
+ }
108
+ }
109
+ else {
110
+ this.log.warn(`Service not found for device: ${this.name} or previous Kasa device is undefined`);
111
+ }
112
+ }
113
+ catch (error) {
114
+ this.log.error('Error updating device state:', error);
115
+ }
116
+ finally {
117
+ this.isUpdating = false;
118
+ }
119
+ }
120
+ startPolling() {
121
+ setInterval(this.updateState.bind(this), this.platform.config.discoveryOptions.pollingInterval);
17
122
  }
18
123
  identify() {
19
124
  this.log.info('identify');
@@ -1 +1 @@
1
- {"version":3,"file":"homekitPlug.js","sourceRoot":"","sources":["../../src/devices/homekitPlug.ts"],"names":[],"mappings":"AAGA,OAAO,aAAa,MAAM,YAAY,CAAC;AAIvC,MAAM,CAAC,OAAO,OAAO,iBAAkB,SAAQ,aAAa;IAG9C;IAFZ,YACE,QAA4B,EAClB,UAAgB;QAE1B,KAAK,CACH,QAAQ,EACR,UAAU,6BAEV,QAAQ,CACT,CAAC;QAPQ,eAAU,GAAV,UAAU,CAAM;QAQ1B,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,8CAA8C,UAAU,CAAC,QAAQ,CAAC,KAAK,EAAE,CAAC,CAAC;QAC1F,IAAI,CAAC,gBAAgB,EAAE,CAAC;IAC1B,CAAC;IAEO,gBAAgB;QACtB,MAAM,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC;QAEzC,MAAM,aAAa,GACjB,IAAI,CAAC,mBAAmB,CAAC,UAAU,CAAC,MAAM,CAAC,IAAI,IAAI,CAAC,UAAU,CAAC,MAAM,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;QAEpF,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,8CAA8C,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;QAC1E,IAAI,CAAC,iBAAiB,CAAC,aAAa,EAAE,IAAI,CAAC,QAAQ,CAAC,cAAc,CAAC,EAAE,CAAC,CAAC;QACvE,IAAI,CAAC,iBAAiB,CAAC,aAAa,EAAE,IAAI,CAAC,QAAQ,CAAC,cAAc,CAAC,WAAW,CAAC,CAAC;QAEhF,OAAO,aAAa,CAAC;IACvB,CAAC;IAED,QAAQ;QACN,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;IAC5B,CAAC;CACF"}
1
+ {"version":3,"file":"homekitPlug.js","sourceRoot":"","sources":["../../src/devices/homekitPlug.ts"],"names":[],"mappings":"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"}
@@ -3,7 +3,16 @@ import type KasaPythonPlatform from '../platform.js';
3
3
  import type { PowerStrip } from './kasaDevices.js';
4
4
  export default class HomeKitDevicePowerStrip extends HomekitDevice {
5
5
  protected kasaDevice: PowerStrip;
6
+ private isUpdating;
7
+ private previousKasaDevice;
8
+ private getSysInfo;
6
9
  constructor(platform: KasaPythonPlatform, kasaDevice: PowerStrip);
7
- private addOutletService;
10
+ private checkService;
11
+ private checkCharacteristics;
12
+ private getOrAddCharacteristic;
13
+ private handleOnGet;
14
+ private handleOnSet;
15
+ protected updateState(): Promise<void>;
16
+ private startPolling;
8
17
  identify(): void;
9
18
  }
@@ -1,23 +1,136 @@
1
1
  import HomekitDevice from './index.js';
2
+ import { deferAndCombine } from '../utils.js';
2
3
  export default class HomeKitDevicePowerStrip extends HomekitDevice {
3
4
  kasaDevice;
5
+ isUpdating = false;
6
+ previousKasaDevice;
7
+ getSysInfo;
4
8
  constructor(platform, kasaDevice) {
5
9
  super(platform, kasaDevice, 7 /* Categories.OUTLET */, 'OUTLET');
6
10
  this.kasaDevice = kasaDevice;
7
11
  this.log.debug(`Initializing HomeKitDevicePowerStrip for device: ${kasaDevice.sys_info.alias}`);
8
12
  this.kasaDevice.sys_info.children?.forEach((child, index) => {
9
- this.log.debug(`Adding outlet service for child device: ${child.alias}`);
10
- this.addOutletService(child, index);
13
+ this.checkService(child, index);
11
14
  });
15
+ this.getSysInfo = deferAndCombine(async () => {
16
+ if (this.deviceManager) {
17
+ this.previousKasaDevice = JSON.parse(JSON.stringify(this.kasaDevice));
18
+ this.kasaDevice.sys_info = await this.deviceManager.getSysInfo(this.deviceConfig);
19
+ }
20
+ else {
21
+ this.log.warn('Device manager is not available');
22
+ }
23
+ }, platform.config.waitTimeUpdate);
24
+ this.startPolling();
12
25
  }
13
- addOutletService(child, index) {
26
+ checkService(child, index) {
14
27
  const { Outlet } = this.platform.Service;
15
- const outletService = this.homebridgeAccessory.getServiceById(Outlet, `outlet-${index + 1}`) ??
28
+ const service = this.homebridgeAccessory.getServiceById(Outlet, `outlet-${index + 1}`) ??
16
29
  this.addService(Outlet, child.alias, `outlet-${index + 1}`);
17
- this.log.debug(`Adding characteristics for outlet service: ${child.alias}`);
18
- this.addCharacteristic(outletService, this.platform.Characteristic.On, child);
19
- this.addCharacteristic(outletService, this.platform.Characteristic.OutletInUse, child);
20
- return outletService;
30
+ this.checkCharacteristics(service, child);
31
+ return service;
32
+ }
33
+ checkCharacteristics(service, child) {
34
+ const characteristics = [
35
+ {
36
+ type: this.platform.Characteristic.On,
37
+ name: this.platform.getCharacteristicName(this.platform.Characteristic.On),
38
+ },
39
+ {
40
+ type: this.platform.Characteristic.OutletInUse,
41
+ name: this.platform.getCharacteristicName(this.platform.Characteristic.OutletInUse),
42
+ },
43
+ ].filter(Boolean);
44
+ characteristics.forEach(({ type, name }) => {
45
+ this.getOrAddCharacteristic(service, type, name, child);
46
+ });
47
+ }
48
+ getOrAddCharacteristic(service, characteristicType, characteristicName, child) {
49
+ const characteristic = service.getCharacteristic(characteristicType) ??
50
+ service.addCharacteristic(characteristicType);
51
+ characteristic.onGet(this.handleOnGet.bind(this, service, characteristicType, characteristicName, child));
52
+ if (characteristicType === this.platform.Characteristic.On) {
53
+ characteristic.onSet(this.handleOnSet.bind(this, service, characteristicType, characteristicName, child));
54
+ }
55
+ return service;
56
+ }
57
+ async handleOnGet(service, characteristicType, characteristicName, child) {
58
+ try {
59
+ const characteristicValue = service.getCharacteristic(characteristicType).value;
60
+ return characteristicValue ?? false;
61
+ }
62
+ catch (error) {
63
+ this.log.error(`Error getting current value for characteristic ${characteristicName} for device: ${child.alias}:`, error);
64
+ }
65
+ return false;
66
+ }
67
+ async handleOnSet(service, characteristicType, characteristicName, child, value) {
68
+ if (this.deviceManager) {
69
+ try {
70
+ this.isUpdating = true;
71
+ const characteristicMap = {
72
+ On: 'state',
73
+ };
74
+ const characteristicKey = characteristicMap[characteristicName ?? ''];
75
+ if (!characteristicKey) {
76
+ throw new Error(`Characteristic key not found for ${characteristicName}`);
77
+ }
78
+ const childNumber = parseInt(child.id.slice(-1), 10);
79
+ await this.deviceManager.controlDevice(this.deviceConfig, characteristicKey, value, childNumber);
80
+ child[characteristicKey] = value;
81
+ const childIndex = this.kasaDevice.sys_info.children?.findIndex(c => c.id === child.id);
82
+ if (childIndex !== undefined && childIndex !== -1) {
83
+ this.kasaDevice.sys_info.children[childIndex] = { ...child };
84
+ }
85
+ this.updateValue(service, service.getCharacteristic(characteristicType), child.alias, value);
86
+ this.updateValue(service, service.getCharacteristic(this.platform.Characteristic.OutletInUse), child.alias, value);
87
+ this.previousKasaDevice = JSON.parse(JSON.stringify(this.kasaDevice));
88
+ }
89
+ catch (error) {
90
+ this.logRejection(error);
91
+ }
92
+ finally {
93
+ this.isUpdating = false;
94
+ }
95
+ }
96
+ else {
97
+ throw new Error('Device manager is undefined.');
98
+ }
99
+ }
100
+ async updateState() {
101
+ if (this.isUpdating) {
102
+ this.log.debug('Update already in progress, skipping updateState');
103
+ return;
104
+ }
105
+ this.isUpdating = true;
106
+ try {
107
+ await this.getSysInfo();
108
+ this.kasaDevice.sys_info.children?.forEach((child) => {
109
+ const childNumber = parseInt(child.id.slice(-1), 10);
110
+ const service = this.homebridgeAccessory.getServiceById(this.platform.Service.Outlet, `outlet-${childNumber + 1}`);
111
+ if (service && this.previousKasaDevice) {
112
+ const previousChild = this.previousKasaDevice.sys_info.children?.find(c => c.id === child.id);
113
+ if (previousChild) {
114
+ if (previousChild.state !== child.state) {
115
+ this.updateValue(service, service.getCharacteristic(this.platform.Characteristic.On), child.alias, child.state);
116
+ this.updateValue(service, service.getCharacteristic(this.platform.Characteristic.OutletInUse), child.alias, child.state);
117
+ }
118
+ }
119
+ }
120
+ else {
121
+ this.log.warn(`Service not found for child device: ${child.alias} or previous Kasa device is undefined`);
122
+ }
123
+ });
124
+ }
125
+ catch (error) {
126
+ this.log.error('Error updating device state:', error);
127
+ }
128
+ finally {
129
+ this.isUpdating = false;
130
+ }
131
+ }
132
+ startPolling() {
133
+ setInterval(this.updateState.bind(this), this.platform.config.discoveryOptions.pollingInterval);
21
134
  }
22
135
  identify() {
23
136
  this.log.info('identify');
@@ -1 +1 @@
1
- {"version":3,"file":"homekitPowerStrip.js","sourceRoot":"","sources":["../../src/devices/homekitPowerStrip.ts"],"names":[],"mappings":"AAGA,OAAO,aAAa,MAAM,YAAY,CAAC;AAIvC,MAAM,CAAC,OAAO,OAAO,uBAAwB,SAAQ,aAAa;IAGpD;IAFZ,YACE,QAA4B,EAClB,UAAsB;QAEhC,KAAK,CACH,QAAQ,EACR,UAAU,6BAEV,QAAQ,CACT,CAAC;QAPQ,eAAU,GAAV,UAAU,CAAY;QAQhC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,oDAAoD,UAAU,CAAC,QAAQ,CAAC,KAAK,EAAE,CAAC,CAAC;QAChG,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC,KAAkB,EAAE,KAAa,EAAE,EAAE;YAC/E,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,2CAA2C,KAAK,CAAC,KAAK,EAAE,CAAC,CAAC;YACzE,IAAI,CAAC,gBAAgB,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;QACtC,CAAC,CAAC,CAAC;IACL,CAAC;IAEO,gBAAgB,CAAC,KAAkB,EAAE,KAAa;QACxD,MAAM,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC;QACzC,MAAM,aAAa,GACjB,IAAI,CAAC,mBAAmB,CAAC,cAAc,CAAC,MAAM,EAAE,UAAU,KAAK,GAAG,CAAC,EAAE,CAAC;YACtE,IAAI,CAAC,UAAU,CAAC,MAAM,EAAE,KAAK,CAAC,KAAK,EAAE,UAAU,KAAK,GAAG,CAAC,EAAE,CAAC,CAAC;QAE9D,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,8CAA8C,KAAK,CAAC,KAAK,EAAE,CAAC,CAAC;QAC5E,IAAI,CAAC,iBAAiB,CAAC,aAAa,EAAE,IAAI,CAAC,QAAQ,CAAC,cAAc,CAAC,EAAE,EAAE,KAAK,CAAC,CAAC;QAC9E,IAAI,CAAC,iBAAiB,CAAC,aAAa,EAAE,IAAI,CAAC,QAAQ,CAAC,cAAc,CAAC,WAAW,EAAE,KAAK,CAAC,CAAC;QAEvF,OAAO,aAAa,CAAC;IACvB,CAAC;IAED,QAAQ;QACN,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;IAC5B,CAAC;CACF"}
1
+ {"version":3,"file":"homekitPowerStrip.js","sourceRoot":"","sources":["../../src/devices/homekitPowerStrip.ts"],"names":[],"mappings":"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"}
@@ -3,8 +3,18 @@ import type KasaPythonPlatform from '../platform.js';
3
3
  import type { Switch } from './kasaDevices.js';
4
4
  export default class HomeKitDeviceSwitch extends HomekitDevice {
5
5
  protected kasaDevice: Switch;
6
+ private isUpdating;
7
+ private previousKasaDevice;
8
+ private getSysInfo;
6
9
  private hasBrightness;
7
10
  constructor(platform: KasaPythonPlatform, kasaDevice: Switch);
8
- private addSwitchService;
11
+ private checkService;
12
+ private checkCharacteristics;
13
+ private getOrAddCharacteristic;
14
+ private handleOnGet;
15
+ private getDefaultValue;
16
+ private handleOnSet;
17
+ protected updateState(): Promise<void>;
18
+ private startPolling;
9
19
  identify(): void;
10
20
  }
@@ -1,24 +1,134 @@
1
1
  import HomekitDevice from './index.js';
2
+ import { deferAndCombine } from '../utils.js';
2
3
  export default class HomeKitDeviceSwitch extends HomekitDevice {
3
4
  kasaDevice;
5
+ isUpdating = false;
6
+ previousKasaDevice;
7
+ getSysInfo;
4
8
  hasBrightness;
5
9
  constructor(platform, kasaDevice) {
6
10
  super(platform, kasaDevice, 8 /* Categories.SWITCH */, 'SWITCH');
7
11
  this.kasaDevice = kasaDevice;
8
12
  this.log.debug(`Initializing HomeKitDeviceSwitch for device: ${kasaDevice.sys_info.alias}`);
9
13
  this.hasBrightness = !!this.kasaDevice.feature_info.brightness;
10
- this.addSwitchService();
14
+ this.checkService();
15
+ this.getSysInfo = deferAndCombine(async () => {
16
+ if (this.deviceManager) {
17
+ this.previousKasaDevice = JSON.parse(JSON.stringify(this.kasaDevice));
18
+ this.kasaDevice.sys_info = await this.deviceManager.getSysInfo(this.deviceConfig);
19
+ }
20
+ else {
21
+ this.log.warn('Device manager is not available');
22
+ }
23
+ }, platform.config.waitTimeUpdate);
24
+ this.startPolling();
11
25
  }
12
- addSwitchService() {
26
+ checkService() {
13
27
  const { Switch, Lightbulb } = this.platform.Service;
14
28
  const serviceType = this.hasBrightness ? Lightbulb : Switch;
15
- const switchService = this.homebridgeAccessory.getService(serviceType) ?? this.addService(serviceType, this.name);
16
- this.log.debug(`Adding characteristics for ${this.hasBrightness ? 'lightbulb' : 'switch'} service: ${this.name}`);
17
- if (this.hasBrightness) {
18
- this.addCharacteristic(switchService, this.platform.Characteristic.Brightness);
29
+ const service = this.homebridgeAccessory.getService(serviceType) ?? this.addService(serviceType, this.name);
30
+ this.checkCharacteristics(service);
31
+ return service;
32
+ }
33
+ checkCharacteristics(service) {
34
+ const characteristics = [
35
+ {
36
+ type: this.platform.Characteristic.On,
37
+ name: this.platform.getCharacteristicName(this.platform.Characteristic.On),
38
+ },
39
+ this.hasBrightness && {
40
+ type: this.platform.Characteristic.Brightness,
41
+ name: this.platform.getCharacteristicName(this.platform.Characteristic.Brightness),
42
+ },
43
+ ].filter(Boolean);
44
+ characteristics.forEach(({ type, name }) => {
45
+ this.getOrAddCharacteristic(service, type, name);
46
+ });
47
+ }
48
+ getOrAddCharacteristic(service, characteristicType, characteristicName) {
49
+ const characteristic = service.getCharacteristic(characteristicType) ??
50
+ service.addCharacteristic(characteristicType);
51
+ characteristic.onGet(this.handleOnGet.bind(this, service, characteristicType, characteristicName));
52
+ characteristic.onSet(this.handleOnSet.bind(this, service, characteristicType, characteristicName));
53
+ return characteristic;
54
+ }
55
+ async handleOnGet(service, characteristicType, characteristicName) {
56
+ try {
57
+ const characteristicValue = service.getCharacteristic(characteristicType).value;
58
+ return characteristicValue ?? this.getDefaultValue(characteristicType);
59
+ }
60
+ catch (error) {
61
+ this.log.error(`Error getting current value for characteristic ${characteristicName} for device: ${this.name}:`, error);
62
+ }
63
+ return this.getDefaultValue(characteristicType);
64
+ }
65
+ getDefaultValue(characteristicType) {
66
+ if (characteristicType === this.platform.Characteristic.Brightness) {
67
+ return 0;
68
+ }
69
+ return false;
70
+ }
71
+ async handleOnSet(service, characteristicType, characteristicName, value) {
72
+ if (this.deviceManager) {
73
+ try {
74
+ this.isUpdating = true;
75
+ const characteristicMap = {
76
+ Brightness: 'brightness',
77
+ On: 'state',
78
+ };
79
+ const characteristicKey = characteristicMap[characteristicName ?? ''];
80
+ if (!characteristicKey) {
81
+ throw new Error(`Characteristic key not found for ${characteristicName}`);
82
+ }
83
+ await this.deviceManager.controlDevice(this.deviceConfig, characteristicKey, value);
84
+ this.kasaDevice.sys_info[characteristicKey] = value;
85
+ this.updateValue(service, service.getCharacteristic(characteristicType), this.name, value);
86
+ this.previousKasaDevice = JSON.parse(JSON.stringify(this.kasaDevice));
87
+ }
88
+ catch (error) {
89
+ this.logRejection(error);
90
+ }
91
+ finally {
92
+ this.isUpdating = false;
93
+ }
19
94
  }
20
- this.addCharacteristic(switchService, this.platform.Characteristic.On);
21
- return switchService;
95
+ else {
96
+ throw new Error('Device manager is undefined.');
97
+ }
98
+ }
99
+ async updateState() {
100
+ if (this.isUpdating) {
101
+ this.log.debug('Update already in progress, skipping updateState');
102
+ return;
103
+ }
104
+ this.isUpdating = true;
105
+ try {
106
+ await this.getSysInfo();
107
+ const service = this.homebridgeAccessory.getService(this.platform.Service.Switch) ??
108
+ this.homebridgeAccessory.getService(this.platform.Service.Lightbulb);
109
+ if (service && this.previousKasaDevice) {
110
+ const { state, brightness } = this.kasaDevice.sys_info;
111
+ const prevState = this.previousKasaDevice.sys_info;
112
+ if (prevState.state !== state) {
113
+ this.updateValue(service, service.getCharacteristic(this.platform.Characteristic.On), this.name, state ?? false);
114
+ }
115
+ if (this.hasBrightness && prevState.brightness !== brightness) {
116
+ this.updateValue(service, service.getCharacteristic(this.platform.Characteristic.Brightness), this.name, brightness ?? 0);
117
+ }
118
+ }
119
+ else {
120
+ this.log.warn(`Service not found for device: ${this.name} or previous Kasa device is undefined`);
121
+ }
122
+ }
123
+ catch (error) {
124
+ this.log.error('Error updating device state:', error);
125
+ }
126
+ finally {
127
+ this.isUpdating = false;
128
+ }
129
+ }
130
+ startPolling() {
131
+ setInterval(this.updateState.bind(this), this.platform.config.discoveryOptions.pollingInterval);
22
132
  }
23
133
  identify() {
24
134
  this.log.info('identify');
@@ -1 +1 @@
1
- {"version":3,"file":"homekitSwitch.js","sourceRoot":"","sources":["../../src/devices/homekitSwitch.ts"],"names":[],"mappings":"AAGA,OAAO,aAAa,MAAM,YAAY,CAAC;AAIvC,MAAM,CAAC,OAAO,OAAO,mBAAoB,SAAQ,aAAa;IAKhD;IAJJ,aAAa,CAAU;IAE/B,YACE,QAA4B,EAClB,UAAkB;QAE5B,KAAK,CACH,QAAQ,EACR,UAAU,6BAEV,QAAQ,CACT,CAAC;QAPQ,eAAU,GAAV,UAAU,CAAQ;QAQ5B,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,gDAAgD,UAAU,CAAC,QAAQ,CAAC,KAAK,EAAE,CAAC,CAAC;QAC5F,IAAI,CAAC,aAAa,GAAG,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,YAAY,CAAC,UAAU,CAAC;QAC/D,IAAI,CAAC,gBAAgB,EAAE,CAAC;IAC1B,CAAC;IAEO,gBAAgB;QACtB,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,GAAG,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC;QAEpD,MAAM,WAAW,GAAG,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC;QAE5D,MAAM,aAAa,GACjB,IAAI,CAAC,mBAAmB,CAAC,UAAU,CAAC,WAAW,CAAC,IAAI,IAAI,CAAC,UAAU,CAAC,WAAW,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;QAE9F,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,8BAA8B,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,QAAQ,aAAa,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;QAClH,IAAI,IAAI,CAAC,aAAa,EAAE,CAAC;YACvB,IAAI,CAAC,iBAAiB,CAAC,aAAa,EAAE,IAAI,CAAC,QAAQ,CAAC,cAAc,CAAC,UAAU,CAAC,CAAC;QACjF,CAAC;QACD,IAAI,CAAC,iBAAiB,CAAC,aAAa,EAAE,IAAI,CAAC,QAAQ,CAAC,cAAc,CAAC,EAAE,CAAC,CAAC;QAEvE,OAAO,aAAa,CAAC;IACvB,CAAC;IAED,QAAQ;QACN,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;IAC5B,CAAC;CACF"}
1
+ {"version":3,"file":"homekitSwitch.js","sourceRoot":"","sources":["../../src/devices/homekitSwitch.ts"],"names":[],"mappings":"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"}
@@ -1,7 +1,7 @@
1
- import { Categories, Characteristic, CharacteristicValue, HapStatusError, Logger, Nullable, PlatformAccessory, Service, WithUUID } from 'homebridge';
1
+ import { Categories, Characteristic, CharacteristicValue, HapStatusError, Logger, Nullable, PlatformAccessory, Service } from 'homebridge';
2
2
  import DeviceManager from './deviceManager.js';
3
3
  import type KasaPythonPlatform from '../platform.js';
4
- import type { ChildDevice, DeviceConfig, KasaDevice } from './kasaDevices.js';
4
+ import type { DeviceConfig, KasaDevice } from './kasaDevices.js';
5
5
  import type { KasaPythonAccessoryContext } from '../platform.js';
6
6
  export default abstract class HomekitDevice {
7
7
  readonly platform: KasaPythonPlatform;
@@ -12,9 +12,6 @@ export default abstract class HomekitDevice {
12
12
  readonly deviceConfig: DeviceConfig;
13
13
  protected deviceManager: DeviceManager | undefined;
14
14
  homebridgeAccessory: PlatformAccessory<KasaPythonAccessoryContext>;
15
- private isUpdating;
16
- private previousKasaDevice;
17
- private getSysInfo;
18
15
  constructor(platform: KasaPythonPlatform, kasaDevice: KasaDevice, category: Categories, categoryName: string);
19
16
  private initializeAccessory;
20
17
  private updateAccessory;
@@ -26,14 +23,7 @@ export default abstract class HomekitDevice {
26
23
  get serialNumber(): string;
27
24
  get firmwareRevision(): string;
28
25
  abstract identify(): void;
29
- updateValue(service: Service, characteristic: Characteristic, value: Nullable<CharacteristicValue> | Error | HapStatusError, childDeviceAlias?: string): void;
30
26
  addService(serviceConstructor: typeof this.platform.Service.Outlet, name: string, subType?: string): Service;
31
- protected logRejection(reason: unknown): void;
32
- protected addCharacteristic(service: Service, characteristicType: WithUUID<new () => Characteristic>, child?: ChildDevice): Service;
33
- private handleOnGet;
34
- private getCharacteristicValue;
35
- private getDefaultValue;
36
- private handleOnSet;
37
- protected updateState(): Promise<void>;
38
- private startPolling;
27
+ updateValue(service: Service, characteristic: Characteristic, deviceAlias: string, value: Nullable<CharacteristicValue> | Error | HapStatusError): void;
28
+ logRejection(reason: unknown): void;
39
29
  }