iobroker.hydrawise 0.0.15 → 0.0.17
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 +40 -5
- package/build/main.js +57 -37
- package/build/main.js.map +2 -2
- package/io-package.json +33 -27
- package/package.json +10 -10
package/README.md
CHANGED
|
@@ -2,14 +2,49 @@
|
|
|
2
2
|
|
|
3
3
|
# ioBroker.hydrawise
|
|
4
4
|
|
|
5
|
-
[](https://www.npmjs.com/package/iobroker.hydrawise)
|
|
6
|
-
[](https://www.npmjs.com/package/iobroker.hydrawise)
|
|
7
|
-
](https://www.npmjs.com/package/iobroker.hydrawise)
|
|
6
|
+
[](https://www.npmjs.com/package/iobroker.hydrawise)
|
|
7
|
+

|
|
8
|
+

|
|
9
9
|
|
|
10
|
-
|
|
10
|
+

|
|
11
|
+

|
|
12
|
+

|
|
13
|
+

|
|
14
|
+

|
|
15
|
+

|
|
16
|
+
|
|
17
|
+
## Versions
|
|
18
|
+
|
|
19
|
+

|
|
20
|
+

|
|
21
|
+

|
|
22
|
+
|
|
23
|
+
Integrate your Hydrawise controller into iobroker.
|
|
24
|
+
You can see all controller information, schedules and sensors. It is also possible to suspend planned watering by x seconds.
|
|
25
|
+
|
|
26
|
+
## Documentation
|
|
27
|
+
|
|
28
|
+
- log into https://app.hydrawise.com/config/account-details
|
|
29
|
+
- generate API Key by clicking "Generate API Key" under "Account Settings"
|
|
30
|
+
- paste key into adapter settings
|
|
11
31
|
|
|
12
32
|
## Changelog
|
|
33
|
+
### 0.0.17 (2023-08-03)
|
|
34
|
+
|
|
35
|
+
- (SentiQ) fixed adapter crash
|
|
36
|
+
|
|
37
|
+
### 0.0.16 (2023-08-02)
|
|
38
|
+
|
|
39
|
+
- (SentiQ) added more information to README
|
|
40
|
+
- (SentiQ) encrypted apiKey
|
|
41
|
+
- (SentiQ) removed logging of apiKey
|
|
42
|
+
- (SentiQ) added filtering of invalid characters in ids
|
|
43
|
+
- (SentiQ) added check of ack flag
|
|
44
|
+
- (SentiQ) fixed roles
|
|
45
|
+
- (SentiQ) fixed error message
|
|
46
|
+
- (SentiQ) removed usage of clearTimeout
|
|
47
|
+
|
|
13
48
|
### 0.0.15 (2023-06-29)
|
|
14
49
|
|
|
15
50
|
- (SentiQ) updated dependencies
|
package/build/main.js
CHANGED
|
@@ -37,7 +37,6 @@ class Hydrawise extends utils.Adapter {
|
|
|
37
37
|
if (!this.config.apiKey) {
|
|
38
38
|
this.log.error("No API-Key definded!");
|
|
39
39
|
} else {
|
|
40
|
-
this.log.info("config apiKey: " + this.config.apiKey);
|
|
41
40
|
this.setStateChangedAsync("info.connection", false, true);
|
|
42
41
|
await this.GetStatusSchedule(this.config.apiKey);
|
|
43
42
|
await this.GetCustomerDetails(this.config.apiKey);
|
|
@@ -46,10 +45,13 @@ class Hydrawise extends utils.Adapter {
|
|
|
46
45
|
}
|
|
47
46
|
async GetStatusSchedule(apiKey) {
|
|
48
47
|
return new Promise((resolve, reject) => {
|
|
49
|
-
nextpollSchedule = nextpollSchedule || this.setTimeout(
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
48
|
+
nextpollSchedule = nextpollSchedule || this.setTimeout(
|
|
49
|
+
() => {
|
|
50
|
+
nextpollSchedule = null;
|
|
51
|
+
this.GetStatusSchedule(apiKey);
|
|
52
|
+
},
|
|
53
|
+
5 * 60 * 1e3
|
|
54
|
+
);
|
|
53
55
|
this.buildRequest("statusschedule.php", { api_key: this.config.apiKey }).then(async (response) => {
|
|
54
56
|
if (response.status === 200) {
|
|
55
57
|
const content = response.data;
|
|
@@ -71,7 +73,7 @@ class Hydrawise extends utils.Adapter {
|
|
|
71
73
|
"zh-cn": "\u505C\u6B62\u6240\u6709\u5730\u533A"
|
|
72
74
|
},
|
|
73
75
|
type: "boolean",
|
|
74
|
-
role: "button",
|
|
76
|
+
role: "button.start",
|
|
75
77
|
read: false,
|
|
76
78
|
write: true
|
|
77
79
|
},
|
|
@@ -94,9 +96,9 @@ class Hydrawise extends utils.Adapter {
|
|
|
94
96
|
"zh-cn": "\u8DD1\u9053\u533A"
|
|
95
97
|
},
|
|
96
98
|
type: "number",
|
|
97
|
-
role: "
|
|
99
|
+
role: "level",
|
|
98
100
|
unit: "seconds",
|
|
99
|
-
read:
|
|
101
|
+
read: true,
|
|
100
102
|
write: true
|
|
101
103
|
},
|
|
102
104
|
native: {}
|
|
@@ -118,13 +120,14 @@ class Hydrawise extends utils.Adapter {
|
|
|
118
120
|
"zh-cn": "\u505C\u6B62\u6240\u6709\xD7\u4E8C\u533A"
|
|
119
121
|
},
|
|
120
122
|
type: "number",
|
|
121
|
-
role: "
|
|
122
|
-
read:
|
|
123
|
+
role: "level",
|
|
124
|
+
read: true,
|
|
123
125
|
write: true
|
|
124
126
|
},
|
|
125
127
|
native: {}
|
|
126
128
|
});
|
|
127
|
-
for (
|
|
129
|
+
for (let key in content) {
|
|
130
|
+
key = this.name2id(key);
|
|
128
131
|
if (key !== "relays" && key !== "sensors" && key !== "expanders") {
|
|
129
132
|
await this.setObjectNotExistsAsync(`schedule.${key}`, {
|
|
130
133
|
type: "state",
|
|
@@ -150,7 +153,8 @@ class Hydrawise extends utils.Adapter {
|
|
|
150
153
|
native: {}
|
|
151
154
|
});
|
|
152
155
|
RELAYS[relay.relay] = relay.relay_id;
|
|
153
|
-
for (
|
|
156
|
+
for (let key in relay) {
|
|
157
|
+
key = this.name2id(key);
|
|
154
158
|
await this.setObjectNotExistsAsync(`schedule.${relay.relay}.${key}`, {
|
|
155
159
|
type: "state",
|
|
156
160
|
common: {
|
|
@@ -186,7 +190,7 @@ class Hydrawise extends utils.Adapter {
|
|
|
186
190
|
"zh-cn": "\u505C\u6B62\u5730\u533A"
|
|
187
191
|
},
|
|
188
192
|
type: "boolean",
|
|
189
|
-
role: "button",
|
|
193
|
+
role: "button.start",
|
|
190
194
|
read: false,
|
|
191
195
|
write: true
|
|
192
196
|
},
|
|
@@ -209,8 +213,8 @@ class Hydrawise extends utils.Adapter {
|
|
|
209
213
|
"zh-cn": "\xD7\u4E8C\u533A"
|
|
210
214
|
},
|
|
211
215
|
type: "number",
|
|
212
|
-
role: "
|
|
213
|
-
read:
|
|
216
|
+
role: "level",
|
|
217
|
+
read: true,
|
|
214
218
|
write: true
|
|
215
219
|
},
|
|
216
220
|
native: {}
|
|
@@ -232,8 +236,8 @@ class Hydrawise extends utils.Adapter {
|
|
|
232
236
|
"zh-cn": "\u505C\u6B62x\u4E8C\u533A"
|
|
233
237
|
},
|
|
234
238
|
type: "number",
|
|
235
|
-
role: "
|
|
236
|
-
read:
|
|
239
|
+
role: "level",
|
|
240
|
+
read: true,
|
|
237
241
|
write: true
|
|
238
242
|
},
|
|
239
243
|
native: {}
|
|
@@ -247,8 +251,9 @@ class Hydrawise extends utils.Adapter {
|
|
|
247
251
|
},
|
|
248
252
|
native: {}
|
|
249
253
|
});
|
|
250
|
-
for (
|
|
254
|
+
for (let key in sensor) {
|
|
251
255
|
if (key !== "relays") {
|
|
256
|
+
key = this.name2id(key);
|
|
252
257
|
await this.setObjectNotExistsAsync(`schedule.sensors.${sensor.input}.${key}`, {
|
|
253
258
|
type: "state",
|
|
254
259
|
common: {
|
|
@@ -271,11 +276,15 @@ class Hydrawise extends utils.Adapter {
|
|
|
271
276
|
}
|
|
272
277
|
resolve(response.status);
|
|
273
278
|
}).catch((error) => {
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
+
var _a;
|
|
280
|
+
if (((_a = error.response) == null ? void 0 : _a.status) === 429) {
|
|
281
|
+
nextpollSchedule = nextpollSchedule || this.setTimeout(
|
|
282
|
+
() => {
|
|
283
|
+
nextpollSchedule = null;
|
|
284
|
+
this.GetStatusSchedule(apiKey);
|
|
285
|
+
},
|
|
286
|
+
5 * 60 * 1e3
|
|
287
|
+
);
|
|
279
288
|
} else {
|
|
280
289
|
this.log.debug(`(stats) received error - API is now offline: ${JSON.stringify(error)}`);
|
|
281
290
|
this.setStateChangedAsync("info.connection", false, true);
|
|
@@ -286,16 +295,20 @@ class Hydrawise extends utils.Adapter {
|
|
|
286
295
|
}
|
|
287
296
|
async GetCustomerDetails(apiKey) {
|
|
288
297
|
return new Promise((resolve, reject) => {
|
|
289
|
-
nextpollCustomer = nextpollCustomer || this.setTimeout(
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
298
|
+
nextpollCustomer = nextpollCustomer || this.setTimeout(
|
|
299
|
+
() => {
|
|
300
|
+
nextpollCustomer = null;
|
|
301
|
+
this.GetCustomerDetails(apiKey);
|
|
302
|
+
},
|
|
303
|
+
5 * 60 * 1e3
|
|
304
|
+
);
|
|
293
305
|
this.buildRequest("customerdetails.php", { api_key: this.config.apiKey }).then(async (response) => {
|
|
294
306
|
if (response.status === 200) {
|
|
295
307
|
const content = response.data;
|
|
296
308
|
this.setStateChangedAsync("info.connection", true, true);
|
|
297
|
-
for (
|
|
309
|
+
for (let key in content) {
|
|
298
310
|
if (key !== "controllers") {
|
|
311
|
+
key = this.name2id(key);
|
|
299
312
|
await this.setObjectNotExistsAsync(`customer.${key}`, {
|
|
300
313
|
type: "state",
|
|
301
314
|
common: {
|
|
@@ -318,7 +331,8 @@ class Hydrawise extends utils.Adapter {
|
|
|
318
331
|
},
|
|
319
332
|
native: {}
|
|
320
333
|
});
|
|
321
|
-
for (
|
|
334
|
+
for (let key in controller) {
|
|
335
|
+
key = this.name2id(key);
|
|
322
336
|
await this.setObjectNotExistsAsync(`customer.controllers.${controller.name}.${key}`, {
|
|
323
337
|
type: "state",
|
|
324
338
|
common: {
|
|
@@ -345,10 +359,13 @@ class Hydrawise extends utils.Adapter {
|
|
|
345
359
|
resolve(response.status);
|
|
346
360
|
}).catch((error) => {
|
|
347
361
|
if (error.response.status === 429) {
|
|
348
|
-
nextpollCustomer = nextpollCustomer || this.setTimeout(
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
|
|
362
|
+
nextpollCustomer = nextpollCustomer || this.setTimeout(
|
|
363
|
+
() => {
|
|
364
|
+
nextpollCustomer = null;
|
|
365
|
+
this.GetCustomerDetails(apiKey);
|
|
366
|
+
},
|
|
367
|
+
5 * 60 * 1e3
|
|
368
|
+
);
|
|
352
369
|
} else {
|
|
353
370
|
this.log.debug(`(stats) received error - API is now offline: ${JSON.stringify(error)}`);
|
|
354
371
|
this.setStateChangedAsync("info.connection", false, true);
|
|
@@ -392,21 +409,21 @@ class Hydrawise extends utils.Adapter {
|
|
|
392
409
|
reject(error);
|
|
393
410
|
});
|
|
394
411
|
} else {
|
|
395
|
-
reject("
|
|
412
|
+
reject("API key is not configured");
|
|
396
413
|
}
|
|
397
414
|
});
|
|
398
415
|
}
|
|
399
416
|
onUnload(callback) {
|
|
400
417
|
try {
|
|
401
|
-
|
|
402
|
-
|
|
418
|
+
this.clearInterval(nextpollSchedule);
|
|
419
|
+
this.clearInterval(nextpollCustomer);
|
|
403
420
|
callback();
|
|
404
421
|
} catch (e) {
|
|
405
422
|
callback();
|
|
406
423
|
}
|
|
407
424
|
}
|
|
408
425
|
onStateChange(id, state) {
|
|
409
|
-
if (state) {
|
|
426
|
+
if (state && !state.ack) {
|
|
410
427
|
if (id.indexOf("stopall") !== -1) {
|
|
411
428
|
this.buildRequest("setzone.php", { api_key: this.config.apiKey, action: "stopall" });
|
|
412
429
|
} else if (id.indexOf("stop") !== -1) {
|
|
@@ -463,6 +480,9 @@ class Hydrawise extends utils.Adapter {
|
|
|
463
480
|
this.log.info(`state ${id} deleted`);
|
|
464
481
|
}
|
|
465
482
|
}
|
|
483
|
+
name2id(pName) {
|
|
484
|
+
return (pName || "").replace(this.FORBIDDEN_CHARS, "_");
|
|
485
|
+
}
|
|
466
486
|
}
|
|
467
487
|
if (require.main !== module) {
|
|
468
488
|
module.exports = (options) => new Hydrawise(options);
|
package/build/main.js.map
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../src/main.ts"],
|
|
4
|
-
"sourcesContent": ["/*\n * Created with @iobroker/create-adapter v2.3.0\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 from \"axios\";\n\nconst hydrawise_url = \"https://api.hydrawise.com\";\nlet nextpollSchedule: any = null;\nlet nextpollCustomer: any = null;\nconst RELAYS: any = Object;\n\nclass Hydrawise extends utils.Adapter {\n\tpublic constructor(options: Partial<utils.AdapterOptions> = {}) {\n\t\tsuper({\n\t\t\t...options,\n\t\t\tname: \"hydrawise\",\n\t\t});\n\n\t\tthis.on(\"ready\", this.onReady.bind(this));\n\t\tthis.on(\"stateChange\", this.onStateChange.bind(this));\n\t\tthis.on(\"unload\", this.onUnload.bind(this));\n\t}\n\n\tprivate async onReady(): Promise<void> {\n\t\tif (!this.config.apiKey) {\n\t\t\tthis.log.error(\"No API-Key definded!\");\n\t\t} else {\n\t\t\tthis.log.info(\"config apiKey: \" + this.config.apiKey);\n\n\t\t\tthis.setStateChangedAsync(\"info.connection\", false, true);\n\n\t\t\tawait this.GetStatusSchedule(this.config.apiKey);\n\n\t\t\tawait this.GetCustomerDetails(this.config.apiKey);\n\n\t\t\tawait this.subscribeStatesAsync(\"*\");\n\t\t}\n\t}\n\n\tprivate async GetStatusSchedule(apiKey: string): Promise<void> {\n\t\treturn new Promise((resolve, reject) => {\n\t\t\tnextpollSchedule =\n\t\t\t\tnextpollSchedule ||\n\t\t\t\tthis.setTimeout(() => {\n\t\t\t\t\tnextpollSchedule = null;\n\t\t\t\t\tthis.GetStatusSchedule(apiKey);\n\t\t\t\t}, 5 * 60 * 1000);\n\n\t\t\tthis.buildRequest(\"statusschedule.php\", { api_key: this.config.apiKey })\n\t\t\t\t.then(async (response) => {\n\t\t\t\t\tif (response.status === 200) {\n\t\t\t\t\t\tconst content = response.data;\n\n\t\t\t\t\t\tthis.setStateChangedAsync(\"info.connection\", true, true);\n\n\t\t\t\t\t\tawait this.setObjectNotExistsAsync(\"schedule.stopall\", {\n\t\t\t\t\t\t\ttype: \"state\",\n\t\t\t\t\t\t\tcommon: {\n\t\t\t\t\t\t\t\tname: {\n\t\t\t\t\t\t\t\t\ten: \"stop all zones\",\n\t\t\t\t\t\t\t\t\tde: \"alle Zonen stoppen\",\n\t\t\t\t\t\t\t\t\tru: \"\u043E\u0441\u0442\u0430\u043D\u043E\u0432\u0438\u0442\u044C \u0432\u0441\u0435 \u0437\u043E\u043D\u044B\",\n\t\t\t\t\t\t\t\t\tpt: \"parar todas as zonas\",\n\t\t\t\t\t\t\t\t\tnl: \"stop alle zones\",\n\t\t\t\t\t\t\t\t\tfr: \"arr\u00EAter toutes les zones\",\n\t\t\t\t\t\t\t\t\tit: \"fermare tutte le zone\",\n\t\t\t\t\t\t\t\t\tes: \"detener todas las zonas\",\n\t\t\t\t\t\t\t\t\tpl: \"zatrzymuj\u0105 wszystkie strefy\",\n\t\t\t\t\t\t\t\t\tuk: \"\u0437\u0443\u043F\u0438\u043D\u0438\u0442\u0438 \u0432\u0441\u0456 \u0437\u043E\u043D\u0438\",\n\t\t\t\t\t\t\t\t\t\"zh-cn\": \"\u505C\u6B62\u6240\u6709\u5730\u533A\",\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\ttype: \"boolean\",\n\t\t\t\t\t\t\t\trole: \"button\",\n\t\t\t\t\t\t\t\tread: false,\n\t\t\t\t\t\t\t\twrite: true,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\tnative: {},\n\t\t\t\t\t\t});\n\n\t\t\t\t\t\tawait this.setObjectNotExistsAsync(\"schedule.runall\", {\n\t\t\t\t\t\t\ttype: \"state\",\n\t\t\t\t\t\t\tcommon: {\n\t\t\t\t\t\t\t\tname: {\n\t\t\t\t\t\t\t\t\ten: \"run all zones for x seconds\",\n\t\t\t\t\t\t\t\t\tde: \"alle Zonen f\u00FCr x Sekunden ausf\u00FChren\",\n\t\t\t\t\t\t\t\t\tru: \"\u0437\u0430\u043F\u0443\u0441\u0442\u0438\u0442\u044C \u0432\u0441\u0435 \u0437\u043E\u043D\u044B \u0437\u0430 x \u0441\u0435\u043A\u0443\u043D\u0434\u044B\",\n\t\t\t\t\t\t\t\t\tpt: \"executar todas as zonas por x segundos\",\n\t\t\t\t\t\t\t\t\tnl: \"ren alle zones voor x seconden\",\n\t\t\t\t\t\t\t\t\tfr: \"ex\u00E9cuter toutes les zones pendant x secondes\",\n\t\t\t\t\t\t\t\t\tit: \"eseguire tutte le zone per x secondi\",\n\t\t\t\t\t\t\t\t\tes: \"ejecutar todas las zonas durante x segundos\",\n\t\t\t\t\t\t\t\t\tpl: \"wszystkie strefy startuj\u0105 dla x sekundy\",\n\t\t\t\t\t\t\t\t\tuk: \"\u0437\u0430\u043F\u0443\u0441\u0442\u0438\u0442\u0438 \u0432\u0441\u0456 \u0437\u043E\u043D\u0438 \u0434\u043B\u044F x \u0441\u0435\u043A\u0443\u043D\u0434\",\n\t\t\t\t\t\t\t\t\t\"zh-cn\": \"\u8DD1\u9053\u533A\",\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\ttype: \"number\",\n\t\t\t\t\t\t\t\trole: \"value\",\n\t\t\t\t\t\t\t\tunit: \"seconds\",\n\t\t\t\t\t\t\t\tread: false,\n\t\t\t\t\t\t\t\twrite: true,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\tnative: {},\n\t\t\t\t\t\t});\n\n\t\t\t\t\t\tawait this.setObjectNotExistsAsync(\"schedule.suspendall\", {\n\t\t\t\t\t\t\ttype: \"state\",\n\t\t\t\t\t\t\tcommon: {\n\t\t\t\t\t\t\t\tname: {\n\t\t\t\t\t\t\t\t\ten: \"suspend all zones for x seconds\",\n\t\t\t\t\t\t\t\t\tde: \"alle Zonen f\u00FCr x Sekunden aussetzen\",\n\t\t\t\t\t\t\t\t\tru: \"\u043F\u0440\u0438\u043E\u0441\u0442\u0430\u043D\u043E\u0432\u0438\u0442\u044C \u0432\u0441\u0435 \u0437\u043E\u043D\u044B \u0437\u0430 x \u0441\u0435\u043A\u0443\u043D\u0434\u044B\",\n\t\t\t\t\t\t\t\t\tpt: \"suspender todas as zonas por x segundos\",\n\t\t\t\t\t\t\t\t\tnl: \"vertaling:\",\n\t\t\t\t\t\t\t\t\tfr: \"suspendre toutes les zones pendant x secondes\",\n\t\t\t\t\t\t\t\t\tit: \"sospendere tutte le zone per x secondi\",\n\t\t\t\t\t\t\t\t\tes: \"suspender todas las zonas durante x segundos\",\n\t\t\t\t\t\t\t\t\tpl: \"wszystkie strefy zawieszenia dla x sekundy\",\n\t\t\t\t\t\t\t\t\tuk: \"\u043F\u0440\u0438\u0437\u0443\u043F\u0438\u043D\u0438\u0442\u0438 \u0432\u0441\u0456 \u0437\u043E\u043D\u0438 \u043D\u0430 x \u0441\u0435\u043A\u0443\u043D\u0434\",\n\t\t\t\t\t\t\t\t\t\"zh-cn\": \"\u505C\u6B62\u6240\u6709\u00D7\u4E8C\u533A\",\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\ttype: \"number\",\n\t\t\t\t\t\t\t\trole: \"value\",\n\t\t\t\t\t\t\t\tread: false,\n\t\t\t\t\t\t\t\twrite: true,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\tnative: {},\n\t\t\t\t\t\t});\n\n\t\t\t\t\t\tfor (const key in content) {\n\t\t\t\t\t\t\tif (key !== \"relays\" && key !== \"sensors\" && key !== \"expanders\") {\n\t\t\t\t\t\t\t\tawait this.setObjectNotExistsAsync(`schedule.${key}`, {\n\t\t\t\t\t\t\t\t\ttype: \"state\",\n\t\t\t\t\t\t\t\t\tcommon: {\n\t\t\t\t\t\t\t\t\t\tname: key,\n\t\t\t\t\t\t\t\t\t\ttype: key === \"message\" ? \"string\" : \"number\",\n\t\t\t\t\t\t\t\t\t\trole: key === \"message\" ? \"text\" : \"value\",\n\t\t\t\t\t\t\t\t\t\tread: true,\n\t\t\t\t\t\t\t\t\t\twrite: false,\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\tnative: {},\n\t\t\t\t\t\t\t\t});\n\n\t\t\t\t\t\t\t\tthis.setStateChangedAsync(`schedule.${key}`, content[key], true);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tfor (const relay of content.relays) {\n\t\t\t\t\t\t\tconst name = relay.relay;\n\t\t\t\t\t\t\tawait this.setObjectNotExistsAsync(`schedule.${relay.relay}`, {\n\t\t\t\t\t\t\t\ttype: \"channel\",\n\t\t\t\t\t\t\t\tcommon: {\n\t\t\t\t\t\t\t\t\tname: name.toString(),\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\tnative: {},\n\t\t\t\t\t\t\t});\n\n\t\t\t\t\t\t\tRELAYS[relay.relay] = relay.relay_id;\n\n\t\t\t\t\t\t\tfor (const key in relay) {\n\t\t\t\t\t\t\t\tawait this.setObjectNotExistsAsync(`schedule.${relay.relay}.${key}`, {\n\t\t\t\t\t\t\t\t\ttype: \"state\",\n\t\t\t\t\t\t\t\t\tcommon: {\n\t\t\t\t\t\t\t\t\t\tname: key,\n\t\t\t\t\t\t\t\t\t\ttype: key === \"name\" || key === \"timestr\" ? \"string\" : \"number\",\n\t\t\t\t\t\t\t\t\t\trole: key === \"name\" || key === \"timestr\" ? \"text\" : \"value\",\n\t\t\t\t\t\t\t\t\t\tread: true,\n\t\t\t\t\t\t\t\t\t\twrite: false,\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\tnative: {},\n\t\t\t\t\t\t\t\t});\n\n\t\t\t\t\t\t\t\tif (key === \"timestr\") {\n\t\t\t\t\t\t\t\t\tconst t = new Date();\n\t\t\t\t\t\t\t\t\tt.setSeconds(t.getSeconds() + relay.time);\n\t\t\t\t\t\t\t\t\trelay[key] = t.toString();\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\tthis.setStateChangedAsync(`schedule.${relay.relay}.${key}`, relay[key], true);\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tawait this.setObjectNotExistsAsync(`schedule.${relay.relay}.stopZone`, {\n\t\t\t\t\t\t\t\ttype: \"state\",\n\t\t\t\t\t\t\t\tcommon: {\n\t\t\t\t\t\t\t\t\tname: {\n\t\t\t\t\t\t\t\t\t\ten: \"stop zone\",\n\t\t\t\t\t\t\t\t\t\tde: \"Zone stoppen\",\n\t\t\t\t\t\t\t\t\t\tru: \"\u0437\u043E\u043D\u0430 \u043E\u0441\u0442\u0430\u043D\u043E\u0432\u043A\u0438\",\n\t\t\t\t\t\t\t\t\t\tpt: \"zona de paragem\",\n\t\t\t\t\t\t\t\t\t\tnl: \"stop zone\",\n\t\t\t\t\t\t\t\t\t\tfr: \"zone d ' arr\u00EAt\",\n\t\t\t\t\t\t\t\t\t\tit: \"zona di sosta\",\n\t\t\t\t\t\t\t\t\t\tes: \"zona de parada\",\n\t\t\t\t\t\t\t\t\t\tpl: \"strefa stopu\",\n\t\t\t\t\t\t\t\t\t\tuk: \"\u0437\u043E\u043D\u0430 \u0437\u0443\u043F\u0438\u043D\u043A\u0438\",\n\t\t\t\t\t\t\t\t\t\t\"zh-cn\": \"\u505C\u6B62\u5730\u533A\",\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\ttype: \"boolean\",\n\t\t\t\t\t\t\t\t\trole: \"button\",\n\t\t\t\t\t\t\t\t\tread: false,\n\t\t\t\t\t\t\t\t\twrite: true,\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\tnative: {},\n\t\t\t\t\t\t\t});\n\n\t\t\t\t\t\t\tawait this.setObjectNotExistsAsync(`schedule.${relay.relay}.runZone`, {\n\t\t\t\t\t\t\t\ttype: \"state\",\n\t\t\t\t\t\t\t\tcommon: {\n\t\t\t\t\t\t\t\t\tname: {\n\t\t\t\t\t\t\t\t\t\ten: \"run zone for x seconds\",\n\t\t\t\t\t\t\t\t\t\tde: \"Zone f\u00FCr x Sekunden starten\",\n\t\t\t\t\t\t\t\t\t\tru: \"\u0437\u0430\u043F\u0443\u0441\u0442\u0438\u0442\u044C \u0437\u043E\u043D\u0443 \u0437\u0430 x \u0441\u0435\u043A\u0443\u043D\u0434\u044B\",\n\t\t\t\t\t\t\t\t\t\tpt: \"zona de execu\u00E7\u00E3o por x segundos\",\n\t\t\t\t\t\t\t\t\t\tnl: \"ren zone voor x seconden\",\n\t\t\t\t\t\t\t\t\t\tfr: \"zone de course pour x secondes\",\n\t\t\t\t\t\t\t\t\t\tit: \"zona di corsa per x secondi\",\n\t\t\t\t\t\t\t\t\t\tes: \"zona de ejecuci\u00F3n por x segundos\",\n\t\t\t\t\t\t\t\t\t\tpl: \"strefa x sekundy\",\n\t\t\t\t\t\t\t\t\t\tuk: \"\u0437\u043E\u043D\u0430 \u0437\u0430\u043F\u0443\u0441\u043A\u0443 \u0434\u043B\u044F x \u0441\u0435\u043A\u0443\u043D\u0434\",\n\t\t\t\t\t\t\t\t\t\t\"zh-cn\": \"\u00D7\u4E8C\u533A\",\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\ttype: \"number\",\n\t\t\t\t\t\t\t\t\trole: \"value\",\n\t\t\t\t\t\t\t\t\tread: false,\n\t\t\t\t\t\t\t\t\twrite: true,\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\tnative: {},\n\t\t\t\t\t\t\t});\n\n\t\t\t\t\t\t\tawait this.setObjectNotExistsAsync(`schedule.${relay.relay}.suspendZone`, {\n\t\t\t\t\t\t\t\ttype: \"state\",\n\t\t\t\t\t\t\t\tcommon: {\n\t\t\t\t\t\t\t\t\tname: {\n\t\t\t\t\t\t\t\t\t\ten: \"suspend zone for x seconds\",\n\t\t\t\t\t\t\t\t\t\tde: \"Zone f\u00FCr x Sekunden aussetzen\",\n\t\t\t\t\t\t\t\t\t\tru: \"\u043F\u0440\u0438\u043E\u0441\u0442\u0430\u043D\u043E\u0432\u0438\u0442\u044C \u0437\u043E\u043D\u0443 \u043D\u0430 x \u0441\u0435\u043A\u0443\u043D\u0434\u044B\",\n\t\t\t\t\t\t\t\t\t\tpt: \"zona de suspens\u00E3o por x segundos\",\n\t\t\t\t\t\t\t\t\t\tnl: \"quality over quantity (qoq) releases vertaling:\",\n\t\t\t\t\t\t\t\t\t\tfr: \"zone de suspension pour x secondes\",\n\t\t\t\t\t\t\t\t\t\tit: \"zona di sospensione per x secondi\",\n\t\t\t\t\t\t\t\t\t\tes: \"zona de suspensi\u00F3n por x segundos\",\n\t\t\t\t\t\t\t\t\t\tpl: \"strefa zawies\u0142a na x sekundy\",\n\t\t\t\t\t\t\t\t\t\tuk: \"\u0437\u043E\u043D\u0430 \u043F\u0456\u0434\u0432\u0456\u0441\u043A\u0438 \u0434\u043B\u044F x \u0441\u0435\u043A\u0443\u043D\u0434\",\n\t\t\t\t\t\t\t\t\t\t\"zh-cn\": \"\u505C\u6B62x\u4E8C\u533A\",\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\ttype: \"number\",\n\t\t\t\t\t\t\t\t\trole: \"value\",\n\t\t\t\t\t\t\t\t\tread: false,\n\t\t\t\t\t\t\t\t\twrite: true,\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\tnative: {},\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tfor (const sensor of content.sensors) {\n\t\t\t\t\t\t\tawait this.setObjectNotExistsAsync(`schedule.sensors.${sensor.input}`, {\n\t\t\t\t\t\t\t\ttype: \"channel\",\n\t\t\t\t\t\t\t\tcommon: {\n\t\t\t\t\t\t\t\t\tname: \"sensors\",\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\tnative: {},\n\t\t\t\t\t\t\t});\n\n\t\t\t\t\t\t\tfor (const key in sensor) {\n\t\t\t\t\t\t\t\tif (key !== \"relays\") {\n\t\t\t\t\t\t\t\t\tawait this.setObjectNotExistsAsync(`schedule.sensors.${sensor.input}.${key}`, {\n\t\t\t\t\t\t\t\t\t\ttype: \"state\",\n\t\t\t\t\t\t\t\t\t\tcommon: {\n\t\t\t\t\t\t\t\t\t\t\tname: key,\n\t\t\t\t\t\t\t\t\t\t\ttype: \"number\",\n\t\t\t\t\t\t\t\t\t\t\trole: \"value\",\n\t\t\t\t\t\t\t\t\t\t\tread: true,\n\t\t\t\t\t\t\t\t\t\t\twrite: false,\n\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\tnative: {},\n\t\t\t\t\t\t\t\t\t});\n\n\t\t\t\t\t\t\t\t\tthis.setStateChangedAsync(\n\t\t\t\t\t\t\t\t\t\t`schedule.sensors.${sensor.input}.${key}`,\n\t\t\t\t\t\t\t\t\t\tsensor[key],\n\t\t\t\t\t\t\t\t\t\ttrue,\n\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tresolve(response.status);\n\t\t\t\t})\n\t\t\t\t.catch((error) => {\n\t\t\t\t\tif (error.response.status === 429) {\n\t\t\t\t\t\tnextpollSchedule =\n\t\t\t\t\t\t\tnextpollSchedule ||\n\t\t\t\t\t\t\tthis.setTimeout(() => {\n\t\t\t\t\t\t\t\tnextpollSchedule = null;\n\t\t\t\t\t\t\t\tthis.GetStatusSchedule(apiKey);\n\t\t\t\t\t\t\t}, 5 * 60 * 1000);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tthis.log.debug(`(stats) received error - API is now offline: ${JSON.stringify(error)}`);\n\n\t\t\t\t\t\tthis.setStateChangedAsync(\"info.connection\", false, true);\n\n\t\t\t\t\t\treject(error);\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t});\n\t}\n\n\tprivate async GetCustomerDetails(apiKey: string): Promise<void> {\n\t\treturn new Promise((resolve, reject) => {\n\t\t\tnextpollCustomer =\n\t\t\t\tnextpollCustomer ||\n\t\t\t\tthis.setTimeout(() => {\n\t\t\t\t\tnextpollCustomer = null;\n\t\t\t\t\tthis.GetCustomerDetails(apiKey);\n\t\t\t\t}, 5 * 60 * 1000);\n\n\t\t\tthis.buildRequest(\"customerdetails.php\", { api_key: this.config.apiKey })\n\t\t\t\t.then(async (response) => {\n\t\t\t\t\tif (response.status === 200) {\n\t\t\t\t\t\tconst content = response.data;\n\n\t\t\t\t\t\tthis.setStateChangedAsync(\"info.connection\", true, true);\n\n\t\t\t\t\t\tfor (const key in content) {\n\t\t\t\t\t\t\tif (key !== \"controllers\") {\n\t\t\t\t\t\t\t\tawait this.setObjectNotExistsAsync(`customer.${key}`, {\n\t\t\t\t\t\t\t\t\ttype: \"state\",\n\t\t\t\t\t\t\t\t\tcommon: {\n\t\t\t\t\t\t\t\t\t\tname: key,\n\t\t\t\t\t\t\t\t\t\ttype: key === \"message\" || key === \"current_controller\" ? \"string\" : \"number\",\n\t\t\t\t\t\t\t\t\t\trole: key === \"message\" || key === \"current_controller\" ? \"text\" : \"value\",\n\t\t\t\t\t\t\t\t\t\tread: true,\n\t\t\t\t\t\t\t\t\t\twrite: false,\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\tnative: {},\n\t\t\t\t\t\t\t\t});\n\n\t\t\t\t\t\t\t\tthis.setStateChangedAsync(`customer.${key}`, content[key], true);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tfor (const controller of content.controllers) {\n\t\t\t\t\t\t\tawait this.setObjectNotExistsAsync(`customer.controllers.${controller.name}`, {\n\t\t\t\t\t\t\t\ttype: \"channel\",\n\t\t\t\t\t\t\t\tcommon: {\n\t\t\t\t\t\t\t\t\tname: controller.name,\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\tnative: {},\n\t\t\t\t\t\t\t});\n\n\t\t\t\t\t\t\tfor (const key in controller) {\n\t\t\t\t\t\t\t\tawait this.setObjectNotExistsAsync(`customer.controllers.${controller.name}.${key}`, {\n\t\t\t\t\t\t\t\t\ttype: \"state\",\n\t\t\t\t\t\t\t\t\tcommon: {\n\t\t\t\t\t\t\t\t\t\tname: key,\n\t\t\t\t\t\t\t\t\t\ttype: key !== \"controller_id\" ? \"string\" : \"number\",\n\t\t\t\t\t\t\t\t\t\trole: key !== \"controller_id\" ? \"text\" : \"value\",\n\t\t\t\t\t\t\t\t\t\tread: true,\n\t\t\t\t\t\t\t\t\t\twrite: false,\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\tnative: {},\n\t\t\t\t\t\t\t\t});\n\n\t\t\t\t\t\t\t\tif (key === \"last_contact\") {\n\t\t\t\t\t\t\t\t\tconst t = new Date(controller[key] * 1000);\n\t\t\t\t\t\t\t\t\tcontroller[key] = t.toString();\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\tthis.setStateChangedAsync(\n\t\t\t\t\t\t\t\t\t`customer.controllers.${controller.name}.${key}`,\n\t\t\t\t\t\t\t\t\tcontroller[key],\n\t\t\t\t\t\t\t\t\ttrue,\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tresolve(response.status);\n\t\t\t\t})\n\t\t\t\t.catch((error) => {\n\t\t\t\t\tif (error.response.status === 429) {\n\t\t\t\t\t\tnextpollCustomer =\n\t\t\t\t\t\t\tnextpollCustomer ||\n\t\t\t\t\t\t\tthis.setTimeout(() => {\n\t\t\t\t\t\t\t\tnextpollCustomer = null;\n\t\t\t\t\t\t\t\tthis.GetCustomerDetails(apiKey);\n\t\t\t\t\t\t\t}, 5 * 60 * 1000);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tthis.log.debug(`(stats) received error - API is now offline: ${JSON.stringify(error)}`);\n\n\t\t\t\t\t\tthis.setStateChangedAsync(\"info.connection\", false, true);\n\n\t\t\t\t\t\treject(error);\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t});\n\t}\n\n\tbuildRequest(service: string, params: any): Promise<any> {\n\t\treturn new Promise((resolve, reject) => {\n\t\t\tconst url = `/api/v1/${service}`;\n\t\t\tlet lastErrorCode = 0;\n\n\t\t\tif (params.api_key) {\n\t\t\t\taxios({\n\t\t\t\t\tmethod: \"GET\",\n\t\t\t\t\tbaseURL: hydrawise_url,\n\t\t\t\t\turl: url,\n\t\t\t\t\ttimeout: 30000,\n\t\t\t\t\tresponseType: \"json\",\n\t\t\t\t\tparams: params,\n\t\t\t\t})\n\t\t\t\t\t.then((response) => {\n\t\t\t\t\t\t// no error - clear up reminder\n\t\t\t\t\t\tlastErrorCode = 0;\n\n\t\t\t\t\t\tresolve(response);\n\t\t\t\t\t})\n\t\t\t\t\t.catch((error) => {\n\t\t\t\t\t\tif (error.response) {\n\t\t\t\t\t\t\t// The request was made and the server responded with a status code\n\n\t\t\t\t\t\t\tthis.log.warn(\n\t\t\t\t\t\t\t\t`received ${error.response.status} response from ${url} with content: ${JSON.stringify(\n\t\t\t\t\t\t\t\t\terror.response.data,\n\t\t\t\t\t\t\t\t)}`,\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t} else if (error.request) {\n\t\t\t\t\t\t\t// The request was made but no response was received\n\t\t\t\t\t\t\t// `error.request` is an instance of XMLHttpRequest in the browser and an instance of\n\t\t\t\t\t\t\t// http.ClientRequest in node.js\n\n\t\t\t\t\t\t\t// avoid spamming of the same error when stuck in a reconnection loop\n\t\t\t\t\t\t\tif (error.code === lastErrorCode) {\n\t\t\t\t\t\t\t\tthis.log.debug(error.message);\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tthis.log.info(`error ${error.code} from ${url}: ${error.message}`);\n\t\t\t\t\t\t\t\tlastErrorCode = error.code;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t// Something happened in setting up the request that triggered an Error\n\t\t\t\t\t\t\tthis.log.error(error.message);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\treject(error);\n\t\t\t\t\t});\n\t\t\t} else {\n\t\t\t\treject(\"Device IP is not configured\");\n\t\t\t}\n\t\t});\n\t}\n\n\t/**\n\t * Is called when adapter shuts down - callback has to be called under any circumstances!\n\t */\n\tprivate onUnload(callback: () => void): void {\n\t\ttry {\n\t\t\tclearTimeout(nextpollSchedule);\n\t\t\tclearTimeout(nextpollCustomer);\n\n\t\t\tcallback();\n\t\t} catch (e) {\n\t\t\tcallback();\n\t\t}\n\t}\n\n\t/**\n\t * Is called if a subscribed state changes\n\t */\n\tprivate onStateChange(id: string, state: ioBroker.State | null | undefined): void {\n\t\tif (state) {\n\t\t\tif (id.indexOf(\"stopall\") !== -1) {\n\t\t\t\tthis.buildRequest(\"setzone.php\", { api_key: this.config.apiKey, action: \"stopall\" });\n\t\t\t} else if (id.indexOf(\"stop\") !== -1) {\n\t\t\t\tconst relay = id.match(/.*schedule\\.(.*)\\.stopZone/);\n\n\t\t\t\tif (relay && relay?.length > 1) {\n\t\t\t\t\tthis.buildRequest(\"setzone.php\", {\n\t\t\t\t\t\tapi_key: this.config.apiKey,\n\t\t\t\t\t\taction: \"stop\",\n\t\t\t\t\t\trelay_id: RELAYS[relay[1]],\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (id.indexOf(\"runall\") !== -1 && (state.val || state.val === 0)) {\n\t\t\t\tthis.buildRequest(\"setzone.php\", {\n\t\t\t\t\tapi_key: this.config.apiKey,\n\t\t\t\t\taction: \"runall\",\n\t\t\t\t\tperiod_id: 999,\n\t\t\t\t\tcustom: state.val,\n\t\t\t\t});\n\t\t\t} else if (id.indexOf(\"run\") !== -1 && (state.val || state.val === 0)) {\n\t\t\t\tconst relay = id.match(/.*schedule\\.(.*)\\.runZone/);\n\n\t\t\t\tif (relay && relay?.length > 1) {\n\t\t\t\t\tthis.buildRequest(\"setzone.php\", {\n\t\t\t\t\t\tapi_key: this.config.apiKey,\n\t\t\t\t\t\taction: \"run\",\n\t\t\t\t\t\tperiod_id: 999,\n\t\t\t\t\t\tcustom: state.val,\n\t\t\t\t\t\trelay_id: RELAYS[relay[1]],\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (id.indexOf(\"suspendall\") !== -1 && (state.val || state.val === 0)) {\n\t\t\t\tconst num = state.val as number;\n\n\t\t\t\tthis.buildRequest(\"setzone.php\", {\n\t\t\t\t\tapi_key: this.config.apiKey,\n\t\t\t\t\taction: \"suspendall\",\n\t\t\t\t\tperiod_id: 999,\n\t\t\t\t\tcustom: Math.trunc((state.ts + num) / 1000),\n\t\t\t\t});\n\t\t\t} else if (id.indexOf(\"suspend\") !== -1 && (state.val || state.val === 0)) {\n\t\t\t\tconst num = state.val as number;\n\t\t\t\tconst relay = id.match(/.*schedule\\.(.*)\\.suspendZone/);\n\n\t\t\t\tif (relay && relay?.length > 1) {\n\t\t\t\t\tthis.buildRequest(\"setzone.php\", {\n\t\t\t\t\t\tapi_key: this.config.apiKey,\n\t\t\t\t\t\taction: \"suspend\",\n\t\t\t\t\t\tperiod_id: 999,\n\t\t\t\t\t\tcustom: Math.trunc((state.ts + num) / 1000),\n\t\t\t\t\t\trelay_id: RELAYS[relay[1]],\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\t// The state was deleted\n\t\t\tthis.log.info(`state ${id} deleted`);\n\t\t}\n\t}\n}\n\nif (require.main !== module) {\n\t// Export the constructor in compact mode\n\tmodule.exports = (options: Partial<utils.AdapterOptions> | undefined) => new Hydrawise(options);\n} else {\n\t// otherwise start the instance directly\n\t(() => new Hydrawise())();\n}\n"],
|
|
5
|
-
"mappings": ";;;;;;;;;;;;;;;;;;;AAMA,YAAuB;AACvB,mBAAkB;AAElB,MAAM,gBAAgB;AACtB,IAAI,mBAAwB;AAC5B,IAAI,mBAAwB;AAC5B,MAAM,SAAc;AAEpB,MAAM,kBAAkB,MAAM,QAAQ;AAAA,EAC9B,YAAY,UAAyC,CAAC,GAAG;AAC/D,UAAM;AAAA,MACL,GAAG;AAAA,MACH,MAAM;AAAA,IACP,CAAC;AAED,SAAK,GAAG,SAAS,KAAK,QAAQ,KAAK,IAAI,CAAC;AACxC,SAAK,GAAG,eAAe,KAAK,cAAc,KAAK,IAAI,CAAC;AACpD,SAAK,GAAG,UAAU,KAAK,SAAS,KAAK,IAAI,CAAC;AAAA,EAC3C;AAAA,EAEA,MAAc,UAAyB;AACtC,QAAI,CAAC,KAAK,OAAO,QAAQ;AACxB,WAAK,IAAI,MAAM,sBAAsB;AAAA,IACtC,OAAO;AACN,WAAK,
|
|
4
|
+
"sourcesContent": ["/*\n * Created with @iobroker/create-adapter v2.3.0\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 from \"axios\";\n\nconst hydrawise_url = \"https://api.hydrawise.com\";\nlet nextpollSchedule: any = null;\nlet nextpollCustomer: any = null;\nconst RELAYS: any = Object;\n\nclass Hydrawise extends utils.Adapter {\n\tpublic constructor(options: Partial<utils.AdapterOptions> = {}) {\n\t\tsuper({\n\t\t\t...options,\n\t\t\tname: \"hydrawise\",\n\t\t});\n\n\t\tthis.on(\"ready\", this.onReady.bind(this));\n\t\tthis.on(\"stateChange\", this.onStateChange.bind(this));\n\t\tthis.on(\"unload\", this.onUnload.bind(this));\n\t}\n\n\tprivate async onReady(): Promise<void> {\n\t\tif (!this.config.apiKey) {\n\t\t\tthis.log.error(\"No API-Key definded!\");\n\t\t} else {\n\t\t\tthis.setStateChangedAsync(\"info.connection\", false, true);\n\n\t\t\tawait this.GetStatusSchedule(this.config.apiKey);\n\n\t\t\tawait this.GetCustomerDetails(this.config.apiKey);\n\n\t\t\tawait this.subscribeStatesAsync(\"*\");\n\t\t}\n\t}\n\n\tprivate async GetStatusSchedule(apiKey: string): Promise<void> {\n\t\treturn new Promise((resolve, reject) => {\n\t\t\tnextpollSchedule =\n\t\t\t\tnextpollSchedule ||\n\t\t\t\tthis.setTimeout(\n\t\t\t\t\t() => {\n\t\t\t\t\t\tnextpollSchedule = null;\n\t\t\t\t\t\tthis.GetStatusSchedule(apiKey);\n\t\t\t\t\t},\n\t\t\t\t\t5 * 60 * 1000,\n\t\t\t\t);\n\n\t\t\tthis.buildRequest(\"statusschedule.php\", { api_key: this.config.apiKey })\n\t\t\t\t.then(async (response) => {\n\t\t\t\t\tif (response.status === 200) {\n\t\t\t\t\t\tconst content = response.data;\n\n\t\t\t\t\t\tthis.setStateChangedAsync(\"info.connection\", true, true);\n\n\t\t\t\t\t\tawait this.setObjectNotExistsAsync(\"schedule.stopall\", {\n\t\t\t\t\t\t\ttype: \"state\",\n\t\t\t\t\t\t\tcommon: {\n\t\t\t\t\t\t\t\tname: {\n\t\t\t\t\t\t\t\t\ten: \"stop all zones\",\n\t\t\t\t\t\t\t\t\tde: \"alle Zonen stoppen\",\n\t\t\t\t\t\t\t\t\tru: \"\u043E\u0441\u0442\u0430\u043D\u043E\u0432\u0438\u0442\u044C \u0432\u0441\u0435 \u0437\u043E\u043D\u044B\",\n\t\t\t\t\t\t\t\t\tpt: \"parar todas as zonas\",\n\t\t\t\t\t\t\t\t\tnl: \"stop alle zones\",\n\t\t\t\t\t\t\t\t\tfr: \"arr\u00EAter toutes les zones\",\n\t\t\t\t\t\t\t\t\tit: \"fermare tutte le zone\",\n\t\t\t\t\t\t\t\t\tes: \"detener todas las zonas\",\n\t\t\t\t\t\t\t\t\tpl: \"zatrzymuj\u0105 wszystkie strefy\",\n\t\t\t\t\t\t\t\t\tuk: \"\u0437\u0443\u043F\u0438\u043D\u0438\u0442\u0438 \u0432\u0441\u0456 \u0437\u043E\u043D\u0438\",\n\t\t\t\t\t\t\t\t\t\"zh-cn\": \"\u505C\u6B62\u6240\u6709\u5730\u533A\",\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\ttype: \"boolean\",\n\t\t\t\t\t\t\t\trole: \"button.start\",\n\t\t\t\t\t\t\t\tread: false,\n\t\t\t\t\t\t\t\twrite: true,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\tnative: {},\n\t\t\t\t\t\t});\n\n\t\t\t\t\t\tawait this.setObjectNotExistsAsync(\"schedule.runall\", {\n\t\t\t\t\t\t\ttype: \"state\",\n\t\t\t\t\t\t\tcommon: {\n\t\t\t\t\t\t\t\tname: {\n\t\t\t\t\t\t\t\t\ten: \"run all zones for x seconds\",\n\t\t\t\t\t\t\t\t\tde: \"alle Zonen f\u00FCr x Sekunden ausf\u00FChren\",\n\t\t\t\t\t\t\t\t\tru: \"\u0437\u0430\u043F\u0443\u0441\u0442\u0438\u0442\u044C \u0432\u0441\u0435 \u0437\u043E\u043D\u044B \u0437\u0430 x \u0441\u0435\u043A\u0443\u043D\u0434\u044B\",\n\t\t\t\t\t\t\t\t\tpt: \"executar todas as zonas por x segundos\",\n\t\t\t\t\t\t\t\t\tnl: \"ren alle zones voor x seconden\",\n\t\t\t\t\t\t\t\t\tfr: \"ex\u00E9cuter toutes les zones pendant x secondes\",\n\t\t\t\t\t\t\t\t\tit: \"eseguire tutte le zone per x secondi\",\n\t\t\t\t\t\t\t\t\tes: \"ejecutar todas las zonas durante x segundos\",\n\t\t\t\t\t\t\t\t\tpl: \"wszystkie strefy startuj\u0105 dla x sekundy\",\n\t\t\t\t\t\t\t\t\tuk: \"\u0437\u0430\u043F\u0443\u0441\u0442\u0438\u0442\u0438 \u0432\u0441\u0456 \u0437\u043E\u043D\u0438 \u0434\u043B\u044F x \u0441\u0435\u043A\u0443\u043D\u0434\",\n\t\t\t\t\t\t\t\t\t\"zh-cn\": \"\u8DD1\u9053\u533A\",\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\ttype: \"number\",\n\t\t\t\t\t\t\t\trole: \"level\",\n\t\t\t\t\t\t\t\tunit: \"seconds\",\n\t\t\t\t\t\t\t\tread: true,\n\t\t\t\t\t\t\t\twrite: true,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\tnative: {},\n\t\t\t\t\t\t});\n\n\t\t\t\t\t\tawait this.setObjectNotExistsAsync(\"schedule.suspendall\", {\n\t\t\t\t\t\t\ttype: \"state\",\n\t\t\t\t\t\t\tcommon: {\n\t\t\t\t\t\t\t\tname: {\n\t\t\t\t\t\t\t\t\ten: \"suspend all zones for x seconds\",\n\t\t\t\t\t\t\t\t\tde: \"alle Zonen f\u00FCr x Sekunden aussetzen\",\n\t\t\t\t\t\t\t\t\tru: \"\u043F\u0440\u0438\u043E\u0441\u0442\u0430\u043D\u043E\u0432\u0438\u0442\u044C \u0432\u0441\u0435 \u0437\u043E\u043D\u044B \u0437\u0430 x \u0441\u0435\u043A\u0443\u043D\u0434\u044B\",\n\t\t\t\t\t\t\t\t\tpt: \"suspender todas as zonas por x segundos\",\n\t\t\t\t\t\t\t\t\tnl: \"vertaling:\",\n\t\t\t\t\t\t\t\t\tfr: \"suspendre toutes les zones pendant x secondes\",\n\t\t\t\t\t\t\t\t\tit: \"sospendere tutte le zone per x secondi\",\n\t\t\t\t\t\t\t\t\tes: \"suspender todas las zonas durante x segundos\",\n\t\t\t\t\t\t\t\t\tpl: \"wszystkie strefy zawieszenia dla x sekundy\",\n\t\t\t\t\t\t\t\t\tuk: \"\u043F\u0440\u0438\u0437\u0443\u043F\u0438\u043D\u0438\u0442\u0438 \u0432\u0441\u0456 \u0437\u043E\u043D\u0438 \u043D\u0430 x \u0441\u0435\u043A\u0443\u043D\u0434\",\n\t\t\t\t\t\t\t\t\t\"zh-cn\": \"\u505C\u6B62\u6240\u6709\u00D7\u4E8C\u533A\",\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\ttype: \"number\",\n\t\t\t\t\t\t\t\trole: \"level\",\n\t\t\t\t\t\t\t\tread: true,\n\t\t\t\t\t\t\t\twrite: true,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\tnative: {},\n\t\t\t\t\t\t});\n\n\t\t\t\t\t\tfor (let key in content) {\n\t\t\t\t\t\t\tkey = this.name2id(key);\n\n\t\t\t\t\t\t\tif (key !== \"relays\" && key !== \"sensors\" && key !== \"expanders\") {\n\t\t\t\t\t\t\t\tawait this.setObjectNotExistsAsync(`schedule.${key}`, {\n\t\t\t\t\t\t\t\t\ttype: \"state\",\n\t\t\t\t\t\t\t\t\tcommon: {\n\t\t\t\t\t\t\t\t\t\tname: key,\n\t\t\t\t\t\t\t\t\t\ttype: key === \"message\" ? \"string\" : \"number\",\n\t\t\t\t\t\t\t\t\t\trole: key === \"message\" ? \"text\" : \"value\",\n\t\t\t\t\t\t\t\t\t\tread: true,\n\t\t\t\t\t\t\t\t\t\twrite: false,\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\tnative: {},\n\t\t\t\t\t\t\t\t});\n\n\t\t\t\t\t\t\t\tthis.setStateChangedAsync(`schedule.${key}`, content[key], true);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tfor (const relay of content.relays) {\n\t\t\t\t\t\t\tconst name = relay.relay;\n\t\t\t\t\t\t\tawait this.setObjectNotExistsAsync(`schedule.${relay.relay}`, {\n\t\t\t\t\t\t\t\ttype: \"channel\",\n\t\t\t\t\t\t\t\tcommon: {\n\t\t\t\t\t\t\t\t\tname: name.toString(),\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\tnative: {},\n\t\t\t\t\t\t\t});\n\n\t\t\t\t\t\t\tRELAYS[relay.relay] = relay.relay_id;\n\n\t\t\t\t\t\t\tfor (let key in relay) {\n\t\t\t\t\t\t\t\tkey = this.name2id(key);\n\n\t\t\t\t\t\t\t\tawait this.setObjectNotExistsAsync(`schedule.${relay.relay}.${key}`, {\n\t\t\t\t\t\t\t\t\ttype: \"state\",\n\t\t\t\t\t\t\t\t\tcommon: {\n\t\t\t\t\t\t\t\t\t\tname: key,\n\t\t\t\t\t\t\t\t\t\ttype: key === \"name\" || key === \"timestr\" ? \"string\" : \"number\",\n\t\t\t\t\t\t\t\t\t\trole: key === \"name\" || key === \"timestr\" ? \"text\" : \"value\",\n\t\t\t\t\t\t\t\t\t\tread: true,\n\t\t\t\t\t\t\t\t\t\twrite: false,\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\tnative: {},\n\t\t\t\t\t\t\t\t});\n\n\t\t\t\t\t\t\t\tif (key === \"timestr\") {\n\t\t\t\t\t\t\t\t\tconst t = new Date();\n\t\t\t\t\t\t\t\t\tt.setSeconds(t.getSeconds() + relay.time);\n\t\t\t\t\t\t\t\t\trelay[key] = t.toString();\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\tthis.setStateChangedAsync(`schedule.${relay.relay}.${key}`, relay[key], true);\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tawait this.setObjectNotExistsAsync(`schedule.${relay.relay}.stopZone`, {\n\t\t\t\t\t\t\t\ttype: \"state\",\n\t\t\t\t\t\t\t\tcommon: {\n\t\t\t\t\t\t\t\t\tname: {\n\t\t\t\t\t\t\t\t\t\ten: \"stop zone\",\n\t\t\t\t\t\t\t\t\t\tde: \"Zone stoppen\",\n\t\t\t\t\t\t\t\t\t\tru: \"\u0437\u043E\u043D\u0430 \u043E\u0441\u0442\u0430\u043D\u043E\u0432\u043A\u0438\",\n\t\t\t\t\t\t\t\t\t\tpt: \"zona de paragem\",\n\t\t\t\t\t\t\t\t\t\tnl: \"stop zone\",\n\t\t\t\t\t\t\t\t\t\tfr: \"zone d ' arr\u00EAt\",\n\t\t\t\t\t\t\t\t\t\tit: \"zona di sosta\",\n\t\t\t\t\t\t\t\t\t\tes: \"zona de parada\",\n\t\t\t\t\t\t\t\t\t\tpl: \"strefa stopu\",\n\t\t\t\t\t\t\t\t\t\tuk: \"\u0437\u043E\u043D\u0430 \u0437\u0443\u043F\u0438\u043D\u043A\u0438\",\n\t\t\t\t\t\t\t\t\t\t\"zh-cn\": \"\u505C\u6B62\u5730\u533A\",\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\ttype: \"boolean\",\n\t\t\t\t\t\t\t\t\trole: \"button.start\",\n\t\t\t\t\t\t\t\t\tread: false,\n\t\t\t\t\t\t\t\t\twrite: true,\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\tnative: {},\n\t\t\t\t\t\t\t});\n\n\t\t\t\t\t\t\tawait this.setObjectNotExistsAsync(`schedule.${relay.relay}.runZone`, {\n\t\t\t\t\t\t\t\ttype: \"state\",\n\t\t\t\t\t\t\t\tcommon: {\n\t\t\t\t\t\t\t\t\tname: {\n\t\t\t\t\t\t\t\t\t\ten: \"run zone for x seconds\",\n\t\t\t\t\t\t\t\t\t\tde: \"Zone f\u00FCr x Sekunden starten\",\n\t\t\t\t\t\t\t\t\t\tru: \"\u0437\u0430\u043F\u0443\u0441\u0442\u0438\u0442\u044C \u0437\u043E\u043D\u0443 \u0437\u0430 x \u0441\u0435\u043A\u0443\u043D\u0434\u044B\",\n\t\t\t\t\t\t\t\t\t\tpt: \"zona de execu\u00E7\u00E3o por x segundos\",\n\t\t\t\t\t\t\t\t\t\tnl: \"ren zone voor x seconden\",\n\t\t\t\t\t\t\t\t\t\tfr: \"zone de course pour x secondes\",\n\t\t\t\t\t\t\t\t\t\tit: \"zona di corsa per x secondi\",\n\t\t\t\t\t\t\t\t\t\tes: \"zona de ejecuci\u00F3n por x segundos\",\n\t\t\t\t\t\t\t\t\t\tpl: \"strefa x sekundy\",\n\t\t\t\t\t\t\t\t\t\tuk: \"\u0437\u043E\u043D\u0430 \u0437\u0430\u043F\u0443\u0441\u043A\u0443 \u0434\u043B\u044F x \u0441\u0435\u043A\u0443\u043D\u0434\",\n\t\t\t\t\t\t\t\t\t\t\"zh-cn\": \"\u00D7\u4E8C\u533A\",\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\ttype: \"number\",\n\t\t\t\t\t\t\t\t\trole: \"level\",\n\t\t\t\t\t\t\t\t\tread: true,\n\t\t\t\t\t\t\t\t\twrite: true,\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\tnative: {},\n\t\t\t\t\t\t\t});\n\n\t\t\t\t\t\t\tawait this.setObjectNotExistsAsync(`schedule.${relay.relay}.suspendZone`, {\n\t\t\t\t\t\t\t\ttype: \"state\",\n\t\t\t\t\t\t\t\tcommon: {\n\t\t\t\t\t\t\t\t\tname: {\n\t\t\t\t\t\t\t\t\t\ten: \"suspend zone for x seconds\",\n\t\t\t\t\t\t\t\t\t\tde: \"Zone f\u00FCr x Sekunden aussetzen\",\n\t\t\t\t\t\t\t\t\t\tru: \"\u043F\u0440\u0438\u043E\u0441\u0442\u0430\u043D\u043E\u0432\u0438\u0442\u044C \u0437\u043E\u043D\u0443 \u043D\u0430 x \u0441\u0435\u043A\u0443\u043D\u0434\u044B\",\n\t\t\t\t\t\t\t\t\t\tpt: \"zona de suspens\u00E3o por x segundos\",\n\t\t\t\t\t\t\t\t\t\tnl: \"quality over quantity (qoq) releases vertaling:\",\n\t\t\t\t\t\t\t\t\t\tfr: \"zone de suspension pour x secondes\",\n\t\t\t\t\t\t\t\t\t\tit: \"zona di sospensione per x secondi\",\n\t\t\t\t\t\t\t\t\t\tes: \"zona de suspensi\u00F3n por x segundos\",\n\t\t\t\t\t\t\t\t\t\tpl: \"strefa zawies\u0142a na x sekundy\",\n\t\t\t\t\t\t\t\t\t\tuk: \"\u0437\u043E\u043D\u0430 \u043F\u0456\u0434\u0432\u0456\u0441\u043A\u0438 \u0434\u043B\u044F x \u0441\u0435\u043A\u0443\u043D\u0434\",\n\t\t\t\t\t\t\t\t\t\t\"zh-cn\": \"\u505C\u6B62x\u4E8C\u533A\",\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\ttype: \"number\",\n\t\t\t\t\t\t\t\t\trole: \"level\",\n\t\t\t\t\t\t\t\t\tread: true,\n\t\t\t\t\t\t\t\t\twrite: true,\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\tnative: {},\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tfor (const sensor of content.sensors) {\n\t\t\t\t\t\t\tawait this.setObjectNotExistsAsync(`schedule.sensors.${sensor.input}`, {\n\t\t\t\t\t\t\t\ttype: \"channel\",\n\t\t\t\t\t\t\t\tcommon: {\n\t\t\t\t\t\t\t\t\tname: \"sensors\",\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\tnative: {},\n\t\t\t\t\t\t\t});\n\n\t\t\t\t\t\t\tfor (let key in sensor) {\n\t\t\t\t\t\t\t\tif (key !== \"relays\") {\n\t\t\t\t\t\t\t\t\tkey = this.name2id(key);\n\n\t\t\t\t\t\t\t\t\tawait this.setObjectNotExistsAsync(`schedule.sensors.${sensor.input}.${key}`, {\n\t\t\t\t\t\t\t\t\t\ttype: \"state\",\n\t\t\t\t\t\t\t\t\t\tcommon: {\n\t\t\t\t\t\t\t\t\t\t\tname: key,\n\t\t\t\t\t\t\t\t\t\t\ttype: \"number\",\n\t\t\t\t\t\t\t\t\t\t\trole: \"value\",\n\t\t\t\t\t\t\t\t\t\t\tread: true,\n\t\t\t\t\t\t\t\t\t\t\twrite: false,\n\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\tnative: {},\n\t\t\t\t\t\t\t\t\t});\n\n\t\t\t\t\t\t\t\t\tthis.setStateChangedAsync(\n\t\t\t\t\t\t\t\t\t\t`schedule.sensors.${sensor.input}.${key}`,\n\t\t\t\t\t\t\t\t\t\tsensor[key],\n\t\t\t\t\t\t\t\t\t\ttrue,\n\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tresolve(response.status);\n\t\t\t\t})\n\t\t\t\t.catch((error) => {\n\t\t\t\t\tif (error.response?.status === 429) {\n\t\t\t\t\t\tnextpollSchedule =\n\t\t\t\t\t\t\tnextpollSchedule ||\n\t\t\t\t\t\t\tthis.setTimeout(\n\t\t\t\t\t\t\t\t() => {\n\t\t\t\t\t\t\t\t\tnextpollSchedule = null;\n\t\t\t\t\t\t\t\t\tthis.GetStatusSchedule(apiKey);\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t5 * 60 * 1000,\n\t\t\t\t\t\t\t);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tthis.log.debug(`(stats) received error - API is now offline: ${JSON.stringify(error)}`);\n\n\t\t\t\t\t\tthis.setStateChangedAsync(\"info.connection\", false, true);\n\n\t\t\t\t\t\treject(error);\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t});\n\t}\n\n\tprivate async GetCustomerDetails(apiKey: string): Promise<void> {\n\t\treturn new Promise((resolve, reject) => {\n\t\t\tnextpollCustomer =\n\t\t\t\tnextpollCustomer ||\n\t\t\t\tthis.setTimeout(\n\t\t\t\t\t() => {\n\t\t\t\t\t\tnextpollCustomer = null;\n\t\t\t\t\t\tthis.GetCustomerDetails(apiKey);\n\t\t\t\t\t},\n\t\t\t\t\t5 * 60 * 1000,\n\t\t\t\t);\n\n\t\t\tthis.buildRequest(\"customerdetails.php\", { api_key: this.config.apiKey })\n\t\t\t\t.then(async (response) => {\n\t\t\t\t\tif (response.status === 200) {\n\t\t\t\t\t\tconst content = response.data;\n\n\t\t\t\t\t\tthis.setStateChangedAsync(\"info.connection\", true, true);\n\n\t\t\t\t\t\tfor (let key in content) {\n\t\t\t\t\t\t\tif (key !== \"controllers\") {\n\t\t\t\t\t\t\t\tkey = this.name2id(key);\n\n\t\t\t\t\t\t\t\tawait this.setObjectNotExistsAsync(`customer.${key}`, {\n\t\t\t\t\t\t\t\t\ttype: \"state\",\n\t\t\t\t\t\t\t\t\tcommon: {\n\t\t\t\t\t\t\t\t\t\tname: key,\n\t\t\t\t\t\t\t\t\t\ttype: key === \"message\" || key === \"current_controller\" ? \"string\" : \"number\",\n\t\t\t\t\t\t\t\t\t\trole: key === \"message\" || key === \"current_controller\" ? \"text\" : \"value\",\n\t\t\t\t\t\t\t\t\t\tread: true,\n\t\t\t\t\t\t\t\t\t\twrite: false,\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\tnative: {},\n\t\t\t\t\t\t\t\t});\n\n\t\t\t\t\t\t\t\tthis.setStateChangedAsync(`customer.${key}`, content[key], true);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tfor (const controller of content.controllers) {\n\t\t\t\t\t\t\tawait this.setObjectNotExistsAsync(`customer.controllers.${controller.name}`, {\n\t\t\t\t\t\t\t\ttype: \"channel\",\n\t\t\t\t\t\t\t\tcommon: {\n\t\t\t\t\t\t\t\t\tname: controller.name,\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\tnative: {},\n\t\t\t\t\t\t\t});\n\n\t\t\t\t\t\t\tfor (let key in controller) {\n\t\t\t\t\t\t\t\tkey = this.name2id(key);\n\n\t\t\t\t\t\t\t\tawait this.setObjectNotExistsAsync(`customer.controllers.${controller.name}.${key}`, {\n\t\t\t\t\t\t\t\t\ttype: \"state\",\n\t\t\t\t\t\t\t\t\tcommon: {\n\t\t\t\t\t\t\t\t\t\tname: key,\n\t\t\t\t\t\t\t\t\t\ttype: key !== \"controller_id\" ? \"string\" : \"number\",\n\t\t\t\t\t\t\t\t\t\trole: key !== \"controller_id\" ? \"text\" : \"value\",\n\t\t\t\t\t\t\t\t\t\tread: true,\n\t\t\t\t\t\t\t\t\t\twrite: false,\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\tnative: {},\n\t\t\t\t\t\t\t\t});\n\n\t\t\t\t\t\t\t\tif (key === \"last_contact\") {\n\t\t\t\t\t\t\t\t\tconst t = new Date(controller[key] * 1000);\n\t\t\t\t\t\t\t\t\tcontroller[key] = t.toString();\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\tthis.setStateChangedAsync(\n\t\t\t\t\t\t\t\t\t`customer.controllers.${controller.name}.${key}`,\n\t\t\t\t\t\t\t\t\tcontroller[key],\n\t\t\t\t\t\t\t\t\ttrue,\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tresolve(response.status);\n\t\t\t\t})\n\t\t\t\t.catch((error) => {\n\t\t\t\t\tif (error.response.status === 429) {\n\t\t\t\t\t\tnextpollCustomer =\n\t\t\t\t\t\t\tnextpollCustomer ||\n\t\t\t\t\t\t\tthis.setTimeout(\n\t\t\t\t\t\t\t\t() => {\n\t\t\t\t\t\t\t\t\tnextpollCustomer = null;\n\t\t\t\t\t\t\t\t\tthis.GetCustomerDetails(apiKey);\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t5 * 60 * 1000,\n\t\t\t\t\t\t\t);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tthis.log.debug(`(stats) received error - API is now offline: ${JSON.stringify(error)}`);\n\n\t\t\t\t\t\tthis.setStateChangedAsync(\"info.connection\", false, true);\n\n\t\t\t\t\t\treject(error);\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t});\n\t}\n\n\tbuildRequest(service: string, params: any): Promise<any> {\n\t\treturn new Promise((resolve, reject) => {\n\t\t\tconst url = `/api/v1/${service}`;\n\t\t\tlet lastErrorCode = 0;\n\n\t\t\tif (params.api_key) {\n\t\t\t\taxios({\n\t\t\t\t\tmethod: \"GET\",\n\t\t\t\t\tbaseURL: hydrawise_url,\n\t\t\t\t\turl: url,\n\t\t\t\t\ttimeout: 30000,\n\t\t\t\t\tresponseType: \"json\",\n\t\t\t\t\tparams: params,\n\t\t\t\t})\n\t\t\t\t\t.then((response) => {\n\t\t\t\t\t\t// no error - clear up reminder\n\t\t\t\t\t\tlastErrorCode = 0;\n\n\t\t\t\t\t\tresolve(response);\n\t\t\t\t\t})\n\t\t\t\t\t.catch((error) => {\n\t\t\t\t\t\tif (error.response) {\n\t\t\t\t\t\t\t// The request was made and the server responded with a status code\n\n\t\t\t\t\t\t\tthis.log.warn(\n\t\t\t\t\t\t\t\t`received ${error.response.status} response from ${url} with content: ${JSON.stringify(\n\t\t\t\t\t\t\t\t\terror.response.data,\n\t\t\t\t\t\t\t\t)}`,\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t} else if (error.request) {\n\t\t\t\t\t\t\t// The request was made but no response was received\n\t\t\t\t\t\t\t// `error.request` is an instance of XMLHttpRequest in the browser and an instance of\n\t\t\t\t\t\t\t// http.ClientRequest in node.js\n\n\t\t\t\t\t\t\t// avoid spamming of the same error when stuck in a reconnection loop\n\t\t\t\t\t\t\tif (error.code === lastErrorCode) {\n\t\t\t\t\t\t\t\tthis.log.debug(error.message);\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tthis.log.info(`error ${error.code} from ${url}: ${error.message}`);\n\t\t\t\t\t\t\t\tlastErrorCode = error.code;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t// Something happened in setting up the request that triggered an Error\n\t\t\t\t\t\t\tthis.log.error(error.message);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\treject(error);\n\t\t\t\t\t});\n\t\t\t} else {\n\t\t\t\treject(\"API key is not configured\");\n\t\t\t}\n\t\t});\n\t}\n\n\t/**\n\t * Is called when adapter shuts down - callback has to be called under any circumstances!\n\t */\n\tprivate onUnload(callback: () => void): void {\n\t\ttry {\n\t\t\tthis.clearInterval(nextpollSchedule);\n\t\t\tthis.clearInterval(nextpollCustomer);\n\n\t\t\tcallback();\n\t\t} catch (e) {\n\t\t\tcallback();\n\t\t}\n\t}\n\n\t/**\n\t * Is called if a subscribed state changes\n\t */\n\tprivate onStateChange(id: string, state: ioBroker.State | null | undefined): void {\n\t\tif (state && !state.ack) {\n\t\t\tif (id.indexOf(\"stopall\") !== -1) {\n\t\t\t\tthis.buildRequest(\"setzone.php\", { api_key: this.config.apiKey, action: \"stopall\" });\n\t\t\t} else if (id.indexOf(\"stop\") !== -1) {\n\t\t\t\tconst relay = id.match(/.*schedule\\.(.*)\\.stopZone/);\n\n\t\t\t\tif (relay && relay?.length > 1) {\n\t\t\t\t\tthis.buildRequest(\"setzone.php\", {\n\t\t\t\t\t\tapi_key: this.config.apiKey,\n\t\t\t\t\t\taction: \"stop\",\n\t\t\t\t\t\trelay_id: RELAYS[relay[1]],\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (id.indexOf(\"runall\") !== -1 && (state.val || state.val === 0)) {\n\t\t\t\tthis.buildRequest(\"setzone.php\", {\n\t\t\t\t\tapi_key: this.config.apiKey,\n\t\t\t\t\taction: \"runall\",\n\t\t\t\t\tperiod_id: 999,\n\t\t\t\t\tcustom: state.val,\n\t\t\t\t});\n\t\t\t} else if (id.indexOf(\"run\") !== -1 && (state.val || state.val === 0)) {\n\t\t\t\tconst relay = id.match(/.*schedule\\.(.*)\\.runZone/);\n\n\t\t\t\tif (relay && relay?.length > 1) {\n\t\t\t\t\tthis.buildRequest(\"setzone.php\", {\n\t\t\t\t\t\tapi_key: this.config.apiKey,\n\t\t\t\t\t\taction: \"run\",\n\t\t\t\t\t\tperiod_id: 999,\n\t\t\t\t\t\tcustom: state.val,\n\t\t\t\t\t\trelay_id: RELAYS[relay[1]],\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (id.indexOf(\"suspendall\") !== -1 && (state.val || state.val === 0)) {\n\t\t\t\tconst num = state.val as number;\n\n\t\t\t\tthis.buildRequest(\"setzone.php\", {\n\t\t\t\t\tapi_key: this.config.apiKey,\n\t\t\t\t\taction: \"suspendall\",\n\t\t\t\t\tperiod_id: 999,\n\t\t\t\t\tcustom: Math.trunc((state.ts + num) / 1000),\n\t\t\t\t});\n\t\t\t} else if (id.indexOf(\"suspend\") !== -1 && (state.val || state.val === 0)) {\n\t\t\t\tconst num = state.val as number;\n\t\t\t\tconst relay = id.match(/.*schedule\\.(.*)\\.suspendZone/);\n\n\t\t\t\tif (relay && relay?.length > 1) {\n\t\t\t\t\tthis.buildRequest(\"setzone.php\", {\n\t\t\t\t\t\tapi_key: this.config.apiKey,\n\t\t\t\t\t\taction: \"suspend\",\n\t\t\t\t\t\tperiod_id: 999,\n\t\t\t\t\t\tcustom: Math.trunc((state.ts + num) / 1000),\n\t\t\t\t\t\trelay_id: RELAYS[relay[1]],\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\t// The state was deleted\n\t\t\tthis.log.info(`state ${id} deleted`);\n\t\t}\n\t}\n\n\tname2id(pName: string): string {\n\t\treturn (pName || \"\").replace(this.FORBIDDEN_CHARS, \"_\");\n\t}\n}\n\nif (require.main !== module) {\n\t// Export the constructor in compact mode\n\tmodule.exports = (options: Partial<utils.AdapterOptions> | undefined) => new Hydrawise(options);\n} else {\n\t// otherwise start the instance directly\n\t(() => new Hydrawise())();\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": ["axios"]
|
|
7
7
|
}
|
package/io-package.json
CHANGED
|
@@ -1,8 +1,34 @@
|
|
|
1
1
|
{
|
|
2
2
|
"common": {
|
|
3
3
|
"name": "hydrawise",
|
|
4
|
-
"version": "0.0.
|
|
4
|
+
"version": "0.0.17",
|
|
5
5
|
"news": {
|
|
6
|
+
"0.0.17": {
|
|
7
|
+
"en": "fixed adapter crash",
|
|
8
|
+
"de": "fester adapterabsturz",
|
|
9
|
+
"ru": "фиксированный адаптер аварии",
|
|
10
|
+
"pt": "travamento do adaptador fixo",
|
|
11
|
+
"nl": "vertaling:",
|
|
12
|
+
"fr": "crash de l'adaptateur fixe",
|
|
13
|
+
"it": "arresto dell'adattatore fisso",
|
|
14
|
+
"es": "choque de adaptador fijo",
|
|
15
|
+
"pl": "adaptacja adaptatora",
|
|
16
|
+
"uk": "фіксований аварійний адаптер",
|
|
17
|
+
"zh-cn": "b. 固定适应器"
|
|
18
|
+
},
|
|
19
|
+
"0.0.16": {
|
|
20
|
+
"en": "added more information to README\nencrypted apiKey\nremoved logging of apiKey\nadded filtering of invalid characters in ids\nadded check of ack flag\nfixed roles\nfixed error message\nremoved usage of clearTimeout",
|
|
21
|
+
"de": "weitere Informationen zu README\nverschlüsselt api Schlüssel\nentfernte Protokollierung von api Schlüssel\nfiltern von ungültigen zeichen in ids\nzusätzlicher check von ack flag\nfeste rollen\nfeste fehlermeldung\nentfernte Verwendung von klar Zeit",
|
|
22
|
+
"ru": "добавлена дополнительная информация для README\nзашифрованный api Ключ\nудалили логирование api Ключ\nдобавлена фильтрация недействительных символов в ids\nдобавлена проверка флага ack\nфиксированные роли\nфиксированное сообщение об ошибке\nудаленное использование ясно Тайм-аут",
|
|
23
|
+
"pt": "adicionado mais informações para LERME\napi criptografado Chaveiro\nlog removido de api Chaveiro\nadicionado filtragem de caracteres inválidos em ids\nadicionado check of ack flag\npapéis fixos\nmensagem de erro fixo\nuso removido de claro Timeout",
|
|
24
|
+
"nl": "voegde meer informatie toe aan\ngecodeerde api Sleutel\nverwijderde logging Sleutel\nvoegde toegevoegd van invalide personages in id\nvertaling:\ngerepareerde rollen\nvergissing\nverwijder het gebruik Time-out",
|
|
25
|
+
"fr": "ajouté plus d'informations à README\ncrypté api Key\nenlèvement de l ' api Key\nfiltrage des caractères invalides dans les ids\nvérification supplémentaire du drapeau ack\nrôles fixes\nmessage d ' erreur\nl ' utilisation supprimée Timeout",
|
|
26
|
+
"it": "maggiori informazioni su README\napi crittografato Chiave\nlogging rimosso di api Chiave\nfiltraggio aggiunto di caratteri non validi in ids\ncontrollo aggiunto della bandiera di ack\nruoli fissi\nmessaggio di errore fisso\nuso rimosso di chiaro Tempo",
|
|
27
|
+
"es": "añadir más información a README\nencriptado api Clave\nextracción de registro de api Clave\nfiltro añadido de caracteres inválidos en ids\ncheque añadido de la bandera de la cubierta\nfunciones fijas\nmensaje de error fijo\nuso eliminado de clara Timeout",
|
|
28
|
+
"pl": "dodano więcej informacji na temat README\nszyfrowanie api Key\nusunięta logika api Key\ndodał filtrowanie nieprawidłowych postaci w idsach\ndodać się do flagi\nrola stała\nbłędy\nusunąć Timeout",
|
|
29
|
+
"uk": "додано більше інформації\nзашифрований api Головна\nвидалений загін апі Головна\nдодано фільтрування недійсних символів у ids\nдодано перевірку ack прапора\nфіксовані ролі\nфіксоване повідомлення про помилку\nвидалення використання прозорого Розклад",
|
|
30
|
+
"zh-cn": "d. 增加中小企业的更多信息\n加密处 关键\n拆除管道 关键\n添加过滤剂中的无效性\n进一步检查旗帜\n固定作用\n固定错误信息\n删除明确用途 时限"
|
|
31
|
+
},
|
|
6
32
|
"0.0.15": {
|
|
7
33
|
"en": "updated dependencies",
|
|
8
34
|
"de": "aktualisierte abhängigkeiten",
|
|
@@ -67,32 +93,6 @@
|
|
|
67
93
|
"pl": "podwyższony czas\ntyp maszynowy",
|
|
68
94
|
"uk": "підняті час\nфіксовані види",
|
|
69
95
|
"zh-cn": "d. 提出的时间安排\n固定类型"
|
|
70
|
-
},
|
|
71
|
-
"0.0.10": {
|
|
72
|
-
"en": "fixed adapter crash\nchanged value of `timestr` to date string format",
|
|
73
|
-
"de": "fester adapterabsturz\ngeänderter wert von timestr zu date string format",
|
|
74
|
-
"ru": "фиксированный адаптер аварии\nизмененное значение timestr к формату строк",
|
|
75
|
-
"pt": "travamento do adaptador fixo\nvalor alterado de timestr para formato de cadeia de data",
|
|
76
|
-
"nl": "vertaling:\nveranderde waarde van tijdstip om te daten",
|
|
77
|
-
"fr": "crash de l'adaptateur fixe\nvaleur modifiée de timestr to date chaîne format",
|
|
78
|
-
"it": "arresto dell'adattatore fisso\nvalore cambiato di timestr in formato stringa data",
|
|
79
|
-
"es": "choque de adaptador fijo\ncambio de valor del formato de la cadena de tiempo a la fecha",
|
|
80
|
-
"pl": "adaptacja adaptatora\nzmieniona wartość czasu do daty formatu tekstowego",
|
|
81
|
-
"uk": "фіксований аварійний адаптер\nзмінено значення таймера до формата рядка",
|
|
82
|
-
"zh-cn": "b. 固定适应器\n迄今格式的变动"
|
|
83
|
-
},
|
|
84
|
-
"0.0.9": {
|
|
85
|
-
"en": "added more translations",
|
|
86
|
-
"de": "weitere übersetzungen",
|
|
87
|
-
"ru": "добавлены больше переводов",
|
|
88
|
-
"pt": "adicionado mais traduções",
|
|
89
|
-
"nl": "vertaling:",
|
|
90
|
-
"fr": "ajouté plus de traductions",
|
|
91
|
-
"it": "aggiunto più traduzioni",
|
|
92
|
-
"es": "añadido más traducciones",
|
|
93
|
-
"pl": "dodano więcej tłumaczeń",
|
|
94
|
-
"uk": "додано більше перекладів",
|
|
95
|
-
"zh-cn": "增加的翻译"
|
|
96
96
|
}
|
|
97
97
|
},
|
|
98
98
|
"titleLang": {
|
|
@@ -161,6 +161,12 @@
|
|
|
161
161
|
"native": {
|
|
162
162
|
"apiKey": ""
|
|
163
163
|
},
|
|
164
|
+
"encryptedNative": [
|
|
165
|
+
"apiKey"
|
|
166
|
+
],
|
|
167
|
+
"protectedNative": [
|
|
168
|
+
"apiKey"
|
|
169
|
+
],
|
|
164
170
|
"objects": [],
|
|
165
171
|
"instanceObjects": [
|
|
166
172
|
{
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "iobroker.hydrawise",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.17",
|
|
4
4
|
"description": "Adapter to control the Hydrawise irrigation control system",
|
|
5
5
|
"author": {
|
|
6
6
|
"name": "SentiQ",
|
|
@@ -26,17 +26,17 @@
|
|
|
26
26
|
"@iobroker/adapter-core": "^2.6.7"
|
|
27
27
|
},
|
|
28
28
|
"devDependencies": {
|
|
29
|
-
"@alcalzone/release-script": "^3.
|
|
30
|
-
"@alcalzone/release-script-plugin-iobroker": "^3.
|
|
29
|
+
"@alcalzone/release-script": "^3.6.0",
|
|
30
|
+
"@alcalzone/release-script-plugin-iobroker": "^3.6.0",
|
|
31
31
|
"@alcalzone/release-script-plugin-license": "^3.5.9",
|
|
32
32
|
"@alcalzone/release-script-plugin-manual-review": "^3.5.9",
|
|
33
33
|
"@iobroker/adapter-dev": "^1.2.0",
|
|
34
34
|
"@iobroker/testing": "^4.1.0",
|
|
35
|
-
"@tsconfig/node16": "^1.0
|
|
35
|
+
"@tsconfig/node16": "^16.1.0",
|
|
36
36
|
"@types/chai": "^4.3.4",
|
|
37
37
|
"@types/chai-as-promised": "^7.1.5",
|
|
38
38
|
"@types/mocha": "^10.0.1",
|
|
39
|
-
"@types/node": "^20.3.
|
|
39
|
+
"@types/node": "^20.3.3",
|
|
40
40
|
"@types/proxyquire": "^1.3.28",
|
|
41
41
|
"@types/sinon": "^10.0.13",
|
|
42
42
|
"@types/sinon-chai": "^3.2.9",
|
|
@@ -44,12 +44,12 @@
|
|
|
44
44
|
"@typescript-eslint/parser": "^5.60.1",
|
|
45
45
|
"chai": "^4.3.7",
|
|
46
46
|
"chai-as-promised": "^7.1.1",
|
|
47
|
-
"eslint": "^8.
|
|
48
|
-
"eslint-config-prettier": "^8.
|
|
49
|
-
"eslint-plugin-prettier": "^
|
|
47
|
+
"eslint": "^8.44.0",
|
|
48
|
+
"eslint-config-prettier": "^8.9.0",
|
|
49
|
+
"eslint-plugin-prettier": "^5.0.0",
|
|
50
50
|
"mocha": "^10.2.0",
|
|
51
51
|
"nyc": "^15.1.0",
|
|
52
|
-
"prettier": "^
|
|
52
|
+
"prettier": "^3.0.0",
|
|
53
53
|
"proxyquire": "^2.1.3",
|
|
54
54
|
"rimraf": "^5.0.1",
|
|
55
55
|
"sinon": "^15.2.0",
|
|
@@ -80,7 +80,7 @@
|
|
|
80
80
|
"test": "npm run test:ts && npm run test:package",
|
|
81
81
|
"check": "tsc --noEmit",
|
|
82
82
|
"coverage": "nyc npm run test:ts",
|
|
83
|
-
"lint": "eslint --ext .ts src/",
|
|
83
|
+
"lint": "eslint --ext .ts src/ --fix",
|
|
84
84
|
"translate": "translate-adapter",
|
|
85
85
|
"release": "release-script patch --yes",
|
|
86
86
|
"release-minor": "release-script minor --yes",
|