homebridge-kasa-python 1.0.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 (51) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +398 -0
  3. package/config.schema.json +214 -0
  4. package/dist/accessoryInformation.d.ts +3 -0
  5. package/dist/accessoryInformation.js +24 -0
  6. package/dist/accessoryInformation.js.map +1 -0
  7. package/dist/config.d.ts +186 -0
  8. package/dist/config.js +154 -0
  9. package/dist/config.js.map +1 -0
  10. package/dist/devices/create.d.ts +10 -0
  11. package/dist/devices/create.js +20 -0
  12. package/dist/devices/create.js.map +1 -0
  13. package/dist/devices/deviceManager.d.ts +15 -0
  14. package/dist/devices/deviceManager.js +157 -0
  15. package/dist/devices/deviceManager.js.map +1 -0
  16. package/dist/devices/homekitPlug.d.ts +23 -0
  17. package/dist/devices/homekitPlug.js +101 -0
  18. package/dist/devices/homekitPlug.js.map +1 -0
  19. package/dist/devices/homekitPowerstrip.d.ts +23 -0
  20. package/dist/devices/homekitPowerstrip.js +103 -0
  21. package/dist/devices/homekitPowerstrip.js.map +1 -0
  22. package/dist/devices/index.d.ts +36 -0
  23. package/dist/devices/index.js +118 -0
  24. package/dist/devices/index.js.map +1 -0
  25. package/dist/devices/kasaDevices.d.ts +48 -0
  26. package/dist/devices/kasaDevices.js +2 -0
  27. package/dist/devices/kasaDevices.js.map +1 -0
  28. package/dist/index.d.ts +3 -0
  29. package/dist/index.js +6 -0
  30. package/dist/index.js.map +1 -0
  31. package/dist/platform.d.ts +57 -0
  32. package/dist/platform.js +182 -0
  33. package/dist/platform.js.map +1 -0
  34. package/dist/python/discover.py +38 -0
  35. package/dist/python/getSysInfo.py +39 -0
  36. package/dist/python/pythonChecker.d.ts +31 -0
  37. package/dist/python/pythonChecker.js +195 -0
  38. package/dist/python/pythonChecker.js.map +1 -0
  39. package/dist/python/pythonHome.py +3 -0
  40. package/dist/python/turnOff.py +20 -0
  41. package/dist/python/turnOffChild.py +22 -0
  42. package/dist/python/turnOn.py +20 -0
  43. package/dist/python/turnOnChild.py +22 -0
  44. package/dist/settings.d.ts +2 -0
  45. package/dist/settings.js +3 -0
  46. package/dist/settings.js.map +1 -0
  47. package/dist/utils.d.ts +30 -0
  48. package/dist/utils.js +172 -0
  49. package/dist/utils.js.map +1 -0
  50. package/package.json +79 -0
  51. package/requirements.txt +1 -0
package/dist/utils.js ADDED
@@ -0,0 +1,172 @@
1
+ import { spawn } from 'child_process';
2
+ import { writeFile } from 'fs/promises';
3
+ export function isObjectLike(candidate) {
4
+ return ((typeof candidate === 'object' && candidate !== null) ||
5
+ typeof candidate === 'function');
6
+ }
7
+ /**
8
+ * Creates a function that will "batch" calls that are within the `timeout`
9
+ *
10
+ * The first time the function that is created is called, it will wait the `timeout` for additional calls.
11
+ * After the `timeout` expires the result of one execution of `fn` will be resolved to all calls during the `timeout`.
12
+ *
13
+ * If `runNowFn` is specified it will be run synchronously without a timeout. Useful for functions that are used to set rather than get.
14
+ *
15
+ * @param {() => Promise<T>} fn
16
+ * @param {number} timeout (ms)
17
+ * @param {(arg: U) => void} [runNowFn]
18
+ * @returns {(arg?: U) => Promise<T>}
19
+ */
20
+ export function deferAndCombine(fn, timeout, runNowFn) {
21
+ const requests = [];
22
+ let isWaiting = false;
23
+ return (arg) => {
24
+ if (runNowFn !== undefined && arg !== undefined) {
25
+ runNowFn(arg);
26
+ }
27
+ return new Promise((resolve, reject) => {
28
+ requests.push({ resolve, reject });
29
+ if (isWaiting) {
30
+ return;
31
+ }
32
+ isWaiting = true;
33
+ setTimeout(() => {
34
+ isWaiting = false;
35
+ fn(requests.length)
36
+ .then((value) => {
37
+ for (const d of requests) {
38
+ d.resolve(value);
39
+ }
40
+ })
41
+ .catch((error) => {
42
+ for (const d of requests) {
43
+ d.reject(error);
44
+ }
45
+ });
46
+ }, timeout);
47
+ });
48
+ };
49
+ }
50
+ export function delay(ms) {
51
+ return new Promise((resolve) => {
52
+ setTimeout(resolve, ms);
53
+ });
54
+ }
55
+ export function getOrAddCharacteristic(service, characteristic) {
56
+ if (!hasCharacteristic(service.characteristics.concat(service.optionalCharacteristics), characteristic)) {
57
+ // This it to suppress warning: Characteristic not in required or optional characteristic section for service
58
+ service.addOptionalCharacteristic(characteristic);
59
+ }
60
+ return (service.getCharacteristic(characteristic) ||
61
+ service.addCharacteristic(characteristic));
62
+ }
63
+ export function hasCharacteristic(characteristics, characteristic) {
64
+ return (characteristics.find((char) =>
65
+ // @ts-expect-error: still want to check UUID
66
+ char instanceof characteristic || char.UUID === characteristic.UUID) !== undefined);
67
+ }
68
+ export function kelvinToMired(kelvin) {
69
+ return 1e6 / kelvin;
70
+ }
71
+ export function lookup(object, compareFn, value) {
72
+ const compare = compareFn ??
73
+ ((objectProp, search) => objectProp === search);
74
+ if (isObjectLike(object)) {
75
+ const keys = Object.keys(object);
76
+ for (let i = 0; i < keys.length; i += 1) {
77
+ if (compare(object[keys[i]], value)) {
78
+ return keys[i];
79
+ }
80
+ }
81
+ }
82
+ return undefined;
83
+ }
84
+ export function lookupCharacteristicNameByUUID(characteristic, uuid) {
85
+ const keys = Object.keys(characteristic);
86
+ for (let i = 0; i < keys.length; i += 1) {
87
+ const key = keys[i];
88
+ // @ts-expect-error: not sure how to make this correct in typescript
89
+ const c = characteristic[key];
90
+ if ('UUID' in c && c.UUID === uuid) {
91
+ return key;
92
+ }
93
+ }
94
+ return undefined;
95
+ }
96
+ export function miredToKelvin(mired) {
97
+ return 1e6 / mired;
98
+ }
99
+ export async function runCommand(logger, command, args, options, hideStdout = false, hideStderr = false) {
100
+ let stdout = '';
101
+ let stderr = '';
102
+ let redirectOutputToFile = false;
103
+ let outputFile = '';
104
+ if (args) {
105
+ const argsBeforeRedirect = [];
106
+ for (const arg of args) {
107
+ if (arg.startsWith('>')) {
108
+ redirectOutputToFile = true;
109
+ outputFile = arg.substring(1).trim();
110
+ break;
111
+ }
112
+ else {
113
+ argsBeforeRedirect.push(arg);
114
+ }
115
+ }
116
+ if (redirectOutputToFile && outputFile) {
117
+ args = argsBeforeRedirect;
118
+ }
119
+ }
120
+ logger.debug(`Running command: ${command} ${args?.join(' ')}`);
121
+ const p = spawn(command, args, options);
122
+ logger.debug(`Command PID: ${p.pid}`);
123
+ p.stdout.setEncoding('utf8');
124
+ p.stdout.on('data', (data) => {
125
+ stdout += data;
126
+ if (!hideStdout) {
127
+ logger.info(data.trim());
128
+ }
129
+ });
130
+ p.stderr.setEncoding('utf8');
131
+ p.stderr.on('data', (data) => {
132
+ stderr += data;
133
+ if (!hideStderr) {
134
+ if (data.startsWith('WARNING')) {
135
+ logger.warn(data.trim());
136
+ }
137
+ else {
138
+ logger.error(data.trim());
139
+ }
140
+ }
141
+ });
142
+ const exitCode = await new Promise((resolve, reject) => {
143
+ p.on('close', resolve);
144
+ p.on('error', reject);
145
+ });
146
+ if (redirectOutputToFile && outputFile) {
147
+ await writeFile(outputFile, stdout);
148
+ }
149
+ logger.debug('Command finished.');
150
+ return [stdout, stderr, exitCode];
151
+ }
152
+ function cloneLogger(logger) {
153
+ // @ts-expect-error this doesn't work on function types
154
+ const clonedLogger = logger.info.bind(logger);
155
+ clonedLogger.info = logger.info;
156
+ clonedLogger.warn = logger.warn;
157
+ clonedLogger.error = logger.error;
158
+ clonedLogger.debug = logger.debug;
159
+ clonedLogger.log = logger.log;
160
+ clonedLogger.prefix = logger.prefix;
161
+ return clonedLogger;
162
+ }
163
+ export function prefixLogger(logger, prefix) {
164
+ const newLogger = cloneLogger(logger);
165
+ const origLog = logger.log.bind(newLogger);
166
+ newLogger.log = function log(level, message, ...parameters) {
167
+ const prefixEval = prefix instanceof Function ? prefix() : prefix;
168
+ origLog(level, `${prefixEval} ${message}`, ...parameters);
169
+ };
170
+ return newLogger;
171
+ }
172
+ //# sourceMappingURL=utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.js","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,79 @@
1
+ {
2
+ "displayName": "Homebridge Kasa Python",
3
+ "name": "homebridge-kasa-python",
4
+ "version": "1.0.0",
5
+ "description": "Plugin that uses Python-Kasa API to communicate with Kasa Devices.",
6
+ "license": "Apache-2.0",
7
+ "type": "module",
8
+ "repository": {
9
+ "type": "git",
10
+ "url": "git+https://github.com/ZeliardM/homebridge-kasa-python.git"
11
+ },
12
+ "bugs": {
13
+ "url": "https://github.com/ZeliardM/homebridge-kasa-python/issues"
14
+ },
15
+ "engines": {
16
+ "node": "^18.17.0 || ^20.9.0",
17
+ "homebridge": "^1.8.0",
18
+ "python": "^3.9.0"
19
+ },
20
+ "main": "dist/index.js",
21
+ "scripts": {
22
+ "lint": "eslint src/**/*.ts --max-warnings=0",
23
+ "watch": "npm run build && npm link && nodemon",
24
+ "build": "npm ci && rimraf -I ./dist && npm run lint && tsc && cp ./src/python/*.py ./dist/python",
25
+ "prepublishOnly": "npm run lint && npm run build"
26
+ },
27
+ "keywords": [
28
+ "homebridge",
29
+ "homebridge-plugin",
30
+ "homebridge-kasa",
31
+ "homebridge-kasa-python",
32
+ "homekit",
33
+ "kasa",
34
+ "plugin",
35
+ "python",
36
+ "python-kasa",
37
+ "smarthome",
38
+ "tplink",
39
+ "tplink-kasa",
40
+ "tplink-smarthome"
41
+ ],
42
+ "files": [
43
+ "config.schema.json",
44
+ "dist",
45
+ "LICENSE",
46
+ "requirements.txt"
47
+ ],
48
+ "devDependencies": {
49
+ "@types/lodash.defaults": "^4.2.9",
50
+ "@types/node": "^20.12.13",
51
+ "@types/semver": "^7.5.8",
52
+ "@typescript-eslint/eslint-plugin": "^7.11.0",
53
+ "@typescript-eslint/parser": "^7.11.0",
54
+ "eslint": "^8.57.0",
55
+ "homebridge": "^1.8.2",
56
+ "nodemon": "^3.1.2",
57
+ "rimraf": "^5.0.7",
58
+ "ts-node": "^10.9.2",
59
+ "typescript": "^5.4.5"
60
+ },
61
+ "homepage": "https://github.com/ZeliardM/homebridge-kasa-python#readme",
62
+ "funding": [
63
+ {
64
+ "type": "paypal",
65
+ "url": "https://www.paypal.me/ZeliardM/USD"
66
+ },
67
+ {
68
+ "type": "github",
69
+ "url": "https://github.com/sponsors/ZeliardM"
70
+ }
71
+ ],
72
+ "dependencies": {
73
+ "ajv": "^8.16.0",
74
+ "ajv-formats": "^3.0.1",
75
+ "axios": "^1.7.2",
76
+ "lodash.defaults": "^4.2.0",
77
+ "ts-essentials": "^10.0.1"
78
+ }
79
+ }
@@ -0,0 +1 @@
1
+ python-kasa==0.7.0.3