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/.commitmessage +4 -0
- package/Lizenz +1 -1
- package/README.md +14 -6
- package/admin/index_m.html +9 -15
- package/admin/index_m.js +3 -2
- package/admin/style.css +8 -0
- package/admin/words.js +118 -118
- package/docs/de/img/Extraeinstellungen.jpg +0 -0
- package/docs/de/img/Ventil-Haupteinstellung.jpg +0 -0
- package/docs/de/img/verdunstung.jpg +0 -0
- package/docs/de/sprinklecontrol.md +92 -54
- package/io-package.json +44 -6
- package/lib/evaporation.js +28 -32
- package/lib/myConfig.js +28 -31
- package/lib/sendMessageText.js +11 -19
- package/lib/tools.js +1 -1
- package/lib/valveControl.js +47 -61
- package/main.js +700 -580
- package/package.json +64 -62
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
|
|
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
|
|
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
|
|
155
|
-
|
|
156
|
-
|
|
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(
|
|
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 (
|
|
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
|
|
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(
|
|
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(
|
|
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(
|
|
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(
|
|
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
|
-
|
|
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(
|
|
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
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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.
|
|
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
|
|
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
|
-
|
|
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) {
|
|
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
|
-
*
|
|
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
|
-
*
|
|
446
|
-
* @
|
|
447
|
-
* @
|
|
424
|
+
* switch Holiday
|
|
425
|
+
* @type {ioBroker.GetStatePromise}
|
|
426
|
+
* @private {obj} _holiday
|
|
448
427
|
*/
|
|
449
|
-
adapter.
|
|
450
|
-
if (
|
|
451
|
-
|
|
428
|
+
const _holiday = await adapter.getStateAsync('control.Holiday');
|
|
429
|
+
if (_holiday && _holiday.val) {
|
|
430
|
+
holidayStr = _holiday.val;
|
|
452
431
|
}
|
|
453
|
-
|
|
432
|
+
|
|
454
433
|
/**
|
|
455
|
-
*
|
|
456
|
-
* @
|
|
457
|
-
* @
|
|
434
|
+
* switch autoOnOff
|
|
435
|
+
* @type {ioBroker.GetStatePromise}
|
|
436
|
+
* @private {obj} _autoOnOff
|
|
458
437
|
*/
|
|
459
|
-
adapter.
|
|
460
|
-
if (
|
|
461
|
-
|
|
438
|
+
const _autoOnOff = await adapter.getStateAsync('control.autoOnOff');
|
|
439
|
+
if (_autoOnOff && _autoOnOff.val) {
|
|
440
|
+
autoOnOffStr = _autoOnOff.val;
|
|
462
441
|
}
|
|
463
|
-
});
|
|
464
|
-
}
|
|
465
442
|
|
|
466
|
-
|
|
467
|
-
|
|
468
|
-
|
|
469
|
-
|
|
470
|
-
|
|
471
|
-
|
|
472
|
-
|
|
473
|
-
|
|
474
|
-
|
|
475
|
-
|
|
476
|
-
|
|
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
|
-
|
|
483
|
-
|
|
484
|
-
|
|
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
|
-
*
|
|
490
|
-
*
|
|
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.
|
|
494
|
-
if (
|
|
495
|
-
|
|
496
|
-
|
|
497
|
-
|
|
498
|
-
|
|
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
|
-
|
|
506
|
-
|
|
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
|
-
|
|
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
|
|
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
|
|
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
|
|
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
|
-
|
|
610
|
-
adapter.setState('info.nextAutoStart', {
|
|
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
|
-
*
|
|
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
|
|
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
|
|
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
|
|
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
|
|
715
|
-
* - (
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
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
|
|
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
|
-
|
|
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
|
|
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
|
|
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
|
-
|
|
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
|
-
|
|
865
|
-
|
|
866
|
-
|
|
867
|
-
|
|
868
|
-
|
|
869
|
-
|
|
870
|
-
|
|
871
|
-
|
|
872
|
-
|
|
873
|
-
|
|
874
|
-
|
|
875
|
-
|
|
876
|
-
|
|
877
|
-
|
|
878
|
-
|
|
879
|
-
|
|
880
|
-
|
|
881
|
-
|
|
882
|
-
|
|
883
|
-
|
|
884
|
-
|
|
885
|
-
|
|
886
|
-
|
|
887
|
-
|
|
888
|
-
|
|
889
|
-
|
|
890
|
-
|
|
891
|
-
|
|
892
|
-
|
|
893
|
-
|
|
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':
|
|
897
|
-
'name':
|
|
898
|
-
'type':
|
|
899
|
-
'
|
|
900
|
-
'
|
|
901
|
-
'
|
|
902
|
-
'
|
|
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
|
-
|
|
908
|
-
|
|
909
|
-
|
|
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':
|
|
914
|
-
'name':
|
|
915
|
-
'type':
|
|
916
|
-
'read':
|
|
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':
|
|
1000
|
+
'def': '00:00'
|
|
919
1001
|
},
|
|
920
1002
|
'native': {},
|
|
921
|
-
};
|
|
922
|
-
|
|
923
|
-
|
|
924
|
-
|
|
925
|
-
|
|
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':
|
|
929
|
-
'name':
|
|
930
|
-
'type':
|
|
931
|
-
'
|
|
932
|
-
'
|
|
933
|
-
'
|
|
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
|
-
|
|
940
|
-
|
|
941
|
-
|
|
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':
|
|
1039
|
+
'name': objectName + ' => History - Last consumed of sprinkler',
|
|
947
1040
|
'type': 'number',
|
|
948
|
-
'
|
|
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':
|
|
1044
|
+
'def': 0
|
|
954
1045
|
},
|
|
955
1046
|
'native': {},
|
|
956
|
-
};
|
|
957
|
-
|
|
958
|
-
|
|
959
|
-
|
|
960
|
-
|
|
961
|
-
|
|
962
|
-
|
|
963
|
-
|
|
964
|
-
|
|
965
|
-
|
|
966
|
-
|
|
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
|
-
|
|
1140
|
-
|
|
1141
|
-
|
|
1142
|
-
|
|
1143
|
-
|
|
1144
|
-
|
|
1145
|
-
|
|
1146
|
-
|
|
1147
|
-
|
|
1148
|
-
|
|
1149
|
-
|
|
1150
|
-
|
|
1151
|
-
|
|
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
|
-
|
|
1164
|
-
|
|
1165
|
-
|
|
1166
|
-
|
|
1167
|
-
|
|
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
|
-
|
|
1170
|
-
|
|
1171
|
-
|
|
1172
|
-
|
|
1173
|
-
|
|
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
|
-
|
|
1178
|
-
|
|
1179
|
-
|
|
1180
|
-
|
|
1181
|
-
|
|
1182
|
-
|
|
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
|
-
|
|
1186
|
-
|
|
1187
|
-
|
|
1188
|
-
|
|
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
|
|
1191
|
-
|
|
1192
|
-
val
|
|
1193
|
-
|
|
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
|
-
|
|
1206
|
-
|
|
1207
|
-
|
|
1208
|
-
|
|
1209
|
-
|
|
1210
|
-
|
|
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
|
-
|
|
1231
|
-
|
|
1232
|
-
|
|
1233
|
-
|
|
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
|
-
|
|
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
|