iobroker.sprinklecontrol 0.2.9 → 0.2.12

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
@@ -29,19 +29,27 @@ const adapterName = require('./package.json').name.split('.').pop();
29
29
  let publicHolidayStr;
30
30
  /** @type {any} */
31
31
  let publicHolidayTomorrowStr;
32
- /* DasWetter.com */
32
+ /* Regenvorhersage - DasWetter.com */
33
+ /** @type {string}
34
+ * - Pfad zur Regenvorhersage in mm */
35
+ let weatherForecastTodayPfadStr;
33
36
  /** @type {number}
34
37
  * - heutige Regenvorhersage in mm */
35
38
  let weatherForecastTodayNum = 0;
36
39
  /** @type {number}
37
40
  * - morgige Regenvorhersage in mm */
38
41
  let weatherForecastTomorrowNum = 0;
42
+ /** @type {boolean}
43
+ * - Externer Schalter für Zusatzbewässerung */
44
+ let addStartTimeSwitch = false;
39
45
 
40
46
  /** @type {string} */
41
47
  let startTimeStr;
42
48
  /** @type {string} */
43
49
  let sunriseStr;
44
50
  /** @type {string} */
51
+ let sunsetStr;
52
+ /** @type {string} */
45
53
  let goldenHourEnd;
46
54
  /** switch => sprinklecontrol.*.control.Holiday
47
55
  * - Wenn (Holiday == true) ist, soll das Wochenendprogramm gefahren werden.
@@ -73,7 +81,13 @@ function startAdapter(options) {
73
81
  adapter = new utils.Adapter(options);
74
82
 
75
83
  // start here!
76
- adapter.on('ready', () => main(adapter));
84
+ adapter.on('ready', () => {
85
+ // init createConfig
86
+ myConfig.createConfig(adapter);
87
+ // Hauptpumpe zur Bewässerung setzen
88
+ valveControl.initValveControl(adapter);
89
+ main(adapter)
90
+ });
77
91
 
78
92
  /**
79
93
  * +++++++++++++++++++++++++ is called when adapter shuts down +++++++++++++++++++++++++
@@ -94,6 +108,7 @@ function startAdapter(options) {
94
108
  /*Startzeiten der Timer löschen*/
95
109
  schedule.cancelJob('calcPosTimer');
96
110
  schedule.cancelJob('sprinkleStartTime');
111
+ schedule.cancelJob('sprinkleAddStartTime');
97
112
  /* alle Ventile und Aktoren deaktivieren */
98
113
  valveControl.clearEntireList();
99
114
 
@@ -108,7 +123,7 @@ function startAdapter(options) {
108
123
  * -------------- Antwortet bei Aufrufen von getTelegramUser von index_m ---------------
109
124
  * @param {object} obj
110
125
  */
111
- adapter.on('message', (obj) => {
126
+ adapter.on ('message', (obj) => {
112
127
  if (obj) {
113
128
  switch (obj.command) {
114
129
  case 'getTelegramUser':
@@ -116,7 +131,7 @@ function startAdapter(options) {
116
131
  err && adapter.log.error(err);
117
132
  if (state && state.val) {
118
133
  try {
119
- adapter.log.info('getTelegramUser:' + state.val);
134
+ adapter.log.debug('getTelegramUser:' + state.val);
120
135
  adapter.sendTo(obj.from, obj.command, JSON.parse(state.val), obj.callback);
121
136
  } catch (err) {
122
137
  err && adapter.log.error(err);
@@ -160,6 +175,11 @@ function startAdapter(options) {
160
175
  holidayStr = state.val;
161
176
  startTimeSprinkle();
162
177
  }
178
+ // wenn (addStartTimeSwitch == true) wird die zusätzliche Bewässerung aktiviert
179
+ if (id === `${adapter.namespace}.control.addStartTimeSwitch`
180
+ && typeof state.val === 'boolean') {
181
+ addStartTimeSwitch = state.val;
182
+ }
163
183
  // wenn (autoOnOff == false) so werden alle Sprenger nicht mehr automatisch gestartet.
164
184
  if (id === adapter.namespace + '.control.autoOnOff') {
165
185
  autoOnOffStr = state.val;
@@ -205,13 +225,30 @@ function startAdapter(options) {
205
225
  }
206
226
  }
207
227
  }
208
-
209
228
  // wenn (...sprinkleName.autoOn == false[off]) so wird der aktuelle Sprenger [sprinkleName]
210
229
  // bei false nicht automatisch gestartet
211
230
  if (myConfig.config && (typeof state.val === 'boolean')) {
212
231
  const found = myConfig.config.find(d => d.autoOnID === id);
213
- if (found && id === myConfig.config[found.sprinkleID].autoOnID) { myConfig.config[found.sprinkleID].autoOn = state.val; }
232
+ if (found && id === myConfig.config[found.sprinkleID].autoOnID) {
233
+ myConfig.config[found.sprinkleID].autoOn = state.val;
234
+ valveControl.addList(
235
+ [{
236
+ auto: false,
237
+ sprinkleID: found.sprinkleID,
238
+ wateringTime: 0
239
+ }]);
240
+ }
241
+ }
242
+
243
+ // postponeByOneDay → um einen Tag verschieben bei fixDay (twoNd & threeRd)
244
+ let idSplit = id.split('.', 5);
245
+ if (idSplit[4] === `postponeByOneDay`) {
246
+ const found = myConfig.config.find(d => d.objectName === idSplit[3]);
247
+ if (found) {
248
+ myConfig.postponeByOneDay(found.sprinkleID).catch((e) => {adapter.log.warn(`postponeByOneDay: ${e}`)});
249
+ }
214
250
  }
251
+
215
252
  // Change in outside temperature → Änderung der Außentemperatur
216
253
  if (id === adapter.config.sensorOutsideTemperature) { /*Temperatur*/
217
254
  if (!Number.isNaN(Number.parseFloat(state.val))) {
@@ -267,7 +304,7 @@ function startAdapter(options) {
267
304
  }
268
305
  // Wettervorhersage
269
306
  if (adapter.config.weatherForecast === true) {
270
- if (id === adapter.config.weatherForInstance + '.NextDaysDetailed.Location_1.Day_1.rain_value') {
307
+ if (id === weatherForecastTodayPfadStr) {
271
308
  if (typeof state.val == 'string') {
272
309
  weatherForecastTodayNum = parseFloat(state.val);
273
310
  } else if (typeof state.val == 'number') {
@@ -320,7 +357,7 @@ async function GetSystemData() {
320
357
 
321
358
  adapter.log.debug(`longitude: ${adapter.config.longitude} | latitude: ${adapter.config.latitude}`);
322
359
  } else {
323
- adapter.log.error('system settings cannot be called up. Please check configuration!');
360
+ adapter.log.error('system settings cannot be called up. Please check the geo data');
324
361
  }
325
362
  } catch (err) {
326
363
  adapter.log.warn('system settings cannot be called up. Please check configuration!');
@@ -364,7 +401,6 @@ function curNextFixDay (sprinkleID, returnOn) {
364
401
  * → Setzt den Status beim Start auf einen definierten Wert
365
402
  */
366
403
  function checkStates() {
367
- //
368
404
  /**
369
405
  * control.Holiday
370
406
  * @param {string|null} err
@@ -381,7 +417,7 @@ function checkStates() {
381
417
  * @param {ioBroker.State|null|undefined} state
382
418
  */
383
419
  adapter.getState('control.autoOnOff', (err, state) => {
384
- if (state && (state.val == null)) {
420
+ if (state && (state.val == null) && (state.val === undefined)) {
385
421
  autoOnOffStr = true;
386
422
  adapter.setState('control.autoOnOff', {
387
423
  val: autoOnOffStr,
@@ -422,8 +458,8 @@ async function checkActualStates () {
422
458
  try {
423
459
  /**
424
460
  * switch Holiday
425
- * @type {ioBroker.GetStatePromise}
426
- * @private {obj} _holiday
461
+ * @type {ioBroker.State | null}
462
+ * @private
427
463
  */
428
464
  const _holiday = await adapter.getStateAsync('control.Holiday');
429
465
  if (_holiday && _holiday.val) {
@@ -432,8 +468,8 @@ async function checkActualStates () {
432
468
 
433
469
  /**
434
470
  * switch autoOnOff
435
- * @type {ioBroker.GetStatePromise}
436
- * @private {obj} _autoOnOff
471
+ * @type {ioBroker.State | null}
472
+ * @private
437
473
  */
438
474
  const _autoOnOff = await adapter.getStateAsync('control.autoOnOff');
439
475
  if (_autoOnOff && _autoOnOff.val) {
@@ -472,7 +508,7 @@ async function checkActualStates () {
472
508
  * @private
473
509
  */
474
510
  const _weatherForInstanceToday = await adapter.getForeignStateAsync(
475
- adapter.config.weatherForInstance + '.NextDaysDetailed.Location_1.Day_1.rain_value'
511
+ weatherForecastTodayPfadStr
476
512
  ).catch((e) => adapter.log.warn(e));
477
513
  if (_weatherForInstanceToday && _weatherForInstanceToday.val) {
478
514
  if (typeof _weatherForInstanceToday.val == 'string') {
@@ -506,16 +542,40 @@ async function checkActualStates () {
506
542
  );
507
543
  }
508
544
  }
545
+
546
+ // wenn (...sprinkleName.autoOn == false[off]) so wird der aktuelle Sprenger [sprinkleName]
547
+ // bei false nicht automatisch gestartet
548
+ /**
549
+ * Abfrage von ...sprinkleName.autoOn
550
+ * @type {[myConfig.config]}
551
+ */
552
+ const result = myConfig.config;
553
+ if (result) {
554
+ for (const res of result) {
555
+ /**
556
+ * Abfrage ... .autoOn beim Start
557
+ * @type {ioBroker.State | void}
558
+ * @private
559
+ */
560
+ const _autoOn = await adapter.getForeignStateAsync(
561
+ res.autoOnID
562
+ ).catch((e) => adapter.log.warn(e));
563
+ if (typeof _autoOn.val === 'boolean') {
564
+ res.autoOn = _autoOn.val;
565
+ }
566
+ }
567
+ }
568
+
509
569
  if (adapter.config.actualValueLevel){
510
570
  /**
511
- * Füllstand der Zisterne in %
571
+ * Füllstand der Zisterne in % holen
512
572
  * @type {ioBroker.State | void}
513
573
  * @private
514
574
  */
515
575
  const _actualValueLevel = await adapter.getForeignStateAsync(
516
576
  adapter.config.actualValueLevel
517
577
  ).catch((e) => adapter.log.warn(e));
518
- if (_actualValueLevel && typeof _actualValueLevel.val !== undefined) {
578
+ if (_actualValueLevel && typeof parseFloat(_actualValueLevel.val) === "number") {
519
579
  valveControl.setFillLevelCistern(parseFloat(_actualValueLevel.val));
520
580
  }
521
581
  }
@@ -528,9 +588,6 @@ async function checkActualStates () {
528
588
  const _list = await adapter.getForeignObjectsAsync(adapter.namespace + '.sprinkle.*', 'channel').catch((e) => adapter.log.warn(e));
529
589
  if (_list) {
530
590
  ObjSprinkle = _list;
531
- await createSprinklers();
532
- await sleep(100);
533
- startTimeSprinkle();
534
591
  }
535
592
 
536
593
  } catch (e) {
@@ -583,6 +640,7 @@ const calcPos = schedule.scheduleJob('calcPosTimer', '5 0 * * *', function() {
583
640
  // Startzeit Festlegen → verzögert wegen Daten von SunCalc
584
641
  setTimeout(() => {
585
642
  startTimeSprinkle();
643
+ addStartTimeSprinkle();
586
644
  },1000);
587
645
 
588
646
  });
@@ -595,11 +653,110 @@ function sunPos() {
595
653
  // format sunrise time from the Date object → Formatieren Sie die Sonnenaufgangszeit aus dem Date-Objekt
596
654
  sunriseStr = ('0' + times.sunrise.getHours()).slice(-2) + ':' + ('0' + times.sunrise.getMinutes()).slice(-2);
597
655
 
598
- // format golden hour end time from the Date object => Formatiere golden hour end time aus dem Date-Objekt
656
+ // format golden hour end time from the Date object Formatiere golden hour end time aus dem Date-Objekt
599
657
  goldenHourEnd = ('0' + times.goldenHourEnd.getHours()).slice(-2) + ':' + ('0' + times.goldenHourEnd.getMinutes()).slice(-2);
658
+
659
+ // format sunset time from the Date object → formatieren Sie die Sonnenuntergangszeit aus dem Date-Objekt
660
+ sunsetStr = sunsetStr = ('0' + times.sunset.getHours()).slice(-2) + ':' + ('0' + times.sunset.getMinutes()).slice(-2);
600
661
 
601
662
  }
602
663
 
664
+ function addStartTimeSprinkle() {
665
+ if (adapter.config.selectAddStartTime === 'greaterETpCurrent' || adapter.config.selectAddStartTime === 'withExternalSignal') {
666
+ let addStartTimeSplit = adapter.config.addWateringStartTime.split(':');
667
+ const scheduleAddStartTime = schedule.scheduleJob('sprinkleAddStartTime', addStartTimeSplit[1] + ' ' + addStartTimeSplit[0] + ' * * *', function() {
668
+ adapter.log.debug(`greaterETpCurrent: ${(adapter.config.selectAddStartTime === 'greaterETpCurrent')} & ${(adapter.config.triggerAddStartTimeETpCur < evaporation.getETpTodayNum())}, withExternalSignal; ${(adapter.config.selectAddStartTime === 'withExternalSignal')} & ${addStartTimeSwitch}`);
669
+ if (((adapter.config.selectAddStartTime === 'greaterETpCurrent') && (adapter.config.triggerAddStartTimeETpCur < evaporation.getETpTodayNum()))
670
+ || (adapter.config.selectAddStartTime === 'withExternalSignal' && addStartTimeSwitch)) {
671
+ let messageText = '';
672
+
673
+ // Filter enabled
674
+ const result = myConfig.config.filter(d => d.enabled === true);
675
+ if (result) {
676
+ /**
677
+ * Array zum flüchtigen Sammeln von Bewässerungsaufgaben
678
+ * @type {Array.<{auto: Boolean, sprinkleID: Number, wateringTime: Number}>}
679
+ */
680
+ const memAddList = [];
681
+
682
+ /**
683
+ * result Rain
684
+ * - (aktuelle Wettervorhersage - Schwellwert der Regenberücksichtigung) wenn Sensor sich im Freien befindet
685
+ * - (> 0) es regnet - Abbruch -
686
+ * - (≤ 0) Start der Bewässerung
687
+ * @param {boolean} inGreenhouse - Sensor befindet sich im Gewächshaus
688
+ * @returns {number} - resultierende Regenmenge
689
+ */
690
+ function resRain (inGreenhouse) {
691
+ return (adapter.config.weatherForecast && !inGreenhouse) ? (((+ weatherForecastTodayNum) - parseFloat(adapter.config.thresholdRain)).toFixed(1)) : 0;
692
+ }
693
+
694
+ for(const res of result) {
695
+ adapter.log.debug(`${res.objectName}: ${res.autoOn}, ${res.addWateringTime}, ${resRain(res.inGreenhouse)} <= 0, if(${res.autoOn && (res.addWateringTime > 0) && (resRain(res.inGreenhouse) <= 0)})`);
696
+ if (res.autoOn // Ventil aktiv
697
+ && (res.addWateringTime > 0) // zusätzliche Bewässerung aktiv time > 0
698
+ && (resRain(res.inGreenhouse) <= 0)) { // keine Regenvorhersage
699
+
700
+
701
+
702
+ switch (res.methodControlSM) {
703
+ case 'bistable':
704
+ if (res.soilMoisture.bool) {
705
+ messageText += `<b>${res.objectName}</b> (${res.soilMoisture.bool})\n`
706
+ + ` START => ${addTime(res.addWateringTime, '')}\n`;
707
+ memAddList.push({
708
+ auto: true,
709
+ sprinkleID: res.sprinkleID,
710
+ wateringTime: res.addWateringTime
711
+ });
712
+ }
713
+ break;
714
+ case 'fixDay':
715
+ messageText += `<b>${res.objectName}</b>\n`
716
+ + ` START => ${addTime(Math.round(60 * res.addWateringTime), '')}\n`;
717
+ memAddList.push({
718
+ auto: true,
719
+ sprinkleID: res.sprinkleID,
720
+ wateringTime: Math.round(60 * res.addWateringTime)
721
+ });
722
+ break;
723
+ case 'calculation':
724
+ let addCountdown = res.wateringTime * (res.soilMoisture.maxIrrigation - res.soilMoisture.val) / (res.soilMoisture.maxIrrigation - res.soilMoisture.triggersIrrigation) - res.wateringTime;
725
+ adapter.log.debug(`addCountdown: ${addCountdown}, addWateringTime: ${res.addWateringTime}, if(${(addCountdown - res.addWateringTime) > 0})`);
726
+ if ((addCountdown - res.addWateringTime) > 0) {
727
+ messageText += `<b>${res.objectName}</b> ${res.soilMoisture.pct}% (${res.soilMoisture.pctTriggerIrrigation}%)\n`
728
+ + ` START => ${addTime(Math.round(60 * addCountdown), '')}\n`;
729
+ memAddList.push({
730
+ auto: true,
731
+ sprinkleID: res.sprinkleID,
732
+ wateringTime: Math.round(60 * addCountdown)
733
+ });
734
+ }
735
+ break;
736
+ case 'analog':
737
+ if (res.soilMoisture.pct < res.soilMoisture.pctAddTriggersIrrigation) {
738
+ messageText += `<b>${res.objectName}</b> ${res.soilMoisture.pct} %(${res.soilMoisture.pctAddTriggersIrrigation}%)\n`
739
+ + ` START => ${addTime(Math.round(60 * res.addWateringTime), '')}\n`;
740
+ memAddList.push({
741
+ auto: true,
742
+ sprinkleID: res.sprinkleID,
743
+ wateringTime: Math.round(60 * res.addWateringTime)
744
+ });
745
+ }
746
+ break;
747
+ }
748
+ valveControl.addList(memAddList);
749
+ }
750
+ }
751
+ if(!sendMessageText.onlySendError() && messageText.length > 0){
752
+ sendMessageText.sendMessage(messageText);
753
+ }
754
+ }
755
+ }
756
+ });
757
+ }
758
+ }
759
+
603
760
  // Determination of the irrigation time => Bestimmung der Bewässerungszeit
604
761
  function startTimeSprinkle() {
605
762
  let startTimeSplit = [];
@@ -610,7 +767,7 @@ function startTimeSprinkle() {
610
767
 
611
768
  // if autoOnOff == false => keine auto Start
612
769
  if (!autoOnOffStr) {
613
- adapter.log.info(`Sprinkle: autoOnOff == Aus( ${autoOnOffStr} )`);
770
+ adapter.log.info(`Sprinkle: autoOnOff == Aus ( ${autoOnOffStr} )`);
614
771
  adapter.setState('info.nextAutoStart', {
615
772
  val: 'autoOnOff = off(0)',
616
773
  ack: true
@@ -654,7 +811,7 @@ function startTimeSprinkle() {
654
811
  break;
655
812
  case 'livingSunrise' : /*Startauswahl = Sonnenaufgang*/
656
813
  infoMessage = 'Start mit Sonnenaufgang ';
657
- // format sunset/sunrise time from the Date object
814
+ // format sunrise time from the Date object
658
815
  newStartTime = addTime(sunriseStr, parseInt(adapter.config.timeShift));
659
816
  break;
660
817
  case 'livingGoldenHourEnd' : /*Startauswahl = Ende der Golden Hour*/
@@ -662,6 +819,11 @@ function startTimeSprinkle() {
662
819
  // format goldenHourEnd time from the Date object
663
820
  newStartTime = goldenHourEnd;
664
821
  break;
822
+ case 'livingSunset' : /*Startauswahl = Sonnenuntergang*/
823
+ infoMessage = 'Start mit Sonnenuntergang ';
824
+ // format sunset time from the Date object
825
+ newStartTime = addTime(sunsetStr, parseInt(adapter.config.timeShift));
826
+ break;
665
827
  }
666
828
  // Start am Wochenende →, wenn andere Zeiten verwendet werden soll
667
829
  if((adapter.config.publicWeekend) && ((myWeekday) === 6 || (myWeekday) === 0)){
@@ -792,9 +954,10 @@ function startTimeSprinkle() {
792
954
  // --- fixDay -- Start an festen Tagen ohne Sensoren --- //
793
955
  // -- Bewässerungstag erreicht //
794
956
  case 'fixDay':
795
- if (res.startFixDay[today]) {
796
- /* Wenn in der Config Regenvorhersage aktiviert: Startvorgang abbrechen, wenn der Regen den eingegebenen Schwellwert überschreitet. */
797
- if (resRain(false) <= 0) {
957
+ /* Wenn in der Config Regenvorhersage aktiviert: Startvorgang abbrechen, wenn der Regen den eingegebenen Schwellwert überschreitet. */
958
+ if (resRain(false) <= 0) {
959
+ // Bewässerungstag erreicht
960
+ if (res.startFixDay[today]) {
798
961
  const curWateringTime = Math.round(60 * res.wateringTime * evaporation.timeExtension(res.wateringAdd));
799
962
  memAddList.push({
800
963
  auto: true,
@@ -809,14 +972,14 @@ function startTimeSprinkle() {
809
972
  res.startFixDay[today] = false;
810
973
  res.startFixDay[(+ today + 2 > 6) ? (+ today-5) : (+ today+2)] = true;
811
974
  }
812
- } else if (adapter.config.weatherForecast){
813
- messageText += ' ' + '<i>' + 'Start verschoben, da heute ' + weatherForecastTodayNum + 'mm Niederschlag' + '</i> ' + '\n';
814
- adapter.log.info(`${res.objectName}: Start verschoben, da Regenvorhersage für Heute ${weatherForecastTodayNum} mm [ ${resRain(false)} > 0 ]`);
815
- res.startFixDay[today] = false;
816
- res.startFixDay[(+ today + 1 > 6) ? (+ today-6) : (+ today+1)] = true;
817
975
  }
818
- curNextFixDay(res.sprinkleID, false);
976
+ } else if (adapter.config.weatherForecast){
977
+ messageText += ' ' + '<i>' + 'Start verschoben, da heute ' + weatherForecastTodayNum + 'mm Niederschlag' + '</i> ' + '\n';
978
+ adapter.log.info(`${res.objectName}: Start verschoben, da Regenvorhersage für Heute ${weatherForecastTodayNum} mm [ ${resRain(false)} > 0 ]`);
979
+ res.startFixDay[today] = false;
980
+ res.startFixDay[(+ today + 1 > 6) ? (+ today-6) : (+ today+1)] = true;
819
981
  }
982
+ curNextFixDay(res.sprinkleID, false);
820
983
  break;
821
984
  // --- calculation -- Berechnung der Bodenfeuchte --- //
822
985
  // -- Bodenfeuchte zu gering -- //
@@ -862,6 +1025,43 @@ function startTimeSprinkle() {
862
1025
 
863
1026
  //
864
1027
  async function createSprinklers() {
1028
+ /**Creates an Object .control.addStartTimeSwitch, when additional watering has been activated via an external signal
1029
+ * - Erzeugt ein Object .control.addStartTimeSwitch, wenn die Zusatzbewässerung über ein externes Signal aktiviert wurde
1030
+ * @type {{id: string, name: string} | void}
1031
+ * @private
1032
+ */
1033
+ const _addStartTimeSwitch = await adapter.findForeignObjectAsync(`${adapter.namespace}.control.addStartTimeSwitch`, 'boolean').catch((e) => adapter.log.warn(`.control.addStartTimeSwitch ${e}`));
1034
+ if (_addStartTimeSwitch.id !== `${adapter.namespace}.control.addStartTimeSwitch` && adapter.config.selectAddStartTime === 'withExternalSignal') {
1035
+ adapter.setObjectNotExistsAsync(`${adapter.namespace}.control.addStartTimeSwitch`, {
1036
+ 'type': 'state',
1037
+ 'common': {
1038
+ "role": "switch",
1039
+ 'name': 'additional irrigation enabled',
1040
+ 'type': 'boolean',
1041
+ 'read': true,
1042
+ 'write': true,
1043
+ 'def': false
1044
+ },
1045
+ 'native': {}
1046
+ }).catch((e) => adapter.log.warn(`.control.addStartTimeSwitch ${e}`));
1047
+ } else if (_addStartTimeSwitch.id === `${adapter.namespace}.control.addStartTimeSwitch`) {
1048
+ if (adapter.config.selectAddStartTime !== 'withExternalSignal') {
1049
+ adapter.delObjectAsync(`${adapter.namespace}.control.addStartTimeSwitch`).catch((e) => adapter.log.warn(`.control.addStartTimeSwitch ${e}`));
1050
+ addStartTimeSwitch = false;
1051
+ } else {
1052
+ /** auslesen .control.addStartTimeSwitch.val
1053
+ * @type {ioBroker.State | void}
1054
+ * @private
1055
+ */
1056
+ const _state = await adapter.getStateAsync(`${adapter.namespace}.control.addStartTimeSwitch`).catch((e) => adapter.log.warn(`.control.addStartTimeSwitch ${e}`));
1057
+ if (typeof _state.val === 'boolean') {
1058
+ addStartTimeSwitch = _state.val;
1059
+ }
1060
+ }
1061
+ }
1062
+
1063
+
1064
+
865
1065
  const result = adapter.config.events;
866
1066
  if (result) {
867
1067
  for(const res of result) {
@@ -880,7 +1080,7 @@ async function createSprinklers() {
880
1080
 
881
1081
  let nameMetConSM, objMetConSM;
882
1082
  await fillMetConSM(res);
883
- function fillMetConSM(res) {
1083
+ async function fillMetConSM(res) {
884
1084
  //adapter.log.debug(JSON.stringify(res));
885
1085
  switch (res.methodControlSM) {
886
1086
  case 'calculation':
@@ -953,6 +1153,22 @@ async function createSprinklers() {
953
1153
  break;
954
1154
  default:
955
1155
  adapter.log.warn(`sprinkleControl cannot created ... Please check your sprinkleControl config ${objectName} methodControl`);
1156
+ nameMetConSM = objectName + ' => Emergency program! start on a fixed day';
1157
+ objMetConSM = {
1158
+ 'type': 'state',
1159
+ 'common': {
1160
+ 'role': 'state',
1161
+ 'name': nameMetConSM,
1162
+ 'type': 'number',
1163
+ 'min': 0,
1164
+ 'max': 7,
1165
+ 'states': {"0":"Sun", "1":"Mon", "2":"Tue", "3":"Wed", "4":"Thur", "5":"Fri", "6":"Sat", "7":"off"},
1166
+ 'read': true,
1167
+ 'write': false,
1168
+ 'def': 7
1169
+ },
1170
+ 'native': {},
1171
+ };
956
1172
  }
957
1173
  }
958
1174
  // ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ //
@@ -967,7 +1183,7 @@ async function createSprinklers() {
967
1183
  'name': res.sprinkleName
968
1184
  },
969
1185
  'native': {},
970
- }).catch((e) => adapter.log.warn(`sprinkle.${objectName} ${e}`));
1186
+ });
971
1187
  // Create Object for .history
972
1188
  const _historyNotExist = await adapter.setObjectNotExistsAsync('sprinkle.' + objectName + '.history', {
973
1189
  'type': 'channel',
@@ -975,7 +1191,7 @@ async function createSprinklers() {
975
1191
  'name': res.sprinkleName + ' => History'
976
1192
  },
977
1193
  'native': {},
978
- }).catch((e) => adapter.log.warn(`${objectName}.history ${e}`));
1194
+ });
979
1195
  // Create Object for .history.curCalWeekConsumed
980
1196
  // Sprinkler consumption of the current calendar week => History - Sprinkler-Verbrauch der aktuellen Kalenderwoche (783 Liter)
981
1197
  const _curCalWeekConsumedNotExist = adapter.setObjectNotExistsAsync(objPfad + '.history.curCalWeekConsumed', {
@@ -990,7 +1206,7 @@ async function createSprinklers() {
990
1206
  'def': 0
991
1207
  },
992
1208
  'native': {},
993
- }).catch((e) => adapter.log.warn(`${objectName}.curCalWeekConsumed ${e}`));
1209
+ });
994
1210
  // Create Object for .history.curCalWeekRunningTime
995
1211
  // Sprinkler running time of the current calendar week => History - Sprinkler-Laufzeit der aktuellen Kalenderwoche (783 Liter)
996
1212
  const _curCalWeekRunningTimeNotExist = adapter.setObjectNotExistsAsync(objPfad + '.history.curCalWeekRunningTime', {
@@ -1004,7 +1220,7 @@ async function createSprinklers() {
1004
1220
  'def': '00:00'
1005
1221
  },
1006
1222
  'native': {},
1007
- }).catch((e) => adapter.log.warn(`${objectName}.curCalWeekRunningTime ${e}`));
1223
+ });
1008
1224
  // Create Object for .history.lastCalWeekConsumed
1009
1225
  // Sprinkler consumption of the last calendar week => History - Sprinkler-Verbrauch der letzten Kalenderwoche (783 Liter)
1010
1226
  const _lastCalWeekConsumedNotExist = adapter.setObjectNotExistsAsync(objPfad + '.history.lastCalWeekConsumed', {
@@ -1019,7 +1235,7 @@ async function createSprinklers() {
1019
1235
  'def': 0
1020
1236
  },
1021
1237
  'native': {},
1022
- }).catch((e) => adapter.log.warn(`${objectName}.lastCalWeekConsumed ${e}`));
1238
+ });
1023
1239
  // Create Object for .history.lastCalWeekRunningTime
1024
1240
  // Sprinkler running time of the last calendar week => History - Sprinkler-Laufzeit der letzten Kalenderwoche (783 Liter)
1025
1241
  const _lastCalWeekRunningTimeNotExist = adapter.setObjectNotExistsAsync(objPfad + '.history.lastCalWeekRunningTime', {
@@ -1033,7 +1249,7 @@ async function createSprinklers() {
1033
1249
  'def': '00:00'
1034
1250
  },
1035
1251
  'native': {},
1036
- }).catch((e) => adapter.log.warn(`${objectName}.curCalWeekRunningTime ${e}`));
1252
+ });
1037
1253
  // Create Object for .history.lastConsumed
1038
1254
  // Last consumed of sprinkler => History - Letzte Verbrauchsmenge des Ventils (783 Liter)
1039
1255
  const _lastConsumedNotExist = adapter.setObjectNotExistsAsync(objPfad + '.history.lastConsumed', {
@@ -1048,7 +1264,7 @@ async function createSprinklers() {
1048
1264
  'def': 0
1049
1265
  },
1050
1266
  'native': {},
1051
- }).catch((e) => adapter.log.warn(`${objectName}.lastConsumed ${e}`));
1267
+ });
1052
1268
  // Create Object for .history.lastOn
1053
1269
  // Last On of sprinkler => History - Letzter Start des Ventils (30.03 06:30)
1054
1270
  const _lastOnNotExist = adapter.setObjectNotExistsAsync(objPfad + '.history.lastOn', {
@@ -1062,7 +1278,7 @@ async function createSprinklers() {
1062
1278
  'def': '-'
1063
1279
  },
1064
1280
  'native': {},
1065
- }).catch((e) => adapter.log.warn(`${objectName}.lastOn ${e}`));
1281
+ });
1066
1282
  // Create Object for .history.lastRunningTime
1067
1283
  // Last running time of sprinkler => History - Letzte Laufzeit des Ventils (0 sek, 47:00 min, 1:03:45 )
1068
1284
  const _lastRunningTimeNotExist = adapter.setObjectNotExistsAsync(objPfad + '.history.lastRunningTime', {
@@ -1076,24 +1292,70 @@ async function createSprinklers() {
1076
1292
  'def': '00:00'
1077
1293
  },
1078
1294
  'native': {},
1079
- }).catch((e) => adapter.log.warn(`${objectName}.lastRunningTime ${e}`));
1295
+ });
1080
1296
  // 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}`));
1297
+ const _autoOnNotExist = adapter.setObjectNotExistsAsync(objPfad + '.autoOn', {
1298
+ 'type': 'state',
1299
+ 'common': {
1300
+ 'role': 'Switch',
1301
+ 'name': objectName + ' => Switch automatic mode on / off',
1302
+ 'type': 'boolean',
1303
+ "states": {
1304
+ "false": "off",
1305
+ "true": "on"
1306
+ },
1307
+ 'read': true,
1308
+ 'write': true,
1309
+ 'def': true
1310
+ },
1311
+ 'native': {},
1312
+ }).catch((e) => adapter.log.warn(`set .autoOn ${e}`));
1093
1313
  // Create Object for .actualSoilMoisture
1094
- const _actualSoilMoistureNotExist = await adapter.setObjectNotExistsAsync(objPfad + '.actualSoilMoisture',
1095
- objMetConSM
1096
- ).catch((e) => adapter.log.warn(`${objectName}.actualSoilMoisture ${e}`));
1314
+ const _actualSoilMoistureFind = await adapter.findForeignObjectAsync(`${adapter.namespace}.${objPfad}.actualSoilMoisture`, `${objMetConSM.common.type}`);
1315
+ if (_actualSoilMoistureFind.id !== `${adapter.namespace}.${objPfad}.actualSoilMoisture` || _actualSoilMoistureFind.name !== nameMetConSM) {
1316
+ await adapter.setObjectAsync(
1317
+ objPfad + '.actualSoilMoisture',
1318
+ objMetConSM
1319
+ ).catch((e) => adapter.log.warn(e));
1320
+ adapter.log.info(`sprinkleControl [sprinkle.${objectName}.actualSoilMoisture] was updated`);
1321
+ }
1322
+
1323
+ // postponeByOneDay → um einen Tag verschieben bei fixDay (twoNd & threeRd)
1324
+ const _postponeByOneDay = await adapter.findForeignObjectAsync(`${adapter.namespace}.${objPfad}.postponeByOneDay`, `boolean`);
1325
+ if (_postponeByOneDay.id !== `${adapter.namespace}.${objPfad}.postponeByOneDay`
1326
+ && res.methodControlSM === "fixDay"
1327
+ && (res.startDay === "twoNd"
1328
+ || res.startDay === "threeRd")) {
1329
+ await adapter.setObjectNotExistsAsync(objPfad + '.postponeByOneDay', {
1330
+ 'type': 'state',
1331
+ 'common': {
1332
+ "role": 'button',
1333
+ "name": objectName + 'Postpone start by one day',
1334
+ "type": 'boolean',
1335
+ "read": true,
1336
+ "write": true,
1337
+ "def": false
1338
+ },
1339
+ 'native': {
1340
+ "UNIT": "",
1341
+ "TAB_ORDER": 0,
1342
+ "OPERATIONS": 6,
1343
+ "FLAGS": 1,
1344
+ "TYPE": "ACTION",
1345
+ "MIN": false,
1346
+ "MAX": true,
1347
+ "DEFAULT": false
1348
+ }
1349
+ });
1350
+ adapter.subscribeStates(`${adapter.namespace}.${objPfad}.postponeByOneDay`);
1351
+ } else if (res.methodControlSM === "fixDay"
1352
+ && (res.startDay === "twoNd"
1353
+ || res.startDay === "threeRd")) {
1354
+ adapter.subscribeStates(`${adapter.namespace}.${objPfad}.postponeByOneDay`);
1355
+ } else {
1356
+ await adapter.delObjectAsync(`${adapter.namespace}.${objPfad}.postponeByOneDay`); // "sprinklecontrol.0.sprinkle.???.actualSoilMoisture"
1357
+ }
1358
+
1097
1359
  // Create Object for .countdown => Countdown des Ventils
1098
1360
  const _countdownNotExist = adapter.setObjectNotExistsAsync(objPfad + '.countdown', {
1099
1361
  'type': 'state',
@@ -1106,7 +1368,7 @@ async function createSprinklers() {
1106
1368
  'def': '-'
1107
1369
  },
1108
1370
  'native': {},
1109
- }).catch((e) => adapter.log.warn(`${objectName}.countdown ${e}`));
1371
+ });
1110
1372
  // Create Object for .runningTime => Laufzeit des Ventils
1111
1373
  const _runningTimeNotExist = await adapter.setObjectNotExistsAsync(objPfad + '.runningTime', {
1112
1374
  'type': 'state',
@@ -1119,7 +1381,7 @@ async function createSprinklers() {
1119
1381
  'def': '-'
1120
1382
  },
1121
1383
  'native': {},
1122
- }).catch((e) => adapter.log.warn(`${objectName}.runningTime ${e}`));
1384
+ });
1123
1385
  // Create Object for .sprinklerState => Zustand des Ventils im Thread
1124
1386
  // <<< 1 = warten >>> ( 0:off; 1:wait; 2:on; 3:break; 4:Boost(on); 5:off(Boost) )
1125
1387
  // Create .sprinklerState
@@ -1143,8 +1405,8 @@ async function createSprinklers() {
1143
1405
  'write': false,
1144
1406
  'def': 0
1145
1407
  },
1146
- 'native': {}
1147
- }).catch((e) => adapter.log.warn(`${objectName}.sprinklerState ${e}`));
1408
+ 'native': {},
1409
+ });
1148
1410
  // Create Object for triggerPoint → Schaltpunkt der Bodenfeuchte
1149
1411
  const _triggerPointNotExist = await adapter.setObjectNotExistsAsync(objPfad + '.triggerPoint', {
1150
1412
  'type': 'state',
@@ -1157,10 +1419,10 @@ async function createSprinklers() {
1157
1419
  'def': '-'
1158
1420
  },
1159
1421
  'native': {},
1160
- }).catch((e) => adapter.log.warn(`${objectName}.triggerPoint ${e}`));
1422
+ });
1161
1423
  // Object created
1162
1424
  let value = true;
1163
- (await Promise.all([
1425
+ await (await Promise.all([
1164
1426
  _sprinkleNotExist,
1165
1427
  _historyNotExist,
1166
1428
  _curCalWeekConsumedNotExist,
@@ -1171,15 +1433,14 @@ async function createSprinklers() {
1171
1433
  _lastOnNotExist,
1172
1434
  _lastRunningTimeNotExist,
1173
1435
  _autoOnNotExist,
1174
- _actualSoilMoistureNotExist,
1175
1436
  _countdownNotExist,
1176
1437
  _runningTimeNotExist,
1177
1438
  _sprinklerStateNotExists,
1178
1439
  _triggerPointNotExist
1179
1440
  ])).forEach((val) => {
1180
- value += val;
1441
+ value &= val;
1181
1442
  });
1182
- if (value){
1443
+ if(value) {
1183
1444
  adapter.log.info(`sprinkleControl [sprinkle.${objectName}] was created`);
1184
1445
  }
1185
1446
 
@@ -1187,34 +1448,6 @@ async function createSprinklers() {
1187
1448
  // +++++ zustände der States aktualisieren +++++ //
1188
1449
  // ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ //
1189
1450
 
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`);
1199
-
1200
- }
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
1451
  //
1219
1452
  if(await _countdownNotExist){
1220
1453
  const _countdown = await adapter.getStateAsync(objPfad + '.countdown').catch((e) => adapter.log.warn(`${objectName}.countdown ${e}`));
@@ -1371,7 +1604,7 @@ async function createSprinklers() {
1371
1604
  ).catch((e) => adapter.log.warn(e));
1372
1605
  break;
1373
1606
 
1374
- }
1607
+ }
1375
1608
 
1376
1609
  } catch (e) {
1377
1610
  adapter.log.warn(`sprinkleControl cannot created ... Please check your sprinkleControl config: ${e}`);
@@ -1404,19 +1637,19 @@ async function createSprinklers() {
1404
1637
  try {
1405
1638
  // object deleted
1406
1639
  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"
1640
+ adapter.delObjectAsync(resID + '.actualSoilMoisture'), // "sprinklecontrol.0.sprinkle.???.actualSoilMoisture"
1641
+ adapter.delObjectAsync(resID + '.triggerPoint'), // "sprinklecontrol.0.sprinkle.???.triggerPoint"
1642
+ adapter.delObjectAsync(resID + '.sprinklerState'), // "sprinklecontrol.0.sprinkle.???.sprinklerState"
1643
+ adapter.delObjectAsync(resID + '.runningTime'), // "sprinklecontrol.0.sprinkle.???.runningTime"
1644
+ adapter.delObjectAsync(resID + '.countdown'), // "sprinklecontrol.0.sprinkle.???.countdown"
1645
+ adapter.delObjectAsync(resID + '.autoOn'), // "sprinklecontrol.0.sprinkle.???.autoOn"
1646
+ adapter.delObjectAsync(resID + '.history.lastOn'), // "sprinklecontrol.0.sprinkle.???..history.lastOn"
1647
+ adapter.delObjectAsync(resID + '.history.lastConsumed'), // "sprinklecontrol.0.sprinkle.???..history.lastConsumed"
1648
+ adapter.delObjectAsync(resID + '.history.lastRunningTime'), // "sprinklecontrol.0.sprinkle.???.history.lastRunningTime"
1649
+ adapter.delObjectAsync(resID + '.history.curCalWeekConsumed'), // "sprinklecontrol.0.sprinkle.???.history.curCalWeekConsumed"
1650
+ adapter.delObjectAsync(resID + '.history.lastCalWeekConsumed'), // "sprinklecontrol.0.sprinkle.???.history.lastCalWeekConsumed"
1651
+ adapter.delObjectAsync(resID + '.history.curCalWeekRunningTime'), // "sprinklecontrol.0.sprinkle.???.history.curCalWeekRunningTime"
1652
+ adapter.delObjectAsync(resID + '.history.lastCalWeekRunningTime'), // "sprinklecontrol.0.sprinkle.???.history.lastCalWeekRunningTime"
1420
1653
  // History - Objekt(Ordner.history) löschen
1421
1654
  await adapter.delObjectAsync(resID + '.history'),
1422
1655
  // Objekt(Ordner) löschen
@@ -1432,17 +1665,20 @@ async function createSprinklers() {
1432
1665
  }
1433
1666
  }
1434
1667
  ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
1668
+
1435
1669
  /**
1436
1670
  *
1437
1671
  * @param {number} ms => Waiting time in ms
1438
1672
  * @return {Promise<unknown>}
1439
1673
  */
1674
+ /*
1440
1675
  async function sleep(ms) {
1441
1676
  return new Promise(async (resolve) => {
1442
1677
  // @ts-ignore
1443
1678
  timerSleep = setTimeout(async () => resolve(), ms);
1444
1679
  });
1445
1680
  }
1681
+ */
1446
1682
  ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
1447
1683
  /**
1448
1684
  *
@@ -1456,31 +1692,26 @@ function main(adapter) {
1456
1692
  adapter.config:
1457
1693
  */
1458
1694
  adapter.log.debug(`adapter.config.events: ${JSON.stringify(adapter.config.events)}`);
1459
-
1460
1695
  /**
1461
1696
  * The adapters' config (in the instance object everything under the attribute "native") is accessible via adapter.config:
1462
1697
  * => Auf die Adapterkonfiguration (im Instanz objekt alles unter dem Attribut "native") kann zugegriffen werden über adapter.config:
1463
1698
  * @param {any} err
1464
1699
  * @param {any} obj
1465
1700
  */
1466
- adapter.getForeignObject('system.config', (err) => {
1467
- if (!err) {
1468
- // init createConfig
1469
- myConfig.createConfig(adapter);
1701
+ adapter.getForeignObject('system.config', (err, obj) => {
1702
+ if (obj) {
1470
1703
  checkStates();
1471
1704
  }
1472
1705
  });
1473
-
1474
- GetSystemData().then();
1706
+ createSprinklers().catch((e) => adapter.log.warn(e));
1707
+ GetSystemData().catch((e) => adapter.log.warn(e));
1475
1708
  sendMessageText.initConfigMessage(adapter);
1476
-
1477
- timer = setTimeout(function() {
1478
- checkActualStates().then();
1479
- // init evaporation
1480
- evaporation.initEvaporation(adapter);
1481
- // Hauptpumpe zur Bewässerung setzen
1482
- valveControl.initValveControl(adapter);
1483
- sunPos();
1709
+ evaporation.initEvaporation(adapter); // init evaporation
1710
+ checkActualStates().catch((e) => adapter.log.warn(e));
1711
+ sunPos();
1712
+ timer = setTimeout(() => {
1713
+ startTimeSprinkle();
1714
+ addStartTimeSprinkle()
1484
1715
  }, 2000);
1485
1716
 
1486
1717
  /*
@@ -1502,11 +1733,17 @@ function main(adapter) {
1502
1733
  if (adapter.config.publicHolidays === true && (adapter.config.publicHolInstance + '.morgen.*')) {
1503
1734
  adapter.subscribeForeignStates(adapter.config.publicHolInstance + '.morgen.*');
1504
1735
  }
1505
- if ((adapter.config.weatherForecast === true) && (adapter.config.weatherForInstance + '.NextDaysDetailed.Location_1.Day_1.*')) {
1506
- adapter.subscribeForeignStates(adapter.config.weatherForInstance + '.NextDaysDetailed.Location_1.Day_1.rain_value');
1507
- }
1508
- if ((adapter.config.weatherForecast === true) && (adapter.config.weatherForInstance + '.NextDaysDetailed.Location_1.Day_2.*')) {
1509
- adapter.subscribeForeignStates(adapter.config.weatherForInstance + '.NextDaysDetailed.Location_1.Day_2.rain_value');
1736
+ if (adapter.config.weatherForecast === true) {
1737
+ if (adapter.config.weatherForecastService === 'ownDataPoint') {
1738
+ weatherForecastTodayPfadStr = adapter.config.pathRainForecast;
1739
+ adapter.subscribeForeignStates(weatherForecastTodayPfadStr);
1740
+ } else if (adapter.config.weatherForecastService === 'dasWetter' && adapter.config.weatherForInstance) {
1741
+ weatherForecastTodayPfadStr = adapter.config.weatherForInstance + '.NextDaysDetailed.Location_1.Day_1.rain_value';
1742
+ adapter.subscribeForeignStates(weatherForecastTodayPfadStr);
1743
+ adapter.subscribeForeignStates(adapter.config.weatherForInstance + '.NextDaysDetailed.Location_1.Day_2.rain_value');
1744
+ } else {
1745
+ adapter.log.warn('There is no valid data record stored in the weather forecast, please correct it!')
1746
+ }
1510
1747
  }
1511
1748
  if (adapter.config.actualValueLevel !== '') {
1512
1749
  adapter.subscribeForeignStates(adapter.config.actualValueLevel);