iobroker.poolcontrol 1.2.22 → 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 +10 -5
- package/io-package.json +14 -14
- package/lib/helpers/solarExtendedHelper.js +285 -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,16 @@ 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
|
+
|
|
189
199
|
### 1.2.22 (2026-04-16)
|
|
190
200
|
|
|
191
201
|
- Added new read-only state `solar.request_active` to indicate when solar logic would request the pump
|
|
@@ -209,11 +219,6 @@ Release: 10.04.2026
|
|
|
209
219
|
- `photovoltaic.threshold_w` is now correctly synchronized with the instance configuration
|
|
210
220
|
- Changes to the PV surplus threshold in adapter settings are now reliably reflected in the corresponding read-only datapoint
|
|
211
221
|
|
|
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
222
|
## Support
|
|
218
223
|
- [ioBroker Forum](https://forum.iobroker.net/)
|
|
219
224
|
- [GitHub Issues](https://github.com/DasBo1975/ioBroker.poolcontrol/issues)
|
package/io-package.json
CHANGED
|
@@ -1,8 +1,21 @@
|
|
|
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
|
+
},
|
|
6
19
|
"1.2.22": {
|
|
7
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.",
|
|
8
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.",
|
|
@@ -54,19 +67,6 @@
|
|
|
54
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.",
|
|
55
68
|
"uk": "Реліз виправлення помилок. Вирішує проблему взаємодії між photovoltaicHelper і controlHelper, через яку автоматичне подальше відкачування може бути несподівано перервано. Логіка фотоелектричної зупинки тепер враховує пріоритет controlHelper і більше не зупиняє насос, поки активна автоматична подальша перекачування. Крім того, стан тільки для читання photovoltaic.threshold_w тепер правильно синхронізовано з конфігурацією екземпляра, щоб зміни в налаштуваннях адаптера надійно відображалися у видимій точці даних.",
|
|
56
69
|
"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,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;
|
|
@@ -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
|
}
|
package/lib/i18n/es.json
CHANGED
|
@@ -137,5 +137,41 @@
|
|
|
137
137
|
"Odor / irritation is often not too much chlorine, but incorrectly bound / organically loaded water.": "Olor / irritación a menudo no es demasiado cloro, sino agua ligada incorrectamente / cargada orgánicamente.",
|
|
138
138
|
|
|
139
139
|
"Note: This problem is not known yet.": "Nota: Este problema aún no se conoce.",
|
|
140
|
-
"Please select one of the existing items or use \"Issue unclear / not specific\".": "Seleccione uno de los elementos existentes o use \"Problema poco claro / no específico\"."
|
|
140
|
+
"Please select one of the existing items or use \"Issue unclear / not specific\".": "Seleccione uno de los elementos existentes o use \"Problema poco claro / no específico\".",
|
|
141
|
+
|
|
142
|
+
"Extended solar configuration invalid": "Configuración extendida de solar no válida",
|
|
143
|
+
"Solar Extended configuration invalid": "Configuración extendida de solar no válida",
|
|
144
|
+
"Priority blocked by controlHelper": "Prioridad bloqueada por controlHelper",
|
|
145
|
+
"Solar Extended blocked by controlHelper": "Solar extendido bloqueado por controlHelper",
|
|
146
|
+
"Priority blocked by timeHelper": "Prioridad bloqueada por timeHelper",
|
|
147
|
+
"Solar Extended blocked by timeHelper": "Solar extendido bloqueado por timeHelper",
|
|
148
|
+
"Solar master disabled": "Solar principal desactivado",
|
|
149
|
+
"Solar Extended disabled by main solar switch": "Solar extendido desactivado por el interruptor principal solar",
|
|
150
|
+
"Solar control mode is %s": "El modo de control solar es %s",
|
|
151
|
+
"Solar Extended inactive because standard solar mode is selected": "Solar extendido inactivo porque está seleccionado el modo solar estándar",
|
|
152
|
+
"Season inactive": "Temporada inactiva",
|
|
153
|
+
"Solar Extended inactive because the season is disabled": "Solar extendido inactivo porque la temporada está desactivada",
|
|
154
|
+
"Pump mode is %s": "El modo de la bomba es %s",
|
|
155
|
+
"Solar Extended inactive because pump mode is not auto": "Solar extendido inactivo porque el modo de la bomba no es automático",
|
|
156
|
+
"No valid temperature values available": "No hay valores de temperatura válidos disponibles",
|
|
157
|
+
"Solar Extended waiting for valid temperature values": "Solar extendido esperando valores de temperatura válidos",
|
|
158
|
+
"Pool temperature >= max temperature (%s >= %s)": "Temperatura de la piscina >= temperatura máxima (%s >= %s)",
|
|
159
|
+
"Solar Extended inactive because maximum pool temperature is reached": "Solar extendido inactivo porque se ha alcanzado la temperatura máxima de la piscina",
|
|
160
|
+
"Collector delta >= delta_on (%s >= %s)": "Diferencia del colector >= delta_on (%s >= %s)",
|
|
161
|
+
"Solar Extended requests heating from collector surplus": "Solar extendido solicita calefacción por exceso del colector",
|
|
162
|
+
"Collector delta <= delta_off (%s <= %s)": "Diferencia del colector <= delta_off (%s <= %s)",
|
|
163
|
+
"Solar Extended currently has no temperature request": "Solar extendido actualmente no tiene demanda de temperatura",
|
|
164
|
+
"Actor write failed: %s": "Error al escribir en el actuador: %s",
|
|
165
|
+
"Solar Extended could not write to the external actuator": "Solar extendido no pudo escribir en el actuador externo",
|
|
166
|
+
"extended blocked by invalid config": "extendido bloqueado por configuración inválida",
|
|
167
|
+
"extended blocked by controlHelper": "extendido bloqueado por controlHelper",
|
|
168
|
+
"extended blocked by timeHelper": "extendido bloqueado por timeHelper",
|
|
169
|
+
"extended blocked by master": "extendido bloqueado por el control principal",
|
|
170
|
+
"extended blocked by standard mode": "extendido bloqueado por el modo estándar",
|
|
171
|
+
"extended blocked by inactive season": "extendido bloqueado por temporada inactiva",
|
|
172
|
+
"extended blocked by pump mode": "extendido bloqueado por el modo de la bomba",
|
|
173
|
+
"extended waiting for temperatures": "extendido esperando temperaturas",
|
|
174
|
+
"extended blocked by actor write error": "extendido bloqueado por error de escritura en el actuador",
|
|
175
|
+
"extended active": "extendido activo",
|
|
176
|
+
"extended inactive": "extendido inactivo"
|
|
141
177
|
}
|
package/lib/i18n/fr.json
CHANGED
|
@@ -137,5 +137,41 @@
|
|
|
137
137
|
"Odor / irritation is often not too much chlorine, but incorrectly bound / organically loaded water.": "Odeur / irritation est souvent pas trop de chlore, mais de l'eau liée incorrectement / chargée organiquement.",
|
|
138
138
|
|
|
139
139
|
"Note: This problem is not known yet.": "Note : Ce problème n'est pas encore connu.",
|
|
140
|
-
"Please select one of the existing items or use \"Issue unclear / not specific\".": "Veuillez sélectionner l'un des éléments existants ou utiliser \"Problème peu clair / non spécifique\"."
|
|
140
|
+
"Please select one of the existing items or use \"Issue unclear / not specific\".": "Veuillez sélectionner l'un des éléments existants ou utiliser \"Problème peu clair / non spécifique\".",
|
|
141
|
+
|
|
142
|
+
"Extended solar configuration invalid": "Configuration solaire étendue invalide",
|
|
143
|
+
"Solar Extended configuration invalid": "Configuration solaire étendue invalide",
|
|
144
|
+
"Priority blocked by controlHelper": "Priorité bloquée par controlHelper",
|
|
145
|
+
"Solar Extended blocked by controlHelper": "Solaire étendu bloqué par controlHelper",
|
|
146
|
+
"Priority blocked by timeHelper": "Priorité bloquée par timeHelper",
|
|
147
|
+
"Solar Extended blocked by timeHelper": "Solaire étendu bloqué par timeHelper",
|
|
148
|
+
"Solar master disabled": "Solaire principal désactivé",
|
|
149
|
+
"Solar Extended disabled by main solar switch": "Solaire étendu désactivé par l’interrupteur principal solaire",
|
|
150
|
+
"Solar control mode is %s": "Le mode de contrôle solaire est %s",
|
|
151
|
+
"Solar Extended inactive because standard solar mode is selected": "Solaire étendu inactif car le mode solaire standard est sélectionné",
|
|
152
|
+
"Season inactive": "Saison inactive",
|
|
153
|
+
"Solar Extended inactive because the season is disabled": "Solaire étendu inactif car la saison est désactivée",
|
|
154
|
+
"Pump mode is %s": "Le mode de la pompe est %s",
|
|
155
|
+
"Solar Extended inactive because pump mode is not auto": "Solaire étendu inactif car le mode de la pompe n’est pas automatique",
|
|
156
|
+
"No valid temperature values available": "Aucune valeur de température valide disponible",
|
|
157
|
+
"Solar Extended waiting for valid temperature values": "Solaire étendu en attente de valeurs de température valides",
|
|
158
|
+
"Pool temperature >= max temperature (%s >= %s)": "Température de la piscine >= température maximale (%s >= %s)",
|
|
159
|
+
"Solar Extended inactive because maximum pool temperature is reached": "Solaire étendu inactif car la température maximale de la piscine est atteinte",
|
|
160
|
+
"Collector delta >= delta_on (%s >= %s)": "Différence du collecteur >= delta_on (%s >= %s)",
|
|
161
|
+
"Solar Extended requests heating from collector surplus": "Solaire étendu demande un chauffage via le surplus du collecteur",
|
|
162
|
+
"Collector delta <= delta_off (%s <= %s)": "Différence du collecteur <= delta_off (%s <= %s)",
|
|
163
|
+
"Solar Extended currently has no temperature request": "Solaire étendu n’a actuellement aucune demande de température",
|
|
164
|
+
"Actor write failed: %s": "Échec d’écriture de l’actionneur : %s",
|
|
165
|
+
"Solar Extended could not write to the external actuator": "Solaire étendu n’a pas pu écrire sur l’actionneur externe",
|
|
166
|
+
"extended blocked by invalid config": "étendu bloqué par configuration invalide",
|
|
167
|
+
"extended blocked by controlHelper": "étendu bloqué par controlHelper",
|
|
168
|
+
"extended blocked by timeHelper": "étendu bloqué par timeHelper",
|
|
169
|
+
"extended blocked by master": "étendu bloqué par le contrôle principal",
|
|
170
|
+
"extended blocked by standard mode": "étendu bloqué par le mode standard",
|
|
171
|
+
"extended blocked by inactive season": "étendu bloqué par saison inactive",
|
|
172
|
+
"extended blocked by pump mode": "étendu bloqué par le mode de la pompe",
|
|
173
|
+
"extended waiting for temperatures": "étendu en attente des températures",
|
|
174
|
+
"extended blocked by actor write error": "étendu bloqué par erreur d’écriture de l’actionneur",
|
|
175
|
+
"extended active": "étendu actif",
|
|
176
|
+
"extended inactive": "étendu inactif"
|
|
141
177
|
}
|