iobroker.sprinklecontrol 0.2.15 → 0.2.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 +6 -9
- package/admin/i18n/de/translations.json +3 -1
- package/admin/i18n/en/translations.json +3 -1
- package/admin/i18n/es/translations.json +3 -1
- package/admin/i18n/fr/translations.json +3 -1
- package/admin/i18n/it/translations.json +3 -1
- package/admin/i18n/nl/translations.json +3 -1
- package/admin/i18n/pl/translations.json +3 -1
- package/admin/i18n/pt/translations.json +3 -1
- package/admin/i18n/ru/translations.json +3 -1
- package/admin/i18n/uk/translations.json +3 -1
- package/admin/i18n/zh-cn/translations.json +3 -1
- package/admin/index_m.html +11 -1
- package/admin/words.js +134 -133
- package/io-package.json +29 -27
- package/lib/valveControl.js +186 -151
- package/package.json +3 -3
package/io-package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"common": {
|
|
3
3
|
"name": "sprinklecontrol",
|
|
4
|
-
"version": "0.2.
|
|
4
|
+
"version": "0.2.17",
|
|
5
5
|
"titleLang": {
|
|
6
6
|
"en": "Sprinkler Control",
|
|
7
7
|
"de": "Sprinklersteuerung",
|
|
@@ -19,6 +19,32 @@
|
|
|
19
19
|
"Dirk Peter <dirk.peter@freenet.de>"
|
|
20
20
|
],
|
|
21
21
|
"news": {
|
|
22
|
+
"0.2.17": {
|
|
23
|
+
"en": "Valve timing corrected",
|
|
24
|
+
"de": "Ventilzeit korrigiert",
|
|
25
|
+
"ru": "Время клапана скорректировано",
|
|
26
|
+
"pt": "Regulação da válvula",
|
|
27
|
+
"nl": "Gecorrigeerde kleptijd",
|
|
28
|
+
"fr": "Réglage de la vanne",
|
|
29
|
+
"it": "Valvola tempistica corretta",
|
|
30
|
+
"es": "Tiempo de válvula corregido",
|
|
31
|
+
"pl": "Skorygowany czas zaworu",
|
|
32
|
+
"uk": "Терміни клапана, виправлені",
|
|
33
|
+
"zh-cn": "阀门时间得到纠正"
|
|
34
|
+
},
|
|
35
|
+
"0.2.16": {
|
|
36
|
+
"en": "issue #95 Pump lead time added",
|
|
37
|
+
"de": "ausgabe #95 Pumpe Lieferzeit hinzugefügt",
|
|
38
|
+
"ru": "#95 Время работы насоса добавлено",
|
|
39
|
+
"pt": "número de edição #95 Tempo de lançamento da bomba adicionado",
|
|
40
|
+
"nl": "nummer #95 Pump doorlooptijd toegevoegd",
|
|
41
|
+
"fr": "numéro 95 Temps d'avance de la pompe ajouté",
|
|
42
|
+
"it": "numero #95 Pump lead time aggiunto",
|
|
43
|
+
"es": "#95 Tiempo de inicio de bomba añadido",
|
|
44
|
+
"pl": "wydanie # 95 Dodany czas ołowiu pompy",
|
|
45
|
+
"uk": "problem #95 Насос додано час",
|
|
46
|
+
"zh-cn": "增加了泵前准备时间"
|
|
47
|
+
},
|
|
22
48
|
"0.2.15": {
|
|
23
49
|
"en": "Readme updated\nFixed an error when switching off with autoOnOff\nioBroker-Bot [W028]",
|
|
24
50
|
"de": "Reader aktualisiert\nFehler beim Ausschalten mit autoOnOff behoben\nioBroker-Bot [W028]",
|
|
@@ -83,32 +109,6 @@
|
|
|
83
109
|
"pl": "Poprawiony błąd => analogowy czujnik wilgotności gleby o charakterystyce ujemnej; Uwaga => maksymalna wilgotność gleby w deszczu teraz w %",
|
|
84
110
|
"uk": "Виправлено помилку => аналоговий датчик вологості ґрунту з негативною характеристикою; Увага => максимальна вологість ґрунту під час дощу зараз у %",
|
|
85
111
|
"zh-cn": "错误修复 => 具有负特性的模拟土壤湿度传感器;注意 => 现在雨中的最大土壤水分百分比"
|
|
86
|
-
},
|
|
87
|
-
"0.2.10": {
|
|
88
|
-
"en": "- manual watering limited to a maximum of 100%; - Error whatsapp message fixed",
|
|
89
|
-
"de": "- manuelle Bewässerung begrenzt auf maximal 100 %; - Fehler WhatsApp-Nachricht behoben",
|
|
90
|
-
"ru": "- ручной полив ограничен максимум 100%; - Исправлено сообщение об ошибке WhatsApp",
|
|
91
|
-
"pt": "- rega manual limitada a um máximo de 100%; - Mensagem de erro do whatsapp corrigida",
|
|
92
|
-
"nl": "- handmatige bewatering beperkt tot maximaal 100%; - Fout whatsapp-bericht opgelost",
|
|
93
|
-
"fr": "- arrosage manuel limité à 100% maximum ; - Message d'erreur WhatsApp corrigé",
|
|
94
|
-
"it": "- irrigazione manuale limitata ad un massimo del 100%; - Errore messaggio whatsapp risolto",
|
|
95
|
-
"es": "- riego manual limitado a un máximo del 100%; - Mensaje de error de whatsapp arreglado",
|
|
96
|
-
"pl": "- nawadnianie ręczne ograniczone do maksymalnie 100%; - Naprawiono błąd wiadomości WhatsApp",
|
|
97
|
-
"uk": "- ручний полив обмежений максимум на 100%; - Виправлено повідомлення про помилку WhatsApp",
|
|
98
|
-
"zh-cn": "- 手动浇水限制为最大 100%; - 错误whatsapp消息已修复"
|
|
99
|
-
},
|
|
100
|
-
"0.2.9": {
|
|
101
|
-
"en": "Bug initialization routine",
|
|
102
|
-
"de": "Bug-Initialisierungsroutine",
|
|
103
|
-
"ru": "Процедура инициализации ошибки",
|
|
104
|
-
"pt": "Rotina de inicialização de bugs",
|
|
105
|
-
"nl": "Bug initialisatie routine",
|
|
106
|
-
"fr": "Routine d'initialisation de bogue",
|
|
107
|
-
"it": "Routine di inizializzazione dei bug",
|
|
108
|
-
"es": "Rutina de inicialización de errores",
|
|
109
|
-
"pl": "Procedura inicjowania błędów",
|
|
110
|
-
"uk": "Процедура ініціалізації помилок",
|
|
111
|
-
"zh-cn": "错误初始化例程"
|
|
112
112
|
}
|
|
113
113
|
},
|
|
114
114
|
"desc": {
|
|
@@ -172,9 +172,11 @@
|
|
|
172
172
|
"switchingDistance": "300",
|
|
173
173
|
"triggerMainPump": "hm-rpc.0.MEQ1234567.1.STATE",
|
|
174
174
|
"triggerMainPumpPower": "2000",
|
|
175
|
+
"mainPumpLeadTime": "15",
|
|
175
176
|
"cisternSettings": false,
|
|
176
177
|
"triggerCisternPump": "",
|
|
177
178
|
"triggerCisternPumpPower": "1800",
|
|
179
|
+
"cisternPumpLeadTime": "10",
|
|
178
180
|
"actualValueLevel": "",
|
|
179
181
|
"triggerMinCisternLevel": "25",
|
|
180
182
|
"wateringStartTime": "livingGoldenHourEnd",
|
package/lib/valveControl.js
CHANGED
|
@@ -27,6 +27,8 @@ let maxParallel = 0;
|
|
|
27
27
|
/** Füllstand der Zisterne */
|
|
28
28
|
let fillLevelCistern = 0;
|
|
29
29
|
let statusCistern = '';
|
|
30
|
+
/** Speicherort von setTimeout */
|
|
31
|
+
let idValveDelayTime;
|
|
30
32
|
|
|
31
33
|
const currentPumpUse = {
|
|
32
34
|
/** Pumpen aktive? */
|
|
@@ -39,6 +41,7 @@ const currentPumpUse = {
|
|
|
39
41
|
pumpPower: 0
|
|
40
42
|
};
|
|
41
43
|
|
|
44
|
+
const updateListMarker = {funcActive: false, newStart: false};
|
|
42
45
|
|
|
43
46
|
/*==============================================================================================================================================*/
|
|
44
47
|
/* interne Funktionen */
|
|
@@ -176,16 +179,19 @@ function boostKill (sprinkleID) {
|
|
|
176
179
|
|
|
177
180
|
/**
|
|
178
181
|
* Schaltintervall der Ventile, Schaltabstand ist in der Config hinterlegt
|
|
182
|
+
*
|
|
183
|
+
* @param delay wenn keine Zeit eingegeben ist, wird der Schaltabstand der Config verwendet
|
|
179
184
|
*/
|
|
180
|
-
const valveDelay = () => {
|
|
185
|
+
const valveDelay = (delay = parseInt(adapter.config.switchingDistance)) => {
|
|
181
186
|
return new Promise (
|
|
182
|
-
resolve => setTimeout (resolve,
|
|
187
|
+
resolve => idValveDelayTime = setTimeout (resolve, delay)
|
|
183
188
|
);
|
|
184
189
|
};
|
|
190
|
+
|
|
185
191
|
/**
|
|
186
192
|
* Ausschalten der Ventile mit Schaltabstand
|
|
187
193
|
*
|
|
188
|
-
* @param threadList Auflistung aller
|
|
194
|
+
* @param threadList Auflistung aller aktiven Sprenger-Kreise
|
|
189
195
|
* @param parallel aktuelle Anzahl der eingeschalteten Ventile
|
|
190
196
|
* @returns
|
|
191
197
|
*/
|
|
@@ -200,26 +206,26 @@ const switchTheValvesOffOn = async (threadList, parallel) => {
|
|
|
200
206
|
|| entry.killSprinkle) // || Bewässerung erledigt
|
|
201
207
|
&& entry.enabled !== entry.enabledState // && Ventil nicht aktuell
|
|
202
208
|
) {
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
209
|
+
try {
|
|
210
|
+
adapter.setForeignStateAsync(entry.idState, {
|
|
211
|
+
val: false,
|
|
212
|
+
ack: false
|
|
213
|
+
});
|
|
214
|
+
entry.enabledState = entry.enabled;
|
|
215
|
+
/* Ventil aus threadList löschen → Aufgabe beendet und sind nicht in der Pause */
|
|
216
|
+
if (entry.killSprinkle) {
|
|
217
|
+
killList.push(entry.sprinkleName);
|
|
211
218
|
}
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
killList.push(entry.sprinkleName);
|
|
219
|
+
adapter.log.info(`Set (${myConfig.config[entry.sprinkleID].methodControlSM}) ID: ${entry.sprinkleName}, value: ${entry.enabled}`);
|
|
220
|
+
await valveDelay ();
|
|
221
|
+
} catch (error) {
|
|
222
|
+
adapter.log.error(`Error(ID: ${entry.sprinkleName}): ${error}`);
|
|
217
223
|
}
|
|
218
|
-
await valveDelay ();
|
|
219
224
|
}
|
|
220
225
|
}
|
|
226
|
+
|
|
221
227
|
if (currentPumpUse.pumpName !== '') {
|
|
222
|
-
setPumpOnOff(parallel > 0);
|
|
228
|
+
await setPumpOnOff(parallel > 0);
|
|
223
229
|
await valveDelay ();
|
|
224
230
|
}
|
|
225
231
|
if (adapter.config.triggerControlVoltage) {
|
|
@@ -227,31 +233,140 @@ const switchTheValvesOffOn = async (threadList, parallel) => {
|
|
|
227
233
|
await valveDelay ();
|
|
228
234
|
}
|
|
229
235
|
|
|
230
|
-
|
|
231
236
|
for (const entry of threadList) { // einschalten der Ventile
|
|
232
237
|
if (entry.enabled // intern eingeschaltet
|
|
233
238
|
&& !entry.myBreak // && keine Pause
|
|
234
239
|
&& !entry.killSprinkle // Bewässerung noch nicht erledigt
|
|
235
240
|
&& entry.enabled !== entry.enabledState // && Ventil nicht aktuell
|
|
236
241
|
) {
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
242
|
+
try {
|
|
243
|
+
adapter.setForeignState(entry.idState, {
|
|
244
|
+
val: true,
|
|
245
|
+
ack: false
|
|
246
|
+
});
|
|
247
|
+
entry.enabledState = entry.enabled;
|
|
248
|
+
if (myConfig.config[entry.sprinkleID].booster) {
|
|
249
|
+
boostReady = false;
|
|
250
|
+
adapter.log.debug(`ID: ${entry.sprinkleName}UpdateList sprinkle On: boostReady = ${boostReady}`);
|
|
251
|
+
setTimeout(() => {
|
|
252
|
+
boostList(entry.sprinkleID);
|
|
253
|
+
}, 50);
|
|
245
254
|
}
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
255
|
+
/* Zustand des Ventils im Thread < 0 > off, < 1 > wait, <<< 2 >>> on, < 3 > break, < 4 > Boost(on), < 5 > off(Boost) */
|
|
256
|
+
adapter.setState(`sprinkle.${entry.sprinkleName}.sprinklerState`, {
|
|
257
|
+
val: 2,
|
|
258
|
+
ack: true
|
|
259
|
+
});
|
|
260
|
+
// valveOnOff(entry, true, '#2.7 Set: on, ID: ');
|
|
261
|
+
/* countdown starten */
|
|
262
|
+
if (!entry.startTime) {
|
|
263
|
+
entry.startTime = new Date();
|
|
264
|
+
}
|
|
265
|
+
entry.countdown = setInterval(() => {
|
|
266
|
+
countSprinkleTime(entry);
|
|
267
|
+
}, 1000); // 1000 = 1s
|
|
268
|
+
adapter.log.info(`Set Valve (${myConfig.config[entry.sprinkleID].methodControlSM}) ID: ${entry.sprinkleName}, value: ${entry.enabled}, duration: ${addTime(entry.wateringTime)}`);
|
|
269
|
+
await valveDelay ();
|
|
270
|
+
} catch (error) {
|
|
271
|
+
adapter.log.error(`Error(ID: ${entry.sprinkleName}): ${error}`);
|
|
272
|
+
}
|
|
273
|
+
|
|
249
274
|
}
|
|
250
275
|
}
|
|
251
276
|
|
|
252
277
|
delList(killList); // erledigte Bewässerungsaufgaben aus der threadList löschen
|
|
253
278
|
};
|
|
254
279
|
|
|
280
|
+
/**
|
|
281
|
+
* Handling von Ventilen, Zeiten, Verbrauchsmengen im 1s Takt
|
|
282
|
+
*
|
|
283
|
+
* @param entry
|
|
284
|
+
*/
|
|
285
|
+
function countSprinkleTime(entry) {
|
|
286
|
+
/* --- function beenden wenn ---*/
|
|
287
|
+
if (boostOn && !(myConfig.config[entry.sprinkleID].booster) // boost-On && kein aktuelles Boost-Ventil
|
|
288
|
+
) {
|
|
289
|
+
return;
|
|
290
|
+
}
|
|
291
|
+
entry.count ++;
|
|
292
|
+
if ((entry.count < entry.wateringTime) // Zeit noch nicht abgelaufen?
|
|
293
|
+
&& (!entry.calcOn // alles ausser Berechnung der Verdunstung
|
|
294
|
+
|| !entry.autoOn // Handbetrieb
|
|
295
|
+
|| (myConfig.config[entry.sprinkleID].soilMoisture.val < myConfig.config[entry.sprinkleID].soilMoisture.maxIrrigation)) // Bodenfeuchte noch nicht erreicht? (z.B. beim Regen)
|
|
296
|
+
) { /* Zeit läuft */
|
|
297
|
+
adapter.setState(`sprinkle.${entry.sprinkleName}.countdown`, {
|
|
298
|
+
val: addTime(entry.wateringTime - entry.count),
|
|
299
|
+
ack: true
|
|
300
|
+
});
|
|
301
|
+
/* Alle 15s die Bodenfeuchte anpassen */
|
|
302
|
+
if (entry.calcOn // Vergleich nur bei Berechnung der Verdunstung
|
|
303
|
+
&& !(entry.count % 15) // alle 15s ausführen
|
|
304
|
+
) {
|
|
305
|
+
myConfig.addSoilMoistVal(entry.sprinkleID, entry.soilMoisture15s);
|
|
306
|
+
}
|
|
307
|
+
/* Intervall-Beregnung wenn angegeben (onOffTime > 0) */
|
|
308
|
+
if ((entry.onOffTime > 0) && !(entry.count % entry.onOffTime)) {
|
|
309
|
+
adapter.log.info(`Intervall-Beregnung, onOffTime: ${entry.onOffTime}, count: ${entry.count}`);
|
|
310
|
+
entry.enabled = false;
|
|
311
|
+
entry.myBreak = true;
|
|
312
|
+
/* Zustand des Ventils im Thread < 0 > off, < 1 > wait, < 2 > on, <<< 3 >>> break, < 4 > Boost(on), < 5 > off(Boost) */
|
|
313
|
+
adapter.setState(`sprinkle.${entry.sprinkleName}.sprinklerState`, {
|
|
314
|
+
val: 3,
|
|
315
|
+
ack: true
|
|
316
|
+
});
|
|
317
|
+
updateList();
|
|
318
|
+
clearInterval(entry.countdown);
|
|
319
|
+
entry.onOffTimeoutOff = setTimeout(()=>{
|
|
320
|
+
entry.myBreak = false;
|
|
321
|
+
/* Zustand des Ventils im Thread < 0 > off, <<< 1 >>> wait, < 2 > on, < 3 > break, < 4 > Boost(on), < 5 > off(Boost) */
|
|
322
|
+
adapter.setState(`sprinkle.${entry.sprinkleName}.sprinklerState`, {
|
|
323
|
+
val: 1,
|
|
324
|
+
ack: true
|
|
325
|
+
});
|
|
326
|
+
updateList();
|
|
327
|
+
},1000 * (entry.onOffTime < 600 ? 600 : entry.onOffTime)); // 600 sek Pause (10 min)
|
|
328
|
+
}
|
|
329
|
+
} else { /* zeit abgelaufen => Ventil ausschalten */
|
|
330
|
+
/* Zustand des Ventils im Thread <<< 0 >>> off, < 1 > wait, < 2 > on, < 3 > break, < 4 > Boost(on), < 5 > off(Boost) */
|
|
331
|
+
entry.enabled = false;
|
|
332
|
+
adapter.setState(`sprinkle.${entry.sprinkleName}.sprinklerState`, {
|
|
333
|
+
val: 0,
|
|
334
|
+
ack: true
|
|
335
|
+
});
|
|
336
|
+
adapter.setState(`sprinkle.${entry.sprinkleName}.runningTime`, {
|
|
337
|
+
val: '0',
|
|
338
|
+
ack: true
|
|
339
|
+
});
|
|
340
|
+
adapter.setState(`sprinkle.${entry.sprinkleName}.countdown`, {
|
|
341
|
+
val: '0',
|
|
342
|
+
ack: true
|
|
343
|
+
});
|
|
344
|
+
|
|
345
|
+
/* Wenn in der Konfiguration Bodenfeuchte = 100% gesetzt ist und Auto-Bewässerung aktive, dann Bodenfeuchte = 100% setzen*/
|
|
346
|
+
if (entry.autoOn && entry.calcOn && myConfig.config[entry.sprinkleID].endIrrigation) {
|
|
347
|
+
myConfig.setSoilMoistPct100(entry.sprinkleID);
|
|
348
|
+
}
|
|
349
|
+
/* Verbrauchswerte in der Historie aktualisieren */
|
|
350
|
+
addConsumedAndTime(entry);
|
|
351
|
+
/* Booster zurücksetzen */
|
|
352
|
+
if (myConfig.config[entry.sprinkleID].booster) {
|
|
353
|
+
if (boostOn) {
|
|
354
|
+
boostKill(entry.sprinkleID);
|
|
355
|
+
}
|
|
356
|
+
boostReady = true;
|
|
357
|
+
adapter.log.debug(`ID: ${entry.sprinkleName} UpdateList Sprinkle Off: boostReady = ${boostReady}`);
|
|
358
|
+
}
|
|
359
|
+
/* Zeiten löschen */
|
|
360
|
+
clearInterval(entry.countdown);
|
|
361
|
+
/*clearTimeout(entry.onOffTimeoutOn);*/
|
|
362
|
+
clearTimeout(entry.onOffTimeoutOff);
|
|
363
|
+
/* Ventil aus threadList löschen → Aufgabe beendet */
|
|
364
|
+
//delList(entry.sprinkleName);
|
|
365
|
+
entry.killSprinkle = true;
|
|
366
|
+
updateList();
|
|
367
|
+
}
|
|
368
|
+
}
|
|
369
|
+
|
|
255
370
|
/*----------------------------------------------------------------------------------------------------------------------------------------------*/
|
|
256
371
|
|
|
257
372
|
/**
|
|
@@ -264,6 +379,11 @@ function updateList () {
|
|
|
264
379
|
return;
|
|
265
380
|
}
|
|
266
381
|
|
|
382
|
+
if (updateListMarker.funcActive === true) {
|
|
383
|
+
updateListMarker.newStart = true;
|
|
384
|
+
return;
|
|
385
|
+
}
|
|
386
|
+
updateListMarker.funcActive = true;
|
|
267
387
|
/** aktuelle Rest-Pumpenleistung */
|
|
268
388
|
let curFlow = currentPumpUse.pumpPower, /* adapter.config.triggerMainPumpPower; */
|
|
269
389
|
/** aktuelle Anzahl der eingeschalteten Ventile */
|
|
@@ -293,95 +413,6 @@ function updateList () {
|
|
|
293
413
|
(a.pipeFlow > b.pipeFlow) ? 1 :
|
|
294
414
|
0;
|
|
295
415
|
}
|
|
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
416
|
|
|
386
417
|
// ermitteln von curPipe und der anzahl der parallelen Stränge
|
|
387
418
|
for(const entry of threadList){
|
|
@@ -430,28 +461,9 @@ function updateList () {
|
|
|
430
461
|
&& ((boostReady) || !(myConfig.config[entry.sprinkleID].booster)) // nur einer mit boostFunction darf aktive sein
|
|
431
462
|
) {
|
|
432
463
|
entry.enabled = true; // einschalten merken
|
|
433
|
-
|
|
434
|
-
boostReady = false;
|
|
435
|
-
adapter.log.debug(`ID: ${entry.sprinkleName}UpdateList sprinkle On: boostReady = ${boostReady}`);
|
|
436
|
-
setTimeout(() => {
|
|
437
|
-
boostList(entry.sprinkleID);
|
|
438
|
-
}, 50);
|
|
439
|
-
}
|
|
464
|
+
|
|
440
465
|
curFlow -= entry.pipeFlow; // ermitteln der RestFörderkapazität
|
|
441
466
|
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
467
|
|
|
456
468
|
}
|
|
457
469
|
}
|
|
@@ -468,9 +480,15 @@ function updateList () {
|
|
|
468
480
|
switchTheValvesOffOn(threadList, parallel).then(err => {
|
|
469
481
|
if (err) {
|
|
470
482
|
adapter.log.error(`Error - Set (false) err: ${err}`);
|
|
471
|
-
sendMessageText.sendMessage(`Error - Set (
|
|
483
|
+
sendMessageText.sendMessage(`Error - Set (false) err: ${err}`);
|
|
472
484
|
}
|
|
473
485
|
});
|
|
486
|
+
|
|
487
|
+
updateListMarker.funcActive = false;
|
|
488
|
+
if (updateListMarker.newStart === true) {
|
|
489
|
+
updateListMarker.newStart = false;
|
|
490
|
+
setTimeout(updateList(), 50);
|
|
491
|
+
}
|
|
474
492
|
} // End updateList
|
|
475
493
|
|
|
476
494
|
/* --------------------------------------------------------------------------------------------------------------------------------------------------------------------- */
|
|
@@ -496,6 +514,7 @@ function setActualPump () {
|
|
|
496
514
|
currentPumpUse.pumpCistern = false;
|
|
497
515
|
currentPumpUse.pumpName = adapter.config.triggerMainPump || '';
|
|
498
516
|
currentPumpUse.pumpPower = parseInt(adapter.config.triggerMainPumpPower);
|
|
517
|
+
currentPumpUse.leadTime = parseInt(adapter.config.mainPumpLeadTime)*1000 || 1000;
|
|
499
518
|
adapter.setForeignState(currentPumpUse.pumpName, {
|
|
500
519
|
val: true,
|
|
501
520
|
ack: false
|
|
@@ -531,6 +550,7 @@ function setActualPump () {
|
|
|
531
550
|
currentPumpUse.pumpCistern = true;
|
|
532
551
|
currentPumpUse.pumpName = adapter.config.triggerCisternPump || '';
|
|
533
552
|
currentPumpUse.pumpPower = parseInt(adapter.config.triggerCisternPumpPower);
|
|
553
|
+
currentPumpUse.leadTime = parseInt(adapter.config.cisternPumpLeadTime)*1000 || 1000;
|
|
534
554
|
adapter.setState('control.restFlow', {
|
|
535
555
|
val: `${currentPumpUse.pumpPower} (${currentPumpUse.pumpPower} Zisterne)`,
|
|
536
556
|
ack: true
|
|
@@ -544,6 +564,7 @@ function setActualPump () {
|
|
|
544
564
|
currentPumpUse.pumpCistern = false;
|
|
545
565
|
currentPumpUse.pumpName = adapter.config.triggerMainPump || '';
|
|
546
566
|
currentPumpUse.pumpPower = parseInt(adapter.config.triggerMainPumpPower);
|
|
567
|
+
currentPumpUse.leadTime = parseInt(adapter.config.mainPumpLeadTime)*1000 || 1000;
|
|
547
568
|
adapter.setState('control.restFlow', {
|
|
548
569
|
val: `${currentPumpUse.pumpPower} (${currentPumpUse.pumpPower} Grundwasser)`,
|
|
549
570
|
ack: true
|
|
@@ -568,21 +589,24 @@ function setActualPump () {
|
|
|
568
589
|
*
|
|
569
590
|
* @param pumpOnOff ; Pumpe on = true
|
|
570
591
|
*/
|
|
571
|
-
|
|
592
|
+
const setPumpOnOff = async (pumpOnOff) => {
|
|
593
|
+
clearTimeout(idValveDelayTime);
|
|
572
594
|
if (currentPumpUse.pumpName !== '') {
|
|
573
|
-
|
|
574
|
-
|
|
595
|
+
try {
|
|
596
|
+
const curPumpState = await adapter.getForeignStateAsync(currentPumpUse.pumpName);
|
|
597
|
+
if (curPumpState) {
|
|
575
598
|
if (pumpOnOff) {
|
|
576
|
-
if (
|
|
599
|
+
if (curPumpState.val === false) {
|
|
577
600
|
adapter.setForeignState(currentPumpUse.pumpName, {
|
|
578
601
|
val: true,
|
|
579
602
|
ack: false
|
|
580
603
|
});
|
|
581
604
|
currentPumpUse.enable = true;
|
|
582
|
-
adapter.log.info(
|
|
605
|
+
adapter.log.info(`Set (pump) on, wait ${currentPumpUse.leadTime}ms`);
|
|
606
|
+
await valveDelay(currentPumpUse.leadTime);
|
|
583
607
|
}
|
|
584
608
|
} else {
|
|
585
|
-
if (
|
|
609
|
+
if (curPumpState.val !== false) {
|
|
586
610
|
adapter.setForeignState(currentPumpUse.pumpName, {
|
|
587
611
|
val: false,
|
|
588
612
|
ack: false
|
|
@@ -591,10 +615,10 @@ function setPumpOnOff(pumpOnOff) {
|
|
|
591
615
|
adapter.log.info('Set (pump) off');
|
|
592
616
|
}
|
|
593
617
|
}
|
|
594
|
-
} else if (err) {
|
|
595
|
-
adapter.log.error(`triggerMainPump ${currentPumpUse.pumpName} is not available (ist nicht erreichbar): ${err}`);
|
|
596
618
|
}
|
|
597
|
-
})
|
|
619
|
+
} catch (error) {
|
|
620
|
+
adapter.log.error(`triggerMainPump ${currentPumpUse.pumpName} is not available (ist nicht erreichbar): ${error}`);
|
|
621
|
+
}
|
|
598
622
|
}
|
|
599
623
|
} // End setPumpOnOff
|
|
600
624
|
|
|
@@ -690,6 +714,7 @@ const valveControl = {
|
|
|
690
714
|
currentPumpUse.pumpCistern = false;
|
|
691
715
|
currentPumpUse.pumpName = adapter.config.triggerMainPump || '';
|
|
692
716
|
currentPumpUse.pumpPower = parseInt(adapter.config.triggerMainPumpPower) || 0;
|
|
717
|
+
currentPumpUse.leadTime = parseInt(adapter.config.mainPumpLeadTime)*1000 || 1000;
|
|
693
718
|
maxParallel = parseInt(adapter.config.maximumParallelValves);
|
|
694
719
|
/* Objekt control.restFlow befüllen */
|
|
695
720
|
adapter.setState('control.restFlow', {
|
|
@@ -783,6 +808,15 @@ const valveControl = {
|
|
|
783
808
|
});
|
|
784
809
|
addDone = true; // Sprinkle found
|
|
785
810
|
adapter.log.debug(`update ID: ${entry.sprinkleName} new time: ${addTime(res.wateringTime)}`);
|
|
811
|
+
// Wenn aktueller Spränger im BoostOn ausgeschaltet werden soll (ersten 30s)
|
|
812
|
+
if (boostOn
|
|
813
|
+
&& myConfig.config[res.sprinkleID].booster
|
|
814
|
+
&& entry.wateringTime <= 0
|
|
815
|
+
) {
|
|
816
|
+
boostKill(res.sprinkleID);
|
|
817
|
+
boostReady = true;
|
|
818
|
+
adapter.log.debug(`ID: ${res.sprinkleName} BoostKill Sprinkle Off: boostReady = ${boostReady}`);
|
|
819
|
+
}
|
|
786
820
|
break;
|
|
787
821
|
}
|
|
788
822
|
}
|
|
@@ -831,8 +865,8 @@ const valveControl = {
|
|
|
831
865
|
soilMoisture15s: 15 * (myConfig.config[res.sprinkleID].soilMoisture.maxIrrigation - myConfig.config[res.sprinkleID].soilMoisture.triggersIrrigation)
|
|
832
866
|
/ (60 * myConfig.config[res.sprinkleID].wateringTime),
|
|
833
867
|
times: {
|
|
834
|
-
boostTime1: null, // boost start
|
|
835
|
-
boostTime2: null, // boost ende
|
|
868
|
+
boostTime1: null, // boost start in die Zwangspause schicken in 0,25s
|
|
869
|
+
boostTime2: null, // boost ende aus der Zwangspause holen nach 31s
|
|
836
870
|
}, // hinterlegen der verschiedenen Zeiten von timeout für gezieltes späteres löschen
|
|
837
871
|
id: threadList.length || 0,
|
|
838
872
|
};
|
|
@@ -857,6 +891,7 @@ const valveControl = {
|
|
|
857
891
|
* => Beim Beenden des adapters alles ausschalten
|
|
858
892
|
*/
|
|
859
893
|
clearEntireList () {
|
|
894
|
+
clearTimeout(idValveDelayTime);
|
|
860
895
|
setVoltageOnOff(false);
|
|
861
896
|
setPumpOnOff(false);
|
|
862
897
|
if (boostListTimer) {
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "iobroker.sprinklecontrol",
|
|
3
|
-
"version": "0.2.
|
|
3
|
+
"version": "0.2.17",
|
|
4
4
|
"description": "Control of several sprinklers depending on weather conditions and pump performance.",
|
|
5
5
|
"author": {
|
|
6
6
|
"name": "Dirk Peter",
|
|
@@ -43,8 +43,8 @@
|
|
|
43
43
|
"@iobroker/testing": "^5.0.4",
|
|
44
44
|
"chai": "^5.2.0",
|
|
45
45
|
"chai-as-promised": "^8.0.1",
|
|
46
|
-
"mocha": "^11.
|
|
47
|
-
"sinon": "^
|
|
46
|
+
"mocha": "^11.6.0",
|
|
47
|
+
"sinon": "^21.0.0",
|
|
48
48
|
"sinon-chai": "^4.0.0"
|
|
49
49
|
},
|
|
50
50
|
"main": "main.js",
|