iobroker.sprinklecontrol 0.2.13 → 0.2.15
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/{Lizenz → LICENSE} +21 -21
- package/README.md +62 -110
- package/admin/i18n/de/translations.json +134 -0
- package/admin/i18n/en/translations.json +134 -0
- package/admin/i18n/es/translations.json +134 -0
- package/admin/i18n/fr/translations.json +134 -0
- package/admin/i18n/it/translations.json +134 -0
- package/admin/i18n/nl/translations.json +134 -0
- package/admin/i18n/pl/translations.json +134 -0
- package/admin/i18n/pt/translations.json +134 -0
- package/admin/i18n/ru/translations.json +134 -0
- package/admin/i18n/uk/translations.json +134 -0
- package/admin/i18n/zh-cn/translations.json +134 -0
- package/admin/index_m.html +904 -907
- package/admin/index_m.js +779 -779
- package/admin/style.css +453 -158
- package/admin/words.js +143 -136
- package/io-package.json +268 -201
- package/lib/adapter-config.d.ts +19 -16
- package/lib/evaporation.js +455 -412
- package/lib/myConfig.js +372 -359
- package/lib/sendMessageText.js +162 -199
- package/lib/tools.js +148 -125
- package/lib/valveControl.js +931 -887
- package/main.js +2045 -1828
- package/package.json +50 -32
- package/.gitattributes +0 -2
- package/admin/admin.d.ts +0 -1
- package/docs/de/img/E-Mail.jpg +0 -0
- package/docs/de/img/Extraeinstellungen.jpg +0 -0
- package/docs/de/img/Pumpeneinstellung.jpg +0 -0
- package/docs/de/img/Pushover.jpg +0 -0
- package/docs/de/img/Select_ID.jpg +0 -0
- package/docs/de/img/Telegram.jpg +0 -0
- package/docs/de/img/Ventil-Haupteinstellung.jpg +0 -0
- package/docs/de/img/Ventil-Pumpeneinstellung.jpg +0 -0
- package/docs/de/img/WhatsApp.jpg +0 -0
- package/docs/de/img/Zeiteinstellung.jpg +0 -0
- package/docs/de/img/addTime.jpg +0 -0
- package/docs/de/img/analog.jpg +0 -0
- package/docs/de/img/ber-verdunstung.jpg +0 -0
- package/docs/de/img/bew-einstellung.jpg +0 -0
- package/docs/de/img/bew-feste-tage.jpg +0 -0
- package/docs/de/img/bistabil.jpg +0 -0
- package/docs/de/img/bodenf-analog.jpg +0 -0
- package/docs/de/img/bodenf-bistabil.jpg +0 -0
- package/docs/de/img/calculation.jpg +0 -0
- package/docs/de/img/control.jpg +0 -0
- package/docs/de/img/einschaltpunkt-giessen.jpg +0 -0
- package/docs/de/img/festeTage.jpg +0 -0
- package/docs/de/img/main.jpg +0 -0
- package/docs/de/img/main_tab.jpg +0 -0
- package/docs/de/img/max-bodenfeuchtigkeit.jpg +0 -0
- package/docs/de/img/schaltverhalten.jpg +0 -0
- package/docs/de/img/sprinklecontrol.png +0 -0
- package/docs/de/img/verdunstDiagra.jpg +0 -0
- package/docs/de/img/verdunstung.jpg +0 -0
- package/docs/de/img/zus-bew-einstellung.jpg +0 -0
- package/docs/de/sprinklecontrol.md +0 -656
- package/docs/en/img/schaltverhalten.jpg +0 -0
- package/docs/en/img/screenshot1.jpg +0 -0
- package/docs/en/img/screenshot2.jpg +0 -0
- package/docs/en/img/screenshot3.jpg +0 -0
- package/docs/en/img/screenshot4.jpg +0 -0
- package/docs/en/img/screenshot5.jpg +0 -0
- package/docs/en/img/screenshot6.jpg +0 -0
- package/docs/en/img/screenshot7.jpg +0 -0
- package/docs/en/img/screenshot8.jpg +0 -0
- package/docs/en/img/sprinklecontrol.png +0 -0
- package/docs/en/sprinklecontrol.md +0 -230
- package/main.test.js +0 -30
package/lib/valveControl.js
CHANGED
|
@@ -1,888 +1,932 @@
|
|
|
1
|
-
'use strict';
|
|
2
|
-
|
|
3
|
-
const myConfig = require('./myConfig.js');
|
|
4
|
-
const addTime = require('./tools.js').addTime;
|
|
5
|
-
const formatTime = require('./tools').formatTime;
|
|
6
|
-
const sendMessageText = require('./sendMessageText.js'); // sendMessageText
|
|
7
|
-
|
|
8
|
-
/**
|
|
9
|
-
* The adapter instance
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
*
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
/**
|
|
22
|
-
let
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
/**
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
entry.
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
//
|
|
116
|
-
entry.times.
|
|
117
|
-
/* Zustand des Ventils im Thread < 0 > off, < 1 > wait,
|
|
118
|
-
adapter.setState(
|
|
119
|
-
val:
|
|
120
|
-
ack: true
|
|
121
|
-
});
|
|
122
|
-
entry.
|
|
123
|
-
|
|
124
|
-
entry.times.
|
|
125
|
-
},
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
entry.times.boostTime2
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
}
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
*
|
|
189
|
-
* @
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
*/
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
*
|
|
276
|
-
* @
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
*
|
|
287
|
-
* @param a
|
|
288
|
-
* @param b
|
|
289
|
-
* @returns
|
|
290
|
-
*/
|
|
291
|
-
function
|
|
292
|
-
return a.pipeFlow
|
|
293
|
-
a.pipeFlow
|
|
294
|
-
0;
|
|
295
|
-
}
|
|
296
|
-
/**
|
|
297
|
-
*
|
|
298
|
-
*
|
|
299
|
-
* @param
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
/*
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
|
|
370
|
-
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
}
|
|
375
|
-
/*
|
|
376
|
-
|
|
377
|
-
/*
|
|
378
|
-
|
|
379
|
-
|
|
380
|
-
|
|
381
|
-
|
|
382
|
-
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
|
|
386
|
-
|
|
387
|
-
|
|
388
|
-
|
|
389
|
-
entry.
|
|
390
|
-
|
|
391
|
-
}
|
|
392
|
-
}
|
|
393
|
-
|
|
394
|
-
|
|
395
|
-
|
|
396
|
-
|
|
397
|
-
|
|
398
|
-
|
|
399
|
-
|
|
400
|
-
|
|
401
|
-
|
|
402
|
-
|
|
403
|
-
|
|
404
|
-
|
|
405
|
-
|
|
406
|
-
|
|
407
|
-
|
|
408
|
-
|
|
409
|
-
|
|
410
|
-
|
|
411
|
-
|
|
412
|
-
|
|
413
|
-
|
|
414
|
-
|
|
415
|
-
|
|
416
|
-
|
|
417
|
-
|
|
418
|
-
|
|
419
|
-
|
|
420
|
-
|
|
421
|
-
|
|
422
|
-
|
|
423
|
-
|
|
424
|
-
}
|
|
425
|
-
|
|
426
|
-
|
|
427
|
-
|
|
428
|
-
|
|
429
|
-
|
|
430
|
-
|
|
431
|
-
|
|
432
|
-
|
|
433
|
-
|
|
434
|
-
|
|
435
|
-
|
|
436
|
-
|
|
437
|
-
|
|
438
|
-
|
|
439
|
-
|
|
440
|
-
|
|
441
|
-
|
|
442
|
-
|
|
443
|
-
|
|
444
|
-
|
|
445
|
-
|
|
446
|
-
}
|
|
447
|
-
|
|
448
|
-
|
|
449
|
-
|
|
450
|
-
|
|
451
|
-
|
|
452
|
-
|
|
453
|
-
|
|
454
|
-
|
|
455
|
-
|
|
456
|
-
|
|
457
|
-
|
|
458
|
-
|
|
459
|
-
|
|
460
|
-
|
|
461
|
-
|
|
462
|
-
|
|
463
|
-
|
|
464
|
-
|
|
465
|
-
|
|
466
|
-
|
|
467
|
-
|
|
468
|
-
|
|
469
|
-
|
|
470
|
-
|
|
471
|
-
|
|
472
|
-
|
|
473
|
-
});
|
|
474
|
-
|
|
475
|
-
|
|
476
|
-
|
|
477
|
-
|
|
478
|
-
|
|
479
|
-
|
|
480
|
-
|
|
481
|
-
|
|
482
|
-
|
|
483
|
-
|
|
484
|
-
|
|
485
|
-
|
|
486
|
-
|
|
487
|
-
|
|
488
|
-
*/
|
|
489
|
-
|
|
490
|
-
|
|
491
|
-
|
|
492
|
-
|
|
493
|
-
|
|
494
|
-
|
|
495
|
-
|
|
496
|
-
|
|
497
|
-
|
|
498
|
-
|
|
499
|
-
|
|
500
|
-
|
|
501
|
-
|
|
502
|
-
|
|
503
|
-
adapter.
|
|
504
|
-
|
|
505
|
-
|
|
506
|
-
|
|
507
|
-
|
|
508
|
-
|
|
509
|
-
|
|
510
|
-
|
|
511
|
-
|
|
512
|
-
|
|
513
|
-
|
|
514
|
-
|
|
515
|
-
|
|
516
|
-
|
|
517
|
-
|
|
518
|
-
|
|
519
|
-
|
|
520
|
-
|
|
521
|
-
|
|
522
|
-
|
|
523
|
-
|
|
524
|
-
|
|
525
|
-
|
|
526
|
-
|
|
527
|
-
|
|
528
|
-
|
|
529
|
-
|
|
530
|
-
|
|
531
|
-
currentPumpUse.
|
|
532
|
-
adapter.
|
|
533
|
-
|
|
534
|
-
|
|
535
|
-
|
|
536
|
-
|
|
537
|
-
|
|
538
|
-
|
|
539
|
-
|
|
540
|
-
|
|
541
|
-
|
|
542
|
-
|
|
543
|
-
|
|
544
|
-
|
|
545
|
-
|
|
546
|
-
|
|
547
|
-
|
|
548
|
-
|
|
549
|
-
|
|
550
|
-
|
|
551
|
-
|
|
552
|
-
|
|
553
|
-
|
|
554
|
-
|
|
555
|
-
|
|
556
|
-
})
|
|
557
|
-
|
|
558
|
-
|
|
559
|
-
|
|
560
|
-
|
|
561
|
-
|
|
562
|
-
|
|
563
|
-
|
|
564
|
-
|
|
565
|
-
|
|
566
|
-
|
|
567
|
-
|
|
568
|
-
|
|
569
|
-
|
|
570
|
-
|
|
571
|
-
|
|
572
|
-
|
|
573
|
-
|
|
574
|
-
|
|
575
|
-
|
|
576
|
-
|
|
577
|
-
adapter.
|
|
578
|
-
|
|
579
|
-
|
|
580
|
-
|
|
581
|
-
|
|
582
|
-
|
|
583
|
-
|
|
584
|
-
|
|
585
|
-
|
|
586
|
-
adapter.
|
|
587
|
-
|
|
588
|
-
|
|
589
|
-
|
|
590
|
-
|
|
591
|
-
|
|
592
|
-
|
|
593
|
-
|
|
594
|
-
}
|
|
595
|
-
|
|
596
|
-
|
|
597
|
-
|
|
598
|
-
|
|
599
|
-
|
|
600
|
-
|
|
601
|
-
|
|
602
|
-
|
|
603
|
-
|
|
604
|
-
|
|
605
|
-
|
|
606
|
-
|
|
607
|
-
|
|
608
|
-
|
|
609
|
-
|
|
610
|
-
|
|
611
|
-
|
|
612
|
-
|
|
613
|
-
|
|
614
|
-
|
|
615
|
-
|
|
616
|
-
|
|
617
|
-
|
|
618
|
-
|
|
619
|
-
|
|
620
|
-
|
|
621
|
-
|
|
622
|
-
|
|
623
|
-
|
|
624
|
-
|
|
625
|
-
|
|
626
|
-
|
|
627
|
-
}
|
|
628
|
-
|
|
629
|
-
|
|
630
|
-
|
|
631
|
-
|
|
632
|
-
|
|
633
|
-
|
|
634
|
-
|
|
635
|
-
|
|
636
|
-
|
|
637
|
-
|
|
638
|
-
|
|
639
|
-
|
|
640
|
-
|
|
641
|
-
|
|
642
|
-
}
|
|
643
|
-
|
|
644
|
-
|
|
645
|
-
|
|
646
|
-
}
|
|
647
|
-
|
|
648
|
-
|
|
649
|
-
|
|
650
|
-
|
|
651
|
-
|
|
652
|
-
|
|
653
|
-
|
|
654
|
-
})
|
|
655
|
-
|
|
656
|
-
|
|
657
|
-
|
|
658
|
-
|
|
659
|
-
|
|
660
|
-
|
|
661
|
-
|
|
662
|
-
})
|
|
663
|
-
|
|
664
|
-
|
|
665
|
-
|
|
666
|
-
|
|
667
|
-
|
|
668
|
-
|
|
669
|
-
|
|
670
|
-
|
|
671
|
-
|
|
672
|
-
|
|
673
|
-
|
|
674
|
-
|
|
675
|
-
|
|
676
|
-
|
|
677
|
-
|
|
678
|
-
|
|
679
|
-
|
|
680
|
-
|
|
681
|
-
|
|
682
|
-
|
|
683
|
-
|
|
684
|
-
|
|
685
|
-
|
|
686
|
-
|
|
687
|
-
|
|
688
|
-
|
|
689
|
-
|
|
690
|
-
|
|
691
|
-
|
|
692
|
-
|
|
693
|
-
|
|
694
|
-
|
|
695
|
-
|
|
696
|
-
|
|
697
|
-
|
|
698
|
-
|
|
699
|
-
|
|
700
|
-
|
|
701
|
-
|
|
702
|
-
|
|
703
|
-
|
|
704
|
-
|
|
705
|
-
|
|
706
|
-
|
|
707
|
-
|
|
708
|
-
|
|
709
|
-
|
|
710
|
-
|
|
711
|
-
|
|
712
|
-
|
|
713
|
-
|
|
714
|
-
|
|
715
|
-
|
|
716
|
-
|
|
717
|
-
|
|
718
|
-
|
|
719
|
-
|
|
720
|
-
|
|
721
|
-
|
|
722
|
-
|
|
723
|
-
|
|
724
|
-
|
|
725
|
-
|
|
726
|
-
|
|
727
|
-
|
|
728
|
-
|
|
729
|
-
|
|
730
|
-
|
|
731
|
-
|
|
732
|
-
|
|
733
|
-
|
|
734
|
-
|
|
735
|
-
|
|
736
|
-
|
|
737
|
-
|
|
738
|
-
|
|
739
|
-
|
|
740
|
-
|
|
741
|
-
|
|
742
|
-
|
|
743
|
-
|
|
744
|
-
|
|
745
|
-
|
|
746
|
-
|
|
747
|
-
|
|
748
|
-
|
|
749
|
-
|
|
750
|
-
|
|
751
|
-
|
|
752
|
-
|
|
753
|
-
|
|
754
|
-
|
|
755
|
-
|
|
756
|
-
|
|
757
|
-
|
|
758
|
-
|
|
759
|
-
|
|
760
|
-
|
|
761
|
-
|
|
762
|
-
|
|
763
|
-
|
|
764
|
-
|
|
765
|
-
|
|
766
|
-
|
|
767
|
-
|
|
768
|
-
|
|
769
|
-
|
|
770
|
-
|
|
771
|
-
|
|
772
|
-
|
|
773
|
-
|
|
774
|
-
|
|
775
|
-
|
|
776
|
-
|
|
777
|
-
|
|
778
|
-
|
|
779
|
-
|
|
780
|
-
|
|
781
|
-
|
|
782
|
-
|
|
783
|
-
|
|
784
|
-
|
|
785
|
-
|
|
786
|
-
|
|
787
|
-
|
|
788
|
-
|
|
789
|
-
|
|
790
|
-
|
|
791
|
-
|
|
792
|
-
|
|
793
|
-
|
|
794
|
-
|
|
795
|
-
|
|
796
|
-
|
|
797
|
-
|
|
798
|
-
|
|
799
|
-
|
|
800
|
-
|
|
801
|
-
|
|
802
|
-
|
|
803
|
-
|
|
804
|
-
|
|
805
|
-
|
|
806
|
-
|
|
807
|
-
|
|
808
|
-
|
|
809
|
-
|
|
810
|
-
|
|
811
|
-
|
|
812
|
-
|
|
813
|
-
|
|
814
|
-
|
|
815
|
-
|
|
816
|
-
|
|
817
|
-
|
|
818
|
-
|
|
819
|
-
|
|
820
|
-
|
|
821
|
-
|
|
822
|
-
|
|
823
|
-
|
|
824
|
-
|
|
825
|
-
|
|
826
|
-
|
|
827
|
-
|
|
828
|
-
|
|
829
|
-
|
|
830
|
-
|
|
831
|
-
|
|
832
|
-
|
|
833
|
-
|
|
834
|
-
|
|
835
|
-
|
|
836
|
-
|
|
837
|
-
|
|
838
|
-
|
|
839
|
-
|
|
840
|
-
|
|
841
|
-
|
|
842
|
-
|
|
843
|
-
|
|
844
|
-
|
|
845
|
-
|
|
846
|
-
|
|
847
|
-
|
|
848
|
-
|
|
849
|
-
|
|
850
|
-
|
|
851
|
-
|
|
852
|
-
|
|
853
|
-
|
|
854
|
-
|
|
855
|
-
|
|
856
|
-
|
|
857
|
-
|
|
858
|
-
|
|
859
|
-
|
|
860
|
-
|
|
861
|
-
|
|
862
|
-
|
|
863
|
-
|
|
864
|
-
|
|
865
|
-
|
|
866
|
-
|
|
867
|
-
|
|
868
|
-
|
|
869
|
-
|
|
870
|
-
|
|
871
|
-
|
|
872
|
-
|
|
873
|
-
|
|
874
|
-
|
|
875
|
-
|
|
876
|
-
|
|
877
|
-
|
|
878
|
-
|
|
879
|
-
|
|
880
|
-
|
|
881
|
-
|
|
882
|
-
|
|
883
|
-
|
|
884
|
-
}
|
|
885
|
-
|
|
886
|
-
|
|
887
|
-
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
const myConfig = require('./myConfig.js');
|
|
4
|
+
const addTime = require('./tools.js').addTime;
|
|
5
|
+
const formatTime = require('./tools').formatTime;
|
|
6
|
+
const sendMessageText = require('./sendMessageText.js'); // sendMessageText
|
|
7
|
+
|
|
8
|
+
/**
|
|
9
|
+
* The adapter instance
|
|
10
|
+
*/
|
|
11
|
+
let adapter;
|
|
12
|
+
|
|
13
|
+
/**
|
|
14
|
+
* Thread-list
|
|
15
|
+
* → Auflistung aller aktiver Sprenger-Kreise
|
|
16
|
+
*/
|
|
17
|
+
const threadList = [];
|
|
18
|
+
|
|
19
|
+
/** bereit für Boost */
|
|
20
|
+
let boostReady = true;
|
|
21
|
+
/** Boost ist aktive */
|
|
22
|
+
let boostOn = false;
|
|
23
|
+
/** Timer für die Länge des */
|
|
24
|
+
let boostListTimer;
|
|
25
|
+
/** maximal zulässige Anzahl der eingeschalteten Ventile */
|
|
26
|
+
let maxParallel = 0;
|
|
27
|
+
/** Füllstand der Zisterne */
|
|
28
|
+
let fillLevelCistern = 0;
|
|
29
|
+
let statusCistern = '';
|
|
30
|
+
|
|
31
|
+
const currentPumpUse = {
|
|
32
|
+
/** Pumpen aktive? */
|
|
33
|
+
enable: false,
|
|
34
|
+
/** Zisterne aktive? */
|
|
35
|
+
pumpCistern: false,
|
|
36
|
+
/** Pumpen-Bezeichnung; z.B. "hm-rpc.0.MEQ1810129.1.STATE" */
|
|
37
|
+
pumpName: '',
|
|
38
|
+
/** Pumpenleistung in l/h */
|
|
39
|
+
pumpPower: 0
|
|
40
|
+
};
|
|
41
|
+
|
|
42
|
+
|
|
43
|
+
/*==============================================================================================================================================*/
|
|
44
|
+
/* interne Funktionen */
|
|
45
|
+
/*----------------------------------------------------------------------------------------------------------------------------------------------*/
|
|
46
|
+
|
|
47
|
+
/**
|
|
48
|
+
* Sprinkle (sprinkleName) delete
|
|
49
|
+
* → Ventil (sprinkleName) löschen
|
|
50
|
+
*
|
|
51
|
+
* @param killList - sprinkleName der zu löschenden Objekte
|
|
52
|
+
*/
|
|
53
|
+
function delList (killList) {
|
|
54
|
+
for(const sprinkleName of killList) {
|
|
55
|
+
let bValveFound = false; // Ventil gefunden
|
|
56
|
+
for(let counter = 0, // Loop über das Array
|
|
57
|
+
lastArray = (threadList.length - 1); // entsprechend der Anzahl der Eintragungen
|
|
58
|
+
counter <= lastArray;
|
|
59
|
+
counter++) {
|
|
60
|
+
const entry = threadList[counter].sprinkleName;
|
|
61
|
+
if ((sprinkleName === entry) || bValveFound) {
|
|
62
|
+
if (sprinkleName === entry) bValveFound = true;
|
|
63
|
+
if (counter !== lastArray) threadList[counter] = threadList[counter + 1];
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
/* If a valve is found, delete the last array (entry). Wenn Ventil gefunden letzten Array (Auftrag) löschen */
|
|
67
|
+
if (bValveFound) {
|
|
68
|
+
threadList.pop();
|
|
69
|
+
adapter.log.debug(`delList=> order deleted ID: ${sprinkleName} ( rest orders: ${threadList.length} )`);
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
} // End delList
|
|
74
|
+
|
|
75
|
+
/*----------------------------------------------------------------------------------------------------------------------------------------------*/
|
|
76
|
+
|
|
77
|
+
/**
|
|
78
|
+
* Activation of the booster (all other active valves are deactivated for the duration of the boost so that the sprinkler can be extended with the maximum possible pressure)
|
|
79
|
+
* => aktivierung des Boosters (alle anderen aktiven Ventile werden für die Zeit des Boosts deaktiviert um den maximalen möglichen Druck zum Ausfahren der Sprenger zu ermöglichen)
|
|
80
|
+
*
|
|
81
|
+
* @param sprinkleID
|
|
82
|
+
*/
|
|
83
|
+
function boostList (sprinkleID) {
|
|
84
|
+
boostReady = false;
|
|
85
|
+
boostOn = true;
|
|
86
|
+
for(const entry of threadList) {
|
|
87
|
+
if (entry.enabled) {
|
|
88
|
+
if (entry.sprinkleID === sprinkleID) { // Booster
|
|
89
|
+
/* Zustand des Ventils im Thread < 0 > off, < 1 > wait, < 2 > on, < 3 > break, <<< 4 >>> Boost(on), < 5 > off(Boost) */
|
|
90
|
+
adapter.setState(`sprinkle.${entry.sprinkleName}.sprinklerState`, {
|
|
91
|
+
val: 4,
|
|
92
|
+
ack: true
|
|
93
|
+
});
|
|
94
|
+
//valveState(entry, 'Boost(on)');
|
|
95
|
+
entry.times.boostTime2 = setTimeout(() => {
|
|
96
|
+
/* Zustand des Ventils im Thread < 0 > off, < 1 > wait, <<< 2 >>> on, < 3 > break, < 4 > Boost(on), < 5 > off(Boost) */
|
|
97
|
+
adapter.setState(`sprinkle.${entry.sprinkleName}.sprinklerState`, {
|
|
98
|
+
val: 2,
|
|
99
|
+
ack: true
|
|
100
|
+
});
|
|
101
|
+
entry.times.boostTime2 = null;
|
|
102
|
+
},31000);
|
|
103
|
+
} else { // rest der Ventile
|
|
104
|
+
// in die Zwangspause (myBreak = true)
|
|
105
|
+
entry.times.boostTime1 = setTimeout(() => {
|
|
106
|
+
/* Zustand des Ventils im Thread < 0 > off, < 1 > wait, < 2 > on, < 3 > break, < 4 > Boost(on), <<< 5 >>> off(Boost) */
|
|
107
|
+
adapter.setState(`sprinkle.${entry.sprinkleName}.sprinklerState`, {
|
|
108
|
+
val: 5,
|
|
109
|
+
ack: true
|
|
110
|
+
});
|
|
111
|
+
entry.myBreak = true;
|
|
112
|
+
// valveOnOff(entry, false, '#2.1 Set: off(Boost), ID: ');
|
|
113
|
+
entry.times.boostTime1 = null;
|
|
114
|
+
},250);
|
|
115
|
+
// aus der Zwangspause holen (myBreak = false)
|
|
116
|
+
entry.times.boostTime2 = setTimeout(() => {
|
|
117
|
+
/* Zustand des Ventils im Thread < 0 > off, < 1 > wait, <<< 2 >>> on, < 3 > break, < 4 > Boost(on), < 5 > off(Boost) */
|
|
118
|
+
adapter.setState(`sprinkle.${entry.sprinkleName}.sprinklerState`, {
|
|
119
|
+
val: 2,
|
|
120
|
+
ack: true
|
|
121
|
+
});
|
|
122
|
+
// valveOnOff(entry, true, '#2.2 Set: on, ID: ');
|
|
123
|
+
entry.myBreak = false;
|
|
124
|
+
entry.times.boostTime2 = null;
|
|
125
|
+
},31000);
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
boostListTimer = setTimeout(() => {
|
|
130
|
+
boostOn = false;
|
|
131
|
+
updateList();
|
|
132
|
+
},32000);
|
|
133
|
+
} // End boostList
|
|
134
|
+
|
|
135
|
+
/*----------------------------------------------------------------------------------------------------------------------------------------------*/
|
|
136
|
+
|
|
137
|
+
/**
|
|
138
|
+
* If boostOn is ended by entering "runningTime = 0", normal operation should be restored. (Delete timer)
|
|
139
|
+
* → Wenn boostOn über die Eingabe "runningTime = 0" beendet wird, so soll zum Normalen ablauf wieder zurückgekehrt werden. (Löschen der Timer)
|
|
140
|
+
*
|
|
141
|
+
* @param sprinkleID
|
|
142
|
+
*/
|
|
143
|
+
function boostKill (sprinkleID) {
|
|
144
|
+
for(const entry of threadList) {
|
|
145
|
+
if (entry.enabled) {
|
|
146
|
+
if (entry.sprinkleID === sprinkleID) {
|
|
147
|
+
/* booster wird gekillt */
|
|
148
|
+
boostOn = false;
|
|
149
|
+
if(entry.times.boostTime2) {
|
|
150
|
+
clearTimeout(entry.times.boostTime2);
|
|
151
|
+
entry.times.boostTime2 = null;
|
|
152
|
+
}
|
|
153
|
+
} else {
|
|
154
|
+
/* normaler weiterbetrieb für den Rest */
|
|
155
|
+
if (entry.times.boostTime1) {
|
|
156
|
+
clearTimeout(entry.times.boostTime1);
|
|
157
|
+
entry.times.boostTime1 = null;
|
|
158
|
+
adapter.log.debug(`boostKill => ID: ${entry.sprinkleName} => boostTime2 (Ende) gelöscht)`);
|
|
159
|
+
}
|
|
160
|
+
if (entry.times.boostTime2) {
|
|
161
|
+
clearTimeout(entry.times.boostTime2);
|
|
162
|
+
entry.times.boostTime2 = null;
|
|
163
|
+
/* Zustand des Ventils im Thread < 0 > off, < 1 > wait, <<< 2 >>> on, < 3 > break, < 4 > Boost(on), < 5 > off(Boost) */
|
|
164
|
+
adapter.setState(`sprinkle.${entry.sprinkleName}.sprinklerState`, {
|
|
165
|
+
val: 2,
|
|
166
|
+
ack: true
|
|
167
|
+
});
|
|
168
|
+
// valveOnOff(entry, true, '#2.3 Set: on, ID: ');
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
} // End boostKill
|
|
174
|
+
|
|
175
|
+
/*----------------------------------------------------------------------------------------------------------------------------------------------*/
|
|
176
|
+
|
|
177
|
+
/**
|
|
178
|
+
* Schaltintervall der Ventile, Schaltabstand ist in der Config hinterlegt
|
|
179
|
+
*/
|
|
180
|
+
const valveDelay = () => {
|
|
181
|
+
return new Promise (
|
|
182
|
+
resolve => setTimeout (resolve, parseInt(adapter.config.switchingDistance))
|
|
183
|
+
);
|
|
184
|
+
};
|
|
185
|
+
/**
|
|
186
|
+
* Ausschalten der Ventile mit Schaltabstand
|
|
187
|
+
*
|
|
188
|
+
* @param threadList Auflistung aller aktiver Sprenger-Kreise
|
|
189
|
+
* @param parallel aktuelle Anzahl der eingeschalteten Ventile
|
|
190
|
+
* @returns
|
|
191
|
+
*/
|
|
192
|
+
const switchTheValvesOffOn = async (threadList, parallel) => {
|
|
193
|
+
/**Sammlung von.sprinkleName die am Ende von updateList gelöscht werden
|
|
194
|
+
* @type {array} - killList
|
|
195
|
+
*/
|
|
196
|
+
const killList = [];
|
|
197
|
+
for (const entry of threadList) { // ausschalten der Ventile
|
|
198
|
+
if ((!entry.enabled // Ventile ausgeschaltet z.B. Intervall-Beregnung
|
|
199
|
+
|| entry.enabled && entry.myBreak // || in Pause z.B. Boost
|
|
200
|
+
|| entry.killSprinkle) // || Bewässerung erledigt
|
|
201
|
+
&& entry.enabled !== entry.enabledState // && Ventil nicht aktuell
|
|
202
|
+
) {
|
|
203
|
+
adapter.setForeignState(entry.idState, {
|
|
204
|
+
val: false,
|
|
205
|
+
ack: false
|
|
206
|
+
}, (err) => {
|
|
207
|
+
if (err) {
|
|
208
|
+
return err;
|
|
209
|
+
} else {
|
|
210
|
+
adapter.log.info(`Set (${myConfig.config[entry.sprinkleID].methodControlSM}) ID: ${entry.sprinkleName}, value: ${entry.enabled}`);
|
|
211
|
+
}
|
|
212
|
+
});
|
|
213
|
+
entry.enabledState = entry.enabled;
|
|
214
|
+
/* Ventil aus threadList löschen → Aufgabe beendet und sind nicht in der Pause */
|
|
215
|
+
if (entry.killSprinkle) {
|
|
216
|
+
killList.push(entry.sprinkleName);
|
|
217
|
+
}
|
|
218
|
+
await valveDelay ();
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
if (currentPumpUse.pumpName !== '') {
|
|
222
|
+
setPumpOnOff(parallel > 0);
|
|
223
|
+
await valveDelay ();
|
|
224
|
+
}
|
|
225
|
+
if (adapter.config.triggerControlVoltage) {
|
|
226
|
+
setVoltageOnOff(parallel>0);
|
|
227
|
+
await valveDelay ();
|
|
228
|
+
}
|
|
229
|
+
|
|
230
|
+
|
|
231
|
+
for (const entry of threadList) { // einschalten der Ventile
|
|
232
|
+
if (entry.enabled // intern eingeschaltet
|
|
233
|
+
&& !entry.myBreak // && keine Pause
|
|
234
|
+
&& !entry.killSprinkle // Bewässerung noch nicht erledigt
|
|
235
|
+
&& entry.enabled !== entry.enabledState // && Ventil nicht aktuell
|
|
236
|
+
) {
|
|
237
|
+
adapter.setForeignState(entry.idState, {
|
|
238
|
+
val: true,
|
|
239
|
+
ack: false
|
|
240
|
+
}, (err) => {
|
|
241
|
+
if (err) {
|
|
242
|
+
return err;
|
|
243
|
+
} else {
|
|
244
|
+
adapter.log.info(`Set Valve (${myConfig.config[entry.sprinkleID].methodControlSM}) ID: ${entry.sprinkleName}, value: ${entry.enabled}, duration: ${addTime(entry.wateringTime)}`);
|
|
245
|
+
}
|
|
246
|
+
});
|
|
247
|
+
entry.enabledState = entry.enabled;
|
|
248
|
+
await valveDelay ();
|
|
249
|
+
}
|
|
250
|
+
}
|
|
251
|
+
|
|
252
|
+
delList(killList); // erledigte Bewässerungsaufgaben aus der threadList löschen
|
|
253
|
+
};
|
|
254
|
+
|
|
255
|
+
/*----------------------------------------------------------------------------------------------------------------------------------------------*/
|
|
256
|
+
|
|
257
|
+
/**
|
|
258
|
+
* Control of the active irrigation circuits so that the maximum pump capacity (l / h) is achieved and the maximum number of irrigation circuits is not exceeded.
|
|
259
|
+
* => Steuerung der aktiven Bewässerungskreise, damit die maximale Pumpenkapazität (l / h) erreicht wird und die maximale Anzahl der Bewässerungskreise nicht überschritten wird.
|
|
260
|
+
*/
|
|
261
|
+
function updateList () {
|
|
262
|
+
/* während des Boost eines Kreises ist ein zuschalten von Sprengern nicht möglich */
|
|
263
|
+
if (boostOn) {
|
|
264
|
+
return;
|
|
265
|
+
}
|
|
266
|
+
|
|
267
|
+
/** aktuelle Rest-Pumpenleistung */
|
|
268
|
+
let curFlow = currentPumpUse.pumpPower, /* adapter.config.triggerMainPumpPower; */
|
|
269
|
+
/** aktuelle Anzahl der eingeschalteten Ventile */
|
|
270
|
+
parallel = 0;
|
|
271
|
+
|
|
272
|
+
/**
|
|
273
|
+
* Sortierfunktion mySortDescending absteigende Sortierung
|
|
274
|
+
*
|
|
275
|
+
* @param a
|
|
276
|
+
* @param b
|
|
277
|
+
* @returns
|
|
278
|
+
*/
|
|
279
|
+
function mySortDescending(a, b) {
|
|
280
|
+
return (a.pipeFlow > b.pipeFlow) ? -1 :
|
|
281
|
+
(a.pipeFlow < b.pipeFlow) ? 1 :
|
|
282
|
+
0;
|
|
283
|
+
}
|
|
284
|
+
/**
|
|
285
|
+
* Sortierfunktion mySortAscending aufsteigende Sortierung
|
|
286
|
+
*
|
|
287
|
+
* @param a
|
|
288
|
+
* @param b
|
|
289
|
+
* @returns
|
|
290
|
+
*/
|
|
291
|
+
function mySortAscending(a, b) {
|
|
292
|
+
return (a.pipeFlow < b.pipeFlow) ? -1 :
|
|
293
|
+
(a.pipeFlow > b.pipeFlow) ? 1 :
|
|
294
|
+
0;
|
|
295
|
+
}
|
|
296
|
+
/**
|
|
297
|
+
* Handling von Ventilen, Zeiten, Verbrauchsmengen im 1s Takt
|
|
298
|
+
*
|
|
299
|
+
* @param entry
|
|
300
|
+
*/
|
|
301
|
+
function countSprinkleTime(entry) {
|
|
302
|
+
/* --- function beenden wenn ---*/
|
|
303
|
+
if (boostOn && !(myConfig.config[entry.sprinkleID].booster) // boost-On && kein aktuelles Boost-Ventil
|
|
304
|
+
) {
|
|
305
|
+
return;
|
|
306
|
+
}
|
|
307
|
+
entry.count ++;
|
|
308
|
+
if ((entry.count < entry.wateringTime) // Zeit noch nicht abgelaufen?
|
|
309
|
+
&& (!entry.calcOn // alles ausser Berechnung der Verdunstung
|
|
310
|
+
|| !entry.autoOn // Handbetrieb
|
|
311
|
+
|| (myConfig.config[entry.sprinkleID].soilMoisture.val < myConfig.config[entry.sprinkleID].soilMoisture.maxIrrigation)) // Bodenfeuchte noch nicht erreicht? (z.B. beim Regen)
|
|
312
|
+
) { /* Zeit läuft */
|
|
313
|
+
adapter.setState(`sprinkle.${entry.sprinkleName}.countdown`, {
|
|
314
|
+
val: addTime(entry.wateringTime - entry.count),
|
|
315
|
+
ack: true
|
|
316
|
+
});
|
|
317
|
+
/* Alle 15s die Bodenfeuchte anpassen */
|
|
318
|
+
if (entry.calcOn // Vergleich nur bei Berechnung der Verdunstung
|
|
319
|
+
&& !(entry.count % 15) // alle 15s ausführen
|
|
320
|
+
) {
|
|
321
|
+
myConfig.addSoilMoistVal(entry.sprinkleID, entry.soilMoisture15s);
|
|
322
|
+
}
|
|
323
|
+
/* Intervall-Beregnung wenn angegeben (onOffTime > 0) */
|
|
324
|
+
if ((entry.onOffTime > 0) && !(entry.count % entry.onOffTime)) {
|
|
325
|
+
adapter.log.info(`Intervall-Beregnung, onOffTime: ${entry.onOffTime}, count: ${entry.count}`);
|
|
326
|
+
entry.enabled = false;
|
|
327
|
+
entry.myBreak = true;
|
|
328
|
+
/* Zustand des Ventils im Thread < 0 > off, < 1 > wait, < 2 > on, <<< 3 >>> break, < 4 > Boost(on), < 5 > off(Boost) */
|
|
329
|
+
adapter.setState(`sprinkle.${entry.sprinkleName}.sprinklerState`, {
|
|
330
|
+
val: 3,
|
|
331
|
+
ack: true
|
|
332
|
+
});
|
|
333
|
+
updateList();
|
|
334
|
+
clearInterval(entry.countdown);
|
|
335
|
+
entry.onOffTimeoutOff = setTimeout(()=>{
|
|
336
|
+
entry.myBreak = false;
|
|
337
|
+
/* Zustand des Ventils im Thread < 0 > off, <<< 1 >>> wait, < 2 > on, < 3 > break, < 4 > Boost(on), < 5 > off(Boost) */
|
|
338
|
+
adapter.setState(`sprinkle.${entry.sprinkleName}.sprinklerState`, {
|
|
339
|
+
val: 1,
|
|
340
|
+
ack: true
|
|
341
|
+
});
|
|
342
|
+
updateList();
|
|
343
|
+
},1000 * (entry.onOffTime < 600 ? 600 : entry.onOffTime)); // 600 sek Pause (10 min)
|
|
344
|
+
}
|
|
345
|
+
} else { /* zeit abgelaufen => Ventil ausschalten */
|
|
346
|
+
/* Zustand des Ventils im Thread <<< 0 >>> off, < 1 > wait, < 2 > on, < 3 > break, < 4 > Boost(on), < 5 > off(Boost) */
|
|
347
|
+
entry.enabled = false;
|
|
348
|
+
adapter.setState(`sprinkle.${entry.sprinkleName}.sprinklerState`, {
|
|
349
|
+
val: 0,
|
|
350
|
+
ack: true
|
|
351
|
+
});
|
|
352
|
+
adapter.setState(`sprinkle.${entry.sprinkleName}.runningTime`, {
|
|
353
|
+
val: '0',
|
|
354
|
+
ack: true
|
|
355
|
+
});
|
|
356
|
+
adapter.setState(`sprinkle.${entry.sprinkleName}.countdown`, {
|
|
357
|
+
val: '0',
|
|
358
|
+
ack: true
|
|
359
|
+
});
|
|
360
|
+
|
|
361
|
+
/* Wenn in der Konfiguration Bodenfeuchte = 100% gesetzt ist und Auto-Bewässerung aktive, dann Bodenfeuchte = 100% setzen*/
|
|
362
|
+
if (entry.autoOn && entry.calcOn && myConfig.config[entry.sprinkleID].endIrrigation) {
|
|
363
|
+
myConfig.setSoilMoistPct100(entry.sprinkleID);
|
|
364
|
+
}
|
|
365
|
+
/* Verbrauchswerte in der Historie aktualisieren */
|
|
366
|
+
addConsumedAndTime(entry);
|
|
367
|
+
/* Booster zurücksetzen */
|
|
368
|
+
if (myConfig.config[entry.sprinkleID].booster) {
|
|
369
|
+
if (boostOn) {
|
|
370
|
+
boostKill(entry.sprinkleID);
|
|
371
|
+
}
|
|
372
|
+
boostReady = true;
|
|
373
|
+
adapter.log.debug(`ID: ${entry.sprinkleName} UpdateList Sprinkle Off: boostReady = ${boostReady}`);
|
|
374
|
+
}
|
|
375
|
+
/* Zeiten löschen */
|
|
376
|
+
clearInterval(entry.countdown);
|
|
377
|
+
/*clearTimeout(entry.onOffTimeoutOn);*/
|
|
378
|
+
clearTimeout(entry.onOffTimeoutOff);
|
|
379
|
+
/* Ventil aus threadList löschen → Aufgabe beendet */
|
|
380
|
+
//delList(entry.sprinkleName);
|
|
381
|
+
entry.killSprinkle = true;
|
|
382
|
+
updateList();
|
|
383
|
+
}
|
|
384
|
+
}
|
|
385
|
+
|
|
386
|
+
// ermitteln von curPipe und der anzahl der parallelen Stränge
|
|
387
|
+
for(const entry of threadList){
|
|
388
|
+
if (entry.enabled && !entry.killSprinkle) {
|
|
389
|
+
curFlow -= entry.pipeFlow; // // ermitteln der RestFörderkapazität
|
|
390
|
+
parallel ++; // Anzahl der Bewässerungsstellen um 1 erhöhen
|
|
391
|
+
}
|
|
392
|
+
}
|
|
393
|
+
|
|
394
|
+
if (curFlow < 0) {
|
|
395
|
+
/* - wenn beim Umschalten der Pumpen die Förderleistung zu gering → Ventile deaktivieren - */
|
|
396
|
+
// aufsteigend sortieren nach der Verbrauchsmenge
|
|
397
|
+
threadList.sort(mySortAscending);
|
|
398
|
+
|
|
399
|
+
for(const entry of threadList) {
|
|
400
|
+
if (entry.enabled // eingeschaltet
|
|
401
|
+
&& !entry.killSprinkle // && Aufgabe noch nicht erledigt
|
|
402
|
+
&& (curFlow < 0) // && Förderleistung der Pumpe zu gering
|
|
403
|
+
) {
|
|
404
|
+
entry.enabled = false; // ausgeschaltet merken
|
|
405
|
+
clearInterval(entry.countdown); // Zähler für Countdown, Verbrauchsmengen, usw. löschen
|
|
406
|
+
curFlow += entry.pipeFlow; // ermitteln der RestFörderkapazität
|
|
407
|
+
parallel--; // Anzahl der Bewässerungsstellen um 1 verringern
|
|
408
|
+
/* Zustand des Ventils im Thread < 0 > off, <<< 1 >>> wait, < 2 > on, < 3 > break, < 4 > Boost(on), < 5 > off(Boost) */
|
|
409
|
+
adapter.setState(`sprinkle.${entry.sprinkleName}.sprinklerState`, {
|
|
410
|
+
val: 1,
|
|
411
|
+
ack: true
|
|
412
|
+
});
|
|
413
|
+
// valveOnOff(entry, false, '#2.6 Set: wait, ID: ');
|
|
414
|
+
adapter.log.info(`Set Valve ID: ${entry.sprinkleName} Pump delivery rate too low, wait! curFlow ${curFlow} parallel: ${parallel}`);
|
|
415
|
+
}
|
|
416
|
+
}
|
|
417
|
+
}
|
|
418
|
+
|
|
419
|
+
// absteigend sortieren nach der Verbrauchsmenge
|
|
420
|
+
threadList.sort(mySortDescending);
|
|
421
|
+
|
|
422
|
+
// einschalten der Bewässerungsventile nach Verbrauchsmenge und maximaler Anzahl
|
|
423
|
+
for(const entry of threadList) {
|
|
424
|
+
// adapter.log.info(`Ventile Ein: enabled: ${!entry.enabled} && killSprinkle: ${!entry.killSprinkle} && myBreak: ${!entry.myBreak} && Flow: ${(curFlow >= entry.pipeFlow)} && ||: ${(parallel < maxParallel)} && noBoost: ${((boostReady) || !(myConfig.config[entry.sprinkleID].booster))}`);
|
|
425
|
+
if (!entry.enabled // ausgeschaltet
|
|
426
|
+
&& !entry.killSprinkle // && Aufgabe noch nicht erledigt
|
|
427
|
+
&& !entry.myBreak // && nicht in der Pause
|
|
428
|
+
&& (curFlow >= entry.pipeFlow) // && noch genügend Förderleistung der Pumpe
|
|
429
|
+
&& (parallel < maxParallel) // && maxParallel noch nicht erreicht
|
|
430
|
+
&& ((boostReady) || !(myConfig.config[entry.sprinkleID].booster)) // nur einer mit boostFunction darf aktive sein
|
|
431
|
+
) {
|
|
432
|
+
entry.enabled = true; // einschalten merken
|
|
433
|
+
if (myConfig.config[entry.sprinkleID].booster) {
|
|
434
|
+
boostReady = false;
|
|
435
|
+
adapter.log.debug(`ID: ${entry.sprinkleName}UpdateList sprinkle On: boostReady = ${boostReady}`);
|
|
436
|
+
setTimeout(() => {
|
|
437
|
+
boostList(entry.sprinkleID);
|
|
438
|
+
}, 50);
|
|
439
|
+
}
|
|
440
|
+
curFlow -= entry.pipeFlow; // ermitteln der RestFörderkapazität
|
|
441
|
+
parallel++; // Anzahl der Bewässerungsstellen um 1 erhöhen
|
|
442
|
+
/* Zustand des Ventils im Thread < 0 > off, < 1 > wait, <<< 2 >>> on, < 3 > break, < 4 > Boost(on), < 5 > off(Boost) */
|
|
443
|
+
adapter.setState(`sprinkle.${entry.sprinkleName}.sprinklerState`, {
|
|
444
|
+
val: 2,
|
|
445
|
+
ack: true
|
|
446
|
+
});
|
|
447
|
+
// valveOnOff(entry, true, '#2.7 Set: on, ID: ');
|
|
448
|
+
/* countdown starten */
|
|
449
|
+
if (!entry.startTime) {
|
|
450
|
+
entry.startTime = new Date();
|
|
451
|
+
}
|
|
452
|
+
entry.countdown = setInterval(() => {
|
|
453
|
+
countSprinkleTime(entry);
|
|
454
|
+
}, 1000); // 1000 = 1s
|
|
455
|
+
|
|
456
|
+
}
|
|
457
|
+
}
|
|
458
|
+
|
|
459
|
+
adapter.setState('control.parallelOfMax', {
|
|
460
|
+
val: `${parallel} : ${maxParallel}`,
|
|
461
|
+
ack: true
|
|
462
|
+
});
|
|
463
|
+
adapter.setState('control.restFlow', {
|
|
464
|
+
val: `${curFlow} (${currentPumpUse.pumpPower} ${currentPumpUse.pumpCistern ? 'Zisterne' : 'Grundwasser'})`,
|
|
465
|
+
ack: true
|
|
466
|
+
});
|
|
467
|
+
|
|
468
|
+
switchTheValvesOffOn(threadList, parallel).then(err => {
|
|
469
|
+
if (err) {
|
|
470
|
+
adapter.log.error(`Error - Set (false) err: ${err}`);
|
|
471
|
+
sendMessageText.sendMessage(`Error - Set (fase) err: ${err}`);
|
|
472
|
+
}
|
|
473
|
+
});
|
|
474
|
+
} // End updateList
|
|
475
|
+
|
|
476
|
+
/* --------------------------------------------------------------------------------------------------------------------------------------------------------------------- */
|
|
477
|
+
|
|
478
|
+
/**
|
|
479
|
+
* +++++ Set the current pump for irrigation +++++
|
|
480
|
+
* → Festlegen der aktuellen Pumpe zur Bewässerung
|
|
481
|
+
*/
|
|
482
|
+
function setActualPump () {
|
|
483
|
+
if (adapter.config.cisternSettings === true) {
|
|
484
|
+
/* Zisternen-Bewässerung Einstellung in der config (2. Pumpe) aktiviert */
|
|
485
|
+
if (currentPumpUse.enable === true) {
|
|
486
|
+
/* Bewässerungspumpen aktiv */
|
|
487
|
+
if ((fillLevelCistern < parseFloat(adapter.config.triggerMinCisternLevel)) && (currentPumpUse.pumpCistern === true)) {
|
|
488
|
+
/* (Zisterne unter Minimum) && (ZisternenPumpe läuft) */
|
|
489
|
+
adapter.setForeignState(currentPumpUse.pumpName, {
|
|
490
|
+
val: false,
|
|
491
|
+
ack: false
|
|
492
|
+
}); // Pumpe Zisterne Aus
|
|
493
|
+
if (currentPumpUse.pumpCistern === true && !sendMessageText.onlySendError()) {
|
|
494
|
+
sendMessageText.sendMessage(`Pump change (cistern empty) Cistern pump off => main pump on`);
|
|
495
|
+
}
|
|
496
|
+
currentPumpUse.pumpCistern = false;
|
|
497
|
+
currentPumpUse.pumpName = adapter.config.triggerMainPump || '';
|
|
498
|
+
currentPumpUse.pumpPower = parseInt(adapter.config.triggerMainPumpPower);
|
|
499
|
+
adapter.setForeignState(currentPumpUse.pumpName, {
|
|
500
|
+
val: true,
|
|
501
|
+
ack: false
|
|
502
|
+
}); // Hauptpumpe Ein
|
|
503
|
+
adapter.log.info('Pump change (cistern empty) Cistern pump off => main pump on');
|
|
504
|
+
updateList(); // Wasserverbrauch an Pumpenleistung anpassen
|
|
505
|
+
}
|
|
506
|
+
if (fillLevelCistern < parseFloat(adapter.config.triggerMinCisternLevel)) {
|
|
507
|
+
statusCistern = `Cistern empty: ${fillLevelCistern} % (${adapter.config.triggerMinCisternLevel + 5} %)`;
|
|
508
|
+
adapter.setState('info.cisternState', {
|
|
509
|
+
val: statusCistern,
|
|
510
|
+
ack: true
|
|
511
|
+
});
|
|
512
|
+
} else {
|
|
513
|
+
statusCistern = `Cistern filled: ${fillLevelCistern} % (${adapter.config.triggerMinCisternLevel} %)`;
|
|
514
|
+
adapter.setState('info.cisternState', {
|
|
515
|
+
val: statusCistern,
|
|
516
|
+
ack: true
|
|
517
|
+
});
|
|
518
|
+
}
|
|
519
|
+
} else {
|
|
520
|
+
/* Bewässerungspumpen inaktiv */
|
|
521
|
+
if ((fillLevelCistern >= (parseFloat(adapter.config.triggerMinCisternLevel) + 5)) && (adapter.config.triggerCisternPump) && (adapter.config.triggerCisternPumpPower)) {
|
|
522
|
+
/* Zisterne voll && triggerCisternPump && triggerCisternPumpPower vorhanden*/
|
|
523
|
+
statusCistern = `Cistern filled: ${fillLevelCistern} % (${adapter.config.triggerMinCisternLevel} %)`;
|
|
524
|
+
adapter.setState('info.cisternState', {
|
|
525
|
+
val: statusCistern,
|
|
526
|
+
ack: true
|
|
527
|
+
});
|
|
528
|
+
if (currentPumpUse.pumpCistern === false && !sendMessageText.onlySendError()) {
|
|
529
|
+
sendMessageText.sendMessage(`Cistern filled: ${fillLevelCistern} % (${adapter.config.triggerMinCisternLevel} %)`);
|
|
530
|
+
}
|
|
531
|
+
currentPumpUse.pumpCistern = true;
|
|
532
|
+
currentPumpUse.pumpName = adapter.config.triggerCisternPump || '';
|
|
533
|
+
currentPumpUse.pumpPower = parseInt(adapter.config.triggerCisternPumpPower);
|
|
534
|
+
adapter.setState('control.restFlow', {
|
|
535
|
+
val: `${currentPumpUse.pumpPower} (${currentPumpUse.pumpPower} Zisterne)`,
|
|
536
|
+
ack: true
|
|
537
|
+
});
|
|
538
|
+
} else {
|
|
539
|
+
statusCistern = `Cistern empty: ${fillLevelCistern} % (${adapter.config.triggerMinCisternLevel + 5} %)`;
|
|
540
|
+
adapter.setState('info.cisternState', {
|
|
541
|
+
val: statusCistern,
|
|
542
|
+
ack: true
|
|
543
|
+
});
|
|
544
|
+
currentPumpUse.pumpCistern = false;
|
|
545
|
+
currentPumpUse.pumpName = adapter.config.triggerMainPump || '';
|
|
546
|
+
currentPumpUse.pumpPower = parseInt(adapter.config.triggerMainPumpPower);
|
|
547
|
+
adapter.setState('control.restFlow', {
|
|
548
|
+
val: `${currentPumpUse.pumpPower} (${currentPumpUse.pumpPower} Grundwasser)`,
|
|
549
|
+
ack: true
|
|
550
|
+
});
|
|
551
|
+
}
|
|
552
|
+
}
|
|
553
|
+
} else {
|
|
554
|
+
/* Pumpe AUS => Zisternen-Bewässerung nicht aktiviert */
|
|
555
|
+
if (adapter.config.triggerCisternPump) {
|
|
556
|
+
statusCistern = `Cistern settings are not active!${(fillLevelCistern > 0)?(` level sensor: ${fillLevelCistern}%${(adapter.config.triggerMinCisternLevel !== '')?(`${adapter.config.triggerMinCisternLevel}%`):('')}`):('')}`;
|
|
557
|
+
adapter.setState('info.cisternState', {
|
|
558
|
+
val: statusCistern,
|
|
559
|
+
ack: true
|
|
560
|
+
});
|
|
561
|
+
}
|
|
562
|
+
}
|
|
563
|
+
} // End setActualPump
|
|
564
|
+
|
|
565
|
+
/**
|
|
566
|
+
* Switching the pump on or off
|
|
567
|
+
* => Ein bzw. ausschaltern der Pumpe
|
|
568
|
+
*
|
|
569
|
+
* @param pumpOnOff ; Pumpe on = true
|
|
570
|
+
*/
|
|
571
|
+
function setPumpOnOff(pumpOnOff) {
|
|
572
|
+
if (currentPumpUse.pumpName !== '') {
|
|
573
|
+
adapter.getForeignState(currentPumpUse.pumpName, (err, state) => {
|
|
574
|
+
if (state) {
|
|
575
|
+
if (pumpOnOff) {
|
|
576
|
+
if (state.val === false) {
|
|
577
|
+
adapter.setForeignState(currentPumpUse.pumpName, {
|
|
578
|
+
val: true,
|
|
579
|
+
ack: false
|
|
580
|
+
});
|
|
581
|
+
currentPumpUse.enable = true;
|
|
582
|
+
adapter.log.info('Set (pump) on');
|
|
583
|
+
}
|
|
584
|
+
} else {
|
|
585
|
+
if (state.val !== false) {
|
|
586
|
+
adapter.setForeignState(currentPumpUse.pumpName, {
|
|
587
|
+
val: false,
|
|
588
|
+
ack: false
|
|
589
|
+
});
|
|
590
|
+
currentPumpUse.enable = false;
|
|
591
|
+
adapter.log.info('Set (pump) off');
|
|
592
|
+
}
|
|
593
|
+
}
|
|
594
|
+
} else if (err) {
|
|
595
|
+
adapter.log.error(`triggerMainPump ${currentPumpUse.pumpName} is not available (ist nicht erreichbar): ${err}`);
|
|
596
|
+
}
|
|
597
|
+
});
|
|
598
|
+
}
|
|
599
|
+
} // End setPumpOnOff
|
|
600
|
+
|
|
601
|
+
/**
|
|
602
|
+
* Switching the control voltage on or off
|
|
603
|
+
* => Ein bzw. ausschaltern der Steuerspannung
|
|
604
|
+
*
|
|
605
|
+
* @param voltageOnOff - Voltage on = true
|
|
606
|
+
*/
|
|
607
|
+
function setVoltageOnOff(voltageOnOff) {
|
|
608
|
+
if (adapter.config.triggerControlVoltage !== '') {
|
|
609
|
+
adapter.getForeignState(adapter.config.triggerControlVoltage, (err, state) => {
|
|
610
|
+
if (state) {
|
|
611
|
+
if (voltageOnOff) {
|
|
612
|
+
if (state.val === false) {
|
|
613
|
+
adapter.setForeignState(adapter.config.triggerControlVoltage, {
|
|
614
|
+
val: true,
|
|
615
|
+
ack: false
|
|
616
|
+
});
|
|
617
|
+
adapter.log.info('Set (voltage) on');
|
|
618
|
+
}
|
|
619
|
+
} else {
|
|
620
|
+
if (state.val !== false) {
|
|
621
|
+
adapter.setForeignState(adapter.config.triggerControlVoltage, {
|
|
622
|
+
val: false,
|
|
623
|
+
ack: false
|
|
624
|
+
});
|
|
625
|
+
adapter.log.info('Set (voltage) off');
|
|
626
|
+
}
|
|
627
|
+
}
|
|
628
|
+
} else if (err) {
|
|
629
|
+
adapter.log.error(`triggerControlVoltage is not available (ist nicht erreichbar): ${err}`);
|
|
630
|
+
}
|
|
631
|
+
});
|
|
632
|
+
}
|
|
633
|
+
}
|
|
634
|
+
|
|
635
|
+
/**
|
|
636
|
+
* Adding the consumption data to the history
|
|
637
|
+
* => Hinzufügen der Verbrauchsdaten zur History
|
|
638
|
+
*
|
|
639
|
+
* @param entry - array mit den Daten des aktiven Ventils
|
|
640
|
+
*/
|
|
641
|
+
function addConsumedAndTime(entry) {
|
|
642
|
+
adapter.setState(`sprinkle.${entry.sprinkleName}.history.lastConsumed`, {
|
|
643
|
+
val: Math.round(entry.litersPerSecond * entry.count),
|
|
644
|
+
ack: true
|
|
645
|
+
});
|
|
646
|
+
adapter.setState(`sprinkle.${entry.sprinkleName}.history.lastRunningTime`, {
|
|
647
|
+
val: addTime(entry.count),
|
|
648
|
+
ack: true
|
|
649
|
+
});
|
|
650
|
+
adapter.setState(`sprinkle.${entry.sprinkleName}.history.lastOn`, {
|
|
651
|
+
val: formatTime(adapter, entry.startTime, 'dd.mm. hh:mm'),
|
|
652
|
+
ack: true
|
|
653
|
+
});
|
|
654
|
+
adapter.getState(`sprinkle.${entry.sprinkleName}.history.curCalWeekConsumed`, (err, state) => {
|
|
655
|
+
if (state) {
|
|
656
|
+
adapter.setState(`sprinkle.${entry.sprinkleName}.history.curCalWeekConsumed`, {
|
|
657
|
+
val: (state.val) + Math.round(entry.litersPerSecond * entry.count),
|
|
658
|
+
ack: true
|
|
659
|
+
});
|
|
660
|
+
}
|
|
661
|
+
});
|
|
662
|
+
adapter.getState(`sprinkle.${entry.sprinkleName}.history.curCalWeekRunningTime`, (err, state) => {
|
|
663
|
+
if (state) {
|
|
664
|
+
adapter.setState(`sprinkle.${entry.sprinkleName}.history.curCalWeekRunningTime`, {
|
|
665
|
+
val: addTime(state.val, entry.count),
|
|
666
|
+
ack: true
|
|
667
|
+
});
|
|
668
|
+
}
|
|
669
|
+
});
|
|
670
|
+
} // End addConsumedAndTime
|
|
671
|
+
|
|
672
|
+
|
|
673
|
+
/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
|
|
674
|
+
/* externe Funktionen */
|
|
675
|
+
/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
|
|
676
|
+
|
|
677
|
+
/**
|
|
678
|
+
* -- externe Funktionen -> initValveControl - addList - clearEntireList - setFillLevelCistern --
|
|
679
|
+
*
|
|
680
|
+
*/
|
|
681
|
+
const valveControl = {
|
|
682
|
+
/**
|
|
683
|
+
* Initialize the start configuration of ventilControl
|
|
684
|
+
* => Initialisieren Sie die Startkonfiguration von ventilControl
|
|
685
|
+
*
|
|
686
|
+
* @param myAdapter
|
|
687
|
+
*/
|
|
688
|
+
initValveControl (myAdapter) {
|
|
689
|
+
adapter = myAdapter;
|
|
690
|
+
currentPumpUse.pumpCistern = false;
|
|
691
|
+
currentPumpUse.pumpName = adapter.config.triggerMainPump || '';
|
|
692
|
+
currentPumpUse.pumpPower = parseInt(adapter.config.triggerMainPumpPower) || 0;
|
|
693
|
+
maxParallel = parseInt(adapter.config.maximumParallelValves);
|
|
694
|
+
/* Objekt control.restFlow befüllen */
|
|
695
|
+
adapter.setState('control.restFlow', {
|
|
696
|
+
val: `${currentPumpUse.pumpPower} (${currentPumpUse.pumpPower} ${currentPumpUse.pumpCistern ? 'Zisterne' : 'Grundwasser'})`,
|
|
697
|
+
ack: true
|
|
698
|
+
});
|
|
699
|
+
/* Objekt control.parallelOfMax befüllen */
|
|
700
|
+
adapter.setState('control.parallelOfMax', {
|
|
701
|
+
val: `0 : ${adapter.config.maximumParallelValves}`,
|
|
702
|
+
ack: true
|
|
703
|
+
});
|
|
704
|
+
/* 24V ausschalter, wenn vorhanden */
|
|
705
|
+
if (adapter.config.triggerControlVoltage !== '') {
|
|
706
|
+
adapter.getForeignState('adapter.config.triggerControlVoltage', (err, state) => {
|
|
707
|
+
if (state && state.val === true) {
|
|
708
|
+
adapter.setForeignState(adapter.config.triggerControlVoltage, {
|
|
709
|
+
val: false,
|
|
710
|
+
ack: false
|
|
711
|
+
});
|
|
712
|
+
}
|
|
713
|
+
});
|
|
714
|
+
}
|
|
715
|
+
/* Pumpe ausschalter, wenn vorhanden */
|
|
716
|
+
if (adapter.config.triggerMainPump !== '') {
|
|
717
|
+
adapter.getForeignState('adapter.config.triggerMainPump', (err, state) => {
|
|
718
|
+
if (state && state.val === true) {
|
|
719
|
+
adapter.setForeignState(adapter.config.triggerMainPump, {
|
|
720
|
+
val: false,
|
|
721
|
+
ack: false
|
|
722
|
+
});
|
|
723
|
+
}
|
|
724
|
+
});
|
|
725
|
+
}
|
|
726
|
+
/* Pumpe (Zisterne) ausschalter, wenn vorhanden */
|
|
727
|
+
if (adapter.config.triggerCisternPump !== '') {
|
|
728
|
+
adapter.getForeignState('adapter.config.triggerCisternPump', (err, state) => {
|
|
729
|
+
if (state && state.val === true) {
|
|
730
|
+
adapter.setForeignState(adapter.config.triggerCisternPump, {
|
|
731
|
+
val: false,
|
|
732
|
+
ack: false
|
|
733
|
+
});
|
|
734
|
+
}
|
|
735
|
+
});
|
|
736
|
+
}
|
|
737
|
+
/* alle Ventile (.name = "hm-rpc.0.MEQ1234567.3.STATE") in einem definierten Zustand (false) versetzen*/
|
|
738
|
+
const result = adapter.config.events;
|
|
739
|
+
if (result) {
|
|
740
|
+
for (const res of result) {
|
|
741
|
+
adapter.getForeignState(res.name, (err, state) => {
|
|
742
|
+
if (state && state.val === true) {
|
|
743
|
+
adapter.setForeignState(res.name, {
|
|
744
|
+
val: false,
|
|
745
|
+
ack: false
|
|
746
|
+
});
|
|
747
|
+
}
|
|
748
|
+
});
|
|
749
|
+
}
|
|
750
|
+
}
|
|
751
|
+
}, // End initValveControl
|
|
752
|
+
|
|
753
|
+
/**
|
|
754
|
+
* Add Sprinkle→ Sprinkle hinzufügen
|
|
755
|
+
*
|
|
756
|
+
* @param sprinkleList
|
|
757
|
+
* @param sprinkleList[].auto - auto → Automatik == (true), Handbetrieb == (false)
|
|
758
|
+
* @param sprinkleList[].sprinkleID - sprinkleID → zugriff auf myConfig.config[sprinkleID]. xyz
|
|
759
|
+
* @param sprinkleList[].wateringTime - wateringTime → Bewässerungszeit in min
|
|
760
|
+
*/
|
|
761
|
+
addList (sprinkleList) {
|
|
762
|
+
//
|
|
763
|
+
for (const res of sprinkleList) {
|
|
764
|
+
const sprinkleName = myConfig.config[res.sprinkleID].objectName;
|
|
765
|
+
/**
|
|
766
|
+
* add done
|
|
767
|
+
* → hinzufügen erledigt (Sprenger bereits aktive)
|
|
768
|
+
*/
|
|
769
|
+
let addDone = false;
|
|
770
|
+
// schauen ob der Sprenger schon in der threadList ist
|
|
771
|
+
if (threadList) {
|
|
772
|
+
for (const entry of threadList) {
|
|
773
|
+
if (entry.sprinkleID === res.sprinkleID) {
|
|
774
|
+
if (entry.wateringTime === res.wateringTime) {
|
|
775
|
+
// adapter.setState('sprinkle.' + sprinkleName + '.runningTime', {val: addTime(wateringTime, ''), ack: false});
|
|
776
|
+
return;
|
|
777
|
+
}
|
|
778
|
+
entry.wateringTime = res.wateringTime;
|
|
779
|
+
entry.autoOn = res.auto; // auto: = true autostart; = false Handbetrieb
|
|
780
|
+
adapter.setState(`sprinkle.${sprinkleName}.runningTime`, {
|
|
781
|
+
val: addTime(res.wateringTime),
|
|
782
|
+
ack: true
|
|
783
|
+
});
|
|
784
|
+
addDone = true; // Sprinkle found
|
|
785
|
+
adapter.log.debug(`update ID: ${entry.sprinkleName} new time: ${addTime(res.wateringTime)}`);
|
|
786
|
+
break;
|
|
787
|
+
}
|
|
788
|
+
}
|
|
789
|
+
}
|
|
790
|
+
|
|
791
|
+
if (!addDone) {
|
|
792
|
+
if (res.wateringTime <= 0) {
|
|
793
|
+
adapter.setState(`sprinkle.${sprinkleName}.runningTime`, {
|
|
794
|
+
val: '0',
|
|
795
|
+
ack: true
|
|
796
|
+
});
|
|
797
|
+
return;
|
|
798
|
+
}
|
|
799
|
+
|
|
800
|
+
let pipeFlow = myConfig.config[res.sprinkleID].pipeFlow;
|
|
801
|
+
|
|
802
|
+
// Kontrolle des Ventilverbrauchs(muss kleiner als Pumpenleistung sein, da Ventil sonst nicht starten kann)
|
|
803
|
+
if (adapter.config.cisternSettings === true) {
|
|
804
|
+
if ((pipeFlow > adapter.config.triggerMainPumpPower) || (pipeFlow > adapter.config.triggerCisternPumpPower)) {
|
|
805
|
+
if (pipeFlow > adapter.config.triggerMainPumpPower) adapter.log.warn(`Emergency irrigation! ${sprinkleName}: Valve consumption > pump performance (main pump)`);
|
|
806
|
+
if (pipeFlow > adapter.config.triggerCisternPumpPower) adapter.log.warn(`Emergency irrigation! ${sprinkleName}: Valve consumption > pump performance (cistern pump)`);
|
|
807
|
+
pipeFlow = (adapter.config.triggerMainPumpPower < adapter.config.triggerCisternPumpPower) ? adapter.config.triggerMainPumpPower : adapter.config.triggerCisternPumpPower;
|
|
808
|
+
}
|
|
809
|
+
} else {
|
|
810
|
+
if (pipeFlow > adapter.config.triggerMainPumpPower) {
|
|
811
|
+
adapter.log.warn(`Emergency irrigation! ${sprinkleName}: Valve consumption > pump performance (main pump)`);
|
|
812
|
+
pipeFlow = adapter.config.triggerMainPumpPower;
|
|
813
|
+
}
|
|
814
|
+
}
|
|
815
|
+
|
|
816
|
+
const newThread = {
|
|
817
|
+
sprinkleID: res.sprinkleID, // Array[0...]
|
|
818
|
+
sprinkleName: sprinkleName, // z.B "Blumenbeet"
|
|
819
|
+
idState: myConfig.config[res.sprinkleID].idState, // z.B. "hm-rpc.0.MEQ1810129.1.STATE"
|
|
820
|
+
wateringTime: res.wateringTime, // Bewässerungszeit in s (Sekunden)
|
|
821
|
+
pipeFlow: pipeFlow, // Wasserverbrauch in l/h
|
|
822
|
+
count: 0, // Zähler im Sekundentakt
|
|
823
|
+
calcOn: (myConfig.config[res.sprinkleID].methodControlSM === 'calculation'), // Anpassung der Bodenfeuchte true/false
|
|
824
|
+
enabled: false, // Ventil softwaremäßig ein
|
|
825
|
+
enabledState: false, // Ventil hardwaremäßig ein
|
|
826
|
+
myBreak: false, // meine Pause
|
|
827
|
+
killSprinkle: false, // Löschauftrag ausführen am Ende in threadList
|
|
828
|
+
litersPerSecond: pipeFlow / 3600, // Wasserverbrauchsmenge pro Sekunde
|
|
829
|
+
onOffTime: myConfig.config[res.sprinkleID].wateringInterval,
|
|
830
|
+
autoOn: res.auto,
|
|
831
|
+
soilMoisture15s: 15 * (myConfig.config[res.sprinkleID].soilMoisture.maxIrrigation - myConfig.config[res.sprinkleID].soilMoisture.triggersIrrigation)
|
|
832
|
+
/ (60 * myConfig.config[res.sprinkleID].wateringTime),
|
|
833
|
+
times: {
|
|
834
|
+
boostTime1: null, // boost start
|
|
835
|
+
boostTime2: null, // boost ende
|
|
836
|
+
}, // hinterlegen der verschiedenen Zeiten von timeout für gezieltes späteres löschen
|
|
837
|
+
id: threadList.length || 0,
|
|
838
|
+
};
|
|
839
|
+
threadList.push(newThread);
|
|
840
|
+
/* Zustand des Ventils im Thread < 0 > off, <<< 1 >>> wait, < 2 > on, < 3 > break, < 4 > Boost(on), < 5 > off(Boost) */
|
|
841
|
+
adapter.setState(`sprinkle.${sprinkleName}.sprinklerState`, {
|
|
842
|
+
val: 1,
|
|
843
|
+
ack: true
|
|
844
|
+
});
|
|
845
|
+
adapter.setState(`sprinkle.${sprinkleName}.runningTime`, {
|
|
846
|
+
val: addTime(res.wateringTime),
|
|
847
|
+
ack: true
|
|
848
|
+
});
|
|
849
|
+
adapter.log.debug(`ID: ${sprinkleName} new order created: ${JSON.stringify(threadList[newThread.id])}`);
|
|
850
|
+
}
|
|
851
|
+
}
|
|
852
|
+
updateList();
|
|
853
|
+
}, // End addList
|
|
854
|
+
|
|
855
|
+
/**
|
|
856
|
+
* switch off all devices, when close the adapter
|
|
857
|
+
* => Beim Beenden des adapters alles ausschalten
|
|
858
|
+
*/
|
|
859
|
+
clearEntireList () {
|
|
860
|
+
setVoltageOnOff(false);
|
|
861
|
+
setPumpOnOff(false);
|
|
862
|
+
if (boostListTimer) {
|
|
863
|
+
boostReady = true;
|
|
864
|
+
boostOn = false;
|
|
865
|
+
clearTimeout(boostListTimer);
|
|
866
|
+
}
|
|
867
|
+
// let bValveFound = false; // Ventil gefunden
|
|
868
|
+
for (let counter = threadList.length - 1; // Loop über das Array
|
|
869
|
+
counter >= 0;
|
|
870
|
+
counter--) {
|
|
871
|
+
const entry = threadList[counter];
|
|
872
|
+
if (entry.enabledState) {
|
|
873
|
+
adapter.log.info(`Set Valve (SprinkleControl: off) ID: ${entry.sprinkleName}, value: false`);
|
|
874
|
+
adapter.setForeignState(entry.idState, {
|
|
875
|
+
val: false,
|
|
876
|
+
ack: false
|
|
877
|
+
});
|
|
878
|
+
}
|
|
879
|
+
/* Zustand des Ventils im Thread <<< 0 >>> off, < 1 > wait, < 2 > on, < 3 > break, < 4 > Boost(on), < 5 > off(Boost) */
|
|
880
|
+
adapter.setState(`sprinkle.${entry.sprinkleName}.sprinklerState`, {
|
|
881
|
+
val: 0,
|
|
882
|
+
ack: true
|
|
883
|
+
});
|
|
884
|
+
adapter.setState(`sprinkle.${entry.sprinkleName}.runningTime`, {
|
|
885
|
+
val: '0',
|
|
886
|
+
ack: true
|
|
887
|
+
});
|
|
888
|
+
adapter.setState(`sprinkle.${entry.sprinkleName}.countdown`, {
|
|
889
|
+
val: '0',
|
|
890
|
+
ack: true
|
|
891
|
+
});
|
|
892
|
+
// valveOnOff(myEntry, false, '#2.0 Set: off, ID: ');
|
|
893
|
+
/* Verbrauchswerte in der Historie aktualisieren */
|
|
894
|
+
addConsumedAndTime(entry);
|
|
895
|
+
/* del timer countdown */
|
|
896
|
+
clearInterval(entry.countdown);
|
|
897
|
+
/* del timer onOffTimeoutOff */
|
|
898
|
+
clearTimeout(entry.onOffTimeoutOff);
|
|
899
|
+
/* del timer newThread.times.boostTime1 */
|
|
900
|
+
if (entry.times.boostTime1) {
|
|
901
|
+
clearTimeout(entry.times.boostTime1);
|
|
902
|
+
entry.times.boostTime1 = null;
|
|
903
|
+
}
|
|
904
|
+
/* del timer newThread.times.boostTime2 */
|
|
905
|
+
if (entry.times.boostTime2) {
|
|
906
|
+
clearTimeout(entry.times.boostTime2);
|
|
907
|
+
entry.times.boostTime2 = null;
|
|
908
|
+
}
|
|
909
|
+
adapter.log.debug(`order deleted Stop all ID: ${entry.sprinkleName} ( rest orders: ${threadList.length} )`);
|
|
910
|
+
threadList.pop(); // del last array
|
|
911
|
+
}
|
|
912
|
+
updateList();
|
|
913
|
+
}, // End clearEntireList
|
|
914
|
+
|
|
915
|
+
/**
|
|
916
|
+
* Änderungen des Füllstands setzen + Vorrang der Pumpe setzen
|
|
917
|
+
*
|
|
918
|
+
* @param levelCistern
|
|
919
|
+
*/
|
|
920
|
+
setFillLevelCistern (levelCistern) {
|
|
921
|
+
fillLevelCistern = (typeof levelCistern === 'number') ? levelCistern : 0;
|
|
922
|
+
setActualPump();
|
|
923
|
+
}, // End setFillLevelCistern
|
|
924
|
+
|
|
925
|
+
getStatusCistern () {
|
|
926
|
+
return statusCistern;
|
|
927
|
+
}
|
|
928
|
+
}; // End valveControl
|
|
929
|
+
|
|
930
|
+
/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
|
|
931
|
+
|
|
888
932
|
module.exports = valveControl;
|