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.
- package/README.md +1 -1
- package/config.schema.json +17 -2
- package/dist/accessoryInformation.d.ts +2 -2
- package/dist/accessoryInformation.js +24 -28
- package/dist/accessoryInformation.js.map +1 -1
- package/dist/config.d.ts +5 -1
- package/dist/config.js +24 -16
- package/dist/config.js.map +1 -1
- package/dist/devices/baseDevice.d.ts +61 -0
- package/dist/devices/baseDevice.js +361 -0
- package/dist/devices/baseDevice.js.map +1 -0
- package/dist/devices/baseParent.d.ts +19 -0
- package/dist/devices/baseParent.js +150 -0
- package/dist/devices/baseParent.js.map +1 -0
- package/dist/devices/create.d.ts +3 -3
- package/dist/devices/create.js +21 -27
- package/dist/devices/create.js.map +1 -1
- package/dist/devices/descriptorHelpers.d.ts +14 -0
- package/dist/devices/descriptorHelpers.js +146 -0
- package/dist/devices/descriptorHelpers.js.map +1 -0
- package/dist/devices/deviceManager.d.ts +13 -13
- package/dist/devices/deviceManager.js +115 -137
- package/dist/devices/deviceManager.js.map +1 -1
- package/dist/devices/{kasaDevices.d.ts → deviceTypes.d.ts} +58 -42
- package/dist/devices/deviceTypes.js +20 -0
- package/dist/devices/deviceTypes.js.map +1 -0
- package/dist/devices/homekitLightBulb.d.ts +7 -28
- package/dist/devices/homekitLightBulb.js +42 -365
- package/dist/devices/homekitLightBulb.js.map +1 -1
- package/dist/devices/homekitPlug.d.ts +6 -25
- package/dist/devices/homekitPlug.js +21 -322
- package/dist/devices/homekitPlug.js.map +1 -1
- package/dist/devices/homekitPowerStrip.d.ts +6 -26
- package/dist/devices/homekitPowerStrip.js +25 -345
- package/dist/devices/homekitPowerStrip.js.map +1 -1
- package/dist/devices/homekitSwitch.d.ts +5 -26
- package/dist/devices/homekitSwitch.js +18 -302
- package/dist/devices/homekitSwitch.js.map +1 -1
- package/dist/devices/homekitSwitchWithChildren.d.ts +5 -29
- package/dist/devices/homekitSwitchWithChildren.js +24 -371
- package/dist/devices/homekitSwitchWithChildren.js.map +1 -1
- package/dist/energyCharacteristics.d.ts +8 -0
- package/dist/energyCharacteristics.js +88 -0
- package/dist/energyCharacteristics.js.map +1 -0
- package/dist/platform.d.ts +4 -2
- package/dist/platform.js +68 -63
- package/dist/platform.js.map +1 -1
- package/dist/python/kasaApi.py +68 -55
- package/dist/python/pythonChecker.js +2 -2
- package/dist/python/pythonChecker.js.map +1 -1
- package/package.json +15 -15
- package/requirements.txt +2 -2
- package/dist/devices/index.d.ts +0 -33
- package/dist/devices/index.js +0 -100
- package/dist/devices/index.js.map +0 -1
- package/dist/devices/kasaDevices.js +0 -102
- package/dist/devices/kasaDevices.js.map +0 -1
package/README.md
CHANGED
package/config.schema.json
CHANGED
|
@@ -41,6 +41,12 @@
|
|
|
41
41
|
"functionBody": "return model.enableCredentials && model.username && model.username !== '';"
|
|
42
42
|
}
|
|
43
43
|
},
|
|
44
|
+
"enableEnergyMonitoring": {
|
|
45
|
+
"title": "Enable Energy Monitoring",
|
|
46
|
+
"type": "boolean",
|
|
47
|
+
"description": "Enable to add energy monitoring characteristics (Volts, Amperes, Watts, KiloWattHours) to supported devices.",
|
|
48
|
+
"default": false
|
|
49
|
+
},
|
|
44
50
|
"hideHomeKitMatter": {
|
|
45
51
|
"title": "Hide HomeKit or Matter Devices",
|
|
46
52
|
"type": "boolean",
|
|
@@ -133,6 +139,12 @@
|
|
|
133
139
|
"type": "boolean",
|
|
134
140
|
"description": "Enable detailed logging for Python scripts. Only shows logs when Debug Mode in Homebridge is enabled.",
|
|
135
141
|
"default": false
|
|
142
|
+
},
|
|
143
|
+
"logEnergyMonitoring": {
|
|
144
|
+
"title": "Log Energy Monitoring Events",
|
|
145
|
+
"type": "boolean",
|
|
146
|
+
"description": "Enable logging of power/energy monitoring characteristic updates (Volts, Amperes, Watts, KiloWattHours).",
|
|
147
|
+
"default": false
|
|
136
148
|
}
|
|
137
149
|
}
|
|
138
150
|
},
|
|
@@ -151,6 +163,7 @@
|
|
|
151
163
|
"type": "help",
|
|
152
164
|
"helpvalue": "Username and Password will be required for specific devices only."
|
|
153
165
|
},
|
|
166
|
+
"enableEnergyMonitoring",
|
|
154
167
|
{
|
|
155
168
|
"type": "fieldset",
|
|
156
169
|
"title": "HomeKit (Optional)",
|
|
@@ -195,7 +208,8 @@
|
|
|
195
208
|
"key": "manualDevices",
|
|
196
209
|
"type": "array",
|
|
197
210
|
"items": [
|
|
198
|
-
"manualDevices[].host",
|
|
211
|
+
"manualDevices[].host",
|
|
212
|
+
"manualDevices[].alias"
|
|
199
213
|
]
|
|
200
214
|
},
|
|
201
215
|
{
|
|
@@ -246,7 +260,8 @@
|
|
|
246
260
|
"items": [
|
|
247
261
|
"waitTimeUpdate",
|
|
248
262
|
"pythonPath",
|
|
249
|
-
"advancedPythonLogging"
|
|
263
|
+
"advancedPythonLogging",
|
|
264
|
+
"logEnergyMonitoring"
|
|
250
265
|
]
|
|
251
266
|
}
|
|
252
267
|
]
|
|
@@ -1,3 +1,3 @@
|
|
|
1
1
|
import type { HAP, PlatformAccessory, Service } from 'homebridge';
|
|
2
|
-
import type HomeKitDevice from './devices/
|
|
3
|
-
export default function platformAccessoryInformation(hap: HAP): (
|
|
2
|
+
import type HomeKitDevice from './devices/baseDevice.js';
|
|
3
|
+
export default function platformAccessoryInformation(hap: HAP): (accessory: PlatformAccessory, homekitDevice: HomeKitDevice) => Service | undefined;
|
|
@@ -1,35 +1,31 @@
|
|
|
1
1
|
export default function platformAccessoryInformation(hap) {
|
|
2
2
|
const { Characteristic, Service: { AccessoryInformation } } = hap;
|
|
3
|
-
return (
|
|
4
|
-
|
|
5
|
-
if (
|
|
6
|
-
|
|
7
|
-
existingInfoService.setCharacteristic(Characteristic.Name, homekitDevice.name);
|
|
8
|
-
}
|
|
9
|
-
else if (existingInfoService.getCharacteristic(Characteristic.Manufacturer).value !== homekitDevice.manufacturer) {
|
|
10
|
-
existingInfoService.setCharacteristic(Characteristic.Manufacturer, homekitDevice.manufacturer);
|
|
11
|
-
}
|
|
12
|
-
else if (existingInfoService.getCharacteristic(Characteristic.Model).value !== homekitDevice.model) {
|
|
13
|
-
existingInfoService.setCharacteristic(Characteristic.Model, homekitDevice.model);
|
|
14
|
-
}
|
|
15
|
-
else if (existingInfoService.getCharacteristic(Characteristic.SerialNumber).value !== homekitDevice.serialNumber) {
|
|
16
|
-
existingInfoService.setCharacteristic(Characteristic.SerialNumber, homekitDevice.serialNumber);
|
|
17
|
-
}
|
|
18
|
-
else if (existingInfoService.getCharacteristic(Characteristic.FirmwareRevision).value !== homekitDevice.firmwareRevision) {
|
|
19
|
-
existingInfoService.setCharacteristic(Characteristic.FirmwareRevision, homekitDevice.firmwareRevision);
|
|
20
|
-
}
|
|
21
|
-
return existingInfoService;
|
|
3
|
+
return (accessory, homekitDevice) => {
|
|
4
|
+
let infoService = accessory.getService(AccessoryInformation);
|
|
5
|
+
if (!infoService) {
|
|
6
|
+
infoService = accessory.addService(AccessoryInformation);
|
|
22
7
|
}
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
.setCharacteristic(Characteristic.FirmwareRevision, homekitDevice.firmwareRevision);
|
|
31
|
-
return infoService;
|
|
8
|
+
const nameCharacteristic = infoService.getCharacteristic(Characteristic.Name);
|
|
9
|
+
const manufacturerCharacteristic = infoService.getCharacteristic(Characteristic.Manufacturer);
|
|
10
|
+
const modelCharacteristic = infoService.getCharacteristic(Characteristic.Model);
|
|
11
|
+
const serialCharacteristic = infoService.getCharacteristic(Characteristic.SerialNumber);
|
|
12
|
+
const firmwareCharacteristic = infoService.getCharacteristic(Characteristic.FirmwareRevision);
|
|
13
|
+
if (nameCharacteristic.value !== homekitDevice.name) {
|
|
14
|
+
infoService.setCharacteristic(Characteristic.Name, homekitDevice.name);
|
|
32
15
|
}
|
|
16
|
+
if (manufacturerCharacteristic.value !== homekitDevice.manufacturer) {
|
|
17
|
+
infoService.setCharacteristic(Characteristic.Manufacturer, homekitDevice.manufacturer);
|
|
18
|
+
}
|
|
19
|
+
if (modelCharacteristic.value !== homekitDevice.model) {
|
|
20
|
+
infoService.setCharacteristic(Characteristic.Model, homekitDevice.model);
|
|
21
|
+
}
|
|
22
|
+
if (serialCharacteristic.value !== homekitDevice.serialNumber) {
|
|
23
|
+
infoService.setCharacteristic(Characteristic.SerialNumber, homekitDevice.serialNumber);
|
|
24
|
+
}
|
|
25
|
+
if (firmwareCharacteristic.value !== homekitDevice.firmwareRevision) {
|
|
26
|
+
infoService.setCharacteristic(Characteristic.FirmwareRevision, homekitDevice.firmwareRevision);
|
|
27
|
+
}
|
|
28
|
+
return infoService;
|
|
33
29
|
};
|
|
34
30
|
}
|
|
35
31
|
//# sourceMappingURL=accessoryInformation.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"accessoryInformation.js","sourceRoot":"","sources":["../src/accessoryInformation.ts"],"names":[],"mappings":"AAIA,MAAM,CAAC,OAAO,UAAU,4BAA4B,CAClD,GAAQ;IAER,MAAM,EAAE,cAAc,EAAE,OAAO,EAAE,EAAE,oBAAoB,EAAE,EAAE,GAAG,GAAG,CAAC;IAElE,OAAO,CAAC,
|
|
1
|
+
{"version":3,"file":"accessoryInformation.js","sourceRoot":"","sources":["../src/accessoryInformation.ts"],"names":[],"mappings":"AAIA,MAAM,CAAC,OAAO,UAAU,4BAA4B,CAClD,GAAQ;IAER,MAAM,EAAE,cAAc,EAAE,OAAO,EAAE,EAAE,oBAAoB,EAAE,EAAE,GAAG,GAAG,CAAC;IAElE,OAAO,CAAC,SAA4B,EAAE,aAA4B,EAAE,EAAE;QACpE,IAAI,WAAW,GAAG,SAAS,CAAC,UAAU,CAAC,oBAAoB,CAAC,CAAC;QAC7D,IAAI,CAAC,WAAW,EAAE,CAAC;YACjB,WAAW,GAAG,SAAS,CAAC,UAAU,CAAC,oBAAoB,CAAC,CAAC;QAC3D,CAAC;QAED,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;QAC9F,IAAI,kBAAkB,CAAC,KAAK,KAAK,aAAa,CAAC,IAAI,EAAE,CAAC;YACpD,WAAW,CAAC,iBAAiB,CAAC,cAAc,CAAC,IAAI,EAAE,aAAa,CAAC,IAAI,CAAC,CAAC;QACzE,CAAC;QACD,IAAI,0BAA0B,CAAC,KAAK,KAAK,aAAa,CAAC,YAAY,EAAE,CAAC;YACpE,WAAW,CAAC,iBAAiB,CAAC,cAAc,CAAC,YAAY,EAAE,aAAa,CAAC,YAAY,CAAC,CAAC;QACzF,CAAC;QACD,IAAI,mBAAmB,CAAC,KAAK,KAAK,aAAa,CAAC,KAAK,EAAE,CAAC;YACtD,WAAW,CAAC,iBAAiB,CAAC,cAAc,CAAC,KAAK,EAAE,aAAa,CAAC,KAAK,CAAC,CAAC;QAC3E,CAAC;QACD,IAAI,oBAAoB,CAAC,KAAK,KAAK,aAAa,CAAC,YAAY,EAAE,CAAC;YAC9D,WAAW,CAAC,iBAAiB,CAAC,cAAc,CAAC,YAAY,EAAE,aAAa,CAAC,YAAY,CAAC,CAAC;QACzF,CAAC;QACD,IAAI,sBAAsB,CAAC,KAAK,KAAK,aAAa,CAAC,gBAAgB,EAAE,CAAC;YACpE,WAAW,CAAC,iBAAiB,CAAC,cAAc,CAAC,gBAAgB,EAAE,aAAa,CAAC,gBAAgB,CAAC,CAAC;QACjG,CAAC;QAED,OAAO,WAAW,CAAC;IACrB,CAAC,CAAC;AACJ,CAAC"}
|
package/dist/config.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { ConfigDevice } from './devices/
|
|
1
|
+
import type { ConfigDevice } from './devices/deviceTypes.js';
|
|
2
2
|
export declare class ConfigParseError extends Error {
|
|
3
3
|
errors?: string[] | null | undefined;
|
|
4
4
|
unknownError?: unknown | undefined;
|
|
@@ -10,6 +10,7 @@ export interface KasaPythonConfigInput {
|
|
|
10
10
|
enableCredentials?: boolean;
|
|
11
11
|
username?: string;
|
|
12
12
|
password?: string;
|
|
13
|
+
enableEnergyMonitoring?: boolean;
|
|
13
14
|
hideHomeKitMatter?: boolean;
|
|
14
15
|
pollingInterval?: number;
|
|
15
16
|
discoveryPollingInterval?: number;
|
|
@@ -21,12 +22,14 @@ export interface KasaPythonConfigInput {
|
|
|
21
22
|
waitTimeUpdate?: number;
|
|
22
23
|
pythonPath?: string;
|
|
23
24
|
advancedPythonLogging?: boolean;
|
|
25
|
+
logEnergyMonitoring?: boolean;
|
|
24
26
|
}
|
|
25
27
|
export type KasaPythonConfig = {
|
|
26
28
|
name: string;
|
|
27
29
|
enableCredentials: boolean;
|
|
28
30
|
username: string;
|
|
29
31
|
password: string;
|
|
32
|
+
enableEnergyMonitoring: boolean;
|
|
30
33
|
homekitOptions: {
|
|
31
34
|
hideHomeKitMatter: boolean;
|
|
32
35
|
};
|
|
@@ -43,6 +46,7 @@ export type KasaPythonConfig = {
|
|
|
43
46
|
waitTimeUpdate: number;
|
|
44
47
|
pythonPath?: string;
|
|
45
48
|
advancedPythonLogging: boolean;
|
|
49
|
+
logEnergyMonitoring: boolean;
|
|
46
50
|
};
|
|
47
51
|
};
|
|
48
52
|
export declare const defaultConfig: KasaPythonConfig;
|
package/dist/config.js
CHANGED
|
@@ -30,6 +30,7 @@ export const defaultConfig = {
|
|
|
30
30
|
enableCredentials: false,
|
|
31
31
|
username: '',
|
|
32
32
|
password: '',
|
|
33
|
+
enableEnergyMonitoring: false,
|
|
33
34
|
homekitOptions: {
|
|
34
35
|
hideHomeKitMatter: true,
|
|
35
36
|
},
|
|
@@ -46,6 +47,7 @@ export const defaultConfig = {
|
|
|
46
47
|
waitTimeUpdate: 100,
|
|
47
48
|
pythonPath: '',
|
|
48
49
|
advancedPythonLogging: false,
|
|
50
|
+
logEnergyMonitoring: false,
|
|
49
51
|
},
|
|
50
52
|
};
|
|
51
53
|
function convertManualDevices(manualDevices) {
|
|
@@ -71,6 +73,7 @@ function validateConfig(config) {
|
|
|
71
73
|
validateType(config, 'enableCredentials', 'boolean', errors);
|
|
72
74
|
validateType(config, 'username', 'string', errors);
|
|
73
75
|
validateType(config, 'password', 'string', errors);
|
|
76
|
+
validateType(config, 'enableEnergyMonitoring', 'boolean', errors);
|
|
74
77
|
validateType(config, 'hideHomeKitMatter', 'boolean', errors);
|
|
75
78
|
validateType(config, 'pollingInterval', 'number', errors);
|
|
76
79
|
validateType(config, 'discoveryPollingInterval', 'number', errors);
|
|
@@ -90,6 +93,7 @@ function validateConfig(config) {
|
|
|
90
93
|
validateType(config, 'waitTimeUpdate', 'number', errors);
|
|
91
94
|
validateType(config, 'pythonPath', 'string', errors);
|
|
92
95
|
validateType(config, 'advancedPythonLogging', 'boolean', errors);
|
|
96
|
+
validateType(config, 'logEnergyMonitoring', 'boolean', errors);
|
|
93
97
|
return errors;
|
|
94
98
|
}
|
|
95
99
|
function validateType(config, key, expectedType, errors) {
|
|
@@ -105,28 +109,32 @@ export function parseConfig(config) {
|
|
|
105
109
|
if (!isObjectLike(config)) {
|
|
106
110
|
throw new ConfigParseError('Error parsing config');
|
|
107
111
|
}
|
|
108
|
-
const
|
|
112
|
+
const parsedConfig = { ...defaultConfig, ...config };
|
|
109
113
|
return {
|
|
110
|
-
name:
|
|
111
|
-
enableCredentials:
|
|
112
|
-
username:
|
|
113
|
-
password:
|
|
114
|
+
name: parsedConfig.name ?? defaultConfig.name,
|
|
115
|
+
enableCredentials: parsedConfig.enableCredentials ?? defaultConfig.enableCredentials,
|
|
116
|
+
username: parsedConfig.username ?? defaultConfig.username,
|
|
117
|
+
password: parsedConfig.password ?? defaultConfig.password,
|
|
118
|
+
enableEnergyMonitoring: parsedConfig.enableEnergyMonitoring ?? defaultConfig.enableEnergyMonitoring,
|
|
114
119
|
homekitOptions: {
|
|
115
|
-
hideHomeKitMatter:
|
|
120
|
+
hideHomeKitMatter: parsedConfig.hideHomeKitMatter ?? defaultConfig.homekitOptions.hideHomeKitMatter,
|
|
116
121
|
},
|
|
117
122
|
discoveryOptions: {
|
|
118
|
-
pollingInterval: (
|
|
119
|
-
discoveryPollingInterval: (
|
|
120
|
-
offlineInterval: (
|
|
121
|
-
additionalBroadcasts:
|
|
122
|
-
manualDevices:
|
|
123
|
-
|
|
124
|
-
|
|
123
|
+
pollingInterval: (parsedConfig.pollingInterval ?? defaultConfig.discoveryOptions.pollingInterval) * 1000,
|
|
124
|
+
discoveryPollingInterval: (parsedConfig.discoveryPollingInterval ?? defaultConfig.discoveryOptions.discoveryPollingInterval) * 1000,
|
|
125
|
+
offlineInterval: (parsedConfig.offlineInterval ?? defaultConfig.discoveryOptions.offlineInterval) * 24 * 60 * 60 * 1000,
|
|
126
|
+
additionalBroadcasts: parsedConfig.additionalBroadcasts ?? defaultConfig.discoveryOptions.additionalBroadcasts,
|
|
127
|
+
manualDevices: parsedConfig.manualDevices
|
|
128
|
+
? convertManualDevices(parsedConfig.manualDevices)
|
|
129
|
+
: defaultConfig.discoveryOptions.manualDevices,
|
|
130
|
+
excludeMacAddresses: parsedConfig.excludeMacAddresses ?? defaultConfig.discoveryOptions.excludeMacAddresses,
|
|
131
|
+
includeMacAddresses: parsedConfig.includeMacAddresses ?? defaultConfig.discoveryOptions.includeMacAddresses,
|
|
125
132
|
},
|
|
126
133
|
advancedOptions: {
|
|
127
|
-
waitTimeUpdate:
|
|
128
|
-
pythonPath:
|
|
129
|
-
advancedPythonLogging:
|
|
134
|
+
waitTimeUpdate: parsedConfig.waitTimeUpdate ?? defaultConfig.advancedOptions.waitTimeUpdate,
|
|
135
|
+
pythonPath: parsedConfig.pythonPath ?? defaultConfig.advancedOptions.pythonPath,
|
|
136
|
+
advancedPythonLogging: parsedConfig.advancedPythonLogging ?? defaultConfig.advancedOptions.advancedPythonLogging,
|
|
137
|
+
logEnergyMonitoring: parsedConfig.logEnergyMonitoring ?? defaultConfig.advancedOptions.logEnergyMonitoring,
|
|
130
138
|
},
|
|
131
139
|
};
|
|
132
140
|
}
|
package/dist/config.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAG1C,MAAM,OAAO,gBAAiB,SAAQ,KAAK;IAGhC;IACA;IAHT,YACE,OAAe,EACR,MAAwB,EACxB,YAAsB;QAE7B,KAAK,CAAC,OAAO,CAAC,CAAC;QAHR,WAAM,GAAN,MAAM,CAAkB;QACxB,iBAAY,GAAZ,YAAY,CAAU;QAG7B,IAAI,CAAC,IAAI,GAAG,kBAAkB,CAAC;QAC/B,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,aAAa,CAAC,OAAO,EAAE,MAAM,EAAE,YAAY,CAAC,CAAC;QACjE,KAAK,CAAC,iBAAiB,CAAC,IAAI,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC;IAClD,CAAC;IAEO,aAAa,CACnB,OAAe,EACf,MAAwB,EACxB,YAAsB;QAEtB,IAAI,gBAAgB,GAAG,OAAO,CAAC;QAC/B,IAAI,MAAM,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAChC,MAAM,cAAc,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACzC,gBAAgB,IAAI,MAAM,cAAc,EAAE,CAAC;QAC7C,CAAC;QACD,IAAI,YAAY,YAAY,KAAK,EAAE,CAAC;YAClC,gBAAgB,IAAI,uBAAuB,YAAY,CAAC,OAAO,EAAE,CAAC;QACpE,CAAC;aAAM,IAAI,YAAY,EAAE,CAAC;YACxB,gBAAgB,IAAI,qDAAqD,YAAY,GAAG,CAAC;QAC3F,CAAC;QACD,OAAO,gBAAgB,CAAC;IAC1B,CAAC;CACF;
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,61 @@
|
|
|
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 KasaPythonPlatform from '../platform.js';
|
|
5
|
+
import type { CharacteristicDescriptor, ChildDevice, DescriptorContext, KasaDevice, SysInfo } from './deviceTypes.js';
|
|
6
|
+
import type { KasaPythonAccessoryContext } from '../platform.js';
|
|
7
|
+
export default abstract class HomeKitDevice {
|
|
8
|
+
readonly platform: KasaPythonPlatform;
|
|
9
|
+
kasaDevice: KasaDevice;
|
|
10
|
+
readonly category: Categories;
|
|
11
|
+
readonly categoryName: string;
|
|
12
|
+
readonly log: Logger;
|
|
13
|
+
protected deviceManager: DeviceManager | undefined;
|
|
14
|
+
homebridgeAccessory: PlatformAccessory<KasaPythonAccessoryContext>;
|
|
15
|
+
isUpdating: boolean;
|
|
16
|
+
protected previousSnapshot?: KasaDevice;
|
|
17
|
+
protected pollingInterval?: NodeJS.Timeout;
|
|
18
|
+
protected updateEmitter: EventEmitter<[never]>;
|
|
19
|
+
private static locks;
|
|
20
|
+
protected getSysInfoDeferred: () => Promise<void>;
|
|
21
|
+
private primaryDescriptors;
|
|
22
|
+
private primaryService?;
|
|
23
|
+
constructor(platform: KasaPythonPlatform, kasaDevice: KasaDevice, category: Categories, categoryName: string);
|
|
24
|
+
private initializeAccessory;
|
|
25
|
+
private updateAccessory;
|
|
26
|
+
get id(): string;
|
|
27
|
+
get name(): string;
|
|
28
|
+
get manufacturer(): string;
|
|
29
|
+
get model(): string;
|
|
30
|
+
get serialNumber(): string;
|
|
31
|
+
get firmwareRevision(): string;
|
|
32
|
+
protected extractChildIndex(child: {
|
|
33
|
+
id?: string | number;
|
|
34
|
+
}): number;
|
|
35
|
+
protected makeLockKey(childId?: string | number): string;
|
|
36
|
+
protected withLock<T>(key: string, action: () => Promise<T>): Promise<T>;
|
|
37
|
+
protected shouldSkipUpdate(): boolean;
|
|
38
|
+
protected waitForUpdateOrDiscovery(): Promise<void>;
|
|
39
|
+
protected getSysInfo(): Promise<void>;
|
|
40
|
+
private fetchSysInfoInternal;
|
|
41
|
+
protected refreshAndUpdateCharacteristics(forceUpdate: boolean): Promise<void>;
|
|
42
|
+
startPolling(): Promise<void>;
|
|
43
|
+
stopPolling(): Promise<void>;
|
|
44
|
+
updateAfterPeriodicDiscovery(): void;
|
|
45
|
+
protected setupPrimaryService(): void;
|
|
46
|
+
protected getPrimaryServiceType(): WithUUID<typeof this.platform.Service> | null;
|
|
47
|
+
protected buildPrimaryDescriptors(): CharacteristicDescriptor[];
|
|
48
|
+
protected registerCharacteristic(service: Service, type: WithUUID<new () => Characteristic>, onGet: () => Promise<CharacteristicValue>, onSet?: (value: CharacteristicValue) => Promise<void>): void;
|
|
49
|
+
protected buildDescriptorContext(child?: ChildDevice): DescriptorContext;
|
|
50
|
+
protected updateDeviceField<K extends keyof SysInfo>(key: K, value: SysInfo[K]): void;
|
|
51
|
+
private genericOnGet;
|
|
52
|
+
private genericOnSet;
|
|
53
|
+
private executeDescriptorSet;
|
|
54
|
+
protected updateAllServicesAndCharacteristics(forceUpdate: boolean): Promise<void>;
|
|
55
|
+
protected defaultValueForCharacteristic(type: WithUUID<new () => Characteristic>): CharacteristicValue;
|
|
56
|
+
protected updateIfChanged<T extends CharacteristicValue>(service: Service, characteristic: Characteristic, alias: string, previousValue: T, nextValue: T, label?: string, force?: boolean): void;
|
|
57
|
+
protected addService(serviceCtor: WithUUID<typeof this.platform.Service>, name: string, subType?: string): Service;
|
|
58
|
+
protected updateValue(service: Service, characteristic: Characteristic, deviceAlias: string, value: Nullable<CharacteristicValue> | Error | HapStatusError): void;
|
|
59
|
+
abstract initialize(): Promise<void>;
|
|
60
|
+
abstract identify(): void;
|
|
61
|
+
}
|