iobroker.sprinklecontrol 1.0.5 → 1.0.6

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
@@ -33,6 +33,10 @@ Wetterabhängige automatische Steuerung der Gartenbewässerung
33
33
  Placeholder for the next version (at the beginning of the line):
34
34
  ### **WORK IN PROGRESS**
35
35
  -->
36
+ ### 1.0.6 (2026-05-10)
37
+ * (Dirk-Peter-md) Cistern Control Optimized
38
+ * (Dirk-Peter-md) Translation revised
39
+
36
40
  ### 1.0.5 (2026-05-03)
37
41
  * (Copilot) Adapter benötigt jetzt node.js >= 22
38
42
  * (Dirk-Peter-md) Second start time added
@@ -47,12 +51,7 @@ Wetterabhängige automatische Steuerung der Gartenbewässerung
47
51
  ### 1.0.2 (2026-04-19)
48
52
  * (Dirk-Peter-md) Added times for the irrigation ban
49
53
 
50
- ### 1.0.1 (2026-04-11)
51
- * (Dirk-Peter-md) Add Homematic ON_TIME
52
- * (Dirk-Peter-md) Adapter configuration revised
53
- * (Dirk-Peter-md) ioBroker-Bot [E4041], [E4043] completed
54
-
55
- ## License
54
+ [Older changelogs can be found there](CHANGELOG_OLD.md)## License
56
55
  MIT License
57
56
 
58
57
  Copyright (c) 2020-2026 Dirk Peter <dirk.peter@freenet.de>
@@ -18,6 +18,7 @@
18
18
  "Calculation of evaporation": "Berechnung der Verdunstung",
19
19
  "Cancel": "Abbrechen",
20
20
  "Cistern": "Zisterne",
21
+ "Cistern Fill Level 0–100%": "Füllstand der Zisterne 0–100 %",
21
22
  "Command without response": "Befehl ohne Antwort",
22
23
  "Configuration of the analog soil moisture sensor": "Konfiguration des analogen Bodenfeuchtesensors",
23
24
  "Control voltage of the valves": "Steuerspannung der Ventile",
@@ -18,6 +18,7 @@
18
18
  "Calculation of evaporation": "Calculation of evaporation",
19
19
  "Cancel": "Abort, stop",
20
20
  "Cistern": "Cistern",
21
+ "Cistern Fill Level 0–100%": "Cistern Fill Level 0–100%",
21
22
  "Command without response": "Command without response",
22
23
  "Configuration of the analog soil moisture sensor": "Configuration of the analog soil moisture sensor",
23
24
  "Control voltage of the valves": "Control voltage of the valves",
@@ -38,7 +39,7 @@
38
39
  "Irrigation settings": "Irrigation settings",
39
40
  "Lead time of the cistern pump in s": "Lead time of the cistern pump in s",
40
41
  "Lead time of the main pump in s": "Lead time of the main pump in s",
41
- "Level of the cistern": "Sensor of the level in the cistern",
42
+ "Level of the cistern": "",
42
43
  "Long Notifications": "Long Notifications",
43
44
  "Main pump": "Main pump",
44
45
  "Main pump and cisterns with priority circuit": "Main pump and cisterns with priority circuit",
@@ -18,6 +18,7 @@
18
18
  "Calculation of evaporation": "Cálculo de evaporación",
19
19
  "Cancel": "abortar",
20
20
  "Cistern": "Cistern",
21
+ "Cistern Fill Level 0–100%": "Nivel de llenado de la cisterna 0–100 %",
21
22
  "Command without response": "Comando sin respuesta",
22
23
  "Configuration of the analog soil moisture sensor": "Configuración del sensor de humedad del suelo analógico",
23
24
  "Control voltage of the valves": "Control de voltaje de las válvulas",
@@ -18,6 +18,7 @@
18
18
  "Calculation of evaporation": "Calcul de l'évaporation",
19
19
  "Cancel": "abandonner",
20
20
  "Cistern": "Cistern",
21
+ "Cistern Fill Level 0–100%": "Niveau de remplissage de la citerne 0 à 100 %",
21
22
  "Command without response": "Commande sans réponse",
22
23
  "Configuration of the analog soil moisture sensor": "Configuration du capteur analogique d'humidité du sol",
23
24
  "Control voltage of the valves": "Tension de commande des soupapes",
@@ -18,6 +18,7 @@
18
18
  "Calculation of evaporation": "Calcolo dell'evaporazione",
19
19
  "Cancel": "abortire",
20
20
  "Cistern": "Cistern",
21
+ "Cistern Fill Level 0–100%": "Livello di riempimento della cisterna 0–100%",
21
22
  "Command without response": "Comando senza risposta",
22
23
  "Configuration of the analog soil moisture sensor": "Configurazione del sensore di umidità del suolo analogico",
23
24
  "Control voltage of the valves": "Controllo della tensione delle valvole",
@@ -18,6 +18,7 @@
18
18
  "Calculation of evaporation": "Berekening van verdamping",
19
19
  "Cancel": "afbreken",
20
20
  "Cistern": "Cistern",
21
+ "Cistern Fill Level 0–100%": "Vulniveau reservoir 0–100%",
21
22
  "Command without response": "Commando zonder reactie",
22
23
  "Configuration of the analog soil moisture sensor": "Configuratie van de analoge bodemvochtsensor",
23
24
  "Control voltage of the valves": "Stuurspanning van de kleppen",
@@ -18,6 +18,7 @@
18
18
  "Calculation of evaporation": "Obliczanie parowania",
19
19
  "Cancel": "przerwać",
20
20
  "Cistern": "Cistern",
21
+ "Cistern Fill Level 0–100%": "Poziom napełnienia cysterny 0–100%",
21
22
  "Command without response": "Polecenie bez odpowiedzi",
22
23
  "Configuration of the analog soil moisture sensor": "Konfiguracja analogowego czujnika wilgotności gleby",
23
24
  "Control voltage of the valves": "Napięcie sterujące zaworów",
@@ -18,6 +18,7 @@
18
18
  "Calculation of evaporation": "Cálculo de evaporação",
19
19
  "Cancel": "abortar",
20
20
  "Cistern": "Cisterna",
21
+ "Cistern Fill Level 0–100%": "Nível de enchimento da cisterna 0–100%",
21
22
  "Command without response": "Comando sem resposta",
22
23
  "Configuration of the analog soil moisture sensor": "Configuração do sensor analógico de umidade do solo",
23
24
  "Control voltage of the valves": "Tensão de controle das válvulas",
@@ -18,6 +18,7 @@
18
18
  "Calculation of evaporation": "Расчет испарения",
19
19
  "Cancel": "выкинуть",
20
20
  "Cistern": "Сестран",
21
+ "Cistern Fill Level 0–100%": "Уровень заполнения цистерны 0–100 %",
21
22
  "Command without response": "Команда без ответа",
22
23
  "Configuration of the analog soil moisture sensor": "Конфигурация аналогового датчика влажности почвы",
23
24
  "Control voltage of the valves": "Управляющее напряжение клапанов",
@@ -18,6 +18,7 @@
18
18
  "Calculation of evaporation": "Розрахунок випаровування",
19
19
  "Cancel": "Перервати, зупинити",
20
20
  "Cistern": "Цистерна",
21
+ "Cistern Fill Level 0–100%": "Рівень заповнення бака 0–100%",
21
22
  "Command without response": "Команда без відповіді",
22
23
  "Configuration of the analog soil moisture sensor": "Конфігурація аналогового датчика вологості ґрунту",
23
24
  "Control voltage of the valves": "Керуюча напруга вентилів",
@@ -18,6 +18,7 @@
18
18
  "Calculation of evaporation": "蒸发量计算",
19
19
  "Cancel": "退出",
20
20
  "Cistern": "Cistern",
21
+ "Cistern Fill Level 0–100%": "水箱填充水位 0–100%",
21
22
  "Command without response": "命令无响应",
22
23
  "Configuration of the analog soil moisture sensor": "模拟土壤湿度传感器的配置",
23
24
  "Control voltage of the valves": "阀门控制电压",
@@ -195,7 +195,7 @@
195
195
  <div class="input-field col s10 m5 l5">
196
196
  <input type="text" class="value" id="actualValueLevel" />
197
197
  <label for="actualValueLevel" class="translate"></label>
198
- <span class="translate">Level of the cistern</span>
198
+ <span class="translate">Cistern Fill Level 0–100%</span>
199
199
  </div>
200
200
  <div class="col s2 m1 l1">
201
201
  <a id="actualValueLevelDialogPopUp" class="btn-floating waves-effect waves-light blue table-button-add"><i class="material-icons">add</i></a>
package/admin/index_m.js CHANGED
@@ -1,4 +1,4 @@
1
- /**
1
+ /*
2
2
  * @license
3
3
  * iobroker.sprinklecontrol - Copyright (c) by Dirk-Peter-md
4
4
  * Please visit https://github.com/Dirk-Peter-md/ioBroker.sprinklecontrol for licence-agreement and further information
package/admin/words.js CHANGED
@@ -8,7 +8,7 @@
8
8
  'use strict';
9
9
 
10
10
  systemDictionary = {
11
- "1. Start time": { "en": "", "de": "1. Startzeit", "ru": "1. Время начала", "pt": "1. Hora de início", "nl": "1. Begintijd", "fr": "1. Heure de début", "it": "1. Ora di inizio", "es": "1. Hora de inicio", "pl": "1. Czas rozpoczęcia", "uk": "1. Час початку", "zh-cn": "1.开始时间"},
11
+ "1. Start time": { "en": "1. Start time", "de": "1. Startzeit", "ru": "1. Время начала", "pt": "1. Hora de início", "nl": "1. Begintijd", "fr": "1. Heure de début", "it": "1. Ora di inizio", "es": "1. Hora de inicio", "pl": "1. Czas rozpoczęcia", "uk": "1. Час початку", "zh-cn": "1.开始时间"},
12
12
  "1. Start time (including holiday and weekend schedule)": {"en": "1. Start time (including holiday and weekend schedule)", "de": "1. Startzeit (einschließlich Feiertags- und Wochenendplan)", "ru": "1. Время начала (включая график праздников и выходных)", "pt": "1. Horário de início (incluindo feriados e fins de semana)", "nl": "1. Starttijd (inclusief vakantie- en weekendrooster)", "fr": "1. Heure de début (y compris les horaires des jours fériés et du week-end)", "it": "1. Ora di inizio (incluso il programma festivo e del fine settimana)", "es": "1. Hora de inicio (incluido el calendario de días festivos y fines de semana)", "pl": "1. Godzina rozpoczęcia (w tym harmonogram świąteczny i weekendowy)", "uk": "1. Час початку (включаючи розклад святкових і вихідних днів)", "zh-cn": "1. 开始时间(含节假日及周末时间表)"},
13
13
  "1. Start time including holiday and weekend schedule": {"en": "", "de": "1. Startzeit einschließlich Feiertags- und Wochenendplan", "ru": "1. Время начала, включая график праздников и выходных.", "pt": "1. Horário de início, incluindo feriados e fins de semana", "nl": "1. Starttijd inclusief vakantie- en weekendrooster", "fr": "1. Heure de début, y compris les horaires des jours fériés et du week-end", "it": "1. Ora di inizio compreso il programma festivo e del fine settimana", "es": "1. Hora de inicio, incluido el calendario de días festivos y fines de semana.", "pl": "1. Godzina rozpoczęcia uwzględniająca harmonogram wakacji i weekendów", "uk": "1. Час початку, включаючи розклад святкових і вихідних днів", "zh-cn": "1.开始时间包括节假日和周末时间表"},
14
14
  "2. Start time": { "en": "2. Start time", "de": "2. Startzeit", "ru": "2. Время начала", "pt": "2. Hora de início", "nl": "2. Begintijd", "fr": "2. Heure de début", "it": "2. Ora di inizio", "es": "2. Hora de inicio", "pl": "2. Czas rozpoczęcia", "uk": "2. Час початку", "zh-cn": "2. 开始时间"},
@@ -27,6 +27,7 @@ systemDictionary = {
27
27
  "Calculation of evaporation": { "en": "Calculation of evaporation", "de": "Berechnung der Verdunstung", "ru": "Расчет испарения", "pt": "Cálculo de evaporação", "nl": "Berekening van verdamping", "fr": "Calcul de l'évaporation", "it": "Calcolo dell'evaporazione", "es": "Cálculo de evaporación", "pl": "Obliczanie parowania", "uk": "Розрахунок випаровування", "zh-cn": "蒸发量计算"},
28
28
  "Cancel": { "en": "Abort, stop", "de": "Abbrechen", "ru": "выкинуть", "pt": "abortar", "nl": "afbreken", "fr": "abandonner", "it": "abortire", "es": "abortar", "pl": "przerwać", "uk": "Перервати, зупинити", "zh-cn": "退出"},
29
29
  "Cistern": { "en": "Cistern", "de": "Zisterne", "ru": "Сестран", "pt": "Cisterna", "nl": "Cistern", "fr": "Cistern", "it": "Cistern", "es": "Cistern", "pl": "Cistern", "uk": "Цистерна", "zh-cn": "Cistern"},
30
+ "Cistern Fill Level 0–100%": { "en": "Cistern Fill Level 0–100%", "de": "Füllstand der Zisterne 0–100 %", "ru": "Уровень заполнения цистерны 0–100 %", "pt": "Nível de enchimento da cisterna 0–100%", "nl": "Vulniveau reservoir 0–100%", "fr": "Niveau de remplissage de la citerne 0 à 100 %", "it": "Livello di riempimento della cisterna 0–100%", "es": "Nivel de llenado de la cisterna 0–100 %", "pl": "Poziom napełnienia cysterny 0–100%", "uk": "Рівень заповнення бака 0–100%", "zh-cn": "水箱填充水位 0–100%"},
30
31
  "Command without response": { "en": "Command without response", "de": "Befehl ohne Antwort", "ru": "Команда без ответа", "pt": "Comando sem resposta", "nl": "Commando zonder reactie", "fr": "Commande sans réponse", "it": "Comando senza risposta", "es": "Comando sin respuesta", "pl": "Polecenie bez odpowiedzi", "uk": "Команда без відповіді", "zh-cn": "命令无响应"},
31
32
  "Configuration of the analog soil moisture sensor": {"en": "Configuration of the analog soil moisture sensor", "de": "Konfiguration des analogen Bodenfeuchtesensors", "ru": "Конфигурация аналогового датчика влажности почвы", "pt": "Configuração do sensor analógico de umidade do solo", "nl": "Configuratie van de analoge bodemvochtsensor", "fr": "Configuration du capteur analogique d'humidité du sol", "it": "Configurazione del sensore di umidità del suolo analogico", "es": "Configuración del sensor de humedad del suelo analógico", "pl": "Konfiguracja analogowego czujnika wilgotności gleby", "uk": "Конфігурація аналогового датчика вологості ґрунту", "zh-cn": "模拟土壤湿度传感器的配置"},
32
33
  "Control voltage of the valves": { "en": "Control voltage of the valves", "de": "Steuerspannung der Ventile", "ru": "Управляющее напряжение клапанов", "pt": "Tensão de controle das válvulas", "nl": "Stuurspanning van de kleppen", "fr": "Tension de commande des soupapes", "it": "Controllo della tensione delle valvole", "es": "Control de voltaje de las válvulas", "pl": "Napięcie sterujące zaworów", "uk": "Керуюча напруга вентилів", "zh-cn": "阀门控制电压"},
@@ -47,7 +48,7 @@ systemDictionary = {
47
48
  "Irrigation settings": { "en": "Irrigation settings", "de": "Bewässerungseinstellungen", "ru": "Настройки полива", "pt": "Configurações de irrigação", "nl": "Irrigatie-instellingen", "fr": "Paramètres d'irrigation", "it": "Impostazioni di irrigazione", "es": "Configuración de riego", "pl": "Ustawienia nawadniania", "uk": "Налаштування поливу", "zh-cn": "灌溉设置"},
48
49
  "Lead time of the cistern pump in s": { "en": "Lead time of the cistern pump in s", "de": "Vorlaufzeit der Zisternepumpe in s", "ru": "Время заказа цистернного насоса в s", "pt": "Líder do tempo da bomba cisterna em S", "nl": "Doorlooptijd van de reserveurpomp in S", "fr": "Temps de livraison de la pompe de la citerne en s", "it": "Tempo di consegna della pompa di cisterna in s", "es": "Tiempo de entrega de la bomba de cisterna en S", "pl": "Czas realizacji pompy cysterna w s", "uk": "Час виконання цистернного насоса в s", "zh-cn": "s泵的交货时间"},
49
50
  "Lead time of the main pump in s": { "en": "Lead time of the main pump in s", "de": "Vorlaufzeit der Hauptpumpe in s", "ru": "Время выполнения основного насоса в s", "pt": "Líder do tempo da bomba principal em S", "nl": "Doorlooptijd van de hoofdpomp in S", "fr": "Temps de livraison de la pompe principale en s", "it": "Tempo di consegna della pompa principale in s", "es": "Tiempo de entrega de la bomba principal en S", "pl": "Czas realizacji pompy głównej w s", "uk": "Час виконання головного насоса в S", "zh-cn": "主泵的交货时间"},
50
- "Level of the cistern": { "en": "Sensor of the level in the cistern", "de": "Sensor des Füllstands in der Zisterne", "ru": "Датчик уровня в бачке", "pt": "Sensor do nível na cisterna", "nl": "Sensor van het niveau in het reservoir", "fr": "Capteur de niveau dans la citerne", "it": "Sensore di livello in cisterna", "es": "Sensor de nivel en la cisterna", "pl": "Czujnik poziomu w zbiorniku", "uk": "Датчик рівня в бачку", "zh-cn": "水箱水位传感器"},
51
+ "Level of the cistern": { "en": "", "de": "Sensor des Füllstands in der Zisterne", "ru": "Датчик уровня в бачке", "pt": "Sensor do nível na cisterna", "nl": "Sensor van het niveau in het reservoir", "fr": "Capteur de niveau dans la citerne", "it": "Sensore di livello in cisterna", "es": "Sensor de nivel en la cisterna", "pl": "Czujnik poziomu w zbiorniku", "uk": "Датчик рівня в бачку", "zh-cn": "水箱水位传感器"},
51
52
  "Long Notifications": { "en": "Long Notifications", "de": "Lange Benachrichtigungen", "ru": "Длинные уведомления", "pt": "Notificações longas", "nl": "Lange meldingen", "fr": "Notifications longues", "it": "Notifiche lunghe", "es": "Notificaciones largas", "pl": "Długie powiadomienia", "uk": "Довгі повідомлення", "zh-cn": "长通知"},
52
53
  "Main pump": { "en": "Main pump", "de": "Hauptpumpe", "ru": "Главный насос", "pt": "Bomba principal", "nl": "Hoofdpomp", "fr": "Pompe principale", "it": "Pompa principale", "es": "Bomba principal", "pl": "Pompa główna", "uk": "Основний насос", "zh-cn": "主泵"},
53
54
  "Main pump and cisterns with priority circuit": { "en": "Main pump and cisterns with priority circuit", "de": "Hauptpumpe und Zisternen mit Prioritätsschaltung", "ru": "Главный насос и цистерны с приоритетной схемой", "pt": "Bomba principal e cisternas com circuito prioritário", "nl": "Hoofdpomp en cisterns met prioriteitscircuit", "fr": "Pompe principale et citernes avec circuit prioritaire", "it": "Pompa e cisterne principali con circuito prioritario", "es": "Bomba principal y cisternas con circuito prioritario", "pl": "Główna pompa i cysterna z głównymi obwodami", "uk": "Головний насос і цистерни з пріоритетним контуром", "zh-cn": "D. 主要水泵和有优先权的厕所"},
package/io-package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "common": {
3
3
  "name": "sprinklecontrol",
4
- "version": "1.0.5",
4
+ "version": "1.0.6",
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
+ "1.0.6": {
23
+ "en": "Cistern Control Optimized\nTranslation revised",
24
+ "de": "Zisternensteuerung optimiert\nÜbersetzung überarbeitet",
25
+ "ru": "Оптимизированный контроль цистерны\nПеревод пересмотрен",
26
+ "pt": "Controle de cisterna otimizado\nTradução revista",
27
+ "nl": "Cistern Control Geoptimaliseerd\nVertaling herzien",
28
+ "fr": "Contrôle Cistern optimisé\nTraduction révisée",
29
+ "it": "Cistern Control Ottimizzato\nTraduzione rivista",
30
+ "es": "Control Cistern Optimizado\nTraducción revisada",
31
+ "pl": "Kontrola Cysterna zoptymalizowana\nTłumaczenie zmienione",
32
+ "uk": "Оптимізований контроль цистерни\nПереклад",
33
+ "zh-cn": "晶体控制优化\n翻译订正"
34
+ },
22
35
  "1.0.5": {
23
36
  "en": "Adapter benötigt jetzt node.js >= 22\nSecond start time added\nbug fixed in sprinklerState",
24
37
  "de": "Adapter benötigt jetzt node.js >= 22\nZweite Startzeit hinzugefügt\nfehler behoben in SprinklerState",
@@ -96,19 +109,6 @@
96
109
  "pl": "Przeprojektowanie adaptera = > Sprawdź konfigurację\nAdaptacja do \"dasWeather\" > = 4. 0\nNapraw publikację npm\nzaktualizowane zależności\naktualizacja zależna",
97
110
  "uk": "Редизайн адаптера => Обов'язково перевірте налаштування\nАдаптація до \"dasWeather\" >= 4.8 км\nВиправлення npm опублікування\nоновлені залежності\nоновлення залежності",
98
111
  "zh-cn": "适应器的重新设计 请检查您的配置\n适应“DasWeather”_________________________ 4.0 (单位:百万美元)\n修复 npm 发布\n更新依赖关系\n更新依赖保护"
99
- },
100
- "0.2.19": {
101
- "en": "The switch-on hysteresis of the cistern is now stored in the configuration.",
102
- "de": "Die Einschalthysterese der Zisterne wird nun in der Konfiguration gespeichert.",
103
- "ru": "Гистерезис цистерны теперь хранится в конфигурации.",
104
- "pt": "A histerese da cisterna é agora armazenada na configuração.",
105
- "nl": "De inschakelhysterese van de cisterne wordt nu opgeslagen in de configuratie.",
106
- "fr": "L'hystérie de la citerne est maintenant stockée dans la configuration.",
107
- "it": "L'isteresi di commutazione della cisterna è ora memorizzata nella configurazione.",
108
- "es": "La histeresis de la cisterna se almacena ahora en la configuración.",
109
- "pl": "Przełączanie hysterezy cysterny jest teraz przechowywane w konfiguracji.",
110
- "uk": "У конфігурації тепер зберігається комутаційний гістерезис цистерни.",
111
- "zh-cn": "晶体的开关式歇斯底里现保存在配置中."
112
112
  }
113
113
  },
114
114
  "desc": {
@@ -351,8 +351,8 @@ const evaporation = {
351
351
  adapter.log.warn('Temperature outside the range of -20 ... 55 [°C]');
352
352
  abbruch = true;
353
353
  }
354
- if(curHumidity.val && (curHumidity.val < 1) || (curHumidity.val > 99)) {
355
- adapter.log.warn('Humidity outside the range of 1 ... 99 [%]');
354
+ if(curHumidity.val && (curHumidity.val < 1) || (curHumidity.val > 100)) {
355
+ adapter.log.warn('Humidity outside the range of 1 ... 100 [%]');
356
356
  abbruch = true;
357
357
  }
358
358
  if(curIllumination.val && (curIllumination.val < 0) || (curIllumination.val > 100000)) {
@@ -205,16 +205,21 @@ const setValve = async (thread, val) => {
205
205
  if (thread.ac.acSetValveCancelTimeout.aborted === false) thread.ac.acSetValveCancelTimeout.abort();
206
206
  }
207
207
 
208
- if (thread.name !== 'Cistern pump' && thread.name !== 'Main pump' && thread.name !== '24V' && thread.name !== 'no Pump') {
209
- adapter.setStateAsync(`sprinkle.${thread.name}.sprinklerState`, {
210
- val: thread.state,
211
- ack: true
212
- });
213
- adapter.setStateAsync(`sprinkle.${thread.name}.valveOn`, {
214
- val: thread.enable,
215
- ack: true
216
- });
208
+ try {
209
+ if (thread.name !== 'Cistern pump' && thread.name !== 'Main pump' && thread.name !== '24V' && thread.name !== 'no Pump') {
210
+ await adapter.setStateAsync(`sprinkle.${thread.name}.sprinklerState`, {
211
+ val: thread.state,
212
+ ack: true
213
+ });
214
+ adapter.setStateAsync(`sprinkle.${thread.name}.valveOn`, {
215
+ val: thread.enable,
216
+ ack: true
217
+ });
218
+ }
219
+ } catch (error) {
220
+ adapter.log.error(`setValve ${thread.name} => Error setting sprinklerState or valveOn: ${error}`);
217
221
  }
222
+
218
223
  return result;
219
224
  };
220
225
 
@@ -546,9 +551,22 @@ const updateList = async () => {
546
551
  }, myConfig.config[0]
547
552
  );
548
553
  }
549
- // Implementation for pressure relief valve control
550
-
554
+ /**
555
+ * Druckentlastungsventil ein wenn alle Ventile ihre Laufzeit beendet haben
556
+ * .killSprinkle = true
557
+ */
558
+ function pressureReliefIO() {
559
+ return threadList.reduce((count, entry) => {
560
+ return (entry.myBreak === true // Intervall-Beregnung on
561
+ && entry.killSprinkle === false // && Aufgabe noch nicht erledigt
562
+ ) ? (count + 1) : count;
563
+ }, 0
564
+ );
565
+ }
551
566
 
567
+ /**
568
+ * Start der Steuerung der Pumpen und Ventile
569
+ */
552
570
  consumption = await currentConsumption(true);
553
571
  if (consumption.pumpRequired === true) { // Pumpe erforderlich
554
572
 
@@ -725,7 +743,9 @@ const updateList = async () => {
725
743
  ) {
726
744
  try {
727
745
  const empty = await findPressureReliefValve();
728
- if (empty) {
746
+ const _pressureReliefIO = await pressureReliefIO();
747
+ adapter.log.info(`pressureReliefIO: ${ _pressureReliefIO }, Data: ${ JSON.stringify(_pressureReliefIO) }`);
748
+ if (empty && _pressureReliefIO === 0) { // Ventil gefunden und alle Ventile haben ihre Laufzeit beendet
729
749
  pressureReliefValve.name = empty.objectName;
730
750
  pressureReliefValve.wateringTime = 10;
731
751
  pressureReliefValve.pipeFlow = empty.pipeFlow;
@@ -796,7 +816,7 @@ const setActualPump = async () => {
796
816
  case 'mainPump': {
797
817
  /* Pumpe AUS => Zisternen-Bewässerung nicht aktiviert */
798
818
  if (adapter.config.triggerCisternPump) {
799
- adapter.setState('info.cisternState', {
819
+ await adapter.setStateAsync('info.cisternState', {
800
820
  val: `Cistern settings are not active! ${(fillLevelCistern > 0) ? (`level sensor: ${fillLevelCistern}% ${(adapter.config.triggerMinCisternLevel !== '') ? (` ${adapter.config.triggerMinCisternLevel}%`) : ('')}`):('')}`,
801
821
  ack: true
802
822
  });
@@ -805,48 +825,37 @@ const setActualPump = async () => {
805
825
  }
806
826
 
807
827
  case 'cistern': {
808
- if (fillLevelCistern < parseFloat(adapter.config.triggerMinCisternLevel)) { // (Zisterne unter Minimum)
828
+ // Zisterne unter Minimum
829
+ if (fillLevelCistern < parseFloat(adapter.config.triggerMinCisternLevel)) {
809
830
  if (!currentPumpUse.intBreak) {
810
831
  currentPumpUse.intBreak = true;
811
- adapter.log.warn('Cistern empty => irrigation no longer possible');
832
+ adapter.log.info('Cistern empty => irrigation no longer possible');
812
833
  if(!sendMessageText.onlySendError()){
813
834
  sendMessageText.sendMessage('Cistern empty => irrigation no longer possible'); // Zisterne leer => Bewässerung nicht mehr möglich
814
835
  }
815
836
  }
816
- adapter.setState('info.cisternState', {
817
- val: `Cistern empty: ${fillLevelCistern} % (${adapter.config.triggerMinCisternLevel} %)`,
818
- ack: true
819
- });
820
837
  // Pumpe ist eingeschaltet => ausschalten
821
838
  if (currentPumpUse.enable) {
822
839
  await setValve(currentPumpUse, false);
823
840
  updateList(); // Wasserverbrauch an Pumpenleistung anpassen
824
841
  }
842
+ // Zisterne über Minimum
825
843
  } else if (fillLevelCistern > parseFloat(adapter.config.triggerOnCisternLevel)) {
826
844
  if (currentPumpUse.intBreak) {
827
845
  currentPumpUse.intBreak = false;
828
- adapter.log.warn('Cistern filled => irrigation can begin again'); // Zisterne gefüllt => Bewässerung kann wieder beginnen
846
+ adapter.log.info('Cistern filled => irrigation can begin again'); // Zisterne gefüllt => Bewässerung kann wieder beginnen
829
847
  if(!sendMessageText.onlySendError()){
830
848
  sendMessageText.sendMessage('Cistern filled => irrigation can begin again');
831
849
  }
832
850
  }
833
- currentPumpUse.intBreak = false;
834
- adapter.setState('info.cisternState', {
835
- val: `Cistern filled: ${fillLevelCistern} % (${adapter.config.triggerMinCisternLevel} %)`,
836
- ack: true
837
- });
838
- updateList(); // Wasserverbrauch an Pumpenleistung anpassen
839
- } else if (currentPumpUse.intBreak === true) {
840
- adapter.setState('info.cisternState', {
841
- val: `Cistern empty: ${fillLevelCistern} % (${adapter.config.triggerMinCisternLevel} %)`,
842
- ack: true
843
- });
844
- } else {
845
- adapter.setState('info.cisternState', {
846
- val: `Cistern filled: ${fillLevelCistern} % (${adapter.config.triggerMinCisternLevel} %)`,
847
- ack: true
848
- });
851
+ // Wasserverbrauch an Pumpenleistung anpassen
852
+ updateList();
849
853
  }
854
+ /* Info aktualisieren */
855
+ await adapter.setStateAsync('info.cisternState', {
856
+ val: `${ (currentPumpUse.intBreak === true) ? 'Cistern empty: ' : 'Cistern filled: ' } Cistern level: ${ fillLevelCistern } % (${ adapter.config.triggerMinCisternLevel } %)`,
857
+ ack: true
858
+ });
850
859
  break;
851
860
  }
852
861
 
@@ -861,6 +870,8 @@ const setActualPump = async () => {
861
870
  val: currentPumpUse.enable,
862
871
  ack: true
863
872
  });
873
+ } else {
874
+ throw new Error(`Error trigger cistern Pump off [${currentPumpUse.control.idState}]`);
864
875
  }
865
876
  currentPumpUse.pumpCistern = false;
866
877
  currentPumpUse.name = 'Main pump';
@@ -874,6 +885,8 @@ const setActualPump = async () => {
874
885
  val: currentPumpUse.enable,
875
886
  ack: true
876
887
  });
888
+ } else {
889
+ throw new Error(`Error trigger main Pump on [${currentPumpUse.control.idState}]`);
877
890
  }
878
891
  adapter.log.info('Pump change (cistern empty) Cistern pump off => main pump on');
879
892
  if(!sendMessageText.onlySendError()){
@@ -883,45 +896,39 @@ const setActualPump = async () => {
883
896
  }
884
897
  } else {
885
898
  /* Bewässerungspumpen inaktiv */
886
- if ((fillLevelCistern > parseFloat(adapter.config.triggerOnCisternLevel)) && (adapter.config.triggerCisternPump) && (adapter.config.triggerCisternPumpPower)) {
887
- /* Zisterne voll && triggerCisternPump && triggerCisternPumpPower vorhanden*/
888
- adapter.setState('info.cisternState', {
889
- val: `Cistern filled: ${fillLevelCistern} % (${adapter.config.triggerMinCisternLevel} %)`,
890
- ack: true
891
- });
892
- currentPumpUse.pumpCistern = true;
893
- currentPumpUse.name = 'Cistern pump';
894
- currentPumpUse.id = 'info.cisternPump';
895
- currentPumpUse.control = { ...cisternPumpControl };
896
- currentPumpUse.pumpPower = parseInt(adapter.config.triggerCisternPumpPower);
897
-
898
- } else {
899
- adapter.setState('info.cisternState', {
900
- val: `Cistern empty: ${fillLevelCistern} % (adapter.config.triggerMinCisternLevel %)`,
901
- ack: true
902
- });
903
- currentPumpUse.pumpCistern = false;
904
- currentPumpUse.name = 'Main pump';
905
- currentPumpUse.id = 'info.mainPump';
906
- currentPumpUse.control = { ...mainPumpControl };
907
- currentPumpUse.pumpPower = parseInt(adapter.config.triggerMainPumpPower);
899
+ if (fillLevelCistern > parseFloat(adapter.config.triggerOnCisternLevel)) {
900
+ /* Zisterne voll */
901
+ if (currentPumpUse.pumpCistern === false) {
902
+ currentPumpUse.pumpCistern = true;
903
+ currentPumpUse.name = 'Cistern pump';
904
+ currentPumpUse.id = 'info.cisternPump';
905
+ currentPumpUse.control = { ...cisternPumpControl };
906
+ currentPumpUse.pumpPower = parseInt(adapter.config.triggerCisternPumpPower);
907
+ await adapter.setStateAsync('control.restFlow', {
908
+ val: `${currentPumpUse.pumpPower} (${currentPumpUse.pumpPower} | ${currentPumpUse.name})`,
909
+ ack: true
910
+ });
911
+ }
912
+ } else if (fillLevelCistern < parseFloat(adapter.config.triggerMinCisternLevel)) {
913
+ /* Zisterne leer */
914
+ if (currentPumpUse.pumpCistern === true) {
915
+ currentPumpUse.pumpCistern = false;
916
+ currentPumpUse.name = 'Main pump';
917
+ currentPumpUse.id = 'info.mainPump';
918
+ currentPumpUse.control = { ...mainPumpControl };
919
+ currentPumpUse.pumpPower = parseInt(adapter.config.triggerMainPumpPower);
920
+ await adapter.setStateAsync('control.restFlow', {
921
+ val: `${currentPumpUse.pumpPower} (${currentPumpUse.pumpPower} | ${currentPumpUse.name})`,
922
+ ack: true
923
+ });
924
+ }
908
925
  }
909
- adapter.setState('control.restFlow', {
910
- val: `${currentPumpUse.pumpPower} (${currentPumpUse.pumpPower} | ${currentPumpUse.name})`,
911
- ack: true
912
- });
913
- }
914
- if (currentPumpUse.pumpCistern) {
915
- adapter.setState('info.cisternState', {
916
- val: `Cistern filled: ${fillLevelCistern} % (${adapter.config.triggerMinCisternLevel} %)`,
917
- ack: true
918
- });
919
- } else {
920
- adapter.setState('info.cisternState', {
921
- val: `Cistern empty: ${fillLevelCistern} % (${adapter.config.triggerMinCisternLevel} %)`,
922
- ack: true
923
- });
924
926
  }
927
+ /* Info aktualisieren */
928
+ await adapter.setStateAsync('info.cisternState', {
929
+ val: `${ (currentPumpUse.pumpCistern === false) ? 'Cistern empty: ' : 'Cistern filled: ' } Cistern level: ${ fillLevelCistern } % (${ adapter.config.triggerMinCisternLevel } %)`,
930
+ ack: true
931
+ });
925
932
  break;
926
933
  }
927
934
  }
@@ -1135,8 +1142,8 @@ const valveControl = {
1135
1142
  const _actualValueLevel = await adapter.getForeignStateAsync(adapter.config.actualValueLevel);
1136
1143
  if (_actualValueLevel && _actualValueLevel.val) {
1137
1144
  if (typeof _actualValueLevel.val === 'number') {
1138
- fillLevelCistern = _actualValueLevel.val;
1139
- (_actualValueLevel.val > parseInt(adapter.config.triggerMinCisternLevel)) ? currentPumpUse.intBreak = false : currentPumpUse.intBreak = true;
1145
+ fillLevelCistern = parseInt(_actualValueLevel.val);
1146
+ (fillLevelCistern > parseInt(adapter.config.triggerMinCisternLevel)) ? currentPumpUse.intBreak = false : currentPumpUse.intBreak = true;
1140
1147
  } else if (typeof _actualValueLevel.val === 'boolean') {
1141
1148
  if (_actualValueLevel.val) {
1142
1149
  currentPumpUse.intBreak = false;
@@ -1163,6 +1170,19 @@ const valveControl = {
1163
1170
  currentPumpUse.leadTime = (parseInt(adapter.config.cisternPumpLeadTime) || 5) * 1000;
1164
1171
  currentPumpUse.pumpPower = parseInt(adapter.config.triggerCisternPumpPower) || 0;
1165
1172
  currentPumpUse.restFlow = parseInt(adapter.config.triggerCisternPumpPower) || 0;
1173
+ if (isNaN(parseInt(adapter.config.triggerMinCisternLevel))
1174
+ || (parseInt(adapter.config.triggerMinCisternLevel) <= 1)
1175
+ || (parseInt(adapter.config.triggerMinCisternLevel) > 100)
1176
+ ) {
1177
+ adapter.log.error(`Pump selection "cistern" is selected, but the minimum cistern level is set to ${adapter.config.triggerMinCisternLevel}%. Please set the minimum cistern level to 1...100% or select another pump selection!`);
1178
+ }
1179
+ if (isNaN(parseInt(adapter.config.triggerOnCisternLevel))
1180
+ || (parseInt(adapter.config.triggerOnCisternLevel) <= parseInt(adapter.config.triggerMinCisternLevel))
1181
+ || (parseInt(adapter.config.triggerOnCisternLevel) > 100)
1182
+ || (parseInt(adapter.config.triggerOnCisternLevel) < 5)
1183
+ ) {
1184
+ adapter.log.error(`Pump selection "cistern" is selected, but the trigger on cistern level is set to ${adapter.config.triggerOnCisternLevel}%. Please set the trigger on cistern level to ${parseInt(adapter.config.triggerMinCisternLevel) + 5}...100% or select another pump selection!`);
1185
+ }
1166
1186
  // @ts-ignore
1167
1187
  await adapter.setObjectNotExistsAsync(`info.cisternPump`, objCisternPump);
1168
1188
  const _mainPump = await adapter.getObjectAsync(`info.mainPump`);
@@ -1176,12 +1196,26 @@ const valveControl = {
1176
1196
  cisternPumpControl = await tools.idStateControl(adapter, adapter.config.triggerCisternPump);
1177
1197
  if (mainPumpControl?.idACK) adapter.subscribeForeignStates(mainPumpControl.idACK);
1178
1198
  if (cisternPumpControl?.idACK) adapter.subscribeForeignStates(cisternPumpControl.idACK);
1199
+ /* Kontrolle der Konfiguration CisternLevel */
1200
+ if (isNaN(parseInt(adapter.config.triggerMinCisternLevel))
1201
+ || (parseInt(adapter.config.triggerMinCisternLevel) <= 1)
1202
+ || (parseInt(adapter.config.triggerMinCisternLevel) > 100)
1203
+ ) {
1204
+ adapter.log.error(`Pump selection "mainpump & cistern" is selected, but the minimum cistern level is set to ${adapter.config.triggerMinCisternLevel}%. Please set the minimum cistern level to 1...100% or select another pump selection!`);
1205
+ }
1206
+ if (isNaN(parseInt(adapter.config.triggerOnCisternLevel))
1207
+ || (parseInt(adapter.config.triggerOnCisternLevel) <= parseInt(adapter.config.triggerMinCisternLevel))
1208
+ || (parseInt(adapter.config.triggerOnCisternLevel) > 100)
1209
+ || (parseInt(adapter.config.triggerOnCisternLevel) < 5)
1210
+ ) {
1211
+ adapter.log.error(`Pump selection "cistern" is selected, but the trigger on cistern level is set to ${adapter.config.triggerOnCisternLevel}%. Please set the trigger on cistern level to ${parseInt(adapter.config.triggerMinCisternLevel) + 5}...100% or select another pump selection!`);
1212
+ }
1179
1213
  if (adapter.config.actualValueLevel) {
1180
1214
  /* Füllstand der Zisterne in % holen */
1181
1215
  const _actualValueLevel = await adapter.getForeignStateAsync(adapter.config.actualValueLevel);
1182
- if (_actualValueLevel && _actualValueLevel.val) {
1216
+ if (_actualValueLevel?.val) {
1183
1217
  if (typeof _actualValueLevel.val === 'number') {
1184
- fillLevelCistern = _actualValueLevel.val;
1218
+ fillLevelCistern = parseInt(_actualValueLevel.val);
1185
1219
  } else if (typeof _actualValueLevel.val === 'boolean') {
1186
1220
  _actualValueLevel.val ? fillLevelCistern = 100 : fillLevelCistern = 0;
1187
1221
  } else {
@@ -1229,7 +1263,7 @@ const valveControl = {
1229
1263
  }
1230
1264
  }
1231
1265
  /* Objekt control.restFlow befüllen */
1232
- adapter.setStateAsync('control.restFlow', {
1266
+ await adapter.setStateAsync('control.restFlow', {
1233
1267
  val: `${currentPumpUse.pumpPower} (${currentPumpUse.pumpPower} | ${currentPumpUse.name})`,
1234
1268
  ack: true
1235
1269
  });
@@ -1377,7 +1411,7 @@ const valveControl = {
1377
1411
  /** 0:"off", 1:"wait", 2:"on", 3:"break", 4:"Boost(on)", 5:"off(Boost)", 6:"Cistern empty", 7:"extBreak" */
1378
1412
  newThread.state = 'wait'; // zustand des Ventils Softwaremäßig
1379
1413
  newThread.enable = false; // zustand des Ventil softwaremäßig
1380
- newThread.myBreak = false; // meine interne Pause
1414
+ newThread.myBreak = false; // meine interne Pause Intervallberegnung
1381
1415
  newThread.extBreak = myConfig.config[res.sprinkleID].extBreak; // extBreak wird über .sprinkle.*.extBreak geschaltet
1382
1416
  newThread.killSprinkle = false; // Löschauftrag ausführen am Ende in threadList
1383
1417
  newThread.litersPerSecond = myConfig.config[res.sprinkleID].pipeFlow / 3600; // Wasserverbrauchsmenge pro Sekunde
@@ -1591,15 +1625,26 @@ const valveControl = {
1591
1625
  * @param {number|string|boolean} levelCistern
1592
1626
  */
1593
1627
  setFillLevelCistern: function (levelCistern) {
1594
- adapter.log.debug(`setFillLevelCistern: ${levelCistern}`);
1628
+ let myFillLevelCistern = 0;
1629
+ adapter.log.debug(`setFillLevelCistern: ${ levelCistern }`);
1595
1630
  if(typeof levelCistern === 'number') {
1596
- fillLevelCistern = levelCistern;
1631
+ myFillLevelCistern = parseInt(levelCistern);
1597
1632
  }else if(typeof levelCistern === 'string') {
1598
- fillLevelCistern = parseFloat(levelCistern);
1633
+ myFillLevelCistern = parseInt(levelCistern);
1599
1634
  }else if(typeof levelCistern === 'boolean') {
1600
- (levelCistern === true) ? fillLevelCistern = 100 : fillLevelCistern = 0;
1635
+ (levelCistern === true) ? myFillLevelCistern = 100 : myFillLevelCistern = 0;
1636
+ }
1637
+ if(typeof myFillLevelCistern !== "number"
1638
+ || myFillLevelCistern < 0
1639
+ || myFillLevelCistern > 100
1640
+ ) {
1641
+ adapter.log.warn(`setFillLevelCistern (0...100% || true/false) => Wrong value: ${ levelCistern }, Type: ${ typeof levelCistern }`);
1642
+ return;
1643
+ }
1644
+ if (myFillLevelCistern != fillLevelCistern) {
1645
+ fillLevelCistern = myFillLevelCistern;
1646
+ setActualPump();
1601
1647
  }
1602
- setActualPump();
1603
1648
  }, // End setFillLevelCistern
1604
1649
 
1605
1650
  /**
package/main.js CHANGED
@@ -166,8 +166,8 @@ function startAdapter(options) {
166
166
  }
167
167
  }
168
168
  // Füllstand der Zisterne bei Statusänderung
169
- if (adapter?.config?.actualValueLevel && (id === adapter.config.actualValueLevel)) {
170
- valveControl.setFillLevelCistern(parseFloat(state?.val) || 0);
169
+ if (adapter.config?.actualValueLevel && (id === adapter.config.actualValueLevel)) {
170
+ valveControl.setFillLevelCistern(state.val);
171
171
  //fillLevelCistern = state.val || 0;
172
172
  }
173
173
  // Rückmeldungen mit ack === False
@@ -336,15 +336,15 @@ function startAdapter(options) {
336
336
  }
337
337
  }
338
338
  // Druckentlastungsventil
339
- if (id === pressureReliefValve.control.idACK && typeof pressureReliefValve.controller.ackTrue === 'function') {
339
+ if (id === pressureReliefValve?.control?.idACK && typeof pressureReliefValve.controller.ackTrue === 'function') {
340
340
  pressureReliefValve.controller.ackTrue(state);
341
341
  }
342
342
  // 24V Steuerspannung
343
- if (id === controlVoltage.control.idACK && typeof controlVoltage.controller.ackTrue === 'function') {
343
+ if (id === controlVoltage?.control?.idACK && typeof controlVoltage.controller.ackTrue === 'function') {
344
344
  controlVoltage.controller.ackTrue(state);
345
345
  }
346
346
  // Pumpe (aktuell verwendete Pumpe)
347
- if (id === currentPumpUse.control.idACK && typeof currentPumpUse.controller.ackTrue === 'function') {
347
+ if (id === currentPumpUse?.control?.idACK && typeof currentPumpUse.controller.ackTrue === 'function') {
348
348
  currentPumpUse.controller.ackTrue(state);
349
349
  }
350
350
  // The state was deleted
@@ -392,9 +392,15 @@ function startAdapter(options) {
392
392
  * daher können wir bei Bedarf andere Einstellungen als das System verwenden
393
393
  */
394
394
  async function GetSystemData() {
395
- if (typeof adapter.config.longitude === 'undefined' || adapter.config.longitude === null || adapter.config.longitude.length === 0 || isNaN(+adapter.config.longitude)
396
- || typeof adapter.config.latitude === 'undefined' || adapter.config.latitude === null || adapter.config.latitude.length === 0 || isNaN(+adapter.config.latitude)) {
397
-
395
+ if (typeof adapter.config.longitude === 'undefined'
396
+ || adapter.config.longitude === null
397
+ || adapter.config.longitude.length === 0
398
+ || isNaN(adapter.config.longitude)
399
+ || typeof adapter.config.latitude === 'undefined'
400
+ || adapter.config.latitude === null
401
+ || adapter.config.latitude.length === 0
402
+ || isNaN(adapter.config.latitude)
403
+ ) {
398
404
  try {
399
405
  const obj = await adapter.getForeignObjectAsync('system.config', 'state');
400
406
 
@@ -423,44 +429,48 @@ async function GetSystemData() {
423
429
  * @param returnOn
424
430
  */
425
431
  async function curNextFixDay (sprinkleID, returnOn) {
426
- const weekDayArray = myConfig.config[sprinkleID].fixDay.startFixDay;
427
- const objPfad = `sprinkle.${myConfig.config[sprinkleID].objectName}`;
428
- const weekday = ['Sun','Mon','Tue','Wed','Thur','Fri','Sat'];
429
- let found = false;
430
- let curDay = tools.formatTime().day;
431
- const d = new Date();
432
- const curTime = `${zweiStellen(d.getHours())}:${zweiStellen(d.getMinutes())}`;
433
-
434
- function zweiStellen (s) {
435
- while (s.toString().length < 2) {
436
- s = `0${s}`;
437
- }
438
- return s;
439
- }
440
- if (curTime >= startTimeStr) {
441
- curDay++;
442
- }
443
-
444
- for ( let i=0; i<7; i++ ) {
445
- if (curDay > 6) {
446
- curDay = curDay - 7;
432
+ try {
433
+ const weekDayArray = myConfig.config[sprinkleID].fixDay.startFixDay;
434
+ const objPfad = `sprinkle.${myConfig.config[sprinkleID].objectName}`;
435
+ const weekday = ['Sun','Mon','Tue','Wed','Thur','Fri','Sat'];
436
+ let found = false;
437
+ let curDay = tools.formatTime().day;
438
+ const d = new Date();
439
+ const curTime = `${zweiStellen(d.getHours())}:${zweiStellen(d.getMinutes())}`;
440
+
441
+ function zweiStellen (s) {
442
+ while (s.toString().length < 2) {
443
+ s = `0${s}`;
444
+ }
445
+ return s;
447
446
  }
448
- if (weekDayArray[curDay] === true) {
449
- found = true;
450
- if (returnOn) {
451
- return weekday[curDay];
452
- } else {
453
- adapter.setState(`${objPfad}.actualSoilMoisture`, {
454
- val: curDay,
455
- ack: true
456
- });
447
+ if (curTime >= startTimeStr) {
448
+ curDay++;
449
+ }
450
+
451
+ for ( let i=0; i<7; i++ ) {
452
+ if (curDay > 6) {
453
+ curDay = curDay - 7;
457
454
  }
458
- break;
455
+ if (weekDayArray[curDay] === true) {
456
+ found = true;
457
+ if (returnOn) {
458
+ return weekday[curDay];
459
+ } else {
460
+ adapter.setState(`${objPfad}.actualSoilMoisture`, {
461
+ val: curDay,
462
+ ack: true
463
+ });
464
+ }
465
+ break;
466
+ }
467
+ curDay++;
459
468
  }
460
- curDay++;
461
- }
462
- if (returnOn && found === false) {
463
- return 'off';
469
+ if (returnOn && found === false) {
470
+ return 'off';
471
+ }
472
+ } catch (error) {
473
+ adapter.log.error(`Error curNextFixDay: ${error}`);
464
474
  }
465
475
  }
466
476
 
@@ -569,7 +579,7 @@ async function checkStates() {
569
579
 
570
580
  /* evaporation.dailyHighTemp */
571
581
  const _dailyHighTemp = await adapter.getStateAsync('evaporation.dailyHighTemp');
572
- if (_dailyHighTemp?.val) {
582
+ if (_dailyHighTemp?.val && typeof _dailyHighTemp.val === 'number') {
573
583
  evaporation.setCurTemperatureMax(+_dailyHighTemp.val);
574
584
  } else {
575
585
  evaporation.setCurTemperatureMax(0);
@@ -2123,7 +2133,7 @@ async function delOldSprinklers(result) {
2123
2133
  */
2124
2134
  const delWhenExistObjectAsync = async (id, type) => {
2125
2135
  const _find = await adapter.findForeignObjectAsync(`${id}`, `${type}`);
2126
- if (_find && _find.id === `${id}`) {
2136
+ if (_find?.id === `${id}`) {
2127
2137
  await adapter.delObjectAsync(`${id}`).catch((e) => adapter.log.warn(e)); // "sprinklecontrol.0.sprinkle.???.postponeByOneDay"
2128
2138
  }
2129
2139
  };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "iobroker.sprinklecontrol",
3
- "version": "1.0.5",
3
+ "version": "1.0.6",
4
4
  "description": "Control of several sprinklers depending on weather conditions and pump performance.",
5
5
  "author": {
6
6
  "name": "Dirk Peter",
@@ -34,12 +34,12 @@
34
34
  "suncalc": "^1.9.0"
35
35
  },
36
36
  "devDependencies": {
37
- "@alcalzone/release-script": "^5.1.1",
38
- "@alcalzone/release-script-plugin-iobroker": "^5.1.2",
39
- "@alcalzone/release-script-plugin-license": "^5.1.1",
40
- "@alcalzone/release-script-plugin-manual-review": "^5.1.1",
37
+ "@alcalzone/release-script": "^5.2.0",
38
+ "@alcalzone/release-script-plugin-iobroker": "^5.2.0",
39
+ "@alcalzone/release-script-plugin-license": "^5.2.0",
40
+ "@alcalzone/release-script-plugin-manual-review": "^5.2.0",
41
41
  "@iobroker/adapter-dev": "^1.5.0",
42
- "@iobroker/eslint-config": "^2.2.0",
42
+ "@iobroker/eslint-config": "^2.3.4",
43
43
  "@iobroker/testing": "^5.2.2"
44
44
  },
45
45
  "main": "main.js",