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.
@@ -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 = {enable: false, name: '',wateringTime: 10, ac: {}, controller: {}, control: {idState: undefined, idON_TIME: undefined, idACK: undefined, maker: undefined}};
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 = {funcActive: false, newStart: false, switchingDistance: 5000, cancelSwitchingDistance: {}};
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 = {enable: false, name: '', wateringTime: 0, id: '', pumpCistern: false, intBreak: false, leadTime: 0, cancelLeadTime: {}, pumpPower: 0, restFlow: 0,ac: {},controller: {}, control: {idState: undefined, idON_TIME: undefined, idACK: undefined, maker: undefined}};
68
- let mainPumpControl = {idState: undefined, idON_TIME: undefined, idACK: undefined, maker: undefined};
69
- let cisternPumpControl = {idState: undefined, idON_TIME: undefined, idACK: undefined, maker: undefined};
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 = {enable: false, name: '24V',wateringTime: 0, ac: {}, controller: {}, control: {idState: undefined, idON_TIME: undefined, idACK: undefined, maker: undefined}};
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 ansteuern
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 {*} entry
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
- * Druckentlastungsventil Steuerung
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.info(`Set Valve ID: ${entry.name} Pump delivery rate too low, wait! curFlow ${consumption.curFlow} parallel: ${consumption.parallel}`);
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) ? (`level sensor: ${fillLevelCistern}% ${(adapter.config.triggerMinCisternLevel !== '') ? (` ${adapter.config.triggerMinCisternLevel}%`) : ('')}`):('')}`,
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: ' } Cistern level: ${ fillLevelCistern } % (${ adapter.config.triggerMinCisternLevel } %)`,
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: ' } Cistern level: ${ fillLevelCistern } % (${ adapter.config.triggerMinCisternLevel } %)`,
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
  /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/