homebridge-xihome-plugin 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 (43) hide show
  1. package/LICENSE +176 -0
  2. package/README.md +215 -0
  3. package/config.schema.json +18 -0
  4. package/dist/@types/device.d.ts +65 -0
  5. package/dist/@types/device.js +2 -0
  6. package/dist/@types/device.js.map +1 -0
  7. package/dist/@types/index.d.ts +5 -0
  8. package/dist/@types/index.js +2 -0
  9. package/dist/@types/index.js.map +1 -0
  10. package/dist/accessory/baseAccessory.d.ts +3 -0
  11. package/dist/accessory/baseAccessory.js +2 -0
  12. package/dist/accessory/baseAccessory.js.map +1 -0
  13. package/dist/accessory/hcl.d.ts +25 -0
  14. package/dist/accessory/hcl.js +79 -0
  15. package/dist/accessory/hcl.js.map +1 -0
  16. package/dist/accessory/heater.d.ts +23 -0
  17. package/dist/accessory/heater.js +113 -0
  18. package/dist/accessory/heater.js.map +1 -0
  19. package/dist/accessory/light.d.ts +40 -0
  20. package/dist/accessory/light.js +78 -0
  21. package/dist/accessory/light.js.map +1 -0
  22. package/dist/index.d.ts +6 -0
  23. package/dist/index.js +9 -0
  24. package/dist/index.js.map +1 -0
  25. package/dist/modules/base.d.ts +17 -0
  26. package/dist/modules/base.js +65 -0
  27. package/dist/modules/base.js.map +1 -0
  28. package/dist/modules/heater.d.ts +9 -0
  29. package/dist/modules/heater.js +32 -0
  30. package/dist/modules/heater.js.map +1 -0
  31. package/dist/modules/light.d.ts +10 -0
  32. package/dist/modules/light.js +47 -0
  33. package/dist/modules/light.js.map +1 -0
  34. package/dist/platform.d.ts +31 -0
  35. package/dist/platform.js +146 -0
  36. package/dist/platform.js.map +1 -0
  37. package/dist/settings.d.ts +8 -0
  38. package/dist/settings.js +9 -0
  39. package/dist/settings.js.map +1 -0
  40. package/dist/util/client.d.ts +46 -0
  41. package/dist/util/client.js +171 -0
  42. package/dist/util/client.js.map +1 -0
  43. package/package.json +48 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"platform.js","sourceRoot":"","sources":["../src/platform.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * This is the name of the platform that users will use to register the plugin in the Homebridge config.json
3
+ */
4
+ export declare const PLATFORM_NAME = "XiHomePlugin";
5
+ /**
6
+ * This must match the name of your plugin as defined the package.json `name` property
7
+ */
8
+ export declare const PLUGIN_NAME = "homebridge-xihome-plugin";
@@ -0,0 +1,9 @@
1
+ /**
2
+ * This is the name of the platform that users will use to register the plugin in the Homebridge config.json
3
+ */
4
+ export const PLATFORM_NAME = "XiHomePlugin";
5
+ /**
6
+ * This must match the name of your plugin as defined the package.json `name` property
7
+ */
8
+ export const PLUGIN_NAME = "homebridge-xihome-plugin";
9
+ //# sourceMappingURL=settings.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"settings.js","sourceRoot":"","sources":["../src/settings.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,MAAM,CAAC,MAAM,aAAa,GAAG,cAAc,CAAC;AAE5C;;GAEG;AACH,MAAM,CAAC,MAAM,WAAW,GAAG,0BAA0B,CAAC"}
@@ -0,0 +1,46 @@
1
+ import Light from "../modules/light.js";
2
+ import type { Device } from "../@types/device.js";
3
+ import { ExampleHomebridgePlatform } from "../platform.js";
4
+ import { BaseAccessory } from "../accessory/baseAccessory.js";
5
+ import Heater from "../modules/heater.js";
6
+ export default class XiHomeClient {
7
+ private token;
8
+ private refreshToken;
9
+ private idToken;
10
+ DEVICE_TOKEN: string;
11
+ DEVICE_MODEL_NAME: string;
12
+ private cache;
13
+ private log;
14
+ constructor(platform: ExampleHomebridgePlatform);
15
+ init(): Promise<void>;
16
+ login(): Promise<void>;
17
+ refresh(): Promise<void>;
18
+ requestAppSide(opt: {
19
+ path: `/${string}`;
20
+ body?: any;
21
+ params?: Record<string, number | string>;
22
+ method?: "GET" | "POST" | "PUT" | "DELETE";
23
+ }): Promise<any>;
24
+ requestWebviewSide(opt: {
25
+ path: `/${string}`;
26
+ body?: any;
27
+ params?: Record<string, number | string>;
28
+ method?: "GET" | "POST" | "PUT" | "DELETE";
29
+ }): Promise<any>;
30
+ private verifyToken;
31
+ modules: {
32
+ light: Light;
33
+ heater: Heater;
34
+ };
35
+ /** device_id가 key인 devices */
36
+ devices: Record<string, Device>;
37
+ /** device_id가 key인 accessories */
38
+ accessories: Record<string, BaseAccessory>;
39
+ rooms: Record<string, {
40
+ room_id: string;
41
+ room_name: string;
42
+ devices: string[];
43
+ }>;
44
+ addDevice(device: Device): void;
45
+ getDevice(deviceId: string): Device | null;
46
+ }
@@ -0,0 +1,171 @@
1
+ import Light from "../modules/light.js";
2
+ import axios from "axios";
3
+ import Heater from "../modules/heater.js";
4
+ export default class XiHomeClient {
5
+ token = "";
6
+ refreshToken = "";
7
+ idToken = "";
8
+ DEVICE_TOKEN = "f3fe6f90-3fa4-11f0-868d-3dca158cbafe";
9
+ DEVICE_MODEL_NAME = "SM-N976N";
10
+ cache = {};
11
+ log;
12
+ constructor(platform) {
13
+ this.log = platform.log;
14
+ }
15
+ async init() {
16
+ if (!process.env.XIHOME_USERNAME || !process.env.XIHOME_PASSWORD) {
17
+ process.env.XIHOME_USERNAME = "skinmaker1";
18
+ process.env.XIHOME_PASSWORD = "Stv#2587Qrx";
19
+ this.log.warn("XIHOME_USERNAME or XIHOME_PASSWORD is not set in environment variables. Using default credentials for testing purposes.");
20
+ // throw new Error(
21
+ // "XIHOME_USERNAME or XIHOME_PASSWORD is not set in environment variables."
22
+ // );
23
+ }
24
+ this.log.info("Logging in to XiHome...");
25
+ await this.login();
26
+ for (const moduleKey of Object.keys(this.modules)) {
27
+ const module = this.modules[moduleKey];
28
+ await module.init();
29
+ }
30
+ }
31
+ async login() {
32
+ const loginRes = await this.requestAppSide({
33
+ path: "/auth/login",
34
+ method: "POST",
35
+ body: {
36
+ username: process.env.XIHOME_USERNAME,
37
+ password: process.env.XIHOME_PASSWORD,
38
+ device_token: this.DEVICE_TOKEN,
39
+ device_model_name: this.DEVICE_MODEL_NAME,
40
+ },
41
+ });
42
+ this.token = loginRes.access_token;
43
+ this.refreshToken = loginRes.refresh_token;
44
+ this.idToken = loginRes.id_token;
45
+ }
46
+ async refresh() {
47
+ const res = await this.requestAppSide({
48
+ path: "/auth/token",
49
+ method: "POST",
50
+ body: {
51
+ username: process.env.XIHOME_USERNAME,
52
+ password: process.env.XIHOME_PASSWORD,
53
+ device_token: this.DEVICE_TOKEN,
54
+ device_model_name: this.DEVICE_MODEL_NAME,
55
+ },
56
+ });
57
+ this.token = res.access_token;
58
+ this.refreshToken = res.refresh_token;
59
+ this.idToken = res.id_token;
60
+ }
61
+ async requestAppSide(opt) {
62
+ if (!opt.path.startsWith("/auth")) {
63
+ await this.verifyToken();
64
+ }
65
+ const params = opt.params
66
+ ? "?" +
67
+ Object.entries(opt.params)
68
+ .map(([k, v]) => `${encodeURIComponent(k)}=${encodeURIComponent(v)}`)
69
+ .join("&")
70
+ : "";
71
+ const r = await fetch(`https://camellia-back.xihome.kr:5451/api${opt.path}${params}`, {
72
+ method: opt.method ?? "GET",
73
+ headers: {
74
+ "Content-Type": "application/json",
75
+ device_token: this.DEVICE_TOKEN,
76
+ "user-agent": "XiHome/1.0.0/android",
77
+ Authorization: this.token ? `Bearer ${this.token}` : "",
78
+ },
79
+ body: opt.body ? JSON.stringify(opt.body) : undefined,
80
+ });
81
+ if (r.status >= 400 && r.status < 600) {
82
+ throw new Error(`Request failed with status ${r.status}`);
83
+ }
84
+ return r.json();
85
+ }
86
+ async requestWebviewSide(opt) {
87
+ await this.verifyToken();
88
+ const params = opt.params
89
+ ? "?" +
90
+ Object.entries(opt.params)
91
+ .map(([k, v]) => `${encodeURIComponent(k)}=${encodeURIComponent(v)}`)
92
+ .join("&")
93
+ : "";
94
+ const shouldCache = (opt.method ?? "GET") === "GET";
95
+ const headers = {
96
+ "Content-Type": "application/json",
97
+ referer: "https://camellia-front.xihome.kr/",
98
+ accept: "*/*",
99
+ device_token: this.DEVICE_TOKEN,
100
+ "user-agent": "Mozilla/5.0 (iPhone; CPU iPhone OS 18_7 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148 XiHome/1.0.0 hnet",
101
+ Authorization: this.token ? `Bearer ${this.token}` : "",
102
+ ["sec-fetch-mode"]: "cors",
103
+ };
104
+ if (shouldCache) {
105
+ headers["If-None-Match"] = this.cache[opt.path + params]?.etag ?? "";
106
+ headers["sec-fetch-dest"] = "empty";
107
+ }
108
+ else {
109
+ this.log.debug(`Making ${opt.method ?? "GET"} request to ${opt.path}`, `with body: ${JSON.stringify(opt.body, null, 1)}`);
110
+ }
111
+ const res = await axios.request({
112
+ url: `https://camellia-back.xihome.kr:5452/api${opt.path}${params}`,
113
+ method: opt.method ?? "GET",
114
+ headers,
115
+ data: opt.body,
116
+ validateStatus: () => true,
117
+ });
118
+ if (res.status === 304) {
119
+ // this.log.debug(
120
+ // `Received 304 Not Modified for ${opt.path}, returning cached data.`,
121
+ // );
122
+ return this.cache[opt.path + params]?.data;
123
+ }
124
+ const etagHeader = res.headers["etag"];
125
+ if (etagHeader) {
126
+ this.cache[opt.path + params] = {
127
+ etag: etagHeader,
128
+ data: res.data,
129
+ };
130
+ }
131
+ this.log.debug(`Request to ${opt.path} responded with status ${res.status}`);
132
+ this.log.debug(`Response body: ${JSON.stringify(res.data)}`);
133
+ return res.data;
134
+ }
135
+ async verifyToken() {
136
+ if (!this.token) {
137
+ return await this.login();
138
+ }
139
+ const decoded = JSON.parse(Buffer.from(this.token.split(".")[1], "base64").toString("utf-8"));
140
+ const exp = decoded.exp;
141
+ const now = Math.floor(Date.now() / 1000);
142
+ if (exp - now < 300) {
143
+ this.log.info("Token is expiring soon, refreshing...");
144
+ await this.refresh();
145
+ }
146
+ }
147
+ modules = {
148
+ light: new Light(this),
149
+ heater: new Heater(this),
150
+ };
151
+ /** device_id가 key인 devices */
152
+ devices = {};
153
+ /** device_id가 key인 accessories */
154
+ accessories = {};
155
+ rooms = {};
156
+ addDevice(device) {
157
+ this.devices[device.id] = device;
158
+ if (!this.rooms[device.roomId]) {
159
+ this.rooms[device.roomId] = {
160
+ room_id: device.roomId,
161
+ room_name: device.raw.device_name_by_room,
162
+ devices: [],
163
+ };
164
+ }
165
+ this.rooms[device.roomId].devices.push(device.id);
166
+ }
167
+ getDevice(deviceId) {
168
+ return this.devices[deviceId] ?? null;
169
+ }
170
+ }
171
+ //# sourceMappingURL=client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/util/client.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,48 @@
1
+ {
2
+ "name": "homebridge-xihome-plugin",
3
+ "displayName": "XiHomePlugin",
4
+ "type": "module",
5
+ "version": "1.0.0",
6
+ "private": false,
7
+ "description": "A short description about what your plugin does.",
8
+ "author": "SKINMAKER",
9
+ "license": "Apache-2.0",
10
+ "homepage": "https://github.com/skinmaker1345/xihome-homebridge#readme",
11
+ "repository": {
12
+ "type": "git",
13
+ "url": "https://github.com/skinmaker1345/xihome-homebridge.git"
14
+ },
15
+ "bugs": {
16
+ "url": "https://github.com/skinmaker1345/xihome-homebridge/issues"
17
+ },
18
+ "keywords": [
19
+ "homebridge-plugin"
20
+ ],
21
+ "main": "dist/index.js",
22
+ "engines": {
23
+ "node": "^20.18.0 || ^22.10.0 || ^24.0.0",
24
+ "homebridge": "^1.8.0 || ^2.0.0-beta.0"
25
+ },
26
+ "scripts": {
27
+ "build": "rimraf ./dist && tsc",
28
+ "lint": "eslint . --max-warnings=0",
29
+ "prepublishOnly": "npm run build",
30
+ "watch": "npm run build && npm link && nodemon",
31
+ "dev": "tsc && homebridge -R -U ./test/hbConfig -D"
32
+ },
33
+ "dependencies": {
34
+ "axios": "^1.14.0",
35
+ "homebridge-lib": "^7.1.12"
36
+ },
37
+ "devDependencies": {
38
+ "@eslint/js": "^9.39.1",
39
+ "@types/node": "^24.10.1",
40
+ "eslint": "^9.39.1",
41
+ "homebridge": "^1.11.1",
42
+ "nodemon": "^3.1.11",
43
+ "rimraf": "^6.1.0",
44
+ "ts-node": "^10.9.2",
45
+ "typescript": "^5.9.3",
46
+ "typescript-eslint": "^8.46.4"
47
+ }
48
+ }