iobroker.poolcontrol 1.2.21 → 1.3.0
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 +15 -9
- package/io-package.json +27 -27
- package/lib/helpers/solarExtendedHelper.js +285 -0
- package/lib/helpers/solarHelper.js +50 -8
- package/lib/i18n/de.json +37 -1
- package/lib/i18n/en.json +37 -1
- package/lib/i18n/es.json +37 -1
- package/lib/i18n/fr.json +37 -1
- package/lib/i18n/it.json +37 -1
- package/lib/i18n/nl.json +37 -1
- package/lib/i18n/pl.json +37 -1
- package/lib/i18n/pt.json +37 -1
- package/lib/i18n/ru.json +37 -1
- package/lib/i18n/uk.json +37 -1
- package/lib/i18n/zh-cn.json +37 -1
- package/lib/stateDefinitions/solarExtendedStates.js +552 -0
- package/lib/stateDefinitions/solarStates.js +58 -2
- package/main.js +7 -0
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -186,6 +186,21 @@ New features are added regularly – please refer to the changelog.
|
|
|
186
186
|
- [help.md (detailed description and notes)](./help.md)
|
|
187
187
|
|
|
188
188
|
---
|
|
189
|
+
### 1.3.0 (2026-04-16)
|
|
190
|
+
|
|
191
|
+
- Added extended solar control (delta-based temperature logic)
|
|
192
|
+
- Support for external actuator control (boolean/socket)
|
|
193
|
+
- Standard / Extended solar mode selection
|
|
194
|
+
- Priority and blocking logic (controlHelper, timeHelper, pump mode, season)
|
|
195
|
+
- Improved status states (active, request, blocked, reason, info)
|
|
196
|
+
- Added i18n support for solar extended status texts
|
|
197
|
+
- Added selectable configuration for temperature source and control type
|
|
198
|
+
|
|
199
|
+
### 1.2.22 (2026-04-16)
|
|
200
|
+
|
|
201
|
+
- Added new read-only state `solar.request_active` to indicate when solar logic would request the pump
|
|
202
|
+
- Improved solarHelper robustness by handling invalid temperature values
|
|
203
|
+
|
|
189
204
|
### 1.2.21 (2026-04-15)
|
|
190
205
|
|
|
191
206
|
- Fixed photovoltaic afterrun timer restarting on every recalculation without PV surplus
|
|
@@ -204,15 +219,6 @@ Release: 10.04.2026
|
|
|
204
219
|
- `photovoltaic.threshold_w` is now correctly synchronized with the instance configuration
|
|
205
220
|
- Changes to the PV surplus threshold in adapter settings are now reliably reflected in the corresponding read-only datapoint
|
|
206
221
|
|
|
207
|
-
### 1.2.18
|
|
208
|
-
Release: 07.04.2026
|
|
209
|
-
- Fixed persistence issue for `status.season_active` (no longer overwritten on adapter start)
|
|
210
|
-
- Improved persistence for frost protection settings
|
|
211
|
-
|
|
212
|
-
### 1.2.17
|
|
213
|
-
Release: 07.04.2026
|
|
214
|
-
- Fix: Resolved an issue where the pressure learning reset button did not trigger reliably. The pumpHelper4 now explicitly subscribes to its relevant internal states to ensure proper event handling.
|
|
215
|
-
|
|
216
222
|
## Support
|
|
217
223
|
- [ioBroker Forum](https://forum.iobroker.net/)
|
|
218
224
|
- [GitHub Issues](https://github.com/DasBo1975/ioBroker.poolcontrol/issues)
|
package/io-package.json
CHANGED
|
@@ -1,8 +1,34 @@
|
|
|
1
1
|
{
|
|
2
2
|
"common": {
|
|
3
3
|
"name": "poolcontrol",
|
|
4
|
-
"version": "1.
|
|
4
|
+
"version": "1.3.0",
|
|
5
5
|
"news": {
|
|
6
|
+
"1.3.0": {
|
|
7
|
+
"en": "Added extended solar control with selectable standard/extended mode, delta-based control logic, external actuator support, priority/blocking handling, and localized status texts.",
|
|
8
|
+
"de": "Erweiterte Solarsteuerung ergänzt mit wählbarem Standard-/Extended-Modus, differenzbasierter Regelung, externer Aktor-Ansteuerung, Vorrang-/Blockierlogik und lokalisierten Statusmeldungen.",
|
|
9
|
+
"ru": "Добавлено расширенное управление солнечной батареей с возможностью выбора стандартного/расширенного режима, логикой управления на основе дельты, поддержкой внешнего исполнительного механизма, обработкой приоритета/блокировки и локализованными текстами состояния.",
|
|
10
|
+
"pt": "Adicionado controle solar estendido com modo padrão/estendido selecionável, lógica de controle baseada em delta, suporte a atuador externo, tratamento de prioridade/bloqueio e textos de status localizados.",
|
|
11
|
+
"nl": "Uitgebreide zonneregeling toegevoegd met selecteerbare standaard/uitgebreide modus, op delta gebaseerde besturingslogica, ondersteuning voor externe actuatoren, afhandeling van prioriteiten/blokkeringen en gelokaliseerde statusteksten.",
|
|
12
|
+
"fr": "Ajout d'un contrôle solaire étendu avec mode standard/étendu sélectionnable, logique de contrôle basée sur le delta, prise en charge d'actionneurs externes, gestion des priorités/blocages et textes d'état localisés.",
|
|
13
|
+
"it": "Aggiunto controllo solare esteso con modalità standard/estesa selezionabile, logica di controllo basata su delta, supporto per attuatori esterni, gestione priorità/blocco e testi di stato localizzati.",
|
|
14
|
+
"es": "Se agregó control solar extendido con modo estándar/extendido seleccionable, lógica de control basada en delta, soporte de actuador externo, manejo de prioridad/bloqueo y textos de estado localizados.",
|
|
15
|
+
"pl": "Dodano rozszerzone sterowanie solarne z możliwością wyboru trybu standardowego/rozszerzonego, logikę sterowania opartą na delta, obsługę zewnętrznych siłowników, obsługę priorytetów/blokowania i zlokalizowane teksty stanu.",
|
|
16
|
+
"uk": "Додано розширене керування геліосистемою з вибором стандартного/розширеного режиму, логікою керування на основі дельти, підтримкою зовнішнього приводу, обробкою пріоритетів/блокування та локалізованими текстами стану.",
|
|
17
|
+
"zh-cn": "添加了扩展太阳能控制,具有可选的标准/扩展模式、基于增量的控制逻辑、外部执行器支持、优先级/阻止处理和本地化状态文本。"
|
|
18
|
+
},
|
|
19
|
+
"1.2.22": {
|
|
20
|
+
"en": "Added new read-only state solar.request_active to indicate when solar logic would request the pump. Improved robustness of solarHelper by handling invalid temperature values.",
|
|
21
|
+
"de": "Neuer read-only Datenpunkt solar.request_active hinzugefügt, der anzeigt, wann die Solarlogik die Pumpe anfordern würde. Stabilität des solarHelpers verbessert durch Behandlung ungültiger Temperaturwerte.",
|
|
22
|
+
"ru": "Добавлено новое состояние Solar.request_active, доступное только для чтения, чтобы указать, когда солнечная логика запросит насос. Повышена надежность SolarHelper за счет обработки недопустимых значений температуры.",
|
|
23
|
+
"pt": "Adicionado novo estado somente leitura solar.request_active para indicar quando a lógica solar solicitaria a bomba. Robustez aprimorada do solarHelper ao lidar com valores de temperatura inválidos.",
|
|
24
|
+
"nl": "Nieuwe alleen-lezen status solar.request_active toegevoegd om aan te geven wanneer de zonnelogica de pomp zou aanvragen. Verbeterde robuustheid van solarHelper door ongeldige temperatuurwaarden te verwerken.",
|
|
25
|
+
"fr": "Ajout d'un nouvel état en lecture seule solar.request_active pour indiquer quand la logique solaire demanderait la pompe. Robustesse améliorée de solarHelper en gérant des valeurs de température invalides.",
|
|
26
|
+
"it": "Aggiunto nuovo stato di sola lettura solar.request_active per indicare quando la logica solare richiederebbe la pompa. Robustezza migliorata di solarHelper gestendo valori di temperatura non validi.",
|
|
27
|
+
"es": "Se agregó un nuevo estado de solo lectura solar.request_active para indicar cuándo la lógica solar solicitaría la bomba. Robustez mejorada de solarHelper al manejar valores de temperatura no válidos.",
|
|
28
|
+
"pl": "Dodano nowy stan tylko do odczytu solar.request_active, aby wskazać, kiedy logika solarna zażąda pompy. Poprawiona niezawodność solarHelper poprzez obsługę nieprawidłowych wartości temperatur.",
|
|
29
|
+
"uk": "Додано новий стан solar.request_active лише для читання, щоб вказати, коли сонячна логіка запитуватиме насос. Покращена надійність solarHelper завдяки обробці недійсних значень температури.",
|
|
30
|
+
"zh-cn": "添加了新的只读状态 Solar.request_active 以指示太阳能逻辑何时请求泵。通过处理无效温度值提高了 SolarHelper 的稳健性。"
|
|
31
|
+
},
|
|
6
32
|
"1.2.21": {
|
|
7
33
|
"en": "Bugfix: Fixed an issue in the photovoltaic helper where the afterrun timer was unintentionally restarted on every recalculation without PV surplus. This could delay the pump shutdown significantly. The afterrun now starts only once when surplus ends and runs reliably to completion. Also ensures proper cleanup when surplus becomes active again during afterrun.",
|
|
8
34
|
"de": "Bugfix: Fehler im Photovoltaik-Helper behoben, bei dem der Nachlauf-Timer bei jedem Recalc ohne PV-Überschuss erneut gestartet wurde. Dadurch konnte sich das Abschalten der Pumpe stark verzögern. Der Nachlauf startet jetzt nur noch einmal beim Wegfall des Überschusses und läuft zuverlässig zu Ende. Zusätzlich wird der Nachlauf sauber beendet, wenn währenddessen wieder Überschuss vorhanden ist.",
|
|
@@ -41,32 +67,6 @@
|
|
|
41
67
|
"pl": "Wydanie poprawek błędów. Rozwiązuje problem interakcji pomiędzy photovoltaicHelper i controlHelper, powodujący nieoczekiwane przerwanie automatycznego pompowania uzupełniającego. Logika zatrzymania fotowoltaiki uwzględnia teraz priorytet ControlHelper i nie zatrzymuje już pompy, gdy aktywne jest automatyczne pompowanie uzupełniające. Ponadto stan tylko do odczytu photovoltaic.threshold_w jest teraz poprawnie zsynchronizowany z konfiguracją instancji, dzięki czemu zmiany w ustawieniach adaptera są niezawodnie odzwierciedlane w widocznym punkcie danych.",
|
|
42
68
|
"uk": "Реліз виправлення помилок. Вирішує проблему взаємодії між photovoltaicHelper і controlHelper, через яку автоматичне подальше відкачування може бути несподівано перервано. Логіка фотоелектричної зупинки тепер враховує пріоритет controlHelper і більше не зупиняє насос, поки активна автоматична подальша перекачування. Крім того, стан тільки для читання photovoltaic.threshold_w тепер правильно синхронізовано з конфігурацією екземпляра, щоб зміни в налаштуваннях адаптера надійно відображалися у видимій точці даних.",
|
|
43
69
|
"zh-cn": "错误修复版本。修复了 PVHelper 和 controlHelper 之间的交互问题,其中自动后续泵送可能会意外中断。光伏停止逻辑现在尊重 controlHelper 优先级,并且在自动后续泵送处于活动状态时不再停止泵。此外,只读状态 PV.threshold_w 现在已与实例配置正确同步,以便适配器设置中的更改能够可靠地反映在可见数据点中。"
|
|
44
|
-
},
|
|
45
|
-
"1.2.18": {
|
|
46
|
-
"en": "Fixed persistence issues for season and frost states. Season_active is now no longer overwritten on adapter start. Frost protection settings are now stored persistently.",
|
|
47
|
-
"de": "Persistenzprobleme für Saison- und Frost-States behoben. season_active wird beim Adapterstart nicht mehr überschrieben. Frostschutz-Einstellungen werden nun dauerhaft gespeichert.",
|
|
48
|
-
"ru": "Исправлены проблемы с постоянством состояний сезона и заморозков. Season_active теперь больше не перезаписывается при запуске адаптера. Настройки защиты от замерзания теперь сохраняются постоянно.",
|
|
49
|
-
"pt": "Corrigidos problemas de persistência para estados sazonais e de geada. Season_active agora não é mais substituído na inicialização do adaptador. As configurações de proteção contra congelamento agora são armazenadas de forma persistente.",
|
|
50
|
-
"nl": "Vaste persistentieproblemen voor seizoens- en vorsttoestanden. Season_active wordt nu niet langer overschreven bij het starten van de adapter. De vorstbeveiligingsinstellingen worden nu permanent opgeslagen.",
|
|
51
|
-
"fr": "Correction de problèmes de persistance pour les états de saison et de gel. Season_active n’est désormais plus écrasé au démarrage de l’adaptateur. Les paramètres de protection contre le gel sont désormais stockés de manière persistante.",
|
|
52
|
-
"it": "Risolti i problemi di persistenza relativi alla stagione e agli stati di gelo. Season_active ora non viene più sovrascritto all'avvio dell'adattatore. Le impostazioni della protezione antigelo vengono ora memorizzate in modo persistente.",
|
|
53
|
-
"es": "Se corrigieron problemas de persistencia para los estados de temporada y heladas. Season_active ya no se sobrescribe al iniciar el adaptador. Los ajustes de protección contra heladas ahora se almacenan de forma persistente.",
|
|
54
|
-
"pl": "Naprawiono problemy z trwałością stanów pór roku i mrozu. Sezon_aktywny nie jest już nadpisywany podczas uruchamiania adaptera. Ustawienia ochrony przed zamarzaniem są teraz przechowywane trwale.",
|
|
55
|
-
"uk": "Виправлено проблеми стійкості для сезону та морозу. Season_active тепер більше не перезаписується під час запуску адаптера. Параметри захисту від замерзання тепер зберігаються постійно.",
|
|
56
|
-
"zh-cn": "修复了季节和霜冻状态的持久性问题。 Season_active 现在不再在适配器启动时被覆盖。防霜保护设置现在可以永久存储。"
|
|
57
|
-
},
|
|
58
|
-
"1.2.17": {
|
|
59
|
-
"en": "Fix: Resolved an issue where the pressure learning reset button did not trigger reliably. The pumpHelper4 now explicitly subscribes to its relevant internal states (e.g. reset and configuration values), ensuring proper event handling and immediate execution of the reset logic.",
|
|
60
|
-
"de": "Fix: Problem behoben, bei dem der Reset-Button für das Druck-Lernsystem nicht zuverlässig ausgelöst wurde. Der pumpHelper4 abonniert nun explizit die relevanten eigenen States (z. B. Reset und Konfigurationswerte), wodurch die Eventverarbeitung und die sofortige Ausführung der Reset-Logik sichergestellt sind.",
|
|
61
|
-
"ru": "Исправление: решена проблема, из-за которой кнопка сброса обучения давлению не срабатывала надежно. PumpHelper4 теперь явно подписывается на соответствующие внутренние состояния (например, значения сброса и конфигурации), обеспечивая правильную обработку событий и немедленное выполнение логики сброса.",
|
|
62
|
-
"pt": "Correção: Resolvido um problema em que o botão de redefinição do aprendizado de pressão não acionava de maneira confiável. O pumpHelper4 agora assina explicitamente seus estados internos relevantes (por exemplo, valores de redefinição e configuração), garantindo o tratamento adequado de eventos e a execução imediata da lógica de redefinição.",
|
|
63
|
-
"nl": "Oplossing: een probleem opgelost waarbij de resetknop voor het leren van de druk niet betrouwbaar werd geactiveerd. De pumpHelper4 onderschrijft nu expliciet de relevante interne statussen (bijvoorbeeld reset- en configuratiewaarden), waardoor een juiste afhandeling van gebeurtenissen en onmiddellijke uitvoering van de resetlogica wordt gegarandeerd.",
|
|
64
|
-
"fr": "Correction : Résolution d'un problème où le bouton de réinitialisation de l'apprentissage de la pression ne se déclenchait pas de manière fiable. Le PumpHelper4 s'abonne désormais explicitement à ses états internes pertinents (par exemple, les valeurs de réinitialisation et de configuration), garantissant une gestion appropriée des événements et l'exécution immédiate de la logique de réinitialisation.",
|
|
65
|
-
"it": "Correzione: risolto un problema per cui il pulsante di ripristino dell'apprendimento della pressione non si attivava in modo affidabile. Il pumpHelper4 ora sottoscrive esplicitamente i suoi stati interni rilevanti (ad esempio valori di ripristino e configurazione), garantendo la corretta gestione degli eventi e l'esecuzione immediata della logica di ripristino.",
|
|
66
|
-
"es": "Solución: se resolvió un problema por el cual el botón de reinicio del aprendizaje de presión no se activaba de manera confiable. El pumpHelper4 ahora se suscribe explícitamente a sus estados internos relevantes (por ejemplo, valores de reinicio y configuración), lo que garantiza un manejo adecuado de eventos y la ejecución inmediata de la lógica de reinicio.",
|
|
67
|
-
"pl": "Poprawka: rozwiązano problem polegający na tym, że przycisk resetowania uczenia się ciśnienia nie uruchamiał się niezawodnie. PumpHelper4 teraz jawnie subskrybuje swoje odpowiednie stany wewnętrzne (np. wartości resetowania i konfiguracji), zapewniając prawidłową obsługę zdarzeń i natychmiastowe wykonanie logiki resetowania.",
|
|
68
|
-
"uk": "Виправлення: вирішено проблему, через яку кнопка скидання навчання тиску не спрацьовувала надійно. PumpHelper4 тепер явно підписується на свої відповідні внутрішні стани (наприклад, значення скидання та конфігурації), забезпечуючи правильну обробку подій і негайне виконання логіки скидання.",
|
|
69
|
-
"zh-cn": "修复:解决了压力学习重置按钮无法可靠触发的问题。 PumpHelper4 现在显式订阅其相关的内部状态(例如重置和配置值),确保正确的事件处理和立即执行重置逻辑。"
|
|
70
70
|
}
|
|
71
71
|
},
|
|
72
72
|
"titleLang": {
|
|
@@ -0,0 +1,285 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
const { I18n } = require('@iobroker/adapter-core');
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* solarExtendedHelper
|
|
7
|
+
* - Prüft die Temperaturdifferenz zwischen Kollektor und Pooltemperatur
|
|
8
|
+
* - Nutzt States aus solarExtendedStates.js und temperatureStates.js
|
|
9
|
+
* - Bewertet nur die logische Anforderung und Status-/Info-States
|
|
10
|
+
* - Schaltet den externen Aktor gemäß Konfiguration
|
|
11
|
+
* - Berücksichtigt Invertierung und Aktorstatus
|
|
12
|
+
*/
|
|
13
|
+
|
|
14
|
+
const solarExtendedHelper = {
|
|
15
|
+
adapter: null,
|
|
16
|
+
checkTimer: null,
|
|
17
|
+
|
|
18
|
+
init(adapter) {
|
|
19
|
+
this.adapter = adapter;
|
|
20
|
+
|
|
21
|
+
// Minütlicher Check
|
|
22
|
+
this._scheduleCheck();
|
|
23
|
+
|
|
24
|
+
this.adapter.log.debug('[solarExtendedHelper] Initialized (check every 60s)');
|
|
25
|
+
},
|
|
26
|
+
|
|
27
|
+
_scheduleCheck() {
|
|
28
|
+
if (this.checkTimer) {
|
|
29
|
+
clearInterval(this.checkTimer);
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
this.checkTimer = setInterval(() => this._checkSolarExtended(), 60 * 1000);
|
|
33
|
+
// Beim Start sofort prüfen
|
|
34
|
+
this._checkSolarExtended();
|
|
35
|
+
},
|
|
36
|
+
|
|
37
|
+
async _checkSolarExtended() {
|
|
38
|
+
try {
|
|
39
|
+
const activeHelper = (await this.adapter.getStateAsync('pump.active_helper'))?.val || '';
|
|
40
|
+
const seasonActive = (await this.adapter.getStateAsync('status.season_active'))?.val;
|
|
41
|
+
const masterActive = (await this.adapter.getStateAsync('solar.solar_control_active'))?.val;
|
|
42
|
+
const controlMode = (await this.adapter.getStateAsync('solar.control_mode'))?.val || 'standard';
|
|
43
|
+
const pumpMode = (await this.adapter.getStateAsync('pump.mode'))?.val;
|
|
44
|
+
|
|
45
|
+
const deltaOn = Number((await this.adapter.getStateAsync('solar.extended.delta_on'))?.val);
|
|
46
|
+
const deltaOff = Number((await this.adapter.getStateAsync('solar.extended.delta_off'))?.val);
|
|
47
|
+
const maxTemperature = Number((await this.adapter.getStateAsync('solar.extended.max_temperature'))?.val);
|
|
48
|
+
const poolTemperatureSource = (await this.adapter.getStateAsync('solar.extended.pool_temperature_source'))
|
|
49
|
+
?.val;
|
|
50
|
+
const controlObjectId = (await this.adapter.getStateAsync('solar.extended.control_object_id'))?.val || '';
|
|
51
|
+
const controlType = (await this.adapter.getStateAsync('solar.extended.control_type'))?.val || '';
|
|
52
|
+
const controlInverted = (await this.adapter.getStateAsync('solar.extended.control_inverted'))?.val === true;
|
|
53
|
+
|
|
54
|
+
const oldEnabledByMaster = (await this.adapter.getStateAsync('solar.extended.enabled_by_master'))?.val;
|
|
55
|
+
const oldRequestActive = (await this.adapter.getStateAsync('solar.extended.request_active'))?.val;
|
|
56
|
+
const oldActive = (await this.adapter.getStateAsync('solar.extended.active'))?.val;
|
|
57
|
+
const oldBlocked = (await this.adapter.getStateAsync('solar.extended.blocked'))?.val;
|
|
58
|
+
const oldBlockedBy = (await this.adapter.getStateAsync('solar.extended.blocked_by'))?.val;
|
|
59
|
+
const oldPriorityStatus = (await this.adapter.getStateAsync('solar.extended.priority_status'))?.val;
|
|
60
|
+
const oldConfigOk = (await this.adapter.getStateAsync('solar.extended.config_ok'))?.val;
|
|
61
|
+
const oldActorState = (await this.adapter.getStateAsync('solar.extended.actor_state'))?.val;
|
|
62
|
+
const oldReason = (await this.adapter.getStateAsync('solar.extended.reason'))?.val;
|
|
63
|
+
const oldInfo = (await this.adapter.getStateAsync('solar.extended.info'))?.val;
|
|
64
|
+
|
|
65
|
+
const enabledByMaster = masterActive === true;
|
|
66
|
+
const isExtendedMode = controlMode === 'extended';
|
|
67
|
+
const isControlPriority = activeHelper === 'controlHelper';
|
|
68
|
+
const isTimePriority = activeHelper === 'timeHelper';
|
|
69
|
+
const actorConfigOk = controlObjectId !== '' && (controlType === 'boolean' || controlType === 'socket');
|
|
70
|
+
|
|
71
|
+
let configOk = false;
|
|
72
|
+
let requestActive = false;
|
|
73
|
+
let active = false;
|
|
74
|
+
let blocked = false;
|
|
75
|
+
let blockedBy = '';
|
|
76
|
+
let priorityStatus = '';
|
|
77
|
+
let reason = '';
|
|
78
|
+
let info = '';
|
|
79
|
+
let actorState = false;
|
|
80
|
+
let actorWriteValue = false;
|
|
81
|
+
|
|
82
|
+
if (
|
|
83
|
+
Number.isFinite(deltaOn) &&
|
|
84
|
+
Number.isFinite(deltaOff) &&
|
|
85
|
+
Number.isFinite(maxTemperature) &&
|
|
86
|
+
deltaOn >= deltaOff &&
|
|
87
|
+
maxTemperature > 0 &&
|
|
88
|
+
(poolTemperatureSource === 'surface' || poolTemperatureSource === 'ground') &&
|
|
89
|
+
actorConfigOk
|
|
90
|
+
) {
|
|
91
|
+
configOk = true;
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
if (!configOk) {
|
|
95
|
+
blocked = true;
|
|
96
|
+
blockedBy = 'invalid_config';
|
|
97
|
+
priorityStatus = I18n.translate('extended blocked by invalid config');
|
|
98
|
+
reason = I18n.translate('Extended solar configuration invalid');
|
|
99
|
+
info = I18n.translate('Solar Extended configuration invalid');
|
|
100
|
+
} else if (isControlPriority) {
|
|
101
|
+
blocked = true;
|
|
102
|
+
blockedBy = 'controlHelper';
|
|
103
|
+
priorityStatus = I18n.translate('extended blocked by controlHelper');
|
|
104
|
+
reason = I18n.translate('Priority blocked by controlHelper');
|
|
105
|
+
info = I18n.translate('Solar Extended blocked by controlHelper');
|
|
106
|
+
} else if (isTimePriority) {
|
|
107
|
+
blocked = true;
|
|
108
|
+
blockedBy = 'timeHelper';
|
|
109
|
+
priorityStatus = I18n.translate('extended blocked by timeHelper');
|
|
110
|
+
reason = I18n.translate('Priority blocked by timeHelper');
|
|
111
|
+
info = I18n.translate('Solar Extended blocked by timeHelper');
|
|
112
|
+
} else if (!enabledByMaster) {
|
|
113
|
+
blocked = true;
|
|
114
|
+
blockedBy = 'master_disabled';
|
|
115
|
+
priorityStatus = I18n.translate('extended blocked by master');
|
|
116
|
+
reason = I18n.translate('Solar master disabled');
|
|
117
|
+
info = I18n.translate('Solar Extended disabled by main solar switch');
|
|
118
|
+
} else if (!isExtendedMode) {
|
|
119
|
+
blocked = true;
|
|
120
|
+
blockedBy = 'mode_standard';
|
|
121
|
+
priorityStatus = I18n.translate('extended blocked by standard mode');
|
|
122
|
+
reason = I18n.translate('Solar control mode is %s', controlMode);
|
|
123
|
+
info = I18n.translate('Solar Extended inactive because standard solar mode is selected');
|
|
124
|
+
} else if (!seasonActive) {
|
|
125
|
+
blocked = true;
|
|
126
|
+
blockedBy = 'season_inactive';
|
|
127
|
+
priorityStatus = I18n.translate('extended blocked by inactive season');
|
|
128
|
+
reason = I18n.translate('Season inactive');
|
|
129
|
+
info = I18n.translate('Solar Extended inactive because the season is disabled');
|
|
130
|
+
} else if (pumpMode !== 'auto') {
|
|
131
|
+
blocked = true;
|
|
132
|
+
blockedBy = 'pump_mode_not_auto';
|
|
133
|
+
priorityStatus = I18n.translate('extended blocked by pump mode');
|
|
134
|
+
reason = I18n.translate('Pump mode is %s', pumpMode);
|
|
135
|
+
info = I18n.translate('Solar Extended inactive because pump mode is not auto');
|
|
136
|
+
} else {
|
|
137
|
+
const collector = Number((await this.adapter.getStateAsync('temperature.collector.current'))?.val);
|
|
138
|
+
const poolStateId =
|
|
139
|
+
poolTemperatureSource === 'ground' ? 'temperature.ground.current' : 'temperature.surface.current';
|
|
140
|
+
const pool = Number((await this.adapter.getStateAsync(poolStateId))?.val);
|
|
141
|
+
|
|
142
|
+
if (!Number.isFinite(collector) || !Number.isFinite(pool)) {
|
|
143
|
+
requestActive = false;
|
|
144
|
+
active = false;
|
|
145
|
+
priorityStatus = I18n.translate('extended waiting for temperatures');
|
|
146
|
+
reason = I18n.translate('No valid temperature values available');
|
|
147
|
+
info = I18n.translate('Solar Extended waiting for valid temperature values');
|
|
148
|
+
this.adapter.log.debug('[solarExtendedHelper] No valid temperatures available');
|
|
149
|
+
} else {
|
|
150
|
+
const delta = collector - pool;
|
|
151
|
+
if (delta >= deltaOn && pool < maxTemperature) {
|
|
152
|
+
requestActive = true;
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
if (delta <= deltaOff || pool >= maxTemperature) {
|
|
156
|
+
requestActive = false;
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
if (pool >= maxTemperature) {
|
|
160
|
+
reason = I18n.translate('Pool temperature >= max temperature (%s >= %s)', pool, maxTemperature);
|
|
161
|
+
info = I18n.translate('Solar Extended inactive because maximum pool temperature is reached');
|
|
162
|
+
} else if (requestActive) {
|
|
163
|
+
reason = I18n.translate('Collector delta >= delta_on (%s >= %s)', delta.toFixed(2), deltaOn);
|
|
164
|
+
info = I18n.translate('Solar Extended requests heating from collector surplus');
|
|
165
|
+
} else {
|
|
166
|
+
reason = I18n.translate('Collector delta <= delta_off (%s <= %s)', delta.toFixed(2), deltaOff);
|
|
167
|
+
info = I18n.translate('Solar Extended currently has no temperature request');
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
this.adapter.log.debug(
|
|
171
|
+
`[solarExtendedHelper] Extended solar ${requestActive ? 'ON' : 'OFF'} (Collector=${collector}°C, Pool=${pool}°C, Delta=${delta.toFixed(2)}°C, Source=${poolTemperatureSource})`,
|
|
172
|
+
);
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
actorWriteValue = requestActive;
|
|
177
|
+
if (controlInverted) {
|
|
178
|
+
actorWriteValue = !actorWriteValue;
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
if (actorConfigOk) {
|
|
182
|
+
try {
|
|
183
|
+
await this.adapter.setForeignStateAsync(controlObjectId, actorWriteValue, false);
|
|
184
|
+
actorState = actorWriteValue;
|
|
185
|
+
|
|
186
|
+
if (!blocked) {
|
|
187
|
+
active = requestActive;
|
|
188
|
+
if (priorityStatus === '') {
|
|
189
|
+
priorityStatus = requestActive
|
|
190
|
+
? I18n.translate('extended active')
|
|
191
|
+
: I18n.translate('extended inactive');
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
} catch (err) {
|
|
195
|
+
blocked = true;
|
|
196
|
+
blockedBy = 'actor_write_error';
|
|
197
|
+
priorityStatus = I18n.translate('extended blocked by actor write error');
|
|
198
|
+
reason = I18n.translate('Actor write failed: %s', err.message);
|
|
199
|
+
info = I18n.translate('Solar Extended could not write to the external actuator');
|
|
200
|
+
actorState = false;
|
|
201
|
+
active = false;
|
|
202
|
+
this.adapter.log.warn(`[solarExtendedHelper] Error writing actor state: ${err.message}`);
|
|
203
|
+
}
|
|
204
|
+
} else {
|
|
205
|
+
actorState = false;
|
|
206
|
+
active = false;
|
|
207
|
+
}
|
|
208
|
+
|
|
209
|
+
await this.adapter.setStateChangedAsync('solar.extended.enabled_by_master', {
|
|
210
|
+
val: enabledByMaster,
|
|
211
|
+
ack: true,
|
|
212
|
+
});
|
|
213
|
+
await this.adapter.setStateChangedAsync('solar.extended.request_active', {
|
|
214
|
+
val: requestActive,
|
|
215
|
+
ack: true,
|
|
216
|
+
});
|
|
217
|
+
await this.adapter.setStateChangedAsync('solar.extended.active', {
|
|
218
|
+
val: active,
|
|
219
|
+
ack: true,
|
|
220
|
+
});
|
|
221
|
+
await this.adapter.setStateChangedAsync('solar.extended.blocked', {
|
|
222
|
+
val: blocked,
|
|
223
|
+
ack: true,
|
|
224
|
+
});
|
|
225
|
+
await this.adapter.setStateChangedAsync('solar.extended.blocked_by', {
|
|
226
|
+
val: blockedBy,
|
|
227
|
+
ack: true,
|
|
228
|
+
});
|
|
229
|
+
await this.adapter.setStateChangedAsync('solar.extended.priority_status', {
|
|
230
|
+
val: priorityStatus,
|
|
231
|
+
ack: true,
|
|
232
|
+
});
|
|
233
|
+
await this.adapter.setStateChangedAsync('solar.extended.config_ok', {
|
|
234
|
+
val: configOk,
|
|
235
|
+
ack: true,
|
|
236
|
+
});
|
|
237
|
+
await this.adapter.setStateChangedAsync('solar.extended.actor_state', {
|
|
238
|
+
val: actorState,
|
|
239
|
+
ack: true,
|
|
240
|
+
});
|
|
241
|
+
await this.adapter.setStateChangedAsync('solar.extended.reason', {
|
|
242
|
+
val: reason,
|
|
243
|
+
ack: true,
|
|
244
|
+
});
|
|
245
|
+
await this.adapter.setStateChangedAsync('solar.extended.info', {
|
|
246
|
+
val: info,
|
|
247
|
+
ack: true,
|
|
248
|
+
});
|
|
249
|
+
|
|
250
|
+
const statusChanged =
|
|
251
|
+
oldEnabledByMaster !== enabledByMaster ||
|
|
252
|
+
oldRequestActive !== requestActive ||
|
|
253
|
+
oldActive !== active ||
|
|
254
|
+
oldBlocked !== blocked ||
|
|
255
|
+
oldBlockedBy !== blockedBy ||
|
|
256
|
+
oldPriorityStatus !== priorityStatus ||
|
|
257
|
+
oldConfigOk !== configOk ||
|
|
258
|
+
oldActorState !== actorState ||
|
|
259
|
+
oldReason !== reason ||
|
|
260
|
+
oldInfo !== info;
|
|
261
|
+
|
|
262
|
+
if (statusChanged) {
|
|
263
|
+
await this.adapter.setStateChangedAsync('solar.extended.last_change', {
|
|
264
|
+
val: Date.now(),
|
|
265
|
+
ack: true,
|
|
266
|
+
});
|
|
267
|
+
}
|
|
268
|
+
|
|
269
|
+
if (blocked) {
|
|
270
|
+
this.adapter.log.debug(`[solarExtendedHelper] Extended solar skipped (${blockedBy || 'blocked'})`);
|
|
271
|
+
}
|
|
272
|
+
} catch (err) {
|
|
273
|
+
this.adapter.log.warn(`[solarExtendedHelper] Error in check: ${err.message}`);
|
|
274
|
+
}
|
|
275
|
+
},
|
|
276
|
+
|
|
277
|
+
cleanup() {
|
|
278
|
+
if (this.checkTimer) {
|
|
279
|
+
clearInterval(this.checkTimer);
|
|
280
|
+
this.checkTimer = null;
|
|
281
|
+
}
|
|
282
|
+
},
|
|
283
|
+
};
|
|
284
|
+
|
|
285
|
+
module.exports = solarExtendedHelper;
|
|
@@ -32,17 +32,25 @@ const solarHelper = {
|
|
|
32
32
|
|
|
33
33
|
async _checkSolar() {
|
|
34
34
|
try {
|
|
35
|
-
// --- NEU: Vorrangprüfung durch ControlHelper ---
|
|
36
35
|
const activeHelper = (await this.adapter.getStateAsync('pump.active_helper'))?.val || '';
|
|
36
|
+
const isExternalPriority = activeHelper === 'controlHelper' || activeHelper === 'timeHelper';
|
|
37
|
+
|
|
38
|
+
// --- NEU: Vorrangprüfung durch ControlHelper ---
|
|
37
39
|
if (activeHelper === 'controlHelper') {
|
|
40
|
+
await this.adapter.setStateChangedAsync('solar.request_active', {
|
|
41
|
+
val: false,
|
|
42
|
+
ack: true,
|
|
43
|
+
});
|
|
38
44
|
this.adapter.log.debug('[solarHelper] Priority by ControlHelper active – solar control paused.');
|
|
39
|
-
return;
|
|
40
45
|
}
|
|
41
46
|
|
|
42
47
|
// --- NEU: Vorrangprüfung durch TimeHelper ---
|
|
43
48
|
if (activeHelper === 'timeHelper') {
|
|
49
|
+
await this.adapter.setStateChangedAsync('solar.request_active', {
|
|
50
|
+
val: false,
|
|
51
|
+
ack: true,
|
|
52
|
+
});
|
|
44
53
|
this.adapter.log.debug('[solarHelper] Priority by TimeHelper active – solar control paused.');
|
|
45
|
-
return;
|
|
46
54
|
}
|
|
47
55
|
|
|
48
56
|
// --- NEU: Saisonstatus ---
|
|
@@ -51,6 +59,9 @@ const solarHelper = {
|
|
|
51
59
|
// Solarsteuerung aktiv?
|
|
52
60
|
const active = (await this.adapter.getStateAsync('solar.solar_control_active'))?.val;
|
|
53
61
|
|
|
62
|
+
// NEU: Solarsteuerungsmodus
|
|
63
|
+
const controlMode = (await this.adapter.getStateAsync('solar.control_mode'))?.val || 'standard';
|
|
64
|
+
|
|
54
65
|
// Pumpenmodus
|
|
55
66
|
const mode = (await this.adapter.getStateAsync('pump.mode'))?.val;
|
|
56
67
|
|
|
@@ -63,13 +74,31 @@ const solarHelper = {
|
|
|
63
74
|
const collector = Number((await this.adapter.getStateAsync('temperature.collector.current'))?.val);
|
|
64
75
|
const pool = Number((await this.adapter.getStateAsync('temperature.surface.current'))?.val); // Oberfläche = Pooltemp
|
|
65
76
|
|
|
66
|
-
|
|
77
|
+
// NEU: Absicherung gegen ungültige Werte
|
|
78
|
+
if (isNaN(collector) || isNaN(pool)) {
|
|
79
|
+
await this.adapter.setStateChangedAsync('solar.request_active', {
|
|
80
|
+
val: false,
|
|
81
|
+
ack: true,
|
|
82
|
+
});
|
|
67
83
|
this.adapter.log.debug('[solarHelper] No valid temperatures available');
|
|
68
84
|
return;
|
|
69
85
|
}
|
|
70
86
|
|
|
87
|
+
// NEU: Standard-Solar nur ausführen, wenn control_mode = standard
|
|
88
|
+
const isStandardMode = controlMode === 'standard';
|
|
89
|
+
|
|
90
|
+
if (!isStandardMode) {
|
|
91
|
+
await this.adapter.setStateChangedAsync('solar.request_active', {
|
|
92
|
+
val: false,
|
|
93
|
+
ack: true,
|
|
94
|
+
});
|
|
95
|
+
this.adapter.log.debug(
|
|
96
|
+
`[solarHelper] Standard solar paused because solar.control_mode = ${controlMode}`,
|
|
97
|
+
);
|
|
98
|
+
}
|
|
99
|
+
|
|
71
100
|
// --- Schaltlogik nur ausführen, wenn Saison aktiv, Solar aktiv und Modus AUTO ---
|
|
72
|
-
if (season && active && mode === 'auto') {
|
|
101
|
+
if (season && active && mode === 'auto' && isStandardMode && !isExternalPriority) {
|
|
73
102
|
let shouldRun = false;
|
|
74
103
|
const delta = collector - pool;
|
|
75
104
|
|
|
@@ -96,6 +125,10 @@ const solarHelper = {
|
|
|
96
125
|
ack: true,
|
|
97
126
|
});
|
|
98
127
|
}
|
|
128
|
+
await this.adapter.setStateChangedAsync('solar.request_active', {
|
|
129
|
+
val: shouldRun,
|
|
130
|
+
ack: true,
|
|
131
|
+
});
|
|
99
132
|
|
|
100
133
|
// ZENTRAL: Pumpe über Bool-Schalter setzen
|
|
101
134
|
await this.adapter.setStateChangedAsync('pump.pump_switch', {
|
|
@@ -107,14 +140,23 @@ const solarHelper = {
|
|
|
107
140
|
`[solarHelper] Solar control → pump ${shouldRun ? 'ON' : 'OFF'} (Collector=${collector}°C, Pool=${pool}°C, Delta=${delta}°C)`,
|
|
108
141
|
);
|
|
109
142
|
} else {
|
|
143
|
+
await this.adapter.setStateChangedAsync('solar.request_active', {
|
|
144
|
+
val: false,
|
|
145
|
+
ack: true,
|
|
146
|
+
});
|
|
147
|
+
|
|
110
148
|
// Keine Schaltung – Grund protokollieren
|
|
111
149
|
const reason = !season
|
|
112
150
|
? 'Saison inaktiv'
|
|
113
151
|
: !active
|
|
114
152
|
? 'Solarsteuerung aus'
|
|
115
|
-
:
|
|
116
|
-
?
|
|
117
|
-
:
|
|
153
|
+
: !isStandardMode
|
|
154
|
+
? `Solarmodus = ${controlMode}`
|
|
155
|
+
: isExternalPriority
|
|
156
|
+
? `Vorrang durch ${activeHelper}`
|
|
157
|
+
: mode !== 'auto'
|
|
158
|
+
? 'Pumpenmodus != auto'
|
|
159
|
+
: 'unbekannt';
|
|
118
160
|
this.adapter.log.debug(`[solarHelper] Solar control skipped (${reason})`);
|
|
119
161
|
}
|
|
120
162
|
|
package/lib/i18n/de.json
CHANGED
|
@@ -65,5 +65,41 @@
|
|
|
65
65
|
"Then let the filter run patiently until the water becomes clear again.": "Dann geduldig filtern lassen, bis das Wasser wieder klar ist.",
|
|
66
66
|
|
|
67
67
|
"Note: This problem is not known yet.": "Hinweis: Dieses Problem ist noch nicht bekannt.",
|
|
68
|
-
"Please select one of the existing items or use \"Issue unclear / not specific\".": "Bitte einen vorhandenen Punkt auswählen oder \"Problem unklar\" nutzen."
|
|
68
|
+
"Please select one of the existing items or use \"Issue unclear / not specific\".": "Bitte einen vorhandenen Punkt auswählen oder \"Problem unklar\" nutzen.",
|
|
69
|
+
|
|
70
|
+
"Extended solar configuration invalid": "Konfiguration der erweiterten Solarsteuerung ungültig",
|
|
71
|
+
"Solar Extended configuration invalid": "Konfiguration von Solar Extended ungültig",
|
|
72
|
+
"Priority blocked by controlHelper": "Durch controlHelper blockiert",
|
|
73
|
+
"Solar Extended blocked by controlHelper": "Solar Extended durch controlHelper blockiert",
|
|
74
|
+
"Priority blocked by timeHelper": "Durch timeHelper blockiert",
|
|
75
|
+
"Solar Extended blocked by timeHelper": "Solar Extended durch timeHelper blockiert",
|
|
76
|
+
"Solar master disabled": "Solar-Hauptschalter deaktiviert",
|
|
77
|
+
"Solar Extended disabled by main solar switch": "Solar Extended durch den Hauptschalter deaktiviert",
|
|
78
|
+
"Solar control mode is %s": "Solarsteuerungsmodus ist %s",
|
|
79
|
+
"Solar Extended inactive because standard solar mode is selected": "Solar Extended ist inaktiv, weil Standard-Solar ausgewählt ist",
|
|
80
|
+
"Season inactive": "Saison inaktiv",
|
|
81
|
+
"Solar Extended inactive because the season is disabled": "Solar Extended ist inaktiv, weil die Saison deaktiviert ist",
|
|
82
|
+
"Pump mode is %s": "Pumpenmodus ist %s",
|
|
83
|
+
"Solar Extended inactive because pump mode is not auto": "Solar Extended ist inaktiv, weil der Pumpenmodus nicht auf Auto steht",
|
|
84
|
+
"No valid temperature values available": "Keine gültigen Temperaturwerte verfügbar",
|
|
85
|
+
"Solar Extended waiting for valid temperature values": "Solar Extended wartet auf gültige Temperaturwerte",
|
|
86
|
+
"Pool temperature >= max temperature (%s >= %s)": "Pooltemperatur >= Maximaltemperatur (%s >= %s)",
|
|
87
|
+
"Solar Extended inactive because maximum pool temperature is reached": "Solar Extended ist inaktiv, weil die maximale Pooltemperatur erreicht ist",
|
|
88
|
+
"Collector delta >= delta_on (%s >= %s)": "Kollektor-Differenz >= delta_on (%s >= %s)",
|
|
89
|
+
"Solar Extended requests heating from collector surplus": "Solar Extended fordert Heizung durch Kollektorüberschuss an",
|
|
90
|
+
"Collector delta <= delta_off (%s <= %s)": "Kollektor-Differenz <= delta_off (%s <= %s)",
|
|
91
|
+
"Solar Extended currently has no temperature request": "Solar Extended hat aktuell keine Temperaturanforderung",
|
|
92
|
+
"Actor write failed: %s": "Schreiben auf den Aktor fehlgeschlagen: %s",
|
|
93
|
+
"Solar Extended could not write to the external actuator": "Solar Extended konnte nicht auf den externen Aktor schreiben",
|
|
94
|
+
"extended blocked by invalid config": "Extended durch ungültige Konfiguration blockiert",
|
|
95
|
+
"extended blocked by controlHelper": "Extended durch controlHelper blockiert",
|
|
96
|
+
"extended blocked by timeHelper": "Extended durch timeHelper blockiert",
|
|
97
|
+
"extended blocked by master": "Extended durch Hauptschalter blockiert",
|
|
98
|
+
"extended blocked by standard mode": "Extended durch Standard-Modus blockiert",
|
|
99
|
+
"extended blocked by inactive season": "Extended durch inaktive Saison blockiert",
|
|
100
|
+
"extended blocked by pump mode": "Extended durch Pumpenmodus blockiert",
|
|
101
|
+
"extended waiting for temperatures": "Extended wartet auf Temperaturen",
|
|
102
|
+
"extended blocked by actor write error": "Extended durch Aktor-Schreibfehler blockiert",
|
|
103
|
+
"extended active": "Extended aktiv",
|
|
104
|
+
"extended inactive": "Extended inaktiv"
|
|
69
105
|
}
|
package/lib/i18n/en.json
CHANGED
|
@@ -137,5 +137,41 @@
|
|
|
137
137
|
"Odor / irritation is often not too much chlorine, but incorrectly bound / organically loaded water.": "Odor / irritation is often not too much chlorine, but incorrectly bound / organically loaded water.",
|
|
138
138
|
|
|
139
139
|
"Note: This problem is not known yet.": "Note: This problem is not known yet.",
|
|
140
|
-
"Please select one of the existing items or use \"Issue unclear / not specific\".": "Please select one of the existing items or use \"Issue unclear / not specific\"."
|
|
140
|
+
"Please select one of the existing items or use \"Issue unclear / not specific\".": "Please select one of the existing items or use \"Issue unclear / not specific\".",
|
|
141
|
+
|
|
142
|
+
"Extended solar configuration invalid": "Extended solar configuration invalid",
|
|
143
|
+
"Solar Extended configuration invalid": "Solar Extended configuration invalid",
|
|
144
|
+
"Priority blocked by controlHelper": "Priority blocked by controlHelper",
|
|
145
|
+
"Solar Extended blocked by controlHelper": "Solar Extended blocked by controlHelper",
|
|
146
|
+
"Priority blocked by timeHelper": "Priority blocked by timeHelper",
|
|
147
|
+
"Solar Extended blocked by timeHelper": "Solar Extended blocked by timeHelper",
|
|
148
|
+
"Solar master disabled": "Solar master disabled",
|
|
149
|
+
"Solar Extended disabled by main solar switch": "Solar Extended disabled by main solar switch",
|
|
150
|
+
"Solar control mode is %s": "Solar control mode is %s",
|
|
151
|
+
"Solar Extended inactive because standard solar mode is selected": "Solar Extended inactive because standard solar mode is selected",
|
|
152
|
+
"Season inactive": "Season inactive",
|
|
153
|
+
"Solar Extended inactive because the season is disabled": "Solar Extended inactive because the season is disabled",
|
|
154
|
+
"Pump mode is %s": "Pump mode is %s",
|
|
155
|
+
"Solar Extended inactive because pump mode is not auto": "Solar Extended inactive because pump mode is not auto",
|
|
156
|
+
"No valid temperature values available": "No valid temperature values available",
|
|
157
|
+
"Solar Extended waiting for valid temperature values": "Solar Extended waiting for valid temperature values",
|
|
158
|
+
"Pool temperature >= max temperature (%s >= %s)": "Pool temperature >= max temperature (%s >= %s)",
|
|
159
|
+
"Solar Extended inactive because maximum pool temperature is reached": "Solar Extended inactive because maximum pool temperature is reached",
|
|
160
|
+
"Collector delta >= delta_on (%s >= %s)": "Collector delta >= delta_on (%s >= %s)",
|
|
161
|
+
"Solar Extended requests heating from collector surplus": "Solar Extended requests heating from collector surplus",
|
|
162
|
+
"Collector delta <= delta_off (%s <= %s)": "Collector delta <= delta_off (%s <= %s)",
|
|
163
|
+
"Solar Extended currently has no temperature request": "Solar Extended currently has no temperature request",
|
|
164
|
+
"Actor write failed: %s": "Actor write failed: %s",
|
|
165
|
+
"Solar Extended could not write to the external actuator": "Solar Extended could not write to the external actuator",
|
|
166
|
+
"extended blocked by invalid config": "extended blocked by invalid config",
|
|
167
|
+
"extended blocked by controlHelper": "extended blocked by controlHelper",
|
|
168
|
+
"extended blocked by timeHelper": "extended blocked by timeHelper",
|
|
169
|
+
"extended blocked by master": "extended blocked by master",
|
|
170
|
+
"extended blocked by standard mode": "extended blocked by standard mode",
|
|
171
|
+
"extended blocked by inactive season": "extended blocked by inactive season",
|
|
172
|
+
"extended blocked by pump mode": "extended blocked by pump mode",
|
|
173
|
+
"extended waiting for temperatures": "extended waiting for temperatures",
|
|
174
|
+
"extended blocked by actor write error": "extended blocked by actor write error",
|
|
175
|
+
"extended active": "extended active",
|
|
176
|
+
"extended inactive": "extended inactive"
|
|
141
177
|
}
|