iobroker.poolcontrol 1.2.19 → 1.2.21

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
@@ -186,11 +186,18 @@ 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.2.21 (2026-04-15)
189
190
 
190
- ## Changelog
191
+ - Fixed photovoltaic afterrun timer restarting on every recalculation without PV surplus
192
+ - Afterrun now starts only once and runs reliably to completion
193
+ - Proper cleanup when surplus becomes active again during afterrun
191
194
 
192
- ## 1.2.19 (2026-04-10)
195
+ ### 1.2.20
196
+ Release: 11.04.2026
197
+ - (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.
193
198
 
199
+ ### 1.2.19
200
+ Release: 10.04.2026
194
201
  - Fixed an interaction issue between `photovoltaicHelper` and `controlHelper` where automatic follow-up pumping could be stopped unexpectedly
195
202
  - photovoltaicHelper now respects controlHelper priority and no longer stops the pump while automatic follow-up pumping is active
196
203
  - Fixed an issue where `controlHelper` could remain in "nachpumpen" state if the pump was stopped externally
@@ -206,241 +213,6 @@ Release: 07.04.2026
206
213
  Release: 07.04.2026
207
214
  - Fix: Resolved an issue where the pressure learning reset button did not trigger reliably. The pumpHelper4 now explicitly subscribes to its relevant internal states to ensure proper event handling.
208
215
 
209
- ### 1.2.15
210
- Release: 22.03.2026
211
- - Fix i18n usage (replace I18n.t with I18n.translate) to resolve adapter startup crash and restart loop on certain systems.
212
-
213
- ### 1.2.14
214
- Release: 22.03.2026
215
- - ### add i18n support for chemistry help texts
216
-
217
- ### 1.2.13
218
- Release: 22.03.2026
219
- - Added multilingual state names and descriptions (DE/EN)
220
- - Improved consistency of all state texts
221
- - Minor text and structure refinements
222
-
223
- ### 1.2.12
224
- Release: 21.03.2026
225
- - Repository cleanup and fixes for ioBroker repository checker
226
- - Restored required native object in io-package.json
227
- - Removed invalid properties and outdated entries
228
- - Updated README
229
-
230
- ### 1.2.11
231
- - Repository cleanup (ioBroker checker issues resolved)
232
- - Removed invalid properties from io-package.json
233
- - README updated
234
-
235
- ### 1.2.10 (2026-03-20)
236
- - Improved German translations in the admin UI (jsonConfig)
237
- - Fixed incorrect and misleading terminology (e.g. flow vs. temperature sensors)
238
- - Improved consistency and wording across all configuration options
239
-
240
- ### 1.2.9
241
- Release: 19.03.2026
242
- - fix: correct invalid common object in runtime channel.
243
-
244
- ### 1.2.7
245
- Released: 16.03.2026
246
- - Corrected role definitions for writable states according to ioBroker guidelines
247
- - Several internal learning and diagnostic states set to read-only
248
- - Removed obsolete files from repository
249
-
250
- ### 1.2.6
251
- Released: 12.03.2026
252
- - Fixed remaining adapter checker issues
253
- - Updated release-script plugins to latest versions
254
- - Converted remaining log messages to English
255
- - Updated dependabot configuration (added github-actions ecosystem)
256
- - Reduced `common.news` entries in io-package.json to comply with repository requirements
257
-
258
- ### 1.2.5
259
- Released: 07.03.2026
260
- - Fixed an issue in `actuatorsHelper` where state changes were not handled correctly in certain situations
261
- - Minor internal improvements and stability fixes
262
-
263
- ### 1.2.4
264
- Release: 07.03.2026
265
- - Fix: actuatorsHelper did not synchronize instance configuration with internal states (active/name). Additional actuators could not be activated.
266
-
267
- ### 1.2.3
268
- Released: 06.03.2026
269
- - Replaced native timers (setTimeout / setInterval) with adapter timers (adapter.setTimeout / adapter.setInterval)
270
- - Added proper cleanup of timers on adapter unload
271
- - Internal code cleanup and maintenance improvements
272
-
273
- ### 1.2.2
274
- Released: 06.03.2026
275
- - Raised required admin version to >=7.6.20
276
- - Updated translations after jsonConfig i18n refactoring
277
- - Maintenance update (no functional changes)
278
-
279
- ### 1.2.1
280
- Released: 06.03.2026
281
- - Migration of admin configuration to i18n translation environment
282
- - jsonConfig now uses English labels with translations managed in admin/i18n
283
- - Translations generated using `npm run translate`
284
-
285
- ### 1.2.0
286
- Released: 15.02.2026
287
- - Activation of multilingual support (i18n) in jsonConfig
288
- - Bilingual labeling (German/English) of instance configuration
289
- - No functional changes to the adapter
290
-
291
-
292
- ## v1.1.0 Pump Power Recommendation (23.01.2026)
293
- - **Pump Power Recommendation (from v1.1.0)**
294
- - New passive section `pump.speed`
295
- - Derives a clear logical performance state of the running pump:
296
- - `off`, `frost`, `low`, `normal`, `high`, `boost`
297
- - Performance state is based exclusively on:
298
- - existing pump logic
299
- - active helper (e.g., frost, solar, maintenance)
300
- - current pump status
301
- - Additionally provides a **recommended pump power in percent (0–100%)**
302
- - Percentage values are **freely configurable** and **protected against overinstallation**
303
- - **No active speed control**
304
- - **No interference with existing pump control**
305
- - Intended for connection to external systems such as:
306
- - Shelly 0–10 V
307
- - Frequency converters
308
- - Blockly / scripts
309
-
310
-
311
- ## v1.0.0 Additional Actuators (Lighting & Auxiliary Pumps) (02.01.2026)
312
- - Control of optional pool actuators:
313
- - Pool lighting (up to 3 channels)
314
- - Auxiliary pumps / attractions (up to 3 channels)
315
- - Full configuration via the Admin interface:
316
- - Activation per actuator via checkbox
317
- - Assignment of an **external object ID**
318
- (e.g., switchable socket or boolean control state)
319
- - Supported operating modes:
320
- - On / Off
321
- - Timed operation (runtime in minutes)
322
- - Continuous operation
323
- - Internal status and control states:
324
- - current operating state
325
- - remaining runtime
326
- - switching status and operating mode
327
- - Clear system separation:
328
- - Additional actuators do **not**
329
- affect pump, solar, heating, or AI logic
330
- - Purely optional system extension
331
-
332
-
333
- ## v0.9.0
334
- - Introduction of heating / heat pump control (`heatHelper`)
335
- - Automatic heating request based on pool temperature
336
- - Target and maximum temperature configurable
337
- - Support for:
338
- - switchable sockets
339
- - boolean control states
340
- - Pump overrun time after heating ends
341
- - Priority system:
342
- - Maintenance mode blocks heating control
343
- - Active only in automatic mode
344
- - Considers season status
345
- - Ownership protection for pump control
346
- - New internal state `heat.heating_request` for external evaluation
347
-
348
-
349
- ## v0.8.2 (2025-12-25)
350
- - New AI module **Chemistry Help** (`aiChemistryHelpHelper`)
351
- - Purely informative support system for pool water chemistry
352
- - Selection of typical pool problems (e.g., pH too high/low, chlorine ineffective, green/cloudy water)
353
- - Clear cause and solution hints as text output
354
- - No automatic dosing
355
- - No product recommendations
356
- - No device or pump control
357
- - No speech output (purely visual information)
358
- - New data points under `ai.chemistry_help.*`
359
-
360
-
361
- ## v0.8.0 (2025-12-08)
362
- - Modules: Weather hints (Open-Meteo), pool tips, daily summary, weekend report
363
- - Automatic text outputs with optional speech output
364
- - Hourly weather updates for continuous refresh
365
- - Anti-spam system to avoid duplicate hints
366
- - New AI forecast system `aiForecastHelper` integrated
367
- - Creates a daily automatic “Forecast for Tomorrow” including:
368
- - temperature range
369
- - weather description
370
- - rain probability
371
- - wind analysis (light / moderate / strong)
372
- - pool recommendations for the following day
373
- - New switches, schedules and outputs under `ai.weather.*`
374
- - Immediate initial execution after instance start added
375
- - Extended Admin overview under “Help & Info” with important AI notes
376
- - Improved internal structure of the AI system (aiHelper + aiForecastHelper)
377
-
378
-
379
- ## v0.7.4 (2025-12-03)
380
- - Fixed bug in ControlHelper. Persistent protection for control.circulation.mode
381
-
382
-
383
- ## v0.7.0 (2025-11-29)
384
- - Introduction of a new pressure sensor system under `pump.pressure.*`
385
- - Support for external pressure sensor object ID (bar value from ioBroker)
386
- - Trend detection (rising/falling/stable) and moving pressure average
387
- - Self-learning min/max pressure values with manual reset state
388
- - New diagnostic text (`status_text_diagnostic`) with extended analysis information
389
- - Extended pump monitoring without automatic control logic (purely informational)
390
-
391
-
392
- ## v0.6.2 (2025-11-07)
393
- - Revision of instance overview with new header structures for clearer operation
394
- - New start page image “Egon in Workwear” integrated into the Admin interface
395
- - Extension of speech system with configurable Alexa output times
396
- - Adjustments and cleanup in jsonConfig, speechHelper and speechStates
397
-
398
-
399
- ## v0.6.0 (2025-11-03)
400
- - Introduction of full photovoltaic control with automatic pump logic
401
- (new pump mode `Automatic (PV)` under `pump.mode`)
402
- - Adapter reacts to PV surplus based on configurable household consumption and generation power
403
- - Start logic: pump ON when surplus ≥ (rated power + threshold)
404
- - Considers season status, overrun time and optional “circulation reached” protection
405
- - Automatic migration adds new mode `auto_pv` to existing installations
406
- - Improved internal logic, persistence and debug logging
407
-
408
- ## v0.5.5 (2025-11-01)
409
- - Fixed endless loop in weekly and monthly statistics
410
-
411
- ## v0.5.3 (2025-10-30)
412
- - Added Telegram user selection
413
-
414
- ## v0.5.2 (2025-10-30)
415
-
416
- ## v0.5.0 (2025-10-28)
417
-
418
- ### **0.4.0 (26.10.2025)**
419
-
420
- **New Features**
421
- - Introduction of the new statistics system under `analytics.statistics.temperature.today`
422
- - Automatic collection of **min, max and average values** of all active temperature sensors
423
- - Per sensor: JSON and HTML summaries with continuous updates
424
- - Overall output of all sensors (table) under
425
- `analytics.statistics.temperature.today.outputs.summary_all_html`
426
- - Fully **persistent data points** with overinstall protection
427
- - **Automatic midnight reset** for daily reset including timestamp
428
- - Preparation for future weekly, monthly and seasonal statistics
429
-
430
- **Improvements**
431
- - Unified structure through new main folder `analytics`
432
- - No permanent loops or timer load – pure event processing
433
- - Improved performance and memory stability
434
- - Revised initialization of all statistics states at startup
435
-
436
- **Note**
437
- This version forms the stable basis for all following statistics and analysis functions
438
- (e.g., weekly and monthly statistics, history and efficiency evaluations).
439
-
440
- *(older versions see [io-package.json](./io-package.json))*
441
-
442
- ---
443
-
444
216
  ## Support
445
217
  - [ioBroker Forum](https://forum.iobroker.net/)
446
218
  - [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.2.19",
4
+ "version": "1.2.21",
5
5
  "news": {
6
+ "1.2.21": {
7
+ "en": "Bugfix: Fixed an issue in the photovoltaic helper where the afterrun timer was unintentionally restarted on every recalculation without PV surplus. This could delay the pump shutdown significantly. The afterrun now starts only once when surplus ends and runs reliably to completion. Also ensures proper cleanup when surplus becomes active again during afterrun.",
8
+ "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.",
9
+ "ru": "Исправление: исправлена ​​проблема в фотоэлектрическом помощнике, из-за которой таймер выключения непреднамеренно перезапускался при каждом перерасчете без избытка фотоэлектрической энергии. Это может значительно задержать остановку насоса. Последующий запуск теперь запускается только один раз, когда заканчивается избыток, и надежно выполняется до завершения. Также обеспечивает правильную очистку, когда излишки снова становятся активными во время выбега.",
10
+ "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.",
11
+ "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.",
12
+ "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.",
13
+ "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.",
14
+ "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.",
15
+ "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.",
16
+ "uk": "Виправлення помилки: виправлено проблему у фотоелектричному помічнику, через яку таймер післязапуску ненавмисно перезапускався під час кожного перерахунку без надлишку PV. Це може значно затримати зупинку насоса. Післязапуск тепер починається лише один раз, коли закінчується надлишок і працює надійно до кінця. Також забезпечує належне очищення, коли надлишки знову стають активними під час повторного циклу.",
17
+ "zh-cn": "错误修复:修复了光伏助手中的一个问题,即每次重新计算时没有光伏剩余时,后运行计时器会无意中重新启动。这可能会显着延迟泵的关闭。现在,后运行仅在盈余结束时启动一次,并可靠地运行直至完成。还确保在后运行期间剩余物再次活跃时进行适当的清理。"
18
+ },
19
+ "1.2.20": {
20
+ "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.",
21
+ "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.",
22
+ "ru": "Выпуск с исправлением ошибок. Уменьшено количество ненужных записей в статусе и фотоэлектрических помощниках. Сводные временные метки и временные метки обновления PV теперь записываются только тогда, когда соответствующий функциональный результат действительно изменяется. Это делает адаптер заметно тише и позволяет избежать ненужных обновлений состояния без изменения существующей логики управления.",
23
+ "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.",
24
+ "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.",
25
+ "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.",
26
+ "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.",
27
+ "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.",
28
+ "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.",
29
+ "uk": "Реліз виправлення помилок. Зменшено непотрібні записи стану в статусі та фотоелектричні помічники. Підсумкові мітки часу та мітки часу оновлення PV тепер записуються лише тоді, коли відповідний функціональний результат фактично змінюється. Це робить адаптер помітно тихішим і дозволяє уникнути непотрібних оновлень стану без зміни існуючої логіки керування.",
30
+ "zh-cn": "错误修复版本。减少状态和光伏助手中不必要的状态写入。摘要时间戳和 PV 更新时间戳现在仅在相关功能结果实际更改时写入。这使得适配器明显更安静,并且在不改变现有控制逻辑的情况下避免了不必要的状态更新。"
31
+ },
6
32
  "1.2.19": {
7
33
  "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.",
8
34
  "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.",
@@ -41,32 +67,6 @@
41
67
  "pl": "Poprawka: rozwiązano problem polegający na tym, że przycisk resetowania uczenia się ciśnienia nie uruchamiał się niezawodnie. PumpHelper4 teraz jawnie subskrybuje swoje odpowiednie stany wewnętrzne (np. wartości resetowania i konfiguracji), zapewniając prawidłową obsługę zdarzeń i natychmiastowe wykonanie logiki resetowania.",
42
68
  "uk": "Виправлення: вирішено проблему, через яку кнопка скидання навчання тиску не спрацьовувала надійно. PumpHelper4 тепер явно підписується на свої відповідні внутрішні стани (наприклад, значення скидання та конфігурації), забезпечуючи правильну обробку подій і негайне виконання логіки скидання.",
43
69
  "zh-cn": "修复:解决了压力学习重置按钮无法可靠触发的问题。 PumpHelper4 现在显式订阅其相关的内部状态(例如重置和配置值),确保正确的事件处理和立即执行重置逻辑。"
44
- },
45
- "1.2.15": {
46
- "en": "Fix i18n usage (replace I18n.t with I18n.translate) to resolve adapter startup crash and restart loop on certain systems.",
47
- "de": "i18n-Nutzung korrigiert (I18n.t durch I18n.translate ersetzt), um Absturz beim Adapterstart und Restart-Loop auf bestimmten Systemen zu beheben.",
48
- "ru": "Исправьте использование i18n (замените I18n.t на I18n.translate), чтобы устранить сбой при запуске адаптера и цикл перезапуска в определенных системах.",
49
- "pt": "Corrija o uso do i18n (substitua I18n.t por I18n.translate) para resolver falha na inicialização do adaptador e loop de reinicialização em determinados sistemas.",
50
- "nl": "I18n-gebruik repareren (vervang I18n.t door I18n.translate) om de opstartcrash van de adapter en de herstartlus op bepaalde systemen op te lossen.",
51
- "fr": "Correction de l'utilisation de i18n (remplacez I18n.t par I18n.translate) pour résoudre le crash de démarrage de l'adaptateur et la boucle de redémarrage sur certains systèmes.",
52
- "it": "Correggere l'utilizzo di i18n (sostituire I18n.t con I18n.translate) per risolvere il crash di avvio dell'adattatore e riavviare il ciclo su alcuni sistemi.",
53
- "es": "Corrija el uso de i18n (reemplace I18n.t con I18n.translate) para resolver el bloqueo de inicio del adaptador y el ciclo de reinicio en ciertos sistemas.",
54
- "pl": "Napraw użycie i18n (zamień I18n.t na I18n.translate), aby rozwiązać awarię uruchamiania adaptera i pętlę restartu w niektórych systemach.",
55
- "uk": "Виправте використання i18n (замініть I18n.t на I18n.translate), щоб усунути збій запуску адаптера та цикл перезапуску в певних системах.",
56
- "zh-cn": "修复 i18n 使用情况(将 I18n.t 替换为 I18n.translate),以解决某些系统上的适配器启动崩溃和重新启动循环问题。"
57
- },
58
- "1.2.14": {
59
- "en": "Add i18n support for chemistry help (common.states and help texts), fix React issues caused by invalid translations, and improve multilingual user guidance.",
60
- "de": "i18n-Unterstützung für Chemie-Hilfe hinzugefügt (common.states und Hilfetexte), React-Fehler durch fehlerhafte Übersetzungen behoben und mehrsprachige Benutzerführung verbessert.",
61
- "ru": "Добавьте поддержку i18n для справки по химии (common.states и справочные тексты), исправьте проблемы React, вызванные неверными переводами, и улучшите многоязычное руководство пользователя.",
62
- "pt": "Adicione suporte i18n para ajuda química (common.states e textos de ajuda), corrija problemas do React causados ​​por traduções inválidas e melhore a orientação multilíngue do usuário.",
63
- "nl": "Voeg i18n-ondersteuning toe voor scheikundige hulp (common.states en helpteksten), repareer React-problemen veroorzaakt door ongeldige vertalingen en verbeter de meertalige gebruikersbegeleiding.",
64
- "fr": "Ajoutez la prise en charge d'i18n pour l'aide chimique (common.states et textes d'aide), corrigez les problèmes de React causés par des traductions non valides et améliorez le guidage utilisateur multilingue.",
65
- "it": "Aggiungi il supporto i18n per la guida in chimica (common.states e testi di aiuto), risolvi i problemi di React causati da traduzioni non valide e migliora la guida utente multilingue.",
66
- "es": "Agregue soporte i18n para ayuda sobre química (estados comunes y textos de ayuda), solucione problemas de React causados ​​por traducciones no válidas y mejore la guía del usuario multilingüe.",
67
- "pl": "Dodaj obsługę i18n dla pomocy chemicznej (stany wspólne i teksty pomocy), rozwiąż problemy z React spowodowane nieprawidłowymi tłumaczeniami i ulepsz wielojęzyczne wskazówki dla użytkownika.",
68
- "uk": "Додайте підтримку i18n для довідки з хімії (common.states і тексти довідки), виправте проблеми з React, викликані недійсними перекладами, і покращте багатомовні інструкції для користувачів.",
69
- "zh-cn": "添加对化学帮助(common.states 和帮助文本)的 i18n 支持,修复无效翻译导致的 React 问题,并改进多语言用户指南。"
70
70
  }
71
71
  },
72
72
  "titleLang": {
@@ -130,18 +130,39 @@ const photovoltaicHelper = {
130
130
 
131
131
  // Überschussberechnung
132
132
  const surplus = Math.max(0, gen - house);
133
- await this._updateNumberState('photovoltaic.power_surplus_w', surplus);
134
133
 
135
134
  // **NEU:** Einschaltlogik = Pumpenleistung + Sicherheitsaufschlag
136
135
  const requiredPower = pumpMax + threshold;
137
136
  const surplusActive = surplus >= requiredPower && seasonActive;
138
- await this._updateBoolState('photovoltaic.surplus_active', surplusActive);
139
137
 
140
138
  const txt = surplusActive
141
139
  ? `Überschuss aktiv (${surplus} W ≥ ${pumpMax}+${threshold} W)`
142
140
  : `Kein Überschuss (${surplus} W < ${pumpMax}+${threshold} W)`;
143
- await this._updateStringState('photovoltaic.status_text', txt);
144
- await this._updateStringState('photovoltaic.last_update', new Date().toISOString());
141
+
142
+ // FIX: Bestehende Ergebnisstates zuerst lesen, damit last_update nur bei echter Ergebnisänderung gesetzt wird
143
+ const currentSurplus = Number((await this.adapter.getStateAsync('photovoltaic.power_surplus_w'))?.val ?? 0);
144
+ const currentSurplusActive = !!(await this.adapter.getStateAsync('photovoltaic.surplus_active'))?.val;
145
+ const currentStatusText = (await this.adapter.getStateAsync('photovoltaic.status_text'))?.val ?? '';
146
+
147
+ const surplusChanged = currentSurplus !== surplus;
148
+ const surplusActiveChanged = currentSurplusActive !== surplusActive;
149
+ const statusTextChanged = currentStatusText !== txt;
150
+
151
+ if (surplusChanged) {
152
+ await this._updateNumberState('photovoltaic.power_surplus_w', surplus); // FIX
153
+ }
154
+
155
+ if (surplusActiveChanged) {
156
+ await this._updateBoolState('photovoltaic.surplus_active', surplusActive); // FIX
157
+ }
158
+
159
+ if (statusTextChanged) {
160
+ await this._updateStringState('photovoltaic.status_text', txt); // FIX
161
+ }
162
+
163
+ if (surplusChanged || surplusActiveChanged || statusTextChanged) {
164
+ await this._updateStringState('photovoltaic.last_update', new Date().toISOString()); // FIX
165
+ }
145
166
 
146
167
  // Saison/Modus prüfen
147
168
  if (!seasonActive) {
@@ -218,15 +239,19 @@ const photovoltaicHelper = {
218
239
  },
219
240
 
220
241
  async _maybeStartPump(reason) {
221
- if (this._desiredPump === true) {
222
- return;
223
- }
224
- this._desiredPump = true;
242
+ // FIX: Wenn während eines laufenden Nachlaufs wieder Überschuss kommt,
243
+ // muss der Nachlauf-Timer immer beendet werden
225
244
  if (this.afterrunTimer) {
226
245
  clearTimeout(this.afterrunTimer);
227
246
  this.afterrunTimer = null;
228
247
  }
229
248
  this._pvPumpHoldUntil = 0;
249
+
250
+ if (this._desiredPump === true) {
251
+ return;
252
+ }
253
+
254
+ this._desiredPump = true;
230
255
  this.adapter.log.info(`[photovoltaicHelper] Pump ON (reason: ${reason})`);
231
256
  await this._setPumpSwitch(true);
232
257
  },
@@ -246,9 +271,17 @@ const photovoltaicHelper = {
246
271
  }
247
272
 
248
273
  if (immediate || !afterrunMin || afterrunMin <= 0) {
274
+ // FIX: Laufenden Nachlauf-Timer bei Sofort-Aus immer sauber beenden
275
+ if (this.afterrunTimer) {
276
+ clearTimeout(this.afterrunTimer);
277
+ this.afterrunTimer = null;
278
+ }
279
+ this._pvPumpHoldUntil = 0;
280
+
249
281
  if (this._desiredPump === false) {
250
282
  return;
251
283
  }
284
+
252
285
  this._desiredPump = false;
253
286
  this.adapter.log.info(`[photovoltaicHelper] Pump OFF (${tag}, no afterrun)`);
254
287
  await this._setPumpSwitch(false);
@@ -256,11 +289,19 @@ const photovoltaicHelper = {
256
289
  }
257
290
 
258
291
  const holdMs = Math.round(afterrunMin * 60 * 1000);
259
- this._pvPumpHoldUntil = Date.now() + holdMs;
292
+
293
+ // FIX: Nachlauf nur einmal starten, nicht bei jedem Recalc neu setzen
260
294
  if (this.afterrunTimer) {
261
- clearTimeout(this.afterrunTimer);
295
+ this.adapter.log.debug(`[photovoltaicHelper] Afterrun already active, timer not restarted (${tag})`);
296
+ return;
262
297
  }
298
+
299
+ this._pvPumpHoldUntil = Date.now() + holdMs;
263
300
  this.afterrunTimer = setTimeout(async () => {
301
+ // FIX: Timer-Handle direkt freigeben, damit der Zustand sauber ist
302
+ this.afterrunTimer = null;
303
+ this._pvPumpHoldUntil = 0;
304
+
264
305
  if (await this._isControlHelperPriorityActive()) {
265
306
  this.adapter.log.debug(
266
307
  '[photovoltaicHelper] Afterrun stop suppressed because controlHelper currently has priority.',
@@ -274,10 +315,12 @@ const photovoltaicHelper = {
274
315
  this.adapter.log.debug('[photovoltaicHelper] Afterrun canceled – surplus active again.');
275
316
  return;
276
317
  }
318
+
277
319
  this._desiredPump = false;
278
320
  this.adapter.log.info('[photovoltaicHelper] Pump OFF (afterrun finished)');
279
321
  await this._setPumpSwitch(false);
280
322
  }, holdMs);
323
+
281
324
  this.adapter.log.debug(`[photovoltaicHelper] Afterrun started: ${afterrunMin} min (${tag})`);
282
325
  },
283
326
 
@@ -229,7 +229,7 @@ const statisticsHelperMonth = {
229
229
  await adapter.setStateAsync(`${basePath}.temp_max`, { val: newMax, ack: true });
230
230
  await adapter.setStateAsync(`${basePath}.temp_avg`, { val: Math.round(newAvg * 100) / 100, ack: true });
231
231
  await adapter.setStateAsync(`${basePath}.data_points_count`, { val: newCount, ack: true });
232
- await adapter.setStateAsync(`${basePath}.last_update`, { val: now, ack: true });
232
+ await adapter.setStateAsync(`${basePath}.last_update`, { val: now, ack: true }); // FIX: Doppelwrite entfernt
233
233
 
234
234
  const summary = {
235
235
  name: 'Monatsstatistik',
@@ -157,16 +157,8 @@ const statusHelper = {
157
157
  }
158
158
  text += `. Tageslaufzeit: ${runtimeFormatted} (${circulationPct}% der Soll-Umwälzung).`;
159
159
 
160
- // In States schreiben (nur bei Änderung)
161
- const current = (await this.adapter.getStateAsync('status.summary'))?.val;
162
- if (current !== text) {
163
- await this.adapter.setStateAsync('status.summary', { val: text, ack: true });
164
- }
165
-
166
- await this.adapter.setStateAsync('status.last_summary_update', {
167
- val: new Date().toISOString(),
168
- ack: true,
169
- });
160
+ // FIX: Bestehende Werte zuerst lesen, damit last_summary_update nur bei echter Änderung gesetzt wird
161
+ const currentSummary = (await this.adapter.getStateAsync('status.summary'))?.val ?? '';
170
162
 
171
163
  // JSON-Übersicht bauen
172
164
  const json = {
@@ -179,10 +171,29 @@ const statusHelper = {
179
171
  runtime_formatted: runtimeFormatted,
180
172
  circulation_pct: circulationPct,
181
173
  };
182
- await this.adapter.setStateAsync('status.overview_json', {
183
- val: JSON.stringify(json),
184
- ack: true,
185
- });
174
+ const overviewJson = JSON.stringify(json);
175
+ const currentOverview = (await this.adapter.getStateAsync('status.overview_json'))?.val ?? '';
176
+
177
+ const summaryChanged = currentSummary !== text;
178
+ const overviewChanged = currentOverview !== overviewJson;
179
+
180
+ if (summaryChanged) {
181
+ await this.adapter.setStateAsync('status.summary', { val: text, ack: true }); // FIX
182
+ }
183
+
184
+ if (overviewChanged) {
185
+ await this.adapter.setStateAsync('status.overview_json', {
186
+ val: overviewJson,
187
+ ack: true,
188
+ }); // FIX
189
+ }
190
+
191
+ if (summaryChanged || overviewChanged) {
192
+ await this.adapter.setStateAsync('status.last_summary_update', {
193
+ val: new Date().toISOString(),
194
+ ack: true,
195
+ }); // FIX: nur bei echter Summary-/Overview-Änderung
196
+ }
186
197
  } catch (err) {
187
198
  this.adapter.log.warn(`[statusHelper] Error while updating summary: ${err.message}`);
188
199
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "iobroker.poolcontrol",
3
- "version": "1.2.19",
3
+ "version": "1.2.21",
4
4
  "description": "Steuerung & Automatisierung für den Pool (Pumpe, Heizung, Ventile, Sensoren).",
5
5
  "author": "DasBo1975 <dasbo1975@outlook.de>",
6
6
  "homepage": "https://github.com/DasBo1975/ioBroker.poolcontrol",