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/lib/evaporation.js
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
/*
|
|
3
3
|
info: log aufbau evaporation.js: #3.*
|
|
4
4
|
*/
|
|
5
|
-
const myConfig = require('./myConfig.js'); // myConfig
|
|
5
|
+
const myConfig = require('./myConfig.js'); // myConfig → Speichern und abrufen von Konfigurationsdaten der Ventile
|
|
6
6
|
const formatTime = require('./tools').formatTime; // tools => laden von Hilfsfunktionen
|
|
7
7
|
const trend = require('./tools').trend; // tools => laden von Hilfsfunktionen
|
|
8
8
|
|
|
@@ -11,18 +11,18 @@ let adapter;
|
|
|
11
11
|
|
|
12
12
|
/* calcEvaporation */
|
|
13
13
|
/** akt. Temperatur °C
|
|
14
|
-
* - -20 bis 55°C
|
|
14
|
+
* - -20 bis 55 °C
|
|
15
15
|
* - ts Zeitstempel, wann der Wert aktualisiert wurde (auch ohne Wertänderung)
|
|
16
16
|
* @type {{val: number, ts: any}} */
|
|
17
17
|
let curTemperature = {},
|
|
18
18
|
/** akt. LuftFeuchtigkeit in %
|
|
19
|
-
* - 1 bis 99%
|
|
19
|
+
* - 1 bis 99 %
|
|
20
20
|
* - lc: Zeitstempel, wann der Wert geändert wurde
|
|
21
21
|
* @type {{val: number, lc: any}} */
|
|
22
22
|
curHumidity = {},
|
|
23
23
|
/** akt. Helligkeit (relativ)
|
|
24
24
|
* - 0 bis 100000
|
|
25
|
-
* - intern Begrenzung
|
|
25
|
+
* - intern Begrenzung 100...7000
|
|
26
26
|
* - lc: Zeitstempel, wann der Wert geändert wurde
|
|
27
27
|
* @type {{val: number, lc: any}} */
|
|
28
28
|
curIllumination = {},
|
|
@@ -45,11 +45,11 @@ let ETpTodayNum = 0,
|
|
|
45
45
|
* - berechneter tabellarischer Tageswert
|
|
46
46
|
* @type {number} */
|
|
47
47
|
toDayExtraTerStr,
|
|
48
|
-
/** kleinste
|
|
48
|
+
/** kleinste extraterrestrische Tagesstrahlung im Jahr in W/m²
|
|
49
49
|
* - berechneter tabellarischer Mindestwert
|
|
50
50
|
* @type {number} */
|
|
51
51
|
minExtraTerStr,
|
|
52
|
-
/** größter
|
|
52
|
+
/** größter extraterrestrische Tagesstrahlung im Jahr in W/m²
|
|
53
53
|
* - berechneter tabellarischer Maximalwert
|
|
54
54
|
* @type {number} */
|
|
55
55
|
maxExtraTerStr;
|
|
@@ -136,12 +136,12 @@ function extraTerStr () { // latitude Breitengrad
|
|
|
136
136
|
* @param {number} timeDifference
|
|
137
137
|
*/
|
|
138
138
|
function calcEvaporation (timeDifference) {
|
|
139
|
-
|
|
139
|
+
adapter.log.debug(`calcEvaporation => gestartet TimeDifferenz: ${timeDifference}`);
|
|
140
140
|
// Sonnenscheindauer in %
|
|
141
141
|
const curSunshineDuration = (curIllumination.val < 100) ? (0) : (curIllumination.val > 7000) ? (1) : ((curIllumination.val - 100) / (6900));
|
|
142
142
|
|
|
143
143
|
/**
|
|
144
|
-
* Sättigungsdampfdruck Es in hPa
|
|
144
|
+
* Sättigungsdampfdruck 'Es' in hPa
|
|
145
145
|
* @type {number} m1
|
|
146
146
|
*/
|
|
147
147
|
const m1 = 6.11 * ( 10 ** (( 7.48 * curTemperature.val ) / ( 237 + curTemperature.val )));
|
|
@@ -201,7 +201,7 @@ function addEvaporation (value) {
|
|
|
201
201
|
|
|
202
202
|
/**
|
|
203
203
|
* externe Funktionen
|
|
204
|
-
* @type {{setCurTemperature:
|
|
204
|
+
* @type {{setCurTemperature(number, (Date|number)): void, setCurIllumination(number, *): void, initEvaporation(ioBroker.Adapter): void, timeExtension(number): number, setCurAmountOfRain(number): void, setNewDay(): void, setCurHumidity(number, *): void, setCurWindSpeed(number, *): void, setETpTodayNum(number): void}}
|
|
205
205
|
*/
|
|
206
206
|
const evaporation = {
|
|
207
207
|
/**
|
|
@@ -209,7 +209,7 @@ const evaporation = {
|
|
|
209
209
|
* - Bereitstellen von Umweltdaten
|
|
210
210
|
* @param {ioBroker.Adapter} myAdapter
|
|
211
211
|
*/
|
|
212
|
-
initEvaporation
|
|
212
|
+
initEvaporation (myAdapter) {
|
|
213
213
|
adapter = myAdapter;
|
|
214
214
|
/**
|
|
215
215
|
* - Sensors to calculate the evaporation are required
|
|
@@ -230,7 +230,7 @@ const evaporation = {
|
|
|
230
230
|
curTemperature.val = (parseFloat(state.val));
|
|
231
231
|
curTemperature.ts = state.ts;
|
|
232
232
|
} else {
|
|
233
|
-
adapter.log.warn(
|
|
233
|
+
adapter.log.warn(`sensorOutsideTemperature => Wrong value: ${state.val}, Type: ${typeof state.val}`)
|
|
234
234
|
}
|
|
235
235
|
}
|
|
236
236
|
});
|
|
@@ -246,7 +246,7 @@ const evaporation = {
|
|
|
246
246
|
curHumidity.val = (parseFloat(state.val));
|
|
247
247
|
curHumidity.lc = state.lc;
|
|
248
248
|
} else {
|
|
249
|
-
adapter.log.warn(
|
|
249
|
+
adapter.log.warn(`sensorOutsideHumidity => Wrong value: ${state.val}, Type: ${typeof state.val}`)
|
|
250
250
|
}
|
|
251
251
|
}
|
|
252
252
|
});
|
|
@@ -278,7 +278,7 @@ const evaporation = {
|
|
|
278
278
|
curWindSpeed.val = (parseFloat(state.val));
|
|
279
279
|
curWindSpeed.lc = state.lc;
|
|
280
280
|
} else {
|
|
281
|
-
adapter.log.warn(
|
|
281
|
+
adapter.log.warn(`sensorWindSpeed => Wrong value: ${state.val}, Type: ${typeof state.val}`)
|
|
282
282
|
}
|
|
283
283
|
}
|
|
284
284
|
});
|
|
@@ -293,7 +293,7 @@ const evaporation = {
|
|
|
293
293
|
if (!Number.isNaN(Number.parseFloat(state.val))) {
|
|
294
294
|
lastRainCounter = (parseFloat(state.val));
|
|
295
295
|
} else {
|
|
296
|
-
adapter.log.warn(
|
|
296
|
+
adapter.log.warn(`sensorRainfall => Wrong value: ${state.val}, Type: ${typeof state.val}`)
|
|
297
297
|
}
|
|
298
298
|
}
|
|
299
299
|
})
|
|
@@ -304,7 +304,7 @@ const evaporation = {
|
|
|
304
304
|
* @param {number} value curTemperature
|
|
305
305
|
* @param {Date | number} curTime ts (akt. Zeit)
|
|
306
306
|
*/
|
|
307
|
-
setCurTemperature
|
|
307
|
+
setCurTemperature (value, curTime) {
|
|
308
308
|
curTemperature.val = value;
|
|
309
309
|
curTemperature.ts = curTime;
|
|
310
310
|
|
|
@@ -324,9 +324,7 @@ const evaporation = {
|
|
|
324
324
|
* @type {number}
|
|
325
325
|
*/
|
|
326
326
|
const timeDifference = (curTime - lastChangeEvaPor) / 86400000; // 1Tag === 24/h * 60/min * 60/s * 1000/ms === 86400000 ms
|
|
327
|
-
|
|
328
|
-
adapter.log.info('ts: ' + curTime + ' - lastChangeEvaPor: ' + lastChangeEvaPor + ' = timeDifference: ' + timeDifference);
|
|
329
|
-
}
|
|
327
|
+
adapter.log.debug(`ts: ${curTime} - lastChangeEvaPor: ${lastChangeEvaPor} = timeDifference: ${timeDifference}`);
|
|
330
328
|
|
|
331
329
|
if (timeDifference) {
|
|
332
330
|
setTimeout(() => {
|
|
@@ -340,7 +338,7 @@ const evaporation = {
|
|
|
340
338
|
* @param {number} value
|
|
341
339
|
* @param {any} lc
|
|
342
340
|
*/
|
|
343
|
-
setCurHumidity
|
|
341
|
+
setCurHumidity (value, lc) {
|
|
344
342
|
curHumidity.val = value;
|
|
345
343
|
curHumidity.lc =lc;
|
|
346
344
|
},
|
|
@@ -349,7 +347,7 @@ const evaporation = {
|
|
|
349
347
|
* @param {number} value
|
|
350
348
|
* @param {any} lc
|
|
351
349
|
*/
|
|
352
|
-
setCurIllumination
|
|
350
|
+
setCurIllumination (value, lc) {
|
|
353
351
|
curIllumination.val = value;
|
|
354
352
|
curIllumination.lc = lc;
|
|
355
353
|
},
|
|
@@ -358,38 +356,36 @@ const evaporation = {
|
|
|
358
356
|
* @param {number} value Windgeschwindigkeit in km/h
|
|
359
357
|
* @param {any} lc
|
|
360
358
|
*/
|
|
361
|
-
setCurWindSpeed
|
|
359
|
+
setCurWindSpeed (value, lc) {
|
|
362
360
|
curWindSpeed.val = value;
|
|
363
361
|
curWindSpeed.lc = lc;
|
|
364
362
|
},
|
|
365
363
|
/**
|
|
366
364
|
* akt. Regenmengenzähler
|
|
367
|
-
*
|
|
365
|
+
* → Bei einer Änderung über 10 mm wird der Wert nur intern gespeichert,
|
|
368
366
|
* es findet aber keine Anwendung statt!
|
|
369
|
-
* @param {number} value current rain counter
|
|
367
|
+
* @param {number} value current rain counter → aktueller Regencontainer in mm
|
|
370
368
|
*/
|
|
371
|
-
setCurAmountOfRain
|
|
369
|
+
setCurAmountOfRain (value) {
|
|
372
370
|
if ((value > lastRainCounter) // es regnet
|
|
373
|
-
&& ((value - lastRainCounter) < 10) // && Plausibilitätskontrolle (Regenmenge unter
|
|
371
|
+
&& ((value - lastRainCounter) < 10) // && Plausibilitätskontrolle (Regenmenge unter 10 mm)
|
|
374
372
|
) {
|
|
375
373
|
addEvaporation(lastRainCounter - value);
|
|
376
374
|
}
|
|
377
375
|
lastRainCounter = value;
|
|
378
|
-
|
|
379
|
-
adapter.log.info('lastRainCounter: ' + lastRainCounter + ' curAmountOfRain: ' + (lastRainCounter - value) + ' state.val: ' + value);
|
|
380
|
-
}
|
|
376
|
+
adapter.log.debug(`lastRainCounter: ${lastRainCounter} curAmountOfRain: ${(lastRainCounter - value)} state.val: ${value}`);
|
|
381
377
|
},
|
|
382
378
|
/**
|
|
383
379
|
* Summe der heutigen Verdunstung
|
|
384
380
|
* @param {number} value
|
|
385
381
|
*/
|
|
386
|
-
setETpTodayNum
|
|
382
|
+
setETpTodayNum (value) {
|
|
387
383
|
ETpTodayNum = value;
|
|
388
384
|
},
|
|
389
385
|
/**
|
|
390
386
|
* ETpToday und ETpYesterday in evaporation aktualisieren da ein neuer Tag beginnt
|
|
391
387
|
*/
|
|
392
|
-
setNewDay
|
|
388
|
+
setNewDay () {
|
|
393
389
|
extraTerStr();
|
|
394
390
|
setTimeout(() => {
|
|
395
391
|
adapter.setState('evaporation.ETpYesterday', { val: Math.round(ETpTodayNum * 10000) / 10000, ack: true });
|
|
@@ -399,10 +395,10 @@ const evaporation = {
|
|
|
399
395
|
},
|
|
400
396
|
/**
|
|
401
397
|
*
|
|
402
|
-
* @param {number} maxExtension - Wert aus der Konfiguration (wateringAdd 100...300%) des Bewässerungskreises
|
|
398
|
+
* @param {number} maxExtension - Wert aus der Konfiguration (wateringAdd 100...300 %) des Bewässerungskreises
|
|
403
399
|
* @return {number} - Erweiterung/Multiplikator (1...3) der Bewässerungszeit
|
|
404
400
|
*/
|
|
405
|
-
timeExtension
|
|
401
|
+
timeExtension (maxExtension) {
|
|
406
402
|
return trend(minExtraTerStr, maxExtraTerStr,1, maxExtension / 100, toDayExtraTerStr);
|
|
407
403
|
}
|
|
408
404
|
}
|
package/lib/myConfig.js
CHANGED
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
info: log aufbau myConfig.js: #1.*
|
|
5
5
|
*/
|
|
6
6
|
const trend = require('./tools').trend; // tools => laden von Hilfsfunktionen
|
|
7
|
-
const formatTime = require('./tools').formatTime; // tools => laden von Hilfsfunktionen
|
|
7
|
+
// const formatTime = require('./tools').formatTime; // tools => laden von Hilfsfunktionen
|
|
8
8
|
|
|
9
9
|
/**
|
|
10
10
|
* The adapter instance
|
|
@@ -29,12 +29,11 @@ let adapter;
|
|
|
29
29
|
* @param {boolean} res.thur - Donnerstag, Thursday (Thur) (Thurs)
|
|
30
30
|
* @param {boolean} res.fri - Freitag, Friday (Fri)
|
|
31
31
|
* @param {boolean} res.sat - Samstag, Saturday (Sat)
|
|
32
|
-
* @param {string} objectName - zur StableVersion löschen
|
|
33
32
|
* @returns {{setMetConSM: string, setPct: (number|null), setStartDay: (string|null), setStartFixDay: boolean[], setAnalogZPct: (number|null), setAnalogOHPct: (number|null), setTrigSM: (string|null), setVal: (number|null), setBool: (boolean|null)}}
|
|
34
33
|
*/
|
|
35
|
-
function getMetConSM(res
|
|
34
|
+
function getMetConSM(res) {
|
|
36
35
|
|
|
37
|
-
if (res.methodControlSM === 'bistable'
|
|
36
|
+
if (res.methodControlSM === 'bistable') {
|
|
38
37
|
// bistable (Bodenfeuchte-Sensor)
|
|
39
38
|
adapter.subscribeForeignStates(res.triggerSM);
|
|
40
39
|
return {
|
|
@@ -50,7 +49,7 @@ function getMetConSM(res, objectName) {
|
|
|
50
49
|
};
|
|
51
50
|
|
|
52
51
|
|
|
53
|
-
} else if (res.methodControlSM === 'analog'
|
|
52
|
+
} else if (res.methodControlSM === 'analog') {
|
|
54
53
|
// analog (Bodenfeuchte-Sensor)
|
|
55
54
|
adapter.subscribeForeignStates(res.triggerSM);
|
|
56
55
|
return {
|
|
@@ -74,10 +73,10 @@ function getMetConSM(res, objectName) {
|
|
|
74
73
|
|
|
75
74
|
if(res.startDay === 'threeRd' || res.startDay === 'twoNd') {
|
|
76
75
|
/** @type {number} */
|
|
77
|
-
let today = formatTime(adapter,'', 'day');
|
|
76
|
+
//let today = formatTime(adapter,'', 'day');
|
|
78
77
|
/** @type {number} */
|
|
79
|
-
let nextStartDay = ((today + 1) > 6) ? 0 : (today + 1);
|
|
80
|
-
startFixDay[nextStartDay] = true; // Start am nächsten Tag
|
|
78
|
+
//let nextStartDay = ((today + 1) > 6) ? 0 : (today + 1);
|
|
79
|
+
//startFixDay[nextStartDay] = true; // Start am nächsten Tag
|
|
81
80
|
} else if (res.startDay === 'fixDay') {
|
|
82
81
|
startFixDay[0] = res.sun;
|
|
83
82
|
startFixDay[1] = res.mon;
|
|
@@ -98,7 +97,7 @@ function getMetConSM(res, objectName) {
|
|
|
98
97
|
setVal: null,
|
|
99
98
|
setBool: null
|
|
100
99
|
};
|
|
101
|
-
} else {
|
|
100
|
+
} else if (res.methodControlSM === 'calculation') {
|
|
102
101
|
// interne (Berechnung der Verdunstung)
|
|
103
102
|
return {
|
|
104
103
|
setStartDay: null,
|
|
@@ -111,6 +110,8 @@ function getMetConSM(res, objectName) {
|
|
|
111
110
|
setVal: parseFloat(res.maxSoilMoistureIrrigation) / 2,
|
|
112
111
|
setBool: null
|
|
113
112
|
};
|
|
113
|
+
} else {
|
|
114
|
+
adapter.log.warn('No irrigation type is selected in the SprinkleControl configuration! Please adjust.');
|
|
114
115
|
}
|
|
115
116
|
}
|
|
116
117
|
|
|
@@ -128,8 +129,13 @@ const myConfig = {
|
|
|
128
129
|
/** Name des Bewässerungskreises
|
|
129
130
|
* @type {string}
|
|
130
131
|
*/
|
|
131
|
-
|
|
132
|
-
|
|
132
|
+
let objectName
|
|
133
|
+
if(res.sprinkleName !== '') {
|
|
134
|
+
objectName = res.sprinkleName.replace(/[.;, ]/g, '_');
|
|
135
|
+
} else if (res.sprinkleName === '') {
|
|
136
|
+
objectName = res.name.replace(/[.;, ]/g, '_');
|
|
137
|
+
}
|
|
138
|
+
const metConSM = getMetConSM(res);
|
|
133
139
|
const newEntry = {
|
|
134
140
|
/** Starttage in der Woche
|
|
135
141
|
* - 0(Sun); 1(Mon); 2(Tue); 3(Wed); 4(Thur); 5(Fri); 6(Sat)
|
|
@@ -178,9 +184,7 @@ const myConfig = {
|
|
|
178
184
|
adapter.subscribeStates(newEntry.autoOnID); // abonnieren der Statusänderungen des Objekts (reagieren auf 'autoOn' der einzelnen Bewässerungskreise)
|
|
179
185
|
// adapter.subscribeForeignStates(newEntry.idState); // abonnieren der Statusänderungen des Objekts (reagiert auf Änderung des 'Ventils' der einzelnen Bewässerungskreise zur Fehlerkontrolle bzw. Verbrauchsermittlung)
|
|
180
186
|
}
|
|
181
|
-
|
|
182
|
-
adapter.log.info('#1.0 => Set ID: ' + objectName + '(' + newEntry.sprinkleID + ') hinzugefügt - ' + JSON.stringify(myConfig.config[newEntry.sprinkleID]));
|
|
183
|
-
//}
|
|
187
|
+
adapter.log.debug(`Config ${objectName} created (${newEntry.sprinkleID}) - ${JSON.stringify(myConfig.config[newEntry.sprinkleID])}`);
|
|
184
188
|
}
|
|
185
189
|
}
|
|
186
190
|
},
|
|
@@ -192,7 +196,8 @@ const myConfig = {
|
|
|
192
196
|
applyEvaporation: (eTP) => {
|
|
193
197
|
if (myConfig.config) {
|
|
194
198
|
for(const entry of myConfig.config) {
|
|
195
|
-
if (entry.methodControlSM === 'calculation'
|
|
199
|
+
if (entry.methodControlSM === 'calculation'
|
|
200
|
+
&& !(entry.inGreenhouse && (eTP < 0))) { // nicht anwenden im Gewächshaus und Regen
|
|
196
201
|
const objectName = entry.objectName;
|
|
197
202
|
const pfadActSoiMoi = 'sprinkle.' + objectName + '.actualSoilMoisture';
|
|
198
203
|
|
|
@@ -203,9 +208,7 @@ const myConfig = {
|
|
|
203
208
|
entry.soilMoisture.val = entry.soilMoisture.maxRain;
|
|
204
209
|
}
|
|
205
210
|
entry.soilMoisture.pct = Math.round(1000 * entry.soilMoisture.val / entry.soilMoisture.maxIrrigation) / 10; // Berechnung in %
|
|
206
|
-
|
|
207
|
-
adapter.log.info('#1.1 Set ID: ' + objectName + ' => soilMoisture: ' + entry.soilMoisture.val + ' soilMoisture in %: ' + entry.soilMoisture.pct + ' %');
|
|
208
|
-
}
|
|
211
|
+
adapter.log.debug(`apply Evaporation: ${objectName} => soilMoisture: ${entry.soilMoisture.val} soilMoisture: ${entry.soilMoisture.pct} %`);
|
|
209
212
|
adapter.setState(pfadActSoiMoi, {
|
|
210
213
|
val: entry.soilMoisture.pct,
|
|
211
214
|
ack: true
|
|
@@ -216,12 +219,9 @@ const myConfig = {
|
|
|
216
219
|
},
|
|
217
220
|
/**
|
|
218
221
|
* Bodenfeuchte (soilMoisture) setzen auf: => pct = 100%; val = maxIrrigation
|
|
219
|
-
* @param {number} mySprinkleID - ID des
|
|
222
|
+
* @param {number} mySprinkleID - ID des Bewässerungskreises
|
|
220
223
|
*/
|
|
221
224
|
setSoilMoistPct100: (mySprinkleID) => {
|
|
222
|
-
if (adapter.config.debug) {
|
|
223
|
-
adapter.log.info('#1.2 Set ID: '+ myConfig.config[mySprinkleID].objectName + ' setSoilMoistPct100 = 100%');
|
|
224
|
-
}
|
|
225
225
|
myConfig.config[mySprinkleID].soilMoisture.val = myConfig.config[mySprinkleID].soilMoisture.maxIrrigation;
|
|
226
226
|
myConfig.config[mySprinkleID].soilMoisture.pct = 100;
|
|
227
227
|
adapter.setState('sprinkle.' + myConfig.config[mySprinkleID].objectName + '.actualSoilMoisture', {
|
|
@@ -243,10 +243,10 @@ const myConfig = {
|
|
|
243
243
|
ack: true
|
|
244
244
|
});
|
|
245
245
|
} else {
|
|
246
|
-
adapter.log.warn(
|
|
246
|
+
adapter.log.warn(`The ${myConfig.config[mySprinkleID].objectName} soil moisture sensor does not provide a Boolean signal`);
|
|
247
247
|
}
|
|
248
248
|
} else {
|
|
249
|
-
adapter.log.warn(
|
|
249
|
+
adapter.log.warn(`Please check the signals and settings of the ${myConfig.config[mySprinkleID].objectName} soil moisture sensor`);
|
|
250
250
|
}
|
|
251
251
|
},
|
|
252
252
|
/**
|
|
@@ -261,10 +261,10 @@ const myConfig = {
|
|
|
261
261
|
newVal = parseFloat(newVal);
|
|
262
262
|
if (newVal < myConfig.config[mySprinkleID].analogZPct) {
|
|
263
263
|
myVal = myConfig.config[mySprinkleID].analogZPct;
|
|
264
|
-
adapter.log.warn(myConfig.config[mySprinkleID].objectName
|
|
264
|
+
adapter.log.warn(`${myConfig.config[mySprinkleID].objectName}: analog soil moisture sensor at 0 % => The value range was undercut`);
|
|
265
265
|
} else if (newVal > myConfig.config[mySprinkleID].analogOHPct) {
|
|
266
266
|
myVal = myConfig.config[mySprinkleID].analogOHPct;
|
|
267
|
-
adapter.log.warn(myConfig.config[mySprinkleID].objectName
|
|
267
|
+
adapter.log.warn(`${myConfig.config[mySprinkleID].objectName}: analog soil moisture sensor at 100 % => The range of values has been exceeded`);
|
|
268
268
|
} else {
|
|
269
269
|
myVal = newVal;
|
|
270
270
|
}
|
|
@@ -274,10 +274,10 @@ const myConfig = {
|
|
|
274
274
|
ack: true
|
|
275
275
|
});
|
|
276
276
|
} else {
|
|
277
|
-
adapter.log.warn(
|
|
277
|
+
adapter.log.warn(`The ${myConfig.config[mySprinkleID].objectName} soil moisture sensor does not provide a Number signal`);
|
|
278
278
|
}
|
|
279
279
|
} else {
|
|
280
|
-
adapter.log.warn(
|
|
280
|
+
adapter.log.warn(`Please check the signals and settings of the ${myConfig.config[mySprinkleID].objectName} soil moisture sensor`);
|
|
281
281
|
}
|
|
282
282
|
},
|
|
283
283
|
/**
|
|
@@ -286,9 +286,6 @@ const myConfig = {
|
|
|
286
286
|
* @param {number} addVal - soilMoisture.val wird um den Wert addVal erhöht
|
|
287
287
|
*/
|
|
288
288
|
addSoilMoistVal: (mySprinkleID, addVal) => {
|
|
289
|
-
if (adapter.config.debug) {
|
|
290
|
-
adapter.log.info('#1.3 Set ID: '+ myConfig.config[mySprinkleID].objectName + ' addVal: (' + addVal + ')');
|
|
291
|
-
}
|
|
292
289
|
myConfig.config[mySprinkleID].soilMoisture.val += addVal;
|
|
293
290
|
if (myConfig.config[mySprinkleID].soilMoisture.val > myConfig.config[mySprinkleID].soilMoisture.maxRain) {myConfig.config[mySprinkleID].soilMoisture.val = myConfig.config[mySprinkleID].soilMoisture.maxRain}
|
|
294
291
|
myConfig.config[mySprinkleID].soilMoisture.pct = Math.round(1000 * myConfig.config[mySprinkleID].soilMoisture.val
|
package/lib/sendMessageText.js
CHANGED
|
@@ -12,11 +12,11 @@ let adapter;
|
|
|
12
12
|
* @type {{}}
|
|
13
13
|
*/
|
|
14
14
|
let ObjMessage = {};
|
|
15
|
+
|
|
15
16
|
/**
|
|
16
|
-
* Modul zum
|
|
17
|
-
*
|
|
18
|
-
* @
|
|
19
|
-
* @param {object} ObjMessage
|
|
17
|
+
* Modul zum Versenden von Nachrichten mittels Telegram, E-Mail, Pushover oder WhatsApp
|
|
18
|
+
* der passende Adapter muss installiert sein!
|
|
19
|
+
* @type {{onlySendError(): boolean, sendMessage(string): void, initConfigMessage(ioBroker.Adapter): void}}
|
|
20
20
|
*/
|
|
21
21
|
const sendMessageText = {
|
|
22
22
|
|
|
@@ -24,7 +24,7 @@ const sendMessageText = {
|
|
|
24
24
|
*
|
|
25
25
|
* @param {ioBroker.Adapter} myAdapter - Kopie von Adapter main.js
|
|
26
26
|
*/
|
|
27
|
-
initConfigMessage
|
|
27
|
+
initConfigMessage (myAdapter) {
|
|
28
28
|
adapter = myAdapter;
|
|
29
29
|
switch (adapter.config.notificationsType) {
|
|
30
30
|
case 'Telegram':
|
|
@@ -87,7 +87,7 @@ const sendMessageText = {
|
|
|
87
87
|
* send Message ist für Telegram formatiert und muss für andere Empfänger umformatiert werden
|
|
88
88
|
*@param {string} message - Botschaft
|
|
89
89
|
*/
|
|
90
|
-
sendMessage
|
|
90
|
+
sendMessage (message) {
|
|
91
91
|
|
|
92
92
|
let sendMessage = message;
|
|
93
93
|
|
|
@@ -98,9 +98,7 @@ const sendMessageText = {
|
|
|
98
98
|
ObjMessage.instance !== '' &&
|
|
99
99
|
ObjMessage.instance !== null &&
|
|
100
100
|
ObjMessage.instance !== undefined) {
|
|
101
|
-
|
|
102
|
-
adapter.log.debug('start sendMessageText per Telegram');
|
|
103
|
-
}
|
|
101
|
+
adapter.log.debug('start sendMessageText per Telegram');
|
|
104
102
|
sendMessage = '<b><u>SprinkleControl:</u></b>\n' + sendMessage;
|
|
105
103
|
// send Telegram Message
|
|
106
104
|
if ((ObjMessage.User) && (ObjMessage.User !== 'allTelegramUsers')) {
|
|
@@ -128,9 +126,7 @@ const sendMessageText = {
|
|
|
128
126
|
ObjMessage.instance !== undefined) {
|
|
129
127
|
sendMessage = '<b><u>SprinkleControl:</u></b>\n' + sendMessage;
|
|
130
128
|
sendMessage = sendMessage.replace(/\n/g, '<br />');
|
|
131
|
-
|
|
132
|
-
adapter.log.debug('start sendMessageText per E-Mail on used E-Mail-Instance: ${adapter.ObjMessage.instance}');
|
|
133
|
-
}
|
|
129
|
+
adapter.log.debug(`start sendMessageText per E-Mail on used E-Mail-Instance: ${ObjMessage.instance}`);
|
|
134
130
|
// Send E-Mail Message
|
|
135
131
|
adapter.sendTo(ObjMessage.instance, 'send', {
|
|
136
132
|
html: sendMessage,
|
|
@@ -147,9 +143,7 @@ const sendMessageText = {
|
|
|
147
143
|
ObjMessage.instance !== '' &&
|
|
148
144
|
ObjMessage.instance !== null &&
|
|
149
145
|
ObjMessage.instance !== undefined) {
|
|
150
|
-
|
|
151
|
-
adapter.log.debug('start sendMessageText per E-Mail on used E-Mail-Instance: ${adapter.ObjMessage.instance}');
|
|
152
|
-
}
|
|
146
|
+
adapter.log.debug(`start sendMessageText per E-Mail on used E-Mail-Instance: ${ObjMessage.instance}`);
|
|
153
147
|
// Send pushover Message
|
|
154
148
|
if (ObjMessage.SilentNotice === 'true' || ObjMessage.SilentNotice === true) {
|
|
155
149
|
adapter.sendTo(ObjMessage.instance, 'send', {
|
|
@@ -181,9 +175,7 @@ const sendMessageText = {
|
|
|
181
175
|
sendMessage = sendMessage.replace(/<b>|<\/b>/g, '*'); // Fett Bold
|
|
182
176
|
sendMessage = sendMessage.replace(/<i>|<\/i>/g, '_'); // kursive Italic
|
|
183
177
|
sendMessage = sendMessage.replace(/<u>|<\/u>/g, ''); // unterstrichen
|
|
184
|
-
|
|
185
|
-
adapter.log.debug(`start sendMessageText per WhatsApp on used WhatsApp-Instance: ${ObjMessage.instance}`);
|
|
186
|
-
}
|
|
178
|
+
adapter.log.debug(`start sendMessageText per WhatsApp on used WhatsApp-Instance: ${ObjMessage.instance}`);
|
|
187
179
|
// Send WhatsApp Message
|
|
188
180
|
adapter.sendTo(ObjMessage.instance, 'send', {
|
|
189
181
|
text: sendMessage
|
|
@@ -198,7 +190,7 @@ const sendMessageText = {
|
|
|
198
190
|
* Nachrichtenversandabfrage => true (Ja)
|
|
199
191
|
* @returns {boolean}
|
|
200
192
|
*/
|
|
201
|
-
onlySendError
|
|
193
|
+
onlySendError () {
|
|
202
194
|
return (adapter.config.notificationEnabled && adapter.config.notificationsType && ObjMessage.onlyError);
|
|
203
195
|
}
|
|
204
196
|
|
package/lib/tools.js
CHANGED
|
@@ -21,7 +21,7 @@ function addTime(time1, time2){
|
|
|
21
21
|
} // end function seconds2string
|
|
22
22
|
|
|
23
23
|
function string2seconds(n) {
|
|
24
|
-
if(!n) return 0;
|
|
24
|
+
if(!n || (n === "--:--")) return 0;
|
|
25
25
|
if(Number.isInteger(n)) return n;
|
|
26
26
|
const tmp = n.split(':').reverse();
|
|
27
27
|
if(!tmp.length) tmp[0] = 0; // Sekunden
|