iobroker.sprinklecontrol 1.0.6 → 1.0.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/README.md +16 -9
- package/admin/i18n/{de/translations.json → de.json} +13 -1
- package/admin/i18n/{en/translations.json → en.json} +13 -1
- package/admin/i18n/{es/translations.json → es.json} +12 -0
- package/admin/i18n/{fr/translations.json → fr.json} +12 -0
- package/admin/i18n/{it/translations.json → it.json} +12 -0
- package/admin/i18n/{nl/translations.json → nl.json} +12 -0
- package/admin/i18n/{pl/translations.json → pl.json} +12 -0
- package/admin/i18n/{pt/translations.json → pt.json} +12 -0
- package/admin/i18n/{ru/translations.json → ru.json} +12 -0
- package/admin/i18n/{uk/translations.json → uk.json} +12 -0
- package/admin/i18n/{zh-cn/translations.json → zh-cn.json} +12 -0
- package/admin/index_m.html +77 -14
- package/admin/index_m.js +11 -7
- package/admin/words.js +14 -2
- package/io-package.json +45 -44
- package/lib/evaporation.js +5 -5
- package/lib/myConfig.js +3 -1
- package/lib/sendMessageText.js +1 -1
- package/lib/tools.js +9 -2
- package/lib/valveControl.js +268 -28
- package/main.js +93 -24
- package/package.json +6 -4
package/lib/valveControl.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
|
|
2
2
|
'use strict';
|
|
3
3
|
|
|
4
|
-
const asyncTime = require('timers/promises');
|
|
4
|
+
const asyncTime = require('node:timers/promises');
|
|
5
5
|
// import {setTimeout} from 'timers/promises';
|
|
6
6
|
|
|
7
7
|
const myConfig = require('./myConfig.js');
|
|
@@ -23,7 +23,19 @@ const threadList = [];
|
|
|
23
23
|
* Ventil mit dem größten Durchfluss (pipeFlow) für die Steuerung des Druckentlastungsventils
|
|
24
24
|
* - wird in der Funktion updateList() ermittelt
|
|
25
25
|
*/
|
|
26
|
-
const pressureReliefValve = {
|
|
26
|
+
const pressureReliefValve = {
|
|
27
|
+
enable: false,
|
|
28
|
+
name: '',
|
|
29
|
+
wateringTime: 10,
|
|
30
|
+
ac: {},
|
|
31
|
+
controller: {},
|
|
32
|
+
control: {
|
|
33
|
+
idState: undefined,
|
|
34
|
+
idON_TIME: undefined,
|
|
35
|
+
idACK: undefined,
|
|
36
|
+
maker: undefined
|
|
37
|
+
}
|
|
38
|
+
};
|
|
27
39
|
|
|
28
40
|
/**
|
|
29
41
|
* - bereit zum Boost (true: kein Boostventil aktive; false: BoostVentil aktive)
|
|
@@ -43,14 +55,21 @@ let boostReady = true,
|
|
|
43
55
|
fillLevelCistern = 0,
|
|
44
56
|
/**
|
|
45
57
|
* Zeitliche Bewässerungseinschränkung EIN/AUS
|
|
58
|
+
* z.B. Behördenvorgabe, Sommerhitze + Trockenheit, usw.
|
|
46
59
|
*/
|
|
47
60
|
timeBasedRestrictionEn = false;
|
|
48
61
|
|
|
49
|
-
const updateListMarker = {
|
|
62
|
+
const updateListMarker = {
|
|
63
|
+
funcActive: false,
|
|
64
|
+
newStart: false,
|
|
65
|
+
switchingDistance: 5000,
|
|
66
|
+
cancelSwitchingDistance: {}
|
|
67
|
+
};
|
|
50
68
|
|
|
51
69
|
/**
|
|
52
70
|
* aktive Pumpendaten
|
|
53
71
|
* - enable: Pumpe ein/ausgeschaltet
|
|
72
|
+
* - pumpSwitching: Umschaltung aktive, während der Umschaltung von Zysterne auf Hauptpumpe bei aktiver Pumpe
|
|
54
73
|
* - name: Bezeichnung der Pumpe
|
|
55
74
|
* - idState: Objektname des State
|
|
56
75
|
* - id: ID des States unter Objecte im ioBroker info.cisternPump || info.mainPump
|
|
@@ -64,9 +83,40 @@ const updateListMarker = {funcActive: false, newStart: false, switchingDistance:
|
|
|
64
83
|
* - ac: AbortController
|
|
65
84
|
*/
|
|
66
85
|
|
|
67
|
-
const currentPumpUse = {
|
|
68
|
-
|
|
69
|
-
|
|
86
|
+
const currentPumpUse = {
|
|
87
|
+
enable: false,
|
|
88
|
+
pumpSwitching: false,
|
|
89
|
+
pumpReplacement: false,
|
|
90
|
+
name: '',
|
|
91
|
+
wateringTime: 0,
|
|
92
|
+
id: '',
|
|
93
|
+
pumpCistern: false,
|
|
94
|
+
intBreak: false,
|
|
95
|
+
leadTime: 0,
|
|
96
|
+
cancelLeadTime: {},
|
|
97
|
+
pumpPower: 0,
|
|
98
|
+
restFlow: 0,
|
|
99
|
+
ac: {},
|
|
100
|
+
controller: {},
|
|
101
|
+
control: {
|
|
102
|
+
idState: undefined,
|
|
103
|
+
idON_TIME: undefined,
|
|
104
|
+
idACK: undefined,
|
|
105
|
+
maker: undefined
|
|
106
|
+
}
|
|
107
|
+
};
|
|
108
|
+
let mainPumpControl = {
|
|
109
|
+
idState: undefined,
|
|
110
|
+
idON_TIME: undefined,
|
|
111
|
+
idACK: undefined,
|
|
112
|
+
maker: undefined
|
|
113
|
+
};
|
|
114
|
+
let cisternPumpControl = {
|
|
115
|
+
idState: undefined,
|
|
116
|
+
idON_TIME: undefined,
|
|
117
|
+
idACK: undefined,
|
|
118
|
+
maker: undefined
|
|
119
|
+
};
|
|
70
120
|
|
|
71
121
|
/**
|
|
72
122
|
* Steuerspannung 24V
|
|
@@ -75,7 +125,55 @@ let cisternPumpControl = {idState: undefined, idON_TIME: undefined, idACK: undef
|
|
|
75
125
|
* - idState: Aktorerkennung "hm-rpc.0.MEQ1810129.1.STATE"
|
|
76
126
|
* - controller: controlle von Zeiten und Abbruchsignalen
|
|
77
127
|
*/
|
|
78
|
-
const controlVoltage = {
|
|
128
|
+
const controlVoltage = {
|
|
129
|
+
enable: false,
|
|
130
|
+
name: '24V',
|
|
131
|
+
wateringTime: 0,
|
|
132
|
+
ac: {},
|
|
133
|
+
controller: {},
|
|
134
|
+
control: {
|
|
135
|
+
idState: undefined,
|
|
136
|
+
idON_TIME: undefined,
|
|
137
|
+
idACK: undefined,
|
|
138
|
+
maker: undefined
|
|
139
|
+
}
|
|
140
|
+
};
|
|
141
|
+
/**
|
|
142
|
+
* Sensor Druck
|
|
143
|
+
* - enable: Sensor vorhanden
|
|
144
|
+
* - active: true = Sensor aktiv, false = Sensor inaktiv
|
|
145
|
+
* - setActive(true/false): Funktion zum setzen des Sensorstatus aktiv/inaktiv
|
|
146
|
+
* - inadequatePressure: true = Nicht ausreichender Druck, false = ausreichender Druck
|
|
147
|
+
* - name: Bezeichnung Sensor Druck
|
|
148
|
+
* - value: aktueller Wert des Sensors
|
|
149
|
+
* - state: aktueller Zustand des Sensors
|
|
150
|
+
* - ac: AbortController für die Überwachung der Sensoraktivität
|
|
151
|
+
*/
|
|
152
|
+
const sensorPressure = {
|
|
153
|
+
enable: false,
|
|
154
|
+
active: false,
|
|
155
|
+
setActive: async(val) => {
|
|
156
|
+
try {
|
|
157
|
+
sensorPressure.active = val;
|
|
158
|
+
if (val === true && sensorPressure.enable) {
|
|
159
|
+
await valveControl.setSensorPressure(sensorPressure.value);
|
|
160
|
+
} else {
|
|
161
|
+
if (sensorPressure?.ac !== null) {
|
|
162
|
+
await sensorPressure.ac.abort(); // AbortController zurücksetzen
|
|
163
|
+
sensorPressure.ac = null;
|
|
164
|
+
sensorPressure.inadequatePressure = false; // Drucksensor deaktiviert -> Druckverhältnisse wieder in Ordnung
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
} catch (error) {
|
|
168
|
+
adapter.log.error(`Error setting sensor pressure active ${val}: ${error}`);
|
|
169
|
+
}
|
|
170
|
+
},
|
|
171
|
+
inadequatePressure: false,
|
|
172
|
+
name: 'Sensor Pressure',
|
|
173
|
+
value: 0,
|
|
174
|
+
state: 0,
|
|
175
|
+
ac: null
|
|
176
|
+
};
|
|
79
177
|
|
|
80
178
|
/**
|
|
81
179
|
* Schaltabstand in ms
|
|
@@ -154,7 +252,7 @@ const setValve = async (thread, val) => {
|
|
|
154
252
|
|
|
155
253
|
//adapter.log.info(`Set Valve (async () => {...}`);
|
|
156
254
|
try {
|
|
157
|
-
// Ventil
|
|
255
|
+
// ON_Time setzen wenn angegeben, damit das Ventil nach der angegebenen Zeit automatisch ausgeschaltet wird (z.B. wenn der Ausschaltbefehl nicht ausgeführt werden kann, z.B Funkstörung)
|
|
158
256
|
if (thread.control.idON_TIME !== null) {
|
|
159
257
|
await adapter.setForeignStateAsync(thread.control.idON_TIME, {
|
|
160
258
|
val: val ? Math.ceil(thread.wateringTime + 5) : 0,
|
|
@@ -162,7 +260,7 @@ const setValve = async (thread, val) => {
|
|
|
162
260
|
});
|
|
163
261
|
await asyncTime.setTimeout(200, undefined, undefined);
|
|
164
262
|
}
|
|
165
|
-
|
|
263
|
+
// Ventil ansteuern
|
|
166
264
|
const _setValve = await adapter.setForeignStateAsync(thread.control.idState, {
|
|
167
265
|
val: val,
|
|
168
266
|
ack: false
|
|
@@ -263,31 +361,36 @@ const delList = async (killList) => {
|
|
|
263
361
|
|
|
264
362
|
/**
|
|
265
363
|
* currentConsumption aktueller Verbrauch ermitteln
|
|
364
|
+
* - curFlow: aktuelle Restfördertleistung der Pumpe
|
|
365
|
+
* - parallel: aktuelle Anzahl der eingeschalteten Ventile
|
|
366
|
+
* - pumpRequired: Pumpe erforderlich (true/false)
|
|
266
367
|
*
|
|
267
368
|
* @param {boolean} write
|
|
268
369
|
* @returns {Promise<{curFlow:number, parallel:number, pumpRequired:boolean}>}
|
|
269
370
|
*/
|
|
270
371
|
const currentConsumption = async (write) => {
|
|
271
372
|
try {
|
|
272
|
-
let curFlow = currentPumpUse.intBreak ? 0 : currentPumpUse.pumpPower, /* adapter.config.triggerMainPumpPower; */
|
|
373
|
+
let curFlow = (currentPumpUse.intBreak || sensorPressure.inadequatePressure) ? 0 : currentPumpUse.pumpPower, /* adapter.config.triggerMainPumpPower; */
|
|
273
374
|
/** aktuelle Anzahl der eingeschalteten Ventile */
|
|
274
375
|
parallel = 0,
|
|
275
376
|
pumpRequired = false;
|
|
276
377
|
adapter.log.debug(`currentConsumption curFlow: ${curFlow}, ${currentPumpUse.intBreak} => ${currentPumpUse.intBreak ? 0 : currentPumpUse.pumpPower}`);
|
|
277
|
-
if (!currentPumpUse.intBreak
|
|
378
|
+
//if (!currentPumpUse.intBreak
|
|
379
|
+
// && !sensorPressure.inadequatePressure
|
|
380
|
+
//) {
|
|
278
381
|
// ermitteln von curPipe und der Anzahl der parallelen Stränge
|
|
279
382
|
for (const entry of threadList){
|
|
280
383
|
if (entry.state === 'wait') pumpRequired = true; // state => wait
|
|
281
|
-
if (entry.enable === true
|
|
282
|
-
&& entry.extBreak === false
|
|
283
|
-
&& timeBasedRestrictionEn === false
|
|
384
|
+
if (entry.enable === true // Ventil eingeschaltet
|
|
385
|
+
&& entry.extBreak === false // && nicht in der externen Pause (extBreak)
|
|
386
|
+
&& timeBasedRestrictionEn === false // && nicht in der zeitlichen Bewässerungspause
|
|
284
387
|
) {
|
|
285
388
|
curFlow -= entry.pipeFlow; // // ermitteln der RestFörderkapazität
|
|
286
389
|
parallel ++; // Anzahl der Bewässerungsstellen um 1 erhöhen
|
|
287
390
|
pumpRequired = true;
|
|
288
391
|
}
|
|
289
392
|
}
|
|
290
|
-
}
|
|
393
|
+
//}
|
|
291
394
|
// bei write schreiben der aktuellen Förderleistung der Pumpe und der Anzahl der parallelen Stränge
|
|
292
395
|
if (write || currentPumpUse.intBreak) {
|
|
293
396
|
adapter.setStateAsync('control.parallelOfMax', {
|
|
@@ -456,7 +559,7 @@ const countSprinkleTime = async (entry) => {
|
|
|
456
559
|
/**
|
|
457
560
|
* Timer zum ausschalten des Boost
|
|
458
561
|
*
|
|
459
|
-
* @param {
|
|
562
|
+
* @param {object} entry
|
|
460
563
|
*/
|
|
461
564
|
const boostOnTimer = async (entry) => {
|
|
462
565
|
entry.ac.acBoostOnTimer = new AbortController;
|
|
@@ -538,7 +641,7 @@ const updateList = async () => {
|
|
|
538
641
|
: false;
|
|
539
642
|
|
|
540
643
|
/**
|
|
541
|
-
*
|
|
644
|
+
* Find das Ventil mit dem größten Durchfluss (pipeFlow) für die Steuerung des Druckentlastungsventils
|
|
542
645
|
* - Wenn die Bewässerung beendet wird, soll der Druck in den Leitungen durch kurzes Öffnen eines Druckentlastungsventils abgebaut werden,
|
|
543
646
|
* um die Lebensdauer des Systems zu erhöhen. Hierzu wird das Ventil mit dem Größten Durchfluss (pipeFlow) für 10 Sekunden angesteuert.
|
|
544
647
|
*/
|
|
@@ -574,7 +677,7 @@ const updateList = async () => {
|
|
|
574
677
|
try {
|
|
575
678
|
if (adapter.config.triggerControlVoltage
|
|
576
679
|
&& controlVoltage.enable === false
|
|
577
|
-
|| adjustment === true
|
|
680
|
+
|| adjustment === true // Anpassung ON_Time wenn Laufzeit zu kurz, damit die 24V Versorgung während der Laufzeit nicht ausgeschaltet wird
|
|
578
681
|
) {
|
|
579
682
|
controlVoltage.wateringTime = sumOfWateringTime > controlVoltage.wateringTime ? sumOfWateringTime + 5 : controlVoltage.wateringTime; // Schaltzeit der 24V Versorgung entsprechend der maximalen Laufzeit aller Ventile in der threadList anpassen
|
|
580
683
|
const _controlVoltage = await setValve(controlVoltage, true);
|
|
@@ -594,7 +697,7 @@ const updateList = async () => {
|
|
|
594
697
|
try {
|
|
595
698
|
if (adapter.config.pumpSelection !== 'noPump'
|
|
596
699
|
&& currentPumpUse.enable === false
|
|
597
|
-
|| adjustment === true
|
|
700
|
+
|| adjustment === true // Anpassung ON_Time wenn Laufzeit zu kurz, damit die Pumpe während der Laufzeit nicht ausgeschaltet wird
|
|
598
701
|
) {
|
|
599
702
|
currentPumpUse.wateringTime = sumOfWateringTime > currentPumpUse.wateringTime ? sumOfWateringTime : currentPumpUse.wateringTime; // Schaltzeit der Pumpe entsprechend der maximalen Laufzeit aller Ventile in der threadList anpassen
|
|
600
703
|
const _currentPumpUse = await setValve(currentPumpUse, true);
|
|
@@ -606,6 +709,7 @@ const updateList = async () => {
|
|
|
606
709
|
});
|
|
607
710
|
await asyncTime.setTimeout(currentPumpUse.leadTime, undefined, undefined);
|
|
608
711
|
}
|
|
712
|
+
await sensorPressure.setActive(true); // Sensor Druck aktivieren, damit die Drucküberwachung startet
|
|
609
713
|
}
|
|
610
714
|
} catch (error) {
|
|
611
715
|
adapter.log.error(`Error trigger current Pump [${currentPumpUse.control.idState}]: ${error}`);
|
|
@@ -630,7 +734,7 @@ const updateList = async () => {
|
|
|
630
734
|
consumption = await currentConsumption(true);
|
|
631
735
|
clearInterval(entry.countdown); // Zähler für Countdown, Verbrauchsmengen, usw. löschen
|
|
632
736
|
entry.countdown = null;
|
|
633
|
-
adapter.log.
|
|
737
|
+
adapter.log.warn(`Set Valve ID: ${entry.name} Pump delivery rate too low, wait! curFlow ${consumption.curFlow} parallel: ${consumption.parallel}`);
|
|
634
738
|
await asyncTime.setTimeout(300, undefined, {signal: entry.ac.acUpdateListPuOff.signal});
|
|
635
739
|
}
|
|
636
740
|
}else{
|
|
@@ -725,6 +829,10 @@ const updateList = async () => {
|
|
|
725
829
|
|
|
726
830
|
// Pumpe ausschalten
|
|
727
831
|
if (currentPumpUse.enable === true) {
|
|
832
|
+
await sensorPressure.setActive(false).catch((error) => { // Sensor Druck deaktivieren, da keine Bewässerung mehr aktiv ist
|
|
833
|
+
adapter.log.error(`Error setting sensor pressure active false: ${error}`);
|
|
834
|
+
});
|
|
835
|
+
|
|
728
836
|
try {
|
|
729
837
|
const _currentPumpUse = await setValve(currentPumpUse, false);
|
|
730
838
|
if (_currentPumpUse === currentPumpUse.control.idState) {
|
|
@@ -735,7 +843,7 @@ const updateList = async () => {
|
|
|
735
843
|
}
|
|
736
844
|
await asyncTime.setTimeout(switchingDistanceMS, undefined, undefined);
|
|
737
845
|
} catch (error) {
|
|
738
|
-
adapter.log.error(`Error trigger current Pump [${currentPumpUse.idState}]: ${error}`);
|
|
846
|
+
adapter.log.error(`Error trigger current Pump [${ currentPumpUse.control.idState }]: ${error}`);
|
|
739
847
|
}
|
|
740
848
|
|
|
741
849
|
// Druckentlastungsventil ansteuern wenn in Konfiguration aktiv
|
|
@@ -744,7 +852,6 @@ const updateList = async () => {
|
|
|
744
852
|
try {
|
|
745
853
|
const empty = await findPressureReliefValve();
|
|
746
854
|
const _pressureReliefIO = await pressureReliefIO();
|
|
747
|
-
adapter.log.info(`pressureReliefIO: ${ _pressureReliefIO }, Data: ${ JSON.stringify(_pressureReliefIO) }`);
|
|
748
855
|
if (empty && _pressureReliefIO === 0) { // Ventil gefunden und alle Ventile haben ihre Laufzeit beendet
|
|
749
856
|
pressureReliefValve.name = empty.objectName;
|
|
750
857
|
pressureReliefValve.wateringTime = 10;
|
|
@@ -817,7 +924,7 @@ const setActualPump = async () => {
|
|
|
817
924
|
/* Pumpe AUS => Zisternen-Bewässerung nicht aktiviert */
|
|
818
925
|
if (adapter.config.triggerCisternPump) {
|
|
819
926
|
await adapter.setStateAsync('info.cisternState', {
|
|
820
|
-
val: `Cistern settings are not active! ${(fillLevelCistern > 0) ? (`
|
|
927
|
+
val: `Cistern settings are not active! ${(fillLevelCistern > 0) ? (` ${fillLevelCistern}% ${(adapter.config.triggerMinCisternLevel !== '') ? (` ${adapter.config.triggerMinCisternLevel}%`) : ('')}`):('')}`,
|
|
821
928
|
ack: true
|
|
822
929
|
});
|
|
823
930
|
}
|
|
@@ -853,7 +960,7 @@ const setActualPump = async () => {
|
|
|
853
960
|
}
|
|
854
961
|
/* Info aktualisieren */
|
|
855
962
|
await adapter.setStateAsync('info.cisternState', {
|
|
856
|
-
val: `${ (currentPumpUse.intBreak === true) ? 'Cistern empty: ' : 'Cistern filled: ' }
|
|
963
|
+
val: `${ (currentPumpUse.intBreak === true) ? 'Cistern empty: ' : 'Cistern filled: ' } ${ fillLevelCistern } % (${ adapter.config.triggerMinCisternLevel } %)`,
|
|
857
964
|
ack: true
|
|
858
965
|
});
|
|
859
966
|
break;
|
|
@@ -864,6 +971,8 @@ const setActualPump = async () => {
|
|
|
864
971
|
/* Bewässerungspumpen aktiv */
|
|
865
972
|
if ((fillLevelCistern < parseFloat(adapter.config.triggerMinCisternLevel)) && (currentPumpUse.pumpCistern === true)) {
|
|
866
973
|
/* (Zisterne unter Minimum) && (ZisternenPumpe läuft) */
|
|
974
|
+
currentPumpUse.pumpSwitching = true;
|
|
975
|
+
sensorPressure.setActive(false); // Sensor Druck deaktivieren, da die Hauptpumpe ausgeschaltet wird und somit kein Druck mehr in den Leitungen ist
|
|
867
976
|
const _setValveCisternPumpOff = await setValve(currentPumpUse, false); // Pumpe Zisterne Aus
|
|
868
977
|
if (_setValveCisternPumpOff === currentPumpUse.control.idState) {
|
|
869
978
|
await adapter.setStateAsync(currentPumpUse.id, { // set State cisternPump === false
|
|
@@ -880,7 +989,7 @@ const setActualPump = async () => {
|
|
|
880
989
|
currentPumpUse.pumpPower = parseInt(adapter.config.triggerMainPumpPower);
|
|
881
990
|
/* Hauptpumpe Ein */
|
|
882
991
|
const _setValveMainPumpOn = await setValve(currentPumpUse, true);
|
|
883
|
-
if (_setValveMainPumpOn === currentPumpUse.idState) {
|
|
992
|
+
if (_setValveMainPumpOn === currentPumpUse.control.idState) {
|
|
884
993
|
await adapter.setStateAsync(currentPumpUse.id, { // set State cisternPump === false
|
|
885
994
|
val: currentPumpUse.enable,
|
|
886
995
|
ack: true
|
|
@@ -892,6 +1001,8 @@ const setActualPump = async () => {
|
|
|
892
1001
|
if(!sendMessageText.onlySendError()){
|
|
893
1002
|
sendMessageText.sendMessage('Pump change (cistern empty) Cistern pump off => main pump on');
|
|
894
1003
|
}
|
|
1004
|
+
currentPumpUse.pumpSwitching = false;
|
|
1005
|
+
sensorPressure.setActive(true); // Sensor Druck aktivieren, da die Hauptpumpe eingeschaltet wird und somit wieder Druck in den Leitungen ist
|
|
895
1006
|
updateList(); // Wasserverbrauch an Pumpenleistung anpassen
|
|
896
1007
|
}
|
|
897
1008
|
} else {
|
|
@@ -926,7 +1037,7 @@ const setActualPump = async () => {
|
|
|
926
1037
|
}
|
|
927
1038
|
/* Info aktualisieren */
|
|
928
1039
|
await adapter.setStateAsync('info.cisternState', {
|
|
929
|
-
val: `${ (currentPumpUse.pumpCistern === false) ? 'Cistern empty: ' : 'Cistern filled: ' }
|
|
1040
|
+
val: `${ (currentPumpUse.pumpCistern === false) ? 'Cistern empty: ' : 'Cistern filled: ' } ${ fillLevelCistern } % (${ adapter.config.triggerMinCisternLevel } %)`,
|
|
930
1041
|
ack: true
|
|
931
1042
|
});
|
|
932
1043
|
break;
|
|
@@ -1325,6 +1436,63 @@ const valveControl = {
|
|
|
1325
1436
|
}
|
|
1326
1437
|
}
|
|
1327
1438
|
}
|
|
1439
|
+
|
|
1440
|
+
/**
|
|
1441
|
+
* Objekt sensorPressure anlegen und abonnieren, wenn benötigt
|
|
1442
|
+
*/
|
|
1443
|
+
|
|
1444
|
+
if (typeof adapter.config.sensorPressure === 'string'
|
|
1445
|
+
&& adapter.config.sensorPressure.length > 5
|
|
1446
|
+
&& adapter.config.pumpSelection !== 'noPump'
|
|
1447
|
+
) {
|
|
1448
|
+
const _sensorPressure = await adapter.getForeignStateAsync(adapter.config.sensorPressure);
|
|
1449
|
+
if (_sensorPressure) {
|
|
1450
|
+
sensorPressure.enable = true;
|
|
1451
|
+
sensorPressure.active = false;
|
|
1452
|
+
adapter.subscribeForeignStates(adapter.config.sensorPressure);
|
|
1453
|
+
const _waterPressure = await adapter.getObjectAsync(`info.waterPressure`);
|
|
1454
|
+
if (_waterPressure) {
|
|
1455
|
+
sensorPressure.value = _sensorPressure.val;
|
|
1456
|
+
} else {
|
|
1457
|
+
await adapter.setObjectNotExistsAsync(`info.waterPressure`, {
|
|
1458
|
+
type: 'state',
|
|
1459
|
+
common: {
|
|
1460
|
+
role: 'state',
|
|
1461
|
+
name: 'Water pressure',
|
|
1462
|
+
desc: {
|
|
1463
|
+
en: 'Water pressure',
|
|
1464
|
+
de: 'Wasserdruck',
|
|
1465
|
+
ru: 'Давление воды',
|
|
1466
|
+
pt: 'Pressão da água',
|
|
1467
|
+
nl: 'Waterdruk',
|
|
1468
|
+
fr: "Pression de l'eau",
|
|
1469
|
+
it: "Pressione dell'acqua",
|
|
1470
|
+
es: 'Presión del agua',
|
|
1471
|
+
pl: 'Ciśnienie wody',
|
|
1472
|
+
uk: 'Тиск води',
|
|
1473
|
+
'zh-cn': '水压'
|
|
1474
|
+
},
|
|
1475
|
+
type: 'string',
|
|
1476
|
+
read: true,
|
|
1477
|
+
write: false,
|
|
1478
|
+
def: ' --- ',
|
|
1479
|
+
unit: 'bar'
|
|
1480
|
+
},
|
|
1481
|
+
native: {},
|
|
1482
|
+
});
|
|
1483
|
+
}
|
|
1484
|
+
await adapter.setStateAsync(`info.waterPressure`, {
|
|
1485
|
+
val: `Initial ( ${ sensorPressure.value } bar )`,
|
|
1486
|
+
ack: true
|
|
1487
|
+
});
|
|
1488
|
+
} else {
|
|
1489
|
+
adapter.log.warn(`The configured pressure sensor "${ adapter.config.sensorPressure }" could not be found. Please check the configuration of the pressure sensor!`);
|
|
1490
|
+
}
|
|
1491
|
+
} else {
|
|
1492
|
+
// Wenn kein Drucksensor konfiguriert ist, wird das Objekt info.waterPressure gelöscht, damit keine falschen Werte angezeigt werden
|
|
1493
|
+
const _waterPressure = await adapter.getObjectAsync(`info.waterPressure`);
|
|
1494
|
+
if (_waterPressure) await adapter.delObjectAsync(`info.waterPressure`);
|
|
1495
|
+
}
|
|
1328
1496
|
} catch (error) {
|
|
1329
1497
|
adapter.log.error(`initValveControl ERROR: ${error}`);
|
|
1330
1498
|
}
|
|
@@ -1342,6 +1510,7 @@ const valveControl = {
|
|
|
1342
1510
|
*/
|
|
1343
1511
|
addList: async function (sprinkleList) {
|
|
1344
1512
|
try {
|
|
1513
|
+
sensorPressure.inadequatePressure = false; // Kontrolle Drucksensorwert zurücksetzen, damit die Bewässerungsbeschränkung korrekt funktioniert, wenn der Drucksensorwert während der Bewässerungsbeschränkung unter dem Minimum lag
|
|
1345
1514
|
// kontrolle bei ausgeschalteter Pumpe, ob die Zisterne zur Bewässerung genutzt werden kann
|
|
1346
1515
|
if (adapter.config.pumpSelection === 'pumpAndCistern'
|
|
1347
1516
|
&& currentPumpUse.enable === false
|
|
@@ -1444,7 +1613,8 @@ const valveControl = {
|
|
|
1444
1613
|
}, // End addList
|
|
1445
1614
|
|
|
1446
1615
|
timeBasedRestriction: async function (enable) { //Irrigation ban => zeitliche Bewässerungsbeschränkung noch zu bearbeiten ! ! !
|
|
1447
|
-
try {
|
|
1616
|
+
try {
|
|
1617
|
+
sensorPressure.inadequatePressure = false; // Kontrolle Drucksensorwert zurücksetzen, damit die Bewässerungsbeschränkung korrekt funktioniert, wenn der Drucksensorwert während der Bewässerungsbeschränkung unter dem Minimum lag
|
|
1448
1618
|
timeBasedRestrictionEn = enable;
|
|
1449
1619
|
if (threadList) {
|
|
1450
1620
|
if (timeBasedRestrictionEn === true) { // zeitliche Bewässerungsbeschränkung aktiv
|
|
@@ -1654,8 +1824,78 @@ const valveControl = {
|
|
|
1654
1824
|
*/
|
|
1655
1825
|
getIntBreakCisternPump: function () {
|
|
1656
1826
|
return (adapter.config.pumpSelection === 'cistern') ? currentPumpUse.intBreak : false;
|
|
1657
|
-
}
|
|
1827
|
+
},
|
|
1658
1828
|
|
|
1829
|
+
/**
|
|
1830
|
+
* Setzt den Drucksensorwert
|
|
1831
|
+
* https://blog.logrocket.com/complete-guide-abortcontroller/
|
|
1832
|
+
*
|
|
1833
|
+
* @param {number} pressure
|
|
1834
|
+
*/
|
|
1835
|
+
setSensorPressure: async function (pressure) {
|
|
1836
|
+
let alteredPressure = false; // Veränderter Druck => updateList starten um Verbrauch anzupassen / Ventile ausschalten
|
|
1837
|
+
let reviews = '';
|
|
1838
|
+
|
|
1839
|
+
try {
|
|
1840
|
+
sensorPressure.value = parseFloat(pressure).toFixed(1);
|
|
1841
|
+
if (sensorPressure.active === true && adapter.config.minimumPressure > pressure) {
|
|
1842
|
+
if (sensorPressure.ac === null) {
|
|
1843
|
+
sensorPressure.ac = new AbortController();
|
|
1844
|
+
await asyncTime.setTimeout(60000, undefined, { signal: sensorPressure.ac.signal }); // max. 60s warten und Drucksensorwert erneut prüfen, bevor die Pumpe ausgeschaltet wird
|
|
1845
|
+
const _currentPressure = await adapter.getForeignStateAsync(adapter.config.sensorPressure);
|
|
1846
|
+
if (_currentPressure?.val){
|
|
1847
|
+
if(typeof _currentPressure.val === 'number') {
|
|
1848
|
+
sensorPressure.value = parseFloat(_currentPressure.val).toFixed(1);
|
|
1849
|
+
}else if(typeof _currentPressure.val === 'string') {
|
|
1850
|
+
sensorPressure.value = parseFloat(_currentPressure.val).toFixed(1);
|
|
1851
|
+
}else if(typeof _currentPressure.val === 'boolean') {
|
|
1852
|
+
(_currentPressure.val === true) ? sensorPressure.value = 100 : sensorPressure.value = 0;
|
|
1853
|
+
}else{
|
|
1854
|
+
throw new Error(`setSensorPressure => Wrong value: ${ _currentPressure.val }, Type: ${ typeof _currentPressure.val }`);
|
|
1855
|
+
}
|
|
1856
|
+
if (sensorPressure.active === true
|
|
1857
|
+
&& adapter.config.minimumPressure > sensorPressure.value
|
|
1858
|
+
) {
|
|
1859
|
+
reviews = 'Not Okay'
|
|
1860
|
+
if (sensorPressure.inadequatePressure === false) {
|
|
1861
|
+
alteredPressure = true;
|
|
1862
|
+
sensorPressure.inadequatePressure = true;
|
|
1863
|
+
}
|
|
1864
|
+
adapter.log.warn(`Pressure sensor value ${ sensorPressure.value } bar is below the minimum pressure ${ adapter.config.minimumPressure } bar. The pump will be turned off to prevent damage. Please check the pressure sensor and the configuration of the minimum pressure!`);
|
|
1865
|
+
if (adapter.config.notificationEnabled) {
|
|
1866
|
+
sendMessageText.sendMessage(`Pressure sensor value ${ sensorPressure.value } bar is below the minimum pressure ${ adapter.config.minimumPressure } bar. The pump will be turned off to prevent damage. Please check the pressure sensor and the configuration of the minimum pressure!`);
|
|
1867
|
+
}
|
|
1868
|
+
} else {
|
|
1869
|
+
reviews = 'Okay';
|
|
1870
|
+
}
|
|
1871
|
+
}
|
|
1872
|
+
sensorPressure.ac = null; // AbortController zurücksetzen
|
|
1873
|
+
} else {
|
|
1874
|
+
reviews = 'I don\'t know'; // Ich weiß nicht
|
|
1875
|
+
}
|
|
1876
|
+
} else {
|
|
1877
|
+
reviews = 'Okay'
|
|
1878
|
+
if (sensorPressure?.ac !== null) {
|
|
1879
|
+
await sensorPressure.ac.abort(); // AbortController zurücksetzen
|
|
1880
|
+
sensorPressure.ac = null;
|
|
1881
|
+
}
|
|
1882
|
+
}
|
|
1883
|
+
} catch (error) {
|
|
1884
|
+
if (error.name === 'AbortError') {
|
|
1885
|
+
adapter.log.debug(`setSensorPressure(${ sensorPressure.value}): The shutdown process was aborted because the operating pressure was restored.`);
|
|
1886
|
+
if (sensorPressure?.ac !== null) {
|
|
1887
|
+
sensorPressure.ac.abort(); // AbortController zurücksetzen
|
|
1888
|
+
sensorPressure.ac = null;
|
|
1889
|
+
}
|
|
1890
|
+
}
|
|
1891
|
+
} finally {
|
|
1892
|
+
await adapter.setStateAsync(`info.waterPressure`, {
|
|
1893
|
+
val: `${ reviews } ( ${ sensorPressure.value } bar )`,
|
|
1894
|
+
ack: true
|
|
1895
|
+
});
|
|
1896
|
+
if (alteredPressure) updateList();
|
|
1897
|
+
}
|
|
1898
|
+
}
|
|
1659
1899
|
}; // End valveControl
|
|
1660
1900
|
|
|
1661
1901
|
/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
|