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.
- package/README.md +22 -18
- package/admin/i18n/de/translations.json +4 -0
- package/admin/i18n/en/translations.json +8 -2
- package/admin/i18n/es/translations.json +4 -0
- package/admin/i18n/fr/translations.json +4 -0
- package/admin/i18n/it/translations.json +4 -0
- package/admin/i18n/nl/translations.json +4 -0
- package/admin/i18n/pl/translations.json +4 -0
- package/admin/i18n/pt/translations.json +4 -0
- package/admin/i18n/ru/translations.json +4 -0
- package/admin/i18n/uk/translations.json +4 -0
- package/admin/i18n/zh-cn/translations.json +4 -0
- package/admin/jsonConfig.json +31 -1
- package/io-package.json +27 -27
- package/lib/helpers/aiHelper.js +5 -5
- package/lib/helpers/consumptionHelper.js +47 -5
- package/lib/helpers/heatHelper.js +12 -9
- package/lib/helpers/infoHelper.js +11 -11
- package/lib/helpers/poolInsightsHelper.js +620 -0
- package/lib/helpers/pumpHelper.js +15 -7
- package/lib/helpers/statisticsHelper.js +7 -3
- package/lib/helpers/statisticsHelperMonth.js +19 -15
- package/lib/helpers/statisticsHelperWeek.js +11 -5
- package/lib/i18n/de.json +31 -1
- package/lib/i18n/en.json +34 -4
- package/lib/i18n/es.json +31 -1
- package/lib/i18n/fr.json +31 -1
- package/lib/i18n/it.json +31 -1
- package/lib/i18n/nl.json +31 -1
- package/lib/i18n/pl.json +31 -1
- package/lib/i18n/pt.json +31 -1
- package/lib/i18n/ru.json +31 -1
- package/lib/i18n/uk.json +31 -1
- package/lib/i18n/zh-cn.json +31 -1
- package/lib/stateDefinitions/poolInsightsStates.js +289 -0
- package/lib/stateDefinitions/pumpStates.js +39 -0
- package/lib/stateDefinitions/solarStates.js +12 -3
- package/lib/stateDefinitions/statusStates.js +1 -1
- package/main.js +20 -0
- 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.
|
|
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": {
|
package/lib/helpers/aiHelper.js
CHANGED
|
@@ -517,7 +517,7 @@ const aiHelper = {
|
|
|
517
517
|
*
|
|
518
518
|
* @param {number} lat
|
|
519
519
|
* @param {number} lon
|
|
520
|
-
* @returns {Promise<
|
|
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 {
|
|
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:
|
|
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 {
|
|
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 {
|
|
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
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
134
|
-
|
|
138
|
+
this.dailyTimer = this.adapter.setTimeout(() => {
|
|
139
|
+
this.dailyTimer = null;
|
|
140
|
+
|
|
135
141
|
this._updateDeveloperGreeting();
|
|
136
142
|
|
|
137
|
-
//
|
|
138
|
-
this.
|
|
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
|
},
|