iobroker.poolcontrol 1.3.30 → 1.3.32

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 (42) hide show
  1. package/README.md +11 -16
  2. package/admin/i18n/de.json +158 -0
  3. package/admin/i18n/en.json +158 -0
  4. package/admin/i18n/es.json +158 -0
  5. package/admin/i18n/fr.json +158 -0
  6. package/admin/i18n/it.json +158 -0
  7. package/admin/i18n/nl.json +158 -0
  8. package/admin/i18n/pl.json +158 -0
  9. package/admin/i18n/pt.json +158 -0
  10. package/admin/i18n/ru.json +158 -0
  11. package/admin/i18n/uk.json +158 -0
  12. package/admin/i18n/zh-cn.json +158 -0
  13. package/io-package.json +27 -27
  14. package/lib/helpers/controlHelper.js +37 -6
  15. package/lib/helpers/controlHelper2.js +3 -3
  16. package/lib/helpers/debugLogHelper.js +6 -2
  17. package/lib/helpers/runtimeHelper.js +158 -4
  18. package/lib/helpers/statusHelper.js +3 -3
  19. package/lib/i18n/de.json +9 -1
  20. package/lib/i18n/en.json +9 -1
  21. package/lib/i18n/es.json +10 -1
  22. package/lib/i18n/fr.json +9 -1
  23. package/lib/i18n/it.json +9 -1
  24. package/lib/i18n/nl.json +9 -1
  25. package/lib/i18n/pl.json +9 -1
  26. package/lib/i18n/pt.json +9 -1
  27. package/lib/i18n/ru.json +9 -1
  28. package/lib/i18n/uk.json +9 -1
  29. package/lib/i18n/zh-cn.json +9 -1
  30. package/lib/stateDefinitions/runtimeStates.js +296 -0
  31. package/package.json +2 -1
  32. package/admin/i18n/de/translations.json +0 -158
  33. package/admin/i18n/en/translations.json +0 -169
  34. package/admin/i18n/es/translations.json +0 -158
  35. package/admin/i18n/fr/translations.json +0 -158
  36. package/admin/i18n/it/translations.json +0 -158
  37. package/admin/i18n/nl/translations.json +0 -158
  38. package/admin/i18n/pl/translations.json +0 -158
  39. package/admin/i18n/pt/translations.json +0 -158
  40. package/admin/i18n/ru/translations.json +0 -158
  41. package/admin/i18n/uk/translations.json +0 -158
  42. package/admin/i18n/zh-cn/translations.json +0 -158
@@ -22,6 +22,8 @@ const runtimeHelper = {
22
22
  resetTimer: null,
23
23
  liveTimer: null, // Timer für Live-Updates
24
24
  syncTimer: null, // FIX: Timer zur Selbstheilung bei verpasstem Pumpenstart/-stopp
25
+ lastPlausibilityDailyTotal: null,
26
+ lastPlausibilityCheckTs: null,
25
27
 
26
28
  /**
27
29
  * Initialisiert den Runtime-Helper.
@@ -236,9 +238,21 @@ const runtimeHelper = {
236
238
 
237
239
  // Umwälzmenge berechnen
238
240
  // Reeller Durchflusswert aus pump.live.flow_current_lh
239
- const liveFlowLh = (await this.adapter.getStateAsync('pump.live.flow_current_lh'))?.val || 0;
241
+ const liveFlowLh = Number((await this.adapter.getStateAsync('pump.live.flow_current_lh'))?.val || 0);
242
+
243
+ // Bestehende Werte für Total/Remaining laden
244
+ const oldTotal = Number((await this.adapter.getStateAsync('circulation.daily_total'))?.val || 0);
245
+ const oldRemaining = Number((await this.adapter.getStateAsync('circulation.daily_remaining'))?.val || 0);
240
246
 
241
247
  if (liveFlowLh <= 0) {
248
+ await this._updateCirculationPlausibility({
249
+ dailyTotal: oldTotal,
250
+ oldTotal,
251
+ liveFlowLh,
252
+ dailyRequired,
253
+ effectiveToday,
254
+ currentSessionSeconds,
255
+ });
242
256
  this.adapter.log.debug('[runtimeHelper] No live flow value available, calculation skipped');
243
257
  return;
244
258
  }
@@ -247,9 +261,14 @@ const runtimeHelper = {
247
261
  const dailyTotal = Math.round((effectiveToday / 3600) * liveFlowLh);
248
262
  const dailyRemaining = Math.max(dailyRequired - dailyTotal, 0);
249
263
 
250
- // Bestehende Werte für Total/Remaining laden
251
- const oldTotal = (await this.adapter.getStateAsync('circulation.daily_total'))?.val || 0;
252
- const oldRemaining = (await this.adapter.getStateAsync('circulation.daily_remaining'))?.val || 0;
264
+ await this._updateCirculationPlausibility({
265
+ dailyTotal,
266
+ oldTotal,
267
+ liveFlowLh,
268
+ dailyRequired,
269
+ effectiveToday,
270
+ currentSessionSeconds,
271
+ });
253
272
 
254
273
  // Nur schreiben, wenn tatsächlich sinnvolle Livewerte vorliegen
255
274
  if (liveFlowLh > 0 && dailyTotal > 0) {
@@ -268,6 +287,130 @@ const runtimeHelper = {
268
287
  }
269
288
  },
270
289
 
290
+ async _updateCirculationPlausibility({
291
+ dailyTotal,
292
+ oldTotal,
293
+ liveFlowLh,
294
+ dailyRequired,
295
+ effectiveToday,
296
+ currentSessionSeconds,
297
+ }) {
298
+ try {
299
+ const nowMs = Date.now();
300
+ const nowIso = new Date(nowMs).toISOString();
301
+ const readNumber = async id => {
302
+ const value = Number((await this.adapter.getStateAsync(id))?.val);
303
+ return Number.isFinite(value) ? value : 0;
304
+ };
305
+ const write = (id, val) => this.adapter.setStateAsync(`circulation.plausibility.${id}`, { val, ack: true });
306
+
307
+ const currentPower = await readNumber('pump.current_power');
308
+ const pumpMaxWatt = await readNumber('pump.pump_max_watt');
309
+ const pumpPowerLph = await readNumber('pump.pump_power_lph');
310
+ const flowValue = Number.isFinite(Number(liveFlowLh)) ? Number(liveFlowLh) : 0;
311
+ const flowAvailable = flowValue > 0;
312
+ const currentTotal = Number.isFinite(Number(dailyTotal)) ? Number(dailyTotal) : 0;
313
+ const previousTotal =
314
+ this.lastPlausibilityDailyTotal === null ? Number(oldTotal) || 0 : this.lastPlausibilityDailyTotal;
315
+
316
+ const powerLimit = pumpMaxWatt > 0 ? pumpMaxWatt * 1.2 : 0;
317
+ const flowLimit = pumpPowerLph > 0 ? pumpPowerLph * 1.2 : 0;
318
+ let powerWarning = currentPower > 0 && powerLimit > 0 && currentPower > powerLimit;
319
+ let flowWarning = flowAvailable && flowLimit > 0 && flowValue > flowLimit;
320
+
321
+ let elapsedSeconds = 0;
322
+ let deltaLiters = 0;
323
+ let maxPlausibleDelta = 0;
324
+ let jumpWarning = false;
325
+ const hasPreviousCheck = this.lastPlausibilityCheckTs !== null && this.lastPlausibilityDailyTotal !== null;
326
+
327
+ if (hasPreviousCheck) {
328
+ elapsedSeconds = Math.max(0, Math.round((nowMs - this.lastPlausibilityCheckTs) / 1000));
329
+ deltaLiters = Math.max(0, currentTotal - this.lastPlausibilityDailyTotal);
330
+
331
+ if (elapsedSeconds > 0 && elapsedSeconds <= 3600 && pumpPowerLph > 0) {
332
+ maxPlausibleDelta = (pumpPowerLph * 1.5 * elapsedSeconds) / 3600;
333
+ jumpWarning = deltaLiters > maxPlausibleDelta;
334
+ }
335
+ }
336
+
337
+ if (!flowAvailable) {
338
+ flowWarning = false;
339
+ jumpWarning = false;
340
+ }
341
+
342
+ const warningCount = [powerWarning, flowWarning, jumpWarning].filter(Boolean).length;
343
+ let status = 'ok';
344
+ let level = 'ok';
345
+ let messageKey = 'circulation_plausibility_ok';
346
+
347
+ if (warningCount > 0) {
348
+ status = 'warning';
349
+ level = 'warning';
350
+ if (warningCount > 1) {
351
+ messageKey = 'circulation_plausibility_multiple_warnings';
352
+ } else if (powerWarning) {
353
+ messageKey = 'circulation_plausibility_power_warning';
354
+ } else if (flowWarning) {
355
+ messageKey = 'circulation_plausibility_flow_warning';
356
+ } else {
357
+ messageKey = 'circulation_plausibility_daily_total_jump_warning';
358
+ }
359
+ } else if (!flowAvailable) {
360
+ status = 'unchecked';
361
+ level = 'info';
362
+ messageKey = 'circulation_plausibility_no_flow';
363
+ }
364
+
365
+ await write('00_status', status);
366
+ await write('01_level', level);
367
+ await write('02_message_key', messageKey);
368
+ await write('03_last_update', nowIso);
369
+ await write('10_power_warning', powerWarning);
370
+ await write('11_power_value_w', currentPower > 0 ? currentPower : 0);
371
+ await write('12_power_limit_w', powerLimit > 0 ? powerLimit : 0);
372
+ await write('20_flow_warning', flowWarning);
373
+ await write('21_flow_value_lh', flowAvailable ? flowValue : 0);
374
+ await write('22_flow_limit_lh', flowLimit > 0 ? flowLimit : 0);
375
+ await write('24_flow_available', flowAvailable);
376
+ await write('30_jump_warning', jumpWarning);
377
+ await write('31_jump_value_liters', deltaLiters);
378
+ await write('32_jump_limit_liters', maxPlausibleDelta);
379
+ await write('40_last_daily_total', previousTotal);
380
+ await write('41_current_daily_total', currentTotal);
381
+ await write('42_delta_liters', deltaLiters);
382
+ await write('43_elapsed_seconds', elapsedSeconds);
383
+ await write('44_max_plausible_delta_liters', maxPlausibleDelta);
384
+
385
+ if (powerWarning) {
386
+ await write('13_power_warning_at', nowIso);
387
+ }
388
+ if (flowWarning) {
389
+ await write('23_flow_warning_at', nowIso);
390
+ }
391
+ if (jumpWarning) {
392
+ await write('33_jump_warning_at', nowIso);
393
+ }
394
+
395
+ this.lastPlausibilityDailyTotal = currentTotal;
396
+ this.lastPlausibilityCheckTs = nowMs;
397
+
398
+ if (warningCount > 0) {
399
+ this.adapter.log.warn(
400
+ `[runtimeHelper] Circulation plausibility warning: power=${powerWarning}, flow=${flowWarning}, jump=${jumpWarning}, dailyTotal=${currentTotal}, delta=${deltaLiters}, maxDelta=${maxPlausibleDelta}`,
401
+ );
402
+ } else {
403
+ this.adapter.log.debug(
404
+ `[runtimeHelper] Circulation plausibility updated (status=${status}, dailyTotal=${currentTotal}, flow=${flowValue}, required=${dailyRequired}, effectiveToday=${effectiveToday}, currentSession=${currentSessionSeconds})`,
405
+ );
406
+ }
407
+ } catch (err) {
408
+ this.adapter.log.warn(
409
+ `[runtimeHelper] Error while updating circulation plausibility states: ${err.message}`,
410
+ );
411
+ }
412
+ },
413
+
271
414
  _formatTime(seconds) {
272
415
  seconds = Math.max(0, Math.floor(seconds));
273
416
  const h = Math.floor(seconds / 3600);
@@ -351,6 +494,17 @@ const runtimeHelper = {
351
494
  this.runtimeToday = 0;
352
495
  this.startCountToday = 0;
353
496
  this.lastOn = this.isRunning ? Date.now() : null;
497
+ this.lastPlausibilityDailyTotal = 0;
498
+ this.lastPlausibilityCheckTs = Date.now();
499
+
500
+ await this.adapter.setStateAsync('circulation.plausibility.40_last_daily_total', { val: 0, ack: true });
501
+ await this.adapter.setStateAsync('circulation.plausibility.41_current_daily_total', { val: 0, ack: true });
502
+ await this.adapter.setStateAsync('circulation.plausibility.42_delta_liters', { val: 0, ack: true });
503
+ await this.adapter.setStateAsync('circulation.plausibility.43_elapsed_seconds', { val: 0, ack: true });
504
+ await this.adapter.setStateAsync('circulation.plausibility.44_max_plausible_delta_liters', {
505
+ val: 0,
506
+ ack: true,
507
+ });
354
508
 
355
509
  // Laufzeiten zurücksetzen
356
510
  await this._updateStates();
@@ -226,14 +226,14 @@ const statusHelper = {
226
226
 
227
227
  scheduleMidnightReset() {
228
228
  if (this.midnightTimer) {
229
- clearTimeout(this.midnightTimer);
229
+ this.adapter.clearTimeout(this.midnightTimer);
230
230
  }
231
231
 
232
232
  const now = new Date();
233
233
  const nextMidnight = new Date(now.getFullYear(), now.getMonth(), now.getDate() + 1, 0, 0, 5, 0);
234
234
  const msToMidnight = nextMidnight.getTime() - now.getTime();
235
235
 
236
- this.midnightTimer = setTimeout(async () => {
236
+ this.midnightTimer = this.adapter.setTimeout(async () => {
237
237
  await this.doMidnightReset();
238
238
  this.scheduleMidnightReset(); // neu einplanen
239
239
  }, msToMidnight);
@@ -253,7 +253,7 @@ const statusHelper = {
253
253
 
254
254
  cleanup() {
255
255
  if (this.midnightTimer) {
256
- clearTimeout(this.midnightTimer);
256
+ this.adapter.clearTimeout(this.midnightTimer);
257
257
  this.midnightTimer = null;
258
258
  }
259
259
  },
package/lib/i18n/de.json CHANGED
@@ -372,5 +372,13 @@
372
372
  "pool_insights_observation_pv_runtime_today": "PV-Unterstützung lief heute {minutes} Minuten.",
373
373
  "pool_insights_observation_ph_evaluation_available": "Eine pH-Bewertung ist verfügbar.",
374
374
  "pool_insights_observation_tds_evaluation_available": "Eine TDS-Bewertung ist verfügbar.",
375
- "pool_insights_observation_orp_evaluation_available": "Eine ORP-Bewertung ist verfügbar."
375
+ "pool_insights_observation_orp_evaluation_available": "Eine ORP-Bewertung ist verfügbar.",
376
+
377
+ "circulation_plausibility_initializing": "Die Plausibilitätsprüfung der Umwälzberechnung wird initialisiert.",
378
+ "circulation_plausibility_ok": "Die Plausibilitätsprüfung der Umwälzberechnung ist in Ordnung.",
379
+ "circulation_plausibility_no_flow": "Für die Umwälzberechnung ist kein gültiger Live-Durchflusswert verfügbar.",
380
+ "circulation_plausibility_power_warning": "Die Pumpenleistung ist im Verhältnis zur konfigurierten Maximalleistung unplausibel hoch.",
381
+ "circulation_plausibility_flow_warning": "Der berechnete Durchfluss ist im Verhältnis zur konfigurierten Nennförderleistung unplausibel hoch.",
382
+ "circulation_plausibility_daily_total_jump_warning": "Das Tagesumwälzvolumen ist schneller gestiegen als physikalisch plausibel.",
383
+ "circulation_plausibility_multiple_warnings": "Mehrere Plausibilitätswarnungen zur Umwälzberechnung sind aktiv."
376
384
  }
package/lib/i18n/en.json CHANGED
@@ -399,5 +399,13 @@
399
399
  "pool_insights_observation_pv_runtime_today": "PV support ran for {minutes} minutes today.",
400
400
  "pool_insights_observation_ph_evaluation_available": "A pH evaluation is available.",
401
401
  "pool_insights_observation_tds_evaluation_available": "A TDS evaluation is available.",
402
- "pool_insights_observation_orp_evaluation_available": "An ORP evaluation is available."
402
+ "pool_insights_observation_orp_evaluation_available": "An ORP evaluation is available.",
403
+
404
+ "circulation_plausibility_initializing": "Circulation plausibility check is initializing.",
405
+ "circulation_plausibility_ok": "Circulation plausibility check is OK.",
406
+ "circulation_plausibility_no_flow": "No valid live flow value is available for the circulation calculation.",
407
+ "circulation_plausibility_power_warning": "Pump power is implausibly high compared to the configured maximum power.",
408
+ "circulation_plausibility_flow_warning": "Calculated flow rate is implausibly high compared to the configured nominal flow.",
409
+ "circulation_plausibility_daily_total_jump_warning": "Daily circulation volume increased faster than physically plausible.",
410
+ "circulation_plausibility_multiple_warnings": "Multiple circulation plausibility warnings are active."
403
411
  }
package/lib/i18n/es.json CHANGED
@@ -395,5 +395,14 @@
395
395
  "pool_insights_observation_pv_runtime_today": "La asistencia PV funcionó hoy durante {minutes} minutos.",
396
396
  "pool_insights_observation_ph_evaluation_available": "Hay una evaluación de pH disponible.",
397
397
  "pool_insights_observation_tds_evaluation_available": "Hay una evaluación de TDS disponible.",
398
- "pool_insights_observation_orp_evaluation_available": "Hay una evaluación de ORP disponible."
398
+ "pool_insights_observation_orp_evaluation_available": "Hay una evaluación de ORP disponible.",
399
+
400
+ "circulation_plausibility_initializing": "La comprobación de plausibilidad de la circulación se está inicializando.",
401
+ "circulation_plausibility_ok": "La comprobación de plausibilidad de la circulación es correcta.",
402
+ "circulation_plausibility_no_flow": "No hay un valor válido de caudal disponible para el cálculo de la circulación.",
403
+ "circulation_plausibility_power_warning": "La potencia de la bomba es excesiva en relación con la potencia máxima configurada.",
404
+ "circulation_plausibility_flow_warning": "El caudal calculado es excesivo en relación con el caudal nominal configurado.",
405
+ "circulation_plausibility_daily_total_jump_warning": "El volumen diario de circulación ha aumentado más rápido de lo físicamente plausible.",
406
+ "circulation_plausibility_multiple_warnings": "Hay varias advertencias de plausibilidad de circulación activas."
399
407
  }
408
+
package/lib/i18n/fr.json CHANGED
@@ -395,5 +395,13 @@
395
395
  "pool_insights_observation_pv_runtime_today": "L’assistance PV a fonctionné pendant {minutes} minutes aujourd’hui.",
396
396
  "pool_insights_observation_ph_evaluation_available": "Une évaluation du pH est disponible.",
397
397
  "pool_insights_observation_tds_evaluation_available": "Une évaluation TDS est disponible.",
398
- "pool_insights_observation_orp_evaluation_available": "Une évaluation ORP est disponible."
398
+ "pool_insights_observation_orp_evaluation_available": "Une évaluation ORP est disponible.",
399
+
400
+ "circulation_plausibility_initializing": "La vérification de plausibilité de la circulation est en cours d'initialisation.",
401
+ "circulation_plausibility_ok": "La vérification de plausibilité de la circulation est correcte.",
402
+ "circulation_plausibility_no_flow": "Aucune valeur de débit valide n'est disponible pour le calcul de circulation.",
403
+ "circulation_plausibility_power_warning": "La puissance de la pompe est anormalement élevée par rapport à la puissance maximale configurée.",
404
+ "circulation_plausibility_flow_warning": "Le débit calculé est anormalement élevé par rapport au débit nominal configuré.",
405
+ "circulation_plausibility_daily_total_jump_warning": "Le volume quotidien de circulation a augmenté plus rapidement que physiquement plausible.",
406
+ "circulation_plausibility_multiple_warnings": "Plusieurs avertissements de plausibilité de circulation sont actifs."
399
407
  }
package/lib/i18n/it.json CHANGED
@@ -395,5 +395,13 @@
395
395
  "pool_insights_observation_pv_runtime_today": "Il supporto PV ha funzionato oggi per {minutes} minuti.",
396
396
  "pool_insights_observation_ph_evaluation_available": "È disponibile una valutazione pH.",
397
397
  "pool_insights_observation_tds_evaluation_available": "È disponibile una valutazione TDS.",
398
- "pool_insights_observation_orp_evaluation_available": "È disponibile una valutazione ORP."
398
+ "pool_insights_observation_orp_evaluation_available": "È disponibile una valutazione ORP.",
399
+
400
+ "circulation_plausibility_initializing": "Il controllo di plausibilità della circolazione è in fase di inizializzazione.",
401
+ "circulation_plausibility_ok": "Il controllo di plausibilità della circolazione è corretto.",
402
+ "circulation_plausibility_no_flow": "Non è disponibile un valore di flusso valido per il calcolo della circolazione.",
403
+ "circulation_plausibility_power_warning": "La potenza della pompa è eccessivamente alta rispetto alla potenza massima configurata.",
404
+ "circulation_plausibility_flow_warning": "La portata calcolata è eccessivamente alta rispetto alla portata nominale configurata.",
405
+ "circulation_plausibility_daily_total_jump_warning": "Il volume giornaliero di circolazione è aumentato più velocemente di quanto fisicamente plausibile.",
406
+ "circulation_plausibility_multiple_warnings": "Sono attivi più avvisi di plausibilità della circolazione."
399
407
  }
package/lib/i18n/nl.json CHANGED
@@ -395,5 +395,13 @@
395
395
  "pool_insights_observation_pv_runtime_today": "PV-ondersteuning liep vandaag {minutes} minuten.",
396
396
  "pool_insights_observation_ph_evaluation_available": "Er is een pH-beoordeling beschikbaar.",
397
397
  "pool_insights_observation_tds_evaluation_available": "Er is een TDS-beoordeling beschikbaar.",
398
- "pool_insights_observation_orp_evaluation_available": "Er is een ORP-beoordeling beschikbaar."
398
+ "pool_insights_observation_orp_evaluation_available": "Er is een ORP-beoordeling beschikbaar.",
399
+
400
+ "circulation_plausibility_initializing": "De plausibiliteitscontrole van de circulatie wordt geïnitialiseerd.",
401
+ "circulation_plausibility_ok": "De plausibiliteitscontrole van de circulatie is in orde.",
402
+ "circulation_plausibility_no_flow": "Er is geen geldige debietwaarde beschikbaar voor de circulatieberekening.",
403
+ "circulation_plausibility_power_warning": "Het pompvermogen is onwaarschijnlijk hoog ten opzichte van het ingestelde maximale vermogen.",
404
+ "circulation_plausibility_flow_warning": "Het berekende debiet is onwaarschijnlijk hoog ten opzichte van het ingestelde nominale debiet.",
405
+ "circulation_plausibility_daily_total_jump_warning": "Het dagelijkse circulatievolume is sneller gestegen dan fysiek plausibel.",
406
+ "circulation_plausibility_multiple_warnings": "Er zijn meerdere waarschuwingen voor circulatie-plausibiliteit actief."
399
407
  }
package/lib/i18n/pl.json CHANGED
@@ -395,5 +395,13 @@
395
395
  "pool_insights_observation_pv_runtime_today": "Wsparcie PV działało dziś przez {minutes} minut.",
396
396
  "pool_insights_observation_ph_evaluation_available": "Dostępna jest ocena pH.",
397
397
  "pool_insights_observation_tds_evaluation_available": "Dostępna jest ocena TDS.",
398
- "pool_insights_observation_orp_evaluation_available": "Dostępna jest ocena ORP."
398
+ "pool_insights_observation_orp_evaluation_available": "Dostępna jest ocena ORP.",
399
+
400
+ "circulation_plausibility_initializing": "Trwa inicjalizacja kontroli wiarygodności obiegu.",
401
+ "circulation_plausibility_ok": "Kontrola wiarygodności obiegu jest prawidłowa.",
402
+ "circulation_plausibility_no_flow": "Brak prawidłowej wartości przepływu dla obliczeń obiegu.",
403
+ "circulation_plausibility_power_warning": "Moc pompy jest nienaturalnie wysoka względem skonfigurowanej mocy maksymalnej.",
404
+ "circulation_plausibility_flow_warning": "Obliczony przepływ jest nienaturalnie wysoki względem skonfigurowanego przepływu nominalnego.",
405
+ "circulation_plausibility_daily_total_jump_warning": "Dzienna objętość obiegu wzrosła szybciej niż jest to fizycznie możliwe.",
406
+ "circulation_plausibility_multiple_warnings": "Aktywnych jest kilka ostrzeżeń dotyczących wiarygodności obiegu."
399
407
  }
package/lib/i18n/pt.json CHANGED
@@ -395,5 +395,13 @@
395
395
  "pool_insights_observation_pv_runtime_today": "O apoio PV funcionou hoje durante {minutes} minutos.",
396
396
  "pool_insights_observation_ph_evaluation_available": "Está disponível uma avaliação de pH.",
397
397
  "pool_insights_observation_tds_evaluation_available": "Está disponível uma avaliação TDS.",
398
- "pool_insights_observation_orp_evaluation_available": "Está disponível uma avaliação ORP."
398
+ "pool_insights_observation_orp_evaluation_available": "Está disponível uma avaliação ORP.",
399
+
400
+ "circulation_plausibility_initializing": "A verificação de plausibilidade da circulação está a ser inicializada.",
401
+ "circulation_plausibility_ok": "A verificação de plausibilidade da circulação está correta.",
402
+ "circulation_plausibility_no_flow": "Não existe um valor de caudal válido para o cálculo da circulação.",
403
+ "circulation_plausibility_power_warning": "A potência da bomba é excessivamente elevada em relação à potência máxima configurada.",
404
+ "circulation_plausibility_flow_warning": "O caudal calculado é excessivamente elevado em relação ao caudal nominal configurado.",
405
+ "circulation_plausibility_daily_total_jump_warning": "O volume diário de circulação aumentou mais rapidamente do que seria fisicamente plausível.",
406
+ "circulation_plausibility_multiple_warnings": "Existem vários avisos de plausibilidade da circulação ativos."
399
407
  }
package/lib/i18n/ru.json CHANGED
@@ -395,5 +395,13 @@
395
395
  "pool_insights_observation_pv_runtime_today": "Поддержка PV сегодня работала {minutes} минут.",
396
396
  "pool_insights_observation_ph_evaluation_available": "Доступна оценка pH.",
397
397
  "pool_insights_observation_tds_evaluation_available": "Доступна оценка TDS.",
398
- "pool_insights_observation_orp_evaluation_available": "Доступна оценка ORP."
398
+ "pool_insights_observation_orp_evaluation_available": "Доступна оценка ORP.",
399
+
400
+ "circulation_plausibility_initializing": "Инициализируется проверка достоверности циркуляции.",
401
+ "circulation_plausibility_ok": "Проверка достоверности циркуляции выполнена успешно.",
402
+ "circulation_plausibility_no_flow": "Нет допустимого значения потока для расчёта циркуляции.",
403
+ "circulation_plausibility_power_warning": "Мощность насоса слишком велика по сравнению с настроенной максимальной мощностью.",
404
+ "circulation_plausibility_flow_warning": "Расчётный поток слишком велик по сравнению с настроенным номинальным потоком.",
405
+ "circulation_plausibility_daily_total_jump_warning": "Суточный объём циркуляции увеличился быстрее, чем это физически возможно.",
406
+ "circulation_plausibility_multiple_warnings": "Активны несколько предупреждений проверки достоверности циркуляции."
399
407
  }
package/lib/i18n/uk.json CHANGED
@@ -395,5 +395,13 @@
395
395
  "pool_insights_observation_pv_runtime_today": "Підтримка PV сьогодні працювала {minutes} хвилин.",
396
396
  "pool_insights_observation_ph_evaluation_available": "Доступна оцінка pH.",
397
397
  "pool_insights_observation_tds_evaluation_available": "Доступна оцінка TDS.",
398
- "pool_insights_observation_orp_evaluation_available": "Доступна оцінка ORP."
398
+ "pool_insights_observation_orp_evaluation_available": "Доступна оцінка ORP.",
399
+
400
+ "circulation_plausibility_initializing": "Ініціалізується перевірка правдоподібності циркуляції.",
401
+ "circulation_plausibility_ok": "Перевірка правдоподібності циркуляції успішна.",
402
+ "circulation_plausibility_no_flow": "Відсутнє коректне значення потоку для розрахунку циркуляції.",
403
+ "circulation_plausibility_power_warning": "Потужність насоса надто висока відносно налаштованої максимальної потужності.",
404
+ "circulation_plausibility_flow_warning": "Розрахований потік надто високий відносно налаштованого номінального потоку.",
405
+ "circulation_plausibility_daily_total_jump_warning": "Добовий обсяг циркуляції збільшився швидше, ніж це фізично можливо.",
406
+ "circulation_plausibility_multiple_warnings": "Активні кілька попереджень перевірки правдоподібності циркуляції."
399
407
  }
@@ -395,5 +395,13 @@
395
395
  "pool_insights_observation_pv_runtime_today": "今天 PV 支持运行了 {minutes} 分钟。",
396
396
  "pool_insights_observation_ph_evaluation_available": "已有 pH 评估。",
397
397
  "pool_insights_observation_tds_evaluation_available": "已有 TDS 评估。",
398
- "pool_insights_observation_orp_evaluation_available": "已有 ORP 评估。"
398
+ "pool_insights_observation_orp_evaluation_available": "已有 ORP 评估。",
399
+
400
+ "circulation_plausibility_initializing": "循环合理性检查正在初始化。",
401
+ "circulation_plausibility_ok": "循环合理性检查正常。",
402
+ "circulation_plausibility_no_flow": "没有可用于循环计算的有效流量值。",
403
+ "circulation_plausibility_power_warning": "泵功率相对于配置的最大功率异常偏高。",
404
+ "circulation_plausibility_flow_warning": "计算出的流量相对于配置的额定流量异常偏高。",
405
+ "circulation_plausibility_daily_total_jump_warning": "每日循环量增长速度超过物理合理范围。",
406
+ "circulation_plausibility_multiple_warnings": "存在多个循环合理性警告。"
399
407
  }