homebridge-deco 1.0.3 → 1.0.5
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/dist/decoAPI.d.ts +8 -20
- package/dist/decoAPI.js +104 -199
- package/dist/decoAPI.js.map +1 -1
- package/package.json +1 -1
package/dist/decoAPI.d.ts
CHANGED
|
@@ -35,34 +35,26 @@ export declare class DecoAPI {
|
|
|
35
35
|
private readonly log;
|
|
36
36
|
private readonly username;
|
|
37
37
|
private readonly password;
|
|
38
|
-
private
|
|
39
|
-
private
|
|
40
|
-
private
|
|
38
|
+
private routerUrl;
|
|
39
|
+
private stok;
|
|
40
|
+
private sysauth;
|
|
41
41
|
private lastAuthTime;
|
|
42
42
|
private readonly authValidityMs;
|
|
43
43
|
constructor(config: DecoConfig);
|
|
44
44
|
/**
|
|
45
|
-
* Authenticate with
|
|
45
|
+
* Authenticate with local Deco router using HTTPS API
|
|
46
46
|
*/
|
|
47
47
|
authenticate(): Promise<boolean>;
|
|
48
48
|
/**
|
|
49
|
-
* Get
|
|
50
|
-
*/
|
|
51
|
-
getDeviceList(): Promise<DecoDevice[]>;
|
|
52
|
-
/**
|
|
53
|
-
* Get network status including internet connectivity and guest network
|
|
49
|
+
* Get network status from local Deco router
|
|
54
50
|
*/
|
|
55
51
|
getNetworkStatus(): Promise<NetworkStatus>;
|
|
56
52
|
/**
|
|
57
|
-
* Get
|
|
58
|
-
*/
|
|
59
|
-
getClientList(): Promise<ConnectedClient[]>;
|
|
60
|
-
/**
|
|
61
|
-
* Get guest network status
|
|
53
|
+
* Get guest network status (placeholder for local API)
|
|
62
54
|
*/
|
|
63
55
|
getGuestNetworkStatus(): Promise<boolean>;
|
|
64
56
|
/**
|
|
65
|
-
*
|
|
57
|
+
* Set guest network on/off (placeholder for local API)
|
|
66
58
|
*/
|
|
67
59
|
setGuestNetwork(enabled: boolean): Promise<boolean>;
|
|
68
60
|
/**
|
|
@@ -70,11 +62,7 @@ export declare class DecoAPI {
|
|
|
70
62
|
*/
|
|
71
63
|
isDeviceConnected(mac: string): Promise<boolean>;
|
|
72
64
|
/**
|
|
73
|
-
*
|
|
74
|
-
*/
|
|
75
|
-
rebootDevice(deviceId: string): Promise<boolean>;
|
|
76
|
-
/**
|
|
77
|
-
* Make HTTP request to TP-Link API
|
|
65
|
+
* Make HTTPS request to local Deco router
|
|
78
66
|
*/
|
|
79
67
|
private makeRequest;
|
|
80
68
|
/**
|
package/dist/decoAPI.js
CHANGED
|
@@ -1,47 +1,42 @@
|
|
|
1
|
-
import
|
|
1
|
+
import https from 'https';
|
|
2
2
|
export class DecoAPI {
|
|
3
3
|
log;
|
|
4
4
|
username;
|
|
5
5
|
password;
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
6
|
+
routerUrl = 'https://192.168.68.1';
|
|
7
|
+
stok = '';
|
|
8
|
+
sysauth = '';
|
|
9
9
|
lastAuthTime = 0;
|
|
10
10
|
authValidityMs = 3600000; // 1 hour
|
|
11
11
|
constructor(config) {
|
|
12
12
|
this.log = config.log;
|
|
13
13
|
this.username = config.username;
|
|
14
14
|
this.password = config.password;
|
|
15
|
-
this.termid = randomUUID();
|
|
16
15
|
}
|
|
17
16
|
/**
|
|
18
|
-
* Authenticate with
|
|
17
|
+
* Authenticate with local Deco router using HTTPS API
|
|
19
18
|
*/
|
|
20
19
|
async authenticate() {
|
|
21
20
|
try {
|
|
22
21
|
// Check if we have a valid token already
|
|
23
|
-
if (this.
|
|
22
|
+
if (this.stok && (Date.now() - this.lastAuthTime) < this.authValidityMs) {
|
|
24
23
|
return true;
|
|
25
24
|
}
|
|
26
|
-
this.log.debug('Authenticating with
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
params: {
|
|
30
|
-
|
|
31
|
-
cloudUserName: this.username,
|
|
32
|
-
cloudPassword: this.password,
|
|
33
|
-
terminalUUID: this.termid,
|
|
34
|
-
},
|
|
25
|
+
this.log.debug('Authenticating with local Deco router at:', this.routerUrl);
|
|
26
|
+
// Deco router only needs password for login
|
|
27
|
+
const loginData = {
|
|
28
|
+
params: { password: this.password },
|
|
29
|
+
operation: 'login',
|
|
35
30
|
};
|
|
36
|
-
const response = await this.makeRequest('
|
|
31
|
+
const response = await this.makeRequest('login', JSON.stringify(loginData));
|
|
37
32
|
if (response.error_code !== 0) {
|
|
38
33
|
this.log.error('Authentication failed:', response.msg || 'Unknown error');
|
|
39
34
|
return false;
|
|
40
35
|
}
|
|
41
|
-
if (response.result && typeof response.result === 'object' && '
|
|
42
|
-
this.
|
|
36
|
+
if (response.result && typeof response.result === 'object' && 'stok' in response.result) {
|
|
37
|
+
this.stok = response.result.stok;
|
|
43
38
|
this.lastAuthTime = Date.now();
|
|
44
|
-
this.log.info('Successfully authenticated with
|
|
39
|
+
this.log.info('Successfully authenticated with local Deco router');
|
|
45
40
|
return true;
|
|
46
41
|
}
|
|
47
42
|
this.log.error('Invalid authentication response');
|
|
@@ -53,121 +48,54 @@ export class DecoAPI {
|
|
|
53
48
|
}
|
|
54
49
|
}
|
|
55
50
|
/**
|
|
56
|
-
* Get
|
|
57
|
-
*/
|
|
58
|
-
async getDeviceList() {
|
|
59
|
-
try {
|
|
60
|
-
if (!await this.ensureAuthenticated()) {
|
|
61
|
-
return [];
|
|
62
|
-
}
|
|
63
|
-
const params = {
|
|
64
|
-
method: 'getDeviceList',
|
|
65
|
-
params: {},
|
|
66
|
-
};
|
|
67
|
-
const response = await this.makeRequest('/', params);
|
|
68
|
-
if (response.error_code !== 0) {
|
|
69
|
-
this.log.error('Failed to get device list:', response.msg);
|
|
70
|
-
return [];
|
|
71
|
-
}
|
|
72
|
-
if (response.result && typeof response.result === 'object' && 'deviceList' in response.result) {
|
|
73
|
-
const devices = response.result.deviceList || [];
|
|
74
|
-
this.log.debug(`Found ${devices.length} Deco devices`);
|
|
75
|
-
return devices;
|
|
76
|
-
}
|
|
77
|
-
return [];
|
|
78
|
-
}
|
|
79
|
-
catch (error) {
|
|
80
|
-
this.log.error('Error getting device list:', error);
|
|
81
|
-
return [];
|
|
82
|
-
}
|
|
83
|
-
}
|
|
84
|
-
/**
|
|
85
|
-
* Get network status including internet connectivity and guest network
|
|
51
|
+
* Get network status from local Deco router
|
|
86
52
|
*/
|
|
87
53
|
async getNetworkStatus() {
|
|
88
54
|
try {
|
|
89
55
|
if (!await this.ensureAuthenticated()) {
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
const
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
56
|
+
this.log.error('Not authenticated, cannot get network status');
|
|
57
|
+
return { internetOnline: false, guestNetworkEnabled: false, devices: [], clients: [] };
|
|
58
|
+
}
|
|
59
|
+
const wanData = await this.makeRequest('admin/network?form=wan_ipv4', JSON.stringify({ operation: 'read' }));
|
|
60
|
+
const clientData = await this.makeRequest('admin/client?form=client_list', JSON.stringify({ operation: 'read' }));
|
|
61
|
+
const internetOnline = wanData?.wan?.inet_status === 'online';
|
|
62
|
+
const clientList = clientData?.client_list || [];
|
|
63
|
+
const clients = clientList.map((client) => ({
|
|
64
|
+
mac: typeof client.mac === 'string' ? client.mac : '',
|
|
65
|
+
name: client.name ? Buffer.from(client.name, 'base64').toString('utf-8') : '',
|
|
66
|
+
ip: typeof client.ip === 'string' ? client.ip : '',
|
|
67
|
+
online: client.online === true,
|
|
68
|
+
downSpeed: typeof client.down_speed === 'number' ? client.down_speed : 0,
|
|
69
|
+
upSpeed: typeof client.up_speed === 'number' ? client.up_speed : 0,
|
|
70
|
+
connectedNode: client.access_host ? String(client.access_host) : '',
|
|
71
|
+
}));
|
|
104
72
|
return {
|
|
105
73
|
internetOnline,
|
|
106
|
-
guestNetworkEnabled: guestNetwork,
|
|
107
|
-
devices,
|
|
108
|
-
clients,
|
|
109
|
-
};
|
|
110
|
-
}
|
|
111
|
-
catch (error) {
|
|
112
|
-
this.log.error('Error getting network status:', error);
|
|
113
|
-
return {
|
|
114
|
-
internetOnline: false,
|
|
115
74
|
guestNetworkEnabled: false,
|
|
116
75
|
devices: [],
|
|
117
|
-
clients
|
|
118
|
-
};
|
|
119
|
-
}
|
|
120
|
-
}
|
|
121
|
-
/**
|
|
122
|
-
* Get list of connected clients
|
|
123
|
-
*/
|
|
124
|
-
async getClientList() {
|
|
125
|
-
try {
|
|
126
|
-
if (!await this.ensureAuthenticated()) {
|
|
127
|
-
return [];
|
|
128
|
-
}
|
|
129
|
-
const params = {
|
|
130
|
-
method: 'getClientList',
|
|
131
|
-
params: {},
|
|
76
|
+
clients,
|
|
132
77
|
};
|
|
133
|
-
const response = await this.makeRequest('/', params);
|
|
134
|
-
if (response.error_code !== 0) {
|
|
135
|
-
this.log.debug('Failed to get client list:', response.msg);
|
|
136
|
-
return [];
|
|
137
|
-
}
|
|
138
|
-
if (response.result && typeof response.result === 'object' && 'clientList' in response.result) {
|
|
139
|
-
const clients = response.result.clientList || [];
|
|
140
|
-
this.log.debug(`Found ${clients.length} connected clients`);
|
|
141
|
-
return clients;
|
|
142
|
-
}
|
|
143
|
-
return [];
|
|
144
78
|
}
|
|
145
79
|
catch (error) {
|
|
146
|
-
this.log.error('Error getting
|
|
147
|
-
return [];
|
|
80
|
+
this.log.error('Error getting network status:', error);
|
|
81
|
+
return { internetOnline: false, guestNetworkEnabled: false, devices: [], clients: [] };
|
|
148
82
|
}
|
|
149
83
|
}
|
|
150
84
|
/**
|
|
151
|
-
* Get guest network status
|
|
85
|
+
* Get guest network status (placeholder for local API)
|
|
152
86
|
*/
|
|
153
87
|
async getGuestNetworkStatus() {
|
|
154
88
|
try {
|
|
155
89
|
if (!await this.ensureAuthenticated()) {
|
|
156
90
|
return false;
|
|
157
91
|
}
|
|
158
|
-
const
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
};
|
|
162
|
-
const
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
return false;
|
|
166
|
-
}
|
|
167
|
-
if (response.result && typeof response.result === 'object' && 'enabled' in response.result) {
|
|
168
|
-
return response.result.enabled === true;
|
|
169
|
-
}
|
|
170
|
-
return false;
|
|
92
|
+
const wlanData = await this.makeRequest('admin/wireless?form=wlan', JSON.stringify({ operation: 'read' }));
|
|
93
|
+
// Check if guest network is enabled on 2.4G or 5G bands
|
|
94
|
+
const band2_4 = wlanData?.band2_4 || {};
|
|
95
|
+
const band5_1 = wlanData?.band5_1 || {};
|
|
96
|
+
const guest2g = band2_4.guest?.enable === true;
|
|
97
|
+
const guest5g = band5_1.guest?.enable === true;
|
|
98
|
+
return guest2g || guest5g;
|
|
171
99
|
}
|
|
172
100
|
catch (error) {
|
|
173
101
|
this.log.debug('Error getting guest network status:', error);
|
|
@@ -175,7 +103,7 @@ export class DecoAPI {
|
|
|
175
103
|
}
|
|
176
104
|
}
|
|
177
105
|
/**
|
|
178
|
-
*
|
|
106
|
+
* Set guest network on/off (placeholder for local API)
|
|
179
107
|
*/
|
|
180
108
|
async setGuestNetwork(enabled) {
|
|
181
109
|
try {
|
|
@@ -183,16 +111,13 @@ export class DecoAPI {
|
|
|
183
111
|
return false;
|
|
184
112
|
}
|
|
185
113
|
const params = {
|
|
186
|
-
|
|
114
|
+
operation: 'write',
|
|
187
115
|
params: {
|
|
188
|
-
enabled,
|
|
116
|
+
band2_4: { guest: { enable: enabled } },
|
|
117
|
+
band5_1: { guest: { enable: enabled } },
|
|
189
118
|
},
|
|
190
119
|
};
|
|
191
|
-
|
|
192
|
-
if (response.error_code !== 0) {
|
|
193
|
-
this.log.error('Failed to set guest network:', response.msg);
|
|
194
|
-
return false;
|
|
195
|
-
}
|
|
120
|
+
await this.makeRequest('admin/wireless?form=wlan', JSON.stringify(params));
|
|
196
121
|
this.log.info(`Guest network ${enabled ? 'enabled' : 'disabled'}`);
|
|
197
122
|
return true;
|
|
198
123
|
}
|
|
@@ -206,9 +131,9 @@ export class DecoAPI {
|
|
|
206
131
|
*/
|
|
207
132
|
async isDeviceConnected(mac) {
|
|
208
133
|
try {
|
|
209
|
-
const
|
|
134
|
+
const status = await this.getNetworkStatus();
|
|
210
135
|
const normalizedMac = mac.toLowerCase().replace(/[:-]/g, '');
|
|
211
|
-
return clients.some(client => {
|
|
136
|
+
return status.clients.some(client => {
|
|
212
137
|
const clientMac = client.mac.toLowerCase().replace(/[:-]/g, '');
|
|
213
138
|
return clientMac === normalizedMac && client.online;
|
|
214
139
|
});
|
|
@@ -219,90 +144,70 @@ export class DecoAPI {
|
|
|
219
144
|
}
|
|
220
145
|
}
|
|
221
146
|
/**
|
|
222
|
-
*
|
|
147
|
+
* Make HTTPS request to local Deco router
|
|
223
148
|
*/
|
|
224
|
-
async
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
const
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
149
|
+
async makeRequest(path, body) {
|
|
150
|
+
const url = `${this.routerUrl}/cgi-bin/luci/;stok=${this.stok}/${path}`;
|
|
151
|
+
this.log.debug(`API request - URL: ${url}`);
|
|
152
|
+
return new Promise((resolve, reject) => {
|
|
153
|
+
const urlObj = new URL(url);
|
|
154
|
+
const options = {
|
|
155
|
+
hostname: urlObj.hostname,
|
|
156
|
+
port: urlObj.port || 443,
|
|
157
|
+
path: urlObj.pathname + urlObj.search,
|
|
158
|
+
method: 'POST',
|
|
159
|
+
headers: {
|
|
160
|
+
'Content-Type': 'application/json',
|
|
161
|
+
'Content-Length': Buffer.byteLength(body),
|
|
233
162
|
},
|
|
163
|
+
rejectUnauthorized: false,
|
|
234
164
|
};
|
|
235
|
-
const
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
catch (error) {
|
|
244
|
-
this.log.error('Error rebooting device:', error);
|
|
245
|
-
return false;
|
|
246
|
-
}
|
|
247
|
-
}
|
|
248
|
-
/**
|
|
249
|
-
* Make HTTP request to TP-Link API
|
|
250
|
-
*/
|
|
251
|
-
async makeRequest(endpoint, params, requireAuth = true) {
|
|
252
|
-
const url = `${this.baseUrl}${endpoint}`;
|
|
253
|
-
const headers = {
|
|
254
|
-
'Content-Type': 'application/json',
|
|
255
|
-
'User-Agent': 'Deco/3.0 (iPhone; iOS 15.0; Scale/3.00)',
|
|
256
|
-
};
|
|
257
|
-
if (requireAuth && this.token) {
|
|
258
|
-
headers.Authorization = `Bearer ${this.token}`;
|
|
259
|
-
}
|
|
260
|
-
const body = JSON.stringify(params);
|
|
261
|
-
this.log.debug(`API request - URL: ${url}, Method: ${params.method || 'unknown'}`);
|
|
262
|
-
try {
|
|
263
|
-
this.log.debug(`Making API request to: ${url}`);
|
|
264
|
-
const response = await fetch(url, {
|
|
265
|
-
method: 'POST',
|
|
266
|
-
headers,
|
|
267
|
-
body,
|
|
268
|
-
redirect: 'manual',
|
|
269
|
-
});
|
|
270
|
-
// Handle redirects
|
|
271
|
-
if (response.status >= 300 && response.status < 400) {
|
|
272
|
-
const location = response.headers.get('location');
|
|
273
|
-
this.log.error(`API returned redirect (${response.status}) to: ${location}`);
|
|
274
|
-
throw new Error(`API redirect to ${location} - endpoint may be wrong`);
|
|
275
|
-
}
|
|
276
|
-
if (!response.ok) {
|
|
277
|
-
throw new Error(`HTTP ${response.status}: ${response.statusText}`);
|
|
278
|
-
}
|
|
279
|
-
const text = await response.text();
|
|
280
|
-
// Try to parse as JSON, but handle HTML error pages gracefully
|
|
281
|
-
try {
|
|
282
|
-
const data = JSON.parse(text);
|
|
283
|
-
return data;
|
|
284
|
-
}
|
|
285
|
-
catch (parseError) {
|
|
286
|
-
if (text.trim().startsWith('<!DOCTYPE') || text.trim().startsWith('<html')) {
|
|
287
|
-
this.log.error('API returned HTML instead of JSON. Response preview:', text.substring(0, 300));
|
|
288
|
-
this.log.error('This usually means: endpoint is wrong, credentials are wrong, or the API has changed.');
|
|
165
|
+
const req = https.request(options, (res) => {
|
|
166
|
+
let data = '';
|
|
167
|
+
// Handle redirects
|
|
168
|
+
if (typeof res.statusCode === 'number' && res.statusCode >= 300 && res.statusCode < 400) {
|
|
169
|
+
const location = res.headers.location;
|
|
170
|
+
this.log.error(`API returned redirect (${res.statusCode}) to: ${location}`);
|
|
171
|
+
reject(new Error(`API redirect to ${location} - authentication may have failed`));
|
|
172
|
+
return;
|
|
289
173
|
}
|
|
290
|
-
|
|
291
|
-
|
|
174
|
+
if (typeof res.statusCode !== 'number' || res.statusCode !== 200) {
|
|
175
|
+
reject(new Error(`HTTP ${res.statusCode}: ${res.statusMessage}`));
|
|
176
|
+
return;
|
|
292
177
|
}
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
178
|
+
res.on('data', (chunk) => {
|
|
179
|
+
data += chunk;
|
|
180
|
+
});
|
|
181
|
+
res.on('end', () => {
|
|
182
|
+
try {
|
|
183
|
+
const jsonData = JSON.parse(data);
|
|
184
|
+
resolve(jsonData);
|
|
185
|
+
}
|
|
186
|
+
catch (parseError) {
|
|
187
|
+
if (data.trim().startsWith('<!DOCTYPE') || data.trim().startsWith('<html')) {
|
|
188
|
+
this.log.error('API returned HTML instead of JSON. Response preview:', data.substring(0, 300));
|
|
189
|
+
this.log.error('Router may not be accessible or API endpoint is wrong.');
|
|
190
|
+
}
|
|
191
|
+
else {
|
|
192
|
+
this.log.error('Failed to parse API response as JSON:', data);
|
|
193
|
+
}
|
|
194
|
+
reject(new Error('Invalid JSON response from Deco router'));
|
|
195
|
+
}
|
|
196
|
+
});
|
|
197
|
+
});
|
|
198
|
+
req.on('error', (error) => {
|
|
199
|
+
this.log.error('API request failed:', error);
|
|
200
|
+
reject(error);
|
|
201
|
+
});
|
|
202
|
+
req.write(body);
|
|
203
|
+
req.end();
|
|
204
|
+
});
|
|
300
205
|
}
|
|
301
206
|
/**
|
|
302
207
|
* Ensure we have a valid authentication token
|
|
303
208
|
*/
|
|
304
209
|
async ensureAuthenticated() {
|
|
305
|
-
if (!this.
|
|
210
|
+
if (!this.stok || (Date.now() - this.lastAuthTime) >= this.authValidityMs) {
|
|
306
211
|
return await this.authenticate();
|
|
307
212
|
}
|
|
308
213
|
return true;
|
package/dist/decoAPI.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"decoAPI.js","sourceRoot":"","sources":["../src/decoAPI.ts"],"names":[],"mappings":"AACA,OAAO,
|
|
1
|
+
{"version":3,"file":"decoAPI.js","sourceRoot":"","sources":["../src/decoAPI.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
"name": "homebridge-deco",
|
|
3
3
|
"displayName": "TP-Link Deco",
|
|
4
4
|
"type": "module",
|
|
5
|
-
"version": "1.0.
|
|
5
|
+
"version": "1.0.5",
|
|
6
6
|
"description": "Homebridge plugin for TP-Link Deco mesh network system with support for network monitoring, device tracking, and network controls.",
|
|
7
7
|
"author": "Fabian Oley",
|
|
8
8
|
"license": "Apache-2.0",
|