iobroker.poolcontrol 1.3.7 → 1.3.10

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.
@@ -131,6 +131,12 @@ const solarHelper = {
131
131
  });
132
132
 
133
133
  // ZENTRAL: Pumpe über Bool-Schalter setzen
134
+ if (shouldRun) {
135
+ await this._setActiveHelperIfAllowed('solarHelper');
136
+ } else {
137
+ await this._releaseActiveHelperIfOwned();
138
+ }
139
+
134
140
  await this.adapter.setStateChangedAsync('pump.pump_switch', {
135
141
  val: shouldRun,
136
142
  ack: false,
@@ -145,6 +151,8 @@ const solarHelper = {
145
151
  ack: true,
146
152
  });
147
153
 
154
+ await this._releaseActiveHelperIfOwned();
155
+
148
156
  // Keine Schaltung – Grund protokollieren
149
157
  const reason = !season
150
158
  ? 'Saison inaktiv'
@@ -209,6 +217,37 @@ const solarHelper = {
209
217
  }
210
218
  },
211
219
 
220
+ async _setActiveHelperIfAllowed(helperName) {
221
+ try {
222
+ const activeHelper = (await this.adapter.getStateAsync('pump.active_helper'))?.val || '';
223
+
224
+ if (activeHelper && activeHelper !== helperName) {
225
+ this.adapter.log.debug(
226
+ `[solarHelper] Active helper not changed because '${activeHelper}' currently owns the pump.`,
227
+ );
228
+ return;
229
+ }
230
+
231
+ await this.adapter.setStateAsync('pump.active_helper', { val: helperName, ack: true });
232
+ } catch (err) {
233
+ this.adapter.log.warn(`[solarHelper] Could not set pump.active_helper: ${err.message}`);
234
+ }
235
+ },
236
+
237
+ async _releaseActiveHelperIfOwned() {
238
+ try {
239
+ const activeHelper = (await this.adapter.getStateAsync('pump.active_helper'))?.val || '';
240
+
241
+ if (activeHelper !== 'solarHelper') {
242
+ return;
243
+ }
244
+
245
+ await this.adapter.setStateAsync('pump.active_helper', { val: '', ack: true });
246
+ } catch (err) {
247
+ this.adapter.log.warn(`[solarHelper] Could not release pump.active_helper: ${err.message}`);
248
+ }
249
+ },
250
+
212
251
  cleanup() {
213
252
  if (this.checkTimer) {
214
253
  this.adapter.clearInterval(this.checkTimer);
@@ -15,6 +15,7 @@ const solarInsightsHelper = {
15
15
  checkTimer: null,
16
16
  resetTimer: null,
17
17
  lastCheckTimestamp: null,
18
+ lastSolarLogicActive: false,
18
19
 
19
20
  init(adapter) {
20
21
  this.adapter = adapter;
@@ -35,8 +36,11 @@ const solarInsightsHelper = {
35
36
  return;
36
37
  }
37
38
 
38
- // Tages-Latch sofort setzen, wenn Solar aktiv wird
39
- if ((id === 'solar.request_active' || id === 'solar.extended.active') && state.val === true) {
39
+ // FIX: Tages-Latch auch bei vollständigen ioBroker IDs sicher setzen
40
+ if (
41
+ (this._matchesStateId(id, 'solar.request_active') || this._matchesStateId(id, 'solar.extended.active')) &&
42
+ state.val === true
43
+ ) {
40
44
  void this.adapter.setStateChangedAsync('analytics.insights.solar.results.solar_ran_today', {
41
45
  val: true,
42
46
  ack: true,
@@ -99,6 +103,7 @@ const solarInsightsHelper = {
99
103
  });
100
104
 
101
105
  this.lastCheckTimestamp = null;
106
+ this.lastSolarLogicActive = false;
102
107
 
103
108
  await this.adapter.setStateChangedAsync('analytics.insights.solar.debug.last_update', {
104
109
  val: new Date().toISOString(),
@@ -185,7 +190,13 @@ const solarInsightsHelper = {
185
190
  'ai.weather.outputs.daily_summary',
186
191
  ];
187
192
 
188
- return ids.includes(id);
193
+ // FIX: Also support full ioBroker IDs like "poolcontrol.0.solar.request_active"
194
+ return ids.some(relevantId => id === relevantId || id.endsWith(`.${relevantId}`));
195
+ },
196
+
197
+ _matchesStateId(id, stateId) {
198
+ // FIX: Also support full ioBroker IDs like "poolcontrol.0.solar.request_active"
199
+ return id === stateId || id.endsWith(`.${stateId}`);
189
200
  },
190
201
 
191
202
  async _checkSolarInsights() {
@@ -353,13 +364,18 @@ const solarInsightsHelper = {
353
364
  peakPowerTodayW = 0;
354
365
  }
355
366
 
356
- if (this.lastCheckTimestamp && solarEffectiveNow && Number.isFinite(thermalPowerW) && thermalPowerW > 0) {
367
+ if (this.lastCheckTimestamp && (this.lastSolarLogicActive || solarLogicActive)) {
357
368
  const deltaHours = (nowTs - this.lastCheckTimestamp) / 3600000;
358
369
 
359
- // Schutz gegen unrealistisch große Sprünge
370
+ // FIX: Count active solar minutes based on solar runtime, not only on positive thermal gain.
371
+ // The interval is counted if solar was active at the previous or current check.
360
372
  if (deltaHours > 0 && deltaHours <= 0.5) {
361
- estimatedGainTodayWh = Number((estimatedGainTodayWh + thermalPowerW * deltaHours).toFixed(2));
362
373
  activeMinutesToday = Number((activeMinutesToday + deltaHours * 60).toFixed(2));
374
+
375
+ // FIX: Energy gain is only accumulated when a positive thermal power can be calculated
376
+ if (solarEffectiveNow && Number.isFinite(thermalPowerW) && thermalPowerW > 0) {
377
+ estimatedGainTodayWh = Number((estimatedGainTodayWh + thermalPowerW * deltaHours).toFixed(2));
378
+ }
363
379
  }
364
380
  }
365
381
 
@@ -681,7 +697,14 @@ const solarInsightsHelper = {
681
697
  ack: true,
682
698
  });
683
699
 
700
+ await this.adapter.setStateChangedAsync('analytics.insights.solar.debug.last_update', {
701
+ val: new Date().toISOString(),
702
+ ack: true,
703
+ });
704
+
684
705
  this.lastCheckTimestamp = nowTs;
706
+ this.lastSolarLogicActive = solarLogicActive;
707
+
685
708
  this.adapter.log.debug('[solarInsightsHelper] Block 7 updated successfully');
686
709
  } catch (err) {
687
710
  this.adapter.log.warn(`[solarInsightsHelper] Error in check: ${err.message}`);
@@ -224,10 +224,6 @@ const solarLogbookHelper = {
224
224
 
225
225
  const currentEntry = await this._readString('analytics.insights.solar.logbook.current_entry');
226
226
 
227
- if (currentEntry === entry.text) {
228
- return;
229
- }
230
-
231
227
  const now = new Date();
232
228
  const nowIso = now.toISOString();
233
229
  const timeLabel = this._formatTime(now);
@@ -241,13 +237,31 @@ const solarLogbookHelper = {
241
237
  };
242
238
 
243
239
  const dayLogJsonRaw = await this._readString('analytics.insights.solar.logbook.day_log_json');
244
- const dayLog = this._safeParseArray(dayLogJsonRaw);
240
+ let dayLog = this._safeParseArray(dayLogJsonRaw);
241
+
242
+ // FIX: Remove obsolete "no runtime today" entries once solar has actually run today.
243
+ // The current_entry remains live, but the readable day log should not keep a misleading
244
+ // "Solar did not run today" entry after solar runtime was detected.
245
+ if (entry.type !== 'no_runtime_today') {
246
+ dayLog = dayLog.filter(item => item && item.type !== 'no_runtime_today');
247
+ }
245
248
 
246
- dayLog.push(newLogItem);
249
+ const lastLogItem = dayLog.length > 0 ? dayLog[dayLog.length - 1] : null;
250
+ const shouldAppendLogEntry = this._shouldAppendLogEntry(lastLogItem, entry, now);
247
251
 
248
- const trimmedLog = dayLog.slice(-100);
252
+ // FIX: current_entry is the live readable status and may change often.
253
+ // day_log_json/day_log_text are readable day history and should only receive meaningful entries.
254
+ if (currentEntry === entry.text && !shouldAppendLogEntry) {
255
+ return;
256
+ }
249
257
 
250
- const dayLogText = trimmedLog.map(item => `${item.time} - ${item.text}`).join('\n');
258
+ let trimmedLog = dayLog.slice(-100);
259
+
260
+ if (shouldAppendLogEntry) {
261
+ trimmedLog = [...dayLog, newLogItem].slice(-100);
262
+ }
263
+
264
+ const dayLogText = this._buildDayLogText(trimmedLog);
251
265
 
252
266
  await this.adapter.setStateChangedAsync('analytics.insights.solar.logbook.current_entry', {
253
267
  val: entry.text,
@@ -269,8 +283,10 @@ const solarLogbookHelper = {
269
283
  ack: true,
270
284
  });
271
285
 
286
+ const lastEntryTime = await this._readString('analytics.insights.solar.logbook.last_entry_time');
287
+
272
288
  await this.adapter.setStateChangedAsync('analytics.insights.solar.logbook.last_entry_time', {
273
- val: nowIso,
289
+ val: shouldAppendLogEntry ? nowIso : lastEntryTime,
274
290
  ack: true,
275
291
  });
276
292
 
@@ -472,18 +488,61 @@ const solarLogbookHelper = {
472
488
  };
473
489
  },
474
490
 
491
+ // ================================
492
+ // FIX: Logbook Filter & Throttling
493
+ // ================================
494
+
495
+ _shouldAppendLogEntry(lastLogItem, entry, now) {
496
+ if (!lastLogItem) {
497
+ return true;
498
+ }
499
+
500
+ if (!entry || !entry.type) {
501
+ return false;
502
+ }
503
+
504
+ // Statuswechsel IMMER loggen
505
+ if (lastLogItem.type !== entry.type) {
506
+ return true;
507
+ }
508
+
509
+ const lastTimestamp = Date.parse(lastLogItem.ts);
510
+
511
+ if (!Number.isFinite(lastTimestamp)) {
512
+ return true;
513
+ }
514
+
515
+ // max alle 15 Minuten neuen Eintrag
516
+ const minIntervalMs = 15 * 60 * 1000;
517
+
518
+ return now.getTime() - lastTimestamp >= minIntervalMs;
519
+ },
520
+
521
+ _buildDayLogText(dayLog) {
522
+ return dayLog.map(item => `${item.time} - ${item.text}`).join('\n');
523
+ },
524
+
475
525
  _extractShortWeather(weatherSummary) {
476
526
  if (!weatherSummary || weatherSummary.trim() === '') {
477
527
  return '';
478
528
  }
479
529
 
480
530
  const text = weatherSummary.replace(/\s+/g, ' ').trim();
531
+ const maxLength = 140;
481
532
 
482
- if (text.length <= 140) {
533
+ if (text.length <= maxLength) {
483
534
  return text;
484
535
  }
485
536
 
486
- return `${text.slice(0, 137)}...`;
537
+ // FIX: Do not cut the weather summary in the middle of a word
538
+ const shortened = text.slice(0, maxLength);
539
+ const lastSpaceIndex = shortened.lastIndexOf(' ');
540
+
541
+ if (lastSpaceIndex > 0) {
542
+ return `${shortened.slice(0, lastSpaceIndex)}…`;
543
+ }
544
+
545
+ return `${shortened}…`;
487
546
  },
488
547
 
489
548
  async _readState(id) {
package/lib/i18n/de.json CHANGED
@@ -167,5 +167,22 @@
167
167
  "solar_log_text_weather_supported_with_text": "Wetterbasierte Plausibilisierung ist aktiv. Aktuelle Wetterzusammenfassung: %s",
168
168
  "solar_log_text_weather_supported": "Für diese Bewertung ist eine wetterbasierte Plausibilisierung aktiv.",
169
169
  "solar_log_text_small_gain_detail": "Der aktuell geschätzte Tagesertrag liegt bei etwa %s Wh, das entspricht etwa %s kWh.",
170
- "solar_log_text_quality_level": "Die aktuelle Qualitätsstufe der Bewertung ist %s."
170
+ "solar_log_text_quality_level": "Die aktuelle Qualitätsstufe der Bewertung ist %s.",
171
+
172
+ "photovoltaic_insights_calculation_mode_daily": "Tägliche PV-Überschussanalyse",
173
+ "photovoltaic_insights_price_source_adapter_config": "Adapter-Konfiguration",
174
+ "photovoltaic_insights_calculation_note_block_2": "Der Berechnungsblock bereitet die Quelleninformationen für die Photovoltaik-Insights-Analyse vor.",
175
+ "photovoltaic_insights_summary_text_block_3": "PV-Überschuss hat die Pumpe heute %s Minuten betrieben, dabei etwa %s kWh genutzt und ungefähr %s € eingespart.",
176
+ "photovoltaic_insights_label_mode": "Modus",
177
+ "photovoltaic_insights_label_pv_surplus_active": "PV-Überschuss aktiv",
178
+ "photovoltaic_insights_label_pv_controls_pump": "PV steuert Pumpe",
179
+ "photovoltaic_insights_label_runtime_today": "Laufzeit heute",
180
+ "photovoltaic_insights_label_energy_used_today": "Genutzte Energie heute",
181
+ "photovoltaic_insights_label_savings_today": "Einsparung heute",
182
+ "photovoltaic_insights_label_starts_today": "Starts heute",
183
+ "photovoltaic_insights_label_summary": "Zusammenfassung",
184
+ "photovoltaic_insights_debug_reason_pv_runtime_active": "PV-Überschussbetrieb aktiv",
185
+ "photovoltaic_insights_debug_reason_no_pv_runtime": "Kein aktiver PV-Überschussbetrieb",
186
+ "photovoltaic_insights_debug_text_pv_runtime_active": "PV-Überschuss ist aktiv und der Photovoltaik-Helper besitzt aktuell die Pumpe.",
187
+ "photovoltaic_insights_debug_text_no_pv_runtime": "Aktuell wird keine PV-Laufzeit gezählt, weil entweder kein PV-Überschuss aktiv ist oder der Photovoltaik-Helper die Pumpe nicht besitzt."
171
188
  }
package/lib/i18n/en.json CHANGED
@@ -239,5 +239,22 @@
239
239
  "solar_log_text_weather_supported_with_text": "Weather-based plausibility is active. Current weather summary: %s",
240
240
  "solar_log_text_weather_supported": "Weather-based plausibility is active for this assessment.",
241
241
  "solar_log_text_small_gain_detail": "The currently estimated daily gain is about %s Wh, which corresponds to about %s kWh.",
242
- "solar_log_text_quality_level": "The current quality level of the assessment is %s."
242
+ "solar_log_text_quality_level": "The current quality level of the assessment is %s.",
243
+
244
+ "photovoltaic_insights_calculation_mode_daily": "Daily PV surplus analysis",
245
+ "photovoltaic_insights_price_source_adapter_config": "Adapter configuration",
246
+ "photovoltaic_insights_calculation_note_block_2": "The calculation block prepares the source information for the photovoltaic insights analysis.",
247
+ "photovoltaic_insights_summary_text_block_3": "PV ran today for %s minutes, used %s kWh and saved approximately %s €.",
248
+ "photovoltaic_insights_label_mode": "Mode",
249
+ "photovoltaic_insights_label_pv_surplus_active": "PV surplus active",
250
+ "photovoltaic_insights_label_pv_controls_pump": "PV controls pump",
251
+ "photovoltaic_insights_label_runtime_today": "Runtime today",
252
+ "photovoltaic_insights_label_energy_used_today": "Energy used today",
253
+ "photovoltaic_insights_label_savings_today": "Savings today",
254
+ "photovoltaic_insights_label_starts_today": "Starts today",
255
+ "photovoltaic_insights_label_summary": "Summary",
256
+ "photovoltaic_insights_debug_reason_pv_runtime_active": "PV surplus operation active",
257
+ "photovoltaic_insights_debug_reason_no_pv_runtime": "No active PV surplus operation",
258
+ "photovoltaic_insights_debug_text_pv_runtime_active": "PV surplus is active and the photovoltaic helper currently owns the pump.",
259
+ "photovoltaic_insights_debug_text_no_pv_runtime": "No PV runtime is currently counted because either no PV surplus is active or the photovoltaic helper does not own the pump."
243
260
  }
package/lib/i18n/es.json CHANGED
@@ -239,5 +239,21 @@
239
239
  "solar_log_text_weather_supported_with_text": "La plausibilidad basada en el clima está activa. Resumen meteorológico actual: %s",
240
240
  "solar_log_text_weather_supported": "La plausibilidad basada en el clima está activa para esta evaluación.",
241
241
  "solar_log_text_small_gain_detail": "La ganancia diaria estimada actualmente es de aproximadamente %s Wh, lo que corresponde a unos %s kWh.",
242
- "solar_log_text_quality_level": "El nivel de calidad actual de la evaluación es %s."
243
- }
242
+ "solar_log_text_quality_level": "El nivel de calidad actual de la evaluación es %s.",
243
+ "photovoltaic_insights_calculation_mode_daily": "Análisis diario de excedente fotovoltaico",
244
+ "photovoltaic_insights_price_source_adapter_config": "Configuración del adaptador",
245
+ "photovoltaic_insights_calculation_note_block_2": "El bloque de cálculo prepara la información de origen para el análisis de información fotovoltaica.",
246
+ "photovoltaic_insights_summary_text_block_3": "El excedente fotovoltaico hizo funcionar la bomba durante %s minutos hoy, utilizó aproximadamente %s kWh y ahorró alrededor de %s €.",
247
+ "photovoltaic_insights_label_mode": "Modo",
248
+ "photovoltaic_insights_label_pv_surplus_active": "Excedente FV activo",
249
+ "photovoltaic_insights_label_pv_controls_pump": "FV controla la bomba",
250
+ "photovoltaic_insights_label_runtime_today": "Tiempo de funcionamiento hoy",
251
+ "photovoltaic_insights_label_energy_used_today": "Energía utilizada hoy",
252
+ "photovoltaic_insights_label_savings_today": "Ahorro hoy",
253
+ "photovoltaic_insights_label_starts_today": "Arranques hoy",
254
+ "photovoltaic_insights_label_summary": "Resumen",
255
+ "photovoltaic_insights_debug_reason_pv_runtime_active": "Operación con excedente FV activa",
256
+ "photovoltaic_insights_debug_reason_no_pv_runtime": "Sin operación activa con excedente FV",
257
+ "photovoltaic_insights_debug_text_pv_runtime_active": "El excedente FV está activo y el helper fotovoltaico posee actualmente la bomba.",
258
+ "photovoltaic_insights_debug_text_no_pv_runtime": "Actualmente no se cuenta ningún tiempo de funcionamiento FV porque no hay excedente FV activo o el helper fotovoltaico no posee la bomba."
259
+ }
package/lib/i18n/fr.json CHANGED
@@ -239,5 +239,21 @@
239
239
  "solar_log_text_weather_supported_with_text": "La plausibilité basée sur la météo est active. Résumé météo actuel : %s",
240
240
  "solar_log_text_weather_supported": "Une plausibilité basée sur la météo est active pour cette évaluation.",
241
241
  "solar_log_text_small_gain_detail": "Le gain journalier actuellement estimé est d’environ %s Wh, ce qui correspond à environ %s kWh.",
242
- "solar_log_text_quality_level": "Le niveau de qualité actuel de l’évaluation est %s."
243
- }
242
+ "solar_log_text_quality_level": "Le niveau de qualité actuel de l’évaluation est %s.",
243
+ "photovoltaic_insights_calculation_mode_daily": "Analyse quotidienne du surplus photovoltaïque",
244
+ "photovoltaic_insights_price_source_adapter_config": "Configuration de l’adaptateur",
245
+ "photovoltaic_insights_calculation_note_block_2": "Le bloc de calcul prépare les informations sources pour l’analyse des insights photovoltaïques.",
246
+ "photovoltaic_insights_summary_text_block_3": "Le surplus photovoltaïque a fait fonctionner la pompe pendant %s minutes aujourd’hui, a utilisé environ %s kWh et a économisé approximativement %s €.",
247
+ "photovoltaic_insights_label_mode": "Mode",
248
+ "photovoltaic_insights_label_pv_surplus_active": "Surplus PV actif",
249
+ "photovoltaic_insights_label_pv_controls_pump": "Le PV contrôle la pompe",
250
+ "photovoltaic_insights_label_runtime_today": "Temps de fonctionnement aujourd’hui",
251
+ "photovoltaic_insights_label_energy_used_today": "Énergie utilisée aujourd’hui",
252
+ "photovoltaic_insights_label_savings_today": "Économies aujourd’hui",
253
+ "photovoltaic_insights_label_starts_today": "Démarrages aujourd’hui",
254
+ "photovoltaic_insights_label_summary": "Résumé",
255
+ "photovoltaic_insights_debug_reason_pv_runtime_active": "Fonctionnement sur surplus PV actif",
256
+ "photovoltaic_insights_debug_reason_no_pv_runtime": "Aucun fonctionnement actif sur surplus PV",
257
+ "photovoltaic_insights_debug_text_pv_runtime_active": "Le surplus PV est actif et le helper photovoltaïque possède actuellement la pompe.",
258
+ "photovoltaic_insights_debug_text_no_pv_runtime": "Aucun temps de fonctionnement PV n’est actuellement comptabilisé, car aucun surplus PV n’est actif ou le helper photovoltaïque ne possède pas la pompe."
259
+ }
package/lib/i18n/it.json CHANGED
@@ -239,5 +239,21 @@
239
239
  "solar_log_text_weather_supported_with_text": "La plausibilità basata sul meteo è attiva. Riepilogo meteo attuale: %s",
240
240
  "solar_log_text_weather_supported": "La plausibilità basata sul meteo è attiva per questa valutazione.",
241
241
  "solar_log_text_small_gain_detail": "Il guadagno giornaliero attualmente stimato è di circa %s Wh, che corrisponde a circa %s kWh.",
242
- "solar_log_text_quality_level": "Il livello di qualità attuale della valutazione è %s."
243
- }
242
+ "solar_log_text_quality_level": "Il livello di qualità attuale della valutazione è %s.",
243
+ "photovoltaic_insights_calculation_mode_daily": "Analisi giornaliera del surplus FV",
244
+ "photovoltaic_insights_price_source_adapter_config": "Configurazione dell'adattatore",
245
+ "photovoltaic_insights_calculation_note_block_2": "Il blocco di calcolo prepara le informazioni di origine per l'analisi degli insight fotovoltaici.",
246
+ "photovoltaic_insights_summary_text_block_3": "Il surplus fotovoltaico ha fatto funzionare la pompa per %s minuti oggi, ha utilizzato circa %s kWh e ha risparmiato circa %s €.",
247
+ "photovoltaic_insights_label_mode": "Modalità",
248
+ "photovoltaic_insights_label_pv_surplus_active": "Surplus FV attivo",
249
+ "photovoltaic_insights_label_pv_controls_pump": "Il FV controlla la pompa",
250
+ "photovoltaic_insights_label_runtime_today": "Tempo di funzionamento oggi",
251
+ "photovoltaic_insights_label_energy_used_today": "Energia usata oggi",
252
+ "photovoltaic_insights_label_savings_today": "Risparmio oggi",
253
+ "photovoltaic_insights_label_starts_today": "Avvii oggi",
254
+ "photovoltaic_insights_label_summary": "Riepilogo",
255
+ "photovoltaic_insights_debug_reason_pv_runtime_active": "Funzionamento con surplus FV attivo",
256
+ "photovoltaic_insights_debug_reason_no_pv_runtime": "Nessun funzionamento attivo con surplus FV",
257
+ "photovoltaic_insights_debug_text_pv_runtime_active": "Il surplus FV è attivo e l'helper fotovoltaico possiede attualmente la pompa.",
258
+ "photovoltaic_insights_debug_text_no_pv_runtime": "Attualmente non viene conteggiato alcun tempo di funzionamento FV perché non c'è surplus FV attivo oppure l'helper fotovoltaico non possiede la pompa."
259
+ }
package/lib/i18n/nl.json CHANGED
@@ -239,5 +239,21 @@
239
239
  "solar_log_text_weather_supported_with_text": "Weer-gebaseerde plausibiliteit is actief. Huidige weerssamenvatting: %s",
240
240
  "solar_log_text_weather_supported": "Voor deze beoordeling is weer-gebaseerde plausibiliteit actief.",
241
241
  "solar_log_text_small_gain_detail": "De momenteel geschatte dagopbrengst ligt rond %s Wh, wat overeenkomt met ongeveer %s kWh.",
242
- "solar_log_text_quality_level": "Het huidige kwaliteitsniveau van de beoordeling is %s."
243
- }
242
+ "solar_log_text_quality_level": "Het huidige kwaliteitsniveau van de beoordeling is %s.",
243
+ "photovoltaic_insights_calculation_mode_daily": "Dagelijkse analyse van PV-overschot",
244
+ "photovoltaic_insights_price_source_adapter_config": "Adapterconfiguratie",
245
+ "photovoltaic_insights_calculation_note_block_2": "Het berekeningsblok bereidt de broninformatie voor de PV-inzichtenanalyse voor.",
246
+ "photovoltaic_insights_summary_text_block_3": "PV-overschot heeft de pomp vandaag %s minuten laten draaien, ongeveer %s kWh gebruikt en circa %s € bespaard.",
247
+ "photovoltaic_insights_label_mode": "Modus",
248
+ "photovoltaic_insights_label_pv_surplus_active": "PV-overschot actief",
249
+ "photovoltaic_insights_label_pv_controls_pump": "PV stuurt de pomp",
250
+ "photovoltaic_insights_label_runtime_today": "Looptijd vandaag",
251
+ "photovoltaic_insights_label_energy_used_today": "Gebruikte energie vandaag",
252
+ "photovoltaic_insights_label_savings_today": "Besparing vandaag",
253
+ "photovoltaic_insights_label_starts_today": "Starts vandaag",
254
+ "photovoltaic_insights_label_summary": "Samenvatting",
255
+ "photovoltaic_insights_debug_reason_pv_runtime_active": "PV-overschotbedrijf actief",
256
+ "photovoltaic_insights_debug_reason_no_pv_runtime": "Geen actief PV-overschotbedrijf",
257
+ "photovoltaic_insights_debug_text_pv_runtime_active": "PV-overschot is actief en de photovoltaic helper bezit momenteel de pomp.",
258
+ "photovoltaic_insights_debug_text_no_pv_runtime": "Er wordt momenteel geen PV-looptijd geteld omdat er geen PV-overschot actief is of omdat de photovoltaic helper de pomp niet bezit."
259
+ }
package/lib/i18n/pl.json CHANGED
@@ -239,5 +239,21 @@
239
239
  "solar_log_text_weather_supported_with_text": "Uwzględnienie warunków pogodowych jest aktywne. Aktualne podsumowanie pogody: %s",
240
240
  "solar_log_text_weather_supported": "Uwzględnienie warunków pogodowych jest aktywne dla tej oceny.",
241
241
  "solar_log_text_small_gain_detail": "Aktualnie szacowany dzienny uzysk wynosi około %s Wh, co odpowiada około %s kWh.",
242
- "solar_log_text_quality_level": "Aktualny poziom jakości oceny to %s."
243
- }
242
+ "solar_log_text_quality_level": "Aktualny poziom jakości oceny to %s.",
243
+ "photovoltaic_insights_calculation_mode_daily": "Dzienna analiza nadwyżki PV",
244
+ "photovoltaic_insights_price_source_adapter_config": "Konfiguracja adaptera",
245
+ "photovoltaic_insights_calculation_note_block_2": "Blok obliczeniowy przygotowuje informacje źródłowe do analizy danych fotowoltaicznych.",
246
+ "photovoltaic_insights_summary_text_block_3": "Nadwyżka PV zasilała dziś pompę przez %s minut, wykorzystała około %s kWh i zaoszczędziła około %s €.",
247
+ "photovoltaic_insights_label_mode": "Tryb",
248
+ "photovoltaic_insights_label_pv_surplus_active": "Nadwyżka PV aktywna",
249
+ "photovoltaic_insights_label_pv_controls_pump": "PV steruje pompą",
250
+ "photovoltaic_insights_label_runtime_today": "Czas pracy dzisiaj",
251
+ "photovoltaic_insights_label_energy_used_today": "Energia użyta dzisiaj",
252
+ "photovoltaic_insights_label_savings_today": "Oszczędności dzisiaj",
253
+ "photovoltaic_insights_label_starts_today": "Starty dzisiaj",
254
+ "photovoltaic_insights_label_summary": "Podsumowanie",
255
+ "photovoltaic_insights_debug_reason_pv_runtime_active": "Praca z nadwyżki PV aktywna",
256
+ "photovoltaic_insights_debug_reason_no_pv_runtime": "Brak aktywnej pracy z nadwyżki PV",
257
+ "photovoltaic_insights_debug_text_pv_runtime_active": "Nadwyżka PV jest aktywna, a helper fotowoltaiczny aktualnie posiada pompę.",
258
+ "photovoltaic_insights_debug_text_no_pv_runtime": "Obecnie nie jest zliczany czas pracy PV, ponieważ nie ma aktywnej nadwyżki PV albo helper fotowoltaiczny nie posiada pompy."
259
+ }
package/lib/i18n/pt.json CHANGED
@@ -239,5 +239,21 @@
239
239
  "solar_log_text_weather_supported_with_text": "A plausibilidade baseada no clima está ativa. Resumo meteorológico atual: %s",
240
240
  "solar_log_text_weather_supported": "A plausibilidade baseada no clima está ativa para esta avaliação.",
241
241
  "solar_log_text_small_gain_detail": "O ganho diário atualmente estimado é de cerca de %s Wh, o que corresponde a cerca de %s kWh.",
242
- "solar_log_text_quality_level": "O nível atual de qualidade da avaliação é %s."
243
- }
242
+ "solar_log_text_quality_level": "O nível atual de qualidade da avaliação é %s.",
243
+ "photovoltaic_insights_calculation_mode_daily": "Análise diária do excedente fotovoltaico",
244
+ "photovoltaic_insights_price_source_adapter_config": "Configuração do adaptador",
245
+ "photovoltaic_insights_calculation_note_block_2": "O bloco de cálculo prepara as informações de origem para a análise de insights fotovoltaicos.",
246
+ "photovoltaic_insights_summary_text_block_3": "O excedente fotovoltaico operou a bomba por %s minutos hoje, usou cerca de %s kWh e economizou aproximadamente %s €.",
247
+ "photovoltaic_insights_label_mode": "Modo",
248
+ "photovoltaic_insights_label_pv_surplus_active": "Excedente FV ativo",
249
+ "photovoltaic_insights_label_pv_controls_pump": "FV controla a bomba",
250
+ "photovoltaic_insights_label_runtime_today": "Tempo de funcionamento hoje",
251
+ "photovoltaic_insights_label_energy_used_today": "Energia usada hoje",
252
+ "photovoltaic_insights_label_savings_today": "Economia hoje",
253
+ "photovoltaic_insights_label_starts_today": "Partidas hoje",
254
+ "photovoltaic_insights_label_summary": "Resumo",
255
+ "photovoltaic_insights_debug_reason_pv_runtime_active": "Operação com excedente FV ativa",
256
+ "photovoltaic_insights_debug_reason_no_pv_runtime": "Nenhuma operação ativa com excedente FV",
257
+ "photovoltaic_insights_debug_text_pv_runtime_active": "O excedente FV está ativo e o helper fotovoltaico possui atualmente a bomba.",
258
+ "photovoltaic_insights_debug_text_no_pv_runtime": "Atualmente nenhum tempo de funcionamento FV é contado porque não há excedente FV ativo ou o helper fotovoltaico não possui a bomba."
259
+ }
package/lib/i18n/ru.json CHANGED
@@ -239,5 +239,21 @@
239
239
  "solar_log_text_weather_supported_with_text": "Учет погодных условий активен. Текущая сводка погоды: %s",
240
240
  "solar_log_text_weather_supported": "Для этой оценки активен учет погодных условий.",
241
241
  "solar_log_text_small_gain_detail": "Текущий оценочный суточный прирост составляет около %s Wh, что соответствует примерно %s кВт·ч.",
242
- "solar_log_text_quality_level": "Текущий уровень качества оценки — %s."
243
- }
242
+ "solar_log_text_quality_level": "Текущий уровень качества оценки — %s.",
243
+ "photovoltaic_insights_calculation_mode_daily": "Ежедневный анализ излишков PV",
244
+ "photovoltaic_insights_price_source_adapter_config": "Конфигурация адаптера",
245
+ "photovoltaic_insights_calculation_note_block_2": "Блок расчета подготавливает исходную информацию для анализа данных фотоэлектрической системы.",
246
+ "photovoltaic_insights_summary_text_block_3": "Излишки PV сегодня обеспечивали работу насоса в течение %s минут, использовали около %s кВт·ч и сэкономили приблизительно %s €.",
247
+ "photovoltaic_insights_label_mode": "Режим",
248
+ "photovoltaic_insights_label_pv_surplus_active": "Излишек PV активен",
249
+ "photovoltaic_insights_label_pv_controls_pump": "PV управляет насосом",
250
+ "photovoltaic_insights_label_runtime_today": "Время работы сегодня",
251
+ "photovoltaic_insights_label_energy_used_today": "Использованная энергия сегодня",
252
+ "photovoltaic_insights_label_savings_today": "Экономия сегодня",
253
+ "photovoltaic_insights_label_starts_today": "Запуски сегодня",
254
+ "photovoltaic_insights_label_summary": "Сводка",
255
+ "photovoltaic_insights_debug_reason_pv_runtime_active": "Работа от излишка PV активна",
256
+ "photovoltaic_insights_debug_reason_no_pv_runtime": "Нет активной работы от излишка PV",
257
+ "photovoltaic_insights_debug_text_pv_runtime_active": "Излишек PV активен, и photovoltaic helper сейчас владеет насосом.",
258
+ "photovoltaic_insights_debug_text_no_pv_runtime": "Время работы PV сейчас не учитывается, потому что либо нет активного излишка PV, либо photovoltaic helper не владеет насосом."
259
+ }
package/lib/i18n/uk.json CHANGED
@@ -239,5 +239,21 @@
239
239
  "solar_log_text_weather_supported_with_text": "Погодна перевірка достовірності активна. Поточний опис погоди: %s",
240
240
  "solar_log_text_weather_supported": "Для цієї оцінки активна погодна перевірка достовірності.",
241
241
  "solar_log_text_small_gain_detail": "Поточний оцінений добовий приріст становить приблизно %s Wh, що відповідає приблизно %s кВт·год.",
242
- "solar_log_text_quality_level": "Поточний рівень якості оцінки — %s."
243
- }
242
+ "solar_log_text_quality_level": "Поточний рівень якості оцінки — %s.",
243
+ "photovoltaic_insights_calculation_mode_daily": "Щоденний аналіз надлишку PV",
244
+ "photovoltaic_insights_price_source_adapter_config": "Конфігурація адаптера",
245
+ "photovoltaic_insights_calculation_note_block_2": "Блок розрахунку готує вихідну інформацію для аналізу даних фотоелектричної системи.",
246
+ "photovoltaic_insights_summary_text_block_3": "Надлишок PV сьогодні забезпечував роботу насоса протягом %s хвилин, використав близько %s кВт·год і заощадив приблизно %s €.",
247
+ "photovoltaic_insights_label_mode": "Режим",
248
+ "photovoltaic_insights_label_pv_surplus_active": "Надлишок PV активний",
249
+ "photovoltaic_insights_label_pv_controls_pump": "PV керує насосом",
250
+ "photovoltaic_insights_label_runtime_today": "Час роботи сьогодні",
251
+ "photovoltaic_insights_label_energy_used_today": "Використана енергія сьогодні",
252
+ "photovoltaic_insights_label_savings_today": "Економія сьогодні",
253
+ "photovoltaic_insights_label_starts_today": "Запуски сьогодні",
254
+ "photovoltaic_insights_label_summary": "Підсумок",
255
+ "photovoltaic_insights_debug_reason_pv_runtime_active": "Робота від надлишку PV активна",
256
+ "photovoltaic_insights_debug_reason_no_pv_runtime": "Немає активної роботи від надлишку PV",
257
+ "photovoltaic_insights_debug_text_pv_runtime_active": "Надлишок PV активний, і photovoltaic helper наразі володіє насосом.",
258
+ "photovoltaic_insights_debug_text_no_pv_runtime": "Наразі час роботи PV не підраховується, оскільки або немає активного надлишку PV, або photovoltaic helper не володіє насосом."
259
+ }
@@ -239,5 +239,21 @@
239
239
  "solar_log_text_weather_supported_with_text": "已启用基于天气的合理性校验。当前天气概况:%s",
240
240
  "solar_log_text_weather_supported": "此评估已启用基于天气的合理性校验。",
241
241
  "solar_log_text_small_gain_detail": "当前估算当日增益约为 %s Wh,约等于 %s kWh。",
242
- "solar_log_text_quality_level": "当前评估质量等级为 %s。"
243
- }
242
+ "solar_log_text_quality_level": "当前评估质量等级为 %s。",
243
+ "photovoltaic_insights_calculation_mode_daily": "每日光伏余电分析",
244
+ "photovoltaic_insights_price_source_adapter_config": "适配器配置",
245
+ "photovoltaic_insights_calculation_note_block_2": "计算块为光伏洞察分析准备源信息。",
246
+ "photovoltaic_insights_summary_text_block_3": "光伏余电今天使泵运行了 %s 分钟,使用约 %s kWh,并节省约 %s €。",
247
+ "photovoltaic_insights_label_mode": "模式",
248
+ "photovoltaic_insights_label_pv_surplus_active": "光伏余电已激活",
249
+ "photovoltaic_insights_label_pv_controls_pump": "光伏控制泵",
250
+ "photovoltaic_insights_label_runtime_today": "今天运行时间",
251
+ "photovoltaic_insights_label_energy_used_today": "今天使用的能源",
252
+ "photovoltaic_insights_label_savings_today": "今天节省",
253
+ "photovoltaic_insights_label_starts_today": "今天启动次数",
254
+ "photovoltaic_insights_label_summary": "摘要",
255
+ "photovoltaic_insights_debug_reason_pv_runtime_active": "光伏余电运行已激活",
256
+ "photovoltaic_insights_debug_reason_no_pv_runtime": "没有活跃的光伏余电运行",
257
+ "photovoltaic_insights_debug_text_pv_runtime_active": "光伏余电处于激活状态,并且 photovoltaic helper 当前拥有泵。",
258
+ "photovoltaic_insights_debug_text_no_pv_runtime": "当前未统计光伏运行时间,因为没有活跃的光伏余电,或者 photovoltaic helper 未拥有泵。"
259
+ }