iobroker.tapo 0.0.2
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/LICENSE +21 -0
- package/README.md +63 -0
- package/admin/index_m.html +37 -0
- package/admin/jsonConfig.json +77 -0
- package/admin/tapo.png +0 -0
- package/build/lib/json2iob.js +279 -0
- package/build/lib/json2iob.js.map +7 -0
- package/build/lib/utils/energyUsage.js +30 -0
- package/build/lib/utils/energyUsage.js.map +7 -0
- package/build/lib/utils/l510e.js +60 -0
- package/build/lib/utils/l510e.js.map +7 -0
- package/build/lib/utils/l530.js +120 -0
- package/build/lib/utils/l530.js.map +7 -0
- package/build/lib/utils/p100.js +407 -0
- package/build/lib/utils/p100.js.map +7 -0
- package/build/lib/utils/p110.js +64 -0
- package/build/lib/utils/p110.js.map +7 -0
- package/build/lib/utils/powerUsage.js +30 -0
- package/build/lib/utils/powerUsage.js.map +7 -0
- package/build/lib/utils/tpLinkCipher.js +50 -0
- package/build/lib/utils/tpLinkCipher.js.map +7 -0
- package/build/lib/utils/types.js +17 -0
- package/build/lib/utils/types.js.map +7 -0
- package/build/lib/utils/usage.js +30 -0
- package/build/lib/utils/usage.js.map +7 -0
- package/build/main.js +578 -0
- package/build/main.js.map +7 -0
- package/io-package.json +111 -0
- package/package.json +84 -0
package/build/main.js
ADDED
|
@@ -0,0 +1,578 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __create = Object.create;
|
|
3
|
+
var __defProp = Object.defineProperty;
|
|
4
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
5
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
6
|
+
var __getProtoOf = Object.getPrototypeOf;
|
|
7
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
8
|
+
var __copyProps = (to, from, except, desc) => {
|
|
9
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
10
|
+
for (let key of __getOwnPropNames(from))
|
|
11
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
12
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
13
|
+
}
|
|
14
|
+
return to;
|
|
15
|
+
};
|
|
16
|
+
var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
|
|
17
|
+
isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
|
|
18
|
+
mod
|
|
19
|
+
));
|
|
20
|
+
var utils = __toESM(require("@iobroker/adapter-core"));
|
|
21
|
+
var import_axios = __toESM(require("axios"));
|
|
22
|
+
var import_crypto = __toESM(require("crypto"));
|
|
23
|
+
var import_https = __toESM(require("https"));
|
|
24
|
+
var import_uuid = require("uuid");
|
|
25
|
+
var import_json2iob = __toESM(require("./lib/json2iob"));
|
|
26
|
+
var import_l510e = __toESM(require("./lib/utils/l510e"));
|
|
27
|
+
var import_l530 = __toESM(require("./lib/utils/l530"));
|
|
28
|
+
var import_p100 = __toESM(require("./lib/utils/p100"));
|
|
29
|
+
var import_p110 = __toESM(require("./lib/utils/p110"));
|
|
30
|
+
class Tapo extends utils.Adapter {
|
|
31
|
+
constructor(options = {}) {
|
|
32
|
+
super({
|
|
33
|
+
...options,
|
|
34
|
+
name: "tapo"
|
|
35
|
+
});
|
|
36
|
+
this.updateInterval = null;
|
|
37
|
+
this.reLoginTimeout = null;
|
|
38
|
+
this.refreshTokenTimeout = null;
|
|
39
|
+
this.session = {};
|
|
40
|
+
this.on("ready", this.onReady.bind(this));
|
|
41
|
+
this.on("stateChange", this.onStateChange.bind(this));
|
|
42
|
+
this.on("unload", this.onUnload.bind(this));
|
|
43
|
+
this.devices = {};
|
|
44
|
+
this.deviceObjects = {};
|
|
45
|
+
this.json2iob = new import_json2iob.default(this);
|
|
46
|
+
this.requestClient = import_axios.default.create({
|
|
47
|
+
httpsAgent: new import_https.default.Agent({
|
|
48
|
+
rejectUnauthorized: false
|
|
49
|
+
})
|
|
50
|
+
});
|
|
51
|
+
this.secret = Buffer.from([
|
|
52
|
+
54,
|
|
53
|
+
101,
|
|
54
|
+
100,
|
|
55
|
+
55,
|
|
56
|
+
100,
|
|
57
|
+
57,
|
|
58
|
+
55,
|
|
59
|
+
102,
|
|
60
|
+
51,
|
|
61
|
+
101,
|
|
62
|
+
55,
|
|
63
|
+
51,
|
|
64
|
+
52,
|
|
65
|
+
54,
|
|
66
|
+
55,
|
|
67
|
+
102,
|
|
68
|
+
56,
|
|
69
|
+
97,
|
|
70
|
+
53,
|
|
71
|
+
98,
|
|
72
|
+
97,
|
|
73
|
+
98,
|
|
74
|
+
57,
|
|
75
|
+
48,
|
|
76
|
+
98,
|
|
77
|
+
53,
|
|
78
|
+
55,
|
|
79
|
+
55,
|
|
80
|
+
98,
|
|
81
|
+
97,
|
|
82
|
+
52,
|
|
83
|
+
99
|
|
84
|
+
]);
|
|
85
|
+
}
|
|
86
|
+
async onReady() {
|
|
87
|
+
this.setState("info.connection", false, true);
|
|
88
|
+
if (this.config.interval < 0.5) {
|
|
89
|
+
this.log.info("Set interval to minimum 0.5");
|
|
90
|
+
this.config.interval = 0.5;
|
|
91
|
+
}
|
|
92
|
+
if (!this.config.username || !this.config.password) {
|
|
93
|
+
this.log.error("Please set username and password in the instance settings");
|
|
94
|
+
return;
|
|
95
|
+
}
|
|
96
|
+
this.updateInterval = null;
|
|
97
|
+
this.reLoginTimeout = null;
|
|
98
|
+
this.refreshTokenTimeout = null;
|
|
99
|
+
this.session = {};
|
|
100
|
+
this.subscribeStates("*");
|
|
101
|
+
const termIdState = await this.getStateAsync("termId");
|
|
102
|
+
if (termIdState && termIdState.val) {
|
|
103
|
+
this.termId = termIdState.val;
|
|
104
|
+
} else {
|
|
105
|
+
await this.setObjectNotExistsAsync("termId", {
|
|
106
|
+
type: "state",
|
|
107
|
+
common: {
|
|
108
|
+
name: "Terminal ID",
|
|
109
|
+
write: false,
|
|
110
|
+
read: true,
|
|
111
|
+
type: "string",
|
|
112
|
+
role: "text"
|
|
113
|
+
},
|
|
114
|
+
native: {}
|
|
115
|
+
});
|
|
116
|
+
this.termId = (0, import_uuid.v4)();
|
|
117
|
+
await this.setStateAsync("termId", this.termId, true);
|
|
118
|
+
}
|
|
119
|
+
this.log.info("Login tp TAPO App");
|
|
120
|
+
await this.login();
|
|
121
|
+
if (this.session.token) {
|
|
122
|
+
await this.getDeviceList();
|
|
123
|
+
this.log.info("Wait for connections");
|
|
124
|
+
await this.sleep(1e4);
|
|
125
|
+
await this.updateDevices();
|
|
126
|
+
this.updateInterval = setInterval(async () => {
|
|
127
|
+
await this.updateDevices();
|
|
128
|
+
}, this.config.interval * 1e3);
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
async login() {
|
|
132
|
+
let body = JSON.stringify({
|
|
133
|
+
appVersion: "2.8.21",
|
|
134
|
+
refreshTokenNeeded: true,
|
|
135
|
+
platform: "iOS 14.8",
|
|
136
|
+
cloudPassword: this.config.password,
|
|
137
|
+
terminalUUID: "CDE6601E-148C-4CB7-831F-FD587E999D99",
|
|
138
|
+
cloudUserName: this.config.username,
|
|
139
|
+
terminalName: "iPhone",
|
|
140
|
+
terminalMeta: "3",
|
|
141
|
+
appType: "TP-Link_Tapo_iOS"
|
|
142
|
+
});
|
|
143
|
+
let path = "api/v2/account/login";
|
|
144
|
+
const mfaIdState = await this.getStateAsync("mfaId");
|
|
145
|
+
if (mfaIdState && mfaIdState.val) {
|
|
146
|
+
if (!this.config.mfa) {
|
|
147
|
+
this.log.error("Please set mfa in the instance settings");
|
|
148
|
+
return;
|
|
149
|
+
}
|
|
150
|
+
body = JSON.stringify({
|
|
151
|
+
cloudUserName: this.config.username,
|
|
152
|
+
MFAProcessId: mfaIdState.val,
|
|
153
|
+
appType: "TP-Link_Tapo_iOS",
|
|
154
|
+
MFAType: 2,
|
|
155
|
+
code: this.config.mfa,
|
|
156
|
+
terminalBindEnabled: true
|
|
157
|
+
});
|
|
158
|
+
path = "api/v2/account/checkMFACodeAndLogin";
|
|
159
|
+
await this.setStateAsync("mfaId", "", true);
|
|
160
|
+
}
|
|
161
|
+
const md5 = import_crypto.default.createHash("md5").update(body).digest("base64");
|
|
162
|
+
this.log.debug(md5);
|
|
163
|
+
const content = md5 + "\n9999999999\nfee66616-58dd-4bcb-be79-fe092d800a21\n/" + path;
|
|
164
|
+
const signature = import_crypto.default.createHmac("sha1", this.secret).update(content).digest("hex");
|
|
165
|
+
await this.requestClient({
|
|
166
|
+
method: "post",
|
|
167
|
+
url: "https://n-wap-gw.tplinkcloud.com/" + path + "?termID=" + this.termId + "&appVer=2.8.21&locale=de_DE&appName=TP-Link_Tapo_iOS&netType=wifi&model=iPhone10%2C5&termName=iPhone&termMeta=3&brand=TPLINK&ospf=iOS%2014.8",
|
|
168
|
+
headers: {
|
|
169
|
+
"Content-Type": "application/json;UTF-8",
|
|
170
|
+
Accept: "*/*",
|
|
171
|
+
"User-Agent": "Tapo/2.8.21 (iPhone; iOS 14.8; Scale/3.00)",
|
|
172
|
+
"Accept-Language": "de-DE;q=1, uk-DE;q=0.9, en-DE;q=0.8",
|
|
173
|
+
"X-Authorization": "Timestamp=9999999999, Nonce=fee66616-58dd-4bcb-be79-fe092d800a21, AccessKey=4d11b6b9d5ea4d19a829adbb9714b057, Signature=" + signature
|
|
174
|
+
},
|
|
175
|
+
data: body
|
|
176
|
+
}).then(async (res) => {
|
|
177
|
+
var _a, _b;
|
|
178
|
+
this.log.debug(JSON.stringify(res.data));
|
|
179
|
+
if (res.data.error_code) {
|
|
180
|
+
this.log.error(JSON.stringify(res.data));
|
|
181
|
+
return;
|
|
182
|
+
}
|
|
183
|
+
if ((_a = res.data.result) == null ? void 0 : _a.MFAProcessId) {
|
|
184
|
+
this.log.info("Found MFA Process please enter MFA in the instance settings");
|
|
185
|
+
await this.setObjectNotExistsAsync("mfaId", {
|
|
186
|
+
type: "state",
|
|
187
|
+
common: {
|
|
188
|
+
name: "MFA Id",
|
|
189
|
+
write: false,
|
|
190
|
+
read: true,
|
|
191
|
+
type: "string",
|
|
192
|
+
role: "text"
|
|
193
|
+
},
|
|
194
|
+
native: {}
|
|
195
|
+
});
|
|
196
|
+
await this.setStateAsync("mfaId", (_b = res.data.result) == null ? void 0 : _b.MFAProcessId, true);
|
|
197
|
+
const body2 = JSON.stringify({
|
|
198
|
+
cloudPassword: this.config.password,
|
|
199
|
+
locale: "de_DE",
|
|
200
|
+
terminalUUID: "CDE6601E-148C-4CB7-831F-FD587E999D99",
|
|
201
|
+
cloudUserName: this.config.username,
|
|
202
|
+
appType: "TP-Link_Tapo_iOS"
|
|
203
|
+
});
|
|
204
|
+
const path2 = "api/v2/account/getEmailVC4TerminalMFA";
|
|
205
|
+
const md52 = import_crypto.default.createHash("md5").update(body2).digest("base64");
|
|
206
|
+
this.log.debug(md52);
|
|
207
|
+
const content2 = md52 + "\n9999999999\nfee66616-58dd-4bcb-be79-fe092d800a21\n/" + path2;
|
|
208
|
+
const signature2 = import_crypto.default.createHmac("sha1", this.secret).update(content2).digest("hex");
|
|
209
|
+
await this.requestClient({
|
|
210
|
+
method: "post",
|
|
211
|
+
url: "https://n-wap-gw.tplinkcloud.com/" + path2 + "?termID=" + this.termId + "&appVer=2.8.21&locale=de_DE&appName=TP-Link_Tapo_iOS&netType=wifi&model=iPhone10%2C5&termName=iPhone&termMeta=3&brand=TPLINK&ospf=iOS%2014.8",
|
|
212
|
+
headers: {
|
|
213
|
+
"Content-Type": "application/json;UTF-8",
|
|
214
|
+
Accept: "*/*",
|
|
215
|
+
"User-Agent": "Tapo/2.8.21 (iPhone; iOS 14.8; Scale/3.00)",
|
|
216
|
+
"Accept-Language": "de-DE;q=1, uk-DE;q=0.9, en-DE;q=0.8",
|
|
217
|
+
"X-Authorization": "Timestamp=9999999999, Nonce=fee66616-58dd-4bcb-be79-fe092d800a21, AccessKey=4d11b6b9d5ea4d19a829adbb9714b057, Signature=" + signature2
|
|
218
|
+
},
|
|
219
|
+
data: body2
|
|
220
|
+
}).then(async (res2) => {
|
|
221
|
+
this.log.debug(JSON.stringify(res2.data));
|
|
222
|
+
if (res2.data.error_code) {
|
|
223
|
+
this.log.error(JSON.stringify(res2.data));
|
|
224
|
+
return;
|
|
225
|
+
}
|
|
226
|
+
}).catch((error) => {
|
|
227
|
+
this.log.error(error);
|
|
228
|
+
error.response && this.log.error(JSON.stringify(error.response.data));
|
|
229
|
+
});
|
|
230
|
+
return;
|
|
231
|
+
}
|
|
232
|
+
this.setState("info.connection", true, true);
|
|
233
|
+
this.session = res.data.result;
|
|
234
|
+
return;
|
|
235
|
+
}).catch((error) => {
|
|
236
|
+
this.log.error(error);
|
|
237
|
+
error.response && this.log.error(JSON.stringify(error.response.data));
|
|
238
|
+
});
|
|
239
|
+
}
|
|
240
|
+
async getDeviceList() {
|
|
241
|
+
const body = '{"index":0,"deviceTypeList":["SMART.TAPOBULB","SMART.TAPOPLUG","SMART.IPCAMERA","SMART.TAPOHUB","SMART.TAPOSENSOR","SMART.TAPOSWITCH"],"limit":20}';
|
|
242
|
+
const md5 = import_crypto.default.createHash("md5").update(body).digest("base64");
|
|
243
|
+
this.log.debug(md5);
|
|
244
|
+
const content = md5 + "\n9999999999\nfee66616-58dd-4bcb-be79-fe092d800a21\n/api/v2/common/getDeviceListByPage";
|
|
245
|
+
const signature = import_crypto.default.createHmac("sha1", this.secret).update(content).digest("hex");
|
|
246
|
+
await this.requestClient({
|
|
247
|
+
method: "post",
|
|
248
|
+
url: `https://n-euw1-wap-gw.tplinkcloud.com/api/v2/common/getDeviceListByPage?token=${this.session.token}&termID=${this.termId}&appVer=2.8.21&locale=de_DE&appName=TP-Link_Tapo_iOS&netType=wifi&model=iPhone10%2C5&termName=iPhone&termMeta=3&brand=TPLINK&ospf=iOS%2014.8`,
|
|
249
|
+
headers: {
|
|
250
|
+
"Content-Type": "application/json;UTF-8",
|
|
251
|
+
"Content-MD5": md5,
|
|
252
|
+
Accept: "*/*",
|
|
253
|
+
"User-Agent": "Tapo/2.8.21 (iPhone; iOS 14.8; Scale/3.00)",
|
|
254
|
+
"Accept-Language": "de-DE;q=1, uk-DE;q=0.9, en-DE;q=0.8",
|
|
255
|
+
"X-Authorization": "Timestamp=9999999999, Nonce=fee66616-58dd-4bcb-be79-fe092d800a21, AccessKey=4d11b6b9d5ea4d19a829adbb9714b057, Signature=" + signature
|
|
256
|
+
},
|
|
257
|
+
data: body
|
|
258
|
+
}).then(async (res) => {
|
|
259
|
+
var _a, _b;
|
|
260
|
+
this.log.debug(JSON.stringify(res.data));
|
|
261
|
+
if (res.data.error_code) {
|
|
262
|
+
this.log.error(JSON.stringify(res.data));
|
|
263
|
+
return;
|
|
264
|
+
}
|
|
265
|
+
this.log.info(`Found ${(_a = res.data.result) == null ? void 0 : _a.totalNum} devices`);
|
|
266
|
+
for (const device of (_b = res.data.result) == null ? void 0 : _b.deviceList) {
|
|
267
|
+
const id = device.deviceId;
|
|
268
|
+
this.devices[id] = device;
|
|
269
|
+
const name = Buffer.from(device.alias, "base64").toString("utf8");
|
|
270
|
+
await this.setObjectNotExistsAsync(id, {
|
|
271
|
+
type: "device",
|
|
272
|
+
common: {
|
|
273
|
+
name
|
|
274
|
+
},
|
|
275
|
+
native: {}
|
|
276
|
+
});
|
|
277
|
+
await this.setObjectNotExistsAsync(id + ".remote", {
|
|
278
|
+
type: "channel",
|
|
279
|
+
common: {
|
|
280
|
+
name: "Remote Controls"
|
|
281
|
+
},
|
|
282
|
+
native: {}
|
|
283
|
+
});
|
|
284
|
+
const remoteArray = [
|
|
285
|
+
{ command: "refresh", name: "True = Refresh" },
|
|
286
|
+
{ command: "setPowerState", name: "True = On, False = Off" },
|
|
287
|
+
{
|
|
288
|
+
command: "setBrightness",
|
|
289
|
+
name: "Set Brightness for Light devices",
|
|
290
|
+
type: "number",
|
|
291
|
+
role: "level.brightness",
|
|
292
|
+
def: 5
|
|
293
|
+
},
|
|
294
|
+
{
|
|
295
|
+
command: "setColorTemp",
|
|
296
|
+
name: "Set Color Temp for Light devices",
|
|
297
|
+
type: "number",
|
|
298
|
+
role: "level.color.temperature",
|
|
299
|
+
def: 3e3
|
|
300
|
+
},
|
|
301
|
+
{
|
|
302
|
+
command: "setColor",
|
|
303
|
+
name: "Set Color for Light devices (hue, saturation)",
|
|
304
|
+
def: "30, 100",
|
|
305
|
+
type: "string"
|
|
306
|
+
}
|
|
307
|
+
];
|
|
308
|
+
remoteArray.forEach((remote) => {
|
|
309
|
+
this.setObjectNotExists(id + ".remote." + remote.command, {
|
|
310
|
+
type: "state",
|
|
311
|
+
common: {
|
|
312
|
+
name: remote.name || "",
|
|
313
|
+
type: remote.type || "boolean",
|
|
314
|
+
role: remote.role || "boolean",
|
|
315
|
+
def: remote.def || false,
|
|
316
|
+
write: true,
|
|
317
|
+
read: true
|
|
318
|
+
},
|
|
319
|
+
native: {}
|
|
320
|
+
});
|
|
321
|
+
});
|
|
322
|
+
this.json2iob.parse(id, device);
|
|
323
|
+
await this.requestClient({
|
|
324
|
+
method: "get",
|
|
325
|
+
url: "https://euw1-app-server.iot.i.tplinknbu.com/v1/things/" + id + "/details",
|
|
326
|
+
headers: {
|
|
327
|
+
"x-locale": "de",
|
|
328
|
+
Authorization: "ut|" + this.session.token,
|
|
329
|
+
"app-cid": "app:TP-Link_Tapo_iOS:" + this.termId,
|
|
330
|
+
"x-ospf": "iOS 14.8",
|
|
331
|
+
"x-app-name": "TP-Link_Tapo_iOS",
|
|
332
|
+
Accept: "*/*",
|
|
333
|
+
"Accept-Language": "de-DE;q=1, uk-DE;q=0.9, en-DE;q=0.8",
|
|
334
|
+
"Content-Type": "application/json;UTF-8",
|
|
335
|
+
"User-Agent": "Tapo/2.9.7 (iPhone; iOS 14.8; Scale/3.00)",
|
|
336
|
+
"x-term-id": this.termId,
|
|
337
|
+
"x-app-version": "2.9.7",
|
|
338
|
+
"x-net-type": "wifi"
|
|
339
|
+
}
|
|
340
|
+
}).then(async (res2) => {
|
|
341
|
+
this.log.debug(JSON.stringify(res2.data));
|
|
342
|
+
if (res2.data.error_code) {
|
|
343
|
+
this.log.error(JSON.stringify(res2.data));
|
|
344
|
+
return;
|
|
345
|
+
} else {
|
|
346
|
+
this.devices[id] = { ...this.devices[id], ...res2.data };
|
|
347
|
+
}
|
|
348
|
+
}).catch((error) => {
|
|
349
|
+
this.log.error(error);
|
|
350
|
+
error.response && this.log.error(JSON.stringify(error.response.data));
|
|
351
|
+
});
|
|
352
|
+
if (!this.devices[id].ip) {
|
|
353
|
+
const body2 = `{"requestData":{"method":"get_device_info","terminalUUID":${this.termId}},"deviceId":"${id}"}`;
|
|
354
|
+
const md52 = import_crypto.default.createHash("md5").update(body2).digest("base64");
|
|
355
|
+
this.log.debug(md52);
|
|
356
|
+
const content2 = md52 + "\n9999999999\nfee66616-58dd-4bcb-be79-fe092d800a21\n/api/v2/common/passthrough";
|
|
357
|
+
const signature2 = import_crypto.default.createHmac("sha1", this.secret).update(content2).digest("hex");
|
|
358
|
+
await this.requestClient({
|
|
359
|
+
method: "post",
|
|
360
|
+
url: `https://n-euw1-wap-gw.tplinkcloud.com/api/v2/common/passthrough?token=${this.session.token}&termID=${this.termId}&appVer=2.8.21&locale=de_DE&appName=TP-Link_Tapo_iOS&netType=wifi&model=iPhone10%2C5&termName=iPhone&termMeta=3&brand=TPLINK&ospf=iOS%2014.8`,
|
|
361
|
+
headers: {
|
|
362
|
+
"Content-Type": "application/json;UTF-8",
|
|
363
|
+
"Content-MD5": md52,
|
|
364
|
+
Accept: "*/*",
|
|
365
|
+
"User-Agent": "Tapo/2.8.21 (iPhone; iOS 14.8; Scale/3.00)",
|
|
366
|
+
"Accept-Language": "de-DE;q=1, uk-DE;q=0.9, en-DE;q=0.8",
|
|
367
|
+
"X-Authorization": "Timestamp=9999999999, Nonce=fee66616-58dd-4bcb-be79-fe092d800a21, AccessKey=4d11b6b9d5ea4d19a829adbb9714b057, Signature=" + signature2
|
|
368
|
+
},
|
|
369
|
+
data: body2
|
|
370
|
+
}).then(async (res2) => {
|
|
371
|
+
var _a2, _b2;
|
|
372
|
+
this.log.debug(JSON.stringify(res2.data));
|
|
373
|
+
let result = {};
|
|
374
|
+
if (res2.data.error_code) {
|
|
375
|
+
this.log.error(JSON.stringify(res2.data));
|
|
376
|
+
} else {
|
|
377
|
+
result = (_b2 = (_a2 = res2.data.result) == null ? void 0 : _a2.responseData) == null ? void 0 : _b2.result;
|
|
378
|
+
this.devices[id] = { ...this.devices[id], ...result };
|
|
379
|
+
}
|
|
380
|
+
}).catch((error) => {
|
|
381
|
+
this.log.error(error);
|
|
382
|
+
error.response && this.log.error(JSON.stringify(error.response.data));
|
|
383
|
+
});
|
|
384
|
+
}
|
|
385
|
+
if (!this.devices[id].ip) {
|
|
386
|
+
const ipState = await this.getStateAsync(id + ".ip");
|
|
387
|
+
if (ipState && ipState.val) {
|
|
388
|
+
this.devices[id].ip = ipState.val;
|
|
389
|
+
} else {
|
|
390
|
+
await this.setObjectNotExistsAsync(id + ".ip", {
|
|
391
|
+
type: "state",
|
|
392
|
+
common: {
|
|
393
|
+
name: "IP",
|
|
394
|
+
write: true,
|
|
395
|
+
read: true,
|
|
396
|
+
type: "string",
|
|
397
|
+
role: "text"
|
|
398
|
+
},
|
|
399
|
+
native: {}
|
|
400
|
+
});
|
|
401
|
+
this.log.warn(`No IP found for ${id} put the device online or set the ip state manually`);
|
|
402
|
+
}
|
|
403
|
+
}
|
|
404
|
+
this.json2iob.parse(id, this.devices[id]);
|
|
405
|
+
if (this.devices[id].ip) {
|
|
406
|
+
const initResult = await this.initDevice(id).then(() => {
|
|
407
|
+
this.log.info(`Initialized ${id}`);
|
|
408
|
+
}).catch((e) => {
|
|
409
|
+
this.log.error(e);
|
|
410
|
+
});
|
|
411
|
+
this.log.debug(`initResult ${id} ${initResult}`);
|
|
412
|
+
}
|
|
413
|
+
}
|
|
414
|
+
}).catch((error) => {
|
|
415
|
+
this.log.error(error);
|
|
416
|
+
error.response && this.log.error(JSON.stringify(error.response.data));
|
|
417
|
+
});
|
|
418
|
+
}
|
|
419
|
+
async initDevice(id) {
|
|
420
|
+
const device = this.devices[id];
|
|
421
|
+
this.log.info(`Init device ${id} type ${device.deviceName} with ip ${device.ip}`);
|
|
422
|
+
let deviceObject;
|
|
423
|
+
if (device.deviceName === "P100") {
|
|
424
|
+
deviceObject = new import_p100.default(this.log, device.ip, this.config.username, this.config.password, 2);
|
|
425
|
+
} else if (device.deviceName === "P110" || device.deviceName === "P115") {
|
|
426
|
+
deviceObject = new import_p110.default(this.log, device.ip, this.config.username, this.config.password, 2);
|
|
427
|
+
} else if (device.deviceName === "L530") {
|
|
428
|
+
deviceObject = new import_l530.default(this.log, device.ip, this.config.username, this.config.password, 2);
|
|
429
|
+
} else if (device.deviceName.startsWith("L") || device.deviceName.startsWith("KL")) {
|
|
430
|
+
deviceObject = new import_l510e.default(this.log, device.ip, this.config.username, this.config.password, 2);
|
|
431
|
+
} else {
|
|
432
|
+
this.log.info(`Unknown device type ${device.deviceName} init as P100`);
|
|
433
|
+
deviceObject = new import_p100.default(this.log, device.ip, this.config.username, this.config.password, 2);
|
|
434
|
+
}
|
|
435
|
+
this.deviceObjects[id] = deviceObject;
|
|
436
|
+
await deviceObject.handshake().then(() => {
|
|
437
|
+
deviceObject.login().then(() => {
|
|
438
|
+
deviceObject.getDeviceInfo().then(async (sysInfo) => {
|
|
439
|
+
this.log.debug(JSON.stringify(sysInfo));
|
|
440
|
+
if (sysInfo.request) {
|
|
441
|
+
this.log.error("Malformed response sysinfo");
|
|
442
|
+
this.log.error(JSON.stringify(sysInfo));
|
|
443
|
+
return;
|
|
444
|
+
}
|
|
445
|
+
this.json2iob.parse(id, sysInfo);
|
|
446
|
+
this.deviceObjects[id]._connected = true;
|
|
447
|
+
if (this.deviceObjects[id].getEnergyUsage) {
|
|
448
|
+
this.log.debug("Receive energy usage");
|
|
449
|
+
const energyUsage = await this.deviceObjects[id].getEnergyUsage();
|
|
450
|
+
this.log.debug(JSON.stringify(energyUsage));
|
|
451
|
+
this.json2iob.parse(id, energyUsage);
|
|
452
|
+
}
|
|
453
|
+
}).catch(() => {
|
|
454
|
+
this.log.error("52 - Get Device Info failed");
|
|
455
|
+
this.deviceObjects[id]._connected = false;
|
|
456
|
+
});
|
|
457
|
+
}).catch(() => {
|
|
458
|
+
this.log.error("Login failed");
|
|
459
|
+
this.deviceObjects[id]._connected = false;
|
|
460
|
+
});
|
|
461
|
+
}).catch(() => {
|
|
462
|
+
this.log.error("Handshake failed");
|
|
463
|
+
this.deviceObjects[id]._connected = false;
|
|
464
|
+
});
|
|
465
|
+
}
|
|
466
|
+
async updateDevices() {
|
|
467
|
+
try {
|
|
468
|
+
for (const deviceId in this.deviceObjects) {
|
|
469
|
+
if (!this.deviceObjects[deviceId]._connected) {
|
|
470
|
+
continue;
|
|
471
|
+
}
|
|
472
|
+
this.deviceObjects[deviceId].getDeviceInfo().then(async (sysInfo) => {
|
|
473
|
+
this.log.debug(JSON.stringify(sysInfo));
|
|
474
|
+
if (sysInfo.name === "Error" || sysInfo.request) {
|
|
475
|
+
this.log.debug("Malformed response sysinfo");
|
|
476
|
+
return;
|
|
477
|
+
}
|
|
478
|
+
this.json2iob.parse(deviceId, sysInfo);
|
|
479
|
+
if (this.deviceObjects[deviceId].getEnergyUsage) {
|
|
480
|
+
this.log.debug("Receive energy usage");
|
|
481
|
+
const energyUsage = await this.deviceObjects[deviceId].getEnergyUsage();
|
|
482
|
+
this.log.debug(JSON.stringify(energyUsage));
|
|
483
|
+
if (energyUsage.request) {
|
|
484
|
+
this.log.error("Malformed response getEnergyUsage");
|
|
485
|
+
this.log.error(JSON.stringify(energyUsage));
|
|
486
|
+
return;
|
|
487
|
+
}
|
|
488
|
+
this.json2iob.parse(deviceId, energyUsage);
|
|
489
|
+
const power_usage = this.deviceObjects[deviceId].getPowerConsumption();
|
|
490
|
+
if (power_usage.request) {
|
|
491
|
+
this.log.error("Malformed response getPowerConsumption");
|
|
492
|
+
this.log.error(JSON.stringify(power_usage));
|
|
493
|
+
return;
|
|
494
|
+
}
|
|
495
|
+
this.json2iob.parse(deviceId, power_usage);
|
|
496
|
+
}
|
|
497
|
+
}).catch((error) => {
|
|
498
|
+
this.log.error(`Get Device Info failed for ${deviceId} - ${error}`);
|
|
499
|
+
});
|
|
500
|
+
}
|
|
501
|
+
} catch (error) {
|
|
502
|
+
this.log.error(error);
|
|
503
|
+
}
|
|
504
|
+
}
|
|
505
|
+
async sleep(ms) {
|
|
506
|
+
return new Promise((resolve) => setTimeout(resolve, ms));
|
|
507
|
+
}
|
|
508
|
+
async refreshToken() {
|
|
509
|
+
this.log.debug("Refresh token");
|
|
510
|
+
}
|
|
511
|
+
onUnload(callback) {
|
|
512
|
+
try {
|
|
513
|
+
this.setState("info.connection", false, true);
|
|
514
|
+
this.refreshTimeout && clearTimeout(this.refreshTimeout);
|
|
515
|
+
this.reLoginTimeout && clearTimeout(this.reLoginTimeout);
|
|
516
|
+
this.refreshTokenTimeout && clearTimeout(this.refreshTokenTimeout);
|
|
517
|
+
this.updateInterval && clearInterval(this.updateInterval);
|
|
518
|
+
this.refreshTokenInterval && clearInterval(this.refreshTokenInterval);
|
|
519
|
+
callback();
|
|
520
|
+
} catch (e) {
|
|
521
|
+
callback();
|
|
522
|
+
}
|
|
523
|
+
}
|
|
524
|
+
async onStateChange(id, state) {
|
|
525
|
+
if (state) {
|
|
526
|
+
if (!state.ack) {
|
|
527
|
+
const deviceId = id.split(".")[2];
|
|
528
|
+
const command = id.split(".")[4];
|
|
529
|
+
if (id.split(".")[3] !== "remote") {
|
|
530
|
+
return;
|
|
531
|
+
}
|
|
532
|
+
if (command === "Refresh") {
|
|
533
|
+
this.deviceObjects[deviceId].getDeviceInfo().then((sysInfo) => {
|
|
534
|
+
this.log.debug(JSON.stringify(sysInfo));
|
|
535
|
+
this.json2iob.parse(deviceId, sysInfo);
|
|
536
|
+
}).catch((error) => {
|
|
537
|
+
this.log.error(`Get Device Info failed for ${deviceId} - ${error}`);
|
|
538
|
+
});
|
|
539
|
+
return;
|
|
540
|
+
}
|
|
541
|
+
try {
|
|
542
|
+
if (this.deviceObjects[deviceId] && this.deviceObjects[deviceId][command]) {
|
|
543
|
+
if (command === "setColor") {
|
|
544
|
+
const valueSplit = state.val.split(", ");
|
|
545
|
+
const result = await this.deviceObjects[deviceId][command](valueSplit[0], valueSplit[1]);
|
|
546
|
+
this.log.info(JSON.stringify(result));
|
|
547
|
+
} else {
|
|
548
|
+
const result = await this.deviceObjects[deviceId][command](state.val);
|
|
549
|
+
this.log.info(JSON.stringify(result));
|
|
550
|
+
}
|
|
551
|
+
this.refreshTimeout && clearTimeout(this.refreshTimeout);
|
|
552
|
+
this.refreshTimeout = setTimeout(async () => {
|
|
553
|
+
await this.updateDevices();
|
|
554
|
+
}, 2 * 1e3);
|
|
555
|
+
} else {
|
|
556
|
+
this.log.error(`Device ${deviceId} has no command ${command}`);
|
|
557
|
+
}
|
|
558
|
+
} catch (error) {
|
|
559
|
+
this.log.error(error);
|
|
560
|
+
}
|
|
561
|
+
} else {
|
|
562
|
+
const resultDict = { device_on: "setPowerState" };
|
|
563
|
+
const idArray = id.split(".");
|
|
564
|
+
const stateName = idArray[idArray.length - 1];
|
|
565
|
+
const deviceId = id.split(".")[2];
|
|
566
|
+
if (resultDict[stateName]) {
|
|
567
|
+
await this.setStateAsync(deviceId + ".remote." + resultDict[stateName], state.val, true);
|
|
568
|
+
}
|
|
569
|
+
}
|
|
570
|
+
}
|
|
571
|
+
}
|
|
572
|
+
}
|
|
573
|
+
if (require.main !== module) {
|
|
574
|
+
module.exports = (options) => new Tapo(options);
|
|
575
|
+
} else {
|
|
576
|
+
(() => new Tapo())();
|
|
577
|
+
}
|
|
578
|
+
//# sourceMappingURL=main.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../src/main.ts"],
|
|
4
|
+
"sourcesContent": ["/*\n * Created with @iobroker/create-adapter v2.1.1\n */\n\n// The adapter-core module gives you access to the core ioBroker functions\n// you need to create an adapter\nimport * as utils from \"@iobroker/adapter-core\";\nimport axios, { AxiosInstance } from \"axios\";\nimport crypto from \"crypto\";\nimport https from \"https\";\nimport { v4 as uuidv4 } from \"uuid\";\nimport Json2iob from \"./lib/json2iob\";\nimport L510E from \"./lib/utils/l510e\";\nimport L530 from \"./lib/utils/l530\";\nimport P100 from \"./lib/utils/p100\";\nimport P110 from \"./lib/utils/p110\";\nclass Tapo extends utils.Adapter {\n private devices: { [key: string]: any };\n private deviceObjects: { [key: string]: any };\n private json2iob: Json2iob;\n private secret: Buffer;\n private requestClient: AxiosInstance;\n updateInterval: any = null;\n reLoginTimeout: any = null;\n refreshTokenTimeout: any = null;\n session: any = {};\n refreshTimeout: any;\n refreshTokenInterval: any;\n termId: any;\n public constructor(options: Partial<utils.AdapterOptions> = {}) {\n super({\n ...options,\n name: \"tapo\",\n });\n this.on(\"ready\", this.onReady.bind(this));\n this.on(\"stateChange\", this.onStateChange.bind(this));\n this.on(\"unload\", this.onUnload.bind(this));\n this.devices = {};\n this.deviceObjects = {};\n this.json2iob = new Json2iob(this);\n this.requestClient = axios.create({\n httpsAgent: new https.Agent({\n rejectUnauthorized: false,\n }),\n });\n this.secret = Buffer.from([\n 54, 101, 100, 55, 100, 57, 55, 102, 51, 101, 55, 51, 52, 54, 55, 102, 56, 97, 53, 98, 97, 98, 57, 48, 98, 53, 55,\n 55, 98, 97, 52, 99,\n ]);\n }\n\n /**\n * Is called when databases are connected and adapter received configuration.\n */\n private async onReady(): Promise<void> {\n this.setState(\"info.connection\", false, true);\n if (this.config.interval < 0.5) {\n this.log.info(\"Set interval to minimum 0.5\");\n this.config.interval = 0.5;\n }\n if (!this.config.username || !this.config.password) {\n this.log.error(\"Please set username and password in the instance settings\");\n return;\n }\n\n this.updateInterval = null;\n this.reLoginTimeout = null;\n this.refreshTokenTimeout = null;\n this.session = {};\n this.subscribeStates(\"*\");\n\n const termIdState = await this.getStateAsync(\"termId\");\n if (termIdState && termIdState.val) {\n this.termId = termIdState.val;\n } else {\n await this.setObjectNotExistsAsync(\"termId\", {\n type: \"state\",\n common: {\n name: \"Terminal ID\",\n write: false,\n read: true,\n type: \"string\",\n role: \"text\",\n },\n native: {},\n });\n this.termId = uuidv4();\n await this.setStateAsync(\"termId\", this.termId, true);\n }\n\n this.log.info(\"Login tp TAPO App\");\n await this.login();\n if (this.session.token) {\n await this.getDeviceList();\n this.log.info(\"Wait for connections\");\n await this.sleep(10000);\n await this.updateDevices();\n this.updateInterval = setInterval(async () => {\n await this.updateDevices();\n }, this.config.interval * 1000);\n }\n }\n async login(): Promise<void> {\n let body = JSON.stringify({\n appVersion: \"2.8.21\",\n refreshTokenNeeded: true,\n platform: \"iOS 14.8\",\n cloudPassword: this.config.password,\n terminalUUID: \"CDE6601E-148C-4CB7-831F-FD587E999D99\",\n cloudUserName: this.config.username,\n terminalName: \"iPhone\",\n terminalMeta: \"3\",\n appType: \"TP-Link_Tapo_iOS\",\n });\n let path = \"api/v2/account/login\";\n const mfaIdState = await this.getStateAsync(\"mfaId\");\n if (mfaIdState && mfaIdState.val) {\n if (!this.config.mfa) {\n this.log.error(\"Please set mfa in the instance settings\");\n return;\n }\n\n body = JSON.stringify({\n cloudUserName: this.config.username,\n MFAProcessId: mfaIdState.val,\n appType: \"TP-Link_Tapo_iOS\",\n MFAType: 2,\n code: this.config.mfa,\n terminalBindEnabled: true,\n });\n path = \"api/v2/account/checkMFACodeAndLogin\";\n await this.setStateAsync(\"mfaId\", \"\", true);\n }\n const md5 = crypto.createHash(\"md5\").update(body).digest(\"base64\");\n this.log.debug(md5);\n const content = md5 + \"\\n9999999999\\nfee66616-58dd-4bcb-be79-fe092d800a21\\n/\" + path;\n const signature = crypto.createHmac(\"sha1\", this.secret).update(content).digest(\"hex\");\n await this.requestClient({\n method: \"post\",\n url:\n \"https://n-wap-gw.tplinkcloud.com/\" +\n path +\n \"?termID=\" +\n this.termId +\n \"&appVer=2.8.21&locale=de_DE&appName=TP-Link_Tapo_iOS&netType=wifi&model=iPhone10%2C5&termName=iPhone&termMeta=3&brand=TPLINK&ospf=iOS%2014.8\",\n headers: {\n \"Content-Type\": \"application/json;UTF-8\",\n Accept: \"*/*\",\n \"User-Agent\": \"Tapo/2.8.21 (iPhone; iOS 14.8; Scale/3.00)\",\n \"Accept-Language\": \"de-DE;q=1, uk-DE;q=0.9, en-DE;q=0.8\",\n \"X-Authorization\":\n \"Timestamp=9999999999, Nonce=fee66616-58dd-4bcb-be79-fe092d800a21, AccessKey=4d11b6b9d5ea4d19a829adbb9714b057, Signature=\" +\n signature,\n },\n data: body,\n })\n .then(async (res) => {\n this.log.debug(JSON.stringify(res.data));\n if (res.data.error_code) {\n this.log.error(JSON.stringify(res.data));\n return;\n }\n if (res.data.result?.MFAProcessId) {\n this.log.info(\"Found MFA Process please enter MFA in the instance settings\");\n await this.setObjectNotExistsAsync(\"mfaId\", {\n type: \"state\",\n common: {\n name: \"MFA Id\",\n write: false,\n read: true,\n type: \"string\",\n role: \"text\",\n },\n native: {},\n });\n await this.setStateAsync(\"mfaId\", res.data.result?.MFAProcessId, true);\n\n const body = JSON.stringify({\n cloudPassword: this.config.password,\n locale: \"de_DE\",\n terminalUUID: \"CDE6601E-148C-4CB7-831F-FD587E999D99\",\n cloudUserName: this.config.username,\n appType: \"TP-Link_Tapo_iOS\",\n });\n\n const path = \"api/v2/account/getEmailVC4TerminalMFA\";\n\n const md5 = crypto.createHash(\"md5\").update(body).digest(\"base64\");\n this.log.debug(md5);\n const content = md5 + \"\\n9999999999\\nfee66616-58dd-4bcb-be79-fe092d800a21\\n/\" + path;\n const signature = crypto.createHmac(\"sha1\", this.secret).update(content).digest(\"hex\");\n await this.requestClient({\n method: \"post\",\n url:\n \"https://n-wap-gw.tplinkcloud.com/\" +\n path +\n \"?termID=\" +\n this.termId +\n \"&appVer=2.8.21&locale=de_DE&appName=TP-Link_Tapo_iOS&netType=wifi&model=iPhone10%2C5&termName=iPhone&termMeta=3&brand=TPLINK&ospf=iOS%2014.8\",\n headers: {\n \"Content-Type\": \"application/json;UTF-8\",\n Accept: \"*/*\",\n \"User-Agent\": \"Tapo/2.8.21 (iPhone; iOS 14.8; Scale/3.00)\",\n \"Accept-Language\": \"de-DE;q=1, uk-DE;q=0.9, en-DE;q=0.8\",\n \"X-Authorization\":\n \"Timestamp=9999999999, Nonce=fee66616-58dd-4bcb-be79-fe092d800a21, AccessKey=4d11b6b9d5ea4d19a829adbb9714b057, Signature=\" +\n signature,\n },\n data: body,\n })\n .then(async (res) => {\n this.log.debug(JSON.stringify(res.data));\n if (res.data.error_code) {\n this.log.error(JSON.stringify(res.data));\n return;\n }\n })\n .catch((error) => {\n this.log.error(error);\n error.response && this.log.error(JSON.stringify(error.response.data));\n });\n return;\n }\n this.setState(\"info.connection\", true, true);\n this.session = res.data.result;\n return;\n })\n .catch((error) => {\n this.log.error(error);\n error.response && this.log.error(JSON.stringify(error.response.data));\n });\n }\n\n async getDeviceList(): Promise<void> {\n const body =\n '{\"index\":0,\"deviceTypeList\":[\"SMART.TAPOBULB\",\"SMART.TAPOPLUG\",\"SMART.IPCAMERA\",\"SMART.TAPOHUB\",\"SMART.TAPOSENSOR\",\"SMART.TAPOSWITCH\"],\"limit\":20}';\n const md5 = crypto.createHash(\"md5\").update(body).digest(\"base64\");\n this.log.debug(md5);\n const content = md5 + \"\\n9999999999\\nfee66616-58dd-4bcb-be79-fe092d800a21\\n/api/v2/common/getDeviceListByPage\";\n const signature = crypto.createHmac(\"sha1\", this.secret).update(content).digest(\"hex\");\n await this.requestClient({\n method: \"post\",\n url: `https://n-euw1-wap-gw.tplinkcloud.com/api/v2/common/getDeviceListByPage?token=${this.session.token}&termID=${this.termId}&appVer=2.8.21&locale=de_DE&appName=TP-Link_Tapo_iOS&netType=wifi&model=iPhone10%2C5&termName=iPhone&termMeta=3&brand=TPLINK&ospf=iOS%2014.8`,\n headers: {\n \"Content-Type\": \"application/json;UTF-8\",\n \"Content-MD5\": md5,\n Accept: \"*/*\",\n \"User-Agent\": \"Tapo/2.8.21 (iPhone; iOS 14.8; Scale/3.00)\",\n \"Accept-Language\": \"de-DE;q=1, uk-DE;q=0.9, en-DE;q=0.8\",\n \"X-Authorization\":\n \"Timestamp=9999999999, Nonce=fee66616-58dd-4bcb-be79-fe092d800a21, AccessKey=4d11b6b9d5ea4d19a829adbb9714b057, Signature=\" +\n signature,\n },\n data: body,\n })\n .then(async (res) => {\n this.log.debug(JSON.stringify(res.data));\n if (res.data.error_code) {\n this.log.error(JSON.stringify(res.data));\n return;\n }\n this.log.info(`Found ${res.data.result?.totalNum} devices`);\n for (const device of res.data.result?.deviceList) {\n const id = device.deviceId;\n this.devices[id] = device;\n const name = Buffer.from(device.alias, \"base64\").toString(\"utf8\");\n\n await this.setObjectNotExistsAsync(id, {\n type: \"device\",\n common: {\n name: name,\n },\n native: {},\n });\n await this.setObjectNotExistsAsync(id + \".remote\", {\n type: \"channel\",\n common: {\n name: \"Remote Controls\",\n },\n native: {},\n });\n\n const remoteArray = [\n { command: \"refresh\", name: \"True = Refresh\" },\n { command: \"setPowerState\", name: \"True = On, False = Off\" },\n {\n command: \"setBrightness\",\n name: \"Set Brightness for Light devices\",\n type: \"number\",\n role: \"level.brightness\",\n def: 5,\n },\n {\n command: \"setColorTemp\",\n name: \"Set Color Temp for Light devices\",\n type: \"number\",\n role: \"level.color.temperature\",\n def: 3000,\n },\n {\n command: \"setColor\",\n name: \"Set Color for Light devices (hue, saturation)\",\n def: \"30, 100\",\n type: \"string\",\n },\n ];\n remoteArray.forEach((remote) => {\n this.setObjectNotExists(id + \".remote.\" + remote.command, {\n type: \"state\",\n common: {\n name: remote.name || \"\",\n type: remote.type || \"boolean\",\n role: remote.role || \"boolean\",\n def: remote.def || false,\n write: true,\n read: true,\n },\n native: {},\n });\n });\n this.json2iob.parse(id, device);\n\n //try new API\n\n await this.requestClient({\n method: \"get\",\n url: \"https://euw1-app-server.iot.i.tplinknbu.com/v1/things/\" + id + \"/details\",\n headers: {\n \"x-locale\": \"de\",\n Authorization: \"ut|\" + this.session.token,\n \"app-cid\": \"app:TP-Link_Tapo_iOS:\" + this.termId,\n \"x-ospf\": \"iOS 14.8\",\n \"x-app-name\": \"TP-Link_Tapo_iOS\",\n Accept: \"*/*\",\n \"Accept-Language\": \"de-DE;q=1, uk-DE;q=0.9, en-DE;q=0.8\",\n \"Content-Type\": \"application/json;UTF-8\",\n \"User-Agent\": \"Tapo/2.9.7 (iPhone; iOS 14.8; Scale/3.00)\",\n \"x-term-id\": this.termId,\n \"x-app-version\": \"2.9.7\",\n \"x-net-type\": \"wifi\",\n },\n })\n .then(async (res) => {\n this.log.debug(JSON.stringify(res.data));\n if (res.data.error_code) {\n this.log.error(JSON.stringify(res.data));\n return;\n } else {\n this.devices[id] = { ...this.devices[id], ...res.data };\n }\n })\n .catch((error) => {\n this.log.error(error);\n error.response && this.log.error(JSON.stringify(error.response.data));\n });\n //no ip via new API try old api\n if (!this.devices[id].ip) {\n const body = `{\"requestData\":{\"method\":\"get_device_info\",\"terminalUUID\":${this.termId}},\"deviceId\":\"${id}\"}`;\n const md5 = crypto.createHash(\"md5\").update(body).digest(\"base64\");\n this.log.debug(md5);\n const content = md5 + \"\\n9999999999\\nfee66616-58dd-4bcb-be79-fe092d800a21\\n/api/v2/common/passthrough\";\n const signature = crypto.createHmac(\"sha1\", this.secret).update(content).digest(\"hex\");\n await this.requestClient({\n method: \"post\",\n url: `https://n-euw1-wap-gw.tplinkcloud.com/api/v2/common/passthrough?token=${this.session.token}&termID=${this.termId}&appVer=2.8.21&locale=de_DE&appName=TP-Link_Tapo_iOS&netType=wifi&model=iPhone10%2C5&termName=iPhone&termMeta=3&brand=TPLINK&ospf=iOS%2014.8`,\n headers: {\n \"Content-Type\": \"application/json;UTF-8\",\n \"Content-MD5\": md5,\n Accept: \"*/*\",\n \"User-Agent\": \"Tapo/2.8.21 (iPhone; iOS 14.8; Scale/3.00)\",\n \"Accept-Language\": \"de-DE;q=1, uk-DE;q=0.9, en-DE;q=0.8\",\n \"X-Authorization\":\n \"Timestamp=9999999999, Nonce=fee66616-58dd-4bcb-be79-fe092d800a21, AccessKey=4d11b6b9d5ea4d19a829adbb9714b057, Signature=\" +\n signature,\n },\n data: body,\n })\n .then(async (res) => {\n this.log.debug(JSON.stringify(res.data));\n let result = {};\n if (res.data.error_code) {\n this.log.error(JSON.stringify(res.data));\n } else {\n result = res.data.result?.responseData?.result;\n this.devices[id] = { ...this.devices[id], ...result };\n }\n })\n .catch((error) => {\n this.log.error(error);\n error.response && this.log.error(JSON.stringify(error.response.data));\n });\n }\n if (!this.devices[id].ip) {\n const ipState = await this.getStateAsync(id + \".ip\");\n if (ipState && ipState.val) {\n this.devices[id].ip = ipState.val;\n } else {\n await this.setObjectNotExistsAsync(id + \".ip\", {\n type: \"state\",\n common: {\n name: \"IP\",\n write: true,\n read: true,\n type: \"string\",\n role: \"text\",\n },\n native: {},\n });\n this.log.warn(`No IP found for ${id} put the device online or set the ip state manually`);\n }\n }\n this.json2iob.parse(id, this.devices[id]);\n if (this.devices[id].ip) {\n const initResult = await this.initDevice(id)\n .then(() => {\n this.log.info(`Initialized ${id}`);\n })\n .catch((e) => {\n this.log.error(e);\n });\n this.log.debug(`initResult ${id} ${initResult}`);\n }\n }\n })\n .catch((error) => {\n this.log.error(error);\n error.response && this.log.error(JSON.stringify(error.response.data));\n });\n }\n async initDevice(id: string): Promise<void> {\n const device = this.devices[id];\n this.log.info(`Init device ${id} type ${device.deviceName} with ip ${device.ip}`);\n let deviceObject: any;\n if (device.deviceName === \"P100\") {\n deviceObject = new P100(this.log, device.ip, this.config.username, this.config.password, 2);\n } else if (device.deviceName === \"P110\" || device.deviceName === \"P115\") {\n deviceObject = new P110(this.log, device.ip, this.config.username, this.config.password, 2);\n } else if (device.deviceName === \"L530\") {\n deviceObject = new L530(this.log, device.ip, this.config.username, this.config.password, 2);\n } else if (device.deviceName.startsWith(\"L\") || device.deviceName.startsWith(\"KL\")) {\n deviceObject = new L510E(this.log, device.ip, this.config.username, this.config.password, 2);\n } else {\n this.log.info(`Unknown device type ${device.deviceName} init as P100`);\n deviceObject = new P100(this.log, device.ip, this.config.username, this.config.password, 2);\n }\n this.deviceObjects[id] = deviceObject;\n await deviceObject\n .handshake()\n .then(() => {\n deviceObject\n .login()\n .then(() => {\n deviceObject\n .getDeviceInfo()\n .then(async (sysInfo: any) => {\n this.log.debug(JSON.stringify(sysInfo));\n if (sysInfo.request) {\n this.log.error(\"Malformed response sysinfo\");\n this.log.error(JSON.stringify(sysInfo));\n return;\n }\n this.json2iob.parse(id, sysInfo);\n\n this.deviceObjects[id]._connected = true;\n if (this.deviceObjects[id].getEnergyUsage) {\n this.log.debug(\"Receive energy usage\");\n const energyUsage = await this.deviceObjects[id].getEnergyUsage();\n this.log.debug(JSON.stringify(energyUsage));\n this.json2iob.parse(id, energyUsage);\n }\n })\n .catch(() => {\n this.log.error(\"52 - Get Device Info failed\");\n\n this.deviceObjects[id]._connected = false;\n });\n })\n .catch(() => {\n this.log.error(\"Login failed\");\n this.deviceObjects[id]._connected = false;\n });\n })\n .catch(() => {\n this.log.error(\"Handshake failed\");\n this.deviceObjects[id]._connected = false;\n });\n }\n\n async updateDevices(): Promise<void> {\n try {\n for (const deviceId in this.deviceObjects) {\n if (!this.deviceObjects[deviceId]._connected) {\n continue;\n }\n this.deviceObjects[deviceId]\n .getDeviceInfo()\n .then(async (sysInfo: any) => {\n this.log.debug(JSON.stringify(sysInfo));\n if (sysInfo.name === \"Error\" || sysInfo.request) {\n this.log.debug(\"Malformed response sysinfo\");\n // this.log.error(JSON.stringify(sysInfo));\n return;\n }\n this.json2iob.parse(deviceId, sysInfo);\n if (this.deviceObjects[deviceId].getEnergyUsage) {\n this.log.debug(\"Receive energy usage\");\n const energyUsage = await this.deviceObjects[deviceId].getEnergyUsage();\n this.log.debug(JSON.stringify(energyUsage));\n if (energyUsage.request) {\n this.log.error(\"Malformed response getEnergyUsage\");\n this.log.error(JSON.stringify(energyUsage));\n return;\n }\n this.json2iob.parse(deviceId, energyUsage);\n const power_usage = this.deviceObjects[deviceId].getPowerConsumption();\n if (power_usage.request) {\n this.log.error(\"Malformed response getPowerConsumption\");\n this.log.error(JSON.stringify(power_usage));\n return;\n }\n this.json2iob.parse(deviceId, power_usage);\n }\n })\n .catch((error) => {\n this.log.error(`Get Device Info failed for ${deviceId} - ${error}`);\n });\n }\n } catch (error) {\n this.log.error(error);\n }\n }\n\n async sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n }\n async refreshToken(): Promise<void> {\n this.log.debug(\"Refresh token\");\n }\n /**\n * Is called when adapter shuts down - callback has to be called under any circumstances!\n */\n private onUnload(callback: () => void): void {\n try {\n this.setState(\"info.connection\", false, true);\n this.refreshTimeout && clearTimeout(this.refreshTimeout);\n this.reLoginTimeout && clearTimeout(this.reLoginTimeout);\n this.refreshTokenTimeout && clearTimeout(this.refreshTokenTimeout);\n this.updateInterval && clearInterval(this.updateInterval);\n this.refreshTokenInterval && clearInterval(this.refreshTokenInterval);\n\n callback();\n } catch (e) {\n callback();\n }\n }\n\n /**\n * Is called if a subscribed state changes\n */\n private async onStateChange(id: string, state: ioBroker.State | null | undefined): Promise<void> {\n if (state) {\n if (!state.ack) {\n const deviceId = id.split(\".\")[2];\n const command = id.split(\".\")[4];\n if (id.split(\".\")[3] !== \"remote\") {\n return;\n }\n\n if (command === \"Refresh\") {\n this.deviceObjects[deviceId]\n .getDeviceInfo()\n .then((sysInfo: any) => {\n this.log.debug(JSON.stringify(sysInfo));\n this.json2iob.parse(deviceId, sysInfo);\n })\n .catch((error) => {\n this.log.error(`Get Device Info failed for ${deviceId} - ${error}`);\n });\n\n return;\n }\n try {\n if (this.deviceObjects[deviceId] && this.deviceObjects[deviceId][command]) {\n if (command === \"setColor\") {\n const valueSplit = state.val.split(\", \");\n const result = await this.deviceObjects[deviceId][command](valueSplit[0], valueSplit[1]);\n this.log.info(JSON.stringify(result));\n } else {\n const result = await this.deviceObjects[deviceId][command](state.val);\n this.log.info(JSON.stringify(result));\n }\n this.refreshTimeout && clearTimeout(this.refreshTimeout);\n this.refreshTimeout = setTimeout(async () => {\n await this.updateDevices();\n }, 2 * 1000);\n } else {\n this.log.error(`Device ${deviceId} has no command ${command}`);\n }\n } catch (error) {\n this.log.error(error);\n }\n } else {\n const resultDict = { device_on: \"setPowerState\" };\n const idArray = id.split(\".\");\n const stateName = idArray[idArray.length - 1];\n const deviceId = id.split(\".\")[2];\n if (resultDict[stateName]) {\n await this.setStateAsync(deviceId + \".remote.\" + resultDict[stateName], state.val, true);\n }\n }\n }\n }\n}\n\nif (require.main !== module) {\n // Export the constructor in compact mode\n module.exports = (options: Partial<utils.AdapterOptions> | undefined) => new Tapo(options);\n} else {\n // otherwise start the instance directly\n (() => new Tapo())();\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["Json2iob", "axios", "https", "uuidv4", "crypto", "body", "path", "md5", "content", "signature", "res", "_a", "_b", "P100", "P110", "L530", "L510E"]
|
|
7
|
+
}
|