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 +5 -6
- package/admin/i18n/de/translations.json +1 -0
- package/admin/i18n/en/translations.json +2 -1
- package/admin/i18n/es/translations.json +1 -0
- package/admin/i18n/fr/translations.json +1 -0
- package/admin/i18n/it/translations.json +1 -0
- package/admin/i18n/nl/translations.json +1 -0
- package/admin/i18n/pl/translations.json +1 -0
- package/admin/i18n/pt/translations.json +1 -0
- package/admin/i18n/ru/translations.json +1 -0
- package/admin/i18n/uk/translations.json +1 -0
- package/admin/i18n/zh-cn/translations.json +1 -0
- package/admin/index_m.html +1 -1
- package/admin/index_m.js +1 -1
- package/admin/words.js +3 -2
- package/io-package.json +14 -14
- package/lib/evaporation.js +2 -2
- package/lib/valveControl.js +129 -84
- package/main.js +55 -45
- package/package.json +6 -6
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
|
-
|
|
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": "
|
|
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": "阀门控制电压",
|
package/admin/index_m.html
CHANGED
|
@@ -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">
|
|
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
package/admin/words.js
CHANGED
|
@@ -8,7 +8,7 @@
|
|
|
8
8
|
'use strict';
|
|
9
9
|
|
|
10
10
|
systemDictionary = {
|
|
11
|
-
"1. Start time": { "en": "",
|
|
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": "
|
|
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.
|
|
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": {
|
package/lib/evaporation.js
CHANGED
|
@@ -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 >
|
|
355
|
-
adapter.log.warn('Humidity outside the range of 1 ...
|
|
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)) {
|
package/lib/valveControl.js
CHANGED
|
@@ -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
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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.
|
|
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
|
-
|
|
828
|
+
// Zisterne unter Minimum
|
|
829
|
+
if (fillLevelCistern < parseFloat(adapter.config.triggerMinCisternLevel)) {
|
|
809
830
|
if (!currentPumpUse.intBreak) {
|
|
810
831
|
currentPumpUse.intBreak = true;
|
|
811
|
-
adapter.log.
|
|
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.
|
|
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
|
-
|
|
834
|
-
|
|
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 (
|
|
887
|
-
/* Zisterne voll
|
|
888
|
-
|
|
889
|
-
|
|
890
|
-
|
|
891
|
-
|
|
892
|
-
|
|
893
|
-
|
|
894
|
-
|
|
895
|
-
|
|
896
|
-
|
|
897
|
-
|
|
898
|
-
|
|
899
|
-
|
|
900
|
-
|
|
901
|
-
|
|
902
|
-
|
|
903
|
-
|
|
904
|
-
|
|
905
|
-
|
|
906
|
-
|
|
907
|
-
|
|
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
|
-
(
|
|
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
|
|
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
|
-
|
|
1628
|
+
let myFillLevelCistern = 0;
|
|
1629
|
+
adapter.log.debug(`setFillLevelCistern: ${ levelCistern }`);
|
|
1595
1630
|
if(typeof levelCistern === 'number') {
|
|
1596
|
-
|
|
1631
|
+
myFillLevelCistern = parseInt(levelCistern);
|
|
1597
1632
|
}else if(typeof levelCistern === 'string') {
|
|
1598
|
-
|
|
1633
|
+
myFillLevelCistern = parseInt(levelCistern);
|
|
1599
1634
|
}else if(typeof levelCistern === 'boolean') {
|
|
1600
|
-
(levelCistern === true) ?
|
|
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
|
|
170
|
-
valveControl.setFillLevelCistern(
|
|
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
|
|
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
|
|
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
|
|
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'
|
|
396
|
-
||
|
|
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
|
-
|
|
427
|
-
|
|
428
|
-
|
|
429
|
-
|
|
430
|
-
|
|
431
|
-
|
|
432
|
-
|
|
433
|
-
|
|
434
|
-
|
|
435
|
-
|
|
436
|
-
|
|
437
|
-
|
|
438
|
-
|
|
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 (
|
|
449
|
-
|
|
450
|
-
|
|
451
|
-
|
|
452
|
-
|
|
453
|
-
|
|
454
|
-
|
|
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
|
-
|
|
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
|
-
|
|
461
|
-
|
|
462
|
-
|
|
463
|
-
|
|
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
|
|
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.
|
|
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.
|
|
38
|
-
"@alcalzone/release-script-plugin-iobroker": "^5.
|
|
39
|
-
"@alcalzone/release-script-plugin-license": "^5.
|
|
40
|
-
"@alcalzone/release-script-plugin-manual-review": "^5.
|
|
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.
|
|
42
|
+
"@iobroker/eslint-config": "^2.3.4",
|
|
43
43
|
"@iobroker/testing": "^5.2.2"
|
|
44
44
|
},
|
|
45
45
|
"main": "main.js",
|