iobroker.sprinklecontrol 1.0.7 → 1.0.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/README.md +34 -4
- package/admin/i18n/{de/translations.json → de.json} +5 -0
- package/admin/i18n/{en/translations.json → en.json} +6 -1
- package/admin/i18n/{es/translations.json → es.json} +5 -0
- package/admin/i18n/{fr/translations.json → fr.json} +5 -0
- package/admin/i18n/{it/translations.json → it.json} +5 -0
- package/admin/i18n/{nl/translations.json → nl.json} +5 -0
- package/admin/i18n/{pl/translations.json → pl.json} +5 -0
- package/admin/i18n/{pt/translations.json → pt.json} +5 -0
- package/admin/i18n/{ru/translations.json → ru.json} +5 -0
- package/admin/i18n/{uk/translations.json → uk.json} +5 -0
- package/admin/i18n/{zh-cn/translations.json → zh-cn.json} +5 -0
- package/admin/index_m.html +51 -19
- package/admin/index_m.js +1 -7
- package/admin/words.js +6 -1
- package/io-package.json +40 -42
- package/lib/evaporation.js +2 -2
- package/lib/myConfig.js +3 -1
- package/lib/sendMessageText.js +1 -1
- package/lib/valveControl.js +92 -45
- package/main.js +72 -39
- package/package.json +6 -4
package/main.js
CHANGED
|
@@ -157,6 +157,29 @@ function startAdapter(options) {
|
|
|
157
157
|
adapter.log.warn(`sensorRainfall => Wrong value: ${state.val}, Type: ${typeof state.val}`);
|
|
158
158
|
}
|
|
159
159
|
}
|
|
160
|
+
|
|
161
|
+
// wenn in der config unter methodControlSM!== 'analog' oder 'bistable' eingegeben wurde, dann Bodenfeuchte-Sensor auslesen
|
|
162
|
+
if (myConfig.config) {
|
|
163
|
+
|
|
164
|
+
// @ts-ignore
|
|
165
|
+
function filterByID(obj){
|
|
166
|
+
return (((obj.methodControlSM === 'analog') || (obj.methodControlSM === 'bistable')) && (obj.triggerSM === id));
|
|
167
|
+
}
|
|
168
|
+
const filter = myConfig.config.filter(filterByID);
|
|
169
|
+
if (filter) {
|
|
170
|
+
for (const fil of filter) {
|
|
171
|
+
if (id === myConfig.config[fil.sprinkleID].triggerSM){
|
|
172
|
+
// analog
|
|
173
|
+
if (fil.methodControlSM === 'analog') {
|
|
174
|
+
myConfig.setSoilMoistPct(fil.sprinkleID, state.val);
|
|
175
|
+
} else if (fil.methodControlSM === 'bistable') { // bistable
|
|
176
|
+
myConfig.setSoilMoistBool(fil.sprinkleID, state.val);
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
|
|
160
183
|
// Feiertagskalender
|
|
161
184
|
if (adapter.config.publicHolidays === true) {
|
|
162
185
|
if (id === `${adapter.config.publicHolInstance}.heute.boolean`) {
|
|
@@ -262,28 +285,6 @@ function startAdapter(options) {
|
|
|
262
285
|
}
|
|
263
286
|
}
|
|
264
287
|
}
|
|
265
|
-
// wenn in der config unter methodControlSM!== 'analog' oder 'bistable' eingegeben wurde, dann Bodenfeuchte-Sensor auslesen
|
|
266
|
-
if (myConfig.config) {
|
|
267
|
-
|
|
268
|
-
// @ts-ignore
|
|
269
|
-
function filterByID(obj){
|
|
270
|
-
return (((obj.methodControlSM === 'analog') || (obj.methodControlSM === 'bistable')) && (obj.triggerSM === id));
|
|
271
|
-
}
|
|
272
|
-
const filter = myConfig.config.filter(filterByID);
|
|
273
|
-
if (filter) {
|
|
274
|
-
for (const fil of filter) {
|
|
275
|
-
if (id === myConfig.config[fil.sprinkleID].triggerSM){
|
|
276
|
-
// analog
|
|
277
|
-
if (fil.methodControlSM === 'analog') {
|
|
278
|
-
myConfig.setSoilMoistPct(fil.sprinkleID, state.val);
|
|
279
|
-
} else if (fil.methodControlSM === 'bistable') { // bistable
|
|
280
|
-
myConfig.setSoilMoistBool(fil.sprinkleID, state.val);
|
|
281
|
-
}
|
|
282
|
-
}
|
|
283
|
-
}
|
|
284
|
-
}
|
|
285
|
-
}
|
|
286
|
-
|
|
287
288
|
const idSplit = id.split('.', 5);
|
|
288
289
|
const _found = myConfig.config.find((d) => d.objectName === idSplit[3]);
|
|
289
290
|
if (_found) {
|
|
@@ -321,7 +322,7 @@ function startAdapter(options) {
|
|
|
321
322
|
const _extBreak = await valveControl.extBreak(_found.sprinkleID, state.val).catch((e) => {
|
|
322
323
|
adapter.log.warn(`main.extBreak: ${e}`);
|
|
323
324
|
});
|
|
324
|
-
if (_extBreak?.name) adapter.log.info(`
|
|
325
|
+
if (_extBreak?.name) adapter.log.info(`extBreak: ${_extBreak.name}, ${_extBreak.val ? 'on' : 'off'}`);
|
|
325
326
|
if (_extBreak?.val === false) {
|
|
326
327
|
/* Zustand des Ventils im Thread < 0 > off, < 1 > wait, < 2 > on, < 3 > break, < 4 > Boost(on), < 5 > off(Boost), < 6 > Cistern empty, <<< 7 >>> extBreak */
|
|
327
328
|
adapter.setState(`sprinkle.${_found.objectName}.sprinklerState`, {
|
|
@@ -375,7 +376,7 @@ function startAdapter(options) {
|
|
|
375
376
|
currentPumpUse.controller.ackTrue(state);
|
|
376
377
|
}
|
|
377
378
|
// The state was deleted
|
|
378
|
-
adapter.log.debug(`state ${id} deleted`);
|
|
379
|
+
// adapter.log.debug(`state ${id} deleted`);
|
|
379
380
|
}
|
|
380
381
|
}
|
|
381
382
|
} catch (e) {
|
|
@@ -573,7 +574,7 @@ async function checkStates() {
|
|
|
573
574
|
|
|
574
575
|
/* control.autoOnOff */
|
|
575
576
|
const _autoOnOff = await adapter.getStateAsync('control.autoOnOff');
|
|
576
|
-
if (
|
|
577
|
+
if (typeof _autoOnOff.val === 'boolean') {
|
|
577
578
|
autoOnOffStr = _autoOnOff.val;
|
|
578
579
|
} else {
|
|
579
580
|
autoOnOffStr = true;
|
|
@@ -799,7 +800,7 @@ const calcPos = schedule.scheduleJob('calcPosTimer', '5 0 * * *', function() {
|
|
|
799
800
|
evaporation.setNewDay();
|
|
800
801
|
|
|
801
802
|
// Startzeit Festlegen → verzögert wegen Daten von SunCalc
|
|
802
|
-
setTimeout(() => {
|
|
803
|
+
adapter.setTimeout(() => {
|
|
803
804
|
startTimeSprinkle();
|
|
804
805
|
secondStartTimeSprinkle();
|
|
805
806
|
if (adapter.config.enableTimeBasedRestriction === true) {
|
|
@@ -959,7 +960,7 @@ function addStartTimeSprinkle() {
|
|
|
959
960
|
// @ts-ignore
|
|
960
961
|
adapter.log.debug(`greaterETpCurrent: ${(adapter.config.selectAddStartTime === 'greaterETpCurrent')} & ${(adapter.config.triggerAddStartTimeETpCur < evaporation.getETpTodayNum())}, withExternalSignal; ${(adapter.config.selectAddStartTime === 'withExternalSignal')} & ${addStartTimeSwitch}`);
|
|
961
962
|
}
|
|
962
|
-
setTimeout(()=>{
|
|
963
|
+
adapter.setTimeout(()=>{
|
|
963
964
|
schedule.cancelJob('sprinkleAddStartTime');
|
|
964
965
|
}, 200);
|
|
965
966
|
});
|
|
@@ -1080,8 +1081,8 @@ function startTimeSprinkle() {
|
|
|
1080
1081
|
|
|
1081
1082
|
const scheduleStartTime = schedule.scheduleJob('sprinkleStartTime', `${ startTimeSplit[1] } ${ startTimeSplit[0] } * * *`, function() {
|
|
1082
1083
|
startOfIrrigation("firstStartTime");
|
|
1083
|
-
setTimeout (() => {
|
|
1084
|
-
setTimeout(()=>{
|
|
1084
|
+
adapter.setTimeout (() => {
|
|
1085
|
+
adapter.setTimeout(()=>{
|
|
1085
1086
|
nextStartTime();
|
|
1086
1087
|
}, 800);
|
|
1087
1088
|
schedule.cancelJob('sprinkleStartTime');
|
|
@@ -1089,6 +1090,32 @@ function startTimeSprinkle() {
|
|
|
1089
1090
|
});
|
|
1090
1091
|
}
|
|
1091
1092
|
|
|
1093
|
+
/**
|
|
1094
|
+
* Start of irrigation
|
|
1095
|
+
* - selectStartTime: firstStartTime | autoStart
|
|
1096
|
+
* firstStartTime → Startvorgang durch StartTimeSprinkle
|
|
1097
|
+
* autoStart → Startvorgang durch addStartTimeSprinkle
|
|
1098
|
+
* - Zisterne leer → Abbruch
|
|
1099
|
+
* - Filter enabled → Prüfung der Filterkriterien für alle Sprenger, die aktiviert sind (autoOn == true) und zusätzliche Bewässerung aktiviert haben (addWateringTime > 0)
|
|
1100
|
+
* - Test Bodenfeuchte → Prüfung der Bodenfeuchte für die Sprenger, die die automatische Bewässerung aktiviert haben (autoOn == true) und zusätzliche Bewässerung aktiviert haben (addWateringTime > 0)
|
|
1101
|
+
* - bistable: Bodenfeuchte-Sensor mit 2-Punkt-Regler true und false → Wenn true, dann Startvorgang
|
|
1102
|
+
* - analog: Bodenfeuchte-Sensor im Wertebereich von 0 bis 100% → Prozentuale Bodenfeuchte zu gering → Startvorgang
|
|
1103
|
+
* - fixDay: Start an festen Tagen ohne Sensoren → Bewässerungstag erreicht → Startvorgang
|
|
1104
|
+
* - calculation: Berechnung Bodenfeuchte auf Basis von ETpToday und dailyHighTemp → Prozentuale Bodenfeuchte zu gering → Startvorgang
|
|
1105
|
+
* - Wenn in der Config Regenvorhersage aktiviert: Startvorgang abbrechen, wenn der Regen den eingegebenen Schwellwert überschreitet.
|
|
1106
|
+
* - Start der Bewässerung
|
|
1107
|
+
* - Berechnung der Bewässerungszeit
|
|
1108
|
+
* - Start der Bewässerung über valveControl.addList(memAddList)
|
|
1109
|
+
* - Message über startende Bewässerung mit Angabe der Bewässerungszeit
|
|
1110
|
+
* - Log über startende Bewässerung mit Angabe der Bewässerungszeit
|
|
1111
|
+
* - Wenn extBreak == true → Startvorgang abbrechen und extBreak || START => Message und Log
|
|
1112
|
+
* - Wenn in der Config Regenvorhersage aktiviert: Startvorgang abbrechen, wenn der Regen den eingegebenen Schwellwert überschreitet.
|
|
1113
|
+
* - Wenn autoOnOff == false → keine auto Start
|
|
1114
|
+
* - Wenn Zisterne leer → keine zusätzliche Bewässerung möglich
|
|
1115
|
+
* - Wenn in der Config Regenvorhersage aktiviert: Startvorgang abbrechen, wenn der Regen den eingegebenen Schwellwert überschreitet.
|
|
1116
|
+
*
|
|
1117
|
+
* @param {string} selectStartTime - firstStartTime | autoStart
|
|
1118
|
+
*/
|
|
1092
1119
|
const startOfIrrigation = async (selectStartTime) => {
|
|
1093
1120
|
let messageText = '';
|
|
1094
1121
|
|
|
@@ -1257,21 +1284,27 @@ const startOfIrrigation = async (selectStartTime) => {
|
|
|
1257
1284
|
function secondStartTimeSprinkle() {
|
|
1258
1285
|
schedule.cancelJob('sprinkleSecondStartTime');
|
|
1259
1286
|
|
|
1260
|
-
|
|
1287
|
+
// if (autoOnOff == false) => keine auto Start
|
|
1261
1288
|
if (!autoOnOffStr) {
|
|
1262
|
-
adapter.log.info(`Sprinkle: autoOnOff === Aus ( ${autoOnOffStr} )`);
|
|
1263
|
-
adapter.setState('info.nextAutoStart', {
|
|
1264
|
-
val: 'autoOnOff = off(0)',
|
|
1265
|
-
ack: true
|
|
1266
|
-
});
|
|
1267
1289
|
return;
|
|
1268
1290
|
}
|
|
1269
|
-
|
|
1270
|
-
|
|
1291
|
+
const curTime = new Date();
|
|
1292
|
+
let myWeekday = curTime.getDay(); // 0 = Sonntag, 1 = Montag, ..., 6 = Samstag
|
|
1293
|
+
let secondStartTime = adapter.config.secondStartTime;
|
|
1294
|
+
|
|
1295
|
+
// Start am Wochenende, an Feiertagen oder Urlaub →, wenn Zeiten des Wochenendes verwendet werden soll
|
|
1296
|
+
if((adapter.config.publicWeekend2 && ((myWeekday === 6) || (myWeekday === 0))) // Start am Wochenende
|
|
1297
|
+
|| (adapter.config.publicHolidays2 && ((myWeekday === 6) || (myWeekday === 0)) // heute Feiertag
|
|
1298
|
+
|| (holidayStr === true)) // Urlaub
|
|
1299
|
+
){
|
|
1300
|
+
secondStartTime = adapter.config.weekEndLiving;
|
|
1301
|
+
}
|
|
1302
|
+
|
|
1303
|
+
const secondStartTimeSplit = secondStartTime.split(':');
|
|
1271
1304
|
// @ts-ignore
|
|
1272
1305
|
const scheduleSecondStartTime = schedule.scheduleJob('sprinkleSecondStartTime', `${ secondStartTimeSplit[1] } ${ secondStartTimeSplit[0] } * * *`, function() {
|
|
1273
1306
|
startOfIrrigation("secondStartTime");
|
|
1274
|
-
setTimeout(()=>{
|
|
1307
|
+
adapter.setTimeout(()=>{
|
|
1275
1308
|
schedule.cancelJob('sprinkleSecondStartTime');
|
|
1276
1309
|
}, 200);
|
|
1277
1310
|
});
|
|
@@ -2297,7 +2330,7 @@ async function main() {
|
|
|
2297
2330
|
|
|
2298
2331
|
await checkActualStates().catch((e) => adapter.log.warn(`checkActualStates: ${e}`));
|
|
2299
2332
|
// @ts-ignore
|
|
2300
|
-
timer = setTimeout(() => {
|
|
2333
|
+
timer = adapter.setTimeout(() => {
|
|
2301
2334
|
startTimeSprinkle();
|
|
2302
2335
|
secondStartTimeSprinkle();
|
|
2303
2336
|
addStartTimeSprinkle();
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "iobroker.sprinklecontrol",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.9",
|
|
4
4
|
"description": "Control of several sprinklers depending on weather conditions and pump performance.",
|
|
5
5
|
"author": {
|
|
6
6
|
"name": "Dirk Peter",
|
|
@@ -29,18 +29,20 @@
|
|
|
29
29
|
"node": ">= 22"
|
|
30
30
|
},
|
|
31
31
|
"dependencies": {
|
|
32
|
-
"@iobroker/adapter-core": "^3.
|
|
32
|
+
"@iobroker/adapter-core": "^3.4.1",
|
|
33
33
|
"node-schedule": "^2.1.1",
|
|
34
34
|
"suncalc": "^1.9.0"
|
|
35
35
|
},
|
|
36
36
|
"devDependencies": {
|
|
37
|
-
"@alcalzone/release-script": "^5.2.
|
|
37
|
+
"@alcalzone/release-script": "^5.2.1",
|
|
38
38
|
"@alcalzone/release-script-plugin-iobroker": "^5.2.0",
|
|
39
39
|
"@alcalzone/release-script-plugin-license": "^5.2.0",
|
|
40
40
|
"@alcalzone/release-script-plugin-manual-review": "^5.2.0",
|
|
41
41
|
"@iobroker/adapter-dev": "^1.5.0",
|
|
42
42
|
"@iobroker/eslint-config": "^2.3.4",
|
|
43
|
-
"@iobroker/testing": "^5.2.2"
|
|
43
|
+
"@iobroker/testing": "^5.2.2",
|
|
44
|
+
"@tsconfig/node22": "^22.0.5",
|
|
45
|
+
"@types/node": "^22.19.19"
|
|
44
46
|
},
|
|
45
47
|
"main": "main.js",
|
|
46
48
|
"files": [
|