iobroker.sprinklecontrol 0.2.14 → 0.2.15
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 +6 -4
- package/io-package.json +14 -14
- package/lib/evaporation.js +16 -4
- package/lib/myConfig.js +10 -11
- package/lib/valveControl.js +26 -13
- package/main.js +87 -83
- package/package.json +6 -6
package/README.md
CHANGED
|
@@ -8,6 +8,7 @@
|
|
|
8
8
|
[](https://www.npmjs.com/package/iobroker.sprinklecontrol)
|
|
9
9
|
[](https://www.npmjs.com/package/iobroker.sprinklecontrol)
|
|
10
10
|
[](https://snyk.io/test/github/Dirk-Peter-md/ioBroker.sprinklecontrol)
|
|
11
|
+

|
|
11
12
|
[](https://nodei.co/npm/iobroker.sprinklecontrol/)
|
|
12
13
|
|
|
13
14
|
|
|
@@ -32,6 +33,11 @@ Wetterabhängige automatische Steuerung der Gartenbewässerung
|
|
|
32
33
|
Placeholder for the next version (at the beginning of the line):
|
|
33
34
|
### **WORK IN PROGRESS**
|
|
34
35
|
-->
|
|
36
|
+
### 0.2.15 (2025-06-01)
|
|
37
|
+
* (Dirk-Peter-md) Readme updated
|
|
38
|
+
* (Dirk-Peter-md) Fixed an error when switching off with autoOnOff
|
|
39
|
+
* (Dirk-Peter-md) ioBroker-Bot [W028]
|
|
40
|
+
|
|
35
41
|
### 0.2.14 (2025-03-15)
|
|
36
42
|
* (Dirk-Peter-md) eslint-config added
|
|
37
43
|
* (Dirk-Peter-md) Dependencies updated
|
|
@@ -52,10 +58,6 @@ Wetterabhängige automatische Steuerung der Gartenbewässerung
|
|
|
52
58
|
* (Dirk-Peter-md) Bug fixed => analog soil moisture sensor with negative characteristic
|
|
53
59
|
* (Dirk-Peter-md) Attention => maximum soil moisture in rain now in %
|
|
54
60
|
|
|
55
|
-
### 0.2.10 (2022-05-15)
|
|
56
|
-
* (Dirk-Peter-md) manual watering limited to a maximum of 100%
|
|
57
|
-
* (Dirk-Peter-md) Error whatsapp message fixed
|
|
58
|
-
|
|
59
61
|
## License
|
|
60
62
|
MIT License
|
|
61
63
|
|
package/io-package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"common": {
|
|
3
3
|
"name": "sprinklecontrol",
|
|
4
|
-
"version": "0.2.
|
|
4
|
+
"version": "0.2.15",
|
|
5
5
|
"titleLang": {
|
|
6
6
|
"en": "Sprinkler Control",
|
|
7
7
|
"de": "Sprinklersteuerung",
|
|
@@ -19,6 +19,19 @@
|
|
|
19
19
|
"Dirk Peter <dirk.peter@freenet.de>"
|
|
20
20
|
],
|
|
21
21
|
"news": {
|
|
22
|
+
"0.2.15": {
|
|
23
|
+
"en": "Readme updated\nFixed an error when switching off with autoOnOff\nioBroker-Bot [W028]",
|
|
24
|
+
"de": "Reader aktualisiert\nFehler beim Ausschalten mit autoOnOff behoben\nioBroker-Bot [W028]",
|
|
25
|
+
"ru": "Readme обновлено\nИсправлена ошибка при выключении с помощью autoOnOff\nioBroker-Bot [W028]",
|
|
26
|
+
"pt": "Readme atualizado\nCorrigido um erro ao desligar com autoOnOff\nioBroker-Bot [W028]",
|
|
27
|
+
"nl": "Readme bijgewerkt\nEen fout hersteld bij het uitschakelen met autoOnOff\nioBroker-Bot [W028]",
|
|
28
|
+
"fr": "Lire mise à jour\nCorrection d'une erreur lors de l'arrêt automatique\nioBoker-Bot [W028]",
|
|
29
|
+
"it": "Readme aggiornato\nRisolto un errore durante l'accensione con autoOnOff\nioBroker-Bot [W028]",
|
|
30
|
+
"es": "Readme updated\nSe corrigió un error al apagarse con autoOnOff\nioBroker-Bot [W028]",
|
|
31
|
+
"pl": "Readme zaktualizowany\nNaprawiono błąd podczas wyłączania autoOnOff\njoBroker- Bot [W028]",
|
|
32
|
+
"uk": "Читати далі\nВиправлено помилку при вимкненні з автоматичноOnOff\nioBroker-Bot [W028]",
|
|
33
|
+
"zh-cn": "更新我\n用 autoOnOff 关闭时修补错误\nioBroker-Bot [W028] (英语)"
|
|
34
|
+
},
|
|
22
35
|
"0.2.14": {
|
|
23
36
|
"en": "eslint-config added\nDependencies updated\nUpdate License\nissue #92 Sprinkler im Gewächshaus solved\nadd Button control.autoStart",
|
|
24
37
|
"de": "eslint-config hinzugefügt\nAusgaben aktualisiert\nLizenz aktualisieren\nausgabe #92 Sprinkler im Gewächshaus gelöst\nbutton Control.autoStart",
|
|
@@ -96,19 +109,6 @@
|
|
|
96
109
|
"pl": "Procedura inicjowania błędów",
|
|
97
110
|
"uk": "Процедура ініціалізації помилок",
|
|
98
111
|
"zh-cn": "错误初始化例程"
|
|
99
|
-
},
|
|
100
|
-
"0.2.8": {
|
|
101
|
-
"en": "Adaptation for js controller 4; switched main.js to async",
|
|
102
|
-
"de": "Anpassung für js-Controller 4; main.js auf async umgestellt",
|
|
103
|
-
"ru": "Адаптация для js контроллера 4; переключил main.js на асинхронный",
|
|
104
|
-
"pt": "Adaptação para controlador js 4; mudou main.js para assíncrono",
|
|
105
|
-
"nl": "Aanpassing voor js-controller 4; main.js overgeschakeld naar async",
|
|
106
|
-
"fr": "Adaptation pour le contrôleur js 4 ; a basculé main.js en asynchrone",
|
|
107
|
-
"it": "Adattamento per js controller 4; cambiato main.js in asincrono",
|
|
108
|
-
"es": "Adaptación para controlador js 4; cambió main.js a asíncrono",
|
|
109
|
-
"pl": "Adaptacja pod kontroler js 4; przełączył main.js na asynchroniczny",
|
|
110
|
-
"uk": "Адаптація під js контролер 4; переключив main.js на асинхронний",
|
|
111
|
-
"zh-cn": "适配js控制器4;将 main.js 切换为异步"
|
|
112
112
|
}
|
|
113
113
|
},
|
|
114
114
|
"desc": {
|
package/lib/evaporation.js
CHANGED
|
@@ -194,7 +194,10 @@ function calcEvaporation (timeDifference) {
|
|
|
194
194
|
*/
|
|
195
195
|
const eTp = (( m6 * m5 + 0.65 * m7 * ( m1 - m2 )) / ( m6 + 0.65 )) - 0.5;
|
|
196
196
|
|
|
197
|
-
adapter.setState('evaporation.ETpCurrent', {
|
|
197
|
+
adapter.setState('evaporation.ETpCurrent', {
|
|
198
|
+
val: Math.round(eTp * 10000) / 10000,
|
|
199
|
+
ack: true
|
|
200
|
+
});
|
|
198
201
|
|
|
199
202
|
addEvaporation(eTp * timeDifference);
|
|
200
203
|
}
|
|
@@ -203,7 +206,10 @@ function addEvaporation (value) {
|
|
|
203
206
|
if (value < 2) { // um Fehler in der Auswertung beim Neustart zu löschen
|
|
204
207
|
ETpTodayNum += value;
|
|
205
208
|
}
|
|
206
|
-
adapter.setState('evaporation.ETpToday', {
|
|
209
|
+
adapter.setState('evaporation.ETpToday', {
|
|
210
|
+
val: Math.round(ETpTodayNum * 10000) / 10000,
|
|
211
|
+
ack: true
|
|
212
|
+
});
|
|
207
213
|
|
|
208
214
|
myConfig.applyEvaporation (value);
|
|
209
215
|
}
|
|
@@ -419,9 +425,15 @@ const evaporation = {
|
|
|
419
425
|
setNewDay () {
|
|
420
426
|
extraTerStr();
|
|
421
427
|
setTimeout(() => {
|
|
422
|
-
adapter.setState('evaporation.ETpYesterday', {
|
|
428
|
+
adapter.setState('evaporation.ETpYesterday', {
|
|
429
|
+
val: Math.round(ETpTodayNum * 10000) / 10000,
|
|
430
|
+
ack: true
|
|
431
|
+
});
|
|
423
432
|
ETpTodayNum = 0;
|
|
424
|
-
adapter.setState('evaporation.ETpToday', {
|
|
433
|
+
adapter.setState('evaporation.ETpToday', {
|
|
434
|
+
val: 0,
|
|
435
|
+
ack: true
|
|
436
|
+
});
|
|
425
437
|
}, 100);
|
|
426
438
|
},
|
|
427
439
|
/**
|
package/lib/myConfig.js
CHANGED
|
@@ -164,9 +164,9 @@ const myConfig = {
|
|
|
164
164
|
booster: res.booster,
|
|
165
165
|
endIrrigation: res.endIrrigation,
|
|
166
166
|
autoOn: true,
|
|
167
|
-
autoOnID: `${adapter.namespace
|
|
167
|
+
autoOnID: `${adapter.namespace}.sprinkle.${objectName}.autoOn`, // sprinklecontrol.0.sprinkle.Rasenumrandung.autoOnID
|
|
168
168
|
objectName: objectName, // z.B. Rasenumrandung
|
|
169
|
-
objectID: `${adapter.namespace
|
|
169
|
+
objectID: `${adapter.namespace}.sprinkle.${objectName}.runningTime`, // sprinklecontrol.0.sprinkle.Rasenumrandung.runningTime
|
|
170
170
|
idState: res.name, // "hm-rpc.0.MEQ1234567.3.STATE"
|
|
171
171
|
updateStateTimerID: null, // Timer wird gelöscht wenn Rückmeldung erfolgte
|
|
172
172
|
sprinkleID: myConfig.config.length, // Array[0...]
|
|
@@ -251,7 +251,7 @@ const myConfig = {
|
|
|
251
251
|
setSoilMoistPct100: (mySprinkleID) => {
|
|
252
252
|
myConfig.config[mySprinkleID].soilMoisture.val = myConfig.config[mySprinkleID].soilMoisture.maxIrrigation;
|
|
253
253
|
myConfig.config[mySprinkleID].soilMoisture.pct = 100;
|
|
254
|
-
adapter.setState(`sprinkle.${
|
|
254
|
+
adapter.setState(`sprinkle.${myConfig.config[mySprinkleID].objectName}.actualSoilMoisture`, {
|
|
255
255
|
val: myConfig.config[mySprinkleID].soilMoisture.pct,
|
|
256
256
|
ack: true
|
|
257
257
|
});
|
|
@@ -266,7 +266,7 @@ const myConfig = {
|
|
|
266
266
|
if (myConfig.config[mySprinkleID].methodControlSM === 'bistable') {
|
|
267
267
|
if (typeof newVal === 'boolean') {
|
|
268
268
|
myConfig.config[mySprinkleID].soilMoisture.bool = newVal;
|
|
269
|
-
adapter.setState(`sprinkle.${
|
|
269
|
+
adapter.setState(`sprinkle.${[myConfig.config[mySprinkleID].objectName]}.actualSoilMoisture`, {
|
|
270
270
|
val: myConfig.config[mySprinkleID].soilMoisture.bool,
|
|
271
271
|
ack: true
|
|
272
272
|
});
|
|
@@ -313,7 +313,7 @@ const myConfig = {
|
|
|
313
313
|
}
|
|
314
314
|
|
|
315
315
|
myConfig.config[mySprinkleID].soilMoisture.pct = Math.round(10 * trend(myConfig.config[mySprinkleID].analogZPct, myConfig.config[mySprinkleID].analogOHPct, 0, 100, myVal)) / 10;
|
|
316
|
-
adapter.setState(`sprinkle.${
|
|
316
|
+
adapter.setState(`sprinkle.${[myConfig.config[mySprinkleID].objectName]}.actualSoilMoisture`, {
|
|
317
317
|
val: myConfig.config[mySprinkleID].soilMoisture.pct,
|
|
318
318
|
ack: true
|
|
319
319
|
});
|
|
@@ -340,7 +340,7 @@ const myConfig = {
|
|
|
340
340
|
|
|
341
341
|
myConfig.config[mySprinkleID].soilMoisture.pct = Math.round(1000 * myConfig.config[mySprinkleID].soilMoisture.val
|
|
342
342
|
/ myConfig.config[mySprinkleID].soilMoisture.maxIrrigation) / 10; // Berechnung in %
|
|
343
|
-
adapter.setState(`sprinkle.${
|
|
343
|
+
adapter.setState(`sprinkle.${myConfig.config[mySprinkleID].objectName}.actualSoilMoisture`, {
|
|
344
344
|
val: myConfig.config[mySprinkleID].soilMoisture.pct,
|
|
345
345
|
ack: true
|
|
346
346
|
});
|
|
@@ -361,11 +361,10 @@ const myConfig = {
|
|
|
361
361
|
myConfig.config[mySprinkleID].startFixDay[curDay] = false;
|
|
362
362
|
nextDay = (+ curDay + 1 > 6) ? (+ curDay-6) : (+ curDay+1);
|
|
363
363
|
myConfig.config[mySprinkleID].startFixDay[nextDay] = true;
|
|
364
|
-
adapter.setStateAsync(
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
).catch((e) => adapter.log.warn(`postponeByOneDay setStateAsync: ${e}`));
|
|
364
|
+
adapter.setStateAsync(`${id}`, {
|
|
365
|
+
val: nextDay,
|
|
366
|
+
ack: true
|
|
367
|
+
}).catch((e) => adapter.log.warn(`postponeByOneDay setStateAsync: ${e}`));
|
|
369
368
|
}
|
|
370
369
|
}
|
|
371
370
|
}
|
package/lib/valveControl.js
CHANGED
|
@@ -306,8 +306,8 @@ function updateList () {
|
|
|
306
306
|
}
|
|
307
307
|
entry.count ++;
|
|
308
308
|
if ((entry.count < entry.wateringTime) // Zeit noch nicht abgelaufen?
|
|
309
|
-
&& (!entry.calcOn //
|
|
310
|
-
|| !entry.autoOn //
|
|
309
|
+
&& (!entry.calcOn // alles ausser Berechnung der Verdunstung
|
|
310
|
+
|| !entry.autoOn // Handbetrieb
|
|
311
311
|
|| (myConfig.config[entry.sprinkleID].soilMoisture.val < myConfig.config[entry.sprinkleID].soilMoisture.maxIrrigation)) // Bodenfeuchte noch nicht erreicht? (z.B. beim Regen)
|
|
312
312
|
) { /* Zeit läuft */
|
|
313
313
|
adapter.setState(`sprinkle.${entry.sprinkleName}.countdown`, {
|
|
@@ -322,7 +322,7 @@ function updateList () {
|
|
|
322
322
|
}
|
|
323
323
|
/* Intervall-Beregnung wenn angegeben (onOffTime > 0) */
|
|
324
324
|
if ((entry.onOffTime > 0) && !(entry.count % entry.onOffTime)) {
|
|
325
|
-
adapter.log.info(`Intervall-Beregnung, onOffTime: ${entry.onOffTime}, count: ${entry.count}
|
|
325
|
+
adapter.log.info(`Intervall-Beregnung, onOffTime: ${entry.onOffTime}, count: ${entry.count}`);
|
|
326
326
|
entry.enabled = false;
|
|
327
327
|
entry.myBreak = true;
|
|
328
328
|
/* Zustand des Ventils im Thread < 0 > off, < 1 > wait, < 2 > on, <<< 3 >>> break, < 4 > Boost(on), < 5 > off(Boost) */
|
|
@@ -701,11 +701,22 @@ const valveControl = {
|
|
|
701
701
|
val: `0 : ${adapter.config.maximumParallelValves}`,
|
|
702
702
|
ack: true
|
|
703
703
|
});
|
|
704
|
+
/* 24V ausschalter, wenn vorhanden */
|
|
705
|
+
if (adapter.config.triggerControlVoltage !== '') {
|
|
706
|
+
adapter.getForeignState('adapter.config.triggerControlVoltage', (err, state) => {
|
|
707
|
+
if (state && state.val === true) {
|
|
708
|
+
adapter.setForeignState(adapter.config.triggerControlVoltage, {
|
|
709
|
+
val: false,
|
|
710
|
+
ack: false
|
|
711
|
+
});
|
|
712
|
+
}
|
|
713
|
+
});
|
|
714
|
+
}
|
|
704
715
|
/* Pumpe ausschalter, wenn vorhanden */
|
|
705
716
|
if (adapter.config.triggerMainPump !== '') {
|
|
706
|
-
adapter.
|
|
707
|
-
if (state) {
|
|
708
|
-
adapter.
|
|
717
|
+
adapter.getForeignState('adapter.config.triggerMainPump', (err, state) => {
|
|
718
|
+
if (state && state.val === true) {
|
|
719
|
+
adapter.setForeignState(adapter.config.triggerMainPump, {
|
|
709
720
|
val: false,
|
|
710
721
|
ack: false
|
|
711
722
|
});
|
|
@@ -714,9 +725,9 @@ const valveControl = {
|
|
|
714
725
|
}
|
|
715
726
|
/* Pumpe (Zisterne) ausschalter, wenn vorhanden */
|
|
716
727
|
if (adapter.config.triggerCisternPump !== '') {
|
|
717
|
-
adapter.
|
|
718
|
-
if (state) {
|
|
719
|
-
adapter.
|
|
728
|
+
adapter.getForeignState('adapter.config.triggerCisternPump', (err, state) => {
|
|
729
|
+
if (state && state.val === true) {
|
|
730
|
+
adapter.setForeignState(adapter.config.triggerCisternPump, {
|
|
720
731
|
val: false,
|
|
721
732
|
ack: false
|
|
722
733
|
});
|
|
@@ -727,9 +738,9 @@ const valveControl = {
|
|
|
727
738
|
const result = adapter.config.events;
|
|
728
739
|
if (result) {
|
|
729
740
|
for (const res of result) {
|
|
730
|
-
adapter.
|
|
731
|
-
if (state) {
|
|
732
|
-
adapter.
|
|
741
|
+
adapter.getForeignState(res.name, (err, state) => {
|
|
742
|
+
if (state && state.val === true) {
|
|
743
|
+
adapter.setForeignState(res.name, {
|
|
733
744
|
val: false,
|
|
734
745
|
ack: false
|
|
735
746
|
});
|
|
@@ -849,6 +860,8 @@ const valveControl = {
|
|
|
849
860
|
setVoltageOnOff(false);
|
|
850
861
|
setPumpOnOff(false);
|
|
851
862
|
if (boostListTimer) {
|
|
863
|
+
boostReady = true;
|
|
864
|
+
boostOn = false;
|
|
852
865
|
clearTimeout(boostListTimer);
|
|
853
866
|
}
|
|
854
867
|
// let bValveFound = false; // Ventil gefunden
|
|
@@ -860,7 +873,7 @@ const valveControl = {
|
|
|
860
873
|
adapter.log.info(`Set Valve (SprinkleControl: off) ID: ${entry.sprinkleName}, value: false`);
|
|
861
874
|
adapter.setForeignState(entry.idState, {
|
|
862
875
|
val: false,
|
|
863
|
-
ack:
|
|
876
|
+
ack: false
|
|
864
877
|
});
|
|
865
878
|
}
|
|
866
879
|
/* Zustand des Ventils im Thread <<< 0 >>> off, < 1 > wait, < 2 > on, < 3 > break, < 4 > Boost(on), < 5 > off(Boost) */
|
package/main.js
CHANGED
|
@@ -132,7 +132,7 @@ function startAdapter(options) {
|
|
|
132
132
|
// Signale zum bestätigen (ack = true) - signals for confirmation
|
|
133
133
|
if (state?.ack === false) {
|
|
134
134
|
// wenn (Holiday == true) ist, soll das Wochenendprogramm gefahren werden.
|
|
135
|
-
if (id === `${adapter.namespace
|
|
135
|
+
if (id === `${adapter.namespace}.control.Holiday`) {
|
|
136
136
|
// @ts-ignore
|
|
137
137
|
holidayStr = state.val;
|
|
138
138
|
adapter.setState(id, {
|
|
@@ -150,7 +150,7 @@ function startAdapter(options) {
|
|
|
150
150
|
});
|
|
151
151
|
}
|
|
152
152
|
// wenn (autoOnOff == false) so werden alle Sprenger nicht mehr automatisch gestartet.
|
|
153
|
-
if ((id === `${adapter.namespace
|
|
153
|
+
if ((id === `${adapter.namespace}.control.autoOnOff`)) {
|
|
154
154
|
autoOnOffStr = state.val;
|
|
155
155
|
adapter.log.info(`startAdapter: control.autoOnOff: ${state.val}`);
|
|
156
156
|
adapter.setState(id, {
|
|
@@ -423,7 +423,10 @@ function checkStates() {
|
|
|
423
423
|
*/
|
|
424
424
|
adapter.getState('control.Holiday', (err, state) => {
|
|
425
425
|
if (state && (state.val == null)) {
|
|
426
|
-
adapter.setState('control.Holiday', {
|
|
426
|
+
adapter.setState('control.Holiday', {
|
|
427
|
+
val: false,
|
|
428
|
+
ack: true
|
|
429
|
+
});
|
|
427
430
|
}
|
|
428
431
|
});
|
|
429
432
|
/**
|
|
@@ -532,10 +535,10 @@ async function checkActualStates () {
|
|
|
532
535
|
weatherForecastTodayNum = 0;
|
|
533
536
|
adapter.log.info(`checkActualStates => Wettervorhersage state.val ( ${_weatherForInstanceToday.val}); ${typeof _weatherForInstanceToday.val} kann nicht als Number verarbeitet werden`);
|
|
534
537
|
}
|
|
535
|
-
await adapter.setStateAsync('info.rainToday',
|
|
536
|
-
weatherForecastTodayNum,
|
|
537
|
-
true
|
|
538
|
-
);
|
|
538
|
+
await adapter.setStateAsync('info.rainToday', {
|
|
539
|
+
val: weatherForecastTodayNum,
|
|
540
|
+
ack: true
|
|
541
|
+
});
|
|
539
542
|
}
|
|
540
543
|
|
|
541
544
|
/**
|
|
@@ -547,11 +550,10 @@ async function checkActualStates () {
|
|
|
547
550
|
).catch((e) => adapter.log.warn(e));
|
|
548
551
|
if (_weatherForInstance && _weatherForInstance.val) {
|
|
549
552
|
weatherForecastTomorrowNum = _weatherForInstance.val;
|
|
550
|
-
await adapter.setStateAsync(
|
|
551
|
-
|
|
552
|
-
|
|
553
|
-
|
|
554
|
-
);
|
|
553
|
+
await adapter.setStateAsync('info.rainTomorrow', {
|
|
554
|
+
val: weatherForecastTomorrowNum,
|
|
555
|
+
ack: true
|
|
556
|
+
});
|
|
555
557
|
}
|
|
556
558
|
}
|
|
557
559
|
|
|
@@ -570,13 +572,35 @@ async function checkActualStates () {
|
|
|
570
572
|
*/
|
|
571
573
|
const _autoOn = await adapter.getForeignStateAsync(
|
|
572
574
|
res.autoOnID
|
|
573
|
-
)
|
|
575
|
+
);
|
|
574
576
|
if (_autoOn && typeof _autoOn.val === 'boolean') {
|
|
575
577
|
res.autoOn = _autoOn.val;
|
|
576
578
|
if (_autoOn.val === false) {
|
|
577
579
|
adapter.log.info(`get ${res.objectName}.autoOn = ${res.autoOn}`);
|
|
578
580
|
}
|
|
579
581
|
}
|
|
582
|
+
|
|
583
|
+
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ //
|
|
584
|
+
// +++++ Zustände der States aktualisieren +++++ //
|
|
585
|
+
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ //
|
|
586
|
+
|
|
587
|
+
// .countdown beim Start auf '0' setzen
|
|
588
|
+
adapter.setStateAsync(`sprinkle.${res.objectName}.countdown`,{
|
|
589
|
+
val:'0',
|
|
590
|
+
ack:true
|
|
591
|
+
});
|
|
592
|
+
|
|
593
|
+
// .runningTime beim Start auf '00:00' setzen
|
|
594
|
+
adapter.setStateAsync(`sprinkle.${res.objectName}.runningTime`,{
|
|
595
|
+
val:'00:00',
|
|
596
|
+
ack:true
|
|
597
|
+
});
|
|
598
|
+
|
|
599
|
+
// .countdown beim Start auf '0' für (off) setzen
|
|
600
|
+
adapter.setStateAsync(`sprinkle.${res.objectName}.sprinklerState`,{
|
|
601
|
+
val:0,
|
|
602
|
+
ack:true
|
|
603
|
+
});
|
|
580
604
|
}
|
|
581
605
|
}
|
|
582
606
|
|
|
@@ -629,14 +653,26 @@ const calcPos = schedule.scheduleJob('calcPosTimer', '5 0 * * *', function() {
|
|
|
629
653
|
const objectName = result[i].objectName;
|
|
630
654
|
adapter.getState(`sprinkle.${objectName}.history.curCalWeekConsumed`, (err, state) => {
|
|
631
655
|
if (state) {
|
|
632
|
-
adapter.setState(`sprinkle.${objectName}.history.lastCalWeekConsumed`, {
|
|
633
|
-
|
|
656
|
+
adapter.setState(`sprinkle.${objectName}.history.lastCalWeekConsumed`, {
|
|
657
|
+
val: state.val,
|
|
658
|
+
ack: true
|
|
659
|
+
});
|
|
660
|
+
adapter.setState(`sprinkle.${objectName}.history.curCalWeekConsumed`, {
|
|
661
|
+
val: 0,
|
|
662
|
+
ack: true
|
|
663
|
+
});
|
|
634
664
|
}
|
|
635
665
|
});
|
|
636
666
|
adapter.getState(`sprinkle.${objectName}.history.curCalWeekRunningTime`, (err, state) => {
|
|
637
667
|
if (state) {
|
|
638
|
-
adapter.setState(`sprinkle.${objectName}.history.lastCalWeekRunningTime`, {
|
|
639
|
-
|
|
668
|
+
adapter.setState(`sprinkle.${objectName}.history.lastCalWeekRunningTime`, {
|
|
669
|
+
val: state.val,
|
|
670
|
+
ack: true
|
|
671
|
+
});
|
|
672
|
+
adapter.setState(`sprinkle.${objectName}.history.curCalWeekRunningTime`, {
|
|
673
|
+
val: '00:00',
|
|
674
|
+
ack: true
|
|
675
|
+
});
|
|
640
676
|
}
|
|
641
677
|
});
|
|
642
678
|
}
|
|
@@ -718,11 +754,11 @@ function addStartTimeSprinkle() {
|
|
|
718
754
|
case 'bistable': {
|
|
719
755
|
if (res.soilMoisture.bool) {
|
|
720
756
|
messageText += `<b>${res.objectName}</b> (${res.soilMoisture.bool})\n`
|
|
721
|
-
+ ` START => ${addTime(res.addWateringTime, '')}\n`;
|
|
757
|
+
+ ` START => ${addTime(Math.round(60 * res.addWateringTime), '')}\n`;
|
|
722
758
|
memAddList.push({
|
|
723
759
|
auto: true,
|
|
724
760
|
sprinkleID: res.sprinkleID,
|
|
725
|
-
wateringTime: res.addWateringTime
|
|
761
|
+
wateringTime: Math.round(60 * res.addWateringTime)
|
|
726
762
|
});
|
|
727
763
|
}
|
|
728
764
|
break;
|
|
@@ -1747,41 +1783,6 @@ async function createSprinklers() {
|
|
|
1747
1783
|
adapter.log.info(`sprinkleControl [sprinkle.${objectName}] was created`);
|
|
1748
1784
|
}
|
|
1749
1785
|
|
|
1750
|
-
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ //
|
|
1751
|
-
// +++++ zustände der States aktualisieren +++++ //
|
|
1752
|
-
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ //
|
|
1753
|
-
|
|
1754
|
-
//
|
|
1755
|
-
if(await _countdownNotExist){
|
|
1756
|
-
const _countdown = await adapter.getStateAsync(`${objPfad}.countdown`).catch((e) => adapter.log.warn(`${objectName}.countdown ${e}`));
|
|
1757
|
-
if (_countdown && _countdown.val !== '0') {
|
|
1758
|
-
adapter.setStateAsync(
|
|
1759
|
-
`${objPfad}.countdown`,
|
|
1760
|
-
'0',
|
|
1761
|
-
true
|
|
1762
|
-
).catch((e) => adapter.log.warn(e));
|
|
1763
|
-
}
|
|
1764
|
-
}
|
|
1765
|
-
//
|
|
1766
|
-
if (_runningTimeNotExist) {
|
|
1767
|
-
const _runningTime = await adapter.getStateAsync(`${objPfad}.runningTime`).catch((e) => adapter.log.warn(`${objectName}.runningTime ${e}`));
|
|
1768
|
-
if (_runningTime && _runningTime.val !== '00:00') {
|
|
1769
|
-
adapter.setStateAsync(`${objPfad}.runningTime`,
|
|
1770
|
-
'00:00',
|
|
1771
|
-
true
|
|
1772
|
-
).catch((e) => adapter.log.warn(e));
|
|
1773
|
-
}
|
|
1774
|
-
}
|
|
1775
|
-
//
|
|
1776
|
-
if (_sprinklerStateNotExists){
|
|
1777
|
-
const _sprinklerState = await adapter.getStateAsync(`${objPfad}.sprinklerState`).catch((e) => adapter.log.warn(`${objectName}.sprinklerState ${e}`));
|
|
1778
|
-
if (_sprinklerState && _sprinklerState.val !== 0) {
|
|
1779
|
-
await adapter.setStateAsync(`${objPfad}.sprinklerState`,
|
|
1780
|
-
0,
|
|
1781
|
-
true
|
|
1782
|
-
).catch((e) => adapter.log.warn(`${objectName}.sprinklerState ${e}`));
|
|
1783
|
-
}
|
|
1784
|
-
}
|
|
1785
1786
|
// Festlegen des Schaltpunktes für den nächsten Start
|
|
1786
1787
|
switch (myConfig.config[j].methodControlSM) {
|
|
1787
1788
|
case 'bistable': {
|
|
@@ -1794,10 +1795,10 @@ async function createSprinklers() {
|
|
|
1794
1795
|
adapter.log.warn(`The bistable sensor ${myConfig.config[j].triggerSM} in ${objectName} does not deliver correct values!`);
|
|
1795
1796
|
}
|
|
1796
1797
|
|
|
1797
|
-
adapter.setStateAsync(`${objPfad}.triggerPoint`,
|
|
1798
|
-
'-',
|
|
1799
|
-
true
|
|
1800
|
-
).catch((e) => adapter.log.warn(`${objectName}.triggerPoint ${e}`));
|
|
1798
|
+
adapter.setStateAsync(`${objPfad}.triggerPoint`, {
|
|
1799
|
+
val: '-',
|
|
1800
|
+
ack: true
|
|
1801
|
+
}).catch((e) => adapter.log.warn(`${objectName}.triggerPoint ${e}`));
|
|
1801
1802
|
break;
|
|
1802
1803
|
}
|
|
1803
1804
|
|
|
@@ -1807,16 +1808,16 @@ async function createSprinklers() {
|
|
|
1807
1808
|
if (_triggerSMAnalog && (typeof _triggerSMAnalog.val === 'number' || typeof _triggerSMAnalog.val === 'string')) {
|
|
1808
1809
|
myConfig.setSoilMoistPct(myConfig.config[j].sprinkleID, _triggerSMAnalog.val);
|
|
1809
1810
|
} else {
|
|
1810
|
-
await adapter.setStateAsync(`${objPfad}.actualSoilMoisture`,
|
|
1811
|
-
50,
|
|
1812
|
-
true
|
|
1813
|
-
);
|
|
1811
|
+
await adapter.setStateAsync(`${objPfad}.actualSoilMoisture`, {
|
|
1812
|
+
val: 50,
|
|
1813
|
+
ack: true
|
|
1814
|
+
});
|
|
1814
1815
|
adapter.log.warn(`The analoge sensor ${myConfig.config[j].triggerSM} in ${objectName} does not deliver correct values!`);
|
|
1815
1816
|
}
|
|
1816
|
-
adapter.setStateAsync(`${objPfad}.triggerPoint`,
|
|
1817
|
-
(myConfig.config[j].soilMoisture.pctTriggerIrrigation).toString(),
|
|
1818
|
-
true
|
|
1819
|
-
).catch((e) => adapter.log.warn(`${objectName}.triggerPoint setState ${e}`));
|
|
1817
|
+
adapter.setStateAsync(`${objPfad}.triggerPoint`, {
|
|
1818
|
+
val: (myConfig.config[j].soilMoisture.pctTriggerIrrigation).toString(),
|
|
1819
|
+
ack: true
|
|
1820
|
+
}).catch((e) => adapter.log.warn(`${objectName}.triggerPoint setState ${e}`));
|
|
1820
1821
|
break;
|
|
1821
1822
|
}
|
|
1822
1823
|
|
|
@@ -1861,10 +1862,10 @@ async function createSprinklers() {
|
|
|
1861
1862
|
curNextFixDay(myConfig.config[j].sprinkleID, false);
|
|
1862
1863
|
}
|
|
1863
1864
|
|
|
1864
|
-
adapter.setStateAsync(`${objPfad}.triggerPoint`,
|
|
1865
|
-
'-',
|
|
1866
|
-
true
|
|
1867
|
-
).catch((e) => adapter.log.warn(`${objectName}.triggerPoint fixDay setState ${e}`));
|
|
1865
|
+
adapter.setStateAsync(`${objPfad}.triggerPoint`, {
|
|
1866
|
+
val: '-',
|
|
1867
|
+
ack: true
|
|
1868
|
+
}).catch((e) => adapter.log.warn(`${objectName}.triggerPoint fixDay setState ${e}`));
|
|
1868
1869
|
break;
|
|
1869
1870
|
}
|
|
1870
1871
|
|
|
@@ -1872,10 +1873,10 @@ async function createSprinklers() {
|
|
|
1872
1873
|
const _actualSoilMoisture = await adapter.getStateAsync(`${objPfad}.actualSoilMoisture`).catch((e) => adapter.log.warn(e));
|
|
1873
1874
|
if (_actualSoilMoisture) {
|
|
1874
1875
|
if (await _actualSoilMoisture && typeof _actualSoilMoisture.val !== 'number' || _actualSoilMoisture.val === 0) {
|
|
1875
|
-
adapter.setStateAsync(`${objPfad}.actualSoilMoisture`,
|
|
1876
|
-
myConfig.config[j].soilMoisture.pct,
|
|
1877
|
-
true
|
|
1878
|
-
).catch((e) => adapter.log.warn(e));
|
|
1876
|
+
adapter.setStateAsync(`${objPfad}.actualSoilMoisture`, {
|
|
1877
|
+
val: myConfig.config[j].soilMoisture.pct,
|
|
1878
|
+
ack: true
|
|
1879
|
+
}).catch((e) => adapter.log.warn(e));
|
|
1879
1880
|
} else {
|
|
1880
1881
|
// num Wert der Bodenfeuchte berechnen und in der config speichern, wenn Wert zwischen 0 und max liegt
|
|
1881
1882
|
if ((0 < _actualSoilMoisture.val) && (_actualSoilMoisture.val <= (myConfig.config[j]).soilMoisture.maxRain*100/myConfig.config[j].soilMoisture.maxIrrigation)) {
|
|
@@ -1883,18 +1884,18 @@ async function createSprinklers() {
|
|
|
1883
1884
|
myConfig.config[j].soilMoisture.pct = _actualSoilMoisture.val;
|
|
1884
1885
|
} else {
|
|
1885
1886
|
// Wert aus config übernehmen
|
|
1886
|
-
adapter.setStateAsync(`${objPfad}.actualSoilMoisture`,
|
|
1887
|
-
myConfig.config[j].soilMoisture.pct,
|
|
1888
|
-
true
|
|
1889
|
-
).catch((e) => adapter.log.warn(e));
|
|
1887
|
+
adapter.setStateAsync(`${objPfad}.actualSoilMoisture`, {
|
|
1888
|
+
val: myConfig.config[j].soilMoisture.pct,
|
|
1889
|
+
ack: true
|
|
1890
|
+
}).catch((e) => adapter.log.warn(e));
|
|
1890
1891
|
}
|
|
1891
1892
|
}
|
|
1892
1893
|
}
|
|
1893
1894
|
|
|
1894
|
-
adapter.setStateAsync(`${objPfad}.triggerPoint`,
|
|
1895
|
-
(myConfig.config[j].soilMoisture.pctTriggerIrrigation).toString(),
|
|
1896
|
-
true
|
|
1897
|
-
).catch((e) => adapter.log.warn(e));
|
|
1895
|
+
adapter.setStateAsync(`${objPfad}.triggerPoint`, {
|
|
1896
|
+
val: (myConfig.config[j].soilMoisture.pctTriggerIrrigation).toString(),
|
|
1897
|
+
ack: true
|
|
1898
|
+
}).catch((e) => adapter.log.warn(e));
|
|
1898
1899
|
break;
|
|
1899
1900
|
}
|
|
1900
1901
|
}
|
|
@@ -2025,7 +2026,10 @@ function main(adapter) {
|
|
|
2025
2026
|
if (adapter.config.actualValueLevel !== '') {
|
|
2026
2027
|
adapter.subscribeForeignStates(adapter.config.actualValueLevel);
|
|
2027
2028
|
} else {
|
|
2028
|
-
adapter.setState('info.cisternState', {
|
|
2029
|
+
adapter.setState('info.cisternState', {
|
|
2030
|
+
val: 'The level sensor of the water cistern is not specified',
|
|
2031
|
+
ack: true
|
|
2032
|
+
});
|
|
2029
2033
|
}
|
|
2030
2034
|
}
|
|
2031
2035
|
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "iobroker.sprinklecontrol",
|
|
3
|
-
"version": "0.2.
|
|
3
|
+
"version": "0.2.15",
|
|
4
4
|
"description": "Control of several sprinklers depending on weather conditions and pump performance.",
|
|
5
5
|
"author": {
|
|
6
6
|
"name": "Dirk Peter",
|
|
@@ -26,7 +26,7 @@
|
|
|
26
26
|
"url": "https://github.com/Dirk-Peter-md/ioBroker.sprinklecontrol"
|
|
27
27
|
},
|
|
28
28
|
"engines": {
|
|
29
|
-
"node": ">=
|
|
29
|
+
"node": ">= 20"
|
|
30
30
|
},
|
|
31
31
|
"dependencies": {
|
|
32
32
|
"@iobroker/adapter-core": "^3.2.3",
|
|
@@ -39,12 +39,12 @@
|
|
|
39
39
|
"@alcalzone/release-script-plugin-license": "^3.7.0",
|
|
40
40
|
"@alcalzone/release-script-plugin-manual-review": "^3.7.0",
|
|
41
41
|
"@iobroker/adapter-dev": "^1.4.0",
|
|
42
|
-
"@iobroker/eslint-config": "^2.0.
|
|
43
|
-
"@iobroker/testing": "^5.0.
|
|
42
|
+
"@iobroker/eslint-config": "^2.0.2",
|
|
43
|
+
"@iobroker/testing": "^5.0.4",
|
|
44
44
|
"chai": "^5.2.0",
|
|
45
45
|
"chai-as-promised": "^8.0.1",
|
|
46
|
-
"mocha": "^11.
|
|
47
|
-
"sinon": "^
|
|
46
|
+
"mocha": "^11.5.0",
|
|
47
|
+
"sinon": "^20.0.0",
|
|
48
48
|
"sinon-chai": "^4.0.0"
|
|
49
49
|
},
|
|
50
50
|
"main": "main.js",
|