iobroker.sprinklecontrol 0.2.5 → 0.2.8

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
  }
@@ -193,7 +193,7 @@ function startAdapter(options) {
193
193
  }
194
194
  const filter = myConfig.config.filter(filterByID);
195
195
  if (filter) {
196
- for (let fil of filter) {
196
+ for (const fil of filter) {
197
197
  if (id === myConfig.config[fil.sprinkleID].triggerSM){
198
198
  // analog
199
199
  if (fil.methodControlSM === 'analog') {
@@ -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,17 +241,17 @@ 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
248
248
  // If the amount of rain is over 20 mm, the 'lastRainCounter' is overwritten and no calculation is carried out. =>
249
- // * Wenn die Regenmenge mehr als 20 mm beträgt, wird der 'lastRainCounter' überschrieben und es wird keine Berechnung durchgeführt.
249
+ // * Wenn die Regenmenge mehr als 20 mm beträgt, wird der 'lastRainCounter' überschrieben und es wird keine Berechnung durchgeführt.
250
250
  if (id === adapter.config.sensorRainfall) {
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,55 +294,56 @@ 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) {
339
- let weekDayArray = myConfig.config[sprinkleID].startFixDay
340
+ const weekDayArray = myConfig.config[sprinkleID].startFixDay;
340
341
  const objPfad = 'sprinkle.' + myConfig.config[sprinkleID].objectName;
341
- const weekday = ['Sun','Mon','Tue','Wed','Thur','Fri','Sat']
342
- let curDay = formatTime(adapter, '', 'day')
342
+ const weekday = ['Sun','Mon','Tue','Wed','Thur','Fri','Sat'];
343
+ let curDay = formatTime(adapter, '', 'day');
343
344
  for ( let i=0; i<7; i++ ) {
344
345
  curDay++;
345
- if (curDay > 6) { curDay = curDay - 7}
346
+ if (curDay > 6) {curDay = curDay - 7;}
346
347
  if (weekDayArray[curDay] === true) {
347
348
  if (returnOn) {
348
349
  return weekday[curDay];
@@ -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,122 @@ 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.GetStatePromise}
447
+ * @private
448
+ */
449
+ const _publicHolInstanceHeute = adapter.getForeignStateAsync(
450
+ adapter.config.publicHolInstance + '.heute.boolean'
451
+ ).catch((e) => adapter.log.warn(e));
452
+ if (await _publicHolInstanceHeute && _publicHolInstanceHeute.val) {
453
+ publicHolidayStr = _publicHolInstanceHeute.val;
481
454
  }
482
- adapter.setState('info.rainToday', {
483
- val: weatherForecastTodayNum,
484
- ack: true
485
- });
455
+ /**
456
+ * Feiertag MORGEN
457
+ * @type {ioBroker.GetStatePromise}
458
+ * @private
459
+ */
460
+ const _publicHolInstanceMorgen = adapter.getForeignStateAsync(
461
+ adapter.config.publicHolInstance + '.morgen.boolean'
462
+ ).catch((e) => adapter.log.warn(e));
463
+ if (await _publicHolInstanceMorgen && _publicHolInstanceMorgen.val) {
464
+ publicHolidayTomorrowStr = _publicHolInstanceMorgen.val;
465
+ }
466
+ }
467
+
468
+ if (adapter.config.weatherForecast === true && (adapter.config.weatherForInstance !== 'none' || adapter.config.weatherForInstance !== '')) {
469
+ /**
470
+ * Niederschlagsmenge HEUTE in mm
471
+ * @type {ioBroker.GetStatePromise}
472
+ * @private
473
+ */
474
+ const _weatherForInstanceToday = adapter.getForeignStateAsync(
475
+ adapter.config.weatherForInstance + '.NextDaysDetailed.Location_1.Day_1.rain_value'
476
+ ).catch((e) => adapter.log.warn(e));
477
+ if (await _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.GetStatePromise}
495
+ * @private
496
+ */
497
+ const _weatherForInstance = 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
+ );
507
+ }
508
+ }
509
+ if (adapter.config.actualValueLevel){
510
+ /**
511
+ * Füllstand der Zisterne in %
512
+ * @type {ioBroker.GetStatePromise}
513
+ * @private
514
+ */
515
+ const _actualValueLevel = adapter.getForeignStateAsync(adapter.config.actualValueLevel).catch((e) => adapter.log.warn(e));
516
+ if (_actualValueLevel && typeof _actualValueLevel.val !== undefined) {
517
+ valveControl.setFillLevelCistern(parseFloat(_actualValueLevel.val));
486
518
  }
487
- });
519
+ }
488
520
  /**
489
- * Niederschlagsmenge MORGEN in mm
490
- * @param {string|null} err
491
- * @param {ioBroker.State|null|undefined} state
521
+ * return the saved objects under sprinkle.*
522
+ * rückgabe der gespeicherten Objekte unter sprinkle.*
492
523
  */
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
- });
524
+ const _list = await adapter.getForeignObjectsAsync(adapter.namespace + '.sprinkle.*', 'channel').catch((e) => adapter.log.warn(e));
525
+ if (_list) {
526
+ ObjSprinkle = _list;
527
+ await createSprinklers();
528
+ await sleep(100);
529
+ startTimeSprinkle();
500
530
  }
501
- });
502
- }
503
531
 
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
- });
532
+ } catch (e) {
533
+ adapter.log.warn(`sprinkleControl cannot check actual States ... Please check your sprinkleControl states: ${e}`);
534
+ }
514
535
 
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
536
  }
537
537
 
538
538
 
@@ -546,8 +546,8 @@ const calcPos = schedule.scheduleJob('calcPosTimer', '5 0 * * *', function() {
546
546
  sunPos();
547
547
  today = formatTime(adapter,'', 'day');
548
548
 
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')));}
549
+ // History Daten aktualisieren, wenn eine neue Woche beginnt
550
+ adapter.log.debug(`calcPos 0:05 old-KW: ${kwStr} new-KW: ${formatTime(adapter, '','kW')} if: ${(kwStr !== formatTime(adapter, '','kW'))}`);
551
551
  if (kwStr !== formatTime(adapter, '','kW')) {
552
552
  const result = myConfig.config;
553
553
  if (result) {
@@ -576,7 +576,7 @@ const calcPos = schedule.scheduleJob('calcPosTimer', '5 0 * * *', function() {
576
576
  // ETpToday und ETpYesterday in evaporation aktualisieren da ein neuer Tag
577
577
  evaporation.setNewDay();
578
578
 
579
- // Startzeit Festlegen => verzögert wegen Daten von SunCalc
579
+ // Startzeit Festlegen verzögert wegen Daten von SunCalc
580
580
  setTimeout(() => {
581
581
  startTimeSprinkle();
582
582
  },1000);
@@ -585,10 +585,10 @@ const calcPos = schedule.scheduleJob('calcPosTimer', '5 0 * * *', function() {
585
585
 
586
586
  // Berechnung mittels sunCalc
587
587
  function sunPos() {
588
- // get today's sunlight times => Holen Sie sich die heutige Sonnenlicht Zeit
588
+ // get today's sunlight times Holen Sie sich die heutige Sonnenlichtzeit
589
589
  const times = SunCalc.getTimes(new Date(), adapter.config.latitude, adapter.config.longitude);
590
590
 
591
- // format sunrise time from the Date object => Formatieren Sie die Sonnenaufgangszeit aus dem Date-Objekt
591
+ // format sunrise time from the Date object Formatieren Sie die Sonnenaufgangszeit aus dem Date-Objekt
592
592
  sunriseStr = ('0' + times.sunrise.getHours()).slice(-2) + ':' + ('0' + times.sunrise.getMinutes()).slice(-2);
593
593
 
594
594
  // format golden hour end time from the Date object => Formatiere golden hour end time aus dem Date-Objekt
@@ -606,14 +606,17 @@ function startTimeSprinkle() {
606
606
 
607
607
  // if autoOnOff == false => keine auto Start
608
608
  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 });
609
+ adapter.log.info(`Sprinkle: autoOnOff == Aus( ${autoOnOffStr} )`);
610
+ adapter.setState('info.nextAutoStart', {
611
+ val: 'autoOnOff = off(0)',
612
+ ack: true
613
+ });
611
614
  return;
612
615
  }
613
616
 
614
617
  /**
615
618
  * next start time (automatic)
616
- * => Berechnung des nächsten Starts (Automatik)
619
+ * Berechnung des nächsten Starts (Automatik)
617
620
  * @returns {string}
618
621
  */
619
622
  function nextStartTime () {
@@ -656,12 +659,12 @@ function startTimeSprinkle() {
656
659
  newStartTime = goldenHourEnd;
657
660
  break;
658
661
  }
659
- // Start am Wochenende => wenn andere Zeiten verwendet werden soll
662
+ // Start am Wochenende →, wenn andere Zeiten verwendet werden soll
660
663
  if((adapter.config.publicWeekend) && ((myWeekday) === 6 || (myWeekday) === 0)){
661
664
  infoMessage = 'Start am Wochenende ';
662
665
  newStartTime = adapter.config.weekEndLiving;
663
666
  }
664
- // Start an Feiertagen => wenn Zeiten des Wochenendes verwendet werden soll
667
+ // Start an Feiertagen →, wenn Zeiten des Wochenendes verwendet werden soll
665
668
  if((adapter.config.publicHolidays) && (adapter.config.publicWeekend)
666
669
  && (((publicHolidayStr === true) && (run === 1)) // heute Feiertag && erster Durchlauf
667
670
  || ((publicHolidayTomorrowStr === true) && (run === 2)) // morgen Feiertag && zweiter Durchlauf
@@ -688,7 +691,7 @@ function startTimeSprinkle() {
688
691
  if(!sendMessageText.onlySendError){
689
692
  sendMessageText.sendMessage(infoMessage + '(' + myWeekdayStr[myWeekday] + ') um ' + newStartTime);
690
693
  }
691
- adapter.log.info(infoMessage + '(' + myWeekdayStr[myWeekday] + ') um ' + newStartTime);
694
+ adapter.log.info(`${infoMessage} (${myWeekdayStr[myWeekday]}) um ${newStartTime}`);
692
695
  }
693
696
  }
694
697
  });
@@ -711,13 +714,13 @@ function startTimeSprinkle() {
711
714
  /**
712
715
  * result Rain
713
716
  * - (aktuelle Wettervorhersage - Schwellwert der Regenberücksichtigung) wenn Sensor sich im Freien befindet
714
- * - (> 0) es Regnet - Abbruch -
715
- * - (<= 0) Start der Bewässerung
717
+ * - (> 0) es regnet - Abbruch -
718
+ * - ( 0) Start der Bewässerung
716
719
  * @param {boolean} inGreenhouse - Sensor befindet sich im Gewächshaus
717
720
  * @returns {number} - resultierende Regenmenge
718
721
  */
719
722
  function resRain (inGreenhouse) {
720
- return (adapter.config.weatherForecast && !inGreenhouse) ? ((+ weatherForecastTodayNum) - parseFloat(adapter.config.thresholdRain)) : 0;
723
+ return (adapter.config.weatherForecast && !inGreenhouse) ? (((+ weatherForecastTodayNum) - parseFloat(adapter.config.thresholdRain)).toFixed(1)) : 0;
721
724
  }
722
725
 
723
726
  for(const res of result) {
@@ -738,7 +741,7 @@ function startTimeSprinkle() {
738
741
  }
739
742
 
740
743
  // Test Bodenfeuchte
741
- if (adapter.config.debug) {adapter.log.info('Bodenfeuchte: ' + res.soilMoisture.val + ' <= ' + res.soilMoisture.triggersIrrigation + ' AutoOn: ' + res.autoOn);}
744
+ adapter.log.debug(`Bodenfeuchte: ${res.soilMoisture.val} <= ${res.soilMoisture.triggersIrrigation} AutoOn: ${res.autoOn}`);
742
745
  if (res.autoOn) {
743
746
  switch (res.methodControlSM) {
744
747
  // -- bistable -- Bodenfeuchte-Sensor mit 2-Punkt-Regler true und false -- //
@@ -746,7 +749,7 @@ function startTimeSprinkle() {
746
749
  if(res.soilMoisture.bool) {
747
750
  /* Wenn in der Config Regenvorhersage aktiviert: Startvorgang abbrechen, wenn der Regen den eingegebenen Schwellwert überschreitet. */
748
751
  if (resRain(res.inGreenhouse) <= 0) {
749
- let curWateringTime = Math.round(60 * res.wateringTime * evaporation.timeExtension(res.wateringAdd));
752
+ const curWateringTime = Math.round(60 * res.wateringTime * evaporation.timeExtension(res.wateringAdd));
750
753
  memAddList.push({
751
754
  auto: true,
752
755
  sprinkleID: res.sprinkleID,
@@ -756,7 +759,7 @@ function startTimeSprinkle() {
756
759
  } else if (adapter.config.weatherForecast) {
757
760
  /* Bewässerung unterdrückt da ausreichende Regenvorhersage */
758
761
  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 + ' > 0 ]');
762
+ adapter.log.info(`${res.objectName}: Start verschoben, da Regenvorhersage für Heute ${weatherForecastTodayNum} mm [ ${resRain(res.inGreenhouse)} > 0 ]`);
760
763
  }
761
764
  }
762
765
  break;
@@ -778,7 +781,7 @@ function startTimeSprinkle() {
778
781
  } else if (adapter.config.weatherForecast) {
779
782
  /* Bewässerung unterdrückt da ausreichende Regenvorhersage */
780
783
  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 + ' > 0 ]');
784
+ adapter.log.info(`${res.objectName}: Start verschoben, da Regenvorhersage für Heute ${weatherForecastTodayNum} mm [ ${resRain(res.inGreenhouse)} > 0 ]`);
782
785
  }
783
786
  }
784
787
  break;
@@ -788,7 +791,7 @@ function startTimeSprinkle() {
788
791
  if (res.startFixDay[today]) {
789
792
  /* Wenn in der Config Regenvorhersage aktiviert: Startvorgang abbrechen, wenn der Regen den eingegebenen Schwellwert überschreitet. */
790
793
  if (resRain(false) <= 0) {
791
- let curWateringTime = Math.round(60 * res.wateringTime * evaporation.timeExtension(res.wateringAdd));
794
+ const curWateringTime = Math.round(60 * res.wateringTime * evaporation.timeExtension(res.wateringAdd));
792
795
  memAddList.push({
793
796
  auto: true,
794
797
  sprinkleID: res.sprinkleID,
@@ -804,7 +807,7 @@ function startTimeSprinkle() {
804
807
  }
805
808
  } else if (adapter.config.weatherForecast){
806
809
  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 + ' > 0 ]');
810
+ adapter.log.info(`${res.objectName}: Start verschoben, da Regenvorhersage für Heute ${weatherForecastTodayNum} mm [ ${resRain(false)} > 0 ]`);
808
811
  res.startFixDay[today] = false;
809
812
  res.startFixDay[(+ today + 1 > 6) ? (+ today-6) : (+ today+1)] = true;
810
813
  }
@@ -817,7 +820,7 @@ function startTimeSprinkle() {
817
820
  if (res.soilMoisture.val <= res.soilMoisture.triggersIrrigation) {
818
821
  /* Wenn in der Config Regenvorhersage aktiviert: Startvorgang abbrechen, wenn es heute ausreichend regnen sollte. */
819
822
  const resMoisture = (adapter.config.weatherForecast)?((+ res.soilMoisture.val) + (+ weatherForecastTodayNum) - parseFloat(adapter.config.thresholdRain)):(res.soilMoisture.val); // aktualisierte Bodenfeuchte mit Regenvorhersage
820
- if (resMoisture <= res.soilMoisture.triggersIrrigation) { // Kontrolle ob Regenvorhersage ausreicht
823
+ if ((resMoisture <= res.soilMoisture.triggersIrrigation) || res.inGreenhouse) { // Kontrolle ob Regenvorhersage ausreicht || Bewässerung inGreenhouse
821
824
  let countdown = res.wateringTime * (res.soilMoisture.maxIrrigation - res.soilMoisture.val) / (res.soilMoisture.maxIrrigation - res.soilMoisture.triggersIrrigation); // in min
822
825
  // Begrenzung der Bewässerungszeit auf dem in der Config eingestellten Überschreitung (in Prozent)
823
826
  if (countdown > (res.wateringTime * res.wateringAdd / 100)) {countdown = res.wateringTime * res.wateringAdd / 100;}
@@ -830,7 +833,7 @@ function startTimeSprinkle() {
830
833
  } else if (adapter.config.weatherForecast) {
831
834
  /* Bewässerung unterdrückt da ausreichende Regenvorhersage */
832
835
  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 + ' ]');
836
+ adapter.log.info(`${res.objectName}: Start verschoben, da Regenvorhersage für Heute ${weatherForecastTodayNum} mm [ ${res.soilMoisture.val} (${resMoisture}) <= ${res.soilMoisture.triggersIrrigation} ]`);
834
837
  }
835
838
  }
836
839
  break;
@@ -854,418 +857,529 @@ function startTimeSprinkle() {
854
857
  }
855
858
 
856
859
  //
857
- function createSprinklers() {
860
+ async function createSprinklers() {
858
861
  const result = adapter.config.events;
859
862
  if (result) {
860
863
  for(const res of result) {
861
- const objectName = res.sprinkleName.replace(/[.;, ]/g, '_');
864
+ let objectName;
865
+
866
+ if(res.sprinkleName !== '') {
867
+ objectName = res.sprinkleName.replace(/[.;, ]/g, '_');
868
+ } else if (res.sprinkleName === '') {
869
+ objectName = res.name.replace(/[.;, ]/g, '_');
870
+ }
871
+
862
872
  const objPfad = 'sprinkle.' + objectName;
863
873
  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 = {
874
+
875
+ // Create bzw. update .actualSoilMoisture
876
+
877
+ let nameMetConSM, objMetConSM;
878
+ await fillMetConSM(res);
879
+ function fillMetConSM(res) {
880
+ //adapter.log.debug(JSON.stringify(res));
881
+ switch (res.methodControlSM) {
882
+ case 'calculation':
883
+ nameMetConSM = objectName + ' => Calculated soil moisture in %';
884
+ objMetConSM = {
885
+ 'type': 'state',
886
+ 'common': {
887
+ 'role': 'state',
888
+ 'name': nameMetConSM,
889
+ 'type': 'number',
890
+ 'min': 0,
891
+ 'max': 150,
892
+ 'unit': '%',
893
+ 'read': true,
894
+ 'write': false,
895
+ 'def': 50
896
+ },
897
+ 'native': {},
898
+ };
899
+ break;
900
+ case 'bistable':
901
+ nameMetConSM = objectName + ' => bistable soil moisture sensor';
902
+ objMetConSM = {
903
+ 'type': 'state',
904
+ 'common': {
905
+ 'role': 'state',
906
+ 'name': nameMetConSM,
907
+ 'type': 'boolean',
908
+ 'read': true,
909
+ 'write': false,
910
+ 'def': false
911
+ },
912
+ 'native': {},
913
+ };
914
+ break;
915
+ case 'analog':
916
+ nameMetConSM = objectName + ' => analog soil moisture sensor in %';
917
+ objMetConSM = {
918
+ 'type': 'state',
919
+ 'common': {
920
+ 'role': 'state',
921
+ 'name': nameMetConSM,
922
+ 'type': 'number',
923
+ 'min': 0,
924
+ 'max': 150,
925
+ 'unit': '%',
926
+ 'read': true,
927
+ 'write': false
928
+ },
929
+ 'native': {},
930
+ };
931
+ break;
932
+ case 'fixDay':
933
+ nameMetConSM = objectName + ' => start on a fixed day';
934
+ objMetConSM = {
935
+ 'type': 'state',
936
+ 'common': {
937
+ 'role': 'state',
938
+ 'name': nameMetConSM,
939
+ 'type': 'number',
940
+ 'min': 0,
941
+ 'max': 7,
942
+ 'states': {"0":"Sun", "1":"Mon", "2":"Tue", "3":"Wed", "4":"Thur", "5":"Fri", "6":"Sat", "7":"off"},
943
+ 'read': true,
944
+ 'write': false,
945
+ 'def': 7
946
+ },
947
+ 'native': {},
948
+ };
949
+ break;
950
+ default:
951
+ adapter.log.warn(`sprinkleControl cannot created ... Please check your sprinkleControl config ${objectName} methodControl`);
952
+ }
953
+ }
954
+ // ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ //
955
+ // +++++ Objekte erstellen +++++ //
956
+ // ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ //
957
+ if (objectName && objectName !== '') {
958
+ try {
959
+ // Create Object for sprinkle. (ID)
960
+ const _sprinkleNotExist = await adapter.setObjectNotExistsAsync('sprinkle.' + objectName, {
961
+ 'type': 'channel',
962
+ 'common': {
963
+ 'name': res.sprinkleName
964
+ },
965
+ 'native': {},
966
+ }).catch((e) => adapter.log.warn(`sprinkle.${objectName} ${e}`));
967
+ // Create Object for .history
968
+ const _historyNotExist = await adapter.setObjectNotExistsAsync('sprinkle.' + objectName + '.history', {
969
+ 'type': 'channel',
970
+ 'common': {
971
+ 'name': res.sprinkleName + ' => History'
972
+ },
973
+ 'native': {},
974
+ }).catch((e) => adapter.log.warn(`${objectName}.history ${e}`));
975
+ // Create Object for .history.curCalWeekConsumed
976
+ // Sprinkler consumption of the current calendar week => History - Sprinkler-Verbrauch der aktuellen Kalenderwoche (783 Liter)
977
+ const _curCalWeekConsumedNotExist = adapter.setObjectNotExistsAsync(objPfad + '.history.curCalWeekConsumed', {
894
978
  'type': 'state',
895
979
  'common': {
896
- 'role': 'state',
897
- 'name': objName,
898
- 'type': 'number',
899
- 'min': 0,
900
- 'max': 150,
901
- 'unit': '%',
902
- 'read': true,
903
- 'write': false
980
+ 'role': 'state',
981
+ 'name': objectName + ' => History - Sprinkler consumption of the current calendar week',
982
+ 'type': 'number',
983
+ 'unit': 'Liter',
984
+ 'read': true,
985
+ 'write': false,
986
+ 'def': 0
904
987
  },
905
988
  'native': {},
906
- };
907
- break;
908
- case 'bistable':
909
- objName = objectName + ' => bistable soil moisture sensor';
910
- myObj = {
989
+ }).catch((e) => adapter.log.warn(`${objectName}.curCalWeekConsumed ${e}`));
990
+ // Create Object for .history.curCalWeekRunningTime
991
+ // Sprinkler running time of the current calendar week => History - Sprinkler-Laufzeit der aktuellen Kalenderwoche (783 Liter)
992
+ const _curCalWeekRunningTimeNotExist = adapter.setObjectNotExistsAsync(objPfad + '.history.curCalWeekRunningTime', {
911
993
  'type': 'state',
912
994
  'common': {
913
- 'role': 'state',
914
- 'name': objName,
915
- 'type': 'boolean',
916
- 'read': true,
995
+ 'role': 'state',
996
+ 'name': objectName + ' => History - Sprinkler running time of the current calendar week',
997
+ 'type': 'string',
998
+ 'read': true,
917
999
  'write': false,
918
- 'def': false
1000
+ 'def': '00:00'
919
1001
  },
920
1002
  'native': {},
921
- };
922
- break;
923
- case 'analog':
924
- objName = objectName + ' => analog soil moisture sensor in %';
925
- myObj = {
1003
+ }).catch((e) => adapter.log.warn(`${objectName}.curCalWeekRunningTime ${e}`));
1004
+ // Create Object for .history.lastCalWeekConsumed
1005
+ // Sprinkler consumption of the last calendar week => History - Sprinkler-Verbrauch der letzten Kalenderwoche (783 Liter)
1006
+ const _lastCalWeekConsumedNotExist = adapter.setObjectNotExistsAsync(objPfad + '.history.lastCalWeekConsumed', {
1007
+ 'type': 'state',
1008
+ 'common': {
1009
+ 'role': 'state',
1010
+ 'name': objectName + ' => History - Sprinkler consumption of the last calendar week',
1011
+ 'type': 'number',
1012
+ 'unit': 'Liter',
1013
+ 'read': true,
1014
+ 'write': false,
1015
+ 'def': 0
1016
+ },
1017
+ 'native': {},
1018
+ }).catch((e) => adapter.log.warn(`${objectName}.lastCalWeekConsumed ${e}`));
1019
+ // Create Object for .history.lastCalWeekRunningTime
1020
+ // Sprinkler running time of the last calendar week => History - Sprinkler-Laufzeit der letzten Kalenderwoche (783 Liter)
1021
+ const _lastCalWeekRunningTimeNotExist = adapter.setObjectNotExistsAsync(objPfad + '.history.lastCalWeekRunningTime', {
926
1022
  'type': 'state',
927
1023
  'common': {
928
- 'role': 'state',
929
- 'name': objName,
930
- 'type': 'number',
931
- 'min': 0,
932
- 'max': 150,
933
- 'unit': '%',
934
- 'read': true,
935
- 'write': false
1024
+ 'role': 'state',
1025
+ 'name': objectName + ' => History - Sprinkler running time of the last calendar week',
1026
+ 'type': 'string',
1027
+ 'read': true,
1028
+ 'write': false,
1029
+ 'def': '00:00'
936
1030
  },
937
1031
  'native': {},
938
- };
939
- break;
940
- case 'fixDay':
941
- objName = objectName + ' => start on a fixed day';
942
- myObj = {
1032
+ }).catch((e) => adapter.log.warn(`${objectName}.curCalWeekRunningTime ${e}`));
1033
+ // Create Object for .history.lastConsumed
1034
+ // Last consumed of sprinkler => History - Letzte Verbrauchsmenge des Ventils (783 Liter)
1035
+ const _lastConsumedNotExist = adapter.setObjectNotExistsAsync(objPfad + '.history.lastConsumed', {
943
1036
  'type': 'state',
944
1037
  'common': {
945
1038
  'role': 'state',
946
- 'name': objName,
1039
+ 'name': objectName + ' => History - Last consumed of sprinkler',
947
1040
  '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',
1041
+ 'unit': 'Liter',
951
1042
  'read': true,
952
1043
  'write': false,
953
- 'def': 7
1044
+ 'def': 0
954
1045
  },
955
1046
  '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}
1047
+ }).catch((e) => adapter.log.warn(`${objectName}.lastConsumed ${e}`));
1048
+ // Create Object for .history.lastOn
1049
+ // Last On of sprinkler => History - Letzter Start des Ventils (30.03 06:30)
1050
+ const _lastOnNotExist = adapter.setObjectNotExistsAsync(objPfad + '.history.lastOn', {
1051
+ 'type': 'state',
1052
+ 'common': {
1053
+ 'role': 'state',
1054
+ 'name': objectName + ' => History - Last On of sprinkler',
1055
+ 'type': 'string',
1056
+ 'read': true,
1057
+ 'write': false,
1058
+ 'def': '-'
1059
+ },
1060
+ 'native': {},
1061
+ }).catch((e) => adapter.log.warn(`${objectName}.lastOn ${e}`));
1062
+ // Create Object for .history.lastRunningTime
1063
+ // Last running time of sprinkler => History - Letzte Laufzeit des Ventils (0 sek, 47:00 min, 1:03:45 )
1064
+ const _lastRunningTimeNotExist = adapter.setObjectNotExistsAsync(objPfad + '.history.lastRunningTime', {
1065
+ 'type': 'state',
1066
+ 'common': {
1067
+ 'role': 'state',
1068
+ 'name': objectName + ' => History - Last running time',
1069
+ 'type': 'string',
1070
+ 'read': true,
1071
+ 'write': false,
1072
+ 'def': '00:00'
1073
+ },
1074
+ 'native': {},
1075
+ }).catch((e) => adapter.log.warn(`${objectName}.lastRunningTime ${e}`));
1076
+ // Create Object for .autoOn
1077
+ const _autoOnNotExist = await adapter.setObjectNotExistsAsync(objPfad + '.autoOn', {
1078
+ 'type': 'state',
1079
+ 'common': {
1080
+ 'role': 'state',
1081
+ 'name': objectName + ' => Switch automatic mode on / off',
1082
+ 'type': 'boolean',
1083
+ 'read': true,
1084
+ 'write': true,
1085
+ 'def': false
1086
+ },
1087
+ 'native': {},
1088
+ }).catch((e) => adapter.log.warn(`${objectName}.autoOn ${e}`));
1089
+ // Create Object for .actualSoilMoisture
1090
+ const _actualSoilMoistureNotExist = await adapter.setObjectNotExistsAsync(objPfad + '.actualSoilMoisture',
1091
+ objMetConSM
1092
+ ).catch((e) => adapter.log.warn(`${objectName}.autoOn ${e}`));
1093
+ // Create Object for .countdown => Countdown des Ventils
1094
+ const _countdownNotExist = adapter.setObjectNotExistsAsync(objPfad + '.countdown', {
1095
+ 'type': 'state',
1096
+ 'common': {
1097
+ 'role': 'state',
1098
+ 'name': objectName + ' => countdown of sprinkler',
1099
+ 'type': 'string',
1100
+ 'read': true,
1101
+ 'write': false,
1102
+ 'def': '-'
1103
+ },
1104
+ 'native': {},
1105
+ }).catch((e) => adapter.log.warn(`${objectName}.countdown ${e}`));
1106
+ // Create Object for .runningTime => Laufzeit des Ventils
1107
+ const _runningTimeNotExist = await adapter.setObjectNotExistsAsync(objPfad + '.runningTime', {
1108
+ 'type': 'state',
1109
+ 'common': {
1110
+ 'role': 'state',
1111
+ 'name': objectName + ' => running time of sprinkler',
1112
+ 'type': 'string',
1113
+ 'read': true,
1114
+ 'write': true,
1115
+ 'def': '-'
1116
+ },
1117
+ 'native': {},
1118
+ }).catch((e) => adapter.log.warn(`${objectName}.runningTime ${e}`));
1119
+ // Create Object for .sprinklerState => Zustand des Ventils im Thread
1120
+ // <<< 1 = warten >>> ( 0:off; 1:wait; 2:on; 3:break; 4:Boost(on); 5:off(Boost) )
1121
+ // Create .sprinklerState
1122
+ const _sprinklerStateNotExists = await adapter.setObjectNotExistsAsync(objPfad + '.sprinklerState', {
1123
+ 'type': 'state',
1124
+ 'common': {
1125
+ 'role': 'state',
1126
+ 'name': objectName + ' => actual state of sprinkler',
1127
+ 'type': 'number',
1128
+ 'min': 0,
1129
+ 'max': 5,
1130
+ 'states': {
1131
+ "0": "off",
1132
+ "1": "wait",
1133
+ "2": "on",
1134
+ "3": "break",
1135
+ "4": "Boost(on)",
1136
+ "5": "off(Boost)"
1137
+ },
1138
+ 'read': true,
1139
+ 'write': false,
1140
+ 'def': 0
1141
+ },
1142
+ 'native': {}
1143
+ }).catch((e) => adapter.log.warn(`${objectName}.sprinklerState ${e}`));
1144
+ // Create Object for triggerPoint → Schaltpunkt der Bodenfeuchte
1145
+ const _triggerPointNotExist = await adapter.setObjectNotExistsAsync(objPfad + '.triggerPoint', {
1146
+ 'type': 'state',
1147
+ 'common': {
1148
+ 'role': 'state',
1149
+ 'name': objectName + ' => Trigger point of sprinkler',
1150
+ 'type': 'string',
1151
+ 'read': true,
1152
+ 'write': false,
1153
+ 'def': '-'
1154
+ },
1155
+ 'native': {},
1156
+ }).catch((e) => adapter.log.warn(`${objectName}.triggerPoint ${e}`));
1157
+ // Object created
1158
+ let value = true;
1159
+ (await Promise.all([
1160
+ _sprinkleNotExist,
1161
+ _historyNotExist,
1162
+ _curCalWeekConsumedNotExist,
1163
+ _curCalWeekRunningTimeNotExist,
1164
+ _lastCalWeekConsumedNotExist,
1165
+ _lastCalWeekRunningTimeNotExist,
1166
+ _lastConsumedNotExist,
1167
+ _lastOnNotExist,
1168
+ _lastRunningTimeNotExist,
1169
+ _autoOnNotExist,
1170
+ _actualSoilMoistureNotExist,
1171
+ _countdownNotExist,
1172
+ _runningTimeNotExist,
1173
+ _sprinklerStateNotExists,
1174
+ _triggerPointNotExist
1175
+ ])).forEach((val) => {
1176
+ value += val;
1177
+ });
1178
+ if (value){
1179
+ adapter.log.info(`sprinkleControl [sprinkle.${objectName}] was created`);
967
1180
  }
968
- });
969
- if (myName !== objName) {
970
- adapter.setObject(objPfad + '.actualSoilMoisture', myObj);
971
- }
972
- }, 100);
973
-
974
- // Trigger point of sprinkler => Schaltpunkt der Bodenfeuchte
975
- adapter.setObjectNotExists(objPfad + '.triggerPoint', {
976
- 'type': 'state',
977
- 'common': {
978
- 'role': 'state',
979
- 'name': objectName + ' => Trigger point of sprinkler',
980
- 'type': 'string',
981
- 'read': true,
982
- 'write': false,
983
- 'def': '-'
984
- },
985
- 'native': {},
986
- });
987
- // actual state of sprinkler => Zustand des Ventils im Thread
988
- // <<< 1 = warten >>> ( 0:off; 1:wait; 2:on; 3:break; 4:Boost(on); 5:off(Boost) )
989
- // Create .sprinklerState
990
- adapter.setObjectNotExists(objPfad + '.sprinklerState', {
991
- 'type': 'state',
992
- 'common': {
993
- 'role': 'state',
994
- 'name': objectName + ' => actual state of sprinkler',
995
- 'type': 'number',
996
- 'min': 0,
997
- 'max': 5,
998
- 'states': '0:off;1:wait;2:on;3:break;4:Boost(on);5:off(Boost)',
999
- 'read': true,
1000
- 'write': false,
1001
- 'def': 0
1002
- },
1003
- 'native': {},
1004
- });
1005
- // running time of sprinkler => Laufzeit des Ventils
1006
- adapter.setObjectNotExists(objPfad + '.runningTime', {
1007
- 'type': 'state',
1008
- 'common': {
1009
- 'role': 'state',
1010
- 'name': objectName + ' => running time of sprinkler',
1011
- 'type': 'string',
1012
- 'read': true,
1013
- 'write': true,
1014
- 'def': '-'
1015
- },
1016
- 'native': {},
1017
- });
1018
- // countdown of sprinkler => Countdown des Ventils
1019
- adapter.setObjectNotExists(objPfad + '.countdown', {
1020
- 'type': 'state',
1021
- 'common': {
1022
- 'role': 'state',
1023
- 'name': objectName + ' => countdown of sprinkler',
1024
- 'type': 'string',
1025
- 'read': true,
1026
- 'write': false,
1027
- 'def': '-'
1028
- },
1029
- 'native': {},
1030
- });
1031
- // autoOn
1032
- adapter.setObjectNotExists(objPfad + '.autoOn', {
1033
- 'type': 'state',
1034
- 'common': {
1035
- 'role': 'state',
1036
- 'name': objectName + ' => Switch automatic mode on / off',
1037
- 'type': 'boolean',
1038
- 'read': true,
1039
- 'write': true,
1040
- 'def': true
1041
- },
1042
- 'native': {},
1043
- });
1044
- // History - Last running time of sprinkler => History - Letzte Laufzeit des Ventils (0 sek, 47:00 min, 1:03:45 )
1045
- adapter.setObjectNotExists(objPfad + '.history.lastRunningTime', {
1046
- 'type': 'state',
1047
- 'common': {
1048
- 'role': 'state',
1049
- 'name': objectName + ' => History - Last running time',
1050
- 'type': 'string',
1051
- 'read': true,
1052
- 'write': false,
1053
- 'def': '-'
1054
- },
1055
- 'native': {},
1056
- });
1057
- // History - Last On of sprinkler => History - Letzter Start des Ventils (30.03 06:30)
1058
- adapter.setObjectNotExists(objPfad + '.history.lastOn', {
1059
- 'type': 'state',
1060
- 'common': {
1061
- 'role': 'state',
1062
- 'name': objectName + ' => History - Last On of sprinkler',
1063
- 'type': 'string',
1064
- 'read': true,
1065
- 'write': false,
1066
- 'def': '-'
1067
- },
1068
- 'native': {},
1069
- });
1070
- // History - Last consumed of sprinkler => History - Letzte Verbrauchsmenge des Ventils (783 Liter)
1071
- adapter.setObjectNotExists(objPfad + '.history.lastConsumed', {
1072
- 'type': 'state',
1073
- 'common': {
1074
- 'role': 'state',
1075
- 'name': objectName + ' => History - Last consumed of sprinkler',
1076
- 'type': 'number',
1077
- 'unit': 'Liter',
1078
- 'read': true,
1079
- 'write': false,
1080
- 'def': 0
1081
- },
1082
- 'native': {},
1083
- });
1084
- // History - Sprinkler consumption of the current calendar week => History - Sprinkler-Verbrauch der aktuellen Kalenderwoche (783 Liter)
1085
- adapter.setObjectNotExists(objPfad + '.history.curCalWeekConsumed', {
1086
- 'type': 'state',
1087
- 'common': {
1088
- 'role': 'state',
1089
- 'name': objectName + ' => History - Sprinkler consumption of the current calendar week',
1090
- 'type': 'number',
1091
- 'unit': 'Liter',
1092
- 'read': true,
1093
- 'write': false,
1094
- 'def': 0
1095
- },
1096
- 'native': {},
1097
- });
1098
- // History - Sprinkler consumption of the last calendar week => History - Sprinkler-Verbrauch der letzten Kalenderwoche (783 Liter)
1099
- adapter.setObjectNotExists(objPfad + '.history.lastCalWeekConsumed', {
1100
- 'type': 'state',
1101
- 'common': {
1102
- 'role': 'state',
1103
- 'name': objectName + ' => History - Sprinkler consumption of the last calendar week',
1104
- 'type': 'number',
1105
- 'unit': 'Liter',
1106
- 'read': true,
1107
- 'write': false,
1108
- 'def': 0
1109
- },
1110
- 'native': {},
1111
- });
1112
- // History - Sprinkler running time of the current calendar week => History - Sprinkler-Laufzeit der aktuellen Kalenderwoche (783 Liter)
1113
- adapter.setObjectNotExists(objPfad + '.history.curCalWeekRunningTime', {
1114
- 'type': 'state',
1115
- 'common': {
1116
- 'role': 'state',
1117
- 'name': objectName + ' => History - Sprinkler running time of the current calendar week',
1118
- 'type': 'string',
1119
- 'read': true,
1120
- 'write': false,
1121
- 'def': ''
1122
- },
1123
- 'native': {},
1124
- });
1125
- // History - Sprinkler running time of the last calendar week => History - Sprinkler-Laufzeit der letzten Kalenderwoche (783 Liter)
1126
- adapter.setObjectNotExists(objPfad + '.history.lastCalWeekRunningTime', {
1127
- 'type': 'state',
1128
- 'common': {
1129
- 'role': 'state',
1130
- 'name': objectName + ' => History - Sprinkler running time of the last calendar week',
1131
- 'type': 'string',
1132
- 'read': true,
1133
- 'write': false,
1134
- 'def': ''
1135
- },
1136
- 'native': {},
1137
- });
1138
1181
 
1139
- setTimeout(() => {
1140
- switch (myConfig.config[j].methodControlSM) {
1141
- case 'bistable':
1142
- if(myConfig.config[j].triggerSM.length > 5) {
1143
- adapter.getForeignState(myConfig.config[j].triggerSM, (err,state) => {
1144
- if (typeof state !== undefined && typeof state.val === 'boolean') {
1145
- myConfig.setSoilMoistBool(myConfig.config[j].sprinkleID, state.val);
1146
- }
1147
- });
1148
- }
1149
- adapter.setState(objPfad + '.triggerPoint', {
1150
- val: '-',
1151
- ack: true
1152
- });
1153
- break;
1182
+ // ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ //
1183
+ // +++++ zustände der States aktualisieren +++++ //
1184
+ // ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ //
1185
+
1186
+ // Abfrage, ob sich die Bewässerungsart geändert hat
1187
+ const _actualSoilMoistureObj = await adapter.getObjectAsync(objPfad + '.actualSoilMoisture').catch((e) => adapter.log.warn(e));
1188
+ if (_actualSoilMoistureObj) {
1189
+ if (typeof _actualSoilMoistureObj.common.name !== 'string' || _actualSoilMoistureObj.common.name !== nameMetConSM) { // Objekt wurde ausgelesen
1190
+ await adapter.setObjectAsync(
1191
+ objPfad + '.actualSoilMoisture',
1192
+ objMetConSM
1193
+ ).catch((e) => adapter.log.warn(e));
1194
+ adapter.log.info(`sprinkleControl [sprinkle.${objectName}.actualSoilMoisture] was updated`);
1154
1195
 
1155
- case 'analog':
1156
- if (myConfig.config[j].triggerSM.length > 5) {
1157
- adapter.getForeignState(myConfig.config[j].triggerSM, (err,state) => {
1158
- if (typeof state !== undefined && state.val) {
1159
- myConfig.setSoilMoistPct(myConfig.config[j].sprinkleID, state.val);
1160
- }
1161
- });
1162
1196
  }
1163
- adapter.setState(objPfad + '.triggerPoint', {
1164
- val: (myConfig.config[j].soilMoisture.pctTriggerIrrigation).toString(),
1165
- ack: true
1166
- });
1167
- break;
1197
+ }
1198
+ //
1199
+ if (await _autoOnNotExist) {
1200
+ const _autoOn = await adapter.getStateAsync(objPfad + '.autoOn').catch((e) => adapter.log.warn(e));
1201
+ if (_autoOn && _autoOn.val) {
1202
+ if (typeof _autoOn.val === 'boolean' && ((new Date () - _autoOn.ts) > 60000)) {
1203
+ myConfig.config[j].autoOn = _autoOn.val;
1204
+ } else {
1205
+ adapter.setStateAsync(
1206
+ objPfad + '.autoOn',
1207
+ true,
1208
+ true
1209
+ ).catch((e) => adapter.log.warn(`${objectName}.autoOn ${e}`));
1210
+ myConfig.config[j].autoOn = true;
1211
+ }
1212
+ }
1213
+ }
1214
+ //
1215
+ if(await _countdownNotExist){
1216
+ const _countdown = await adapter.getStateAsync(objPfad + '.countdown').catch((e) => adapter.log.warn(`${objectName}.countdown ${e}`));
1217
+ if (_countdown && _countdown.val !== '0') {
1218
+ adapter.setStateAsync(
1219
+ objPfad + '.countdown',
1220
+ '0',
1221
+ true
1222
+ ).catch((e) => adapter.log.warn(e));
1223
+ }
1224
+ }
1225
+ //
1226
+ if (_runningTimeNotExist) {
1227
+ const _runningTime = await adapter.getStateAsync(objPfad + '.runningTime').catch((e) => adapter.log.warn(`${objectName}.runningTime ${e}`));
1228
+ if (_runningTime && _runningTime.val !== '00:00') {
1229
+ adapter.setStateAsync(objPfad + '.runningTime',
1230
+ '00:00',
1231
+ true
1232
+ ).catch((e) => adapter.log.warn(e));
1233
+ }
1234
+ }
1235
+ //
1236
+ if (_sprinklerStateNotExists){
1237
+ const _sprinklerState = await adapter.getStateAsync(objPfad + '.sprinklerState').catch((e) => adapter.log.warn(`${objectName}.sprinklerState ${e}`));
1238
+ if (_sprinklerState && _sprinklerState.val !== 0) {
1239
+ await adapter.setStateAsync(objPfad + '.sprinklerState',
1240
+ 0,
1241
+ true
1242
+ ).catch((e) => adapter.log.warn(`${objectName}.sprinklerState ${e}`));
1243
+ }
1244
+ }
1245
+ // Festlegen des Schaltpunktes für den nächsten Start
1246
+ switch (myConfig.config[j].methodControlSM) {
1247
+ case 'bistable':
1248
+ // Sensor soil moisture => Sensor Bodenfeuchte
1249
+ const _triggerSMBistabile = await adapter.getForeignStateAsync(myConfig.config[j].triggerSM).catch((e) => adapter.log.warn(`${objectName}.triggerSMBistabile ${e}`));
1250
+ if (_triggerSMBistabile && typeof _triggerSMBistabile.val === 'boolean') {
1251
+ myConfig.setSoilMoistBool(myConfig.config[j].sprinkleID, _triggerSMBistabile.val);
1252
+ } else {
1253
+ myConfig.setSoilMoistBool(myConfig.config[j].sprinkleID, true);
1254
+ adapter.log.warn(`The bistable sensor ${myConfig.config[j].triggerSM} in ${objectName} does not deliver correct values!`)
1255
+ }
1168
1256
 
1169
- case 'fixDay':
1170
- curNextFixDay(myConfig.config[j].sprinkleID, false);
1171
- adapter.setState(objPfad + '.triggerPoint', {
1172
- val: '-',
1173
- ack: true
1174
- });
1175
- break;
1257
+ adapter.setStateAsync(objPfad + '.triggerPoint',
1258
+ '-',
1259
+ true
1260
+ ).catch((e) => adapter.log.warn(`${objectName}.triggerPoint ${e}`));
1261
+ break;
1176
1262
 
1177
- case 'calculation':
1178
- adapter.getState(objPfad + '.actualSoilMoisture', (err, state) => {
1179
- if (state == null || typeof state.val !== 'number' || state.val === 0) {
1180
- adapter.setState(objPfad + '.actualSoilMoisture', {
1181
- val: myConfig.config[j].soilMoisture.pct,
1182
- ack: true
1183
- });
1263
+ case 'analog':
1264
+ // Sensor soil moisture => Sensor Bodenfeuchte
1265
+ /**
1266
+ * Schaltpunkt '.triggerSM' auslesen
1267
+ * @type {ioBroker.State | void} _triggerSM - Schaltpunkt
1268
+ * @private
1269
+ */
1270
+ const _triggerSMAnalog = await adapter.getForeignStateAsync(myConfig.config[j].triggerSM).catch((e) => adapter.log.warn(`${objectName}.triggerSMAnalog ${e}`));
1271
+ if (_triggerSMAnalog && (typeof _triggerSMAnalog.val === 'number' || typeof _triggerSMAnalog.val === 'string')) {
1272
+ myConfig.setSoilMoistPct(myConfig.config[j].sprinkleID, _triggerSMAnalog.val);
1184
1273
  } else {
1185
- // num Wert der Bodenfeuchte berechnen und der config speichern wenn Wert zwischen 0 und max liegt
1186
- if ((0 < state.val) && (state.val <= (myConfig.config[j]).soilMoisture.maxRain*100/myConfig.config[j].soilMoisture.maxIrrigation)) {
1187
- myConfig.config[j].soilMoisture.val = state.val * myConfig.config[j].soilMoisture.maxIrrigation / 100;
1188
- myConfig.config[j].soilMoisture.pct = state.val;
1274
+ await adapter.setStateAsync(objPfad + '.actualSoilMoisture',
1275
+ 50,
1276
+ true
1277
+ );
1278
+ adapter.log.warn(`The analoge sensor ${myConfig.config[j].triggerSM} in ${objectName} does not deliver correct values!`)
1279
+ }
1280
+ adapter.setStateAsync(objPfad + '.triggerPoint',
1281
+ (myConfig.config[j].soilMoisture.pctTriggerIrrigation).toString(),
1282
+ true
1283
+ ).catch((e) => adapter.log.warn(`${objectName}.triggerPoint setState ${e}`));
1284
+ break;
1285
+
1286
+ case 'fixDay':
1287
+
1288
+ /** @type {number} */
1289
+ const nextStartDay = ((today + 1) > 6 ? 0 : (today + 1));
1290
+
1291
+ /**
1292
+ * Neuen Start-Tag für Dreitage- und Zweitage-modus setzen
1293
+ * @param {boolean} threeRd - Dreitage-modus Ja/Nein
1294
+ * true → Dreitage-modus (treeRD)
1295
+ * false → Zweitage-modus (twoNd)
1296
+ */
1297
+ async function setNewDay (threeRd) {
1298
+ const today = formatTime(adapter,'', 'day');
1299
+ /**
1300
+ *
1301
+ * @type {ioBroker.GetStatePromise} _actualSoilMoisture
1302
+ * @private {ioBroker.State|Void} _actualSoilMoisture
1303
+ */
1304
+ const _actualSoilMoisture = await adapter.getStateAsync(
1305
+ objPfad + '.actualSoilMoisture'
1306
+ ).catch((e) => adapter.log.warn(`${objectName}.actualSoilMoisture fixDay setState ${e}`));
1307
+ if (_actualSoilMoisture && (typeof _actualSoilMoisture.val === 'number')) {
1308
+ if ((_actualSoilMoisture.val >= 0) && (_actualSoilMoisture.val <= 6)) {
1309
+ if ((threeRd)
1310
+ && (_actualSoilMoisture.val === (((today + 3) > 6) ? 2 : (today + 3)))
1311
+ || (_actualSoilMoisture.val === (((today + 2) > 6) ? 1 : (today + 2)))
1312
+ || (_actualSoilMoisture.val === (((today + 1) > 6) ? 0 : (today + 1)))
1313
+ || (_actualSoilMoisture.val === today)) {
1314
+ myConfig.config[j].startFixDay[_actualSoilMoisture.val] = true;
1315
+ } else {
1316
+ myConfig.config[j].startFixDay[nextStartDay] = true;
1317
+ }
1318
+ } else {
1319
+ myConfig.config[j].startFixDay[nextStartDay] = true;
1320
+ }
1321
+ curNextFixDay(myConfig.config[j].sprinkleID, false);
1322
+ }
1323
+ }
1324
+
1325
+ if (myConfig.config[j].startDay === 'threeRd') {
1326
+ await setNewDay(true);
1327
+ } else if (myConfig.config[j].startDay === 'twoNd') {
1328
+ await setNewDay(false);
1329
+ } else if (myConfig.config[j].startDay === 'fixDay') {
1330
+ adapter.log.info(`set Day (fixDay): ${myConfig.config[j].objectName}`);
1331
+ curNextFixDay(myConfig.config[j].sprinkleID, false);
1332
+ }
1333
+
1334
+ adapter.setStateAsync(objPfad + '.triggerPoint',
1335
+ '-',
1336
+ true
1337
+ ).catch((e) => adapter.log.warn(`${objectName}.triggerPoint fixDay setState ${e}`));
1338
+ break;
1339
+
1340
+ case 'calculation':
1341
+
1342
+ const _actualSoilMoisture = await adapter.getStateAsync(objPfad + '.actualSoilMoisture').catch((e) => adapter.log.warn(e));
1343
+ if (_actualSoilMoisture) {
1344
+ if (await _actualSoilMoisture && typeof _actualSoilMoisture.val !== 'number' || _actualSoilMoisture.val === 0) {
1345
+ adapter.setStateAsync(objPfad + '.actualSoilMoisture',
1346
+ myConfig.config[j].soilMoisture.pct,
1347
+ true
1348
+ ).catch((e) => adapter.log.warn(e));
1189
1349
  } else {
1190
- // Wert aus config übernehmen
1191
- adapter.setState(objPfad + '.actualSoilMoisture', {
1192
- val: myConfig.config[j].soilMoisture.pct,
1193
- ack: true
1194
- });
1350
+ // num Wert der Bodenfeuchte berechnen und in der config speichern, wenn Wert zwischen 0 und max liegt
1351
+ if ((0 < _actualSoilMoisture.val) && (_actualSoilMoisture.val <= (myConfig.config[j]).soilMoisture.maxRain*100/myConfig.config[j].soilMoisture.maxIrrigation)) {
1352
+ myConfig.config[j].soilMoisture.val = _actualSoilMoisture.val * myConfig.config[j].soilMoisture.maxIrrigation / 100;
1353
+ myConfig.config[j].soilMoisture.pct = _actualSoilMoisture.val;
1354
+ } else {
1355
+ // Wert aus config übernehmen
1356
+ adapter.setStateAsync(objPfad + '.actualSoilMoisture',
1357
+ myConfig.config[j].soilMoisture.pct,
1358
+ true
1359
+ ).catch((e) => adapter.log.warn(e));
1360
+ }
1195
1361
  }
1196
1362
  }
1197
- });
1198
- adapter.setState(objPfad + '.triggerPoint', {
1199
- val: (myConfig.config[j].soilMoisture.pctTriggerIrrigation).toString(),
1200
- ack: true
1201
- });
1202
- break;
1203
- }
1204
1363
 
1205
- adapter.getState(objPfad + '.sprinklerState', (err, state) => {
1206
- if (state) {
1207
- adapter.setState(objPfad + '.sprinklerState', {val: 0, ack: true});
1208
- }
1209
- });
1210
- adapter.getState(objPfad + '.runningTime', (err, state) => {
1211
- if (state) {
1212
- adapter.setState(objPfad + '.runningTime', {val: '00:00', ack: true});
1213
- }
1214
- });
1215
- adapter.getState(objPfad + '.countdown', (err, state) => {
1216
- if (state) {
1217
- adapter.setState(objPfad + '.countdown', {val: '0', ack: true});
1218
- }
1219
- });
1220
- adapter.getState(objPfad + '.autoOn', (err, state) => {
1221
- if (state) {
1222
- if (typeof state.val === 'boolean' && ((new Date () - state.ts) > 60000)) {
1223
- myConfig.config[j].autoOn = state.val;
1224
- } else {
1225
- adapter.setState(objPfad + '.autoOn', {val: true, ack: true});
1226
- myConfig.config[j].autoOn = true;
1364
+ adapter.setStateAsync(objPfad + '.triggerPoint',
1365
+ (myConfig.config[j].soilMoisture.pctTriggerIrrigation).toString(),
1366
+ true
1367
+ ).catch((e) => adapter.log.warn(e));
1368
+ break;
1369
+
1227
1370
  }
1228
- }
1229
- });
1230
- // history
1231
- adapter.getState(objPfad + '.history.lastRunningTime', (err, state) => {
1232
- if (state.val === false) {
1233
- adapter.setState(objPfad + '.history.lastRunningTime', {val: '00:00', ack: true});
1234
- }
1235
- });
1236
- adapter.getState(objPfad + '.history.lastOn', (err, state) => {
1237
- if (state.val === false) {
1238
- adapter.setState(objPfad + '.history.lastOn', {val: '-', ack: true});
1239
- }
1240
- });
1241
- adapter.getState(objPfad + '.history.lastConsumed', (err, state) => {
1242
- if (state.val === false) {
1243
- adapter.setState(objPfad + '.history.lastConsumed', {val: 0, ack: true});
1244
- }
1245
- });
1246
- adapter.getState(objPfad + '.history.curCalWeekConsumed', (err, state) => {
1247
- if (state.val === false) {
1248
- adapter.setState(objPfad + '.history.curCalWeekConsumed', {val: 0, ack: true});
1249
- }
1250
- });
1251
- adapter.getState(objPfad + '.history.lastCalWeekConsumed', (err, state) => {
1252
- if (state.val === false) {
1253
- adapter.setState(objPfad + '.history.lastCalWeekConsumed', {val: 0, ack: true});
1254
- }
1255
- });
1256
- adapter.getState(objPfad + '.history.curCalWeekRunningTime', (err, state) => {
1257
- if (state.val === false) {
1258
- adapter.setState(objPfad + '.history.curCalWeekRunningTime', {val: '00:00', ack: true});
1259
- }
1260
- });
1261
- adapter.getState(objPfad + '.history.lastCalWeekRunningTime', (err, state) => {
1262
- if (state.val === false) {
1263
- adapter.setState(objPfad + '.history.lastCalWeekRunningTime', {val: '00:00', ack: true});
1264
- }
1265
- });
1266
- },1500);
1371
+
1372
+ } catch (e) {
1373
+ adapter.log.warn(`sprinkleControl cannot created ... Please check your sprinkleControl config: ${e}`);
1374
+ }
1375
+ } else {
1376
+ adapter.log.warn('sprinkleControl cannot created ... Please check in your config the sprinkle Name')
1377
+ }
1267
1378
  }
1268
- // delete old sprinkle
1379
+
1380
+ // ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ //
1381
+ // +++++ Objekte löschen +++++ //
1382
+ // ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ //
1269
1383
  for(const i in ObjSprinkle) {
1270
1384
 
1271
1385
  const resID = ObjSprinkle[i]._id;
@@ -1281,60 +1395,66 @@ function createSprinklers() {
1281
1395
  fullRes.push(res);
1282
1396
  }
1283
1397
  }
1284
- setTimeout(() => {
1285
-
1286
- if (fullRes.indexOf(resultID) === -1) {
1287
- // State löschen
1288
-
1289
- // History - Objekt(Ordner) löschen
1290
- adapter.delObject(resID + '.history', function (err) {
1291
- if (err) {
1292
- adapter.log.warn(err);
1293
- }
1294
- });
1295
- // State löschen
1296
- adapter.delObject(resID + '.actualSoilMoisture'); // "sprinklecontrol.0.sprinkle.???.actualSoilMoisture"
1297
- adapter.delObject(resID + '.triggerPoint'); // "sprinklecontrol.0.sprinkle.???.triggerPoint"
1298
- adapter.delObject(resID + '.sprinklerState'); // "sprinklecontrol.0.sprinkle.???.sprinklerState"
1299
- adapter.delObject(resID + '.runningTime'); // "sprinklecontrol.0.sprinkle.???.runningTime"
1300
- adapter.delObject(resID + '.countdown'); // "sprinklecontrol.0.sprinkle.???.countdown"
1301
- adapter.delObject(resID + '.autoOn'); // "sprinklecontrol.0.sprinkle.???.autoOn"
1302
- adapter.delObject(resID + '.history.lastOn'); // "sprinklecontrol.0.sprinkle.???..history.lastOn"
1303
- adapter.delObject(resID + '.history.lastConsumed'); // "sprinklecontrol.0.sprinkle.???..history.lastConsumed"
1304
- adapter.delObject(resID + '.history.lastRunningTime'); // "sprinklecontrol.0.sprinkle.???.history.lastRunningTime"
1305
- adapter.delObject(resID + '.history.curCalWeekConsumed'); // "sprinklecontrol.0.sprinkle.???.history.curCalWeekConsumed"
1306
- adapter.delObject(resID + '.history.lastCalWeekConsumed'); // "sprinklecontrol.0.sprinkle.???.history.lastCalWeekConsumed"
1307
- adapter.delObject(resID + '.history.curCalWeekRunningTime'); // "sprinklecontrol.0.sprinkle.???.history.curCalWeekRunningTime"
1308
- adapter.delObject(resID + '.history.lastCalWeekRunningTime'); // "sprinklecontrol.0.sprinkle.???.history.lastCalWeekRunningTime"
1309
- // Objekt(Ordner) löschen
1310
- adapter.delObject(resID, function (err) {
1311
- if (err) {
1312
- adapter.log.warn(err);
1313
- }
1314
- });
1315
- }
1316
- }, 1500);
1317
1398
 
1399
+ if (fullRes.indexOf(resultID) === -1) {
1400
+ try {
1401
+ // object deleted
1402
+ Promise.all([
1403
+ adapter.delObjectAsync(resID + '.actualSoilMoisture'), // "sprinklecontrol.0.sprinkle.???.actualSoilMoisture"
1404
+ adapter.delObjectAsync(resID + '.triggerPoint'), // "sprinklecontrol.0.sprinkle.???.triggerPoint"
1405
+ adapter.delObjectAsync(resID + '.sprinklerState'), // "sprinklecontrol.0.sprinkle.???.sprinklerState"
1406
+ adapter.delObjectAsync(resID + '.runningTime'), // "sprinklecontrol.0.sprinkle.???.runningTime"
1407
+ adapter.delObjectAsync(resID + '.countdown'), // "sprinklecontrol.0.sprinkle.???.countdown"
1408
+ adapter.delObjectAsync(resID + '.autoOn'), // "sprinklecontrol.0.sprinkle.???.autoOn"
1409
+ adapter.delObjectAsync(resID + '.history.lastOn'), // "sprinklecontrol.0.sprinkle.???..history.lastOn"
1410
+ adapter.delObjectAsync(resID + '.history.lastConsumed'), // "sprinklecontrol.0.sprinkle.???..history.lastConsumed"
1411
+ adapter.delObjectAsync(resID + '.history.lastRunningTime'), // "sprinklecontrol.0.sprinkle.???.history.lastRunningTime"
1412
+ adapter.delObjectAsync(resID + '.history.curCalWeekConsumed'), // "sprinklecontrol.0.sprinkle.???.history.curCalWeekConsumed"
1413
+ adapter.delObjectAsync(resID + '.history.lastCalWeekConsumed'), // "sprinklecontrol.0.sprinkle.???.history.lastCalWeekConsumed"
1414
+ adapter.delObjectAsync(resID + '.history.curCalWeekRunningTime'), // "sprinklecontrol.0.sprinkle.???.history.curCalWeekRunningTime"
1415
+ adapter.delObjectAsync(resID + '.history.lastCalWeekRunningTime'), // "sprinklecontrol.0.sprinkle.???.history.lastCalWeekRunningTime"
1416
+ // History - Objekt(Ordner.history) löschen
1417
+ await adapter.delObjectAsync(resID + '.history'),
1418
+ // Objekt(Ordner) löschen
1419
+ await adapter.delObjectAsync(resID)
1420
+ ]).then((resultID)=>{
1421
+ adapter.log.info(`sprinkleControl [${resultID}] was deleted`);
1422
+ })
1423
+ } catch (e) {
1424
+ adapter.log.warn(e);
1425
+ }
1426
+ }
1318
1427
  }
1319
-
1320
1428
  }
1321
1429
  }
1322
-
1430
+ ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
1431
+ /**
1432
+ *
1433
+ * @param {number} ms => Waiting time in ms
1434
+ * @return {Promise<unknown>}
1435
+ */
1436
+ async function sleep(ms) {
1437
+ return new Promise(async (resolve) => {
1438
+ // @ts-ignore
1439
+ timerSleep = setTimeout(async () => resolve(), ms);
1440
+ });
1441
+ }
1442
+ ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
1323
1443
  /**
1324
1444
  *
1325
1445
  * @param {ioBroker.Adapter} adapter
1326
1446
  */
1327
1447
  function main(adapter) {
1328
1448
 
1329
- /* The adapters config (in the instance object everything under the attribute "native") is accessible via
1449
+ /* The adapters' config (in the instance object everything under the attribute "native") is accessible via
1330
1450
  * adapter.config:
1331
1451
  * => Auf die Adapterkonfiguration (im Instanz objekt alles unter dem Attribut "native") kann zugegriffen werden über
1332
1452
  adapter.config:
1333
1453
  */
1334
- adapter.log.debug(JSON.stringify(adapter.config.events));
1454
+ adapter.log.debug(`adapter.config.events: ${JSON.stringify(adapter.config.events)}`);
1335
1455
 
1336
1456
  /**
1337
- * The adapters config (in the instance object everything under the attribute "native") is accessible via adapter.config:
1457
+ * The adapters' config (in the instance object everything under the attribute "native") is accessible via adapter.config:
1338
1458
  * => Auf die Adapterkonfiguration (im Instanz objekt alles unter dem Attribut "native") kann zugegriffen werden über adapter.config:
1339
1459
  * @param {any} err
1340
1460
  * @param {any} obj
@@ -1347,11 +1467,11 @@ function main(adapter) {
1347
1467
  }
1348
1468
  });
1349
1469
 
1350
- GetSystemData();
1470
+ GetSystemData().then();
1351
1471
  sendMessageText.initConfigMessage(adapter);
1352
1472
 
1353
1473
  timer = setTimeout(function() {
1354
- checkActualStates();
1474
+ checkActualStates().then();
1355
1475
  // init evaporation
1356
1476
  evaporation.initEvaporation(adapter);
1357
1477
  // Hauptpumpe zur Bewässerung setzen