iobroker.sprinklecontrol 0.2.7 → 0.2.10
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 -7
- package/admin/index_m.html +0 -15
- package/admin/style.css +8 -0
- package/admin/words.js +0 -2
- package/docs/de/sprinklecontrol.md +17 -16
- package/io-package.json +43 -5
- package/lib/evaporation.js +28 -32
- package/lib/myConfig.js +37 -22
- package/lib/sendMessageText.js +13 -20
- package/lib/valveControl.js +48 -62
- package/main.js +698 -599
- package/package.json +64 -62
package/lib/myConfig.js
CHANGED
|
@@ -21,7 +21,7 @@ let adapter;
|
|
|
21
21
|
* @param {string} res.analogZPct - analog Zero Percent [Auswahlfeld in der Config des Sprinklers > Bodenfeuchte-Sensor > analog > Wert bei 0 %]
|
|
22
22
|
* @param {string} res.analogOHPct - analog One Hundert Percent [Auswahlfeld in der Config des Sprinklers > Bodenfeuchte-Sensor > analog > Wert bei 100 %]
|
|
23
23
|
* @param {string} res.maxSoilMoistureIrrigation - maximale Bodenfeuchte nach der Bewässerung [Auswahlfeld in der Config des Sprinklers]
|
|
24
|
-
* @param {string} res.startDay - Auswahl (threeRd = Start im 3
|
|
24
|
+
* @param {string} res.startDay - Auswahl (threeRd = Start im 3-Tages-Rhythmus,twoNd = Start im 2-Tages-Rhythmus, fixDay = Start an festen Tagen Sun-Sat)
|
|
25
25
|
* @param {boolean} res.sun - Sontag, Sunday (Sun)
|
|
26
26
|
* @param {boolean} res.mon - Montag, Monday (Mon)
|
|
27
27
|
* @param {boolean} res.tue - Dienstag, Tuesday (Tue) (Tues)
|
|
@@ -33,7 +33,7 @@ let adapter;
|
|
|
33
33
|
*/
|
|
34
34
|
function getMetConSM(res) {
|
|
35
35
|
|
|
36
|
-
if (res.methodControlSM === 'bistable'
|
|
36
|
+
if (res.methodControlSM === 'bistable') {
|
|
37
37
|
// bistable (Bodenfeuchte-Sensor)
|
|
38
38
|
adapter.subscribeForeignStates(res.triggerSM);
|
|
39
39
|
return {
|
|
@@ -49,7 +49,7 @@ function getMetConSM(res) {
|
|
|
49
49
|
};
|
|
50
50
|
|
|
51
51
|
|
|
52
|
-
} else if (res.methodControlSM === 'analog'
|
|
52
|
+
} else if (res.methodControlSM === 'analog') {
|
|
53
53
|
// analog (Bodenfeuchte-Sensor)
|
|
54
54
|
adapter.subscribeForeignStates(res.triggerSM);
|
|
55
55
|
return {
|
|
@@ -97,7 +97,7 @@ function getMetConSM(res) {
|
|
|
97
97
|
setVal: null,
|
|
98
98
|
setBool: null
|
|
99
99
|
};
|
|
100
|
-
} else {
|
|
100
|
+
} else if (res.methodControlSM === 'calculation') {
|
|
101
101
|
// interne (Berechnung der Verdunstung)
|
|
102
102
|
return {
|
|
103
103
|
setStartDay: null,
|
|
@@ -110,6 +110,19 @@ function getMetConSM(res) {
|
|
|
110
110
|
setVal: parseFloat(res.maxSoilMoistureIrrigation) / 2,
|
|
111
111
|
setBool: null
|
|
112
112
|
};
|
|
113
|
+
} else {
|
|
114
|
+
adapter.log.warn('Emergency program! No irrigation type is selected in the SprinkleControl configuration! Please adjust.');
|
|
115
|
+
return {
|
|
116
|
+
setStartDay: 'twoNd',
|
|
117
|
+
setStartFixDay: [false, false, false, false, false, false, false], // Sun, Mon, Tue, Wed, Thur, Fri, Sat
|
|
118
|
+
setMetConSM: 'fixDay',
|
|
119
|
+
setTrigSM: '',
|
|
120
|
+
setAnalogZPct: null,
|
|
121
|
+
setAnalogOHPct: null,
|
|
122
|
+
setPct: null,
|
|
123
|
+
setVal: null,
|
|
124
|
+
setBool: null
|
|
125
|
+
};
|
|
113
126
|
}
|
|
114
127
|
}
|
|
115
128
|
|
|
@@ -127,13 +140,19 @@ const myConfig = {
|
|
|
127
140
|
/** Name des Bewässerungskreises
|
|
128
141
|
* @type {string}
|
|
129
142
|
*/
|
|
130
|
-
|
|
143
|
+
let objectName
|
|
144
|
+
if(res.sprinkleName !== '') {
|
|
145
|
+
objectName = res.sprinkleName.replace(/[.;, ]/g, '_');
|
|
146
|
+
} else if (res.sprinkleName === '') {
|
|
147
|
+
objectName = res.name.replace(/[.;, ]/g, '_');
|
|
148
|
+
}
|
|
131
149
|
const metConSM = getMetConSM(res);
|
|
132
150
|
const newEntry = {
|
|
133
151
|
/** Starttage in der Woche
|
|
134
152
|
* - 0(Sun); 1(Mon); 2(Tue); 3(Wed); 4(Thur); 5(Fri); 6(Sat)
|
|
135
153
|
* @type {Array.<boolean>}
|
|
136
|
-
* startFixDay */
|
|
154
|
+
* startFixDay */
|
|
155
|
+
startFixDay: metConSM.setStartFixDay, // Sontag, Sunday (Sun)// Montag, Monday (Mon)// Dienstag, Tuesday (Tue) (Tues)// Mittwoch, Wednesday (Wed)// Donnerstag, Thursday (Thur) (Thurs)// Freitag, Friday (Fri)// Samstag, Saturday (Sat)
|
|
137
156
|
/** - Auswahl:
|
|
138
157
|
* - threeRd = Start im 3 Tages Rhythmus,
|
|
139
158
|
* - twoNd = Start im 2 Tages Rhythmus
|
|
@@ -177,15 +196,13 @@ const myConfig = {
|
|
|
177
196
|
adapter.subscribeStates(newEntry.autoOnID); // abonnieren der Statusänderungen des Objekts (reagieren auf 'autoOn' der einzelnen Bewässerungskreise)
|
|
178
197
|
// adapter.subscribeForeignStates(newEntry.idState); // abonnieren der Statusänderungen des Objekts (reagiert auf Änderung des 'Ventils' der einzelnen Bewässerungskreise zur Fehlerkontrolle bzw. Verbrauchsermittlung)
|
|
179
198
|
}
|
|
180
|
-
|
|
181
|
-
adapter.log.info('#1.0 => Set ID: ' + objectName + '(' + newEntry.sprinkleID + ') hinzugefügt - ' + JSON.stringify(myConfig.config[newEntry.sprinkleID]));
|
|
182
|
-
}
|
|
199
|
+
adapter.log.debug(`Config ${objectName} created (${newEntry.sprinkleID}) - ${JSON.stringify(myConfig.config[newEntry.sprinkleID])}`);
|
|
183
200
|
}
|
|
184
201
|
}
|
|
185
202
|
},
|
|
186
203
|
/**
|
|
187
204
|
* apply Evaporation
|
|
188
|
-
*
|
|
205
|
+
* → Verdunstung anwenden auf die einzelnen Sprenger kreise
|
|
189
206
|
* @param {number} eTP - pot. Evapotranspiration nach Penman ETp in mm/d
|
|
190
207
|
*/
|
|
191
208
|
applyEvaporation: (eTP) => {
|
|
@@ -203,9 +220,7 @@ const myConfig = {
|
|
|
203
220
|
entry.soilMoisture.val = entry.soilMoisture.maxRain;
|
|
204
221
|
}
|
|
205
222
|
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
|
-
}
|
|
223
|
+
adapter.log.debug(`apply Evaporation: ${objectName} => soilMoisture: ${entry.soilMoisture.val} soilMoisture: ${entry.soilMoisture.pct} %`);
|
|
209
224
|
adapter.setState(pfadActSoiMoi, {
|
|
210
225
|
val: entry.soilMoisture.pct,
|
|
211
226
|
ack: true
|
|
@@ -216,7 +231,7 @@ const myConfig = {
|
|
|
216
231
|
},
|
|
217
232
|
/**
|
|
218
233
|
* Bodenfeuchte (soilMoisture) setzen auf: => pct = 100%; val = maxIrrigation
|
|
219
|
-
* @param {number} mySprinkleID - ID des
|
|
234
|
+
* @param {number} mySprinkleID - ID des Bewässerungskreises
|
|
220
235
|
*/
|
|
221
236
|
setSoilMoistPct100: (mySprinkleID) => {
|
|
222
237
|
myConfig.config[mySprinkleID].soilMoisture.val = myConfig.config[mySprinkleID].soilMoisture.maxIrrigation;
|
|
@@ -240,10 +255,10 @@ const myConfig = {
|
|
|
240
255
|
ack: true
|
|
241
256
|
});
|
|
242
257
|
} else {
|
|
243
|
-
adapter.log.warn(
|
|
258
|
+
adapter.log.warn(`The ${myConfig.config[mySprinkleID].objectName} soil moisture sensor does not provide a Boolean signal`);
|
|
244
259
|
}
|
|
245
260
|
} else {
|
|
246
|
-
adapter.log.warn(
|
|
261
|
+
adapter.log.warn(`Please check the signals and settings of the ${myConfig.config[mySprinkleID].objectName} soil moisture sensor`);
|
|
247
262
|
}
|
|
248
263
|
},
|
|
249
264
|
/**
|
|
@@ -258,10 +273,10 @@ const myConfig = {
|
|
|
258
273
|
newVal = parseFloat(newVal);
|
|
259
274
|
if (newVal < myConfig.config[mySprinkleID].analogZPct) {
|
|
260
275
|
myVal = myConfig.config[mySprinkleID].analogZPct;
|
|
261
|
-
adapter.log.warn(myConfig.config[mySprinkleID].objectName
|
|
276
|
+
adapter.log.warn(`${myConfig.config[mySprinkleID].objectName}: analog soil moisture sensor at 0 % => The value range was undercut`);
|
|
262
277
|
} else if (newVal > myConfig.config[mySprinkleID].analogOHPct) {
|
|
263
278
|
myVal = myConfig.config[mySprinkleID].analogOHPct;
|
|
264
|
-
adapter.log.warn(myConfig.config[mySprinkleID].objectName
|
|
279
|
+
adapter.log.warn(`${myConfig.config[mySprinkleID].objectName}: analog soil moisture sensor at 100 % => The range of values has been exceeded`);
|
|
265
280
|
} else {
|
|
266
281
|
myVal = newVal;
|
|
267
282
|
}
|
|
@@ -271,20 +286,20 @@ const myConfig = {
|
|
|
271
286
|
ack: true
|
|
272
287
|
});
|
|
273
288
|
} else {
|
|
274
|
-
adapter.log.warn(
|
|
289
|
+
adapter.log.warn(`The ${myConfig.config[mySprinkleID].objectName} soil moisture sensor does not provide a Number signal`);
|
|
275
290
|
}
|
|
276
291
|
} else {
|
|
277
|
-
adapter.log.warn(
|
|
292
|
+
adapter.log.warn(`Please check the signals and settings of the ${myConfig.config[mySprinkleID].objectName} soil moisture sensor`);
|
|
278
293
|
}
|
|
279
294
|
},
|
|
280
295
|
/**
|
|
281
|
-
* Bodenfeuchte (soilMoisture) erhöhen bis
|
|
296
|
+
* Bodenfeuchte (soilMoisture) erhöhen bis maxIrrigation (100%)
|
|
282
297
|
* @param {number} mySprinkleID - ID des Bewässerungskreis
|
|
283
298
|
* @param {number} addVal - soilMoisture.val wird um den Wert addVal erhöht
|
|
284
299
|
*/
|
|
285
300
|
addSoilMoistVal: (mySprinkleID, addVal) => {
|
|
286
301
|
myConfig.config[mySprinkleID].soilMoisture.val += addVal;
|
|
287
|
-
if (myConfig.config[mySprinkleID].soilMoisture.val > myConfig.config[mySprinkleID].soilMoisture.
|
|
302
|
+
if (myConfig.config[mySprinkleID].soilMoisture.val > myConfig.config[mySprinkleID].soilMoisture.maxIrrigation) {myConfig.config[mySprinkleID].soilMoisture.val = myConfig.config[mySprinkleID].soilMoisture.maxIrrigation}
|
|
288
303
|
myConfig.config[mySprinkleID].soilMoisture.pct = Math.round(1000 * myConfig.config[mySprinkleID].soilMoisture.val
|
|
289
304
|
/ myConfig.config[mySprinkleID].soilMoisture.maxIrrigation) / 10; // Berechnung in %
|
|
290
305
|
adapter.setState('sprinkle.' + myConfig.config[mySprinkleID].objectName + '.actualSoilMoisture', {
|
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':
|
|
@@ -51,7 +51,7 @@ const sendMessageText = {
|
|
|
51
51
|
/** @type {string} */ emailReceiver: adapter.config.emailReceiver,
|
|
52
52
|
/** @type {string} */ emailSender: adapter.config.emailSender,
|
|
53
53
|
/** @type {boolean} */ onlyError: adapter.config.emailOnlyError,
|
|
54
|
-
/** @type {number} */ waiting: parseInt(adapter.config.emailWaitToSend) * 1000
|
|
54
|
+
/** @type {number} */ waiting: (parseInt(adapter.config.emailWaitToSend) * 1000) || 0
|
|
55
55
|
};
|
|
56
56
|
break;
|
|
57
57
|
|
|
@@ -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', {
|
|
@@ -178,12 +172,11 @@ const sendMessageText = {
|
|
|
178
172
|
ObjMessage.instance !== null &&
|
|
179
173
|
ObjMessage.instance !== undefined) {
|
|
180
174
|
sendMessage = '<b><u>SprinkleControl:</u></b>\n' + sendMessage;
|
|
175
|
+
sendMessage = sendMessage.replace(/\n/g,'%0A'); // Zeilenumbruch
|
|
181
176
|
sendMessage = sendMessage.replace(/<b>|<\/b>/g, '*'); // Fett Bold
|
|
182
177
|
sendMessage = sendMessage.replace(/<i>|<\/i>/g, '_'); // kursive Italic
|
|
183
178
|
sendMessage = sendMessage.replace(/<u>|<\/u>/g, ''); // unterstrichen
|
|
184
|
-
|
|
185
|
-
adapter.log.debug(`start sendMessageText per WhatsApp on used WhatsApp-Instance: ${ObjMessage.instance}`);
|
|
186
|
-
}
|
|
179
|
+
adapter.log.debug(`start sendMessageText per WhatsApp on used WhatsApp-Instance: ${ObjMessage.instance}`);
|
|
187
180
|
// Send WhatsApp Message
|
|
188
181
|
adapter.sendTo(ObjMessage.instance, 'send', {
|
|
189
182
|
text: sendMessage
|
|
@@ -198,7 +191,7 @@ const sendMessageText = {
|
|
|
198
191
|
* Nachrichtenversandabfrage => true (Ja)
|
|
199
192
|
* @returns {boolean}
|
|
200
193
|
*/
|
|
201
|
-
onlySendError
|
|
194
|
+
onlySendError () {
|
|
202
195
|
return (adapter.config.notificationEnabled && adapter.config.notificationsType && ObjMessage.onlyError);
|
|
203
196
|
}
|
|
204
197
|
|
package/lib/valveControl.js
CHANGED
|
@@ -16,7 +16,7 @@ let adapter;
|
|
|
16
16
|
|
|
17
17
|
/**
|
|
18
18
|
* Thread-list
|
|
19
|
-
*
|
|
19
|
+
* → Auflistung aller aktiver Sprenger-Kreise
|
|
20
20
|
* @type {array}
|
|
21
21
|
*/
|
|
22
22
|
const threadList = [];
|
|
@@ -62,7 +62,7 @@ const currentPumpUse = {
|
|
|
62
62
|
|
|
63
63
|
/**
|
|
64
64
|
* Sprinkle (sprinkleName) delete
|
|
65
|
-
*
|
|
65
|
+
* → Ventil (sprinkleName) löschen
|
|
66
66
|
* @param {array.<{sprinkleName: string}>} killList
|
|
67
67
|
*/
|
|
68
68
|
function delList (killList) {
|
|
@@ -81,9 +81,7 @@ function delList (killList) {
|
|
|
81
81
|
/* If a valve is found, delete the last array (entry). Wenn Ventil gefunden letzten Array (Auftrag) löschen */
|
|
82
82
|
if (bValveFound) {
|
|
83
83
|
threadList.pop();
|
|
84
|
-
|
|
85
|
-
adapter.log.info('#2.10 order deleted ID: ' + sprinkleName + ' ( rest orders: ' + threadList.length + ')');
|
|
86
|
-
}
|
|
84
|
+
adapter.log.debug(`delList=> order deleted ID: ${sprinkleName} ( rest orders: ${threadList.length} )`);
|
|
87
85
|
}
|
|
88
86
|
}
|
|
89
87
|
|
|
@@ -152,7 +150,7 @@ function boostList (sprinkleID) {
|
|
|
152
150
|
|
|
153
151
|
/**
|
|
154
152
|
* If boostOn is ended by entering "runningTime = 0", normal operation should be restored. (Delete timer)
|
|
155
|
-
*
|
|
153
|
+
* → Wenn boostOn über die Eingabe "runningTime = 0" beendet wird, so soll zum Normalen ablauf wieder zurückgekehrt werden. (Löschen der Timer)
|
|
156
154
|
* @param {number} sprinkleID
|
|
157
155
|
*/
|
|
158
156
|
function boostKill (sprinkleID) {
|
|
@@ -170,9 +168,7 @@ function boostKill (sprinkleID) {
|
|
|
170
168
|
if (entry.times.boostTime1) {
|
|
171
169
|
clearTimeout(entry.times.boostTime1);
|
|
172
170
|
entry.times.boostTime1 = null;
|
|
173
|
-
|
|
174
|
-
adapter.log.info('#2.11 ID: ' + entry.sprinkleName + ' => boostTime2 (Ende) gelöscht)');
|
|
175
|
-
}
|
|
171
|
+
adapter.log.debug(`boostKill => ID: ${entry.sprinkleName} => boostTime2 (Ende) gelöscht)`);
|
|
176
172
|
}
|
|
177
173
|
if (entry.times.boostTime2) {
|
|
178
174
|
clearTimeout(entry.times.boostTime2);
|
|
@@ -207,14 +203,14 @@ const valveDelay = () => {
|
|
|
207
203
|
* @returns {Promise<void>}
|
|
208
204
|
*/
|
|
209
205
|
const switchTheValvesOffOn = async (threadList, parallel) => {
|
|
210
|
-
/**Sammlung von
|
|
206
|
+
/**Sammlung von.sprinkleName die am Ende von updateList gelöscht werden
|
|
211
207
|
* @type {array} - */
|
|
212
208
|
const killList = [];
|
|
213
209
|
for (const entry of threadList) { // ausschalten der Ventile
|
|
214
|
-
if ((!entry.enabled //
|
|
210
|
+
if ((!entry.enabled // Ventile ausgeschaltet z.B. Intervall-Beregnung
|
|
215
211
|
|| entry.enabled && entry.myBreak // || in Pause z.B. Boost
|
|
216
|
-
|| entry.killSprinkle) // || Bewässerung erledigt
|
|
217
|
-
&& entry.enabled !== entry.enabledState //
|
|
212
|
+
|| entry.killSprinkle) // || Bewässerung erledigt
|
|
213
|
+
&& entry.enabled !== entry.enabledState // && Ventil nicht aktuell
|
|
218
214
|
) {
|
|
219
215
|
adapter.setForeignState(entry.idState, {
|
|
220
216
|
val: false,
|
|
@@ -223,11 +219,11 @@ const switchTheValvesOffOn = async (threadList, parallel) => {
|
|
|
223
219
|
if (err) {
|
|
224
220
|
return err;
|
|
225
221
|
} else {
|
|
226
|
-
adapter.log.info(
|
|
222
|
+
adapter.log.info(`Set (${myConfig.config[entry.sprinkleID].methodControlSM}) ID: ${entry.sprinkleName}, value: ${entry.enabled}`);
|
|
227
223
|
}
|
|
228
224
|
});
|
|
229
225
|
entry.enabledState = entry.enabled;
|
|
230
|
-
/* Ventil aus threadList löschen
|
|
226
|
+
/* Ventil aus threadList löschen → Aufgabe beendet und sind nicht in der Pause */
|
|
231
227
|
if (entry.killSprinkle) {
|
|
232
228
|
killList.push(entry.sprinkleName);
|
|
233
229
|
}
|
|
@@ -257,7 +253,7 @@ const switchTheValvesOffOn = async (threadList, parallel) => {
|
|
|
257
253
|
if (err) {
|
|
258
254
|
return err;
|
|
259
255
|
} else {
|
|
260
|
-
adapter.log.info(
|
|
256
|
+
adapter.log.info(`Set (${myConfig.config[entry.sprinkleID].methodControlSM}) ID: ${entry.sprinkleName}, value: ${entry.enabled}, duration: ${addTime(entry.wateringTime,'')}`);
|
|
261
257
|
}
|
|
262
258
|
});
|
|
263
259
|
entry.enabledState = entry.enabled;
|
|
@@ -326,7 +322,7 @@ function updateList () {
|
|
|
326
322
|
&& (!entry.calcOn // Vergleich nur bei Berechnung der Verdunstung
|
|
327
323
|
|| !entry.autoOn // Vergleich nur bei Automatik
|
|
328
324
|
|| (myConfig.config[entry.sprinkleID].soilMoisture.val < myConfig.config[entry.sprinkleID].soilMoisture.maxIrrigation)) // Bodenfeuchte noch nicht erreicht? (z.B. beim Regen)
|
|
329
|
-
) { /*
|
|
325
|
+
) { /* Zeit läuft */
|
|
330
326
|
adapter.setState('sprinkle.' + entry.sprinkleName + '.countdown', {
|
|
331
327
|
val: addTime(entry.wateringTime - entry.count, ''),
|
|
332
328
|
ack: true
|
|
@@ -374,7 +370,7 @@ function updateList () {
|
|
|
374
370
|
ack: true
|
|
375
371
|
});
|
|
376
372
|
|
|
377
|
-
/* Wenn in der Konfiguration Bodenfeuchte = 100% gesetzt ist und Auto-Bewässerung aktive, dann Bodenfeuchte = 100% setzen*/
|
|
373
|
+
/* Wenn in der Konfiguration Bodenfeuchte = 100 % gesetzt ist und Auto-Bewässerung aktive, dann Bodenfeuchte = 100 % setzen*/
|
|
378
374
|
if (entry.autoOn && entry.calcOn && myConfig.config[entry.sprinkleID].endIrrigation) {
|
|
379
375
|
myConfig.setSoilMoistPct100(entry.sprinkleID);
|
|
380
376
|
}
|
|
@@ -384,15 +380,13 @@ function updateList () {
|
|
|
384
380
|
if (myConfig.config[entry.sprinkleID].booster) {
|
|
385
381
|
if (boostOn) {boostKill(entry.sprinkleID);}
|
|
386
382
|
boostReady = true;
|
|
387
|
-
|
|
388
|
-
adapter.log.info('#2.12 ID: ' + entry.sprinkleName + 'UpdateList Sprinkle Off: boostReady = ' + boostReady);
|
|
389
|
-
}
|
|
383
|
+
adapter.log.debug(`ID: ${entry.sprinkleName}UpdateList Sprinkle Off: boostReady = ${boostReady}`);
|
|
390
384
|
}
|
|
391
385
|
/* Zeiten löschen */
|
|
392
386
|
clearInterval(entry.countdown);
|
|
393
387
|
/*clearTimeout(entry.onOffTimeoutOn);*/
|
|
394
388
|
clearTimeout(entry.onOffTimeoutOff);
|
|
395
|
-
/* Ventil aus threadList löschen
|
|
389
|
+
/* Ventil aus threadList löschen → Aufgabe beendet */
|
|
396
390
|
//delList(entry.sprinkleName);
|
|
397
391
|
entry.killSprinkle = true;
|
|
398
392
|
updateList();
|
|
@@ -408,7 +402,7 @@ function updateList () {
|
|
|
408
402
|
}
|
|
409
403
|
|
|
410
404
|
if (curFlow < 0) {
|
|
411
|
-
/* - wenn beim Umschalten der Pumpen die Förderleistung zu gering
|
|
405
|
+
/* - wenn beim Umschalten der Pumpen die Förderleistung zu gering → Ventile deaktivieren - */
|
|
412
406
|
// aufsteigend sortieren nach der Verbrauchsmenge
|
|
413
407
|
threadList.sort(mySortAscending);
|
|
414
408
|
|
|
@@ -427,7 +421,7 @@ function updateList () {
|
|
|
427
421
|
ack: true
|
|
428
422
|
});
|
|
429
423
|
// valveOnOff(entry, false, '#2.6 Set: wait, ID: ');
|
|
430
|
-
adapter.log.info(
|
|
424
|
+
adapter.log.info(`Set ID: ${entry.sprinkleName} Pump delivery rate too low, wait! curFlow ${curFlow} parallel: ${parallel}`);
|
|
431
425
|
}
|
|
432
426
|
}
|
|
433
427
|
}
|
|
@@ -447,9 +441,7 @@ function updateList () {
|
|
|
447
441
|
entry.enabled = true; // einschalten merken
|
|
448
442
|
if (myConfig.config[entry.sprinkleID].booster) {
|
|
449
443
|
boostReady = false;
|
|
450
|
-
|
|
451
|
-
adapter.log.info('#2.13 ID: ' + entry.sprinkleName + 'UpdateList sprinkle On: boostReady = ' + boostReady);
|
|
452
|
-
}
|
|
444
|
+
adapter.log.debug(`ID: ${entry.sprinkleName}UpdateList sprinkle On: boostReady = ${boostReady}`);
|
|
453
445
|
setTimeout(() => {
|
|
454
446
|
boostList(entry.sprinkleID);
|
|
455
447
|
}, 50);
|
|
@@ -484,7 +476,7 @@ function updateList () {
|
|
|
484
476
|
|
|
485
477
|
switchTheValvesOffOn(threadList, parallel).then(err => {
|
|
486
478
|
if (err) {
|
|
487
|
-
adapter.log.error('
|
|
479
|
+
adapter.log.error('Error - Set (false) err: ' + err);
|
|
488
480
|
sendMessageText.sendMessage('Error - Set (fase) err: ' + err);
|
|
489
481
|
}
|
|
490
482
|
});
|
|
@@ -494,11 +486,11 @@ function updateList () {
|
|
|
494
486
|
|
|
495
487
|
/**
|
|
496
488
|
* +++++ Set the current pump for irrigation +++++
|
|
497
|
-
*
|
|
489
|
+
* → Festlegen der aktuellen Pumpe zur Bewässerung
|
|
498
490
|
*/
|
|
499
491
|
function setActualPump () {
|
|
500
492
|
if (adapter.config.cisternSettings === true) {
|
|
501
|
-
/* Zisternen-Bewässerung Einstellung in der config (2.Pumpe) aktiviert */
|
|
493
|
+
/* Zisternen-Bewässerung Einstellung in der config (2. Pumpe) aktiviert */
|
|
502
494
|
if (currentPumpUse.enable === true) {
|
|
503
495
|
/* Bewässerungspumpen aktiv */
|
|
504
496
|
if ((fillLevelCistern < parseFloat(adapter.config.triggerMinCisternLevel)) && (currentPumpUse.pumpCistern === true)) {
|
|
@@ -514,7 +506,7 @@ function setActualPump () {
|
|
|
514
506
|
val: true,
|
|
515
507
|
ack: false
|
|
516
508
|
}); // Hauptpumpe Ein
|
|
517
|
-
adapter.log.info('
|
|
509
|
+
adapter.log.info('Pump change (cistern empty) Cistern pump off => main pump on');
|
|
518
510
|
updateList(); // Wasserverbrauch an Pumpenleistung anpassen
|
|
519
511
|
}
|
|
520
512
|
if (fillLevelCistern < parseFloat(adapter.config.triggerMinCisternLevel)) {
|
|
@@ -584,7 +576,7 @@ function setPumpOnOff(pumpOnOff) {
|
|
|
584
576
|
ack: false
|
|
585
577
|
});
|
|
586
578
|
currentPumpUse.enable = true;
|
|
587
|
-
adapter.log.info('
|
|
579
|
+
adapter.log.info('Set (pump) on');
|
|
588
580
|
}
|
|
589
581
|
} else {
|
|
590
582
|
if (state.val !== false) {
|
|
@@ -593,11 +585,11 @@ function setPumpOnOff(pumpOnOff) {
|
|
|
593
585
|
ack: false
|
|
594
586
|
});
|
|
595
587
|
currentPumpUse.enable = false;
|
|
596
|
-
adapter.log.info('
|
|
588
|
+
adapter.log.info('Set (pump) off');
|
|
597
589
|
}
|
|
598
590
|
}
|
|
599
591
|
} else if (err) {
|
|
600
|
-
adapter.log.error(
|
|
592
|
+
adapter.log.error(`triggerMainPump ${currentPumpUse.pumpName} is not available (ist nicht erreichbar): ${err}`);
|
|
601
593
|
}
|
|
602
594
|
});
|
|
603
595
|
}
|
|
@@ -618,7 +610,7 @@ function setVoltageOnOff(voltageOnOff) {
|
|
|
618
610
|
val: true,
|
|
619
611
|
ack: false
|
|
620
612
|
});
|
|
621
|
-
adapter.log.info('
|
|
613
|
+
adapter.log.info('Set (voltage) on');
|
|
622
614
|
}
|
|
623
615
|
} else {
|
|
624
616
|
if (state.val !== false) {
|
|
@@ -626,11 +618,11 @@ function setVoltageOnOff(voltageOnOff) {
|
|
|
626
618
|
val: false ,
|
|
627
619
|
ack: false
|
|
628
620
|
});
|
|
629
|
-
adapter.log.info('
|
|
621
|
+
adapter.log.info('Set (voltage) off');
|
|
630
622
|
}
|
|
631
623
|
}
|
|
632
624
|
} else if (err) {
|
|
633
|
-
adapter.log.error('
|
|
625
|
+
adapter.log.error('triggerControlVoltage is not available (ist nicht erreichbar): ' + err);
|
|
634
626
|
}
|
|
635
627
|
});
|
|
636
628
|
}
|
|
@@ -678,8 +670,8 @@ function addConsumedAndTime(entry) {
|
|
|
678
670
|
/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
|
|
679
671
|
|
|
680
672
|
/**
|
|
681
|
-
*
|
|
682
|
-
* @type {{clearEntireList:
|
|
673
|
+
* -- externe Funktionen -> initValveControl - addList - clearEntireList - setFillLevelCistern --
|
|
674
|
+
* @type {{clearEntireList(): void, initValveControl(ioBroker.Adapter): void, setFillLevelCistern(number): void, addList(Array<{auto: Boolean, sprinkleID: Number, wateringTime: Number}>): void}}
|
|
683
675
|
*/
|
|
684
676
|
const valveControl = {
|
|
685
677
|
/**
|
|
@@ -687,7 +679,7 @@ const valveControl = {
|
|
|
687
679
|
* => Initialisieren Sie die Startkonfiguration von ventilControl
|
|
688
680
|
* @param {ioBroker.Adapter} myAdapter
|
|
689
681
|
*/
|
|
690
|
-
initValveControl
|
|
682
|
+
initValveControl (myAdapter) {
|
|
691
683
|
adapter = adapter || myAdapter;
|
|
692
684
|
currentPumpUse.pumpCistern = false;
|
|
693
685
|
currentPumpUse.pumpName = adapter.config.triggerMainPump || '';
|
|
@@ -703,7 +695,7 @@ const valveControl = {
|
|
|
703
695
|
val: 0 + ' : ' + adapter.config.maximumParallelValves,
|
|
704
696
|
ack: true
|
|
705
697
|
});
|
|
706
|
-
/* Pumpe ausschalter wenn vorhanden */
|
|
698
|
+
/* Pumpe ausschalter, wenn vorhanden */
|
|
707
699
|
if (adapter.config.triggerMainPump !== '') {
|
|
708
700
|
adapter.getState('adapter.config.triggerMainPump', (err, state) => {
|
|
709
701
|
if (state) {
|
|
@@ -714,7 +706,7 @@ const valveControl = {
|
|
|
714
706
|
}
|
|
715
707
|
});
|
|
716
708
|
}
|
|
717
|
-
/* Pumpe (Zisterne) ausschalter wenn vorhanden */
|
|
709
|
+
/* Pumpe (Zisterne) ausschalter, wenn vorhanden */
|
|
718
710
|
if (adapter.config.triggerCisternPump !== '') {
|
|
719
711
|
adapter.getState('adapter.config.triggerCisternPump', (err, state) => {
|
|
720
712
|
if (state) {
|
|
@@ -728,7 +720,7 @@ const valveControl = {
|
|
|
728
720
|
/* alle Ventile (.name = "hm-rpc.0.MEQ1234567.3.STATE") in einem definierten Zustand (false) versetzen*/
|
|
729
721
|
const result = adapter.config.events;
|
|
730
722
|
if (result) {
|
|
731
|
-
for(const res of result) {
|
|
723
|
+
for (const res of result) {
|
|
732
724
|
adapter.getState(res.name, (err, state) => {
|
|
733
725
|
if (state) {
|
|
734
726
|
adapter.setState(res.name, {
|
|
@@ -743,19 +735,19 @@ const valveControl = {
|
|
|
743
735
|
|
|
744
736
|
/**
|
|
745
737
|
* Add Sprinkle
|
|
746
|
-
*
|
|
747
|
-
* - auto
|
|
748
|
-
* - sprinkleID
|
|
749
|
-
* - wateringTime
|
|
738
|
+
* → Sprinkle hinzufügen
|
|
739
|
+
* - auto → Automatik == (true), Handbetrieb == (false)
|
|
740
|
+
* - sprinkleID → zugriff auf myConfig.config[sprinkleID]. xyz
|
|
741
|
+
* - wateringTime → Bewässerungszeit in min
|
|
750
742
|
* @param {Array.<{auto: Boolean, sprinkleID: Number, wateringTime: Number}>} sprinkleList
|
|
751
743
|
*/
|
|
752
|
-
addList
|
|
744
|
+
addList (sprinkleList) {
|
|
753
745
|
//
|
|
754
746
|
for (const res of sprinkleList) {
|
|
755
747
|
const sprinkleName = myConfig.config[res.sprinkleID].objectName;
|
|
756
748
|
/**
|
|
757
749
|
* add done
|
|
758
|
-
*
|
|
750
|
+
* → hinzufügen erledigt (Sprenger bereits aktive)
|
|
759
751
|
* @type {boolean}
|
|
760
752
|
*/
|
|
761
753
|
let addDone = false;
|
|
@@ -774,9 +766,7 @@ const valveControl = {
|
|
|
774
766
|
ack: false
|
|
775
767
|
});
|
|
776
768
|
addDone = true; // Sprinkle found
|
|
777
|
-
|
|
778
|
-
adapter.log.info('#2.14 update ID: ' + entry.sprinkleName + ' new time: ' + addTime(res.wateringTime, ''));
|
|
779
|
-
}
|
|
769
|
+
adapter.log.debug(`update ID: ${entry.sprinkleName} new time: ${addTime(res.wateringTime, '')}`);
|
|
780
770
|
break;
|
|
781
771
|
}
|
|
782
772
|
}
|
|
@@ -821,9 +811,7 @@ const valveControl = {
|
|
|
821
811
|
val: addTime(res.wateringTime, ''),
|
|
822
812
|
ack: false
|
|
823
813
|
});
|
|
824
|
-
|
|
825
|
-
adapter.log.info('#2.15 ID: ' + sprinkleName + 'new order created: ' + JSON.stringify(threadList[newThread.id]));
|
|
826
|
-
}
|
|
814
|
+
adapter.log.debug(`ID: ${sprinkleName} new order created: ${JSON.stringify(threadList[newThread.id])}`);
|
|
827
815
|
}
|
|
828
816
|
}
|
|
829
817
|
updateList();
|
|
@@ -833,7 +821,7 @@ const valveControl = {
|
|
|
833
821
|
* switch off all devices, when close the adapter
|
|
834
822
|
* => Beim Beenden des adapters alles ausschalten
|
|
835
823
|
*/
|
|
836
|
-
clearEntireList
|
|
824
|
+
clearEntireList () {
|
|
837
825
|
if (boostListTimer) {
|
|
838
826
|
clearTimeout(boostListTimer);
|
|
839
827
|
}
|
|
@@ -872,10 +860,8 @@ const valveControl = {
|
|
|
872
860
|
clearTimeout(entry.times.boostTime2);
|
|
873
861
|
entry.times.boostTime2 = null;
|
|
874
862
|
}
|
|
875
|
-
threadList.pop();
|
|
876
|
-
|
|
877
|
-
adapter.log.info('#2.16 order deleted Stop all ID: ' + entry.sprinkleName + ' ( rest orders: ' + threadList.length + ')');
|
|
878
|
-
}
|
|
863
|
+
threadList.pop(); // del last array
|
|
864
|
+
adapter.log.debug(`order deleted Stop all ID: ${entry.sprinkleName} ( rest orders: ${threadList.length} )`);
|
|
879
865
|
}
|
|
880
866
|
updateList();
|
|
881
867
|
}, // End clearEntireList
|
|
@@ -884,11 +870,11 @@ const valveControl = {
|
|
|
884
870
|
* Änderungen des Füllstands setzen + Vorrang der Pumpe setzen
|
|
885
871
|
* @param {number} levelCistern
|
|
886
872
|
*/
|
|
887
|
-
setFillLevelCistern
|
|
873
|
+
setFillLevelCistern (levelCistern) {
|
|
888
874
|
fillLevelCistern = (typeof levelCistern === 'number') ? levelCistern : 0 ;
|
|
889
875
|
setActualPump();
|
|
890
876
|
} // End setFillLevelCistern
|
|
891
|
-
}
|
|
877
|
+
} // End valveControl
|
|
892
878
|
|
|
893
879
|
/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
|
|
894
880
|
|