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/io-package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "common": {
3
3
  "name": "sprinklecontrol",
4
- "version": "0.2.15",
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",
@@ -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, parseInt(adapter.config.switchingDistance))
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 aktiver Sprenger-Kreise
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
- 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}`);
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
- 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);
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
- 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)}`);
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
- entry.enabledState = entry.enabled;
248
- await valveDelay ();
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
- 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
- }
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 (fase) err: ${err}`);
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
- function setPumpOnOff(pumpOnOff) {
592
+ const setPumpOnOff = async (pumpOnOff) => {
593
+ clearTimeout(idValveDelayTime);
572
594
  if (currentPumpUse.pumpName !== '') {
573
- adapter.getForeignState(currentPumpUse.pumpName, (err, state) => {
574
- if (state) {
595
+ try {
596
+ const curPumpState = await adapter.getForeignStateAsync(currentPumpUse.pumpName);
597
+ if (curPumpState) {
575
598
  if (pumpOnOff) {
576
- if (state.val === false) {
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('Set (pump) on');
605
+ adapter.log.info(`Set (pump) on, wait ${currentPumpUse.leadTime}ms`);
606
+ await valveDelay(currentPumpUse.leadTime);
583
607
  }
584
608
  } else {
585
- if (state.val !== false) {
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.15",
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.5.0",
47
- "sinon": "^20.0.0",
46
+ "mocha": "^11.6.0",
47
+ "sinon": "^21.0.0",
48
48
  "sinon-chai": "^4.0.0"
49
49
  },
50
50
  "main": "main.js",