iobroker.poolcontrol 1.3.22 → 1.3.24

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
@@ -147,6 +147,25 @@ Details about the behavior of consumption and cost values (e.g., after restarts
147
147
  This section is used exclusively for analysis and troubleshooting.
148
148
  In normal operation, monitoring should remain disabled.
149
149
 
150
+ - **Additional Actuators**
151
+ - Follow-pump devices
152
+ - Automatic ON/OFF with pump operation
153
+ - Validation of external targets
154
+ - Suitable for UV, water features and auxiliary systems
155
+
156
+ - **Water Chemistry Analysis**
157
+ - pH evaluation with manual or external sources
158
+ - TDS analysis with trends (24h / 7d / 30d)
159
+ - ORP / Redox evaluation with pH reference support
160
+ - Measurement location logic
161
+ - Plausibility checks
162
+ - HTML / JSON / text outputs
163
+ - No automatic dosing
164
+
165
+ - Source monitoring and diagnostics
166
+ - Last valid value tracking
167
+ - Recovery logic for missing updates
168
+ - Source status monitoring
150
169
  ---
151
170
 
152
171
 
@@ -188,6 +207,24 @@ New features are added regularly – please refer to the changelog.
188
207
  ---
189
208
 
190
209
  ## Changelog
210
+ ### 1.3.24 (2026-05-26)
211
+
212
+ - Updated release-script dependencies to current versions
213
+ - Improved README and changelog structure
214
+ - Repository checker recommendations reviewed
215
+
216
+ ### 1.3.23 (2026-05-26)
217
+
218
+ - Added extended temperature diagnostics for all temperature sensors:
219
+ - last valid value
220
+ - last valid value timestamp
221
+ - minutes since last value
222
+ - source status (`ok`, `warning`, `not_received`, `invalid_timestamp`)
223
+ - Added automatic recovery mechanism for stalled temperature updates
224
+ - Recovery runs only when a sensor enters warning state and uses cooldown protection
225
+ - Switched temperature helper timers to ioBroker adapter timers
226
+ - Improved visibility and troubleshooting for missing or delayed temperature updates
227
+
191
228
  ### 1.3.22 (2026-05-24)
192
229
 
193
230
  - Improved ORP pH reference synchronization
@@ -230,20 +267,13 @@ Features:
230
267
  - Protected time control states from being overwritten during adapter updates.
231
268
  - Preserved configured time windows, start/end times and weekdays during adapter reinstallations or updates.
232
269
 
233
- ### 1.3.19 (2026-05-13)
270
+ ## Archived Release History
234
271
 
235
- - Added runtime self-healing for missed pump start events
236
- - Stabilized runtime and circulation calculations for delayed or filtered pump switch updates
237
- - Fixed a rare synchronization issue where circulation counting could stop although pump live values were still available
238
- - Improved internal runtime synchronization
272
+ For older releases and archived version history see:
239
273
 
240
- ### 1.3.18 (2026-05-11)
274
+ [CHANGELOG_OLD.md](./CHANGELOG_OLD.md)
241
275
 
242
- - Fixed incorrect date display in the pH, ORP and TDS areas.
243
- - Time states with `value.time` are now stored as numeric timestamps instead of localized date strings.
244
- - Improved compatibility with ioBroker/Admin date handling.
245
- - Added backward-compatible handling for previously stored German date strings.
246
- - Kept history JSON output unchanged with readable date strings for users and VIS displays.
276
+ ---
247
277
 
248
278
  ## Support
249
279
  - [ioBroker Forum](https://forum.iobroker.net/)
@@ -265,7 +295,7 @@ The user is responsible for the **safe installation and operation of their hardw
265
295
 
266
296
  ---
267
297
 
268
- ## License & Legal
298
+ ## Legal Notice
269
299
 
270
300
  PoolControl is an open-source project developed by D. Bertin (DasBo1975).
271
301
 
package/io-package.json CHANGED
@@ -1,8 +1,34 @@
1
1
  {
2
2
  "common": {
3
3
  "name": "poolcontrol",
4
- "version": "1.3.22",
4
+ "version": "1.3.24",
5
5
  "news": {
6
+ "1.3.24": {
7
+ "en": "Updated repository and maintainer components: updated release-script dependencies, improved README/changelog structure and reviewed repository checker suggestions",
8
+ "de": "Repository- und Maintainer-Komponenten aktualisiert: Release-Script-Abhängigkeiten aktualisiert, README-/Changelog-Struktur verbessert und Repository-Checker-Hinweise überarbeitet",
9
+ "ru": "Обновлены компоненты репозитория и сопровождающего: обновлены зависимости сценариев выпуска, улучшена структура README/журнала изменений и рассмотрены предложения по проверке репозитория.",
10
+ "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",
11
+ "nl": "Bijgewerkte repository- en onderhoudercomponenten: bijgewerkte release-scriptafhankelijkheden, verbeterde README/changelog-structuur en herziene suggesties voor repositorycontrole",
12
+ "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",
13
+ "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",
14
+ "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",
15
+ "pl": "Zaktualizowane komponenty repozytorium i opiekuna: zaktualizowane zależności skryptu wydania, ulepszona struktura README/dziennika zmian i sprawdzone sugestie dotyczące sprawdzania repozytorium",
16
+ "uk": "Оновлений репозиторій і компоненти супроводжувача: оновлені залежності сценарію випуску, покращена структура README/журналу змін і переглянуті пропозиції перевірки сховища",
17
+ "zh-cn": "更新了存储库和维护者组件:更新了发布脚本依赖项,改进了自述文件/变更日志结构并审查了存储库检查器建议"
18
+ },
19
+ "1.3.23": {
20
+ "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.",
21
+ "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.",
22
+ "ru": "Расширенная диагностика температуры: добавлены новые диагностические состояния для всех датчиков температуры (последнее действительное значение, временная метка, минуты с момента последнего значения, состояние источника). Добавлен механизм самовосстановления/восстановления при остановке или отсутствии температурных событий. Помощник по температуре обновлен до таймеров, совместимых с ioBroker.",
23
+ "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.",
24
+ "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.",
25
+ "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.",
26
+ "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.",
27
+ "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.",
28
+ "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.",
29
+ "uk": "Розширено діагностику температури: додано нові діагностичні стани для всіх датчиків температури (останнє дійсне значення, позначка часу, хвилини з останнього значення, статус джерела). Додано механізм самовідновлення/відновлення для зупинених або відсутніх температурних подій. Помічник температури оновлено до таймерів, сумісних із ioBroker.",
30
+ "zh-cn": "温度诊断扩展:为所有温度传感器添加了新的诊断状态(最后一个有效值、时间戳、自最后一个值以来的分钟数、源状态)。添加了针对停滞或丢失温度事件的自我修复/恢复机制。温度助手更新为符合 ioBroker 标准的计时器。"
31
+ },
6
32
  "1.3.22": {
7
33
  "en": "Improved ORP pH reference synchronization. The ORP helper now updates the pH reference independently from ORP value processing and immediately reflects pH state changes.",
8
34
  "de": "ORP-pH-Referenz verbessert. Der ORP-Helper aktualisiert die pH-Referenz jetzt unabhängig von der ORP-Wertverarbeitung und übernimmt pH-Änderungen sofort.",
@@ -41,32 +67,6 @@
41
67
  "pl": "Dodano funkcję samonaprawy w czasie wykonywania w przypadku nieodebranych zdarzeń uruchomienia pompy i zabezpieczono stany kontroli czasu przed nadpisaniem podczas aktualizacji adaptera.",
42
68
  "uk": "Додано самовідновлення під час виконання для пропущених подій запуску насоса та захищено стани керування часом від перезапису під час оновлення адаптера.",
43
69
  "zh-cn": "添加了针对错过的泵启动事件的运行时自我修复,并保护时间控制状态在适配器更新期间不被覆盖。"
44
- },
45
- "1.3.19": {
46
- "en": "Added runtime self-healing for missed pump start events. Stabilized runtime and circulation calculations for delayed or filtered pump switch updates. Fixed a rare synchronization issue where circulation counting could stop although pump live values were still available. Improved internal runtime synchronization.",
47
- "de": "Runtime-Selbstheilung für verpasste Pumpenstart-Ereignisse ergänzt. Laufzeit- und Umwälzberechnung bei verzögerten oder gefilterten Pumpenschalter-Updates stabilisiert. Seltenen Synchronisationsfehler behoben, bei dem die Umwälzberechnung trotz aktiver Pumpen-Livewerte stehen bleiben konnte. Interne Runtime-Synchronisierung verbessert.",
48
- "ru": "Добавлено самовосстановление во время выполнения для пропущенных событий запуска насоса. Стабилизированные расчеты времени работы и циркуляции для отложенных или отфильтрованных обновлений переключателей насосов. Исправлена ​​редкая проблема синхронизации, из-за которой подсчет циркуляции мог остановиться, хотя текущие значения насоса все еще были доступны. Улучшена внутренняя синхронизация времени выполнения.",
49
- "pt": "Adicionada autocorreção em tempo de execução para eventos de inicialização de bomba perdidos. Cálculos de tempo de execução e circulação estabilizados para atualizações de interruptores de bomba filtrados ou atrasados. Foi corrigido um raro problema de sincronização em que a contagem de circulação poderia parar embora os valores ativos da bomba ainda estivessem disponíveis. Sincronização de tempo de execução interna aprimorada.",
50
- "nl": "Zelfherstel tijdens runtime toegevoegd voor gemiste pompstartgebeurtenissen. Gestabiliseerde looptijd- en circulatieberekeningen voor vertraagde of gefilterde updates van pompschakelaars. Er is een zeldzaam synchronisatieprobleem opgelost waarbij het tellen van de circulatie kon stoppen, hoewel de live-waarden van de pomp nog steeds beschikbaar waren. Verbeterde interne runtime-synchronisatie.",
51
- "fr": "Ajout de l'auto-réparation du temps d'exécution pour les événements de démarrage de pompe manqués. Calculs de temps de fonctionnement et de circulation stabilisés pour les mises à jour retardées ou filtrées des interrupteurs de pompe. Correction d'un problème de synchronisation rare où le comptage de circulation pouvait s'arrêter même si les valeurs en direct de la pompe étaient toujours disponibles. Synchronisation d'exécution interne améliorée.",
52
- "it": "Aggiunta l'autoriparazione del tempo di esecuzione per gli eventi di avvio della pompa mancati. Calcoli di autonomia e circolazione stabilizzati per aggiornamenti ritardati o filtrati dell'interruttore della pompa. Risolto un raro problema di sincronizzazione per cui il conteggio della circolazione poteva interrompersi anche se i valori in tempo reale della pompa erano ancora disponibili. Sincronizzazione runtime interna migliorata.",
53
- "es": "Se agregó autorreparación en tiempo de ejecución para eventos de inicio de bomba perdidos. Cálculos de circulación y tiempo de funcionamiento estabilizados para actualizaciones retrasadas o filtradas del interruptor de la bomba. Se solucionó un problema de sincronización poco común por el cual el conteo de circulación podía detenerse aunque los valores activos de la bomba todavía estaban disponibles. Sincronización interna del tiempo de ejecución mejorada.",
54
- "pl": "Dodano funkcję samonaprawy w czasie wykonywania w przypadku zdarzeń związanych z nieudanym uruchomieniem pompy. Stabilizowane obliczenia czasu pracy i cyrkulacji dla opóźnionych lub filtrowanych aktualizacji przełączników pomp. Naprawiono rzadki problem z synchronizacją, w wyniku którego zliczanie cyrkulacji mogło zostać zatrzymane, mimo że wartości bieżące pompy były nadal dostępne. Ulepszona wewnętrzna synchronizacja środowiska wykonawczego.",
55
- "uk": "Додано самовідновлення під час виконання для пропущених подій запуску насоса. Стабілізований час роботи та обчислення циркуляції для відкладених або фільтрованих оновлень перемикача насоса. Виправлено рідкісну проблему синхронізації, через яку підрахунок циркуляції міг припинитися, хоча поточні значення насоса все ще були доступні. Покращена внутрішня синхронізація часу виконання.",
56
- "zh-cn": "为错过的泵启动事件添加了运行时自我修复功能。延迟或过滤泵开关更新的稳定运行时间和循环计算。修复了一个罕见的同步问题,即尽管泵的实时值仍然可用,但循环计数可能会停止。改进了内部运行时同步。"
57
- },
58
- "1.3.18": {
59
- "en": "Fixed incorrect date display for pH, ORP and TDS time states by storing value.time states as numeric timestamps.",
60
- "de": "Falsche Datumsanzeige für pH-, ORP- und TDS-Zeitzustände behoben, indem value.time-Zustände als numerische Zeitstempel gespeichert wurden.",
61
- "ru": "Исправлено неправильное отображение даты для состояний времени pH, ОВП и TDS за счет сохранения состояний value.time в виде числовых меток времени.",
62
- "pt": "Corrigida a exibição incorreta de data para estados de tempo de pH, ORP e TDS, armazenando estados de valor.tempo como carimbos de data/hora numéricos.",
63
- "nl": "Foutieve datumweergave voor pH-, ORP- en TDS-tijdstatussen opgelost door value.time-statussen op te slaan als numerieke tijdstempels.",
64
- "fr": "Correction de l'affichage incorrect de la date pour les états temporels pH, ORP et TDS en stockant les états value.time sous forme d'horodatages numériques.",
65
- "it": "Risolto il problema con la visualizzazione errata della data per gli stati temporali pH, ORP e TDS memorizzando gli stati value.time come timestamp numerici.",
66
- "es": "Se corrigió la visualización de fecha incorrecta para los estados de tiempo de pH, ORP y TDS al almacenar los estados de valor.hora como marcas de tiempo numéricas.",
67
- "pl": "Naprawiono nieprawidłowe wyświetlanie daty dla stanów czasowych pH, ​​ORP i TDS poprzez przechowywanie stanów wartość.czas jako numeryczne znaczniki czasu.",
68
- "uk": "Виправлено неправильне відображення дати для часових станів pH, ORP і TDS шляхом збереження станів value.time як числових позначок часу.",
69
- "zh-cn": "通过将 value.time 状态存储为数字时间戳,修复了 pH、ORP 和 TDS 时间状态的不正确日期显示。"
70
70
  }
71
71
  },
72
72
  "titleLang": {
@@ -20,10 +20,13 @@ const temperatureHelper = {
20
20
  minMax: {}, // { collector: { min, max }, ... }
21
21
  history: {}, // { sensorKey: [{ ts, val }, ...] }
22
22
  resetTimer: null,
23
+ diagnosticTimer: null,
24
+ recoveryLastRun: {}, // { sensorKey: timestamp }
23
25
 
24
26
  init(adapter) {
25
27
  this.adapter = adapter;
26
28
  this.sensors = this._collectActiveSensors(adapter);
29
+ this.recoveryLastRun = {};
27
30
 
28
31
  // Foreign-States abonnieren
29
32
  for (const id of Object.values(this.sensors)) {
@@ -39,6 +42,8 @@ const temperatureHelper = {
39
42
  const val = Number(state.val);
40
43
  this.values[key] = val;
41
44
  await this._setCurrentValue(key, val);
45
+ // NEU: Diagnosewerte für letzten gültigen Sensorwert aktualisieren
46
+ await this._updateSensorDiagnostics(key, val, state, 'ok');
42
47
  await this._updateMinMax(key, val);
43
48
  adapter.log.debug(`[temperatureHelper] Initial value for ${key}: ${val} °C`);
44
49
  } else {
@@ -67,6 +72,9 @@ const temperatureHelper = {
67
72
  // Reset um Mitternacht
68
73
  this._scheduleDailyReset();
69
74
 
75
+ // NEU: Diagnose-Timer für Sensor-Aktualität starten
76
+ this._scheduleSensorDiagnostics();
77
+
70
78
  adapter.log.debug(
71
79
  `[temperatureHelper] Aktiv: ${
72
80
  Object.keys(this.sensors).length
@@ -121,6 +129,9 @@ const temperatureHelper = {
121
129
  // Aktuellen Wert setzen
122
130
  await this._setCurrentValue(key, num);
123
131
 
132
+ // NEU: Diagnosewerte für letzten gültigen Sensorwert aktualisieren
133
+ await this._updateSensorDiagnostics(key, num, state, 'ok');
134
+
124
135
  // Deltas berechnen
125
136
  await this._maybeWriteDelta('temperature.delta.collector_outside', this.values.collector, this.values.outside);
126
137
  await this._maybeWriteDelta('temperature.delta.surface_ground', this.values.surface, this.values.ground);
@@ -144,6 +155,34 @@ const temperatureHelper = {
144
155
  }
145
156
  },
146
157
 
158
+ // NEU: Diagnosewerte für gültige Temperatursensorwerte schreiben
159
+ async _updateSensorDiagnostics(key, value, state, status) {
160
+ const sourceTs = state && Number.isFinite(Number(state.ts)) ? Number(state.ts) : Date.now();
161
+ const isoTime = new Date(sourceTs).toISOString();
162
+ const minutesSince = Math.max(0, Math.round((Date.now() - sourceTs) / 60000));
163
+
164
+ try {
165
+ await this.adapter.setStateAsync(`temperature.${key}.last_valid_value`, {
166
+ val: value,
167
+ ack: true,
168
+ });
169
+ await this.adapter.setStateAsync(`temperature.${key}.last_valid_value_at`, {
170
+ val: isoTime,
171
+ ack: true,
172
+ });
173
+ await this.adapter.setStateAsync(`temperature.${key}.minutes_since_last_value`, {
174
+ val: minutesSince,
175
+ ack: true,
176
+ });
177
+ await this.adapter.setStateAsync(`temperature.${key}.source_status`, {
178
+ val: status,
179
+ ack: true,
180
+ });
181
+ } catch (err) {
182
+ this.adapter.log.warn(`[temperatureHelper] sensor diagnostics ${key} failed: ${err.message}`);
183
+ }
184
+ },
185
+
147
186
  async _maybeWriteDelta(stateId, a, b) {
148
187
  if (a === undefined || b === undefined) {
149
188
  return;
@@ -221,12 +260,90 @@ const temperatureHelper = {
221
260
  nextMidnight.setHours(24, 0, 0, 0);
222
261
  const msUntilMidnight = nextMidnight.getTime() - now.getTime();
223
262
 
224
- this.resetTimer = setTimeout(() => {
225
- this._resetMinMax();
263
+ this.resetTimer = this.adapter.setTimeout(async () => {
264
+ await this._resetMinMax();
226
265
  this._scheduleDailyReset(); // neu für nächsten Tag
227
266
  }, msUntilMidnight);
228
267
  },
229
268
 
269
+ // NEU: Sensor-Aktualität regelmäßig prüfen
270
+ _scheduleSensorDiagnostics() {
271
+ this.diagnosticTimer = this.adapter.setInterval(async () => {
272
+ for (const key of Object.keys(this.sensors)) {
273
+ try {
274
+ const lastValidState = await this.adapter.getStateAsync(`temperature.${key}.last_valid_value_at`);
275
+ const lastValidAt = lastValidState?.val;
276
+
277
+ if (!lastValidAt) {
278
+ await this.adapter.setStateAsync(`temperature.${key}.source_status`, {
279
+ val: 'not_received',
280
+ ack: true,
281
+ });
282
+ continue;
283
+ }
284
+
285
+ const lastTs = Date.parse(lastValidAt);
286
+ if (!Number.isFinite(lastTs)) {
287
+ await this.adapter.setStateAsync(`temperature.${key}.source_status`, {
288
+ val: 'invalid_timestamp',
289
+ ack: true,
290
+ });
291
+ continue;
292
+ }
293
+
294
+ const minutesSince = Math.max(0, Math.round((Date.now() - lastTs) / 60000));
295
+
296
+ await this.adapter.setStateAsync(`temperature.${key}.minutes_since_last_value`, {
297
+ val: minutesSince,
298
+ ack: true,
299
+ });
300
+
301
+ await this.adapter.setStateAsync(`temperature.${key}.source_status`, {
302
+ val: minutesSince <= 15 ? 'ok' : 'warning',
303
+ ack: true,
304
+ });
305
+
306
+ if (minutesSince > 15) {
307
+ await this._tryRecoverSensorValue(key, minutesSince);
308
+ }
309
+ } catch (err) {
310
+ this.adapter.log.warn(`[temperatureHelper] sensor diagnostic check ${key} failed: ${err.message}`);
311
+ }
312
+ }
313
+ }, 60 * 1000);
314
+ },
315
+
316
+ async _tryRecoverSensorValue(key, minutesSince) {
317
+ const sensorId = this.sensors[key];
318
+ if (!sensorId) {
319
+ return;
320
+ }
321
+
322
+ const now = Date.now();
323
+ const lastRun = this.recoveryLastRun[key] || 0;
324
+ if (now - lastRun < 10 * 60 * 1000) {
325
+ return;
326
+ }
327
+
328
+ this.recoveryLastRun[key] = now;
329
+ this.adapter.log.debug(
330
+ `[temperatureHelper] Recovery check started for ${key} (${sensorId}), stale for ${minutesSince} min`,
331
+ );
332
+
333
+ try {
334
+ const state = await this.adapter.getForeignStateAsync(sensorId);
335
+ if (!state || state.val === null || state.val === undefined || !Number.isFinite(Number(state.val))) {
336
+ this.adapter.log.debug(`[temperatureHelper] Recovery check failed for ${key}: no valid numeric value`);
337
+ return;
338
+ }
339
+
340
+ await this.handleStateChange(sensorId, state);
341
+ this.adapter.log.debug(`[temperatureHelper] Recovery check successful for ${key}: ${state.val}`);
342
+ } catch (err) {
343
+ this.adapter.log.debug(`[temperatureHelper] Recovery check failed for ${key}: ${err.message}`);
344
+ }
345
+ },
346
+
230
347
  async _resetMinMax() {
231
348
  this.adapter.log.debug('[temperatureHelper] Resetting daily min/max');
232
349
  for (const key of Object.keys(this.sensors)) {
@@ -264,9 +381,14 @@ const temperatureHelper = {
264
381
 
265
382
  cleanup() {
266
383
  if (this.resetTimer) {
267
- clearTimeout(this.resetTimer);
384
+ this.adapter.clearTimeout(this.resetTimer);
268
385
  this.resetTimer = null;
269
386
  }
387
+
388
+ if (this.diagnosticTimer) {
389
+ this.adapter.clearInterval(this.diagnosticTimer);
390
+ this.diagnosticTimer = null;
391
+ }
270
392
  },
271
393
  };
272
394
 
@@ -214,6 +214,86 @@ async function createTemperatureStates(adapter) {
214
214
  },
215
215
  native: {},
216
216
  });
217
+
218
+ // NEU: Diagnose-States für letzte gültige Sensorwerte
219
+
220
+ await adapter.setObjectNotExistsAsync(`temperature.${sensorKey}.last_valid_value`, {
221
+ type: 'state',
222
+ common: {
223
+ name: {
224
+ en: `Last valid value sensor ${label.en}`,
225
+ de: `Letzter gueltiger Wert Sensor ${label.de}`,
226
+ },
227
+ desc: {
228
+ en: `Last valid temperature value of the ${label.en} sensor`,
229
+ de: `Letzter gueltiger Temperaturwert des Sensors ${label.de}`,
230
+ },
231
+ type: 'number',
232
+ role: 'value.temperature',
233
+ unit: '°C',
234
+ read: true,
235
+ write: false,
236
+ },
237
+ native: {},
238
+ });
239
+
240
+ await adapter.setObjectNotExistsAsync(`temperature.${sensorKey}.last_valid_value_at`, {
241
+ type: 'state',
242
+ common: {
243
+ name: {
244
+ en: `Last valid value time sensor ${label.en}`,
245
+ de: `Zeitpunkt letzter gueltiger Temperaturwert Sensor ${label.de}`,
246
+ },
247
+ desc: {
248
+ en: `Timestamp of the last valid temperature value of the ${label.en} sensor`,
249
+ de: `Zeitpunkt des letzten gueltigen Temperaturwertes des Sensors ${label.de}`,
250
+ },
251
+ type: 'string',
252
+ role: 'value.time',
253
+ read: true,
254
+ write: false,
255
+ },
256
+ native: {},
257
+ });
258
+
259
+ await adapter.setObjectNotExistsAsync(`temperature.${sensorKey}.minutes_since_last_value`, {
260
+ type: 'state',
261
+ common: {
262
+ name: {
263
+ en: `Minutes since last value sensor ${label.en}`,
264
+ de: `Minuten seit letztem Wert Sensor ${label.de}`,
265
+ },
266
+ desc: {
267
+ en: `Minutes since the last valid temperature value of the ${label.en} sensor`,
268
+ de: `Minuten seit dem letzten gueltigen Temperaturwert des Sensors ${label.de}`,
269
+ },
270
+ type: 'number',
271
+ role: 'value',
272
+ unit: 'min',
273
+ read: true,
274
+ write: false,
275
+ },
276
+ native: {},
277
+ });
278
+
279
+ await adapter.setObjectNotExistsAsync(`temperature.${sensorKey}.source_status`, {
280
+ type: 'state',
281
+ common: {
282
+ name: {
283
+ en: `Source status sensor ${label.en}`,
284
+ de: `Quellenstatus Sensor ${label.de}`,
285
+ },
286
+ desc: {
287
+ en: `Diagnostic status of the configured source for the ${label.en} sensor`,
288
+ de: `Diagnosestatus der konfigurierten Quelle fuer den Sensor ${label.de}`,
289
+ },
290
+ type: 'string',
291
+ role: 'text',
292
+ read: true,
293
+ write: false,
294
+ },
295
+ native: {},
296
+ });
217
297
  }
218
298
 
219
299
  // Reihenfolge wie in der Instanz-Config (jsonConfig)
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "iobroker.poolcontrol",
3
- "version": "1.3.22",
3
+ "version": "1.3.24",
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",
@@ -24,13 +24,14 @@
24
24
  "@iobroker/adapter-core": "^3.3.2"
25
25
  },
26
26
  "devDependencies": {
27
- "@alcalzone/release-script": "^5.1.1",
28
- "@alcalzone/release-script-plugin-iobroker": "^5.1.2",
29
- "@alcalzone/release-script-plugin-license": "^5.1.1",
30
- "@alcalzone/release-script-plugin-manual-review": "^5.1.1",
27
+ "@alcalzone/release-script": "^5.2.0",
28
+ "@alcalzone/release-script-plugin-iobroker": "^5.2.0",
29
+ "@alcalzone/release-script-plugin-license": "^5.2.0",
30
+ "@alcalzone/release-script-plugin-manual-review": "^5.2.0",
31
31
  "@iobroker/adapter-dev": "^1.5.0",
32
32
  "@iobroker/eslint-config": "^2.2.0",
33
33
  "@iobroker/testing": "^5.2.2",
34
+ "@types/node": ">=22",
34
35
  "baseline-browser-mapping": "^2.8.32",
35
36
  "proxyquire": "^2.1.3"
36
37
  },