iobroker.poolcontrol 1.3.1 → 1.3.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -188,6 +188,20 @@ New features are added regularly – please refer to the changelog.
188
188
  ---
189
189
 
190
190
  ## Changelog
191
+ ### 1.3.3 (2026-04-18)
192
+
193
+ - Added solar COP calculation to evaluate system efficiency
194
+ - Added solar logbook helper with easy-to-read daily summaries for better user understanding
195
+
196
+ ### 1.3.2 (2026-04-17)
197
+
198
+ - Fix: Solar Extended no longer interferes with controlHelper or timeHelper (prevents unwanted pump shutdown)
199
+ - Fix: Solar Extended no longer interferes with standard solar mode
200
+ - Fix: Improved handling of external actuator (clean ON/OFF behavior depending on Solar Extended state)
201
+ - Improvement: Added stable delta hysteresis (delta_on / delta_off) to prevent switching fluctuations
202
+ - Improvement: Replaced global timers with adapter timers in solarExtendedHelper
203
+ - Cleanup: Removed duplicate reading of request_active state
204
+
191
205
  ### 1.3.1 (2026-04-17)
192
206
 
193
207
  - Fix: Solar Extended now correctly controls the pump
@@ -210,16 +224,6 @@ New features are added regularly – please refer to the changelog.
210
224
  - Added new read-only state `solar.request_active` to indicate when solar logic would request the pump
211
225
  - Improved solarHelper robustness by handling invalid temperature values
212
226
 
213
- ### 1.2.21 (2026-04-15)
214
-
215
- - Fixed photovoltaic afterrun timer restarting on every recalculation without PV surplus
216
- - Afterrun now starts only once and runs reliably to completion
217
- - Proper cleanup when surplus becomes active again during afterrun
218
-
219
- ### 1.2.20
220
- Release: 11.04.2026
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.
222
-
223
227
  ## Support
224
228
  - [ioBroker Forum](https://forum.iobroker.net/)
225
229
  - [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.3.1",
4
+ "version": "1.3.3",
5
5
  "news": {
6
+ "1.3.3": {
7
+ "en": "Added solar COP calculation and solar logbook helper with human-readable daily entries based on solar insights.",
8
+ "de": "Solar-COP-Berechnung sowie Solar-Logbuch-Helper mit verständlichen Tages-Einträgen basierend auf Solar-Insights hinzugefügt.",
9
+ "ru": "Добавлен расчет солнечного КПД и помощник в журнале солнечной энергии с удобочитаемыми ежедневными записями на основе данных о солнечной энергии.",
10
+ "pt": "Adicionado cálculo de COP solar e auxiliar de diário de bordo solar com entradas diárias legíveis por humanos com base em insights solares.",
11
+ "nl": "Zonne-COP-berekening en zonne-logboekhulp toegevoegd met voor mensen leesbare dagelijkse gegevens op basis van zonne-inzichten.",
12
+ "fr": "Ajout du calcul du COP solaire et d'un assistant de journal de bord solaire avec des entrées quotidiennes lisibles par l'homme basées sur des informations solaires.",
13
+ "it": "Aggiunto il calcolo del COP solare e l'assistente del registro solare con voci giornaliere leggibili dall'uomo basate su informazioni solari.",
14
+ "es": "Se agregó un cálculo de COP solar y un asistente de registro solar con entradas diarias legibles por humanos basadas en conocimientos solares.",
15
+ "pl": "Dodano obliczenia COP energii słonecznej i pomocnika dziennika słonecznego z czytelnymi dla człowieka codziennymi wpisami opartymi na spostrzeżeniach dotyczących energii słonecznej.",
16
+ "uk": "Додано розрахунок COP сонячної енергії та помічник сонячного журналу із зрозумілими для людини щоденними записами на основі даних про сонячну енергію.",
17
+ "zh-cn": "添加了太阳能 COP 计算和太阳能日志助手,其中包含基于太阳能洞察的人类可读的每日条目。"
18
+ },
19
+ "1.3.2": {
20
+ "en": "Fixed Solar Extended conflicts with controlHelper/timeHelper and standard solar mode, improved external actuator handling, added stable delta hysteresis, and aligned timer handling with adapter timers.",
21
+ "de": "Solar-Extended-Konflikte mit controlHelper/timeHelper und dem Standard-Solarmodus behoben, externe Aktorsteuerung verbessert, stabile Delta-Hysterese ergänzt und Timer auf Adapter-Timer umgestellt.",
22
+ "ru": "Исправлены конфликты Solar Extended с controlHelper/timeHelper и стандартным солнечным режимом, улучшено управление внешним приводом, добавлен стабильный дельта-гистерезис и согласована обработка таймера с таймерами адаптера.",
23
+ "pt": "Corrigidos conflitos Solar Extended com controlHelper/timeHelper e modo solar padrão, manuseio aprimorado do atuador externo, histerese delta estável adicionada e manuseio de temporizador alinhado com temporizadores adaptadores.",
24
+ "nl": "Vaste Solar Extended-conflicten met controlHelper/timeHelper en standaard zonnemodus, verbeterde afhandeling van externe actuatoren, toegevoegde stabiele delta-hysteresis en afgestemde timerafhandeling met adaptertimers.",
25
+ "fr": "Correction des conflits solaires étendus avec controlHelper/timeHelper et le mode solaire standard, gestion améliorée des actionneurs externes, ajout d'une hystérésis delta stable et gestion des minuteries alignées avec les minuteries de l'adaptateur.",
26
+ "it": "Risolti i conflitti Solar Extended con controlHelper/timeHelper e la modalità solare standard, migliore gestione dell'attuatore esterno, aggiunta isteresi delta stabile e gestione del timer allineata con i timer dell'adattatore.",
27
+ "es": "Se corrigieron los conflictos de Solar Extended con controlHelper/timeHelper y el modo solar estándar, manejo mejorado del actuador externo, histéresis delta estable agregada y manejo del temporizador alineado con temporizadores adaptadores.",
28
+ "pl": "Naprawiono konflikty Solar Extended z ControlHelper/timeHelper i standardowym trybem solarnym, ulepszono obsługę zewnętrznego siłownika, dodano stabilną histerezę delta i dostosowano obsługę timera z timerami adaptera.",
29
+ "uk": "Виправлено конфлікти Solar Extended з controlHelper/timeHelper і стандартним сонячним режимом, покращено обробку зовнішнього приводу, додано стабільний дельта-гістерезис і узгоджено обробку таймера з таймерами адаптера.",
30
+ "zh-cn": "修复了 Solar Extended 与 controlHelper/timeHelper 和标准太阳能模式的冲突,改进了外部执行器处理,添加了稳定的增量迟滞,以及与适配器计时器对齐的计时器处理。"
31
+ },
6
32
  "1.3.1": {
7
33
  "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
34
  "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.",
@@ -41,32 +67,6 @@
41
67
  "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.",
42
68
  "uk": "Додано новий стан solar.request_active лише для читання, щоб вказати, коли сонячна логіка запитуватиме насос. Покращена надійність solarHelper завдяки обробці недійсних значень температури.",
43
69
  "zh-cn": "添加了新的只读状态 Solar.request_active 以指示太阳能逻辑何时请求泵。通过处理无效温度值提高了 SolarHelper 的稳健性。"
44
- },
45
- "1.2.21": {
46
- "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.",
47
- "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.",
48
- "ru": "Исправление: исправлена ​​проблема в фотоэлектрическом помощнике, из-за которой таймер выключения непреднамеренно перезапускался при каждом перерасчете без избытка фотоэлектрической энергии. Это может значительно задержать остановку насоса. Последующий запуск теперь запускается только один раз, когда заканчивается избыток, и надежно выполняется до завершения. Также обеспечивает правильную очистку, когда излишки снова становятся активными во время выбега.",
49
- "pt": "Correção de bug: Corrigido um problema no auxiliar fotovoltaico em que o temporizador pós-execução era reiniciado involuntariamente em cada recálculo sem excedente de PV. Isto pode atrasar significativamente o encerramento da bomba. A pós-execução agora começa apenas uma vez quando o excedente termina e funciona de forma confiável até a conclusão. Também garante a limpeza adequada quando o excedente fica ativo novamente durante o pós-execução.",
50
- "nl": "Bugfix: Probleem opgelost in de fotovoltaïsche helper waarbij de nalooptimer onbedoeld opnieuw werd gestart bij elke herberekening zonder PV-overschot. Dit kan het uitschakelen van de pomp aanzienlijk vertragen. De afterrun start nu slechts één keer als het overschot op is en loopt betrouwbaar door tot voltooiing. Zorgt ook voor een goede opruiming wanneer het overschot weer actief wordt tijdens de afterrun.",
51
- "fr": "Correction d'un bug : correction d'un problème dans l'assistant photovoltaïque où la minuterie de post-exécution était involontairement redémarrée à chaque recalcul sans excédent PV. Cela pourrait retarder considérablement l’arrêt de la pompe. L'afterrun ne démarre désormais qu'une seule fois lorsque l'excédent se termine et se déroule de manière fiable jusqu'à son terme. Assure également un nettoyage approprié lorsque le surplus redevient actif pendant la post-exécution.",
52
- "it": "Bugfix: risolto un problema nell'helper fotovoltaico per cui il timer di postesecuzione veniva riavviato involontariamente ad ogni ricalcolo senza surplus fotovoltaico. Ciò potrebbe ritardare notevolmente l'arresto della pompa. L'afterrun ora inizia solo una volta quando termina il surplus e viene eseguito in modo affidabile fino al completamento. Garantisce inoltre una corretta pulizia quando il surplus diventa nuovamente attivo durante l'afterrun.",
53
- "es": "Corrección de errores: se solucionó un problema en el asistente fotovoltaico por el cual el temporizador de retardo se reiniciaba involuntariamente en cada recálculo sin excedente de fotovoltaico. Esto podría retrasar significativamente el apagado de la bomba. La ejecución posterior ahora comienza solo una vez cuando termina el excedente y se ejecuta de manera confiable hasta su finalización. También garantiza una limpieza adecuada cuando el excedente se vuelve a activar durante la ejecución posterior.",
54
- "pl": "Poprawka błędu: Naprawiono problem w pomocniku fotowoltaicznym polegający na niezamierzonym ponownym uruchomieniu licznika czasu dobiegu przy każdym ponownym obliczeniu bez nadwyżki PV. Może to znacznie opóźnić wyłączenie pompy. Dobieg rozpoczyna się teraz tylko raz, gdy kończy się nadwyżka i przebiega niezawodnie do końca. Zapewnia również właściwe czyszczenie, gdy nadwyżka stanie się ponownie aktywna podczas dobiegu.",
55
- "uk": "Виправлення помилки: виправлено проблему у фотоелектричному помічнику, через яку таймер післязапуску ненавмисно перезапускався під час кожного перерахунку без надлишку PV. Це може значно затримати зупинку насоса. Післязапуск тепер починається лише один раз, коли закінчується надлишок і працює надійно до кінця. Також забезпечує належне очищення, коли надлишки знову стають активними під час повторного циклу.",
56
- "zh-cn": "错误修复:修复了光伏助手中的一个问题,即每次重新计算时没有光伏剩余时,后运行计时器会无意中重新启动。这可能会显着延迟泵的关闭。现在,后运行仅在盈余结束时启动一次,并可靠地运行直至完成。还确保在后运行期间剩余物再次活跃时进行适当的清理。"
57
- },
58
- "1.2.20": {
59
- "en": "Bugfix release. Reduced unnecessary state writes in the status and photovoltaic helpers. Summary timestamps and PV update timestamps are now only written when the related functional result actually changes. This makes the adapter noticeably quieter and avoids needless state updates without changing the existing control logic.",
60
- "de": "Bugfix-Release. Reduziert unnötige State-Schreibvorgänge im Status- und Photovoltaik-Helper. Summary-Zeitstempel und PV-Aktualisierungszeitstempel werden jetzt nur noch dann geschrieben, wenn sich das zugehörige fachliche Ergebnis tatsächlich ändert. Dadurch arbeitet der Adapter spürbar ruhiger und vermeidet unnötige State-Updates, ohne die bestehende Steuerlogik zu verändern.",
61
- "ru": "Выпуск с исправлением ошибок. Уменьшено количество ненужных записей в статусе и фотоэлектрических помощниках. Сводные временные метки и временные метки обновления PV теперь записываются только тогда, когда соответствующий функциональный результат действительно изменяется. Это делает адаптер заметно тише и позволяет избежать ненужных обновлений состояния без изменения существующей логики управления.",
62
- "pt": "Lançamento de correção de bug. Gravações de estado desnecessárias reduzidas nos ajudantes de status e fotovoltaicos. Os carimbos de data e hora de resumo e os carimbos de data e hora de atualização do PV agora são gravados apenas quando o resultado funcional relacionado realmente muda. Isto torna o adaptador visivelmente mais silencioso e evita atualizações de estado desnecessárias sem alterar a lógica de controle existente.",
63
- "nl": "Bugfix-release. Verminderde onnodige statusschrijven in de status en fotovoltaïsche helpers. Samenvattende tijdstempels en tijdstempels voor PV-updates worden nu alleen geschreven als het gerelateerde functionele resultaat daadwerkelijk verandert. Dit maakt de adapter merkbaar stiller en vermijdt onnodige statusupdates zonder de bestaande besturingslogica te veranderen.",
64
- "fr": "Version de correction de bugs. Réduction des écritures d'état inutiles dans les aides d'état et photovoltaïques. Les horodatages récapitulatifs et les horodatages de mise à jour PV ne sont désormais écrits que lorsque le résultat fonctionnel associé change réellement. Cela rend l'adaptateur sensiblement plus silencieux et évite les mises à jour d'état inutiles sans modifier la logique de contrôle existante.",
65
- "it": "Rilascio di correzione bug. Ridotte le scritture di stato non necessarie nello stato e gli aiutanti fotovoltaici. I timestamp di riepilogo e quelli di aggiornamento PV ora vengono scritti solo quando il relativo risultato funzionale cambia effettivamente. Ciò rende l'adattatore notevolmente più silenzioso ed evita aggiornamenti di stato inutili senza modificare la logica di controllo esistente.",
66
- "es": "Lanzamiento de corrección de errores. Reducción de escrituras de estado innecesarias en el estado y ayudantes fotovoltaicos. Las marcas de tiempo de resumen y las marcas de tiempo de actualización de PV ahora solo se escriben cuando el resultado funcional relacionado realmente cambia. Esto hace que el adaptador sea notablemente más silencioso y evita actualizaciones de estado innecesarias sin cambiar la lógica de control existente.",
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.",
68
- "uk": "Реліз виправлення помилок. Зменшено непотрібні записи стану в статусі та фотоелектричні помічники. Підсумкові мітки часу та мітки часу оновлення PV тепер записуються лише тоді, коли відповідний функціональний результат фактично змінюється. Це робить адаптер помітно тихішим і дозволяє уникнути непотрібних оновлень стану без зміни існуючої логіки керування.",
69
- "zh-cn": "错误修复版本。减少状态和光伏助手中不必要的状态写入。摘要时间戳和 PV 更新时间戳现在仅在相关功能结果实际更改时写入。这使得适配器明显更安静,并且在不改变现有控制逻辑的情况下避免了不必要的状态更新。"
70
70
  }
71
71
  },
72
72
  "titleLang": {
@@ -26,12 +26,13 @@ const solarExtendedHelper = {
26
26
 
27
27
  _scheduleCheck() {
28
28
  if (this.checkTimer) {
29
- clearInterval(this.checkTimer);
29
+ this.adapter.clearInterval(this.checkTimer);
30
30
  }
31
31
 
32
- this.checkTimer = setInterval(() => this._checkSolarExtended(), 60 * 1000);
32
+ this.checkTimer = this.adapter.setInterval(() => this._checkSolarExtended(), 60 * 1000);
33
+
33
34
  // Beim Start sofort prüfen
34
- this._checkSolarExtended();
35
+ void this._checkSolarExtended();
35
36
  },
36
37
 
37
38
  async _checkSolarExtended() {
@@ -52,7 +53,7 @@ const solarExtendedHelper = {
52
53
  const controlInverted = (await this.adapter.getStateAsync('solar.extended.control_inverted'))?.val === true;
53
54
 
54
55
  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 oldRequestActive = (await this.adapter.getStateAsync('solar.extended.request_active'))?.val === true;
56
57
  const oldActive = (await this.adapter.getStateAsync('solar.extended.active'))?.val;
57
58
  const oldBlocked = (await this.adapter.getStateAsync('solar.extended.blocked'))?.val;
58
59
  const oldBlockedBy = (await this.adapter.getStateAsync('solar.extended.blocked_by'))?.val;
@@ -148,11 +149,12 @@ const solarExtendedHelper = {
148
149
  this.adapter.log.debug('[solarExtendedHelper] No valid temperatures available');
149
150
  } else {
150
151
  const delta = collector - pool;
152
+
153
+ requestActive = oldRequestActive;
154
+
151
155
  if (delta >= deltaOn && pool < maxTemperature) {
152
156
  requestActive = true;
153
- }
154
-
155
- if (delta <= deltaOff || pool >= maxTemperature) {
157
+ } else if (delta <= deltaOff || pool >= maxTemperature) {
156
158
  requestActive = false;
157
159
  }
158
160
 
@@ -178,10 +180,21 @@ const solarExtendedHelper = {
178
180
  actorWriteValue = !actorWriteValue;
179
181
  }
180
182
 
183
+ // FIX:
184
+ // Definiert den AUS-Zustand des externen Aktors abhängig von der Invertierung.
185
+ const actorOffValue = controlInverted ? true : false;
186
+
181
187
  if (actorConfigOk) {
182
188
  try {
183
- await this.adapter.setForeignStateAsync(controlObjectId, actorWriteValue, false);
184
- actorState = actorWriteValue;
189
+ // FIX:
190
+ // Der externe Aktor darf nur dann aktiv sein,
191
+ // wenn Solar Extended tatsächlich selbst aktiv ist.
192
+ // Bei Blockierung durch controlHelper/timeHelper
193
+ // oder ohne eigene Anforderung wird der Aktor deaktiviert.
194
+ const effectiveActorValue = !blocked ? actorWriteValue : actorOffValue;
195
+
196
+ await this.adapter.setForeignStateAsync(controlObjectId, effectiveActorValue, false);
197
+ actorState = effectiveActorValue;
185
198
 
186
199
  if (!blocked) {
187
200
  active = requestActive;
@@ -190,6 +203,8 @@ const solarExtendedHelper = {
190
203
  ? I18n.translate('extended active')
191
204
  : I18n.translate('extended inactive');
192
205
  }
206
+ } else {
207
+ active = false;
193
208
  }
194
209
  } catch (err) {
195
210
  blocked = true;
@@ -215,10 +230,16 @@ const solarExtendedHelper = {
215
230
  });
216
231
  }
217
232
 
218
- await this.adapter.setStateChangedAsync('pump.pump_switch', {
219
- val: speechSolarActive,
220
- ack: false,
221
- });
233
+ // FIX:
234
+ // Den zentralen Pumpenschalter nur dann schreiben,
235
+ // wenn Solar Extended überhaupt der zuständige Solarmodus ist
236
+ // und keine höhere Fremdpriorität aktiv ist.
237
+ if (isExtendedMode && !isControlPriority && !isTimePriority) {
238
+ await this.adapter.setStateChangedAsync('pump.pump_switch', {
239
+ val: speechSolarActive,
240
+ ack: false,
241
+ });
242
+ }
222
243
 
223
244
  await this.adapter.setStateChangedAsync('solar.extended.enabled_by_master', {
224
245
  val: enabledByMaster,
@@ -290,7 +311,7 @@ const solarExtendedHelper = {
290
311
 
291
312
  cleanup() {
292
313
  if (this.checkTimer) {
293
- clearInterval(this.checkTimer);
314
+ this.adapter.clearInterval(this.checkTimer);
294
315
  this.checkTimer = null;
295
316
  }
296
317
  },
@@ -23,11 +23,11 @@ const solarHelper = {
23
23
 
24
24
  _scheduleCheck() {
25
25
  if (this.checkTimer) {
26
- clearInterval(this.checkTimer);
26
+ this.adapter.clearInterval(this.checkTimer);
27
27
  }
28
- this.checkTimer = setInterval(() => this._checkSolar(), 60 * 1000);
28
+ this.checkTimer = this.adapter.setInterval(() => this._checkSolar(), 60 * 1000);
29
29
  // Beim Start sofort prüfen
30
- this._checkSolar();
30
+ void this._checkSolar();
31
31
  },
32
32
 
33
33
  async _checkSolar() {
@@ -211,7 +211,7 @@ const solarHelper = {
211
211
 
212
212
  cleanup() {
213
213
  if (this.checkTimer) {
214
- clearInterval(this.checkTimer);
214
+ this.adapter.clearInterval(this.checkTimer);
215
215
  this.checkTimer = null;
216
216
  }
217
217
  },