iobroker.poolcontrol 1.2.0 → 1.2.1

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 (66) hide show
  1. package/README.md +285 -292
  2. package/admin/i18n/de/translations.json +158 -4
  3. package/admin/i18n/en/translations.json +161 -3
  4. package/admin/i18n/es/translations.json +158 -4
  5. package/admin/i18n/fr/translations.json +158 -4
  6. package/admin/i18n/it/translations.json +158 -4
  7. package/admin/i18n/nl/translations.json +158 -4
  8. package/admin/i18n/pl/translations.json +158 -4
  9. package/admin/i18n/pt/translations.json +158 -4
  10. package/admin/i18n/ru/translations.json +158 -4
  11. package/admin/i18n/uk/translations.json +158 -4
  12. package/admin/i18n/zh-cn/translations.json +158 -4
  13. package/admin/jsonConfig.json +180 -602
  14. package/io-package.json +107 -100
  15. package/lib/helpers/actuatorsHelper.js +6 -8
  16. package/lib/helpers/aiChemistryHelpHelper.js +7 -7
  17. package/lib/helpers/aiForecastHelper.js +21 -21
  18. package/lib/helpers/aiHelper.js +53 -63
  19. package/lib/helpers/consumptionHelper.js +23 -25
  20. package/lib/helpers/controlHelper.js +24 -24
  21. package/lib/helpers/controlHelper2.js +17 -17
  22. package/lib/helpers/debugLogHelper.js +12 -14
  23. package/lib/helpers/frostHelper.js +6 -6
  24. package/lib/helpers/heatHelper.js +14 -14
  25. package/lib/helpers/infoHelper.js +2 -2
  26. package/lib/helpers/migrationHelper.js +16 -16
  27. package/lib/helpers/photovoltaicHelper.js +28 -28
  28. package/lib/helpers/pumpHelper.js +16 -18
  29. package/lib/helpers/pumpHelper2.js +8 -10
  30. package/lib/helpers/pumpHelper3.js +9 -9
  31. package/lib/helpers/pumpHelper4.js +9 -9
  32. package/lib/helpers/pumpSpeedHelper.js +6 -6
  33. package/lib/helpers/runtimeHelper.js +14 -14
  34. package/lib/helpers/solarHelper.js +9 -9
  35. package/lib/helpers/speechHelper.js +13 -15
  36. package/lib/helpers/speechTextHelper.js +13 -13
  37. package/lib/helpers/statisticsHelper.js +9 -9
  38. package/lib/helpers/statisticsHelperMonth.js +15 -15
  39. package/lib/helpers/statisticsHelperWeek.js +11 -11
  40. package/lib/helpers/statusHelper.js +9 -9
  41. package/lib/helpers/temperatureHelper.js +9 -11
  42. package/lib/helpers/timeHelper.js +7 -9
  43. package/lib/stateDefinitions/actuatorsStates.js +19 -19
  44. package/lib/stateDefinitions/aiChemistryHelpStates.js +59 -28
  45. package/lib/stateDefinitions/aiStates.js +119 -31
  46. package/lib/stateDefinitions/consumptionStates.js +20 -14
  47. package/lib/stateDefinitions/controlStates.js +90 -37
  48. package/lib/stateDefinitions/debugLogStates.js +28 -13
  49. package/lib/stateDefinitions/generalStates.js +4 -4
  50. package/lib/stateDefinitions/heatStates.js +21 -21
  51. package/lib/stateDefinitions/infoStates.js +11 -5
  52. package/lib/stateDefinitions/photovoltaicStates.js +52 -24
  53. package/lib/stateDefinitions/pumpSpeedStates.js +11 -11
  54. package/lib/stateDefinitions/pumpStates.js +24 -15
  55. package/lib/stateDefinitions/pumpStates2.js +22 -10
  56. package/lib/stateDefinitions/pumpStates3.js +63 -24
  57. package/lib/stateDefinitions/pumpStates4.js +62 -32
  58. package/lib/stateDefinitions/runtimeStates.js +10 -10
  59. package/lib/stateDefinitions/solarStates.js +9 -9
  60. package/lib/stateDefinitions/speechStates.js +24 -21
  61. package/lib/stateDefinitions/statisticsStates.js +107 -29
  62. package/lib/stateDefinitions/statusStates.js +14 -12
  63. package/lib/stateDefinitions/temperatureStates.js +18 -12
  64. package/lib/stateDefinitions/timeStates.js +5 -5
  65. package/main.js +38 -0
  66. package/package.json +7 -8
@@ -44,14 +44,14 @@ const pumpHelper3 = {
44
44
  */
45
45
  async init(adapter) {
46
46
  this.adapter = adapter;
47
- this.adapter.log.info('[pumpHelper3] Initialisierung gestartet');
47
+ this.adapter.log.info('[pumpHelper3] Initialization started');
48
48
 
49
49
  // Relevante States überwachen
50
50
  this.adapter.subscribeStates('pump.pump_switch');
51
51
  this.adapter.subscribeStates('pump.live.current_power_w');
52
52
  this.adapter.subscribeStates('pump.live.flow_current_lh');
53
53
 
54
- this.adapter.log.info('[pumpHelper3] Erfolgreich initialisiert');
54
+ this.adapter.log.info('[pumpHelper3] Successfully initialized');
55
55
  },
56
56
 
57
57
  /**
@@ -72,7 +72,7 @@ const pumpHelper3 = {
72
72
  // Pumpe startet → neue Sitzung
73
73
  this.currentSessionValues.power = [];
74
74
  this.currentSessionValues.flow = [];
75
- this.adapter.log.debug('[pumpHelper3] Neue Lern-Session gestartet');
75
+ this.adapter.log.debug('[pumpHelper3] New learning session started');
76
76
  } else {
77
77
  // Pumpe stoppt → Lernwerte aktualisieren
78
78
  await this._finalizeLearningCycle();
@@ -93,7 +93,7 @@ const pumpHelper3 = {
93
93
  // Bei jeder Änderung der Livewerte aktuelle Abweichung bewerten
94
94
  await this._updateDeviationAndStatus();
95
95
  } catch (err) {
96
- this.adapter.log.warn(`[pumpHelper3] Fehler bei handleStateChange: ${err.message}`);
96
+ this.adapter.log.warn(`[pumpHelper3] Error in handleStateChange: ${err.message}`);
97
97
  }
98
98
  },
99
99
 
@@ -120,7 +120,7 @@ const pumpHelper3 = {
120
120
  try {
121
121
  const { power, flow } = this.currentSessionValues;
122
122
  if (power.length === 0 || flow.length === 0) {
123
- this.adapter.log.debug('[pumpHelper3] Keine Werte zum Lernen vorhanden, Zyklus übersprungen');
123
+ this.adapter.log.debug('[pumpHelper3] No values available for learning, cycle skipped');
124
124
  return;
125
125
  }
126
126
 
@@ -162,14 +162,14 @@ const pumpHelper3 = {
162
162
  await this.adapter.setStateAsync('pump.learning.learning_cycles_total', { val: newCycles, ack: true });
163
163
 
164
164
  this.adapter.log.debug(
165
- `[pumpHelper3] Lernzyklus #${newCycles} abgeschlossen (Power Ø${avgPower}W, Flow Ø${avgFlow}l/h)`,
165
+ `[pumpHelper3] Learning cycle #${newCycles} completed (Power avg ${avgPower}W, Flow avg ${avgFlow}l/h)`,
166
166
  );
167
167
 
168
168
  // Speicher leeren
169
169
  this.currentSessionValues.power = [];
170
170
  this.currentSessionValues.flow = [];
171
171
  } catch (err) {
172
- this.adapter.log.warn(`[pumpHelper3] Fehler bei _finalizeLearningCycle: ${err.message}`);
172
+ this.adapter.log.warn(`[pumpHelper3] Error in _finalizeLearningCycle: ${err.message}`);
173
173
  }
174
174
  },
175
175
 
@@ -227,7 +227,7 @@ const pumpHelper3 = {
227
227
  });
228
228
  }
229
229
  } catch (err) {
230
- this.adapter.log.warn(`[pumpHelper3] Fehler bei _updateDeviationAndStatus: ${err.message}`);
230
+ this.adapter.log.warn(`[pumpHelper3] Error in _updateDeviationAndStatus: ${err.message}`);
231
231
  }
232
232
  },
233
233
 
@@ -287,7 +287,7 @@ const pumpHelper3 = {
287
287
  */
288
288
  cleanup() {
289
289
  this.currentSessionValues = { power: [], flow: [] };
290
- this.adapter?.log.debug('[pumpHelper3] Cleanup ausgeführt.');
290
+ this.adapter?.log.debug('[pumpHelper3] Cleanup executed.');
291
291
  },
292
292
  };
293
293
 
@@ -30,17 +30,17 @@ const pumpHelper4 = {
30
30
  this.adapter = adapter;
31
31
 
32
32
  this.pressureObjectId = adapter.config.pressure_sensor_id || '';
33
- adapter.log.info(`[pumpHelper4] Initialisierung gestartet (OID: ${this.pressureObjectId || 'nicht gesetzt'})`);
33
+ adapter.log.info(`[pumpHelper4] Initialization started (OID: ${this.pressureObjectId || 'not set'})`);
34
34
 
35
35
  if (!this.pressureObjectId) {
36
- adapter.log.info('[pumpHelper4] Kein Drucksensor in der Instanzkonfiguration angegeben.');
36
+ adapter.log.info('[pumpHelper4] No pressure sensor configured in the instance settings.');
37
37
  return;
38
38
  }
39
39
 
40
40
  // Drucksensor abonnieren
41
41
  adapter.subscribeForeignStates(this.pressureObjectId);
42
42
 
43
- adapter.log.info('[pumpHelper4] Erfolgreich initialisiert');
43
+ adapter.log.info('[pumpHelper4] Successfully initialized');
44
44
 
45
45
  // Benutzerdefinierte Normaldruck-Werte einmalig laden
46
46
  this.adapter.getStateAsync('pump.pressure.normal_min_bar').then(s => {
@@ -96,13 +96,13 @@ const pumpHelper4 = {
96
96
  // ------------------------------------------
97
97
  if (id === 'poolcontrol.0.pump.pressure.normal_min_bar') {
98
98
  this.lastMin = Number(state.val) || 0.2;
99
- this.adapter.log.debug(`[pumpHelper4] Neuer Minimaldruck übernommen: ${this.lastMin} bar`);
99
+ this.adapter.log.debug(`[pumpHelper4] New minimum pressure applied: ${this.lastMin} bar`);
100
100
  return;
101
101
  }
102
102
 
103
103
  if (id === 'poolcontrol.0.pump.pressure.normal_max_bar') {
104
104
  this.lastMax = Number(state.val) || 0.8;
105
- this.adapter.log.debug(`[pumpHelper4] Neuer Maximaldruck übernommen: ${this.lastMax} bar`);
105
+ this.adapter.log.debug(`[pumpHelper4] New maximum pressure applied: ${this.lastMax} bar`);
106
106
  return;
107
107
  }
108
108
 
@@ -115,7 +115,7 @@ const pumpHelper4 = {
115
115
  const newBar = Number(state.val);
116
116
 
117
117
  if (isNaN(newBar)) {
118
- this.adapter.log.warn(`[pumpHelper4] Ungültiger Druckwert empfangen: ${state.val}`);
118
+ this.adapter.log.warn(`[pumpHelper4] Invalid pressure value received: ${state.val}`);
119
119
  return;
120
120
  }
121
121
 
@@ -298,9 +298,9 @@ const pumpHelper4 = {
298
298
  ack: true,
299
299
  });
300
300
 
301
- this.adapter.log.debug(`[pumpHelper4] Druck aktualisiert: ${newBar} bar (vorher: ${previous} bar)`);
301
+ this.adapter.log.debug(`[pumpHelper4] Pressure updated: ${newBar} bar (previous: ${previous} bar)`);
302
302
  } catch (err) {
303
- this.adapter.log.warn(`[pumpHelper4] Fehler bei handleStateChange: ${err.message}`);
303
+ this.adapter.log.warn(`[pumpHelper4] Error in handleStateChange: ${err.message}`);
304
304
  }
305
305
  },
306
306
 
@@ -355,7 +355,7 @@ const pumpHelper4 = {
355
355
  * Cleanup bei Adapter-Unload
356
356
  */
357
357
  cleanup() {
358
- this.adapter?.log.debug('[pumpHelper4] Cleanup ausgeführt.');
358
+ this.adapter?.log.debug('[pumpHelper4] Cleanup executed.');
359
359
  },
360
360
  };
361
361
 
@@ -52,7 +52,7 @@ const pumpSpeedHelper = {
52
52
  async init(adapter) {
53
53
  this.adapter = adapter;
54
54
 
55
- adapter.log.debug('[pumpSpeedHelper] Initialisierung gestartet');
55
+ adapter.log.debug('[pumpSpeedHelper] Initialization started');
56
56
 
57
57
  // ----------------------------------------------------------
58
58
  // Subscriptions (Grundregel: ohne subscribe -> wirkungslos)
@@ -73,7 +73,7 @@ const pumpSpeedHelper = {
73
73
  // Initialen Output setzen
74
74
  await this._recalculate();
75
75
 
76
- adapter.log.debug('[pumpSpeedHelper] Erfolgreich initialisiert');
76
+ adapter.log.debug('[pumpSpeedHelper] Successfully initialized');
77
77
  },
78
78
 
79
79
  /**
@@ -111,7 +111,7 @@ const pumpSpeedHelper = {
111
111
  return;
112
112
  }
113
113
  } catch (e) {
114
- this.adapter.log.warn(`[pumpSpeedHelper] Fehler in handleStateChange: ${e.message}`);
114
+ this.adapter.log.warn(`[pumpSpeedHelper] Error in handleStateChange: ${e.message}`);
115
115
  }
116
116
  },
117
117
 
@@ -126,7 +126,7 @@ const pumpSpeedHelper = {
126
126
  this.mapping.boost = await this._getPercent('pump.speed.config.percent.boost');
127
127
 
128
128
  this.adapter.log.debug(
129
- `[pumpSpeedHelper] Mapping geladen: frost=${this.mapping.frost} low=${this.mapping.low} normal=${this.mapping.normal} high=${this.mapping.high} boost=${this.mapping.boost}`,
129
+ `[pumpSpeedHelper] Mapping loaded: frost=${this.mapping.frost} low=${this.mapping.low} normal=${this.mapping.normal} high=${this.mapping.high} boost=${this.mapping.boost}`,
130
130
  );
131
131
  },
132
132
 
@@ -189,7 +189,7 @@ const pumpSpeedHelper = {
189
189
  ack: true,
190
190
  });
191
191
 
192
- this.adapter.log.debug(`[pumpSpeedHelper] Output gesetzt: state=${stateValue}, percent=${safePercent}`);
192
+ this.adapter.log.debug(`[pumpSpeedHelper] Output set: state=${stateValue}, percent=${safePercent}`);
193
193
  },
194
194
 
195
195
  /**
@@ -231,7 +231,7 @@ const pumpSpeedHelper = {
231
231
  * Cleanup bei Adapter-Unload
232
232
  */
233
233
  cleanup() {
234
- this.adapter?.log.debug('[pumpSpeedHelper] Cleanup ausgeführt.');
234
+ this.adapter?.log.debug('[pumpSpeedHelper] Cleanup executed.');
235
235
  },
236
236
  };
237
237
 
@@ -36,7 +36,7 @@ const runtimeHelper = {
36
36
  // NEU: Kurze Startverzögerung, damit ioBroker persistente States
37
37
  // vollständig aus der Datenbank laden kann (Überinstallationsschutz)
38
38
  // ------------------------------------------------------
39
- this.adapter.log.debug('[runtimeHelper] Warte 3 Sekunden, um persistente States zu laden ...');
39
+ this.adapter.log.debug('[runtimeHelper] Waiting 3 seconds to load persistent states ...');
40
40
  await new Promise(resolve => setTimeout(resolve, 3000));
41
41
 
42
42
  // Pumpenschalter überwachen
@@ -51,13 +51,13 @@ const runtimeHelper = {
51
51
  // Erst nach Restore einmal berechnen
52
52
  this._updateStates();
53
53
 
54
- this.adapter.log.debug('[runtimeHelper] initialisiert (mit Restore)');
54
+ this.adapter.log.debug('[runtimeHelper] Initialized (with restore)');
55
55
  })
56
56
  .catch(err => {
57
- this.adapter.log.warn(`[runtimeHelper] Restore fehlgeschlagen: ${err.message}`);
57
+ this.adapter.log.warn(`[runtimeHelper] Restore failed: ${err.message}`);
58
58
  this._scheduleDailyReset();
59
59
  this._updateStates();
60
- this.adapter.log.debug('[runtimeHelper] initialisiert (ohne Restore)');
60
+ this.adapter.log.debug('[runtimeHelper] Initialized (without restore)');
61
61
  });
62
62
  },
63
63
 
@@ -70,7 +70,7 @@ const runtimeHelper = {
70
70
  // FIX: Falls States leer oder neu angelegt sind, Warnhinweis ausgeben und Werte nicht überschreiben
71
71
  if (!totalRaw && !seasonRaw) {
72
72
  this.adapter.log.info(
73
- '[runtimeHelper] Keine gespeicherten Laufzeiten gefundenmöglicherweise neue oder überinstallierte Instanz. Laufzeiten starten bei 0.',
73
+ '[runtimeHelper] No saved runtimes foundpossibly a new or reinstalled instance. Runtimes start at 0.',
74
74
  );
75
75
  }
76
76
 
@@ -123,7 +123,7 @@ const runtimeHelper = {
123
123
  });
124
124
  await this.adapter.setStateAsync('status.pump_was_on_today', { val: true, ack: true });
125
125
  // ------------------------------------------------------
126
- this.adapter.log.debug('[runtimeHelper] Pumpenlaufzeit gestartet.');
126
+ this.adapter.log.debug('[runtimeHelper] Pump runtime started.');
127
127
  }
128
128
  } else {
129
129
  // FIX: Immer sauber stoppen, wenn Pumpe aus ist
@@ -153,7 +153,7 @@ const runtimeHelper = {
153
153
  const nowStr = new Date().toLocaleString();
154
154
  await this.adapter.setStateAsync('status.pump_last_stop', { val: nowStr, ack: true });
155
155
  // ------------------------------------------------------
156
- this.adapter.log.debug('[runtimeHelper] Pumpenlaufzeit gestoppt.');
156
+ this.adapter.log.debug('[runtimeHelper] Pump runtime stopped.');
157
157
  } else {
158
158
  // FIX: Falls Pumpe aus, aber kein aktiver Lauf (z. B. Neustart) → nur Timer sicher stoppen
159
159
  this._stopLiveTimer();
@@ -205,7 +205,7 @@ const runtimeHelper = {
205
205
  const liveFlowLh = (await this.adapter.getStateAsync('pump.live.flow_current_lh'))?.val || 0;
206
206
 
207
207
  if (liveFlowLh <= 0) {
208
- this.adapter.log.debug('[runtimeHelper] Kein Live-Durchflusswert vorhanden, Berechnung übersprungen');
208
+ this.adapter.log.debug('[runtimeHelper] No live flow value available, calculation skipped');
209
209
  return;
210
210
  }
211
211
 
@@ -222,15 +222,15 @@ const runtimeHelper = {
222
222
  await this.adapter.setStateAsync('circulation.daily_total', { val: dailyTotal, ack: true });
223
223
  await this.adapter.setStateAsync('circulation.daily_remaining', { val: dailyRemaining, ack: true });
224
224
  this.adapter.log.debug(
225
- `[runtimeHelper] Circulation-Werte aktualisiert (Total=${dailyTotal}, Required=${dailyRequired}, Remaining=${dailyRemaining})`,
225
+ `[runtimeHelper] Circulation values updated (Total=${dailyTotal}, Required=${dailyRequired}, Remaining=${dailyRemaining})`,
226
226
  );
227
227
  } else {
228
228
  this.adapter.log.debug(
229
- `[runtimeHelper] Keine gültigen Live-Datenbestehende Werte bleiben erhalten (Total=${oldTotal}, Required=${dailyRequired}, Remaining=${oldRemaining})`,
229
+ `[runtimeHelper] No valid live data keeping existing values (Total=${oldTotal}, Required=${dailyRequired}, Remaining=${oldRemaining})`,
230
230
  );
231
231
  }
232
232
  } catch (err) {
233
- this.adapter.log.warn(`[runtimeHelper] Fehler beim Update der States: ${err.message}`);
233
+ this.adapter.log.warn(`[runtimeHelper] Error while updating states: ${err.message}`);
234
234
  }
235
235
  },
236
236
 
@@ -307,7 +307,7 @@ const runtimeHelper = {
307
307
  // Nächsten Reset planen
308
308
  this._scheduleDailyReset();
309
309
 
310
- this.adapter.log.debug('[runtimeHelper] Tagesreset (Runtime + Circulation) ausgeführt.');
310
+ this.adapter.log.debug('[runtimeHelper] Daily reset (runtime + circulation) executed.');
311
311
  }, msUntilMidnight);
312
312
  },
313
313
 
@@ -316,14 +316,14 @@ const runtimeHelper = {
316
316
  clearInterval(this.liveTimer);
317
317
  }
318
318
  this.liveTimer = setInterval(() => this._updateStates(), 10 * 1000);
319
- this.adapter.log.debug('[runtimeHelper] Live-Timer gestartet (Updates alle 10 Sekunden)');
319
+ this.adapter.log.debug('[runtimeHelper] Live timer started (updates every 10 seconds)');
320
320
  },
321
321
 
322
322
  _stopLiveTimer() {
323
323
  if (this.liveTimer) {
324
324
  clearInterval(this.liveTimer);
325
325
  this.liveTimer = null;
326
- this.adapter.log.debug('[runtimeHelper] Live-Timer gestoppt');
326
+ this.adapter.log.debug('[runtimeHelper] Live timer stopped');
327
327
  }
328
328
  },
329
329
 
@@ -18,7 +18,7 @@ const solarHelper = {
18
18
  // Minütlicher Check
19
19
  this._scheduleCheck();
20
20
 
21
- this.adapter.log.debug('[solarHelper] initialisiert (Prüfung alle 60s)');
21
+ this.adapter.log.debug('[solarHelper] Initialized (check every 60s)');
22
22
  },
23
23
 
24
24
  _scheduleCheck() {
@@ -35,13 +35,13 @@ const solarHelper = {
35
35
  // --- NEU: Vorrangprüfung durch ControlHelper ---
36
36
  const activeHelper = (await this.adapter.getStateAsync('pump.active_helper'))?.val || '';
37
37
  if (activeHelper === 'controlHelper') {
38
- this.adapter.log.debug('[solarHelper] Vorrang durch ControlHelper aktivSolarregelung pausiert.');
38
+ this.adapter.log.debug('[solarHelper] Priority by ControlHelper activesolar control paused.');
39
39
  return;
40
40
  }
41
41
 
42
42
  // --- NEU: Vorrangprüfung durch TimeHelper ---
43
43
  if (activeHelper === 'timeHelper') {
44
- this.adapter.log.debug('[solarHelper] Vorrang durch TimeHelper aktivSolarregelung pausiert.');
44
+ this.adapter.log.debug('[solarHelper] Priority by TimeHelper activesolar control paused.');
45
45
  return;
46
46
  }
47
47
 
@@ -64,7 +64,7 @@ const solarHelper = {
64
64
  const pool = Number((await this.adapter.getStateAsync('temperature.surface.current'))?.val); // Oberfläche = Pooltemp
65
65
 
66
66
  if (collector == null || pool == null) {
67
- this.adapter.log.debug('[solarHelper] Keine gültigen Temperaturen verfügbar');
67
+ this.adapter.log.debug('[solarHelper] No valid temperatures available');
68
68
  return;
69
69
  }
70
70
 
@@ -104,7 +104,7 @@ const solarHelper = {
104
104
  });
105
105
 
106
106
  this.adapter.log.debug(
107
- `[solarHelper] SolarregelungPumpe ${shouldRun ? 'EIN' : 'AUS'} (Collector=${collector}°C, Pool=${pool}°C, Delta=${delta}°C)`,
107
+ `[solarHelper] Solar control pump ${shouldRun ? 'ON' : 'OFF'} (Collector=${collector}°C, Pool=${pool}°C, Delta=${delta}°C)`,
108
108
  );
109
109
  } else {
110
110
  // Keine Schaltung – Grund protokollieren
@@ -115,7 +115,7 @@ const solarHelper = {
115
115
  : mode !== 'auto'
116
116
  ? 'Pumpenmodus != auto'
117
117
  : 'unbekannt';
118
- this.adapter.log.debug(`[solarHelper] Solarregelung übersprungen (${reason})`);
118
+ this.adapter.log.debug(`[solarHelper] Solar control skipped (${reason})`);
119
119
  }
120
120
 
121
121
  // --- Kollektor-Warnung ---
@@ -135,7 +135,7 @@ const solarHelper = {
135
135
  ack: true,
136
136
  });
137
137
  this.adapter.log.warn(
138
- `[solarHelper] WARNUNG: Kollektortemperatur ${collector}°C >= ${warnTemp}°C!`,
138
+ `[solarHelper] WARNING: Collector temperature ${collector}°C >= ${warnTemp}°C!`,
139
139
  );
140
140
 
141
141
  /*
@@ -158,12 +158,12 @@ const solarHelper = {
158
158
  ack: true,
159
159
  });
160
160
  this.adapter.log.debug(
161
- `[solarHelper] Kollektorwarnung zurückgesetzt: ${collector}°C <= ${warnTemp * 0.9}°C`,
161
+ `[solarHelper] Collector warning reset: ${collector}°C <= ${warnTemp * 0.9}°C`,
162
162
  );
163
163
  }
164
164
  }
165
165
  } catch (err) {
166
- this.adapter.log.warn(`[solarHelper] Fehler im Check: ${err.message}`);
166
+ this.adapter.log.warn(`[solarHelper] Error in check: ${err.message}`);
167
167
  }
168
168
  },
169
169
 
@@ -28,7 +28,7 @@ const speechHelper = {
28
28
  // 🆕 Alexa-Ruhezeit-States abonnieren
29
29
  this.adapter.subscribeStates('speech.amazon_alexa.*');
30
30
 
31
- this.adapter.log.debug('[speechHelper] initialisiert');
31
+ this.adapter.log.debug('[speechHelper] Initialized');
32
32
  },
33
33
 
34
34
  async handleStateChange(id, state) {
@@ -102,9 +102,9 @@ const speechHelper = {
102
102
  this.lastTempNotify[id] = { time: now, temp: val, date: today };
103
103
  } else {
104
104
  this.adapter.log.debug(
105
- `[speechHelper] Temperaturansage unterdrückt (tempDiff=${tempDiff.toFixed(
105
+ `[speechHelper] Temperature announcement suppressed (tempDiff=${tempDiff.toFixed(
106
106
  1,
107
- )}°C, letzter Wert=${lastInfo.temp}°C).`,
107
+ )}°C, last value=${lastInfo.temp}°C).`,
108
108
  );
109
109
  }
110
110
  }
@@ -142,12 +142,12 @@ const speechHelper = {
142
142
  await this.adapter.setStateAsync(`${prefix}quiet_time_active_now`, { val: inRange, ack: true });
143
143
 
144
144
  if (inRange) {
145
- this.adapter.log.debug('[speechHelper] Alexa-Ruhezeit aktivSprachausgabe blockiert.');
145
+ this.adapter.log.debug('[speechHelper] Alexa quiet time active speech output blocked.');
146
146
  return false;
147
147
  }
148
148
  return true;
149
149
  } catch (err) {
150
- this.adapter.log.warn(`[speechHelper] Fehler bei Alexa-Ruhezeitprüfung: ${err.message}`);
150
+ this.adapter.log.warn(`[speechHelper] Error while checking Alexa quiet time: ${err.message}`);
151
151
  return true; // im Zweifel sprechen lassen
152
152
  }
153
153
  },
@@ -183,9 +183,9 @@ const speechHelper = {
183
183
  const allowed = await this._isAlexaAllowed();
184
184
  if (allowed) {
185
185
  await this.adapter.setForeignStateAsync(this.adapter.config.speech_alexa_device, text);
186
- this.adapter.log.info(`[speechHelper] Alexa sagt: ${text}`);
186
+ this.adapter.log.info(`[speechHelper] Alexa says: ${text}`);
187
187
  } else {
188
- this.adapter.log.debug('[speechHelper] Alexa stumm (Ruhezeit aktiv).');
188
+ this.adapter.log.debug('[speechHelper] Alexa muted (quiet time active).');
189
189
  }
190
190
  }
191
191
 
@@ -205,13 +205,11 @@ const speechHelper = {
205
205
  } else {
206
206
  for (const user of users) {
207
207
  await this.adapter.sendToAsync(instance, { user, text, parse_mode: 'Markdown' });
208
- this.adapter.log.info(`[speechHelper] Telegram an ${user}: ${text}`);
208
+ this.adapter.log.info(`[speechHelper] Telegram to ${user}: ${text}`);
209
209
  }
210
210
  }
211
211
  } catch (err) {
212
- this.adapter.log.warn(
213
- `[speechHelper] Telegram-Versand fehlgeschlagen (${instance}): ${err.message}`,
214
- );
212
+ this.adapter.log.warn(`[speechHelper] Telegram send failed (${instance}): ${err.message}`);
215
213
  }
216
214
  }
217
215
 
@@ -225,20 +223,20 @@ const speechHelper = {
225
223
  text,
226
224
  });
227
225
  this.adapter.log.info(
228
- `[speechHelper] E-Mail gesendet über ${instance} an ${this.adapter.config.speech_email_recipient}: ${text}`,
226
+ `[speechHelper] Email sent via ${instance} to ${this.adapter.config.speech_email_recipient}: ${text}`,
229
227
  );
230
228
  } catch (err) {
231
- this.adapter.log.warn(`[speechHelper] E-Mail-Versand fehlgeschlagen (${instance}): ${err.message}`);
229
+ this.adapter.log.warn(`[speechHelper] Email send failed (${instance}): ${err.message}`);
232
230
  }
233
231
  }
234
232
  } catch (err) {
235
- this.adapter.log.warn(`[speechHelper] Fehler beim Sprechen: ${err.message}`);
233
+ this.adapter.log.warn(`[speechHelper] Error while speaking: ${err.message}`);
236
234
  }
237
235
  },
238
236
 
239
237
  cleanup() {
240
238
  if (this.adapter) {
241
- this.adapter.log.debug('[speechHelper] Cleanup abgeschlossen.');
239
+ this.adapter.log.debug('[speechHelper] Cleanup completed.');
242
240
  }
243
241
  },
244
242
  };
@@ -43,7 +43,7 @@ const speechTextHelper = {
43
43
  // this.adapter.subscribeStates('control.pump.backwash_active');
44
44
 
45
45
  this.adapter.log.debug(
46
- '[speechTextHelper] initialisiert (Grundstruktur aktiv, inkl. Solar-Warnung, keine weiteren Textlogiken)',
46
+ '[speechTextHelper] Initialized (basic structure active, incl. solar warning, no further text logics yet)',
47
47
  );
48
48
  },
49
49
 
@@ -63,13 +63,13 @@ const speechTextHelper = {
63
63
  // --- Pumpenstatusänderung ---
64
64
  if (id.endsWith('pump.status')) {
65
65
  const status = String(state.val || '').toLowerCase();
66
- this.adapter.log.silly(`[speechTextHelper] Pumpenstatus geändert: ${status}`);
66
+ this.adapter.log.silly(`[speechTextHelper] Pump status changed: ${status}`);
67
67
  return;
68
68
  }
69
69
 
70
70
  // --- Pumpenereignisse ---
71
71
  if (id.endsWith('pump.pump_switch') || id.endsWith('pump.mode') || id.endsWith('pump.reason')) {
72
- this.adapter.log.silly(`[speechTextHelper] Pumpen-Event erkannt: ${id} = ${state.val}`);
72
+ this.adapter.log.silly(`[speechTextHelper] Pump event detected: ${id} = ${state.val}`);
73
73
  return;
74
74
  }
75
75
 
@@ -85,12 +85,12 @@ const speechTextHelper = {
85
85
  const warnTemp = Number((await this.adapter.getStateAsync('solar.warn_temp'))?.val);
86
86
  const text = `Warnung: Kollektortemperatur ${collectorTemp} Grad erreicht (Warnschwelle ${warnTemp}°C).`;
87
87
  await this._sendSpeech(text);
88
- this.adapter.log.debug(`[speechTextHelper] Solar-Warnung gesendet: ${text}`);
88
+ this.adapter.log.debug(`[speechTextHelper] Solar warning sent: ${text}`);
89
89
  } else {
90
90
  // Warnung aufgehoben
91
91
  const text = 'Kollektorwarnung aufgehoben.';
92
92
  await this._sendSpeech(text);
93
- this.adapter.log.debug('[speechTextHelper] Solar-Warnung aufgehoben.');
93
+ this.adapter.log.debug('[speechTextHelper] Solar warning cleared.');
94
94
  }
95
95
 
96
96
  // ersetzt SolarHelper Textausgabe
@@ -115,11 +115,11 @@ const speechTextHelper = {
115
115
  if (val) {
116
116
  const text = 'Die Poolpumpe wurde durch die Solarsteuerung eingeschaltet.';
117
117
  await this._sendSpeech(text);
118
- this.adapter.log.debug('[speechTextHelper] Solarsteuerung aktiviertAnsage gesendet.');
118
+ this.adapter.log.debug('[speechTextHelper] Solar control activated announcement sent.');
119
119
  } else {
120
120
  const text = 'Solarsteuerung beendet – Poolpumpe ausgeschaltet.';
121
121
  await this._sendSpeech(text);
122
- this.adapter.log.debug('[speechTextHelper] Solarsteuerung deaktiviertAnsage gesendet.');
122
+ this.adapter.log.debug('[speechTextHelper] Solar control deactivated announcement sent.');
123
123
  }
124
124
  return;
125
125
  }
@@ -136,7 +136,7 @@ const speechTextHelper = {
136
136
  });
137
137
  const text = 'Die Poolpumpe wurde durch die Zeitsteuerung eingeschaltet.';
138
138
  await this._sendSpeech(text);
139
- this.adapter.log.debug('[speechTextHelper] Zeitsteuerung aktiviertAnsage gesendet.');
139
+ this.adapter.log.debug('[speechTextHelper] Time control activated announcement sent.');
140
140
  } else {
141
141
  await this.adapter.setStateAsync('pump.status', {
142
142
  val: 'AUS (Zeitsteuerung beendet)',
@@ -144,14 +144,14 @@ const speechTextHelper = {
144
144
  });
145
145
  const text = 'Zeitsteuerung beendet – Poolpumpe ausgeschaltet.';
146
146
  await this._sendSpeech(text);
147
- this.adapter.log.debug('[speechTextHelper] Zeitsteuerung deaktiviertAnsage gesendet.');
147
+ this.adapter.log.debug('[speechTextHelper] Time control deactivated announcement sent.');
148
148
  }
149
149
  return;
150
150
  }
151
151
 
152
152
  // Weitere Blöcke (z. B. Zeitmodus, Wartung usw.) folgen später hier
153
153
  } catch (err) {
154
- this.adapter.log.warn(`[speechTextHelper] Fehler bei handleStateChange: ${err.message}`);
154
+ this.adapter.log.warn(`[speechTextHelper] Error in handleStateChange: ${err.message}`);
155
155
  }
156
156
  },
157
157
 
@@ -166,9 +166,9 @@ const speechTextHelper = {
166
166
  }
167
167
  try {
168
168
  await this.adapter.setStateAsync('speech.queue', { val: text, ack: false });
169
- this.adapter.log.debug(`[speechTextHelper] Text gesendet: ${text}`);
169
+ this.adapter.log.debug(`[speechTextHelper] Text sent: ${text}`);
170
170
  } catch (err) {
171
- this.adapter.log.warn(`[speechTextHelper] Fehler beim Senden an speech.queue: ${err.message}`);
171
+ this.adapter.log.warn(`[speechTextHelper] Error sending to speech.queue: ${err.message}`);
172
172
  }
173
173
  },
174
174
 
@@ -177,7 +177,7 @@ const speechTextHelper = {
177
177
  */
178
178
  cleanup() {
179
179
  // Aktuell keine Ressourcen
180
- this.adapter.log.debug('[speechTextHelper] cleanup ausgeführt');
180
+ this.adapter.log.debug('[speechTextHelper] Cleanup executed');
181
181
  },
182
182
  };
183
183
 
@@ -31,7 +31,7 @@ const statisticsHelper = {
31
31
 
32
32
  async init(adapter) {
33
33
  this.adapter = adapter;
34
- adapter.log.debug('statisticsHelper: Initialisierung gestartet.');
34
+ adapter.log.debug('statisticsHelper: Initialization started.');
35
35
 
36
36
  // --- Überinstallationsschutz ---
37
37
  try {
@@ -53,16 +53,16 @@ const statisticsHelper = {
53
53
 
54
54
  if (id.includes('analytics.statistics.temperature.today.') && id.endsWith('.reset_today')) {
55
55
  const sensorId = id.split('.').slice(-2, -1)[0];
56
- adapter.log.info(`[statisticsHelper] Manueller Reset für Sensor "${sensorId}" ausgelöst.`);
56
+ adapter.log.info(`[statisticsHelper] Manual reset triggered for sensor "${sensorId}".`);
57
57
  await this._resetSingleSensor(sensorId);
58
58
  }
59
59
  });
60
60
  // 🔵 ENDE NEU
61
61
 
62
62
  await this._scheduleMidnightReset();
63
- adapter.log.debug('statisticsHelper: Initialisierung abgeschlossen (Sensorüberwachung aktiv).');
63
+ adapter.log.debug('statisticsHelper: Initialization completed (sensor monitoring active).');
64
64
  } catch (err) {
65
- adapter.log.warn(`statisticsHelper: Fehler bei Initialisierung: ${err.message}`);
65
+ adapter.log.warn(`statisticsHelper: Error during initialization: ${err.message}`);
66
66
  }
67
67
  },
68
68
 
@@ -75,7 +75,7 @@ const statisticsHelper = {
75
75
  const adapter = this.adapter;
76
76
  const resetDate = new Date().toISOString().slice(0, 19).replace('T', ' ');
77
77
  const basePath = `analytics.statistics.temperature.today.${sensorId}`;
78
- adapter.log.debug(`[statisticsHelper] Starte Einzelreset für ${sensorId}.`);
78
+ adapter.log.debug(`[statisticsHelper] Starting single reset for ${sensorId}.`);
79
79
 
80
80
  const stateList = [
81
81
  'temp_min',
@@ -111,7 +111,7 @@ const statisticsHelper = {
111
111
  });
112
112
 
113
113
  await this._updateOverallSummary();
114
- adapter.log.info(`[statisticsHelper] Einzelreset für Sensor "${sensorId}" abgeschlossen.`);
114
+ adapter.log.info(`[statisticsHelper] Single reset for sensor "${sensorId}" completed.`);
115
115
  },
116
116
  // 🔵 ENDE NEU
117
117
 
@@ -430,7 +430,7 @@ const statisticsHelper = {
430
430
  }, msUntilMidnight);
431
431
 
432
432
  adapter.log.debug(
433
- `statisticsHelper: Mitternacht-Reset geplant in ${Math.round(msUntilMidnight / 60000)} Minuten.`,
433
+ `statisticsHelper: Midnight reset scheduled in ${Math.round(msUntilMidnight / 60000)} minutes.`,
434
434
  );
435
435
  },
436
436
 
@@ -439,7 +439,7 @@ const statisticsHelper = {
439
439
  */
440
440
  async _resetDailyTemperatureStats() {
441
441
  const adapter = this.adapter;
442
- adapter.log.info('statisticsHelper: Tagesstatistik wird zurückgesetzt.');
442
+ adapter.log.info('statisticsHelper: Daily statistics are being reset.');
443
443
 
444
444
  const resetDate = new Date().toISOString().slice(0, 19).replace('T', ' ');
445
445
 
@@ -507,7 +507,7 @@ const statisticsHelper = {
507
507
  ack: true,
508
508
  });
509
509
 
510
- adapter.log.debug('statisticsHelper: Tagesstatistik zurückgesetzt.');
510
+ adapter.log.debug('statisticsHelper: Daily statistics reset completed.');
511
511
  },
512
512
 
513
513
  /**