iobroker.poolcontrol 1.2.22 → 1.3.1
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 +19 -13
- package/io-package.json +27 -27
- package/lib/helpers/solarExtendedHelper.js +299 -0
- package/lib/helpers/solarHelper.js +25 -6
- 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 +34 -2
- package/main.js +7 -0
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -186,6 +186,25 @@ 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
|
+
|
|
190
|
+
## Changelog
|
|
191
|
+
### 1.3.1 (2026-04-17)
|
|
192
|
+
|
|
193
|
+
- Fix: Solar Extended now correctly controls the pump
|
|
194
|
+
- Fix: Integrated Solar Extended into existing solar status handling via `speech.solar_active`
|
|
195
|
+
- Improvement: Consistent pump status display for Solar and Solar Extended
|
|
196
|
+
- Minor bug fixes and internal optimizations
|
|
197
|
+
|
|
198
|
+
### 1.3.0 (2026-04-16)
|
|
199
|
+
|
|
200
|
+
- Added extended solar control (delta-based temperature logic)
|
|
201
|
+
- Support for external actuator control (boolean/socket)
|
|
202
|
+
- Standard / Extended solar mode selection
|
|
203
|
+
- Priority and blocking logic (controlHelper, timeHelper, pump mode, season)
|
|
204
|
+
- Improved status states (active, request, blocked, reason, info)
|
|
205
|
+
- Added i18n support for solar extended status texts
|
|
206
|
+
- Added selectable configuration for temperature source and control type
|
|
207
|
+
|
|
189
208
|
### 1.2.22 (2026-04-16)
|
|
190
209
|
|
|
191
210
|
- Added new read-only state `solar.request_active` to indicate when solar logic would request the pump
|
|
@@ -201,19 +220,6 @@ New features are added regularly – please refer to the changelog.
|
|
|
201
220
|
Release: 11.04.2026
|
|
202
221
|
- (DasBo) Reduced unnecessary state writes in status and photovoltaic helpers. Summary and PV timestamps are now only updated when the functional result actually changes, making the adapter quieter without affecting existing logic.
|
|
203
222
|
|
|
204
|
-
### 1.2.19
|
|
205
|
-
Release: 10.04.2026
|
|
206
|
-
- Fixed an interaction issue between `photovoltaicHelper` and `controlHelper` where automatic follow-up pumping could be stopped unexpectedly
|
|
207
|
-
- photovoltaicHelper now respects controlHelper priority and no longer stops the pump while automatic follow-up pumping is active
|
|
208
|
-
- Fixed an issue where `controlHelper` could remain in "nachpumpen" state if the pump was stopped externally
|
|
209
|
-
- `photovoltaic.threshold_w` is now correctly synchronized with the instance configuration
|
|
210
|
-
- Changes to the PV surplus threshold in adapter settings are now reliably reflected in the corresponding read-only datapoint
|
|
211
|
-
|
|
212
|
-
### 1.2.18
|
|
213
|
-
Release: 07.04.2026
|
|
214
|
-
- Fixed persistence issue for `status.season_active` (no longer overwritten on adapter start)
|
|
215
|
-
- Improved persistence for frost protection settings
|
|
216
|
-
|
|
217
223
|
## Support
|
|
218
224
|
- [ioBroker Forum](https://forum.iobroker.net/)
|
|
219
225
|
- [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.1",
|
|
5
5
|
"news": {
|
|
6
|
+
"1.3.1": {
|
|
7
|
+
"en": "Fix: Solar Extended now correctly controls the pump and integrates with existing solar status handling. The helper now uses speech.solar_active like the standard solar logic, ensuring consistent pump status display and behavior. Minor fixes and optimizations.",
|
|
8
|
+
"de": "Fix: Solar Extended steuert jetzt korrekt die Pumpe und ist sauber in die bestehende Solar-Statuslogik integriert. Der Helper nutzt nun wie die Standard-Solarsteuerung den State speech.solar_active, wodurch Anzeige und Verhalten der Pumpe konsistent sind. Kleine Fehlerbehebungen und Optimierungen.",
|
|
9
|
+
"ru": "Исправление: Solar Extended теперь правильно управляет насосом и интегрируется с существующей системой обработки состояния солнечной энергии. Помощник теперь использует voice.solar_active как стандартную логику Solar, обеспечивая единообразное отображение состояния и поведения насоса. Мелкие исправления и оптимизации.",
|
|
10
|
+
"pt": "Correção: o Solar Extended agora controla corretamente a bomba e se integra ao tratamento do status solar existente. O auxiliar agora usa Speech.solar_active como a lógica solar padrão, garantindo exibição e comportamento consistentes do status da bomba. Pequenas correções e otimizações.",
|
|
11
|
+
"nl": "Oplossing: Solar Extended bestuurt de pomp nu correct en integreert met bestaande zonnestatusafhandeling. De helper gebruikt nu speech.solar_active zoals de standaard zonnelogica, waardoor een consistente weergave en gedrag van de pompstatus wordt gegarandeerd. Kleine reparaties en optimalisaties.",
|
|
12
|
+
"fr": "Correctif : Solar Extended contrôle désormais correctement la pompe et s'intègre à la gestion de l'état solaire existante. L'assistant utilise désormais Speech.solar_active comme la logique solaire standard, garantissant un affichage et un comportement cohérents de l'état de la pompe. Corrections mineures et optimisations.",
|
|
13
|
+
"it": "Correzione: Solar Extended ora controlla correttamente la pompa e si integra con la gestione dello stato solare esistente. L'helper ora utilizza Speech.solar_active come la logica solare standard, garantendo una visualizzazione e un comportamento coerenti dello stato della pompa. Correzioni e ottimizzazioni minori.",
|
|
14
|
+
"es": "Solución: Solar Extended ahora controla correctamente la bomba y se integra con el manejo del estado solar existente. El asistente ahora utiliza Speech.solar_active como la lógica solar estándar, lo que garantiza una visualización y un comportamiento consistentes del estado de la bomba. Correcciones y optimizaciones menores.",
|
|
15
|
+
"pl": "Poprawka: Solar Extended teraz poprawnie steruje pompą i integruje się z istniejącą obsługą stanu solarnego. Pomocnik używa teraz mowy.solar_active jak standardowej logiki solarnej, zapewniając spójne wyświetlanie stanu i zachowanie pompy. Drobne poprawki i optymalizacje.",
|
|
16
|
+
"uk": "Виправлення: Solar Extended тепер правильно керує насосом та інтегрується з існуючою обробкою стану сонячної енергії. Помічник тепер використовує speak.solar_active як стандартну сонячну логіку, забезпечуючи послідовне відображення стану насоса та поведінку. Незначні виправлення та оптимізації.",
|
|
17
|
+
"zh-cn": "修复:Solar Extended 现在可以正确控制泵并与现有的太阳能状态处理集成。助手现在像标准太阳能逻辑一样使用pepe.solar_active,确保一致的泵状态显示和行为。小修复和优化。"
|
|
18
|
+
},
|
|
19
|
+
"1.3.0": {
|
|
20
|
+
"en": "Added extended solar control with selectable standard/extended mode, delta-based control logic, external actuator support, priority/blocking handling, and localized status texts.",
|
|
21
|
+
"de": "Erweiterte Solarsteuerung ergänzt mit wählbarem Standard-/Extended-Modus, differenzbasierter Regelung, externer Aktor-Ansteuerung, Vorrang-/Blockierlogik und lokalisierten Statusmeldungen.",
|
|
22
|
+
"ru": "Добавлено расширенное управление солнечной батареей с возможностью выбора стандартного/расширенного режима, логикой управления на основе дельты, поддержкой внешнего исполнительного механизма, обработкой приоритета/блокировки и локализованными текстами состояния.",
|
|
23
|
+
"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.",
|
|
24
|
+
"nl": "Uitgebreide zonneregeling toegevoegd met selecteerbare standaard/uitgebreide modus, op delta gebaseerde besturingslogica, ondersteuning voor externe actuatoren, afhandeling van prioriteiten/blokkeringen en gelokaliseerde statusteksten.",
|
|
25
|
+
"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.",
|
|
26
|
+
"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.",
|
|
27
|
+
"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.",
|
|
28
|
+
"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.",
|
|
29
|
+
"uk": "Додано розширене керування геліосистемою з вибором стандартного/розширеного режиму, логікою керування на основі дельти, підтримкою зовнішнього приводу, обробкою пріоритетів/блокування та локалізованими текстами стану.",
|
|
30
|
+
"zh-cn": "添加了扩展太阳能控制,具有可选的标准/扩展模式、基于增量的控制逻辑、外部执行器支持、优先级/阻止处理和本地化状态文本。"
|
|
31
|
+
},
|
|
6
32
|
"1.2.22": {
|
|
7
33
|
"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.",
|
|
8
34
|
"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.",
|
|
@@ -41,32 +67,6 @@
|
|
|
41
67
|
"pl": "Wydanie poprawek błędów. Redukcja zbędnych zapisów stanu w statusie i pomocnikach fotowoltaicznych. Sumaryczne znaczniki czasu i znaczniki czasu aktualizacji PV są teraz zapisywane tylko wtedy, gdy faktycznie zmienia się powiązany wynik funkcjonalny. Dzięki temu adapter jest zauważalnie cichszy i pozwala uniknąć niepotrzebnych aktualizacji stanu bez zmiany istniejącej logiki sterowania.",
|
|
42
68
|
"uk": "Реліз виправлення помилок. Зменшено непотрібні записи стану в статусі та фотоелектричні помічники. Підсумкові мітки часу та мітки часу оновлення PV тепер записуються лише тоді, коли відповідний функціональний результат фактично змінюється. Це робить адаптер помітно тихішим і дозволяє уникнути непотрібних оновлень стану без зміни існуючої логіки керування.",
|
|
43
69
|
"zh-cn": "错误修复版本。减少状态和光伏助手中不必要的状态写入。摘要时间戳和 PV 更新时间戳现在仅在相关功能结果实际更改时写入。这使得适配器明显更安静,并且在不改变现有控制逻辑的情况下避免了不必要的状态更新。"
|
|
44
|
-
},
|
|
45
|
-
"1.2.19": {
|
|
46
|
-
"en": "Bugfix release. Fixes an interaction issue between photovoltaicHelper and controlHelper where automatic follow-up pumping could be interrupted unexpectedly. The photovoltaic stop logic now respects controlHelper priority and no longer stops the pump while automatic follow-up pumping is active. In addition, the read-only state photovoltaic.threshold_w is now synchronized correctly with the instance configuration so that changes in the adapter settings are reflected reliably in the visible datapoint.",
|
|
47
|
-
"de": "Bugfix-Release. Behebt ein Zusammenspielproblem zwischen photovoltaicHelper und controlHelper, durch das automatisches Nachpumpen unerwartet unterbrochen werden konnte. Die Abschaltlogik des PV-Helfers respektiert nun den Vorrang des controlHelper und stoppt die Pumpe nicht mehr, solange automatisches Nachpumpen aktiv ist. Zusätzlich wird der schreibgeschützte Datenpunkt photovoltaic.threshold_w jetzt korrekt mit der Instanzkonfiguration synchronisiert, sodass Änderungen in den Adaptereinstellungen zuverlässig im sichtbaren Datenpunkt übernommen werden.",
|
|
48
|
-
"ru": "Выпуск с исправлением ошибок. Устранена проблема взаимодействия между фотоэлектрическим помощником и controlHelper, из-за которой автоматическая последующая откачка могла неожиданно прерваться. Логика фотоэлектрической остановки теперь учитывает приоритет controlHelper и больше не останавливает насос, пока активна автоматическая последующая откачка. Кроме того, состояние только для чтения photovoltaic.threshold_w теперь правильно синхронизируется с конфигурацией экземпляра, так что изменения в настройках адаптера надежно отражаются в видимой точке данных.",
|
|
49
|
-
"pt": "Lançamento de correção de bug. Corrige um problema de interação entre photovoltaicHelper e controlHelper onde o bombeamento de acompanhamento automático poderia ser interrompido inesperadamente. A lógica de paragem fotovoltaica respeita agora a prioridade controlHelper e já não para a bomba enquanto o bombeamento de acompanhamento automático estiver ativo. Além disso, o estado somente leitura photovoltaic.threshold_w agora está sincronizado corretamente com a configuração da instância para que as alterações nas configurações do adaptador sejam refletidas de forma confiável no ponto de dados visível.",
|
|
50
|
-
"nl": "Bugfix-release. Er is een interactieprobleem opgelost tussen photovoltaicHelper en controlHelper waarbij automatisch napompen onverwacht kon worden onderbroken. De fotovoltaïsche stoplogica respecteert nu de prioriteit van controlHelper en stopt de pomp niet langer terwijl automatisch napompen actief is. Bovendien wordt de alleen-lezen status photovoltaic.threshold_w nu correct gesynchroniseerd met de instanceconfiguratie, zodat wijzigingen in de adapterinstellingen betrouwbaar worden weerspiegeld in het zichtbare datapunt.",
|
|
51
|
-
"fr": "Version de correction de bugs. Corrige un problème d'interaction entre photovoltaicHelper et controlHelper où le pompage de suivi automatique pouvait être interrompu de manière inattendue. La logique d'arrêt photovoltaïque respecte désormais la priorité controlHelper et n'arrête plus la pompe lorsque le pompage de suivi automatique est actif. De plus, l'état en lecture seule photovoltaic.threshold_w est désormais correctement synchronisé avec la configuration de l'instance afin que les modifications apportées aux paramètres de l'adaptateur soient reflétées de manière fiable dans le point de données visible.",
|
|
52
|
-
"it": "Rilascio di correzione bug. Risolve un problema di interazione tra fotovoltaicoHelper e controlHelper in cui il pompaggio automatico di follow-up poteva essere interrotto inaspettatamente. La logica di arresto fotovoltaico ora rispetta la priorità di controlHelper e non arresta più la pompa mentre è attivo il pompaggio di follow-up automatico. Inoltre, lo stato di sola lettura fotovoltaico.threshold_w è ora sincronizzato correttamente con la configurazione dell'istanza in modo che le modifiche nelle impostazioni dell'adattatore si riflettano in modo affidabile nel punto dati visibile.",
|
|
53
|
-
"es": "Lanzamiento de corrección de errores. Soluciona un problema de interacción entre photovoltaicHelper y controlHelper donde el bombeo de seguimiento automático podría interrumpirse inesperadamente. La lógica de parada fotovoltaica ahora respeta la prioridad de controlHelper y ya no detiene la bomba mientras el bombeo de seguimiento automático está activo. Además, el estado de solo lectura photovoltaic.threshold_w ahora está sincronizado correctamente con la configuración de la instancia para que los cambios en la configuración del adaptador se reflejen de manera confiable en el punto de datos visible.",
|
|
54
|
-
"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.",
|
|
55
|
-
"uk": "Реліз виправлення помилок. Вирішує проблему взаємодії між photovoltaicHelper і controlHelper, через яку автоматичне подальше відкачування може бути несподівано перервано. Логіка фотоелектричної зупинки тепер враховує пріоритет controlHelper і більше не зупиняє насос, поки активна автоматична подальша перекачування. Крім того, стан тільки для читання photovoltaic.threshold_w тепер правильно синхронізовано з конфігурацією екземпляра, щоб зміни в налаштуваннях адаптера надійно відображалися у видимій точці даних.",
|
|
56
|
-
"zh-cn": "错误修复版本。修复了 PVHelper 和 controlHelper 之间的交互问题,其中自动后续泵送可能会意外中断。光伏停止逻辑现在尊重 controlHelper 优先级,并且在自动后续泵送处于活动状态时不再停止泵。此外,只读状态 PV.threshold_w 现在已与实例配置正确同步,以便适配器设置中的更改能够可靠地反映在可见数据点中。"
|
|
57
|
-
},
|
|
58
|
-
"1.2.18": {
|
|
59
|
-
"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.",
|
|
60
|
-
"de": "Persistenzprobleme für Saison- und Frost-States behoben. season_active wird beim Adapterstart nicht mehr überschrieben. Frostschutz-Einstellungen werden nun dauerhaft gespeichert.",
|
|
61
|
-
"ru": "Исправлены проблемы с постоянством состояний сезона и заморозков. Season_active теперь больше не перезаписывается при запуске адаптера. Настройки защиты от замерзания теперь сохраняются постоянно.",
|
|
62
|
-
"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.",
|
|
63
|
-
"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.",
|
|
64
|
-
"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.",
|
|
65
|
-
"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.",
|
|
66
|
-
"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.",
|
|
67
|
-
"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.",
|
|
68
|
-
"uk": "Виправлено проблеми стійкості для сезону та морозу. Season_active тепер більше не перезаписується під час запуску адаптера. Параметри захисту від замерзання тепер зберігаються постійно.",
|
|
69
|
-
"zh-cn": "修复了季节和霜冻状态的持久性问题。 Season_active 现在不再在适配器启动时被覆盖。防霜保护设置现在可以永久存储。"
|
|
70
70
|
}
|
|
71
71
|
},
|
|
72
72
|
"titleLang": {
|
|
@@ -0,0 +1,299 @@
|
|
|
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
|
+
const speechSolarActive = requestActive && !blocked;
|
|
210
|
+
const oldSpeechSolarActive = (await this.adapter.getStateAsync('speech.solar_active'))?.val;
|
|
211
|
+
if (oldSpeechSolarActive !== speechSolarActive) {
|
|
212
|
+
await this.adapter.setStateChangedAsync('speech.solar_active', {
|
|
213
|
+
val: speechSolarActive,
|
|
214
|
+
ack: true,
|
|
215
|
+
});
|
|
216
|
+
}
|
|
217
|
+
|
|
218
|
+
await this.adapter.setStateChangedAsync('pump.pump_switch', {
|
|
219
|
+
val: speechSolarActive,
|
|
220
|
+
ack: false,
|
|
221
|
+
});
|
|
222
|
+
|
|
223
|
+
await this.adapter.setStateChangedAsync('solar.extended.enabled_by_master', {
|
|
224
|
+
val: enabledByMaster,
|
|
225
|
+
ack: true,
|
|
226
|
+
});
|
|
227
|
+
await this.adapter.setStateChangedAsync('solar.extended.request_active', {
|
|
228
|
+
val: requestActive,
|
|
229
|
+
ack: true,
|
|
230
|
+
});
|
|
231
|
+
await this.adapter.setStateChangedAsync('solar.extended.active', {
|
|
232
|
+
val: active,
|
|
233
|
+
ack: true,
|
|
234
|
+
});
|
|
235
|
+
await this.adapter.setStateChangedAsync('solar.extended.blocked', {
|
|
236
|
+
val: blocked,
|
|
237
|
+
ack: true,
|
|
238
|
+
});
|
|
239
|
+
await this.adapter.setStateChangedAsync('solar.extended.blocked_by', {
|
|
240
|
+
val: blockedBy,
|
|
241
|
+
ack: true,
|
|
242
|
+
});
|
|
243
|
+
await this.adapter.setStateChangedAsync('solar.extended.priority_status', {
|
|
244
|
+
val: priorityStatus,
|
|
245
|
+
ack: true,
|
|
246
|
+
});
|
|
247
|
+
await this.adapter.setStateChangedAsync('solar.extended.config_ok', {
|
|
248
|
+
val: configOk,
|
|
249
|
+
ack: true,
|
|
250
|
+
});
|
|
251
|
+
await this.adapter.setStateChangedAsync('solar.extended.actor_state', {
|
|
252
|
+
val: actorState,
|
|
253
|
+
ack: true,
|
|
254
|
+
});
|
|
255
|
+
await this.adapter.setStateChangedAsync('solar.extended.reason', {
|
|
256
|
+
val: reason,
|
|
257
|
+
ack: true,
|
|
258
|
+
});
|
|
259
|
+
await this.adapter.setStateChangedAsync('solar.extended.info', {
|
|
260
|
+
val: info,
|
|
261
|
+
ack: true,
|
|
262
|
+
});
|
|
263
|
+
|
|
264
|
+
const statusChanged =
|
|
265
|
+
oldEnabledByMaster !== enabledByMaster ||
|
|
266
|
+
oldRequestActive !== requestActive ||
|
|
267
|
+
oldActive !== active ||
|
|
268
|
+
oldBlocked !== blocked ||
|
|
269
|
+
oldBlockedBy !== blockedBy ||
|
|
270
|
+
oldPriorityStatus !== priorityStatus ||
|
|
271
|
+
oldConfigOk !== configOk ||
|
|
272
|
+
oldActorState !== actorState ||
|
|
273
|
+
oldReason !== reason ||
|
|
274
|
+
oldInfo !== info;
|
|
275
|
+
|
|
276
|
+
if (statusChanged) {
|
|
277
|
+
await this.adapter.setStateChangedAsync('solar.extended.last_change', {
|
|
278
|
+
val: Date.now(),
|
|
279
|
+
ack: true,
|
|
280
|
+
});
|
|
281
|
+
}
|
|
282
|
+
|
|
283
|
+
if (blocked) {
|
|
284
|
+
this.adapter.log.debug(`[solarExtendedHelper] Extended solar skipped (${blockedBy || 'blocked'})`);
|
|
285
|
+
}
|
|
286
|
+
} catch (err) {
|
|
287
|
+
this.adapter.log.warn(`[solarExtendedHelper] Error in check: ${err.message}`);
|
|
288
|
+
}
|
|
289
|
+
},
|
|
290
|
+
|
|
291
|
+
cleanup() {
|
|
292
|
+
if (this.checkTimer) {
|
|
293
|
+
clearInterval(this.checkTimer);
|
|
294
|
+
this.checkTimer = null;
|
|
295
|
+
}
|
|
296
|
+
},
|
|
297
|
+
};
|
|
298
|
+
|
|
299
|
+
module.exports = solarExtendedHelper;
|
|
@@ -33,6 +33,7 @@ const solarHelper = {
|
|
|
33
33
|
async _checkSolar() {
|
|
34
34
|
try {
|
|
35
35
|
const activeHelper = (await this.adapter.getStateAsync('pump.active_helper'))?.val || '';
|
|
36
|
+
const isExternalPriority = activeHelper === 'controlHelper' || activeHelper === 'timeHelper';
|
|
36
37
|
|
|
37
38
|
// --- NEU: Vorrangprüfung durch ControlHelper ---
|
|
38
39
|
if (activeHelper === 'controlHelper') {
|
|
@@ -41,7 +42,6 @@ const solarHelper = {
|
|
|
41
42
|
ack: true,
|
|
42
43
|
});
|
|
43
44
|
this.adapter.log.debug('[solarHelper] Priority by ControlHelper active – solar control paused.');
|
|
44
|
-
return;
|
|
45
45
|
}
|
|
46
46
|
|
|
47
47
|
// --- NEU: Vorrangprüfung durch TimeHelper ---
|
|
@@ -51,7 +51,6 @@ const solarHelper = {
|
|
|
51
51
|
ack: true,
|
|
52
52
|
});
|
|
53
53
|
this.adapter.log.debug('[solarHelper] Priority by TimeHelper active – solar control paused.');
|
|
54
|
-
return;
|
|
55
54
|
}
|
|
56
55
|
|
|
57
56
|
// --- NEU: Saisonstatus ---
|
|
@@ -60,6 +59,9 @@ const solarHelper = {
|
|
|
60
59
|
// Solarsteuerung aktiv?
|
|
61
60
|
const active = (await this.adapter.getStateAsync('solar.solar_control_active'))?.val;
|
|
62
61
|
|
|
62
|
+
// NEU: Solarsteuerungsmodus
|
|
63
|
+
const controlMode = (await this.adapter.getStateAsync('solar.control_mode'))?.val || 'standard';
|
|
64
|
+
|
|
63
65
|
// Pumpenmodus
|
|
64
66
|
const mode = (await this.adapter.getStateAsync('pump.mode'))?.val;
|
|
65
67
|
|
|
@@ -82,8 +84,21 @@ const solarHelper = {
|
|
|
82
84
|
return;
|
|
83
85
|
}
|
|
84
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
|
+
|
|
85
100
|
// --- Schaltlogik nur ausführen, wenn Saison aktiv, Solar aktiv und Modus AUTO ---
|
|
86
|
-
if (season && active && mode === 'auto') {
|
|
101
|
+
if (season && active && mode === 'auto' && isStandardMode && !isExternalPriority) {
|
|
87
102
|
let shouldRun = false;
|
|
88
103
|
const delta = collector - pool;
|
|
89
104
|
|
|
@@ -135,9 +150,13 @@ const solarHelper = {
|
|
|
135
150
|
? 'Saison inaktiv'
|
|
136
151
|
: !active
|
|
137
152
|
? 'Solarsteuerung aus'
|
|
138
|
-
:
|
|
139
|
-
?
|
|
140
|
-
:
|
|
153
|
+
: !isStandardMode
|
|
154
|
+
? `Solarmodus = ${controlMode}`
|
|
155
|
+
: isExternalPriority
|
|
156
|
+
? `Vorrang durch ${activeHelper}`
|
|
157
|
+
: mode !== 'auto'
|
|
158
|
+
? 'Pumpenmodus != auto'
|
|
159
|
+
: 'unbekannt';
|
|
141
160
|
this.adapter.log.debug(`[solarHelper] Solar control skipped (${reason})`);
|
|
142
161
|
}
|
|
143
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
|
}
|