iobroker.poolcontrol 1.3.27 → 1.3.29

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.
Files changed (40) hide show
  1. package/README.md +22 -18
  2. package/admin/i18n/de/translations.json +4 -0
  3. package/admin/i18n/en/translations.json +8 -2
  4. package/admin/i18n/es/translations.json +4 -0
  5. package/admin/i18n/fr/translations.json +4 -0
  6. package/admin/i18n/it/translations.json +4 -0
  7. package/admin/i18n/nl/translations.json +4 -0
  8. package/admin/i18n/pl/translations.json +4 -0
  9. package/admin/i18n/pt/translations.json +4 -0
  10. package/admin/i18n/ru/translations.json +4 -0
  11. package/admin/i18n/uk/translations.json +4 -0
  12. package/admin/i18n/zh-cn/translations.json +4 -0
  13. package/admin/jsonConfig.json +31 -1
  14. package/io-package.json +27 -27
  15. package/lib/helpers/aiHelper.js +5 -5
  16. package/lib/helpers/consumptionHelper.js +47 -5
  17. package/lib/helpers/heatHelper.js +12 -9
  18. package/lib/helpers/infoHelper.js +11 -11
  19. package/lib/helpers/poolInsightsHelper.js +620 -0
  20. package/lib/helpers/pumpHelper.js +15 -7
  21. package/lib/helpers/statisticsHelper.js +7 -3
  22. package/lib/helpers/statisticsHelperMonth.js +19 -15
  23. package/lib/helpers/statisticsHelperWeek.js +11 -5
  24. package/lib/i18n/de.json +31 -1
  25. package/lib/i18n/en.json +34 -4
  26. package/lib/i18n/es.json +31 -1
  27. package/lib/i18n/fr.json +31 -1
  28. package/lib/i18n/it.json +31 -1
  29. package/lib/i18n/nl.json +31 -1
  30. package/lib/i18n/pl.json +31 -1
  31. package/lib/i18n/pt.json +31 -1
  32. package/lib/i18n/ru.json +31 -1
  33. package/lib/i18n/uk.json +31 -1
  34. package/lib/i18n/zh-cn.json +31 -1
  35. package/lib/stateDefinitions/poolInsightsStates.js +289 -0
  36. package/lib/stateDefinitions/pumpStates.js +39 -0
  37. package/lib/stateDefinitions/solarStates.js +12 -3
  38. package/lib/stateDefinitions/statusStates.js +1 -1
  39. package/main.js +20 -0
  40. package/package.json +1 -1
package/io-package.json CHANGED
@@ -1,8 +1,34 @@
1
1
  {
2
2
  "common": {
3
3
  "name": "poolcontrol",
4
- "version": "1.3.27",
4
+ "version": "1.3.29",
5
5
  "news": {
6
+ "1.3.29": {
7
+ "en": "Added Pool Insights V1 with observations, status evaluation and runtime i18n support. Improved Pool Insights text generation and removed dependency on external summary blocks. Fixed missing initialization of season and solar warning runtime states from adapter configuration. Added admin UI notes explaining initial values versus runtime datapoint control.",
8
+ "de": "Pool Insights V1 mit Beobachtungen, Statusbewertung und Runtime-i18n hinzugefügt. Pool-Insights-Texte verbessert und die Abhängigkeit von externen Summary-Blöcken entfernt. Fehlende Initialisierung der Saison- und Solarwarnungs-States aus der Adapterkonfiguration behoben. Hinweise in der Admin-Oberfläche ergänzt, die den Unterschied zwischen Initialwerten und Runtime-Datenpunkten erläutern.",
9
+ "ru": "Добавлен Pool Insights V1 с наблюдениями, оценкой состояния и поддержкой i18n во время выполнения. Улучшено создание текста Pool Insights и удалена зависимость от внешних сводных блоков. Исправлена ​​отсутствующая инициализация состояний выполнения сезонных и солнечных предупреждений из конфигурации адаптера. Добавлены примечания к интерфейсу администратора, объясняющие начальные значения и контроль точек данных во время выполнения.",
10
+ "pt": "Adicionado Pool Insights V1 com observações, avaliação de status e suporte ao tempo de execução i18n. Geração de texto do Pool Insights aprimorada e dependência removida de blocos de resumo externos. Corrigida a falta de inicialização dos estados de tempo de execução de aviso solar e de estação na configuração do adaptador. Adicionadas notas da UI administrativa explicando os valores iniciais versus controle de ponto de dados em tempo de execução.",
11
+ "nl": "Pool Insights V1 toegevoegd met observaties, statusevaluatie en runtime i18n-ondersteuning. Verbeterde tekstgeneratie in Pool Insights en verwijderde de afhankelijkheid van externe samenvattingsblokken. Probleem opgelost waarbij de initialisatie van seizoens- en zonne-waarschuwingsruntimestatussen uit de adapterconfiguratie ontbreekt. Aantekeningen in de beheerdersinterface toegevoegd waarin initiële waarden versus runtime-datapuntcontrole worden uitgelegd.",
12
+ "fr": "Ajout de Pool Insights V1 avec observations, évaluation de l'état et prise en charge du runtime i18n. Amélioration de la génération de texte Pool Insights et suppression de la dépendance aux blocs de résumé externes. Correction de l'initialisation manquante des états d'exécution de la saison et de l'avertissement solaire dans la configuration de l'adaptateur. Ajout de notes sur l'interface utilisateur d'administration expliquant les valeurs initiales par rapport au contrôle des points de données d'exécution.",
13
+ "it": "Aggiunto Pool Insights V1 con osservazioni, valutazione dello stato e supporto i18n runtime. Migliorata la generazione del testo di Pool Insights e rimossa la dipendenza dai blocchi di riepilogo esterni. Risolto il problema con l'inizializzazione mancante degli stati di runtime dell'avviso stagionale e solare dalla configurazione dell'adattatore. Aggiunte note sull'interfaccia utente di amministrazione che spiegano i valori iniziali rispetto al controllo del punto dati di runtime.",
14
+ "es": "Se agregó Pool Insights V1 con observaciones, evaluación de estado y soporte de tiempo de ejecución i18n. Se mejoró la generación de texto de Pool Insights y se eliminó la dependencia de bloques de resumen externos. Se corrigió la falta de inicialización de los estados de tiempo de ejecución de advertencia solar y de temporada desde la configuración del adaptador. Se agregaron notas de la interfaz de usuario del administrador que explican los valores iniciales versus el control de puntos de datos en tiempo de ejecución.",
15
+ "pl": "Dodano usługę Pool Insights V1 z obserwacjami, oceną stanu i obsługą środowiska wykonawczego i18n. Ulepszone generowanie tekstu Pool Insights i usunięta zależność od zewnętrznych bloków podsumowań. Naprawiono brakującą inicjalizację stanów wykonawczych sezonu i ostrzeżenia słonecznego z konfiguracji adaptera. Dodano uwagi do interfejsu administratora wyjaśniające wartości początkowe w porównaniu z kontrolą punktów danych w czasie wykonywania.",
16
+ "uk": "Додано Pool Insights V1 із спостереженнями, оцінкою стану та підтримкою i18n під час виконання. Покращено створення тексту Pool Insights і видалено залежність від зовнішніх блоків підсумків. Виправлено відсутність ініціалізації сезону та станів попередження про сонячне світло з конфігурації адаптера. Додано примітки інтерфейсу користувача адміністратора, що пояснюють початкові значення та керування точкою даних під час виконання.",
17
+ "zh-cn": "添加了 Pool Insights V1,具有观察、状态评估和运行时 i18n 支持。改进了 Pool Insights 文本生成并消除了对外部摘要块的依赖。修复了适配器配置中缺少季节和太阳警告运行时状态初始化的问题。添加了管理 UI 注释,解释初始值与运行时数据点控制。"
18
+ },
19
+ "1.3.28": {
20
+ "en": "Added configurable startup power check timeout for pump monitoring (5-10 seconds). Improved compatibility with delayed power measurements from smart plugs and power meters.",
21
+ "de": "Konfigurierbares Timeout für die Leistungsprüfung nach Pumpenstart (5-10 Sekunden) hinzugefügt. Kompatibilität mit verzögert aktualisierten Leistungswerten von Smart-Steckdosen und Leistungsmessern verbessert.",
22
+ "ru": "Добавлен настраиваемый тайм-аут проверки мощности при запуске для мониторинга насоса (5–10 секунд). Улучшена совместимость с измерениями мощности с задержкой от интеллектуальных розеток и измерителей мощности.",
23
+ "pt": "Adicionado tempo limite de verificação de energia de inicialização configurável para monitoramento da bomba (5 a 10 segundos). Compatibilidade aprimorada com medições de energia atrasadas de plugues inteligentes e medidores de energia.",
24
+ "nl": "Configureerbare time-out voor stroomcontrole bij opstarten toegevoegd voor pompbewaking (5-10 seconden). Verbeterde compatibiliteit met vertraagde stroommetingen van slimme stekkers en stroommeters.",
25
+ "fr": "Ajout d'un délai d'expiration configurable pour la vérification de l'alimentation au démarrage pour la surveillance de la pompe (5 à 10 secondes). Compatibilité améliorée avec les mesures de puissance retardées des prises intelligentes et des compteurs de puissance.",
26
+ "it": "Aggiunto timeout configurabile del controllo dell'alimentazione all'avvio per il monitoraggio della pompa (5-10 secondi). Compatibilità migliorata con misurazioni di potenza ritardate da prese intelligenti e misuratori di potenza.",
27
+ "es": "Se agregó un tiempo de espera de verificación de energía de inicio configurable para el monitoreo de la bomba (5-10 segundos). Compatibilidad mejorada con mediciones de potencia retrasadas de enchufes inteligentes y medidores de potencia.",
28
+ "pl": "Dodano konfigurowalny limit czasu sprawdzania mocy rozruchowej dla monitorowania pompy (5-10 sekund). Poprawiona kompatybilność z opóźnionymi pomiarami mocy z inteligentnych wtyczek i mierników mocy.",
29
+ "uk": "Додано настроюваний тайм-аут перевірки живлення при запуску для моніторингу насоса (5-10 секунд). Покращена сумісність із затримкою вимірювання потужності від розумних розеток і лічильників.",
30
+ "zh-cn": "添加了用于泵监控的可配置启动电源检查超时(5-10 秒)。改进了与智能插头和功率计的延迟功率测量的兼容性。"
31
+ },
6
32
  "1.3.27": {
7
33
  "en": "Added new Chemistry Tools with pH Plus Calculator, pH Minus Calculator and Salt Calculator. Added validation, result texts, error handling and automatic pool volume prefill. Expanded documentation and function overviews.",
8
34
  "de": "Neuen Bereich Chemistry Tools mit pH-Plus-Rechner, pH-Minus-Rechner und Salz-Rechner hinzugefügt. Validierungen, Ergebnistexte, Fehlerbehandlung und automatische Vorbelegung des Poolvolumens ergänzt. Dokumentation und Funktionsübersichten erweitert.",
@@ -41,32 +67,6 @@
41
67
  "pl": "Zaktualizowana dokumentacja i konserwacja repozytorium: ulepszona struktura README, zsynchronizowane przeglądy funkcji i zaktualizowane zależności programistyczne",
42
68
  "uk": "Оновлена ​​документація та обслуговування репозиторію: покращена структура README, синхронізовані огляди функцій та оновлені залежності розробки",
43
69
  "zh-cn": "更新的文档和存储库维护:改进的自述文件结构、同步的功能概述和更新的开发依赖项"
44
- },
45
- "1.3.24": {
46
- "en": "Updated repository and maintainer components: updated release-script dependencies, improved README/changelog structure and reviewed repository checker suggestions",
47
- "de": "Repository- und Maintainer-Komponenten aktualisiert: Release-Script-Abhängigkeiten aktualisiert, README-/Changelog-Struktur verbessert und Repository-Checker-Hinweise überarbeitet",
48
- "ru": "Обновлены компоненты репозитория и сопровождающего: обновлены зависимости сценариев выпуска, улучшена структура README/журнала изменений и рассмотрены предложения по проверке репозитория.",
49
- "pt": "Repositório atualizado e componentes do mantenedor: dependências de script de lançamento atualizadas, estrutura README/changelog aprimorada e sugestões revisadas do verificador de repositório",
50
- "nl": "Bijgewerkte repository- en onderhoudercomponenten: bijgewerkte release-scriptafhankelijkheden, verbeterde README/changelog-structuur en herziene suggesties voor repositorycontrole",
51
- "fr": "Composants du référentiel et du responsable mis à jour : dépendances de script de version mises à jour, structure README/changelog améliorée et suggestions révisées du vérificateur de référentiel",
52
- "it": "Componenti del repository e del manutentore aggiornati: dipendenze aggiornate degli script di rilascio, struttura README/log delle modifiche migliorata e suggerimenti rivisti per il controllo del repository",
53
- "es": "Componentes actualizados del repositorio y del mantenedor: dependencias actualizadas del script de lanzamiento, estructura README/registro de cambios mejorada y sugerencias revisadas del verificador del repositorio",
54
- "pl": "Zaktualizowane komponenty repozytorium i opiekuna: zaktualizowane zależności skryptu wydania, ulepszona struktura README/dziennika zmian i sprawdzone sugestie dotyczące sprawdzania repozytorium",
55
- "uk": "Оновлений репозиторій і компоненти супроводжувача: оновлені залежності сценарію випуску, покращена структура README/журналу змін і переглянуті пропозиції перевірки сховища",
56
- "zh-cn": "更新了存储库和维护者组件:更新了发布脚本依赖项,改进了自述文件/变更日志结构并审查了存储库检查器建议"
57
- },
58
- "1.3.23": {
59
- "en": "Temperature diagnostics extended: Added new diagnostic states for all temperature sensors (last valid value, timestamp, minutes since last value, source status). Added self-healing/recovery mechanism for stalled or missing temperature events. Temperature helper updated to ioBroker-compliant timers.",
60
- "de": "Temperaturbereich erweitert: Neue Diagnosewerte für alle Temperatursensoren ergänzt (letzter gültiger Wert, Zeitstempel, Minuten seit letztem Wert, Quellenstatus). Zusätzlich Selbstheilungs-/Recovery-Mechanismus für ausgefallene oder hängende Temperatur-Events ergänzt. Temperaturhelper auf ioBroker-konforme Timer umgestellt.",
61
- "ru": "Расширенная диагностика температуры: добавлены новые диагностические состояния для всех датчиков температуры (последнее действительное значение, временная метка, минуты с момента последнего значения, состояние источника). Добавлен механизм самовосстановления/восстановления при остановке или отсутствии температурных событий. Помощник по температуре обновлен до таймеров, совместимых с ioBroker.",
62
- "pt": "Diagnóstico de temperatura estendido: Adicionados novos estados de diagnóstico para todos os sensores de temperatura (último valor válido, carimbo de data/hora, minutos desde o último valor, status da fonte). Adicionado mecanismo de autocorreção/recuperação para eventos de temperatura paralisados ​​ou ausentes. Auxiliar de temperatura atualizado para temporizadores compatíveis com ioBroker.",
63
- "nl": "Temperatuurdiagnostiek uitgebreid: Nieuwe diagnostische statussen toegevoegd voor alle temperatuursensoren (laatste geldige waarde, tijdstempel, minuten sinds laatste waarde, bronstatus). Zelfherstel-/herstelmechanisme toegevoegd voor vastgelopen of ontbrekende temperatuurgebeurtenissen. Temperatuurhelper bijgewerkt naar ioBroker-compatibele timers.",
64
- "fr": "Diagnostics de température étendus : ajout de nouveaux états de diagnostic pour tous les capteurs de température (dernière valeur valide, horodatage, minutes depuis la dernière valeur, état de la source). Ajout d'un mécanisme d'auto-guérison/récupération pour les événements de température bloqués ou manquants. Assistant de température mis à jour avec des minuteries conformes à ioBroker.",
65
- "it": "Diagnostica della temperatura estesa: aggiunti nuovi stati diagnostici per tutti i sensori di temperatura (ultimo valore valido, timestamp, minuti dall'ultimo valore, stato della sorgente). Aggiunto meccanismo di autoriparazione/recupero per eventi di temperatura bloccati o mancanti. Assistente per la temperatura aggiornato ai timer compatibili con ioBroker.",
66
- "es": "Diagnóstico de temperatura extendido: se agregaron nuevos estados de diagnóstico para todos los sensores de temperatura (último valor válido, marca de tiempo, minutos desde el último valor, estado de fuente). Se agregó un mecanismo de autorreparación/recuperación para eventos de temperatura estancados o faltantes. Asistente de temperatura actualizado a temporizadores compatibles con ioBroker.",
67
- "pl": "Rozszerzona diagnostyka temperatury: Dodano nowe stany diagnostyczne dla wszystkich czujników temperatury (ostatnia ważna wartość, znacznik czasu, minuty od ostatniej wartości, stan źródła). Dodano mechanizm samonaprawy/odzyskiwania w przypadku zablokowania lub braku zdarzeń związanych z temperaturą. Pomocnik temperatury zaktualizowany do timerów zgodnych z ioBroker.",
68
- "uk": "Розширено діагностику температури: додано нові діагностичні стани для всіх датчиків температури (останнє дійсне значення, позначка часу, хвилини з останнього значення, статус джерела). Додано механізм самовідновлення/відновлення для зупинених або відсутніх температурних подій. Помічник температури оновлено до таймерів, сумісних із ioBroker.",
69
- "zh-cn": "温度诊断扩展:为所有温度传感器添加了新的诊断状态(最后一个有效值、时间戳、自最后一个值以来的分钟数、源状态)。添加了针对停滞或丢失温度事件的自我修复/恢复机制。温度助手更新为符合 ioBroker 标准的计时器。"
70
70
  }
71
71
  },
72
72
  "titleLang": {
@@ -517,7 +517,7 @@ const aiHelper = {
517
517
  *
518
518
  * @param {number} lat
519
519
  * @param {number} lon
520
- * @returns {Promise<any|null>}
520
+ * @returns {Promise<object|null>}
521
521
  */
522
522
  async _fetchWeather(lat, lon) {
523
523
  const url =
@@ -572,7 +572,7 @@ const aiHelper = {
572
572
  /**
573
573
  * Erzeugt einen gut lesbaren Wetterhinweis-Text.
574
574
  *
575
- * @param {any} weather
575
+ * @param {object|null} weather
576
576
  * @returns {string}
577
577
  */
578
578
  _buildWeatherAdviceText(weather) {
@@ -601,7 +601,7 @@ const aiHelper = {
601
601
  /**
602
602
  * Erzeugt die Tageszusammenfassung.
603
603
  *
604
- * @param {{weather:any,seasonActive:boolean,pumpOn:boolean,pumpMode:string,surfaceTemp:number|null}} ctx
604
+ * @param {{weather: object|null, seasonActive: boolean, pumpOn: boolean, pumpMode: string, surfaceTemp: number|null}} ctx
605
605
  * @returns {string}
606
606
  */
607
607
  _buildDailySummaryText(ctx) {
@@ -661,7 +661,7 @@ const aiHelper = {
661
661
  /**
662
662
  * Erzeugt tägliche Pool-Tipps abhängig von Wetter & Saison.
663
663
  *
664
- * @param {any} weather
664
+ * @param {object|null} weather
665
665
  * @param {boolean} seasonActive
666
666
  * @returns {string}
667
667
  */
@@ -795,7 +795,7 @@ const aiHelper = {
795
795
  /**
796
796
  * Erzeugt Wochenend-Zusammenfassung (Samstag/Sonntag).
797
797
  *
798
- * @param {any} weather
798
+ * @param {object|null} weather
799
799
  * @param {boolean} seasonActive
800
800
  * @param {number} weekday JS-Tag (0=So..6=Sa)
801
801
  * @returns {string}
@@ -15,6 +15,9 @@ const consumptionHelper = {
15
15
  price: 0,
16
16
  baselines: {},
17
17
  resetTimer: null,
18
+ weeklyResetTimer: null,
19
+ monthlyResetTimer: null,
20
+ yearlyResetTimer: null,
18
21
 
19
22
  lastKnownPrice: 0,
20
23
  baseTotalKwh: 0,
@@ -252,7 +255,12 @@ const consumptionHelper = {
252
255
  nextMidnight.setHours(24, 0, 0, 0);
253
256
  const msUntilMidnight = nextMidnight - now;
254
257
 
255
- this.resetTimer = setTimeout(async () => {
258
+ if (this.resetTimer) {
259
+ this.adapter.clearTimeout(this.resetTimer);
260
+ this.resetTimer = null;
261
+ }
262
+
263
+ this.resetTimer = this.adapter.setTimeout(async () => {
256
264
  try {
257
265
  this.adapter.log.info('[consumptionHelper] daily counter reset (midnight)');
258
266
  await this.adapter.setStateAsync('consumption.day_kwh', { val: 0, ack: true });
@@ -261,6 +269,7 @@ const consumptionHelper = {
261
269
  } catch (err) {
262
270
  this.adapter.log.warn(`[consumptionHelper] error during midnight reset: ${err.message}`);
263
271
  }
272
+ this.resetTimer = null;
264
273
  this._scheduleDailyReset(); // Timer erneut setzen
265
274
  }, msUntilMidnight);
266
275
  },
@@ -280,7 +289,12 @@ const consumptionHelper = {
280
289
 
281
290
  const delay = next - now;
282
291
 
283
- setTimeout(async () => {
292
+ if (this.weeklyResetTimer) {
293
+ this.adapter.clearTimeout(this.weeklyResetTimer);
294
+ this.weeklyResetTimer = null;
295
+ }
296
+
297
+ this.weeklyResetTimer = this.adapter.setTimeout(async () => {
284
298
  try {
285
299
  const nowCheck = new Date();
286
300
 
@@ -296,6 +310,7 @@ const consumptionHelper = {
296
310
  }
297
311
 
298
312
  // Morgen wieder planen
313
+ this.weeklyResetTimer = null;
299
314
  this._scheduleWeeklyReset();
300
315
  }, delay);
301
316
  },
@@ -315,7 +330,12 @@ const consumptionHelper = {
315
330
 
316
331
  const delay = next - now;
317
332
 
318
- setTimeout(async () => {
333
+ if (this.monthlyResetTimer) {
334
+ this.adapter.clearTimeout(this.monthlyResetTimer);
335
+ this.monthlyResetTimer = null;
336
+ }
337
+
338
+ this.monthlyResetTimer = this.adapter.setTimeout(async () => {
319
339
  try {
320
340
  const nowCheck = new Date();
321
341
 
@@ -331,6 +351,7 @@ const consumptionHelper = {
331
351
  }
332
352
 
333
353
  // Morgen wieder planen
354
+ this.monthlyResetTimer = null;
334
355
  this._scheduleMonthlyReset();
335
356
  }, delay);
336
357
  },
@@ -350,7 +371,12 @@ const consumptionHelper = {
350
371
 
351
372
  const delay = next - now;
352
373
 
353
- setTimeout(async () => {
374
+ if (this.yearlyResetTimer) {
375
+ this.adapter.clearTimeout(this.yearlyResetTimer);
376
+ this.yearlyResetTimer = null;
377
+ }
378
+
379
+ this.yearlyResetTimer = this.adapter.setTimeout(async () => {
354
380
  try {
355
381
  const nowCheck = new Date();
356
382
 
@@ -366,15 +392,31 @@ const consumptionHelper = {
366
392
  }
367
393
 
368
394
  // Morgen wieder prüfen
395
+ this.yearlyResetTimer = null;
369
396
  this._scheduleYearlyReset();
370
397
  }, delay);
371
398
  },
372
399
 
373
400
  cleanup() {
374
401
  if (this.resetTimer) {
375
- clearTimeout(this.resetTimer);
402
+ this.adapter.clearTimeout(this.resetTimer);
376
403
  this.resetTimer = null;
377
404
  }
405
+
406
+ if (this.weeklyResetTimer) {
407
+ this.adapter.clearTimeout(this.weeklyResetTimer);
408
+ this.weeklyResetTimer = null;
409
+ }
410
+
411
+ if (this.monthlyResetTimer) {
412
+ this.adapter.clearTimeout(this.monthlyResetTimer);
413
+ this.monthlyResetTimer = null;
414
+ }
415
+
416
+ if (this.yearlyResetTimer) {
417
+ this.adapter.clearTimeout(this.yearlyResetTimer);
418
+ this.yearlyResetTimer = null;
419
+ }
378
420
  },
379
421
  };
380
422
 
@@ -246,7 +246,7 @@ const heatHelper = {
246
246
 
247
247
  const holdMs = Math.round(prerunMin * 60 * 1000);
248
248
 
249
- this._prerunTimer = setTimeout(async () => {
249
+ this._prerunTimer = this.adapter.setTimeout(async () => {
250
250
  this._prerunTimer = null;
251
251
 
252
252
  await this.adapter.setStateAsync('heat.prerun_active', { val: false, ack: true });
@@ -261,9 +261,8 @@ const heatHelper = {
261
261
 
262
262
  this._desiredHeat = true;
263
263
 
264
- // Nachlauf ggf. abbrechen
265
264
  if (this._afterrunTimer) {
266
- clearTimeout(this._afterrunTimer);
265
+ this.adapter.clearTimeout(this._afterrunTimer);
267
266
  this._afterrunTimer = null;
268
267
  }
269
268
 
@@ -323,7 +322,7 @@ const heatHelper = {
323
322
  async _applyBlockedState(mode, reason, afterrunMin) {
324
323
  // NEU: laufenden Prerun abbrechen
325
324
  if (this._prerunTimer) {
326
- clearTimeout(this._prerunTimer);
325
+ this.adapter.clearTimeout(this._prerunTimer);
327
326
  this._prerunTimer = null;
328
327
  await this.adapter.setStateAsync('heat.prerun_active', { val: false, ack: true });
329
328
  }
@@ -347,7 +346,7 @@ const heatHelper = {
347
346
  async _applyOffState(mode, reason, afterrunMin) {
348
347
  // NEU: laufenden Prerun abbrechen
349
348
  if (this._prerunTimer) {
350
- clearTimeout(this._prerunTimer);
349
+ this.adapter.clearTimeout(this._prerunTimer);
351
350
  this._prerunTimer = null;
352
351
  await this.adapter.setStateAsync('heat.prerun_active', { val: false, ack: true });
353
352
  }
@@ -401,7 +400,7 @@ const heatHelper = {
401
400
 
402
401
  // Timer neu starten
403
402
  if (this._afterrunTimer) {
404
- clearTimeout(this._afterrunTimer);
403
+ this.adapter.clearTimeout(this._afterrunTimer);
405
404
  this._afterrunTimer = null;
406
405
  }
407
406
 
@@ -410,12 +409,15 @@ const heatHelper = {
410
409
  const holdMs = Math.round(afterrunMin * 60 * 1000);
411
410
  this.adapter.log.debug(`[heatHelper] Pump after-run started: ${afterrunMin} min (${reason})`);
412
411
 
413
- this._afterrunTimer = setTimeout(async () => {
412
+ this._afterrunTimer = this.adapter.setTimeout(async () => {
413
+ this._afterrunTimer = null;
414
+
414
415
  // Wenn inzwischen wieder Heizbedarf aktiv ist -> Nachlauf abbrechen
415
416
  if (this._desiredHeat === true) {
416
417
  this.adapter.log.debug('[heatHelper] After-run cancelled - heating is active again.');
417
418
  return;
418
419
  }
420
+
419
421
  await this._stopPumpNow('afterrun_done');
420
422
  }, holdMs);
421
423
  },
@@ -497,11 +499,12 @@ const heatHelper = {
497
499
 
498
500
  cleanup() {
499
501
  if (this._afterrunTimer) {
500
- clearTimeout(this._afterrunTimer);
502
+ this.adapter.clearTimeout(this._afterrunTimer);
501
503
  this._afterrunTimer = null;
502
504
  }
505
+
503
506
  if (this._prerunTimer) {
504
- clearTimeout(this._prerunTimer);
507
+ this.adapter.clearTimeout(this._prerunTimer);
505
508
  this._prerunTimer = null;
506
509
  }
507
510
 
@@ -121,6 +121,11 @@ const infoHelper = {
121
121
  * Startet den täglichen Update-Intervall (Update 00:01 Uhr)
122
122
  */
123
123
  _startDailyTimer() {
124
+ if (this.dailyTimer) {
125
+ this.adapter.clearTimeout(this.dailyTimer);
126
+ this.dailyTimer = null;
127
+ }
128
+
124
129
  // nächsten Trigger für morgen 00:01 berechnen
125
130
  const now = new Date();
126
131
  const next = new Date(now);
@@ -130,17 +135,13 @@ const infoHelper = {
130
135
 
131
136
  const delay = next.getTime() - now.getTime();
132
137
 
133
- // einmaliger Timer bis 00:01
134
- this.dailyTimer = setTimeout(() => {
138
+ this.dailyTimer = this.adapter.setTimeout(() => {
139
+ this.dailyTimer = null;
140
+
135
141
  this._updateDeveloperGreeting();
136
142
 
137
- // danach täglich um 24h
138
- this.dailyTimer = setInterval(
139
- () => {
140
- this._updateDeveloperGreeting();
141
- },
142
- 24 * 60 * 60 * 1000,
143
- );
143
+ // Danach neu planen, damit kein dauerhaftes setInterval nötig ist.
144
+ this._startDailyTimer();
144
145
  }, delay);
145
146
  },
146
147
 
@@ -149,8 +150,7 @@ const infoHelper = {
149
150
  */
150
151
  cleanup() {
151
152
  if (this.dailyTimer) {
152
- clearTimeout(this.dailyTimer);
153
- clearInterval(this.dailyTimer);
153
+ this.adapter.clearTimeout(this.dailyTimer);
154
154
  this.dailyTimer = null;
155
155
  }
156
156
  },