iobroker.sprinklecontrol 0.2.13 → 0.2.14
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 +60 -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 +256 -189
- package/lib/adapter-config.d.ts +19 -16
- package/lib/evaporation.js +443 -412
- package/lib/myConfig.js +373 -359
- package/lib/sendMessageText.js +162 -199
- package/lib/tools.js +148 -125
- package/lib/valveControl.js +918 -887
- package/main.js +2041 -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/myConfig.js
CHANGED
|
@@ -1,360 +1,374 @@
|
|
|
1
|
-
'use strict';
|
|
2
|
-
|
|
3
|
-
/*
|
|
4
|
-
info: log aufbau myConfig.js: #1.*
|
|
5
|
-
*/
|
|
6
|
-
const {formatTime} = require(
|
|
7
|
-
const trend = require('./tools').trend; // tools => laden von Hilfsfunktionen
|
|
8
|
-
// const formatTime = require('./tools').formatTime; // tools => laden von Hilfsfunktionen
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
*
|
|
18
|
-
*
|
|
19
|
-
*
|
|
20
|
-
* @param {string} res.
|
|
21
|
-
* @param {string} res.
|
|
22
|
-
* @param {string} res.
|
|
23
|
-
* @param {
|
|
24
|
-
* @param {
|
|
25
|
-
* @param {
|
|
26
|
-
* @param {boolean} res.
|
|
27
|
-
* @param {boolean} res.
|
|
28
|
-
* @param {boolean} res.
|
|
29
|
-
* @param {boolean} res.
|
|
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
|
-
startFixDay[
|
|
83
|
-
startFixDay[
|
|
84
|
-
startFixDay[
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
startFixDay
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
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
|
-
const
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
* - 0(Sun); 1(Mon); 2(Tue); 3(Wed); 4(Thur); 5(Fri); 6(Sat)
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
* - threeRd = Start im 3 Tages Rhythmus,
|
|
159
|
-
* - twoNd = Start im 2 Tages Rhythmus
|
|
160
|
-
* - fixDay = Start an festen Tagen Sun-Sat
|
|
161
|
-
|
|
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
|
-
adapter.subscribeStates(newEntry.
|
|
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
|
-
* @param
|
|
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
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
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
|
-
if (myConfig.config[mySprinkleID].
|
|
335
|
-
myConfig.config[mySprinkleID].
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
};
|
|
359
|
-
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
/*
|
|
4
|
+
info: log aufbau myConfig.js: #1.*
|
|
5
|
+
*/
|
|
6
|
+
const {formatTime} = require('./tools');
|
|
7
|
+
const trend = require('./tools').trend; // tools => laden von Hilfsfunktionen
|
|
8
|
+
// const formatTime = require('./tools').formatTime; // tools => laden von Hilfsfunktionen
|
|
9
|
+
|
|
10
|
+
let adapter;
|
|
11
|
+
|
|
12
|
+
/**
|
|
13
|
+
* Ermittlung der Bewässerungsmethode und der dazugehörigen Parameter
|
|
14
|
+
* Sensorabfrage für Bodenfeuchte-Sensoren beantragen (subscribeStates)
|
|
15
|
+
*
|
|
16
|
+
* @param {object} res - Objekt mit den Ventildaten aus der Config
|
|
17
|
+
* @param {string} res.methodControlSM - methodControlSM [Auswahlfeld in der Config].
|
|
18
|
+
* @param {string} res.triggerSM - triggerSM [Bodenfeuchte-Sensor in der Config].
|
|
19
|
+
* @param {string} res.analogZPct - analog Zero Percent [Auswahlfeld in der Config des Sprinklers > Bodenfeuchte-Sensor > analog > Wert bei 0 %].
|
|
20
|
+
* @param {string} res.analogOHPct - analog One Hundert Percent [Auswahlfeld in der Config des Sprinklers > Bodenfeuchte-Sensor > analog > Wert bei 100 %].
|
|
21
|
+
* @param {string} res.maxSoilMoistureIrrigation - maximale Bodenfeuchte nach der Bewässerung [Auswahlfeld in der Config des Sprinklers].
|
|
22
|
+
* @param {string} res.startDay - Auswahl (threeRd = Start im 3-Tages-Rhythmus,twoNd = Start im 2-Tages-Rhythmus, fixDay = Start an festen Tagen Sun-Sat).
|
|
23
|
+
* @param {boolean} res.sun - Sontag, Sunday (Sun).
|
|
24
|
+
* @param {boolean} res.mon - Montag, Monday (Mon).
|
|
25
|
+
* @param {boolean} res.tue - Dienstag, Tuesday (Tue) (Tues).
|
|
26
|
+
* @param {boolean} res.wed - Mittwoch, Wednesday (Wed).
|
|
27
|
+
* @param {boolean} res.thur - Donnerstag, Thursday (Thur) (Thurs).
|
|
28
|
+
* @param {boolean} res.fri - Freitag, Friday (Fri).
|
|
29
|
+
* @param {boolean} res.sat - Samstag, Saturday (Sat).
|
|
30
|
+
* @returns {{setMetConSM: string, setPct: (number|null), setStartDay: (string|null), setStartFixDay: boolean[]|null, setAnalogZPct: (number|null), setAnalogOHPct: (number|null), setTrigSM: (string|null), setVal: (number|null), setBool: (boolean|null)}}
|
|
31
|
+
*/
|
|
32
|
+
|
|
33
|
+
function getMetConSM(res) {
|
|
34
|
+
|
|
35
|
+
if (res.methodControlSM === 'bistable') {
|
|
36
|
+
// bistable (Bodenfeuchte-Sensor)
|
|
37
|
+
adapter.subscribeForeignStates(res.triggerSM);
|
|
38
|
+
return {
|
|
39
|
+
setStartDay: null,
|
|
40
|
+
setStartFixDay: null,
|
|
41
|
+
setMetConSM: 'bistable',
|
|
42
|
+
setTrigSM: res.triggerSM,
|
|
43
|
+
setAnalogZPct: null,
|
|
44
|
+
setAnalogOHPct: null,
|
|
45
|
+
setPct: null,
|
|
46
|
+
setVal: null,
|
|
47
|
+
setBool: null
|
|
48
|
+
};
|
|
49
|
+
|
|
50
|
+
|
|
51
|
+
} else if (res.methodControlSM === 'analog') {
|
|
52
|
+
// analog (Bodenfeuchte-Sensor)
|
|
53
|
+
adapter.subscribeForeignStates(res.triggerSM);
|
|
54
|
+
return {
|
|
55
|
+
setStartDay: null,
|
|
56
|
+
setStartFixDay: null,
|
|
57
|
+
setMetConSM: 'analog',
|
|
58
|
+
setTrigSM: res.triggerSM,
|
|
59
|
+
setAnalogZPct: parseFloat(res.analogZPct),
|
|
60
|
+
setAnalogOHPct: parseFloat(res.analogOHPct),
|
|
61
|
+
setPct: null,
|
|
62
|
+
setVal: null,
|
|
63
|
+
setBool: null
|
|
64
|
+
};
|
|
65
|
+
} else if (res.methodControlSM === 'fixDay') {
|
|
66
|
+
// start zur festen Zeit und Wochentag (ohne-Sensoren)
|
|
67
|
+
/**
|
|
68
|
+
* Wochentage an denen gestartet wird
|
|
69
|
+
*
|
|
70
|
+
*/
|
|
71
|
+
const startFixDay = [false, false, false, false, false, false, false]; // Sun, Mon, Tue, Wed, Thur, Fri, Sat
|
|
72
|
+
|
|
73
|
+
if(res.startDay === 'threeRd' || res.startDay === 'twoNd') {
|
|
74
|
+
//let today = formatTime(adapter,'', 'day');
|
|
75
|
+
//let nextStartDay = ((today + 1) > 6) ? 0 : (today + 1);
|
|
76
|
+
//startFixDay[nextStartDay] = true; // Start am nächsten Tag
|
|
77
|
+
} else if (res.startDay === 'fixDay') {
|
|
78
|
+
startFixDay[0] = res.sun;
|
|
79
|
+
startFixDay[1] = res.mon;
|
|
80
|
+
startFixDay[2] = res.tue;
|
|
81
|
+
startFixDay[3] = res.wed;
|
|
82
|
+
startFixDay[4] = res.thur;
|
|
83
|
+
startFixDay[5] = res.fri;
|
|
84
|
+
startFixDay[6] = res.sat;
|
|
85
|
+
}
|
|
86
|
+
return {
|
|
87
|
+
setStartDay: res.startDay,
|
|
88
|
+
setStartFixDay: startFixDay,
|
|
89
|
+
setMetConSM: 'fixDay',
|
|
90
|
+
setTrigSM: '',
|
|
91
|
+
setAnalogZPct: null,
|
|
92
|
+
setAnalogOHPct: null,
|
|
93
|
+
setPct: null,
|
|
94
|
+
setVal: null,
|
|
95
|
+
setBool: null
|
|
96
|
+
};
|
|
97
|
+
} else if (res.methodControlSM === 'calculation') {
|
|
98
|
+
// interne (Berechnung der Verdunstung)
|
|
99
|
+
return {
|
|
100
|
+
setStartDay: null,
|
|
101
|
+
setStartFixDay: null,
|
|
102
|
+
setMetConSM: 'calculation',
|
|
103
|
+
setTrigSM: '',
|
|
104
|
+
setAnalogZPct: null,
|
|
105
|
+
setAnalogOHPct: null,
|
|
106
|
+
setPct: 50,
|
|
107
|
+
setVal: parseFloat(res.maxSoilMoistureIrrigation) / 2,
|
|
108
|
+
setBool: null
|
|
109
|
+
};
|
|
110
|
+
} else {
|
|
111
|
+
// Notprogramm! In der SprinkleControl Konfiguration ist keine Bewässerungsart ausgewählt! Bitte anpassen.
|
|
112
|
+
adapter.log.warn('Emergency program! No irrigation type is selected in the SprinkleControl configuration! Please adjust.');
|
|
113
|
+
return {
|
|
114
|
+
setStartDay: 'twoNd',
|
|
115
|
+
setStartFixDay: [false, false, false, false, false, false, false], // Sun, Mon, Tue, Wed, Thur, Fri, Sat
|
|
116
|
+
setMetConSM: 'fixDay',
|
|
117
|
+
setTrigSM: '',
|
|
118
|
+
setAnalogZPct: null,
|
|
119
|
+
setAnalogOHPct: null,
|
|
120
|
+
setPct: null,
|
|
121
|
+
setVal: null,
|
|
122
|
+
setBool: null
|
|
123
|
+
};
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
const myConfig = {
|
|
128
|
+
|
|
129
|
+
config: [],
|
|
130
|
+
/**
|
|
131
|
+
*
|
|
132
|
+
* @param myAdapter - Kopie von Adapter main.js
|
|
133
|
+
*/
|
|
134
|
+
createConfig: (myAdapter) => {
|
|
135
|
+
adapter = myAdapter;
|
|
136
|
+
const result = adapter.config.events;
|
|
137
|
+
if (result) {
|
|
138
|
+
for (const res of result) {
|
|
139
|
+
/** Name des Bewässerungskreises */
|
|
140
|
+
let objectName = '';
|
|
141
|
+
if(res.sprinkleName !== '') {
|
|
142
|
+
objectName = res.sprinkleName.replace(/[.;, ]/g, '_');
|
|
143
|
+
} else if (res.sprinkleName === '') {
|
|
144
|
+
objectName = res.name.replace(/[.;, ]/g, '_');
|
|
145
|
+
}
|
|
146
|
+
const metConSM = getMetConSM(res);
|
|
147
|
+
/**
|
|
148
|
+
* Spränger hinzufügen
|
|
149
|
+
*/
|
|
150
|
+
const newEntry = {
|
|
151
|
+
/**
|
|
152
|
+
* Starttage in der Woche
|
|
153
|
+
* - 0(Sun); 1(Mon); 2(Tue); 3(Wed); 4(Thur); 5(Fri); 6(Sat)
|
|
154
|
+
*/
|
|
155
|
+
startFixDay: metConSM.setStartFixDay, // Sontag, Sunday (Sun)// Montag, Monday (Mon)// Dienstag, Tuesday (Tue) (Tues)// Mittwoch, Wednesday (Wed)// Donnerstag, Thursday (Thur) (Thurs)// Freitag, Friday (Fri)// Samstag, Saturday (Sat)
|
|
156
|
+
/**
|
|
157
|
+
* - Auswahl:
|
|
158
|
+
* - threeRd = Start im 3 Tages Rhythmus,
|
|
159
|
+
* - twoNd = Start im 2 Tages Rhythmus
|
|
160
|
+
* - fixDay = Start an festen Tagen Sun-Sat
|
|
161
|
+
*/
|
|
162
|
+
startDay: metConSM.setStartDay,
|
|
163
|
+
enabled: res.enabled || false,
|
|
164
|
+
booster: res.booster,
|
|
165
|
+
endIrrigation: res.endIrrigation,
|
|
166
|
+
autoOn: true,
|
|
167
|
+
autoOnID: `${adapter.namespace }.sprinkle.${ objectName }.autoOn`, // sprinklecontrol.0.sprinkle.Rasenumrandung.autoOnID
|
|
168
|
+
objectName: objectName, // z.B. Rasenumrandung
|
|
169
|
+
objectID: `${adapter.namespace }.sprinkle.${ objectName }.runningTime`, // sprinklecontrol.0.sprinkle.Rasenumrandung.runningTime
|
|
170
|
+
idState: res.name, // "hm-rpc.0.MEQ1234567.3.STATE"
|
|
171
|
+
updateStateTimerID: null, // Timer wird gelöscht wenn Rückmeldung erfolgte
|
|
172
|
+
sprinkleID: myConfig.config.length, // Array[0...]
|
|
173
|
+
wateringTime: parseInt(res.wateringTime), // ...min
|
|
174
|
+
wateringAdd: parseInt(res.wateringAdd), // 0 ... 200%
|
|
175
|
+
wateringInterval: ((60 * parseInt(res.wateringInterval)) || 0), // 5,10,15min
|
|
176
|
+
addWateringTime: (parseInt(res.addWateringTime) || 0), // ...min Zusatzbewässerung bei hohen Temperaturen
|
|
177
|
+
pipeFlow: parseInt(res.pipeFlow), // Wasserverbrauch des sprinkler-Kreises
|
|
178
|
+
methodControlSM: metConSM.setMetConSM, // Art der Kontrolle der Bodenfeuchte ('calculation'; 'bistable'; 'analog'; fixDay)
|
|
179
|
+
triggerSM: metConSM.setTrigSM, // Sensor für die Bodenfeuchte
|
|
180
|
+
inGreenhouse: res.inGreenhouse || false, // keine Wettervorhersage verwenden (Gewächshaus)
|
|
181
|
+
analogZPct: metConSM.setAnalogZPct, // analoger Sensor Wert bei 0% (analog zero percent)
|
|
182
|
+
analogOHPct: metConSM.setAnalogOHPct, // analoger Sensor Wert bei 100% (analog one hundert percent)
|
|
183
|
+
soilMoisture: {
|
|
184
|
+
val: metConSM.setVal, // Bodenfeuchte / Wassergehalt der oberen Bodenschicht (zB. 5 mm == 50%)
|
|
185
|
+
pct: metConSM.setPct, // Bodenfeuchte in % zB. 50% = maxSoilMoistureIrrigation) / 2
|
|
186
|
+
bool: metConSM.setBool, // Bodenfeuchtezustand trocken/feucht === true/false
|
|
187
|
+
min: parseFloat(res.maxSoilMoistureIrrigation) / 100, // (zB. 0,02 mm)
|
|
188
|
+
maxIrrigation: parseFloat(res.maxSoilMoistureIrrigation), // (zB. 10 mm)
|
|
189
|
+
maxRain: parseFloat(res.maxSoilMoistureIrrigation) /100 * (parseFloat(res.maxSoilMoistureRainPct) || 120), // (zB. 12 mm)
|
|
190
|
+
triggersIrrigation: parseFloat(res.maxSoilMoistureIrrigation) * parseInt(res.triggersIrrigation) / 100, // (zB. 50 % ==> 5 mm)
|
|
191
|
+
pctTriggerIrrigation: parseFloat(res.triggersIrrigation), // Auslöser der Bewässerung in % (zB. 50%)
|
|
192
|
+
pctAddTriggersIrrigation: (parseFloat(res.addTriggersIrrigation) < parseFloat(res.triggersIrrigation)) ? parseFloat(res.addTriggersIrrigation) : parseFloat(res.triggersIrrigation)
|
|
193
|
+
}
|
|
194
|
+
};
|
|
195
|
+
myConfig.config.push(newEntry);
|
|
196
|
+
|
|
197
|
+
if (newEntry.enabled) {
|
|
198
|
+
// Report a change in the status of the trigger IDs (.runningTime; .name) => Melden einer Änderung des Status der Trigger-IDs
|
|
199
|
+
adapter.subscribeStates(newEntry.objectID); // abonnieren der Statusänderungen des Objekts (reagieren auf 'runningTime' der einzelnen Bewässerungskreise)
|
|
200
|
+
adapter.subscribeStates(newEntry.autoOnID); // abonnieren der Statusänderungen des Objekts (reagieren auf 'autoOn' der einzelnen Bewässerungskreise)
|
|
201
|
+
// adapter.subscribeForeignStates(newEntry.idState); // abonnieren der Statusänderungen des Objekts (reagiert auf Änderung des 'Ventils' der einzelnen Bewässerungskreise zur Fehlerkontrolle bzw. Verbrauchsermittlung)
|
|
202
|
+
}
|
|
203
|
+
adapter.log.debug(`Config ${objectName} created (${newEntry.sprinkleID}) - ${JSON.stringify(myConfig.config[newEntry.sprinkleID])}`);
|
|
204
|
+
|
|
205
|
+
// kann nicht bewässern! Verbrauch höher als Hauptpumpenleistung
|
|
206
|
+
if (newEntry.pipeFlow > adapter.config.triggerMainPumpPower) {
|
|
207
|
+
adapter.log.warn(`${newEntry.objectName} cannot irrigate! Consumption (${newEntry.pipeFlow}) higher than pump capacity (${adapter.config.triggerMainPumpPower})`);
|
|
208
|
+
}
|
|
209
|
+
// kann nicht bewässern! Verbrauch höher als Zisternenpumpenleistung
|
|
210
|
+
if (adapter.config.cisternSettings && newEntry.pipeFlow > adapter.config.triggerCisternPumpPower) {
|
|
211
|
+
adapter.log.warn(`${newEntry.objectName} can not irrigate! Consumption (${newEntry.pipeFlow}) higher than cistern pump capacity (${adapter.config.triggerCisternPumpPower})`);
|
|
212
|
+
}
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
},
|
|
216
|
+
/**
|
|
217
|
+
* apply Evaporation
|
|
218
|
+
* → Verdunstung anwenden auf die einzelnen Sprenger kreise
|
|
219
|
+
*
|
|
220
|
+
* @param eTP - pot. Evapotranspiration nach Penman ETp in mm/d
|
|
221
|
+
*/
|
|
222
|
+
applyEvaporation: (eTP) => {
|
|
223
|
+
if (myConfig.config) {
|
|
224
|
+
for(const entry of myConfig.config) {
|
|
225
|
+
if (entry.methodControlSM === 'calculation'
|
|
226
|
+
&& !(entry.inGreenhouse && (eTP < 0))) { // nicht anwenden im Gewächshaus und Regen
|
|
227
|
+
const objectName = entry.objectName;
|
|
228
|
+
const pfadActSoiMoi = `sprinkle.${ objectName }.actualSoilMoisture`;
|
|
229
|
+
|
|
230
|
+
entry.soilMoisture.val -= eTP; // Abfrage => entry.soilMoisture.val
|
|
231
|
+
if (entry.soilMoisture.val < entry.soilMoisture.min) {
|
|
232
|
+
entry.soilMoisture.val = entry.soilMoisture.min;
|
|
233
|
+
} else if (entry.soilMoisture.val > entry.soilMoisture.maxRain) {
|
|
234
|
+
entry.soilMoisture.val = entry.soilMoisture.maxRain;
|
|
235
|
+
}
|
|
236
|
+
entry.soilMoisture.pct = Math.round(1000 * entry.soilMoisture.val / entry.soilMoisture.maxIrrigation) / 10; // Berechnung in %
|
|
237
|
+
adapter.log.debug(`apply Evaporation: ${objectName} => soilMoisture: ${entry.soilMoisture.val} soilMoisture: ${entry.soilMoisture.pct} %`);
|
|
238
|
+
adapter.setState(pfadActSoiMoi, {
|
|
239
|
+
val: entry.soilMoisture.pct,
|
|
240
|
+
ack: true
|
|
241
|
+
});
|
|
242
|
+
}
|
|
243
|
+
}
|
|
244
|
+
}
|
|
245
|
+
},
|
|
246
|
+
/**
|
|
247
|
+
* Bodenfeuchte (soilMoisture) setzen auf: => pct = 100%; val = maxIrrigation
|
|
248
|
+
*
|
|
249
|
+
* @param mySprinkleID - ID des Bewässerungskreises
|
|
250
|
+
*/
|
|
251
|
+
setSoilMoistPct100: (mySprinkleID) => {
|
|
252
|
+
myConfig.config[mySprinkleID].soilMoisture.val = myConfig.config[mySprinkleID].soilMoisture.maxIrrigation;
|
|
253
|
+
myConfig.config[mySprinkleID].soilMoisture.pct = 100;
|
|
254
|
+
adapter.setState(`sprinkle.${ myConfig.config[mySprinkleID].objectName }.actualSoilMoisture`, {
|
|
255
|
+
val: myConfig.config[mySprinkleID].soilMoisture.pct,
|
|
256
|
+
ack: true
|
|
257
|
+
});
|
|
258
|
+
},
|
|
259
|
+
/**
|
|
260
|
+
* Speichern der Bodenfeuchtigkeit = bistabil (Bodenfeuchte-Sensor)
|
|
261
|
+
*
|
|
262
|
+
* @param mySprinkleID - ID des Bewässerungskreis
|
|
263
|
+
* @param newVal - neuer Wert vom Bodenfeuchte-Sensor
|
|
264
|
+
*/
|
|
265
|
+
setSoilMoistBool: (mySprinkleID, newVal) => {
|
|
266
|
+
if (myConfig.config[mySprinkleID].methodControlSM === 'bistable') {
|
|
267
|
+
if (typeof newVal === 'boolean') {
|
|
268
|
+
myConfig.config[mySprinkleID].soilMoisture.bool = newVal;
|
|
269
|
+
adapter.setState(`sprinkle.${ [myConfig.config[mySprinkleID].objectName] }.actualSoilMoisture`, {
|
|
270
|
+
val: myConfig.config[mySprinkleID].soilMoisture.bool,
|
|
271
|
+
ack: true
|
|
272
|
+
});
|
|
273
|
+
} else {
|
|
274
|
+
adapter.log.warn(`The ${myConfig.config[mySprinkleID].objectName} soil moisture sensor does not provide a Boolean signal`);
|
|
275
|
+
}
|
|
276
|
+
} else {
|
|
277
|
+
adapter.log.warn(`Please check the signals and settings of the ${myConfig.config[mySprinkleID].objectName} soil moisture sensor`);
|
|
278
|
+
}
|
|
279
|
+
},
|
|
280
|
+
/**
|
|
281
|
+
* Speichern der Bodenfeuchtigkeit = analog (Bodenfeuchte-Sensor)
|
|
282
|
+
*
|
|
283
|
+
* @param mySprinkleID - ID des Bewässerungskreis
|
|
284
|
+
* @param newVal - neuer Wert vom Bodenfeuchte-Sensor
|
|
285
|
+
*/
|
|
286
|
+
setSoilMoistPct: (mySprinkleID, newVal) => {
|
|
287
|
+
if (myConfig.config[mySprinkleID].methodControlSM === 'analog') {
|
|
288
|
+
if (typeof parseFloat(newVal) === 'number') {
|
|
289
|
+
/**aktueller Wert des Bodenfeuchte-Sensor
|
|
290
|
+
* @type {number} myVal
|
|
291
|
+
*/
|
|
292
|
+
let myVal;
|
|
293
|
+
/**Reversible Eingang des Bodenfeuchte sensors
|
|
294
|
+
* @type {boolean} reverse -Eingang analogOHPct < analogZPct
|
|
295
|
+
*
|
|
296
|
+
*/
|
|
297
|
+
const reverse = (myConfig.config[mySprinkleID].analogOHPct < myConfig.config[mySprinkleID].analogZPct);
|
|
298
|
+
if (myConfig.config[mySprinkleID].analogOHPct === myConfig.config[mySprinkleID].analogZPct) {
|
|
299
|
+
adapter.log.warn(`${myConfig.config[mySprinkleID].objectName}: analog soil moisture sensor at 0% and at 100% => the values are the same`);
|
|
300
|
+
}
|
|
301
|
+
newVal = parseFloat(newVal);
|
|
302
|
+
|
|
303
|
+
if ((!reverse && newVal < myConfig.config[mySprinkleID].analogZPct)
|
|
304
|
+
|| (reverse && myConfig.config[mySprinkleID].analogZPct < newVal)) {
|
|
305
|
+
myVal = myConfig.config[mySprinkleID].analogZPct;
|
|
306
|
+
adapter.log.warn(`${myConfig.config[mySprinkleID].objectName} (${newVal}): analog soil moisture sensor at 0 % => ${reverse ? 'The range of values has been exceeded (reverse)' : 'The value range was undercut'}`);
|
|
307
|
+
} else if ((!reverse && newVal > myConfig.config[mySprinkleID].analogOHPct)
|
|
308
|
+
|| (reverse && myConfig.config[mySprinkleID].analogOHPct > newVal)) {
|
|
309
|
+
myVal = myConfig.config[mySprinkleID].analogOHPct;
|
|
310
|
+
adapter.log.warn(`${myConfig.config[mySprinkleID].objectName} (${newVal}): analog soil moisture sensor at 100 % => ${reverse ? 'The value range was undercut (reverse)' : 'The range of values has been exceeded'}`);
|
|
311
|
+
} else {
|
|
312
|
+
myVal = newVal;
|
|
313
|
+
}
|
|
314
|
+
|
|
315
|
+
myConfig.config[mySprinkleID].soilMoisture.pct = Math.round(10 * trend(myConfig.config[mySprinkleID].analogZPct, myConfig.config[mySprinkleID].analogOHPct, 0, 100, myVal)) / 10;
|
|
316
|
+
adapter.setState(`sprinkle.${ [myConfig.config[mySprinkleID].objectName] }.actualSoilMoisture`, {
|
|
317
|
+
val: myConfig.config[mySprinkleID].soilMoisture.pct,
|
|
318
|
+
ack: true
|
|
319
|
+
});
|
|
320
|
+
} else {
|
|
321
|
+
adapter.log.warn(`The ${myConfig.config[mySprinkleID].objectName} soil moisture sensor does not provide a Number signal`);
|
|
322
|
+
}
|
|
323
|
+
} else {
|
|
324
|
+
adapter.log.warn(`Please check the signals and settings of the ${myConfig.config[mySprinkleID].objectName} soil moisture sensor`);
|
|
325
|
+
}
|
|
326
|
+
},
|
|
327
|
+
/**
|
|
328
|
+
* Bodenfeuchte (soilMoisture) erhöhen bis maxIrrigation (100%)
|
|
329
|
+
*
|
|
330
|
+
* @param mySprinkleID - ID des Bewässerungskreis
|
|
331
|
+
* @param addVal - soilMoisture.val wird um den Wert addVal erhöht
|
|
332
|
+
*/
|
|
333
|
+
addSoilMoistVal: (mySprinkleID, addVal) => {
|
|
334
|
+
if (myConfig.config[mySprinkleID].soilMoisture.val < myConfig.config[mySprinkleID].soilMoisture.maxIrrigation) {
|
|
335
|
+
myConfig.config[mySprinkleID].soilMoisture.val += addVal;
|
|
336
|
+
if (myConfig.config[mySprinkleID].soilMoisture.val > myConfig.config[mySprinkleID].soilMoisture.maxIrrigation) {
|
|
337
|
+
myConfig.config[mySprinkleID].soilMoisture.val = myConfig.config[mySprinkleID].soilMoisture.maxIrrigation;
|
|
338
|
+
}
|
|
339
|
+
}
|
|
340
|
+
|
|
341
|
+
myConfig.config[mySprinkleID].soilMoisture.pct = Math.round(1000 * myConfig.config[mySprinkleID].soilMoisture.val
|
|
342
|
+
/ myConfig.config[mySprinkleID].soilMoisture.maxIrrigation) / 10; // Berechnung in %
|
|
343
|
+
adapter.setState(`sprinkle.${ myConfig.config[mySprinkleID].objectName }.actualSoilMoisture`, {
|
|
344
|
+
val: myConfig.config[mySprinkleID].soilMoisture.pct,
|
|
345
|
+
ack: true
|
|
346
|
+
});
|
|
347
|
+
},
|
|
348
|
+
postponeByOneDay: async (mySprinkleID) => {
|
|
349
|
+
if (myConfig.config[mySprinkleID].startDay === 'threeRd' || // Next Start in 3 Tagen
|
|
350
|
+
myConfig.config[mySprinkleID].startDay === 'twoNd') { // Next Start in 2 Tagen
|
|
351
|
+
const today = await formatTime(adapter,'', 'day');
|
|
352
|
+
const id = `${adapter.namespace}.sprinkle.${myConfig.config[mySprinkleID].objectName}.actualSoilMoisture`;
|
|
353
|
+
let curDay, nextDay;
|
|
354
|
+
/**
|
|
355
|
+
* Wert von actualSoilMoisture auslesen
|
|
356
|
+
*
|
|
357
|
+
*/
|
|
358
|
+
const _curDay = await adapter.getStateAsync(id).catch((e) => adapter.log.warn(`postponeByOneDay getStateAsync: ${e}`));
|
|
359
|
+
if (_curDay) {
|
|
360
|
+
curDay = ((_curDay.val >= 0) && (_curDay.val <= 6) && (typeof _curDay.val === 'number') ? _curDay.val : today);
|
|
361
|
+
myConfig.config[mySprinkleID].startFixDay[curDay] = false;
|
|
362
|
+
nextDay = (+ curDay + 1 > 6) ? (+ curDay-6) : (+ curDay+1);
|
|
363
|
+
myConfig.config[mySprinkleID].startFixDay[nextDay] = true;
|
|
364
|
+
adapter.setStateAsync(
|
|
365
|
+
`${id}`,
|
|
366
|
+
nextDay,
|
|
367
|
+
true
|
|
368
|
+
).catch((e) => adapter.log.warn(`postponeByOneDay setStateAsync: ${e}`));
|
|
369
|
+
}
|
|
370
|
+
}
|
|
371
|
+
}
|
|
372
|
+
};
|
|
373
|
+
|
|
360
374
|
module.exports = myConfig;
|