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