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 CHANGED
@@ -8,6 +8,7 @@
8
8
  [![NPM version](http://img.shields.io/npm/v/iobroker.sprinklecontrol.svg)](https://www.npmjs.com/package/iobroker.sprinklecontrol)
9
9
  [![Downloads](https://img.shields.io/npm/dm/iobroker.sprinklecontrol.svg)](https://www.npmjs.com/package/iobroker.sprinklecontrol)
10
10
  [![Known Vulnerabilities](https://snyk.io/test/github/Dirk-Peter-md/ioBroker.sprinklecontrol/badge.svg)](https://snyk.io/test/github/Dirk-Peter-md/ioBroker.sprinklecontrol)
11
+ ![Test and Release](https://github.com/Dirk-Peter-md/ioBroker.sprinklecontrol/workflows/Test%20and%20Release/badge.svg)
11
12
  [![NPM](https://nodei.co/npm/iobroker.sprinklecontrol.png?downloads=true)](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.14",
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": {
@@ -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', { val: Math.round(eTp * 10000) / 10000, ack: true });
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', { val: Math.round(ETpTodayNum * 10000) / 10000, ack: true });
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', { val: Math.round(ETpTodayNum * 10000) / 10000, ack: true });
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', { val: 0, ack: true });
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 }.sprinkle.${ objectName }.autoOn`, // sprinklecontrol.0.sprinkle.Rasenumrandung.autoOnID
167
+ autoOnID: `${adapter.namespace}.sprinkle.${objectName}.autoOn`, // sprinklecontrol.0.sprinkle.Rasenumrandung.autoOnID
168
168
  objectName: objectName, // z.B. Rasenumrandung
169
- objectID: `${adapter.namespace }.sprinkle.${ objectName }.runningTime`, // sprinklecontrol.0.sprinkle.Rasenumrandung.runningTime
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.${ myConfig.config[mySprinkleID].objectName }.actualSoilMoisture`, {
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.${ [myConfig.config[mySprinkleID].objectName] }.actualSoilMoisture`, {
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.${ [myConfig.config[mySprinkleID].objectName] }.actualSoilMoisture`, {
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.${ myConfig.config[mySprinkleID].objectName }.actualSoilMoisture`, {
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
- `${id}`,
366
- nextDay,
367
- true
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
  }
@@ -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 // Vergleich nur bei Berechnung der Verdunstung
310
- || !entry.autoOn // Vergleich nur bei Automatik
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}, count % onOffTime: ${entry.count % entry.onOffTime}`);
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.getState('adapter.config.triggerMainPump', (err, state) => {
707
- if (state) {
708
- adapter.setState(adapter.config.triggerMainPump, {
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.getState('adapter.config.triggerCisternPump', (err, state) => {
718
- if (state) {
719
- adapter.setState(adapter.config.triggerCisternPump, {
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.getState(res.name, (err, state) => {
731
- if (state) {
732
- adapter.setState(res.name, {
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: true
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 }.control.Holiday`) {
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 }.control.autoOnOff`)) {
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', {val: false, ack: true});
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
- 'info.rainTomorrow',
552
- weatherForecastTomorrowNum,
553
- true
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
- ).catch((e) => adapter.log.warn(e));
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`, { val: state.val, ack: true });
633
- adapter.setState(`sprinkle.${objectName}.history.curCalWeekConsumed`, { val: 0, ack: true });
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`, { val: state.val, ack: true });
639
- adapter.setState(`sprinkle.${objectName}.history.curCalWeekRunningTime`, { val: '00:00', ack: true });
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', { val: 'The level sensor of the water cistern is not specified', ack: true });
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.14",
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": ">= 18"
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.1",
43
- "@iobroker/testing": "^5.0.3",
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.1.0",
47
- "sinon": "^19.0.2",
46
+ "mocha": "^11.5.0",
47
+ "sinon": "^20.0.0",
48
48
  "sinon-chai": "^4.0.0"
49
49
  },
50
50
  "main": "main.js",