iobroker.sprinklecontrol 0.2.6 → 0.2.9

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/main.js CHANGED
@@ -11,7 +11,7 @@ const SunCalc = require('suncalc2');
11
11
 
12
12
  const sendMessageText = require('./lib/sendMessageText.js'); // sendMessageText
13
13
  const valveControl = require('./lib/valveControl.js'); // Steuerung der einzelnen Ventile
14
- const myConfig = require('./lib/myConfig.js'); // myConfig => Speichern und abrufen von Konfigurationsdaten der Ventile
14
+ const myConfig = require('./lib/myConfig.js'); // myConfig Speichern und abrufen von Konfigurationsdaten der Ventile
15
15
  const evaporation = require('./lib/evaporation.js');
16
16
  const addTime = require('./lib/tools.js').addTime;
17
17
  const formatTime = require('./lib/tools.js').formatTime;
@@ -24,7 +24,7 @@ const formatTime = require('./lib/tools.js').formatTime;
24
24
  let adapter;
25
25
  const adapterName = require('./package.json').name.split('.').pop();
26
26
 
27
- /** ext. Adapter => Deutsche Feiertage
27
+ /** ext. Adapter Deutsche Feiertage
28
28
  * @type {any} */
29
29
  let publicHolidayStr;
30
30
  /** @type {any} */
@@ -52,7 +52,7 @@ let autoOnOffStr;
52
52
  /** @type {string} */
53
53
  let kwStr; // akt. KW der Woche
54
54
  /** @type {number | undefined} */
55
- let timer;
55
+ let timer, timerSleep;
56
56
  /** @type {number} */
57
57
  let today; // heutige Tag 0:So;1:Mo...6:Sa
58
58
 
@@ -90,6 +90,7 @@ function startAdapter(options) {
90
90
  try {
91
91
  adapter.log.info('cleaned everything up...');
92
92
  clearTimeout(timer);
93
+ clearTimeout(timerSleep);
93
94
  /*Startzeiten der Timer löschen*/
94
95
  schedule.cancelJob('calcPosTimer');
95
96
  schedule.cancelJob('sprinkleStartTime');
@@ -151,10 +152,9 @@ function startAdapter(options) {
151
152
  */
152
153
  adapter.on('stateChange', (id, state) => {
153
154
  if (state) {
154
- // The state was changed => Der Zustand wurde geändert
155
- if (adapter.config.debug) {
156
- adapter.log.info(`state ${id} changed: ${state.val} (ack = ${state.ack})`);
157
- }
155
+ // The state was changed Der Zustand wurde geändert
156
+ adapter.log.debug(`state ${id} changed: ${state.val} (ack = ${state.ack})`);
157
+
158
158
  // wenn (Holiday == true) ist, soll das Wochenendprogramm gefahren werden.
159
159
  if (id === adapter.namespace + '.control.Holiday') {
160
160
  holidayStr = state.val;
@@ -163,7 +163,7 @@ function startAdapter(options) {
163
163
  // wenn (autoOnOff == false) so werden alle Sprenger nicht mehr automatisch gestartet.
164
164
  if (id === adapter.namespace + '.control.autoOnOff') {
165
165
  autoOnOffStr = state.val;
166
- adapter.log.info('startAdapter: control.autoOnOff: ' + state.val);
166
+ adapter.log.info(`startAdapter: control.autoOnOff: ${state.val}`);
167
167
  if (!state.val) {
168
168
  valveControl.clearEntireList();
169
169
  }
@@ -212,12 +212,12 @@ function startAdapter(options) {
212
212
  const found = myConfig.config.find(d => d.autoOnID === id);
213
213
  if (found && id === myConfig.config[found.sprinkleID].autoOnID) { myConfig.config[found.sprinkleID].autoOn = state.val; }
214
214
  }
215
- // Change in outside temperature => Änderung der Außentemperatur
215
+ // Change in outside temperature Änderung der Außentemperatur
216
216
  if (id === adapter.config.sensorOutsideTemperature) { /*Temperatur*/
217
217
  if (!Number.isNaN(Number.parseFloat(state.val))) {
218
218
  evaporation.setCurTemperature(parseFloat(state.val), state.ts);
219
219
  } else {
220
- adapter.log.warn('sensorOutsideTemperature => Wrong value: '+ state.val + ', Type: ' + typeof state.val);
220
+ adapter.log.warn(`sensorOutsideTemperature => Wrong value: ${state.val}, Type: ${typeof state.val}`);
221
221
  }
222
222
  }
223
223
  // LuftFeuchtigkeit
@@ -225,7 +225,7 @@ function startAdapter(options) {
225
225
  if (!Number.isNaN(Number.parseFloat(state.val))) {
226
226
  evaporation.setCurHumidity(parseFloat(state.val), state.lc);
227
227
  } else {
228
- adapter.log.warn('sensorOutsideHumidity => Wrong value: '+ state.val + ', Type: ' + typeof state.val);
228
+ adapter.log.warn(`sensorOutsideHumidity => Wrong value: ${state.val}, Type: ${typeof state.val}`);
229
229
  }
230
230
  }
231
231
  // Helligkeit
@@ -233,7 +233,7 @@ function startAdapter(options) {
233
233
  if (!Number.isNaN(Number.parseFloat(state.val))) {
234
234
  evaporation.setCurIllumination(parseFloat(state.val), state.lc);
235
235
  } else {
236
- adapter.log.warn('sensorBrightness => Wrong value: '+ state.val + ', Type: ' + typeof state.val);
236
+ adapter.log.warn(`sensorBrightness => Wrong value: ${state.val}, Type: ${typeof state.val}`);
237
237
  }
238
238
  }
239
239
  // Windgeschwindigkeit
@@ -241,7 +241,7 @@ function startAdapter(options) {
241
241
  if (!Number.isNaN(Number.parseFloat(state.val))) {
242
242
  evaporation.setCurWindSpeed(parseFloat(state.val), state.lc);
243
243
  } else {
244
- adapter.log.warn('sensorWindSpeed => Wrong value: '+ state.val + ', Type: ' + typeof state.val);
244
+ adapter.log.warn(`sensorWindSpeed => Wrong value: ${state.val}, Type: ${typeof state.val}`);
245
245
  }
246
246
  }
247
247
  // Regencontainer
@@ -251,7 +251,7 @@ function startAdapter(options) {
251
251
  if (!Number.isNaN(Number.parseFloat(state.val))) {
252
252
  evaporation.setCurAmountOfRain(parseFloat(state.val));
253
253
  } else {
254
- adapter.log.warn('sensorRainfall => Wrong value: '+ state.val + ', Type: ' + typeof state.val);
254
+ adapter.log.warn(`sensorRainfall => Wrong value: ${state.val}, Type: ${typeof state.val}`);
255
255
  }
256
256
  }
257
257
  // Feiertagskalender
@@ -294,45 +294,46 @@ function startAdapter(options) {
294
294
  valveControl.setFillLevelCistern(parseFloat(state.val) || 0);
295
295
  //fillLevelCistern = state.val || 0;
296
296
  }
297
- } else {
298
- // The state was deleted
299
- adapter.log.info(`state ${id} deleted`);
300
297
  }
301
298
  });
302
299
  }
303
300
 
304
301
  // +++++++++++++++++ Get longitude an latitude from system config ++++++++++++++++++++
305
- function GetSystemData() {
306
- /**get longitude/latitude from system if not set or not valid
307
- * do not change if we have already a valid value
308
- * so we could use different settings compared to system if necessary
309
- * >>>
310
- * Längen- / Breitengrad vom System abrufen, falls nicht festgelegt oder ungültig
311
- * Ändern Sie nicht, wenn wir bereits einen gültigen Wert haben
312
- * Daher können wir bei Bedarf andere Einstellungen als das System verwenden
313
- */
302
+ /**get longitude/latitude from system if not set or not valid
303
+ * do not change if we have already a valid value
304
+ * so we could use different settings compared to system if necessary
305
+ * >>>
306
+ * Längen- / Breitengrad vom System abrufen, falls nicht festgelegt oder ungültig
307
+ * wird nicht geändert, wenn bereits ein gültiger Wert vorhanden ist,
308
+ * daher können wir bei Bedarf andere Einstellungen als das System verwenden
309
+ */
310
+ async function GetSystemData() {
314
311
  if (typeof adapter.config.longitude === undefined || adapter.config.longitude == null || adapter.config.longitude.length === 0 || isNaN(adapter.config.longitude)
315
312
  || typeof adapter.config.latitude === undefined || adapter.config.latitude == null || adapter.config.latitude.length === 0 || isNaN(adapter.config.latitude)) {
316
313
 
317
- adapter.log.debug('longitude/longitude not set, get data from system ' + typeof adapter.config.longitude + ' ' + adapter.config.longitude + '/' + typeof adapter.config.latitude + ' ' + adapter.config.latitude);
314
+ try {
315
+ const obj = await adapter.getForeignObjectAsync('system.config');
316
+
317
+ if (obj && obj.common && obj.common.longitude && obj.common.latitude) {
318
+ adapter.config.longitude = obj.common.longitude;
319
+ adapter.config.latitude = obj.common.latitude;
318
320
 
319
- adapter.getForeignObject('system.config', (err, state) => {
320
- if (err) {
321
- adapter.log.error(err);
321
+ adapter.log.debug(`longitude: ${adapter.config.longitude} | latitude: ${adapter.config.latitude}`);
322
322
  } else {
323
- adapter.config.longitude = state.common.longitude;
324
- adapter.config.latitude = state.common.latitude;
325
- adapter.log.info('system longitude ' + adapter.config.longitude + ' latitude ' + adapter.config.latitude);
323
+ adapter.log.error('system settings cannot be called up. Please check configuration!');
326
324
  }
327
- });
325
+ } catch (err) {
326
+ adapter.log.warn('system settings cannot be called up. Please check configuration!');
327
+ }
328
328
  }
329
329
  }
330
330
 
331
+
331
332
  /**
332
- * Schreiben des nächsten Starts in .actualSoilMoisture
333
+ * Schreiben des nächsten Starts in '.actualSoilMoisture'
333
334
  * oder Rückgabe des DayName für den nächsten Start
334
335
  * @param {number} sprinkleID - Number of Array[0...]
335
- * @param {boolean} returnOn - true = Rückgabe des Wochentags; false = Schreiben in State .actualSoilMoisture
336
+ * @param {boolean} returnOn - true = Rückgabe des Wochentags; false = Schreiben in State /.actualSoilMoisture
336
337
  * @returns {string} nextStart ['Sun','Mon','Tue','Wed','Thur','Fri','Sat']
337
338
  */
338
339
  function curNextFixDay (sprinkleID, returnOn) {
@@ -360,7 +361,7 @@ function curNextFixDay (sprinkleID, returnOn) {
360
361
  //
361
362
  /**
362
363
  * Sets the status at start to a defined value
363
- * => Setzt den Status beim Start auf einen definierten Wert
364
+ * Setzt den Status beim Start auf einen definierten Wert
364
365
  */
365
366
  function checkStates() {
366
367
  //
@@ -416,123 +417,126 @@ function checkStates() {
416
417
  /**
417
418
  * aktuelle States checken nach dem Start (2000 ms) wenn alle Sprenger-Kreise angelegt wurden
418
419
  */
419
- function checkActualStates () {
420
- /**
421
- * switch Holiday
422
- * @param {string|null} err
423
- * @param {ioBroker.State|null|undefined} state
424
- */
425
- adapter.getState('control.Holiday', (err, state) => {
426
- if (state) {
427
- holidayStr = state.val;
428
- }
429
- });
420
+ async function checkActualStates () {
430
421
 
431
- /**
432
- * switch autoOnOff
433
- * @param {string|null} err
434
- * @param {ioBroker.State|null|undefined} state
435
- */
436
- adapter.getState('control.autoOnOff', (err, state) => {
437
- if (state) {
438
- autoOnOffStr = state.val;
439
- }
440
- });
441
-
442
- //
443
- if (adapter.config.publicHolidays === true && (adapter.config.publicHolInstance !== 'none' || adapter.config.publicHolInstance !== '')) {
422
+ try {
444
423
  /**
445
- * Feiertag HEUTE
446
- * @param {string|null} err
447
- * @param {ioBroker.State|null|undefined} state
424
+ * switch Holiday
425
+ * @type {ioBroker.GetStatePromise}
426
+ * @private {obj} _holiday
448
427
  */
449
- adapter.getForeignState(adapter.config.publicHolInstance + '.heute.boolean', (err, state) => {
450
- if (state) {
451
- publicHolidayStr = state.val;
428
+ const _holiday = await adapter.getStateAsync('control.Holiday');
429
+ if (_holiday && _holiday.val) {
430
+ holidayStr = _holiday.val;
452
431
  }
453
- });
432
+
454
433
  /**
455
- * Feiertag MORGEN
456
- * @param {string|null} err
457
- * @param {ioBroker.State|null|undefined} state
434
+ * switch autoOnOff
435
+ * @type {ioBroker.GetStatePromise}
436
+ * @private {obj} _autoOnOff
458
437
  */
459
- adapter.getForeignState(adapter.config.publicHolInstance + '.morgen.boolean', (err, state) => {
460
- if (state) {
461
- publicHolidayTomorrowStr = state.val;
438
+ const _autoOnOff = await adapter.getStateAsync('control.autoOnOff');
439
+ if (_autoOnOff && _autoOnOff.val) {
440
+ autoOnOffStr = _autoOnOff.val;
462
441
  }
463
- });
464
- }
465
442
 
466
- if (adapter.config.weatherForecast === true && (adapter.config.weatherForInstance !== 'none' || adapter.config.weatherForInstance !== '')) {
467
- /**
468
- * Niederschlagsmenge HEUTE in mm
469
- * @param {string|null} err
470
- * @param {ioBroker.State|null|undefined} state
471
- */
472
- adapter.getForeignState(adapter.config.weatherForInstance + '.NextDaysDetailed.Location_1.Day_1.rain_value', (err, state) => {
473
- if (state) {
474
- if (typeof state.val == 'string') {
475
- weatherForecastTodayNum = parseFloat(state.val);
476
- } else if (typeof state.val == 'number') {
477
- weatherForecastTodayNum = state.val;
478
- } else {
479
- weatherForecastTodayNum = 0;
480
- console.log.info('checkActualStates => Wettervorhersage state.val ( ' + state.val + '; ' + typeof state.val + ' ) kann nicht als Number verarbeitet werden');
443
+ if (adapter.config.publicHolidays === true && (adapter.config.publicHolInstance !== 'none' || adapter.config.publicHolInstance !== '')) {
444
+ /**
445
+ * Feiertag Heute
446
+ * @type {ioBroker.State | void}
447
+ * @private
448
+ */
449
+ const _publicHolInstanceHeute = await adapter.getForeignStateAsync(
450
+ adapter.config.publicHolInstance + '.heute.boolean'
451
+ ).catch((e) => adapter.log.warn(e));
452
+ if (_publicHolInstanceHeute && _publicHolInstanceHeute.val) {
453
+ publicHolidayStr = _publicHolInstanceHeute.val;
454
+ }
455
+ /**
456
+ * Feiertag MORGEN
457
+ * @type {ioBroker.State | void}
458
+ * @private
459
+ */
460
+ const _publicHolInstanceMorgen = await adapter.getForeignStateAsync(
461
+ adapter.config.publicHolInstance + '.morgen.boolean'
462
+ ).catch((e) => adapter.log.warn(e));
463
+ if (_publicHolInstanceMorgen && _publicHolInstanceMorgen.val) {
464
+ publicHolidayTomorrowStr = _publicHolInstanceMorgen.val;
481
465
  }
482
- adapter.setState('info.rainToday', {
483
- val: weatherForecastTodayNum,
484
- ack: true
485
- });
466
+ }
467
+
468
+ if (adapter.config.weatherForecast === true && (adapter.config.weatherForInstance !== 'none' || adapter.config.weatherForInstance !== '')) {
469
+ /**
470
+ * Niederschlagsmenge HEUTE in mm
471
+ * @type {ioBroker.State | void}
472
+ * @private
473
+ */
474
+ const _weatherForInstanceToday = await adapter.getForeignStateAsync(
475
+ adapter.config.weatherForInstance + '.NextDaysDetailed.Location_1.Day_1.rain_value'
476
+ ).catch((e) => adapter.log.warn(e));
477
+ if (_weatherForInstanceToday && _weatherForInstanceToday.val) {
478
+ if (typeof _weatherForInstanceToday.val == 'string') {
479
+ weatherForecastTodayNum = parseFloat(_weatherForInstanceToday.val);
480
+ } else if (typeof _weatherForInstanceToday.val == 'number') {
481
+ weatherForecastTodayNum = _weatherForInstanceToday.val;
482
+ } else {
483
+ weatherForecastTodayNum = 0;
484
+ console.log.info('checkActualStates => Wettervorhersage state.val ( ' + _weatherForInstanceToday.val + '); ' + typeof _weatherForInstanceToday.val + ' kann nicht als Number verarbeitet werden');
485
+ }
486
+ await adapter.setStateAsync('info.rainToday',
487
+ weatherForecastTodayNum,
488
+ true
489
+ );
490
+ }
491
+
492
+ /**
493
+ * Niederschlagsmenge MORGEN in mm
494
+ * @type {ioBroker.State | void}
495
+ * @private
496
+ */
497
+ const _weatherForInstance = await adapter.getForeignStateAsync(
498
+ adapter.config.weatherForInstance + '.NextDaysDetailed.Location_1.Day_2.rain_value'
499
+ ).catch((e) => adapter.log.warn(e));
500
+ if (_weatherForInstance && _weatherForInstance.val) {
501
+ weatherForecastTomorrowNum = _weatherForInstance.val;
502
+ await adapter.setStateAsync(
503
+ 'info.rainTomorrow',
504
+ weatherForecastTomorrowNum,
505
+ true
506
+ );
486
507
  }
487
- });
508
+ }
509
+ if (adapter.config.actualValueLevel){
510
+ /**
511
+ * Füllstand der Zisterne in %
512
+ * @type {ioBroker.State | void}
513
+ * @private
514
+ */
515
+ const _actualValueLevel = await adapter.getForeignStateAsync(
516
+ adapter.config.actualValueLevel
517
+ ).catch((e) => adapter.log.warn(e));
518
+ if (_actualValueLevel && typeof _actualValueLevel.val !== undefined) {
519
+ valveControl.setFillLevelCistern(parseFloat(_actualValueLevel.val));
520
+ }
521
+ }
488
522
  /**
489
- * Niederschlagsmenge MORGEN in mm
490
- * @param {string|null} err
491
- * @param {ioBroker.State|null|undefined} state
523
+ * return the saved objects under sprinkle.*
524
+ * rückgabe der gespeicherten Objekte unter sprinkle.*
525
+ * @type {ioBroker.NonNullCallbackReturnTypeOf<(err?: (Error | null), objects?: Record<string, ioBroker.AnyObject & {type: "channel"}>) => void> | void}
526
+ * @private
492
527
  */
493
- adapter.getForeignState(adapter.config.weatherForInstance, (err, state) => {
494
- if (state) {
495
- weatherForecastTomorrowNum = state.val;
496
- adapter.setState('info.rainTomorrow', {
497
- val: weatherForecastTomorrowNum,
498
- ack: true
499
- });
528
+ const _list = await adapter.getForeignObjectsAsync(adapter.namespace + '.sprinkle.*', 'channel').catch((e) => adapter.log.warn(e));
529
+ if (_list) {
530
+ ObjSprinkle = _list;
531
+ await createSprinklers();
532
+ await sleep(100);
533
+ startTimeSprinkle();
500
534
  }
501
- });
502
- }
503
535
 
504
- /**
505
- * Füllstand der Zisterne in %
506
- * @param {string|null} err
507
- * @param {ioBroker.State|null|undefined} state
508
- */
509
- adapter.getForeignState(adapter.config.actualValueLevel, (err, state) => {
510
- if (typeof state !== undefined && state != null) {
511
- valveControl.setFillLevelCistern(parseFloat(state.val));
512
- }
513
- });
536
+ } catch (e) {
537
+ adapter.log.warn(`sprinkleControl cannot check actual States ... Please check your sprinkleControl states: ${e}`);
538
+ }
514
539
 
515
- /**
516
- * rückgabe der gespeicherten Objekte unter sprinkle.*
517
- * @param {string|null} err
518
- * @param {Object|undefined} list
519
- */
520
- adapter.getForeignObjects(adapter.namespace + '.sprinkle.*', 'channel',
521
- function (err, list) {
522
- if (err) {
523
- adapter.log.error(err);
524
- } else {
525
- ObjSprinkle = list;
526
- }
527
- });
528
-
529
- //
530
- setTimeout(()=>{
531
- createSprinklers();
532
- },1000);
533
- setTimeout(() => {
534
- startTimeSprinkle();
535
- }, 2000);
536
540
  }
537
541
 
538
542
 
@@ -546,8 +550,8 @@ const calcPos = schedule.scheduleJob('calcPosTimer', '5 0 * * *', function() {
546
550
  sunPos();
547
551
  today = formatTime(adapter,'', 'day');
548
552
 
549
- // History Daten aktualisieren wenn eine neue Woche beginnt
550
- if (adapter.config.debug) {adapter.log.info('calcPos 0:05 old-KW: ' + kwStr + ' new-KW: ' + formatTime(adapter, '','kW') + ' if: ' + (kwStr !== formatTime(adapter, '','kW')));}
553
+ // History Daten aktualisieren, wenn eine neue Woche beginnt
554
+ adapter.log.debug(`calcPos 0:05 old-KW: ${kwStr} new-KW: ${formatTime(adapter, '','kW')} if: ${(kwStr !== formatTime(adapter, '','kW'))}`);
551
555
  if (kwStr !== formatTime(adapter, '','kW')) {
552
556
  const result = myConfig.config;
553
557
  if (result) {
@@ -576,7 +580,7 @@ const calcPos = schedule.scheduleJob('calcPosTimer', '5 0 * * *', function() {
576
580
  // ETpToday und ETpYesterday in evaporation aktualisieren da ein neuer Tag
577
581
  evaporation.setNewDay();
578
582
 
579
- // Startzeit Festlegen => verzögert wegen Daten von SunCalc
583
+ // Startzeit Festlegen verzögert wegen Daten von SunCalc
580
584
  setTimeout(() => {
581
585
  startTimeSprinkle();
582
586
  },1000);
@@ -585,10 +589,10 @@ const calcPos = schedule.scheduleJob('calcPosTimer', '5 0 * * *', function() {
585
589
 
586
590
  // Berechnung mittels sunCalc
587
591
  function sunPos() {
588
- // get today's sunlight times => Holen Sie sich die heutige Sonnenlicht Zeit
592
+ // get today's sunlight times Holen Sie sich die heutige Sonnenlichtzeit
589
593
  const times = SunCalc.getTimes(new Date(), adapter.config.latitude, adapter.config.longitude);
590
594
 
591
- // format sunrise time from the Date object => Formatieren Sie die Sonnenaufgangszeit aus dem Date-Objekt
595
+ // format sunrise time from the Date object Formatieren Sie die Sonnenaufgangszeit aus dem Date-Objekt
592
596
  sunriseStr = ('0' + times.sunrise.getHours()).slice(-2) + ':' + ('0' + times.sunrise.getMinutes()).slice(-2);
593
597
 
594
598
  // format golden hour end time from the Date object => Formatiere golden hour end time aus dem Date-Objekt
@@ -606,14 +610,17 @@ function startTimeSprinkle() {
606
610
 
607
611
  // if autoOnOff == false => keine auto Start
608
612
  if (!autoOnOffStr) {
609
- if (adapter.config.debug) {adapter.log.info('Sprinkle: autoOnOff == Aus(' + autoOnOffStr + ')');}
610
- adapter.setState('info.nextAutoStart', { val: 'autoOnOff = off(0)', ack: true });
613
+ adapter.log.info(`Sprinkle: autoOnOff == Aus( ${autoOnOffStr} )`);
614
+ adapter.setState('info.nextAutoStart', {
615
+ val: 'autoOnOff = off(0)',
616
+ ack: true
617
+ });
611
618
  return;
612
619
  }
613
620
 
614
621
  /**
615
622
  * next start time (automatic)
616
- * => Berechnung des nächsten Starts (Automatik)
623
+ * Berechnung des nächsten Starts (Automatik)
617
624
  * @returns {string}
618
625
  */
619
626
  function nextStartTime () {
@@ -656,12 +663,12 @@ function startTimeSprinkle() {
656
663
  newStartTime = goldenHourEnd;
657
664
  break;
658
665
  }
659
- // Start am Wochenende => wenn andere Zeiten verwendet werden soll
666
+ // Start am Wochenende →, wenn andere Zeiten verwendet werden soll
660
667
  if((adapter.config.publicWeekend) && ((myWeekday) === 6 || (myWeekday) === 0)){
661
668
  infoMessage = 'Start am Wochenende ';
662
669
  newStartTime = adapter.config.weekEndLiving;
663
670
  }
664
- // Start an Feiertagen => wenn Zeiten des Wochenendes verwendet werden soll
671
+ // Start an Feiertagen →, wenn Zeiten des Wochenendes verwendet werden soll
665
672
  if((adapter.config.publicHolidays) && (adapter.config.publicWeekend)
666
673
  && (((publicHolidayStr === true) && (run === 1)) // heute Feiertag && erster Durchlauf
667
674
  || ((publicHolidayTomorrowStr === true) && (run === 2)) // morgen Feiertag && zweiter Durchlauf
@@ -688,7 +695,7 @@ function startTimeSprinkle() {
688
695
  if(!sendMessageText.onlySendError){
689
696
  sendMessageText.sendMessage(infoMessage + '(' + myWeekdayStr[myWeekday] + ') um ' + newStartTime);
690
697
  }
691
- adapter.log.info(infoMessage + '(' + myWeekdayStr[myWeekday] + ') um ' + newStartTime);
698
+ adapter.log.info(`${infoMessage} (${myWeekdayStr[myWeekday]}) um ${newStartTime}`);
692
699
  }
693
700
  }
694
701
  });
@@ -711,8 +718,8 @@ function startTimeSprinkle() {
711
718
  /**
712
719
  * result Rain
713
720
  * - (aktuelle Wettervorhersage - Schwellwert der Regenberücksichtigung) wenn Sensor sich im Freien befindet
714
- * - (> 0) es Regnet - Abbruch -
715
- * - (<= 0) Start der Bewässerung
721
+ * - (> 0) es regnet - Abbruch -
722
+ * - ( 0) Start der Bewässerung
716
723
  * @param {boolean} inGreenhouse - Sensor befindet sich im Gewächshaus
717
724
  * @returns {number} - resultierende Regenmenge
718
725
  */
@@ -738,7 +745,7 @@ function startTimeSprinkle() {
738
745
  }
739
746
 
740
747
  // Test Bodenfeuchte
741
- if (adapter.config.debug) {adapter.log.info('Bodenfeuchte: ' + res.soilMoisture.val + ' <= ' + res.soilMoisture.triggersIrrigation + ' AutoOn: ' + res.autoOn);}
748
+ adapter.log.debug(`Bodenfeuchte: ${res.soilMoisture.val} <= ${res.soilMoisture.triggersIrrigation} AutoOn: ${res.autoOn}`);
742
749
  if (res.autoOn) {
743
750
  switch (res.methodControlSM) {
744
751
  // -- bistable -- Bodenfeuchte-Sensor mit 2-Punkt-Regler true und false -- //
@@ -756,7 +763,7 @@ function startTimeSprinkle() {
756
763
  } else if (adapter.config.weatherForecast) {
757
764
  /* Bewässerung unterdrückt da ausreichende Regenvorhersage */
758
765
  messageText += ' ' + '<i>' + 'Start verschoben, da heute ' + weatherForecastTodayNum + 'mm Niederschlag' + '</i> ' + '\n';
759
- adapter.log.info(res.objectName + ': Start verschoben, da Regenvorhersage für Heute ' + weatherForecastTodayNum +' mm [ ' + resRain(res.inGreenhouse) + ' > 0 ]');
766
+ adapter.log.info(`${res.objectName}: Start verschoben, da Regenvorhersage für Heute ${weatherForecastTodayNum} mm [ ${resRain(res.inGreenhouse)} > 0 ]`);
760
767
  }
761
768
  }
762
769
  break;
@@ -778,7 +785,7 @@ function startTimeSprinkle() {
778
785
  } else if (adapter.config.weatherForecast) {
779
786
  /* Bewässerung unterdrückt da ausreichende Regenvorhersage */
780
787
  messageText += ' ' + '<i>' + 'Start verschoben, da heute ' + weatherForecastTodayNum + 'mm Niederschlag' + '</i> ' + '\n';
781
- adapter.log.info(res.objectName + ': Start verschoben, da Regenvorhersage für Heute ' + weatherForecastTodayNum +' mm [ ' + resRain(res.inGreenhouse) + ' > 0 ]');
788
+ adapter.log.info(`${res.objectName}: Start verschoben, da Regenvorhersage für Heute ${weatherForecastTodayNum} mm [ ${resRain(res.inGreenhouse)} > 0 ]`);
782
789
  }
783
790
  }
784
791
  break;
@@ -804,7 +811,7 @@ function startTimeSprinkle() {
804
811
  }
805
812
  } else if (adapter.config.weatherForecast){
806
813
  messageText += ' ' + '<i>' + 'Start verschoben, da heute ' + weatherForecastTodayNum + 'mm Niederschlag' + '</i> ' + '\n';
807
- adapter.log.info(res.objectName + ': Start verschoben, da Regenvorhersage für Heute ' + weatherForecastTodayNum +' mm [ ' + resRain(false) + ' > 0 ]');
814
+ adapter.log.info(`${res.objectName}: Start verschoben, da Regenvorhersage für Heute ${weatherForecastTodayNum} mm [ ${resRain(false)} > 0 ]`);
808
815
  res.startFixDay[today] = false;
809
816
  res.startFixDay[(+ today + 1 > 6) ? (+ today-6) : (+ today+1)] = true;
810
817
  }
@@ -830,7 +837,7 @@ function startTimeSprinkle() {
830
837
  } else if (adapter.config.weatherForecast) {
831
838
  /* Bewässerung unterdrückt da ausreichende Regenvorhersage */
832
839
  messageText += ' ' + '<i>' + 'Start verschoben, da heute ' + weatherForecastTodayNum + 'mm Niederschlag' + '</i> ' + '\n';
833
- adapter.log.info(res.objectName + ': Start verschoben, da Regenvorhersage für Heute ' + weatherForecastTodayNum +' mm [ ' + res.soilMoisture.val + ' (' + resMoisture + ') <= ' + res.soilMoisture.triggersIrrigation + ' ]');
840
+ adapter.log.info(`${res.objectName}: Start verschoben, da Regenvorhersage für Heute ${weatherForecastTodayNum} mm [ ${res.soilMoisture.val} (${resMoisture}) <= ${res.soilMoisture.triggersIrrigation} ]`);
834
841
  }
835
842
  }
836
843
  break;
@@ -854,466 +861,529 @@ function startTimeSprinkle() {
854
861
  }
855
862
 
856
863
  //
857
- function createSprinklers() {
864
+ async function createSprinklers() {
858
865
  const result = adapter.config.events;
859
866
  if (result) {
860
867
  for(const res of result) {
861
- const objectName = res.sprinkleName.replace(/[.;, ]/g, '_');
868
+ let objectName;
869
+
870
+ if(res.sprinkleName !== '') {
871
+ objectName = res.sprinkleName.replace(/[.;, ]/g, '_');
872
+ } else if (res.sprinkleName === '') {
873
+ objectName = res.name.replace(/[.;, ]/g, '_');
874
+ }
875
+
862
876
  const objPfad = 'sprinkle.' + objectName;
863
877
  const j = myConfig.config.findIndex(d => d.objectName === objectName);
864
- // Create Object for sprinklers (ID)
865
- adapter.setObjectNotExists('sprinkle.' + objectName, {
866
- 'type': 'channel',
867
- 'common': {
868
- 'name': res.sprinkleName
869
- },
870
- 'native': {},
871
- });
872
- // Create Object for sprinklers (ID)
873
- adapter.setObjectNotExists('sprinkle.' + objectName + '.history', {
874
- 'type': 'channel',
875
- 'common': {
876
- 'name': res.sprinkleName + ' => History'
877
- },
878
- 'native': {},
879
- });
880
- // actual soil moisture
881
- // Create bzw. update .actualSoilMoisture nach der Sensorart
882
- /**
883
- * Aufbau des Objects .actualSoilMoisture
884
- * @type {Object}
885
- */
886
- let myObj = {};
887
- /** @type {string} */
888
- let objName;
889
-
890
- switch (res.methodControlSM) {
891
- case 'calculation':
892
- objName = objectName + ' => Calculated soil moisture in %';
893
- myObj = {
878
+
879
+ // Create bzw. update .actualSoilMoisture
880
+
881
+ let nameMetConSM, objMetConSM;
882
+ await fillMetConSM(res);
883
+ function fillMetConSM(res) {
884
+ //adapter.log.debug(JSON.stringify(res));
885
+ switch (res.methodControlSM) {
886
+ case 'calculation':
887
+ nameMetConSM = objectName + ' => Calculated soil moisture in %';
888
+ objMetConSM = {
889
+ 'type': 'state',
890
+ 'common': {
891
+ 'role': 'state',
892
+ 'name': nameMetConSM,
893
+ 'type': 'number',
894
+ 'min': 0,
895
+ 'max': 150,
896
+ 'unit': '%',
897
+ 'read': true,
898
+ 'write': false,
899
+ 'def': 50
900
+ },
901
+ 'native': {},
902
+ };
903
+ break;
904
+ case 'bistable':
905
+ nameMetConSM = objectName + ' => bistable soil moisture sensor';
906
+ objMetConSM = {
907
+ 'type': 'state',
908
+ 'common': {
909
+ 'role': 'state',
910
+ 'name': nameMetConSM,
911
+ 'type': 'boolean',
912
+ 'read': true,
913
+ 'write': false,
914
+ 'def': false
915
+ },
916
+ 'native': {},
917
+ };
918
+ break;
919
+ case 'analog':
920
+ nameMetConSM = objectName + ' => analog soil moisture sensor in %';
921
+ objMetConSM = {
922
+ 'type': 'state',
923
+ 'common': {
924
+ 'role': 'state',
925
+ 'name': nameMetConSM,
926
+ 'type': 'number',
927
+ 'min': 0,
928
+ 'max': 150,
929
+ 'unit': '%',
930
+ 'read': true,
931
+ 'write': false
932
+ },
933
+ 'native': {},
934
+ };
935
+ break;
936
+ case 'fixDay':
937
+ nameMetConSM = objectName + ' => start on a fixed day';
938
+ objMetConSM = {
939
+ 'type': 'state',
940
+ 'common': {
941
+ 'role': 'state',
942
+ 'name': nameMetConSM,
943
+ 'type': 'number',
944
+ 'min': 0,
945
+ 'max': 7,
946
+ 'states': {"0":"Sun", "1":"Mon", "2":"Tue", "3":"Wed", "4":"Thur", "5":"Fri", "6":"Sat", "7":"off"},
947
+ 'read': true,
948
+ 'write': false,
949
+ 'def': 7
950
+ },
951
+ 'native': {},
952
+ };
953
+ break;
954
+ default:
955
+ adapter.log.warn(`sprinkleControl cannot created ... Please check your sprinkleControl config ${objectName} methodControl`);
956
+ }
957
+ }
958
+ // ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ //
959
+ // +++++ Objekte erstellen +++++ //
960
+ // ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ //
961
+ if (objectName && objectName !== '') {
962
+ try {
963
+ // Create Object for sprinkle. (ID)
964
+ const _sprinkleNotExist = await adapter.setObjectNotExistsAsync('sprinkle.' + objectName, {
965
+ 'type': 'channel',
966
+ 'common': {
967
+ 'name': res.sprinkleName
968
+ },
969
+ 'native': {},
970
+ }).catch((e) => adapter.log.warn(`sprinkle.${objectName} ${e}`));
971
+ // Create Object for .history
972
+ const _historyNotExist = await adapter.setObjectNotExistsAsync('sprinkle.' + objectName + '.history', {
973
+ 'type': 'channel',
974
+ 'common': {
975
+ 'name': res.sprinkleName + ' => History'
976
+ },
977
+ 'native': {},
978
+ }).catch((e) => adapter.log.warn(`${objectName}.history ${e}`));
979
+ // Create Object for .history.curCalWeekConsumed
980
+ // Sprinkler consumption of the current calendar week => History - Sprinkler-Verbrauch der aktuellen Kalenderwoche (783 Liter)
981
+ const _curCalWeekConsumedNotExist = adapter.setObjectNotExistsAsync(objPfad + '.history.curCalWeekConsumed', {
894
982
  'type': 'state',
895
983
  'common': {
896
- 'role': 'state',
897
- 'name': objName,
898
- 'type': 'number',
899
- 'min': 0,
900
- 'max': 150,
901
- 'unit': '%',
902
- 'read': true,
903
- 'write': false
984
+ 'role': 'state',
985
+ 'name': objectName + ' => History - Sprinkler consumption of the current calendar week',
986
+ 'type': 'number',
987
+ 'unit': 'Liter',
988
+ 'read': true,
989
+ 'write': false,
990
+ 'def': 0
904
991
  },
905
992
  'native': {},
906
- };
907
- break;
908
- case 'bistable':
909
- objName = objectName + ' => bistable soil moisture sensor';
910
- myObj = {
993
+ }).catch((e) => adapter.log.warn(`${objectName}.curCalWeekConsumed ${e}`));
994
+ // Create Object for .history.curCalWeekRunningTime
995
+ // Sprinkler running time of the current calendar week => History - Sprinkler-Laufzeit der aktuellen Kalenderwoche (783 Liter)
996
+ const _curCalWeekRunningTimeNotExist = adapter.setObjectNotExistsAsync(objPfad + '.history.curCalWeekRunningTime', {
911
997
  'type': 'state',
912
998
  'common': {
913
- 'role': 'state',
914
- 'name': objName,
915
- 'type': 'boolean',
916
- 'read': true,
999
+ 'role': 'state',
1000
+ 'name': objectName + ' => History - Sprinkler running time of the current calendar week',
1001
+ 'type': 'string',
1002
+ 'read': true,
917
1003
  'write': false,
918
- 'def': false
1004
+ 'def': '00:00'
919
1005
  },
920
1006
  'native': {},
921
- };
922
- break;
923
- case 'analog':
924
- objName = objectName + ' => analog soil moisture sensor in %';
925
- myObj = {
1007
+ }).catch((e) => adapter.log.warn(`${objectName}.curCalWeekRunningTime ${e}`));
1008
+ // Create Object for .history.lastCalWeekConsumed
1009
+ // Sprinkler consumption of the last calendar week => History - Sprinkler-Verbrauch der letzten Kalenderwoche (783 Liter)
1010
+ const _lastCalWeekConsumedNotExist = adapter.setObjectNotExistsAsync(objPfad + '.history.lastCalWeekConsumed', {
1011
+ 'type': 'state',
1012
+ 'common': {
1013
+ 'role': 'state',
1014
+ 'name': objectName + ' => History - Sprinkler consumption of the last calendar week',
1015
+ 'type': 'number',
1016
+ 'unit': 'Liter',
1017
+ 'read': true,
1018
+ 'write': false,
1019
+ 'def': 0
1020
+ },
1021
+ 'native': {},
1022
+ }).catch((e) => adapter.log.warn(`${objectName}.lastCalWeekConsumed ${e}`));
1023
+ // Create Object for .history.lastCalWeekRunningTime
1024
+ // Sprinkler running time of the last calendar week => History - Sprinkler-Laufzeit der letzten Kalenderwoche (783 Liter)
1025
+ const _lastCalWeekRunningTimeNotExist = adapter.setObjectNotExistsAsync(objPfad + '.history.lastCalWeekRunningTime', {
926
1026
  'type': 'state',
927
1027
  'common': {
928
- 'role': 'state',
929
- 'name': objName,
930
- 'type': 'number',
931
- 'min': 0,
932
- 'max': 150,
933
- 'unit': '%',
934
- 'read': true,
935
- 'write': false
1028
+ 'role': 'state',
1029
+ 'name': objectName + ' => History - Sprinkler running time of the last calendar week',
1030
+ 'type': 'string',
1031
+ 'read': true,
1032
+ 'write': false,
1033
+ 'def': '00:00'
936
1034
  },
937
1035
  'native': {},
938
- };
939
- break;
940
- case 'fixDay':
941
- objName = objectName + ' => start on a fixed day';
942
- myObj = {
1036
+ }).catch((e) => adapter.log.warn(`${objectName}.curCalWeekRunningTime ${e}`));
1037
+ // Create Object for .history.lastConsumed
1038
+ // Last consumed of sprinkler => History - Letzte Verbrauchsmenge des Ventils (783 Liter)
1039
+ const _lastConsumedNotExist = adapter.setObjectNotExistsAsync(objPfad + '.history.lastConsumed', {
943
1040
  'type': 'state',
944
1041
  'common': {
945
1042
  'role': 'state',
946
- 'name': objName,
1043
+ 'name': objectName + ' => History - Last consumed of sprinkler',
947
1044
  'type': 'number',
948
- 'min': 0,
949
- 'max': 7,
950
- 'states': '0:Sun;1:Mon;2:Tue;3:Wed;4:Thur;5:Fri;6:Sat;7:off',
1045
+ 'unit': 'Liter',
951
1046
  'read': true,
952
1047
  'write': false,
953
- 'def': 7
1048
+ 'def': 0
954
1049
  },
955
1050
  'native': {},
956
- };
957
- break;
958
- }
959
- adapter.setObjectNotExists(objPfad + '.actualSoilMoisture', myObj);
960
- let myName;
961
- setTimeout (()=> {
962
- adapter.getObject(objPfad + '.actualSoilMoisture', function (err, obj) {
963
- if (err || !obj) {
964
- adapter.log.error(objPfad + '.actualSoilMoisture, getObject => err: ' + err);
965
- } else {
966
- if((typeof obj.common.name === 'string') && obj.common.name.length > 0) {myName = obj.common.name;}
967
- }
968
- });
969
- setTimeout(()=>{
970
- if (myName !== objName) { // bei Änderung der "Methode zur Kontrolle der Bodenfeuchtigkeit" aktualisiere das Objekt
971
- adapter.setObject(objPfad + '.actualSoilMoisture', myObj);
1051
+ }).catch((e) => adapter.log.warn(`${objectName}.lastConsumed ${e}`));
1052
+ // Create Object for .history.lastOn
1053
+ // Last On of sprinkler => History - Letzter Start des Ventils (30.03 06:30)
1054
+ const _lastOnNotExist = adapter.setObjectNotExistsAsync(objPfad + '.history.lastOn', {
1055
+ 'type': 'state',
1056
+ 'common': {
1057
+ 'role': 'state',
1058
+ 'name': objectName + ' => History - Last On of sprinkler',
1059
+ 'type': 'string',
1060
+ 'read': true,
1061
+ 'write': false,
1062
+ 'def': '-'
1063
+ },
1064
+ 'native': {},
1065
+ }).catch((e) => adapter.log.warn(`${objectName}.lastOn ${e}`));
1066
+ // Create Object for .history.lastRunningTime
1067
+ // Last running time of sprinkler => History - Letzte Laufzeit des Ventils (0 sek, 47:00 min, 1:03:45 )
1068
+ const _lastRunningTimeNotExist = adapter.setObjectNotExistsAsync(objPfad + '.history.lastRunningTime', {
1069
+ 'type': 'state',
1070
+ 'common': {
1071
+ 'role': 'state',
1072
+ 'name': objectName + ' => History - Last running time',
1073
+ 'type': 'string',
1074
+ 'read': true,
1075
+ 'write': false,
1076
+ 'def': '00:00'
1077
+ },
1078
+ 'native': {},
1079
+ }).catch((e) => adapter.log.warn(`${objectName}.lastRunningTime ${e}`));
1080
+ // Create Object for .autoOn
1081
+ const _autoOnNotExist = await adapter.setObjectNotExistsAsync(objPfad + '.autoOn', {
1082
+ 'type': 'state',
1083
+ 'common': {
1084
+ 'role': 'state',
1085
+ 'name': objectName + ' => Switch automatic mode on / off',
1086
+ 'type': 'boolean',
1087
+ 'read': true,
1088
+ 'write': true,
1089
+ 'def': true
1090
+ },
1091
+ 'native': {},
1092
+ }).catch((e) => adapter.log.warn(`${objectName}.autoOn ${e}`));
1093
+ // Create Object for .actualSoilMoisture
1094
+ const _actualSoilMoistureNotExist = await adapter.setObjectNotExistsAsync(objPfad + '.actualSoilMoisture',
1095
+ objMetConSM
1096
+ ).catch((e) => adapter.log.warn(`${objectName}.actualSoilMoisture ${e}`));
1097
+ // Create Object for .countdown => Countdown des Ventils
1098
+ const _countdownNotExist = adapter.setObjectNotExistsAsync(objPfad + '.countdown', {
1099
+ 'type': 'state',
1100
+ 'common': {
1101
+ 'role': 'state',
1102
+ 'name': objectName + ' => countdown of sprinkler',
1103
+ 'type': 'string',
1104
+ 'read': true,
1105
+ 'write': false,
1106
+ 'def': '-'
1107
+ },
1108
+ 'native': {},
1109
+ }).catch((e) => adapter.log.warn(`${objectName}.countdown ${e}`));
1110
+ // Create Object for .runningTime => Laufzeit des Ventils
1111
+ const _runningTimeNotExist = await adapter.setObjectNotExistsAsync(objPfad + '.runningTime', {
1112
+ 'type': 'state',
1113
+ 'common': {
1114
+ 'role': 'state',
1115
+ 'name': objectName + ' => running time of sprinkler',
1116
+ 'type': 'string',
1117
+ 'read': true,
1118
+ 'write': true,
1119
+ 'def': '-'
1120
+ },
1121
+ 'native': {},
1122
+ }).catch((e) => adapter.log.warn(`${objectName}.runningTime ${e}`));
1123
+ // Create Object for .sprinklerState => Zustand des Ventils im Thread
1124
+ // <<< 1 = warten >>> ( 0:off; 1:wait; 2:on; 3:break; 4:Boost(on); 5:off(Boost) )
1125
+ // Create .sprinklerState
1126
+ const _sprinklerStateNotExists = await adapter.setObjectNotExistsAsync(objPfad + '.sprinklerState', {
1127
+ 'type': 'state',
1128
+ 'common': {
1129
+ 'role': 'state',
1130
+ 'name': objectName + ' => actual state of sprinkler',
1131
+ 'type': 'number',
1132
+ 'min': 0,
1133
+ 'max': 5,
1134
+ 'states': {
1135
+ "0": "off",
1136
+ "1": "wait",
1137
+ "2": "on",
1138
+ "3": "break",
1139
+ "4": "Boost(on)",
1140
+ "5": "off(Boost)"
1141
+ },
1142
+ 'read': true,
1143
+ 'write': false,
1144
+ 'def': 0
1145
+ },
1146
+ 'native': {}
1147
+ }).catch((e) => adapter.log.warn(`${objectName}.sprinklerState ${e}`));
1148
+ // Create Object for triggerPoint → Schaltpunkt der Bodenfeuchte
1149
+ const _triggerPointNotExist = await adapter.setObjectNotExistsAsync(objPfad + '.triggerPoint', {
1150
+ 'type': 'state',
1151
+ 'common': {
1152
+ 'role': 'state',
1153
+ 'name': objectName + ' => Trigger point of sprinkler',
1154
+ 'type': 'string',
1155
+ 'read': true,
1156
+ 'write': false,
1157
+ 'def': '-'
1158
+ },
1159
+ 'native': {},
1160
+ }).catch((e) => adapter.log.warn(`${objectName}.triggerPoint ${e}`));
1161
+ // Object created
1162
+ let value = true;
1163
+ (await Promise.all([
1164
+ _sprinkleNotExist,
1165
+ _historyNotExist,
1166
+ _curCalWeekConsumedNotExist,
1167
+ _curCalWeekRunningTimeNotExist,
1168
+ _lastCalWeekConsumedNotExist,
1169
+ _lastCalWeekRunningTimeNotExist,
1170
+ _lastConsumedNotExist,
1171
+ _lastOnNotExist,
1172
+ _lastRunningTimeNotExist,
1173
+ _autoOnNotExist,
1174
+ _actualSoilMoistureNotExist,
1175
+ _countdownNotExist,
1176
+ _runningTimeNotExist,
1177
+ _sprinklerStateNotExists,
1178
+ _triggerPointNotExist
1179
+ ])).forEach((val) => {
1180
+ value += val;
1181
+ });
1182
+ if (value){
1183
+ adapter.log.info(`sprinkleControl [sprinkle.${objectName}] was created`);
972
1184
  }
973
- },200);
974
- }, 100);
975
-
976
- // Trigger point of sprinkler => Schaltpunkt der Bodenfeuchte
977
- adapter.setObjectNotExists(objPfad + '.triggerPoint', {
978
- 'type': 'state',
979
- 'common': {
980
- 'role': 'state',
981
- 'name': objectName + ' => Trigger point of sprinkler',
982
- 'type': 'string',
983
- 'read': true,
984
- 'write': false,
985
- 'def': '-'
986
- },
987
- 'native': {},
988
- });
989
- // actual state of sprinkler => Zustand des Ventils im Thread
990
- // <<< 1 = warten >>> ( 0:off; 1:wait; 2:on; 3:break; 4:Boost(on); 5:off(Boost) )
991
- // Create .sprinklerState
992
- adapter.setObjectNotExists(objPfad + '.sprinklerState', {
993
- 'type': 'state',
994
- 'common': {
995
- 'role': 'state',
996
- 'name': objectName + ' => actual state of sprinkler',
997
- 'type': 'number',
998
- 'min': 0,
999
- 'max': 5,
1000
- 'states': '0:off;1:wait;2:on;3:break;4:Boost(on);5:off(Boost)',
1001
- 'read': true,
1002
- 'write': false,
1003
- 'def': 0
1004
- },
1005
- 'native': {},
1006
- });
1007
- // running time of sprinkler => Laufzeit des Ventils
1008
- adapter.setObjectNotExists(objPfad + '.runningTime', {
1009
- 'type': 'state',
1010
- 'common': {
1011
- 'role': 'state',
1012
- 'name': objectName + ' => running time of sprinkler',
1013
- 'type': 'string',
1014
- 'read': true,
1015
- 'write': true,
1016
- 'def': '-'
1017
- },
1018
- 'native': {},
1019
- });
1020
- // countdown of sprinkler => Countdown des Ventils
1021
- adapter.setObjectNotExists(objPfad + '.countdown', {
1022
- 'type': 'state',
1023
- 'common': {
1024
- 'role': 'state',
1025
- 'name': objectName + ' => countdown of sprinkler',
1026
- 'type': 'string',
1027
- 'read': true,
1028
- 'write': false,
1029
- 'def': '-'
1030
- },
1031
- 'native': {},
1032
- });
1033
- // autoOn
1034
- adapter.setObjectNotExists(objPfad + '.autoOn', {
1035
- 'type': 'state',
1036
- 'common': {
1037
- 'role': 'state',
1038
- 'name': objectName + ' => Switch automatic mode on / off',
1039
- 'type': 'boolean',
1040
- 'read': true,
1041
- 'write': true,
1042
- 'def': true
1043
- },
1044
- 'native': {},
1045
- });
1046
- // History - Last running time of sprinkler => History - Letzte Laufzeit des Ventils (0 sek, 47:00 min, 1:03:45 )
1047
- adapter.setObjectNotExists(objPfad + '.history.lastRunningTime', {
1048
- 'type': 'state',
1049
- 'common': {
1050
- 'role': 'state',
1051
- 'name': objectName + ' => History - Last running time',
1052
- 'type': 'string',
1053
- 'read': true,
1054
- 'write': false,
1055
- 'def': '00:00'
1056
- },
1057
- 'native': {},
1058
- });
1059
- // History - Last On of sprinkler => History - Letzter Start des Ventils (30.03 06:30)
1060
- adapter.setObjectNotExists(objPfad + '.history.lastOn', {
1061
- 'type': 'state',
1062
- 'common': {
1063
- 'role': 'state',
1064
- 'name': objectName + ' => History - Last On of sprinkler',
1065
- 'type': 'string',
1066
- 'read': true,
1067
- 'write': false,
1068
- 'def': '-'
1069
- },
1070
- 'native': {},
1071
- });
1072
- // History - Last consumed of sprinkler => History - Letzte Verbrauchsmenge des Ventils (783 Liter)
1073
- adapter.setObjectNotExists(objPfad + '.history.lastConsumed', {
1074
- 'type': 'state',
1075
- 'common': {
1076
- 'role': 'state',
1077
- 'name': objectName + ' => History - Last consumed of sprinkler',
1078
- 'type': 'number',
1079
- 'unit': 'Liter',
1080
- 'read': true,
1081
- 'write': false,
1082
- 'def': 0
1083
- },
1084
- 'native': {},
1085
- });
1086
- // History - Sprinkler consumption of the current calendar week => History - Sprinkler-Verbrauch der aktuellen Kalenderwoche (783 Liter)
1087
- adapter.setObjectNotExists(objPfad + '.history.curCalWeekConsumed', {
1088
- 'type': 'state',
1089
- 'common': {
1090
- 'role': 'state',
1091
- 'name': objectName + ' => History - Sprinkler consumption of the current calendar week',
1092
- 'type': 'number',
1093
- 'unit': 'Liter',
1094
- 'read': true,
1095
- 'write': false,
1096
- 'def': 0
1097
- },
1098
- 'native': {},
1099
- });
1100
- // History - Sprinkler consumption of the last calendar week => History - Sprinkler-Verbrauch der letzten Kalenderwoche (783 Liter)
1101
- adapter.setObjectNotExists(objPfad + '.history.lastCalWeekConsumed', {
1102
- 'type': 'state',
1103
- 'common': {
1104
- 'role': 'state',
1105
- 'name': objectName + ' => History - Sprinkler consumption of the last calendar week',
1106
- 'type': 'number',
1107
- 'unit': 'Liter',
1108
- 'read': true,
1109
- 'write': false,
1110
- 'def': 0
1111
- },
1112
- 'native': {},
1113
- });
1114
- // History - Sprinkler running time of the current calendar week => History - Sprinkler-Laufzeit der aktuellen Kalenderwoche (783 Liter)
1115
- adapter.setObjectNotExists(objPfad + '.history.curCalWeekRunningTime', {
1116
- 'type': 'state',
1117
- 'common': {
1118
- 'role': 'state',
1119
- 'name': objectName + ' => History - Sprinkler running time of the current calendar week',
1120
- 'type': 'string',
1121
- 'read': true,
1122
- 'write': false,
1123
- 'def': '00:00'
1124
- },
1125
- 'native': {},
1126
- });
1127
- // History - Sprinkler running time of the last calendar week => History - Sprinkler-Laufzeit der letzten Kalenderwoche (783 Liter)
1128
- adapter.setObjectNotExists(objPfad + '.history.lastCalWeekRunningTime', {
1129
- 'type': 'state',
1130
- 'common': {
1131
- 'role': 'state',
1132
- 'name': objectName + ' => History - Sprinkler running time of the last calendar week',
1133
- 'type': 'string',
1134
- 'read': true,
1135
- 'write': false,
1136
- 'def': '00:00'
1137
- },
1138
- 'native': {},
1139
- });
1140
1185
 
1141
- setTimeout(() => {
1142
- switch (myConfig.config[j].methodControlSM) {
1143
- case 'bistable':
1144
- if(myConfig.config[j].triggerSM.length > 5) {
1145
- adapter.getForeignState(myConfig.config[j].triggerSM, (err,state) => {
1146
- if (typeof state !== undefined && typeof state.val === 'boolean') {
1147
- myConfig.setSoilMoistBool(myConfig.config[j].sprinkleID, state.val);
1148
- }
1149
- });
1150
- }
1151
- adapter.setState(objPfad + '.triggerPoint', {
1152
- val: '-',
1153
- ack: true
1154
- });
1155
- break;
1186
+ // ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ //
1187
+ // +++++ zustände der States aktualisieren +++++ //
1188
+ // ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ //
1189
+
1190
+ // Abfrage, ob sich die Bewässerungsart geändert hat
1191
+ const _actualSoilMoistureObj = await adapter.getObjectAsync(objPfad + '.actualSoilMoisture').catch((e) => adapter.log.warn(e));
1192
+ if (_actualSoilMoistureObj) {
1193
+ if (typeof _actualSoilMoistureObj.common.name !== 'string' || _actualSoilMoistureObj.common.name !== nameMetConSM) { // Objekt wurde ausgelesen
1194
+ await adapter.setObjectAsync(
1195
+ objPfad + '.actualSoilMoisture',
1196
+ objMetConSM
1197
+ ).catch((e) => adapter.log.warn(e));
1198
+ adapter.log.info(`sprinkleControl [sprinkle.${objectName}.actualSoilMoisture] was updated`);
1156
1199
 
1157
- case 'analog':
1158
- if (myConfig.config[j].triggerSM.length > 5) {
1159
- adapter.getForeignState(myConfig.config[j].triggerSM, (err,state) => {
1160
- if (typeof state !== undefined && state.val) {
1161
- myConfig.setSoilMoistPct(myConfig.config[j].sprinkleID, state.val);
1162
- }
1163
- });
1164
1200
  }
1165
- adapter.setState(objPfad + '.triggerPoint', {
1166
- val: (myConfig.config[j].soilMoisture.pctTriggerIrrigation).toString(),
1167
- ack: true
1168
- });
1169
- break;
1201
+ }
1202
+ //
1203
+ if (await _autoOnNotExist) {
1204
+ const _autoOn = await adapter.getStateAsync(objPfad + '.autoOn').catch((e) => adapter.log.warn(e));
1205
+ if (_autoOn && _autoOn.val) {
1206
+ if (typeof _autoOn.val === 'boolean' && ((new Date () - _autoOn.ts) > 60000)) {
1207
+ myConfig.config[j].autoOn = _autoOn.val;
1208
+ } else {
1209
+ adapter.setStateAsync(
1210
+ objPfad + '.autoOn',
1211
+ true,
1212
+ true
1213
+ ).catch((e) => adapter.log.warn(`${objectName}.autoOn ${e}`));
1214
+ myConfig.config[j].autoOn = true;
1215
+ }
1216
+ }
1217
+ }
1218
+ //
1219
+ if(await _countdownNotExist){
1220
+ const _countdown = await adapter.getStateAsync(objPfad + '.countdown').catch((e) => adapter.log.warn(`${objectName}.countdown ${e}`));
1221
+ if (_countdown && _countdown.val !== '0') {
1222
+ adapter.setStateAsync(
1223
+ objPfad + '.countdown',
1224
+ '0',
1225
+ true
1226
+ ).catch((e) => adapter.log.warn(e));
1227
+ }
1228
+ }
1229
+ //
1230
+ if (_runningTimeNotExist) {
1231
+ const _runningTime = await adapter.getStateAsync(objPfad + '.runningTime').catch((e) => adapter.log.warn(`${objectName}.runningTime ${e}`));
1232
+ if (_runningTime && _runningTime.val !== '00:00') {
1233
+ adapter.setStateAsync(objPfad + '.runningTime',
1234
+ '00:00',
1235
+ true
1236
+ ).catch((e) => adapter.log.warn(e));
1237
+ }
1238
+ }
1239
+ //
1240
+ if (_sprinklerStateNotExists){
1241
+ const _sprinklerState = await adapter.getStateAsync(objPfad + '.sprinklerState').catch((e) => adapter.log.warn(`${objectName}.sprinklerState ${e}`));
1242
+ if (_sprinklerState && _sprinklerState.val !== 0) {
1243
+ await adapter.setStateAsync(objPfad + '.sprinklerState',
1244
+ 0,
1245
+ true
1246
+ ).catch((e) => adapter.log.warn(`${objectName}.sprinklerState ${e}`));
1247
+ }
1248
+ }
1249
+ // Festlegen des Schaltpunktes für den nächsten Start
1250
+ switch (myConfig.config[j].methodControlSM) {
1251
+ case 'bistable':
1252
+ // Sensor soil moisture => Sensor Bodenfeuchte
1253
+ const _triggerSMBistabile = await adapter.getForeignStateAsync(myConfig.config[j].triggerSM).catch((e) => adapter.log.warn(`${objectName}.triggerSMBistabile ${e}`));
1254
+ if (_triggerSMBistabile && typeof _triggerSMBistabile.val === 'boolean') {
1255
+ myConfig.setSoilMoistBool(myConfig.config[j].sprinkleID, _triggerSMBistabile.val);
1256
+ } else {
1257
+ myConfig.setSoilMoistBool(myConfig.config[j].sprinkleID, true);
1258
+ adapter.log.warn(`The bistable sensor ${myConfig.config[j].triggerSM} in ${objectName} does not deliver correct values!`)
1259
+ }
1170
1260
 
1171
- case 'fixDay':
1261
+ adapter.setStateAsync(objPfad + '.triggerPoint',
1262
+ '-',
1263
+ true
1264
+ ).catch((e) => adapter.log.warn(`${objectName}.triggerPoint ${e}`));
1265
+ break;
1172
1266
 
1173
- /** @type {number} */
1174
- const nextStartDay = ((today + 1) > 6 ? 0 : (today + 1));
1175
-
1176
- /**
1177
- * Neuen Start-Tag für Dreitage- und Zweitage-modus setzen
1178
- * @param {boolean} threeRd - Dreitage-modus Ja/Nein
1179
- * true => Dreitage-modus (treeRD)
1180
- * false => Zweitage-modus (twoNd)
1181
- */
1182
- function setNewDay (threeRd) {
1183
- const today = formatTime(adapter,'', 'day');
1184
- adapter.log.info('setNewDay; ' + myConfig.config[j].objectName + ', startFixDay: ' + myConfig.config[j].startFixDay); //löschen
1185
- adapter.getState(objPfad + '.actualSoilMoisture', (err, state) => {
1186
- adapter.log.info('state; ' + myConfig.config[j].objectName + ', state: ' + state + ', val: ' + state.val + ', typeof: ' + typeof state.val); //löschen
1187
- if (state && (typeof state.val === 'number')) {
1188
- if ((state.val >= 0) && (state.val <= 6)) {
1267
+ case 'analog':
1268
+ // Sensor soil moisture => Sensor Bodenfeuchte
1269
+ /**
1270
+ * Schaltpunkt '.triggerSM' auslesen
1271
+ * @type {ioBroker.State | void} _triggerSM - Schaltpunkt
1272
+ * @private
1273
+ */
1274
+ const _triggerSMAnalog = await adapter.getForeignStateAsync(myConfig.config[j].triggerSM).catch((e) => adapter.log.warn(`${objectName}.triggerSMAnalog ${e}`));
1275
+ if (_triggerSMAnalog && (typeof _triggerSMAnalog.val === 'number' || typeof _triggerSMAnalog.val === 'string')) {
1276
+ myConfig.setSoilMoistPct(myConfig.config[j].sprinkleID, _triggerSMAnalog.val);
1277
+ } else {
1278
+ await adapter.setStateAsync(objPfad + '.actualSoilMoisture',
1279
+ 50,
1280
+ true
1281
+ );
1282
+ adapter.log.warn(`The analoge sensor ${myConfig.config[j].triggerSM} in ${objectName} does not deliver correct values!`)
1283
+ }
1284
+ adapter.setStateAsync(objPfad + '.triggerPoint',
1285
+ (myConfig.config[j].soilMoisture.pctTriggerIrrigation).toString(),
1286
+ true
1287
+ ).catch((e) => adapter.log.warn(`${objectName}.triggerPoint setState ${e}`));
1288
+ break;
1289
+
1290
+ case 'fixDay':
1291
+
1292
+ /** @type {number} */
1293
+ const nextStartDay = ((today + 1) > 6 ? 0 : (today + 1));
1294
+
1295
+ /**
1296
+ * Neuen Start-Tag für Dreitage- und Zweitage-modus setzen
1297
+ * @param {boolean} threeRd - Dreitage-modus Ja/Nein
1298
+ * true → Dreitage-modus (treeRD)
1299
+ * false → Zweitage-modus (twoNd)
1300
+ */
1301
+ async function setNewDay (threeRd) {
1302
+ const today = formatTime(adapter,'', 'day');
1303
+ /**
1304
+ *
1305
+ * @type {ioBroker.GetStatePromise} _actualSoilMoisture
1306
+ * @private {ioBroker.State|Void} _actualSoilMoisture
1307
+ */
1308
+ const _actualSoilMoisture = await adapter.getStateAsync(
1309
+ objPfad + '.actualSoilMoisture'
1310
+ ).catch((e) => adapter.log.warn(`${objectName}.actualSoilMoisture fixDay setState ${e}`));
1311
+ if (_actualSoilMoisture && (typeof _actualSoilMoisture.val === 'number')) {
1312
+ if ((_actualSoilMoisture.val >= 0) && (_actualSoilMoisture.val <= 6)) {
1189
1313
  if ((threeRd)
1190
- && (state.val === (((today + 3) > 6) ? 2 : (today + 3)))
1191
- || (state.val === (((today + 2) > 6) ? 1 : (today + 2)))
1192
- || (state.val === (((today + 1) > 6) ? 0 : (today + 1)))
1193
- || (state.val === today)) {
1194
- myConfig.config[j].startFixDay[state.val] = true;
1195
- adapter.log.info('state; ' + myConfig.config[j].objectName + ', oldStartDay: '+ state.val + ', startFixDay: ' + myConfig.config[j].startFixDay); //löschen
1314
+ && (_actualSoilMoisture.val === (((today + 3) > 6) ? 2 : (today + 3)))
1315
+ || (_actualSoilMoisture.val === (((today + 2) > 6) ? 1 : (today + 2)))
1316
+ || (_actualSoilMoisture.val === (((today + 1) > 6) ? 0 : (today + 1)))
1317
+ || (_actualSoilMoisture.val === today)) {
1318
+ myConfig.config[j].startFixDay[_actualSoilMoisture.val] = true;
1196
1319
  } else {
1197
1320
  myConfig.config[j].startFixDay[nextStartDay] = true;
1198
- adapter.log.info('state; ' + myConfig.config[j].objectName + ', nextStartDay: '+ nextStartDay + ', startFixDay: ' + myConfig.config[j].startFixDay); //löschen
1199
1321
  }
1200
1322
  } else {
1201
1323
  myConfig.config[j].startFixDay[nextStartDay] = true;
1202
- adapter.log.info('state; ' + myConfig.config[j].objectName + ', else nextStartDay: '+ nextStartDay + ', startFixDay: ' + myConfig.config[j].startFixDay); //löschen
1203
1324
  }
1204
1325
  curNextFixDay(myConfig.config[j].sprinkleID, false);
1205
1326
  }
1206
- });
1327
+ }
1207
1328
 
1208
- }
1329
+ if (myConfig.config[j].startDay === 'threeRd') {
1330
+ await setNewDay(true);
1331
+ } else if (myConfig.config[j].startDay === 'twoNd') {
1332
+ await setNewDay(false);
1333
+ } else if (myConfig.config[j].startDay === 'fixDay') {
1334
+ adapter.log.info(`set Day (fixDay): ${myConfig.config[j].objectName}`);
1335
+ curNextFixDay(myConfig.config[j].sprinkleID, false);
1336
+ }
1209
1337
 
1210
- if (myConfig.config[j].startDay === 'threeRd') {
1211
- setNewDay(true);
1212
- } else if (myConfig.config[j].startDay === 'twoNd') {
1213
- setNewDay(false);
1214
- } else if (myConfig.config[j].startDay === 'fixDay') {
1215
- adapter.log.info('set Day (fixDay): ' + myConfig.config[j].objectName);
1216
- curNextFixDay(myConfig.config[j].sprinkleID, false);
1217
- }
1338
+ adapter.setStateAsync(objPfad + '.triggerPoint',
1339
+ '-',
1340
+ true
1341
+ ).catch((e) => adapter.log.warn(`${objectName}.triggerPoint fixDay setState ${e}`));
1342
+ break;
1218
1343
 
1219
- adapter.setState(objPfad + '.triggerPoint', {
1220
- val: '-',
1221
- ack: true
1222
- });
1223
- break;
1344
+ case 'calculation':
1224
1345
 
1225
- case 'calculation':
1226
- adapter.getState(objPfad + '.actualSoilMoisture', (err, state) => {
1227
- if (state == null || typeof state.val !== 'number' || state.val === 0) {
1228
- adapter.setState(objPfad + '.actualSoilMoisture', {
1229
- val: myConfig.config[j].soilMoisture.pct,
1230
- ack: true
1231
- });
1232
- } else {
1233
- // num Wert der Bodenfeuchte berechnen und der config speichern wenn Wert zwischen 0 und max liegt
1234
- if ((0 < state.val) && (state.val <= (myConfig.config[j]).soilMoisture.maxRain*100/myConfig.config[j].soilMoisture.maxIrrigation)) {
1235
- myConfig.config[j].soilMoisture.val = state.val * myConfig.config[j].soilMoisture.maxIrrigation / 100;
1236
- myConfig.config[j].soilMoisture.pct = state.val;
1346
+ const _actualSoilMoisture = await adapter.getStateAsync(objPfad + '.actualSoilMoisture').catch((e) => adapter.log.warn(e));
1347
+ if (_actualSoilMoisture) {
1348
+ if (await _actualSoilMoisture && typeof _actualSoilMoisture.val !== 'number' || _actualSoilMoisture.val === 0) {
1349
+ adapter.setStateAsync(objPfad + '.actualSoilMoisture',
1350
+ myConfig.config[j].soilMoisture.pct,
1351
+ true
1352
+ ).catch((e) => adapter.log.warn(e));
1237
1353
  } else {
1238
- // Wert aus config übernehmen
1239
- adapter.setState(objPfad + '.actualSoilMoisture', {
1240
- val: myConfig.config[j].soilMoisture.pct,
1241
- ack: true
1242
- });
1354
+ // num Wert der Bodenfeuchte berechnen und in der config speichern, wenn Wert zwischen 0 und max liegt
1355
+ if ((0 < _actualSoilMoisture.val) && (_actualSoilMoisture.val <= (myConfig.config[j]).soilMoisture.maxRain*100/myConfig.config[j].soilMoisture.maxIrrigation)) {
1356
+ myConfig.config[j].soilMoisture.val = _actualSoilMoisture.val * myConfig.config[j].soilMoisture.maxIrrigation / 100;
1357
+ myConfig.config[j].soilMoisture.pct = _actualSoilMoisture.val;
1358
+ } else {
1359
+ // Wert aus config übernehmen
1360
+ adapter.setStateAsync(objPfad + '.actualSoilMoisture',
1361
+ myConfig.config[j].soilMoisture.pct,
1362
+ true
1363
+ ).catch((e) => adapter.log.warn(e));
1364
+ }
1243
1365
  }
1244
1366
  }
1245
- });
1246
- adapter.setState(objPfad + '.triggerPoint', {
1247
- val: (myConfig.config[j].soilMoisture.pctTriggerIrrigation).toString(),
1248
- ack: true
1249
- });
1250
- break;
1251
- }
1252
1367
 
1253
- adapter.getState(objPfad + '.sprinklerState', (err, state) => {
1254
- if (state) {
1255
- adapter.setState(objPfad + '.sprinklerState', {val: 0, ack: true});
1256
- }
1257
- });
1258
- adapter.getState(objPfad + '.runningTime', (err, state) => {
1259
- if (state) {
1260
- adapter.setState(objPfad + '.runningTime', {val: '00:00', ack: true});
1261
- }
1262
- });
1263
- adapter.getState(objPfad + '.countdown', (err, state) => {
1264
- if (state) {
1265
- adapter.setState(objPfad + '.countdown', {val: '0', ack: true});
1266
- }
1267
- });
1268
- adapter.getState(objPfad + '.autoOn', (err, state) => {
1269
- if (state) {
1270
- if (typeof state.val === 'boolean' && ((new Date () - state.ts) > 60000)) {
1271
- myConfig.config[j].autoOn = state.val;
1272
- } else {
1273
- adapter.setState(objPfad + '.autoOn', {val: true, ack: true});
1274
- myConfig.config[j].autoOn = true;
1368
+ adapter.setStateAsync(objPfad + '.triggerPoint',
1369
+ (myConfig.config[j].soilMoisture.pctTriggerIrrigation).toString(),
1370
+ true
1371
+ ).catch((e) => adapter.log.warn(e));
1372
+ break;
1373
+
1275
1374
  }
1276
- }
1277
- });
1278
- // history
1279
- adapter.getState(objPfad + '.history.lastRunningTime', (err, state) => {
1280
- if (typeof state === 'object' && typeof state.val !== 'string') {
1281
- adapter.setState(objPfad + '.history.lastRunningTime', {val: '00:00', ack: true});
1282
- }
1283
- });
1284
- adapter.getState(objPfad + '.history.lastOn', (err, state) => {
1285
- if (typeof state === 'object' && typeof state.val !== 'string') {
1286
- adapter.setState(objPfad + '.history.lastOn', {val: '-', ack: true});
1287
- }
1288
- });
1289
- adapter.getState(objPfad + '.history.lastConsumed', (err, state) => {
1290
- if (typeof state === 'object' && typeof state.val !== 'number') {
1291
- adapter.setState(objPfad + '.history.lastConsumed', {val: 0, ack: true});
1292
- }
1293
- });
1294
- adapter.getState(objPfad + '.history.curCalWeekConsumed', (err, state) => {
1295
- if (typeof state === 'object' && typeof state.val !== 'number') {
1296
- adapter.setState(objPfad + '.history.curCalWeekConsumed', {val: 0, ack: true});
1297
- }
1298
- });
1299
- adapter.getState(objPfad + '.history.lastCalWeekConsumed', (err, state) => {
1300
- if (typeof state === 'object' && typeof state.val !== 'number') {
1301
- adapter.setState(objPfad + '.history.lastCalWeekConsumed', {val: 0, ack: true});
1302
- }
1303
- });
1304
- adapter.getState(objPfad + '.history.curCalWeekRunningTime', (err, state) => {
1305
- if (typeof state === 'object' && typeof state.val !== 'string') {
1306
- adapter.setState(objPfad + '.history.curCalWeekRunningTime', {val: '00:00', ack: true});
1307
- }
1308
- });
1309
- adapter.getState(objPfad + '.history.lastCalWeekRunningTime', (err, state) => {
1310
- if (typeof state === 'object' && typeof state.val !== 'string') {
1311
- adapter.setState(objPfad + '.history.lastCalWeekRunningTime', {val: '00:00', ack: true});
1312
- }
1313
- });
1314
- },1500);
1375
+
1376
+ } catch (e) {
1377
+ adapter.log.warn(`sprinkleControl cannot created ... Please check your sprinkleControl config: ${e}`);
1378
+ }
1379
+ } else {
1380
+ adapter.log.warn('sprinkleControl cannot created ... Please check in your config the sprinkle Name')
1381
+ }
1315
1382
  }
1316
- // delete old sprinkle
1383
+
1384
+ // ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ //
1385
+ // +++++ Objekte löschen +++++ //
1386
+ // ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ //
1317
1387
  for(const i in ObjSprinkle) {
1318
1388
 
1319
1389
  const resID = ObjSprinkle[i]._id;
@@ -1329,60 +1399,66 @@ function createSprinklers() {
1329
1399
  fullRes.push(res);
1330
1400
  }
1331
1401
  }
1332
- setTimeout(() => {
1333
-
1334
- if (fullRes.indexOf(resultID) === -1) {
1335
- // State löschen
1336
-
1337
- // History - Objekt(Ordner) löschen
1338
- adapter.delObject(resID + '.history', function (err) {
1339
- if (err) {
1340
- adapter.log.warn(err);
1341
- }
1342
- });
1343
- // State löschen
1344
- adapter.delObject(resID + '.actualSoilMoisture'); // "sprinklecontrol.0.sprinkle.???.actualSoilMoisture"
1345
- adapter.delObject(resID + '.triggerPoint'); // "sprinklecontrol.0.sprinkle.???.triggerPoint"
1346
- adapter.delObject(resID + '.sprinklerState'); // "sprinklecontrol.0.sprinkle.???.sprinklerState"
1347
- adapter.delObject(resID + '.runningTime'); // "sprinklecontrol.0.sprinkle.???.runningTime"
1348
- adapter.delObject(resID + '.countdown'); // "sprinklecontrol.0.sprinkle.???.countdown"
1349
- adapter.delObject(resID + '.autoOn'); // "sprinklecontrol.0.sprinkle.???.autoOn"
1350
- adapter.delObject(resID + '.history.lastOn'); // "sprinklecontrol.0.sprinkle.???..history.lastOn"
1351
- adapter.delObject(resID + '.history.lastConsumed'); // "sprinklecontrol.0.sprinkle.???..history.lastConsumed"
1352
- adapter.delObject(resID + '.history.lastRunningTime'); // "sprinklecontrol.0.sprinkle.???.history.lastRunningTime"
1353
- adapter.delObject(resID + '.history.curCalWeekConsumed'); // "sprinklecontrol.0.sprinkle.???.history.curCalWeekConsumed"
1354
- adapter.delObject(resID + '.history.lastCalWeekConsumed'); // "sprinklecontrol.0.sprinkle.???.history.lastCalWeekConsumed"
1355
- adapter.delObject(resID + '.history.curCalWeekRunningTime'); // "sprinklecontrol.0.sprinkle.???.history.curCalWeekRunningTime"
1356
- adapter.delObject(resID + '.history.lastCalWeekRunningTime'); // "sprinklecontrol.0.sprinkle.???.history.lastCalWeekRunningTime"
1357
- // Objekt(Ordner) löschen
1358
- adapter.delObject(resID, function (err) {
1359
- if (err) {
1360
- adapter.log.warn(err);
1361
- }
1362
- });
1363
- }
1364
- }, 1500);
1365
1402
 
1403
+ if (fullRes.indexOf(resultID) === -1) {
1404
+ try {
1405
+ // object deleted
1406
+ Promise.all([
1407
+ adapter.delObjectAsync(resID + '.actualSoilMoisture'), // "sprinklecontrol.0.sprinkle.???.actualSoilMoisture"
1408
+ adapter.delObjectAsync(resID + '.triggerPoint'), // "sprinklecontrol.0.sprinkle.???.triggerPoint"
1409
+ adapter.delObjectAsync(resID + '.sprinklerState'), // "sprinklecontrol.0.sprinkle.???.sprinklerState"
1410
+ adapter.delObjectAsync(resID + '.runningTime'), // "sprinklecontrol.0.sprinkle.???.runningTime"
1411
+ adapter.delObjectAsync(resID + '.countdown'), // "sprinklecontrol.0.sprinkle.???.countdown"
1412
+ adapter.delObjectAsync(resID + '.autoOn'), // "sprinklecontrol.0.sprinkle.???.autoOn"
1413
+ adapter.delObjectAsync(resID + '.history.lastOn'), // "sprinklecontrol.0.sprinkle.???..history.lastOn"
1414
+ adapter.delObjectAsync(resID + '.history.lastConsumed'), // "sprinklecontrol.0.sprinkle.???..history.lastConsumed"
1415
+ adapter.delObjectAsync(resID + '.history.lastRunningTime'), // "sprinklecontrol.0.sprinkle.???.history.lastRunningTime"
1416
+ adapter.delObjectAsync(resID + '.history.curCalWeekConsumed'), // "sprinklecontrol.0.sprinkle.???.history.curCalWeekConsumed"
1417
+ adapter.delObjectAsync(resID + '.history.lastCalWeekConsumed'), // "sprinklecontrol.0.sprinkle.???.history.lastCalWeekConsumed"
1418
+ adapter.delObjectAsync(resID + '.history.curCalWeekRunningTime'), // "sprinklecontrol.0.sprinkle.???.history.curCalWeekRunningTime"
1419
+ adapter.delObjectAsync(resID + '.history.lastCalWeekRunningTime'), // "sprinklecontrol.0.sprinkle.???.history.lastCalWeekRunningTime"
1420
+ // History - Objekt(Ordner.history) löschen
1421
+ await adapter.delObjectAsync(resID + '.history'),
1422
+ // Objekt(Ordner) löschen
1423
+ await adapter.delObjectAsync(resID)
1424
+ ]).then((resultID)=>{
1425
+ adapter.log.info(`sprinkleControl [${resultID}] was deleted`);
1426
+ })
1427
+ } catch (e) {
1428
+ adapter.log.warn(e);
1429
+ }
1430
+ }
1366
1431
  }
1367
-
1368
1432
  }
1369
1433
  }
1370
-
1434
+ ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
1435
+ /**
1436
+ *
1437
+ * @param {number} ms => Waiting time in ms
1438
+ * @return {Promise<unknown>}
1439
+ */
1440
+ async function sleep(ms) {
1441
+ return new Promise(async (resolve) => {
1442
+ // @ts-ignore
1443
+ timerSleep = setTimeout(async () => resolve(), ms);
1444
+ });
1445
+ }
1446
+ ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
1371
1447
  /**
1372
1448
  *
1373
1449
  * @param {ioBroker.Adapter} adapter
1374
1450
  */
1375
1451
  function main(adapter) {
1376
1452
 
1377
- /* The adapters config (in the instance object everything under the attribute "native") is accessible via
1453
+ /* The adapters' config (in the instance object everything under the attribute "native") is accessible via
1378
1454
  * adapter.config:
1379
1455
  * => Auf die Adapterkonfiguration (im Instanz objekt alles unter dem Attribut "native") kann zugegriffen werden über
1380
1456
  adapter.config:
1381
1457
  */
1382
- adapter.log.debug(JSON.stringify(adapter.config.events));
1458
+ adapter.log.debug(`adapter.config.events: ${JSON.stringify(adapter.config.events)}`);
1383
1459
 
1384
1460
  /**
1385
- * The adapters config (in the instance object everything under the attribute "native") is accessible via adapter.config:
1461
+ * The adapters' config (in the instance object everything under the attribute "native") is accessible via adapter.config:
1386
1462
  * => Auf die Adapterkonfiguration (im Instanz objekt alles unter dem Attribut "native") kann zugegriffen werden über adapter.config:
1387
1463
  * @param {any} err
1388
1464
  * @param {any} obj
@@ -1395,11 +1471,11 @@ function main(adapter) {
1395
1471
  }
1396
1472
  });
1397
1473
 
1398
- GetSystemData();
1474
+ GetSystemData().then();
1399
1475
  sendMessageText.initConfigMessage(adapter);
1400
1476
 
1401
1477
  timer = setTimeout(function() {
1402
- checkActualStates();
1478
+ checkActualStates().then();
1403
1479
  // init evaporation
1404
1480
  evaporation.initEvaporation(adapter);
1405
1481
  // Hauptpumpe zur Bewässerung setzen