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/README.md +14 -16
- package/admin/index_m.html +115 -37
- package/admin/index_m.js +107 -10
- package/admin/words.js +131 -118
- package/docs/de/img/Extraeinstellungen.jpg +0 -0
- package/io-package.json +63 -69
- package/lib/evaporation.js +9 -2
- package/lib/myConfig.js +96 -36
- package/lib/sendMessageText.js +2 -1
- package/lib/tools.js +1 -1
- package/lib/valveControl.js +9 -1
- package/main.js +365 -128
- package/package.json +14 -14
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', () =>
|
|
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.
|
|
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) {
|
|
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 ===
|
|
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
|
|
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.
|
|
426
|
-
* @private
|
|
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.
|
|
436
|
-
* @private
|
|
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
|
-
|
|
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
|
|
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
|
|
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
|
|
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
|
-
|
|
796
|
-
|
|
797
|
-
|
|
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
|
-
|
|
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
|
-
})
|
|
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
|
-
})
|
|
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
|
-
})
|
|
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
|
-
})
|
|
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
|
-
})
|
|
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
|
-
})
|
|
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
|
-
})
|
|
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
|
-
})
|
|
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
|
-
})
|
|
1295
|
+
});
|
|
1080
1296
|
// Create Object for .autoOn
|
|
1081
|
-
const _autoOnNotExist =
|
|
1082
|
-
|
|
1083
|
-
|
|
1084
|
-
|
|
1085
|
-
|
|
1086
|
-
|
|
1087
|
-
|
|
1088
|
-
|
|
1089
|
-
|
|
1090
|
-
|
|
1091
|
-
|
|
1092
|
-
|
|
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
|
|
1095
|
-
|
|
1096
|
-
|
|
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
|
-
})
|
|
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
|
-
})
|
|
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
|
-
})
|
|
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
|
-
})
|
|
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
|
|
1441
|
+
value &= val;
|
|
1181
1442
|
});
|
|
1182
|
-
if
|
|
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'),
|
|
1408
|
-
adapter.delObjectAsync(resID + '.triggerPoint'),
|
|
1409
|
-
adapter.delObjectAsync(resID + '.sprinklerState'),
|
|
1410
|
-
adapter.delObjectAsync(resID + '.runningTime'),
|
|
1411
|
-
adapter.delObjectAsync(resID + '.countdown'),
|
|
1412
|
-
adapter.delObjectAsync(resID + '.autoOn'),
|
|
1413
|
-
adapter.delObjectAsync(resID + '.history.lastOn'),
|
|
1414
|
-
adapter.delObjectAsync(resID + '.history.lastConsumed'),
|
|
1415
|
-
adapter.delObjectAsync(resID + '.history.lastRunningTime'),
|
|
1416
|
-
adapter.delObjectAsync(resID + '.history.curCalWeekConsumed'),
|
|
1417
|
-
adapter.delObjectAsync(resID + '.history.lastCalWeekConsumed'),
|
|
1418
|
-
adapter.delObjectAsync(resID + '.history.curCalWeekRunningTime'),
|
|
1419
|
-
adapter.delObjectAsync(resID + '.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 (
|
|
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().
|
|
1706
|
+
createSprinklers().catch((e) => adapter.log.warn(e));
|
|
1707
|
+
GetSystemData().catch((e) => adapter.log.warn(e));
|
|
1475
1708
|
sendMessageText.initConfigMessage(adapter);
|
|
1476
|
-
|
|
1477
|
-
|
|
1478
|
-
|
|
1479
|
-
|
|
1480
|
-
|
|
1481
|
-
|
|
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 (
|
|
1506
|
-
|
|
1507
|
-
|
|
1508
|
-
|
|
1509
|
-
|
|
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);
|