iobroker.poolcontrol 1.3.29 → 1.3.31

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.
@@ -3,7 +3,7 @@
3
3
  const { I18n } = require('@iobroker/adapter-core');
4
4
 
5
5
  const POOL_INSIGHTS_PREFIX = 'analytics.insights.pool';
6
- const DAILY_ANALYSIS_HOUR = 20;
6
+ const DEFAULT_DAILY_ANALYSIS_TIME = '20:00';
7
7
  const SPEECH_COOLDOWN_MS = 6 * 60 * 60 * 1000;
8
8
 
9
9
  const poolInsightsHelper = {
@@ -15,6 +15,7 @@ const poolInsightsHelper = {
15
15
  this.adapter = adapter;
16
16
 
17
17
  this.adapter.subscribeStates(`${POOL_INSIGHTS_PREFIX}.enabled`);
18
+ this.adapter.subscribeStates(`${POOL_INSIGHTS_PREFIX}.schedule_time`);
18
19
  this.adapter.subscribeStates(`${POOL_INSIGHTS_PREFIX}.manual_trigger`);
19
20
  this.adapter.subscribeStates(`${POOL_INSIGHTS_PREFIX}.send_to_speech_queue`);
20
21
 
@@ -32,7 +33,7 @@ const poolInsightsHelper = {
32
33
  return;
33
34
  }
34
35
 
35
- if (id.endsWith(`${POOL_INSIGHTS_PREFIX}.enabled`)) {
36
+ if (id.endsWith(`${POOL_INSIGHTS_PREFIX}.enabled`) || id.endsWith(`${POOL_INSIGHTS_PREFIX}.schedule_time`)) {
36
37
  void this._refreshSchedule();
37
38
  }
38
39
  },
@@ -66,9 +67,11 @@ const poolInsightsHelper = {
66
67
  this.dailyTimer = null;
67
68
  }
68
69
 
70
+ const scheduleTime = await this._readString(`${POOL_INSIGHTS_PREFIX}.schedule_time`);
71
+ const { hours, minutes } = this._parseScheduleTime(scheduleTime);
69
72
  const now = new Date();
70
73
  const next = new Date(now);
71
- next.setHours(DAILY_ANALYSIS_HOUR, 0, 0, 0);
74
+ next.setHours(hours, minutes, 0, 0);
72
75
  if (next <= now) {
73
76
  next.setDate(next.getDate() + 1);
74
77
  }
@@ -84,6 +87,24 @@ const poolInsightsHelper = {
84
87
  this.adapter.log.debug(`[poolInsightsHelper] Daily analysis scheduled for ${next.toISOString()}`);
85
88
  },
86
89
 
90
+ _parseScheduleTime(value) {
91
+ const match = /^([01]\d|2[0-3]):([0-5]\d)$/.exec(value);
92
+ if (match) {
93
+ return {
94
+ hours: Number(match[1]),
95
+ minutes: Number(match[2]),
96
+ };
97
+ }
98
+
99
+ this.adapter.log.debug(
100
+ `[poolInsightsHelper] Invalid schedule_time ${value}, using fallback ${DEFAULT_DAILY_ANALYSIS_TIME}`,
101
+ );
102
+ return {
103
+ hours: 20,
104
+ minutes: 0,
105
+ };
106
+ },
107
+
87
108
  async _runAnalysis(reason, allowSpeech) {
88
109
  if (this.running) {
89
110
  this.adapter.log.debug('[poolInsightsHelper] Analysis already running - skipped');
@@ -177,11 +198,19 @@ const poolInsightsHelper = {
177
198
 
178
199
  if (tempDelta <= 0.2) {
179
200
  level = this._raiseLevel(level, 'info');
180
- recommendations.push({
181
- area: 'temperature',
182
- level: 'info',
183
- text: this._translate('pool_insights_recommendation_temperature_low_change'),
184
- });
201
+ recommendations.push(
202
+ this._createRecommendation(
203
+ 'temperature',
204
+ 'info',
205
+ 'low_temperature_change',
206
+ 0.7,
207
+ this._translate('pool_insights_recommendation_temperature_low_change'),
208
+ ['temperature.surface.min_today', 'temperature.surface.max_today'],
209
+ {
210
+ temperature_delta_c: rounded,
211
+ },
212
+ ),
213
+ );
185
214
  }
186
215
  }
187
216
 
@@ -208,11 +237,19 @@ const poolInsightsHelper = {
208
237
 
209
238
  if (snapshot.pump.startCountToday > 12) {
210
239
  level = this._raiseLevel(level, 'info');
211
- recommendations.push({
212
- area: 'pump',
213
- level: 'info',
214
- text: this._translate('pool_insights_recommendation_many_pump_starts'),
215
- });
240
+ recommendations.push(
241
+ this._createRecommendation(
242
+ 'pump',
243
+ 'info',
244
+ 'many_pump_starts',
245
+ 0.8,
246
+ this._translate('pool_insights_recommendation_many_pump_starts'),
247
+ ['runtime.start_count_today'],
248
+ {
249
+ starts_today: snapshot.pump.startCountToday,
250
+ },
251
+ ),
252
+ );
216
253
  }
217
254
  }
218
255
 
@@ -223,11 +260,19 @@ const poolInsightsHelper = {
223
260
  level: 'warning',
224
261
  text: this._translate('pool_insights_observation_pump_error'),
225
262
  });
226
- recommendations.push({
227
- area: 'pump',
228
- level: 'warning',
229
- text: this._translate('pool_insights_recommendation_pump_error'),
230
- });
263
+ recommendations.push(
264
+ this._createRecommendation(
265
+ 'pump',
266
+ 'warning',
267
+ 'pump_error_active',
268
+ 1,
269
+ this._translate('pool_insights_recommendation_pump_error'),
270
+ ['pump.error'],
271
+ {
272
+ pump_error: true,
273
+ },
274
+ ),
275
+ );
231
276
  }
232
277
 
233
278
  this._appendSolarObservations(snapshot.solar, observations);
@@ -235,11 +280,19 @@ const poolInsightsHelper = {
235
280
 
236
281
  if (snapshot.photovoltaic.startsToday !== null && snapshot.photovoltaic.startsToday > 10) {
237
282
  level = this._raiseLevel(level, 'info');
238
- recommendations.push({
239
- area: 'photovoltaic',
240
- level: 'info',
241
- text: this._translate('pool_insights_recommendation_many_pv_starts'),
242
- });
283
+ recommendations.push(
284
+ this._createRecommendation(
285
+ 'photovoltaic',
286
+ 'info',
287
+ 'many_pv_starts',
288
+ 0.8,
289
+ this._translate('pool_insights_recommendation_many_pv_starts'),
290
+ ['analytics.insights.photovoltaic.results.starts_today'],
291
+ {
292
+ pv_starts_today: snapshot.photovoltaic.startsToday,
293
+ },
294
+ ),
295
+ );
243
296
  }
244
297
 
245
298
  this._appendConsumptionObservations(snapshot.consumption, observations);
@@ -570,6 +623,60 @@ const poolInsightsHelper = {
570
623
  await this.adapter.setStateChangedAsync(id, { val, ack });
571
624
  },
572
625
 
626
+ _createRecommendation(area, level, reason, confidence, text, sourceStates = [], evidence = {}) {
627
+ return {
628
+ area: String(area || ''),
629
+ level: String(level || ''),
630
+ reason: String(reason || ''),
631
+ confidence: this._clampConfidence(confidence),
632
+ text: String(text || ''),
633
+ source_states: Array.isArray(sourceStates)
634
+ ? sourceStates.filter(value => value !== undefined).map(value => String(value))
635
+ : [],
636
+ evidence: this._cleanEvidence(evidence),
637
+ };
638
+ },
639
+
640
+ _clampConfidence(value) {
641
+ const confidence = Number(value);
642
+ if (!Number.isFinite(confidence)) {
643
+ return 0;
644
+ }
645
+ return Math.min(1, Math.max(0, confidence));
646
+ },
647
+
648
+ _cleanEvidence(evidence) {
649
+ if (!evidence || typeof evidence !== 'object' || Array.isArray(evidence)) {
650
+ return {};
651
+ }
652
+
653
+ return this._cleanObject(evidence);
654
+ },
655
+
656
+ _cleanObject(object) {
657
+ const cleaned = {};
658
+ for (const [key, value] of Object.entries(object)) {
659
+ const cleanedValue = this._cleanValue(value);
660
+ if (cleanedValue !== undefined) {
661
+ cleaned[key] = cleanedValue;
662
+ }
663
+ }
664
+ return cleaned;
665
+ },
666
+
667
+ _cleanValue(value) {
668
+ if (value === undefined) {
669
+ return undefined;
670
+ }
671
+ if (Array.isArray(value)) {
672
+ return value.map(entry => this._cleanValue(entry)).filter(entry => entry !== undefined);
673
+ }
674
+ if (value !== null && typeof value === 'object') {
675
+ return this._cleanObject(value);
676
+ }
677
+ return value;
678
+ },
679
+
573
680
  _formatRuntime(seconds) {
574
681
  const totalMinutes = Math.max(0, Math.round(seconds / 60));
575
682
  const hours = Math.floor(totalMinutes / 60);
@@ -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
  },
@@ -84,6 +84,25 @@ async function createPoolInsightsStates(adapter) {
84
84
  persist: true,
85
85
  },
86
86
  },
87
+ {
88
+ id: 'analytics.insights.pool.schedule_time',
89
+ common: {
90
+ name: {
91
+ en: 'Daily pool insights analysis time',
92
+ de: 'Uhrzeit der täglichen Pool-Insights-Analyse',
93
+ },
94
+ desc: {
95
+ en: 'Time for the daily automatic pool insights analysis in HH:mm format.',
96
+ de: 'Uhrzeit für die tägliche automatische Pool-Insights-Analyse im Format HH:mm.',
97
+ },
98
+ type: 'string',
99
+ role: 'text',
100
+ read: true,
101
+ write: true,
102
+ def: '20:00',
103
+ persist: true,
104
+ },
105
+ },
87
106
  {
88
107
  id: 'analytics.insights.pool.manual_trigger',
89
108
  common: {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "iobroker.poolcontrol",
3
- "version": "1.3.29",
3
+ "version": "1.3.31",
4
4
  "description": "Steuerung & Automatisierung für den Pool (Pumpe, Heizung, Ventile, Sensoren).",
5
5
  "author": "DasBo1975 <dasbo1975@outlook.de>",
6
6
  "homepage": "https://github.com/DasBo1975/ioBroker.poolcontrol",
@@ -24,13 +24,14 @@
24
24
  "@iobroker/adapter-core": "^3.3.2"
25
25
  },
26
26
  "devDependencies": {
27
- "@alcalzone/release-script": "^5.2.0",
27
+ "@alcalzone/release-script": "^5.2.1",
28
28
  "@alcalzone/release-script-plugin-iobroker": "^5.2.0",
29
29
  "@alcalzone/release-script-plugin-license": "^5.2.0",
30
30
  "@alcalzone/release-script-plugin-manual-review": "^5.2.0",
31
31
  "@iobroker/adapter-dev": "^1.5.0",
32
32
  "@iobroker/eslint-config": "^2.2.0",
33
33
  "@iobroker/testing": "^5.2.2",
34
+ "@tsconfig/node22": "^22.0.5",
34
35
  "@types/node": "^22.0.0",
35
36
  "baseline-browser-mapping": "^2.8.32",
36
37
  "proxyquire": "^2.1.3"
@@ -1,159 +0,0 @@
1
- {
2
- "0.5x": "0,5x",
3
- "1.0x": "1,0x",
4
- "1.5x": "1,5x",
5
- "2.0x": "2,0x",
6
- "2.5x": "2,5x",
7
- "3.0x": "3,0x",
8
- "Additional Actuators": "Zusätzliche Aktuatoren",
9
- "Additional actuators (valves, lighting & auxiliary pumps)": "Zusätzliche Aktoren (Ventile, Beleuchtung & Hilfspumpen)",
10
- "Alexa device": "Alexa-Gerät",
11
- "All text and speech outputs of the adapter – including AI forecasts, warnings, pump status, solar hints and diagnostic messages – are emitted via the central 'speech.queue' datapoint. This datapoint should be used for VIS displays, Alexa or Telegram outputs.": "Alle Text- und Sprachausgaben des Adapters – einschließlich KI-Vorhersagen, Warnungen, Pumpenstatus, Solarhinweise und Diagnosemeldungen – werden über den zentralen Datenpunkt „speech.queue“ ausgegeben. Dieser Datenpunkt sollte für VIS-Anzeigen, Alexa- oder Telegram-Ausgaben verwendet werden.",
12
- "Amazon Alexa": "Amazon Alexa",
13
- "Announce / Notify on Warning": "Bei Warnung ansagen / benachrichtigen",
14
- "Announce error messages": "Fehlermeldungen ankündigen",
15
- "Auxiliary pump 1 active": "Hilfspumpe 1 aktiv",
16
- "Auxiliary pump 2 active": "Hilfspumpe 2 aktiv",
17
- "Auxiliary pump 3 active": "Hilfspumpe 3 aktiv",
18
- "Auxiliary pumps & attractions": "Hilfspumpen und Attraktionen",
19
- "Central speech output (speech.queue)": "Zentrale Sprachausgabe (speech.queue)",
20
- "Collector Temperature Off Threshold (°C)": "Ausschaltschwelle Kollektortemperatur (°C)",
21
- "Collector Temperature On Threshold (°C)": "Einschaltschwelle Kollektortemperatur (°C)",
22
- "Collector Temperature Warning": "Kollektortemperaturwarnung",
23
- "Collector Temperature Warning Threshold (°C)": "Kollektortemperatur-Warnschwelle (°C)",
24
- "Consumption and cost calculation": "Verbrauchs- und Kostenberechnung",
25
- "Datapoint containing current PV power (Watts)": "Datenpunkt mit aktueller PV-Leistung (Watt)",
26
- "Datapoint containing current house consumption (Watts)": "Datenpunkt mit aktuellem Hausverbrauch (Watt)",
27
- "Default (female)": "Standard (weiblich)",
28
- "Difference between PV generation and house consumption that counts as surplus": "Differenz zwischen PV-Erzeugung und Hausverbrauch, die als Überschuss gilt",
29
- "Electricity price (€ / kWh)": "Strompreis (€/kWh)",
30
- "Email adapter instance": "E-Mail-Adapterinstanz",
31
- "Email subject": "E-Mail-Betreff",
32
- "Enable Alexa output": "Alexa-Ausgabe aktivieren",
33
- "Enable Collector Temperature Warning": "Kollektortemperaturwarnung aktivieren",
34
- "Enable Frost Protection": "Frostschutz aktivieren",
35
- "Enable Heating Control": "Heizungssteuerung aktivieren",
36
- "Enable Solar Control": "Solarsteuerung aktivieren",
37
- "Enable Telegram output": "Telegram-Ausgabe aktivieren",
38
- "Enable Time Window 1": "Zeitfenster 1 aktivieren",
39
- "Enable Time Window 2": "Zeitfenster 2 aktivieren",
40
- "Enable Time Window 3": "Zeitfenster 3 aktivieren",
41
- "Enable consumption and cost calculation": "Verbrauchs- und Kostenberechnung aktivieren",
42
- "Enable email output": "E-Mail-Ausgabe aktivieren",
43
- "Enable safety functions also in 'Manual' mode": "Sicherheitsfunktionen auch im Modus „Manuell“ aktivieren",
44
- "Enable speech output": "Sprachausgabe aktivieren",
45
- "End (HH:MM)": "Ende (HH:MM)",
46
- "Example: Dirk,Dennis (empty = send to all users)": "Beispiel: Dirk,Dennis (leer = an alle Benutzer senden)",
47
- "Friday": "Freitag",
48
- "Frost Protection": "Frostschutz",
49
- "Frost Protection Temperature (°C)": "Frostschutztemperatur (°C)",
50
- "General": "Allgemein",
51
- "General Pool Settings": "Allgemeine Pooleinstellungen",
52
- "General Settings": "Allgemeine Einstellungen",
53
- "Heating / Heat Pump": "Heizung / Wärmepumpe",
54
- "Help & Info": "Hilfe und Informationen",
55
- "Help and Information": "Hilfe und Informationen",
56
- "Here you will find the complete documentation and information about all settings. Additional information about future versions will follow.": "Hier finden Sie die vollständige Dokumentation und Informationen zu allen Einstellungen. Weitere Informationen zu zukünftigen Versionen folgen.",
57
- "Hysteresis": "Hysterese",
58
- "If enabled, safety functions such as frost protection and overheating protection (solar) remain active.": "Wenn aktiviert, bleiben Sicherheitsfunktionen wie Frostschutz und Überhitzungsschutz (Solar) aktiv",
59
- "Important information about the AI system": "Wichtige Informationen zum KI-System",
60
- "Internet access & data protection": "Internetzugang & Datenschutz",
61
- "Lighting": "Beleuchtung",
62
- "Lighting 1 active": "Beleuchtung 1 aktiv",
63
- "Lighting 2 active": "Beleuchtung 2 aktiv",
64
- "Lighting 3 active": "Beleuchtung 3 aktiv",
65
- "Logical Control State (true / false)": "Logischer Kontrollstatus (wahr/falsch)",
66
- "Mail": "E-Mail",
67
- "Male": "Männlich",
68
- "Many automatic features (e.g. solar control, photovoltaic mode, AI weather logic and diagnostic functions) only operate when the pool season is active. The season status can be changed at any time via the 'status.season_active' datapoint or in the instance configuration.": "Viele automatische Funktionen (z. B. Solarsteuerung, Photovoltaikmodus, KI-Wetterlogik und Diagnosefunktionen) funktionieren nur, wenn die Poolsaison aktiv ist. Der Saisonstatus kann jederzeit über den Datenpunkt „status.season_active“ oder in der Instanzkonfiguration geändert werden.",
69
- "Many automatic features (e.g. solar control, photovoltaic mode, AI weather logic and diagnostic functions) only operate when the pool season is active. The season status can be changed at any time via the 'status.season_active' datapoint or your visualization. The instance configuration only provides the initial value when the datapoint is created for the first time.": "Viele automatische Funktionen (z. B. Solarsteuerung, Photovoltaikmodus, KI-Wetterlogik und Diagnosefunktionen) funktionieren nur, wenn die Poolsaison aktiv ist. Der Saisonstatus kann jederzeit über den Datenpunkt „status.season_active“ oder Ihre Visualisierung geändert werden. Die Instanzkonfiguration liefert nur den Anfangswert, wenn der Datenpunkt zum ersten Mal erstellt wird.",
70
- "Max Power (Watt)": "Maximale Leistung (Watt)",
71
- "Maximum Pool Temperature (°C – Safety Cutoff)": "Maximale Pooltemperatur (°C – Sicherheitsabschaltung)",
72
- "Minimum Circulation per Day": "Mindestumwälzung pro Tag",
73
- "Monday": "Montag",
74
- "Name Auxiliary pump 1": "Name Hilfspumpe 1",
75
- "Name Auxiliary pump 2": "Name Hilfspumpe 2",
76
- "Name Auxiliary pump 3": "Name Hilfspumpe 3",
77
- "Name Lighting 1": "Name Beleuchtung 1",
78
- "Name Lighting 2": "Name Beleuchtung 2",
79
- "Name Lighting 3": "Name Beleuchtung 3",
80
- "Note about pool season": "Hinweis zur Poolsaison",
81
- "Note: An external kWh meter is required for consumption calculation (e.g. smart plug).": "Hinweis: Für die Verbrauchsberechnung ist ein externer kWh-Zähler erforderlich (z. B. Smart Plug).",
82
- "Note: Heating control is temperature-driven and only active during pool season. Depending on the selected control type, either a smart plug is switched or a logical control state (true/false) is set.": "Hinweis: Die Heizungsregelung ist temperaturgesteuert und nur während der Poolsaison aktiv. Abhängig von der gewählten Steuerungsart wird entweder ein Smart Plug geschaltet oder ein logischer Steuerungszustand (wahr/falsch) gesetzt.",
83
- "Note: Supports external sensors as well as the PoolControl pressure box.": "Hinweis: Unterstützt externe Sensoren sowie die PoolControl-Druckbox.",
84
- "Note: The AI features are completely optional and can be disabled at any time via the 'ai.enabled' datapoint. Weather features (e.g. weather hints, pool tips, forecast for tomorrow) can also be individually enabled or disabled via 'ai.weather.switches.*'. The adapter uses the Open-Meteo service to generate weather data. For this, the geo-coordinates stored in ioBroker (latitude and longitude from system.config) are required.": "Hinweis: Die KI-Funktionen sind völlig optional und können jederzeit über den Datenpunkt „ai.enabled“ deaktiviert werden. Wetterfunktionen (z. B. Wetterhinweise, Pooltipps, Vorhersage für morgen) können auch einzeln über „ai.weather.switches.*“ aktiviert oder deaktiviert werden. Der Adapter nutzt den Open-Meteo-Dienst zur Generierung von Wetterdaten. Hierzu werden die in ioBroker hinterlegten Geokoordinaten (Breitengrad und Längengrad aus system.config) benötigt.",
85
- "Note: The warning resets automatically once the temperature drops 10% below the configured threshold.": "Hinweis: Die Warnung wird automatisch zurückgesetzt, sobald die Temperatur 10 % unter den konfigurierten Schwellenwert fällt.",
86
- "Note: These settings are mainly used as initial values when PoolControl is set up for the first time. Later operation should be done via the PoolControl datapoints or your visualization. Existing runtime datapoints are not overwritten on adapter restart.": "Hinweis: Diese Einstellungen werden hauptsächlich als Anfangswerte bei der ersten Einrichtung von PoolControl verwendet. Die spätere Bedienung sollte über die PoolControl-Datenpunkte oder Ihre Visualisierung erfolgen. Vorhandene Laufzeitdatenpunkte werden beim Neustart des Adapters nicht überschrieben.",
87
- "Object ID Auxiliary pump 1": "Objekt-ID Hilfspumpe 1",
88
- "Object ID Auxiliary pump 2": "Objekt-ID Hilfspumpe 2",
89
- "Object ID Auxiliary pump 3": "Objekt-ID Hilfspumpe 3",
90
- "Object ID Collector Sensor": "Objekt-ID Kollektortemperatursensor",
91
- "Object ID Current Power (W)": "Objekt-ID aktuelle Leistung (W)",
92
- "Object ID Flow Sensor": "Objekt-ID Vorlauftemperatursensor",
93
- "Object ID Ground Sensor": "Objekt-ID Bodentemperatursensor",
94
- "Object ID Heating / Heat Pump": "Objekt-ID Heizung/Wärmepumpe",
95
- "Object ID Lighting 1": "Objekt-ID Beleuchtung 1",
96
- "Object ID Lighting 2": "Objekt-ID Beleuchtung 2",
97
- "Object ID Lighting 3": "Objekt-ID Beleuchtung 3",
98
- "Object ID Outside Temperature Sensor": "Objekt-ID Außentemperatursensor",
99
- "Object ID PV generation power (W)": "Objekt-ID PV-Erzeugungsleistung (W)",
100
- "Object ID Pressure Sensor (bar)": "Objekt-ID Drucksensor (bar)",
101
- "Object ID Pump Switch Socket": "Objekt-ID Pumpensteckdose",
102
- "Object ID Return Sensor": "Objekt-ID Rücklauftemperatursensor",
103
- "Object ID Surface Sensor": "Objekt-ID Oberflächentemperatursensor",
104
- "Object ID external kWh meter": "Objekt-ID externer kWh-Zähler",
105
- "Object ID house consumption (W)": "Objekt-ID Hausverbrauch (W)",
106
- "Open documentation (English) on GitHub": "Öffnen Sie die Dokumentation (Englisch) auf GitHub",
107
- "Open documentation (German) on GitHub": "Öffnen Sie die Dokumentation (Deutsch) auf GitHub",
108
- "Optional additional actuators can be configured here. Actuators are only created in the adapter if they are explicitly enabled.": "Hier können optional weitere Aktoren konfiguriert werden. Aktoren werden nur dann im Adapter angelegt, wenn sie explizit aktiviert sind.",
109
- "PV, Consumption & Costs": "PV, Verbrauch & Kosten",
110
- "Photovoltaics (Surplus detection)": "Photovoltaik (Überschusserkennung)",
111
- "Pool Name": "Poolname",
112
- "Pool Season Active": "Poolsaison aktiv",
113
- "Pool Size (Liters)": "Poolgröße (Liter)",
114
- "Pressure Sensor (Filter Pressure)": "Drucksensor (Filterdruck)",
115
- "Pump": "Pumpe",
116
- "Pump Data Points (Smart Socket & Current Power Consumption)": "Pumpendatenpunkte (Smart Plug und aktueller Stromverbrauch)",
117
- "Pump Flow Rate (l/h)": "Pumpendurchflussrate (l/h)",
118
- "Pump Settings (Rated Power)": "Pumpeneinstellungen (Nennleistung)",
119
- "Pump mode (Auto/Manual/Off/Timer) can be controlled via data point 'pump.mode'.": "Der Pumpenmodus (Auto/Manuell/Aus/Timer) kann über den Datenpunkt „pump.mode“ gesteuert werden.",
120
- "Recipient address": "Empfängeradresse",
121
- "Safety Functions": "Sicherheitsfunktionen",
122
- "Saturday": "Samstag",
123
- "Season Settings": "Saisoneinstellungen",
124
- "Solar / Heating Control": "Solar-/Heizungssteuerung",
125
- "Speech Output": "Sprachausgabe",
126
- "Start (HH:MM)": "Start (HH:MM)",
127
- "Sunday": "Sonntag",
128
- "Switch Smart Plug (On / Off)": "Smart Plug ein-/ausschalten",
129
- "Target Pool Temperature (°C)": "Soll-Pooltemperatur (°C)",
130
- "Telegram": "Telegram",
131
- "Telegram instance": "Telegram-Instanz",
132
- "Telegram recipients (usernames, comma separated / empty = send to all users)": "Telegram-Empfänger (Benutzernamen, durch Kommas getrennt / leer = an alle Benutzer senden)",
133
- "Temperature Management": "Temperaturmanagement",
134
- "Temperature Sensors": "Temperatursensoren",
135
- "Temperature threshold for announcement (°C)": "Temperaturschwelle für Ansagen (°C)",
136
- "The AI system (aiHelper & aiForecastHelper) retrieves weather data from Open-Meteo via HTTPS. It uses the geo-coordinates from the ioBroker system configuration (system.config › latitude/longitude). No data is stored or transmitted to third parties. Without valid geo-coordinates, the AI system cannot generate forecasts.": "Das KI-System (aiHelper & aiForecastHelper) ruft Wetterdaten von Open-Meteo über HTTPS ab. Es verwendet die Geokoordinaten aus der ioBroker-Systemkonfiguration (system.config › Breitengrad/Längengrad). Es werden keine Daten gespeichert oder an Dritte übermittelt. Ohne gültige Geokoordinaten kann das KI-System keine Prognosen erstellen.",
137
- "The PoolControl adapter works completely locally by default. Currently, only the AI features access weather data from Open-Meteo via encrypted HTTPS. Only the geo-coordinates stored in ioBroker (latitude and longitude) are transmitted. No additional data is stored or sent to third parties. Future optional internet services may be added, but they will always be clearly marked.": "Der PoolControl-Adapter arbeitet standardmäßig vollständig lokal. Derzeit greifen nur die KI-Funktionen über verschlüsseltes HTTPS auf Wetterdaten von Open-Meteo zu. Es werden ausschließlich die im ioBroker hinterlegten Geokoordinaten (Breitengrad und Längengrad) übermittelt. Es werden keine darüber hinausgehenden Daten gespeichert oder an Dritte weitergegeben. Zukünftige optionale Internetdienste können hinzugefügt werden, sie werden jedoch immer deutlich gekennzeichnet sein.",
138
- "These warning values are used as initial values when the datapoints are created for the first time. Later changes should be made via 'solar.warn_active', 'solar.warn_temp' and 'solar.warn_speech' or your visualization.": "Diese Warnwerte werden als Anfangswerte verwendet, wenn die Datenpunkte zum ersten Mal erstellt werden. Spätere Änderungen sollten über „solar.warn_active“, „solar.warn_temp“ und „solar.warn_speech“ oder Ihre Visualisierung vorgenommen werden.",
139
- "This value is used as the initial season status when the datapoint is created for the first time. Later changes should be made via 'status.season_active' or your visualization.": "Dieser Wert wird als anfänglicher Saisonstatus verwendet, wenn der Datenpunkt zum ersten Mal erstellt wird. Spätere Änderungen sollten über „status.season_active“ oder Ihre Visualisierung vorgenommen werden.",
140
- "Threshold for PV surplus (W)": "Schwelle für PV-Überschuss (W)",
141
- "Thursday": "Donnerstag",
142
- "Time Control": "Zeitsteuerung",
143
- "Time Window 2": "Zeitfenster 2",
144
- "Time Window 3": "Zeitfenster 3",
145
- "Time Windows": "Zeitfenster",
146
- "Tuesday": "Dienstag",
147
- "Type of Heating Control": "Art der Heizungssteuerung",
148
- "Use Collector Sensor": "Kollektortemperatursensor verwenden",
149
- "Use Flow Sensor": "Vorlauftemperatursensor verwenden",
150
- "Use Ground Sensor": "Bodentemperatursensor verwenden",
151
- "Use Hysteresis Control": "Hysterese verwenden",
152
- "Use Outside Temperature Sensor": "Außentemperatursensor verwenden",
153
- "Use Pressure Sensor": "Drucksensor verwenden",
154
- "Use Return Sensor": "Rücklauftemperatursensor verwenden",
155
- "Use Surface Sensor": "Oberflächentemperatursensor verwenden",
156
- "Voice": "Stimme",
157
- "Volume (0–100)": "Lautstärke (0–100)",
158
- "Wednesday": "Mittwoch"
159
- }
@@ -1,169 +0,0 @@
1
- {
2
- "General Settings": "General Settings",
3
- "General Pool Settings": "General Pool Settings",
4
- "Pool Name": "Pool Name",
5
- "Pool Size (Liters)": "Pool Size (Liters)",
6
- "Minimum Circulation per Day": "Minimum Circulation per Day",
7
- "0.5x": "0.5x",
8
- "1.0x": "1.0x",
9
- "1.5x": "1.5x",
10
- "2.0x": "2.0x",
11
- "2.5x": "2.5x",
12
- "3.0x": "3.0x",
13
- "Season Settings": "Season Settings",
14
- "Pool Season Active": "Pool Season Active",
15
-
16
- "Pump": "Pump",
17
- "Pump Settings (Rated Power)": "Pump Settings (Rated Power)",
18
- "Max Power (Watt)": "Max Power (Watt)",
19
- "Pump Flow Rate (l/h)": "Pump Flow Rate (l/h)",
20
- "Frost Protection": "Frost Protection",
21
- "Enable Frost Protection": "Enable Frost Protection",
22
- "Frost Protection Temperature (°C)": "Frost Protection Temperature (°C)",
23
- "Pump Data Points (Smart Socket & Current Power Consumption)": "Pump Data Points (Smart Socket & Current Power Consumption)",
24
- "Object ID Pump Switch Socket": "Object ID Pump Switch Socket",
25
- "Object ID Current Power (W)": "Object ID Current Power (W)",
26
- "Pump mode (Auto/Manual/Off/Timer) can be controlled via data point 'pump.mode'.": "Pump mode (Auto/Manual/Off/Timer) can be controlled via data point 'pump.mode'.",
27
- "Pressure Sensor (Filter Pressure)": "Pressure Sensor (Filter Pressure)",
28
- "Use Pressure Sensor": "Use Pressure Sensor",
29
- "Object ID Pressure Sensor (bar)": "Object ID Pressure Sensor (bar)",
30
- "Note: Supports external sensors as well as the PoolControl pressure box.": "Note: Supports external sensors as well as the PoolControl pressure box.",
31
- "Safety Functions": "Safety Functions",
32
- "Enable safety functions also in 'Manual' mode": "Enable safety functions also in 'Manual' mode",
33
- "If enabled, safety functions such as frost protection and overheating protection (solar) remain active.": "If enabled, safety functions such as frost protection and overheating protection (solar) remain active.",
34
-
35
- "Temperature Management": "Temperature Management",
36
- "Temperature Sensors": "Temperature Sensors",
37
- "Use Surface Sensor": "Use Surface Sensor",
38
- "Object ID Surface Sensor": "Object ID Surface Sensor",
39
- "Use Ground Sensor": "Use Ground Sensor",
40
- "Object ID Ground Sensor": "Object ID Ground Sensor",
41
- "Use Flow Sensor": "Use Flow Sensor",
42
- "Object ID Flow Sensor": "Object ID Flow Sensor",
43
- "Use Return Sensor": "Use Return Sensor",
44
- "Object ID Return Sensor": "Object ID Return Sensor",
45
- "Use Collector Sensor": "Use Collector Sensor",
46
- "Object ID Collector Sensor": "Object ID Collector Sensor",
47
- "Use Outside Temperature Sensor": "Use Outside Temperature Sensor",
48
- "Object ID Outside Temperature Sensor": "Object ID Outside Temperature Sensor",
49
-
50
- "Solar / Heating Control": "Solar / Heating Control",
51
- "Enable Solar Control": "Enable Solar Control",
52
- "Hysteresis": "Hysteresis",
53
- "Use Hysteresis Control": "Use Hysteresis Control",
54
- "Collector Temperature On Threshold (°C)": "Collector Temperature On Threshold (°C)",
55
- "Collector Temperature Off Threshold (°C)": "Collector Temperature Off Threshold (°C)",
56
- "Collector Temperature Warning": "Collector Temperature Warning",
57
- "Enable Collector Temperature Warning": "Enable Collector Temperature Warning",
58
- "Collector Temperature Warning Threshold (°C)": "Collector Temperature Warning Threshold (°C)",
59
- "Announce / Notify on Warning": "Announce / Notify on Warning",
60
- "Note: The warning resets automatically once the temperature drops 10% below the configured threshold.": "Note: The warning resets automatically once the temperature drops 10% below the configured threshold.",
61
- "Heating / Heat Pump": "Heating / Heat Pump",
62
- "Enable Heating Control": "Enable Heating Control",
63
- "Type of Heating Control": "Type of Heating Control",
64
- "Switch Smart Plug (On / Off)": "Switch Smart Plug (On / Off)",
65
- "Logical Control State (true / false)": "Logical Control State (true / false)",
66
- "Object ID Heating / Heat Pump": "Object ID Heating / Heat Pump",
67
- "Target Pool Temperature (°C)": "Target Pool Temperature (°C)",
68
- "Maximum Pool Temperature (°C – Safety Cutoff)": "Maximum Pool Temperature (°C – Safety Cutoff)",
69
- "Note: Heating control is temperature-driven and only active during pool season. Depending on the selected control type, either a smart plug is switched or a logical control state (true/false) is set.": "Note: Heating control is temperature-driven and only active during pool season. Depending on the selected control type, either a smart plug is switched or a logical control state (true/false) is set.",
70
-
71
- "Time Control": "Time Control",
72
- "Time Windows": "Time Windows",
73
- "Enable Time Window 1": "Enable Time Window 1",
74
- "Start (HH:MM)": "Start (HH:MM)",
75
- "End (HH:MM)": "End (HH:MM)",
76
- "Monday": "Monday",
77
- "Tuesday": "Tuesday",
78
- "Wednesday": "Wednesday",
79
- "Thursday": "Thursday",
80
- "Friday": "Friday",
81
- "Saturday": "Saturday",
82
- "Sunday": "Sunday",
83
- "Time Window 2": "Time Window 2",
84
- "Enable Time Window 2": "Enable Time Window 2",
85
- "Time Window 3": "Time Window 3",
86
- "Enable Time Window 3": "Enable Time Window 3",
87
-
88
- "Speech Output": "Speech Output",
89
- "General": "General",
90
- "Enable speech output": "Enable speech output",
91
- "Amazon Alexa": "Amazon Alexa",
92
- "Enable Alexa output": "Enable Alexa output",
93
- "Alexa device": "Alexa device",
94
- "Volume (0–100)": "Volume (0–100)",
95
- "Voice": "Voice",
96
- "Default (female)": "Default (female)",
97
- "Male": "Male",
98
- "Telegram": "Telegram",
99
- "Enable Telegram output": "Enable Telegram output",
100
- "Telegram instance": "Telegram instance",
101
- "Telegram recipients (usernames, comma separated / empty = send to all users)": "Telegram recipients (usernames, comma separated / empty = send to all users)",
102
- "Example: Dirk,Dennis (empty = send to all users)": "Example: Dirk,Dennis (empty = send to all users)",
103
- "Mail": "Mail",
104
- "Enable email output": "Enable email output",
105
- "Email adapter instance": "Email adapter instance",
106
- "Recipient address": "Recipient address",
107
- "Email subject": "Email subject",
108
- "Temperature threshold for announcement (°C)": "Temperature threshold for announcement (°C)",
109
- "Announce error messages": "Announce error messages",
110
-
111
- "PV, Consumption & Costs": "PV, Consumption & Costs",
112
- "Consumption and cost calculation": "Consumption and cost calculation",
113
- "Enable consumption and cost calculation": "Enable consumption and cost calculation",
114
- "Object ID external kWh meter": "Object ID external kWh meter",
115
- "Electricity price (€ / kWh)": "Electricity price (€ / kWh)",
116
- "Note: An external kWh meter is required for consumption calculation (e.g. smart plug).": "Note: An external kWh meter is required for consumption calculation (e.g. smart plug).",
117
- "Photovoltaics (Surplus detection)": "Photovoltaics (Surplus detection)",
118
- "Object ID PV generation power (W)": "Object ID PV generation power (W)",
119
- "Datapoint containing current PV power (Watts)": "Datapoint containing current PV power (Watts)",
120
- "Object ID house consumption (W)": "Object ID house consumption (W)",
121
- "Datapoint containing current house consumption (Watts)": "Datapoint containing current house consumption (Watts)",
122
- "Threshold for PV surplus (W)": "Threshold for PV surplus (W)",
123
- "Difference between PV generation and house consumption that counts as surplus": "Difference between PV generation and house consumption that counts as surplus",
124
-
125
- "Additional Actuators": "Additional Actuators",
126
- "Additional actuators (valves, lighting & auxiliary pumps)": "Additional actuators (valves, lighting & auxiliary pumps)",
127
- "Optional additional actuators can be configured here. Actuators are only created in the adapter if they are explicitly enabled.": "Optional additional actuators can be configured here. Actuators are only created in the adapter if they are explicitly enabled.",
128
- "Lighting": "Lighting",
129
- "Lighting 1 active": "Lighting 1 active",
130
- "Name Lighting 1": "Name Lighting 1",
131
- "Object ID Lighting 1": "Object ID Lighting 1",
132
- "Lighting 2 active": "Lighting 2 active",
133
- "Name Lighting 2": "Name Lighting 2",
134
- "Object ID Lighting 2": "Object ID Lighting 2",
135
- "Lighting 3 active": "Lighting 3 active",
136
- "Name Lighting 3": "Name Lighting 3",
137
- "Object ID Lighting 3": "Object ID Lighting 3",
138
- "Auxiliary pumps & attractions": "Auxiliary pumps & attractions",
139
- "Auxiliary pump 1 active": "Auxiliary pump 1 active",
140
- "Name Auxiliary pump 1": "Name Auxiliary pump 1",
141
- "Object ID Auxiliary pump 1": "Object ID Auxiliary pump 1",
142
- "Auxiliary pump 2 active": "Auxiliary pump 2 active",
143
- "Name Auxiliary pump 2": "Name Auxiliary pump 2",
144
- "Object ID Auxiliary pump 2": "Object ID Auxiliary pump 2",
145
- "Auxiliary pump 3 active": "Auxiliary pump 3 active",
146
- "Name Auxiliary pump 3": "Name Auxiliary pump 3",
147
- "Object ID Auxiliary pump 3": "Object ID Auxiliary pump 3",
148
-
149
- "Help & Info": "Help & Info",
150
- "Help and Information": "Help and Information",
151
- "Open documentation (English) on GitHub": "Open documentation (English) on GitHub",
152
- "Open documentation (German) on GitHub": "Open documentation (German) on GitHub",
153
- "Here you will find the complete documentation and information about all settings. Additional information about future versions will follow.": "Here you will find the complete documentation and information about all settings. Additional information about future versions will follow.",
154
- "Important information about the AI system": "Important information about the AI system",
155
- "The AI system (aiHelper & aiForecastHelper) retrieves weather data from Open-Meteo via HTTPS. It uses the geo-coordinates from the ioBroker system configuration (system.config › latitude/longitude). No data is stored or transmitted to third parties. Without valid geo-coordinates, the AI system cannot generate forecasts.": "The AI system (aiHelper & aiForecastHelper) retrieves weather data from Open-Meteo via HTTPS. It uses the geo-coordinates from the ioBroker system configuration (system.config › latitude/longitude). No data is stored or transmitted to third parties. Without valid geo-coordinates, the AI system cannot generate forecasts.",
156
- "Note: The AI features are completely optional and can be disabled at any time via the 'ai.enabled' datapoint. Weather features (e.g. weather hints, pool tips, forecast for tomorrow) can also be individually enabled or disabled via 'ai.weather.switches.*'. The adapter uses the Open-Meteo service to generate weather data. For this, the geo-coordinates stored in ioBroker (latitude and longitude from system.config) are required.": "Note: The AI features are completely optional and can be disabled at any time via the 'ai.enabled' datapoint. Weather features (e.g. weather hints, pool tips, forecast for tomorrow) can also be individually enabled or disabled via 'ai.weather.switches.*'. The adapter uses the Open-Meteo service to generate weather data. For this, the geo-coordinates stored in ioBroker (latitude and longitude from system.config) are required.",
157
- "Internet access & data protection": "Internet access & data protection",
158
- "The PoolControl adapter works completely locally by default. Currently, only the AI features access weather data from Open-Meteo via encrypted HTTPS. Only the geo-coordinates stored in ioBroker (latitude and longitude) are transmitted. No additional data is stored or sent to third parties. Future optional internet services may be added, but they will always be clearly marked.": "The PoolControl adapter works completely locally by default. Currently, only the AI features access weather data from Open-Meteo via encrypted HTTPS. Only the geo-coordinates stored in ioBroker (latitude and longitude) are transmitted. No additional data is stored or sent to third parties. Future optional internet services may be added, but they will always be clearly marked.",
159
- "Note about pool season": "Note about pool season",
160
- "Many automatic features (e.g. solar control, photovoltaic mode, AI weather logic and diagnostic functions) only operate when the pool season is active. The season status can be changed at any time via the 'status.season_active' datapoint or your visualization. The instance configuration only provides the initial value when the datapoint is created for the first time.": "Many automatic features (e.g. solar control, photovoltaic mode, AI weather logic and diagnostic functions) only operate when the pool season is active. The season status can be changed at any time via the 'status.season_active' datapoint or your visualization. The instance configuration only provides the initial value when the datapoint is created for the first time.",
161
- "Central speech output (speech.queue)": "Central speech output (speech.queue)",
162
- "All text and speech outputs of the adapter – including AI forecasts, warnings, pump status, solar hints and diagnostic messages – are emitted via the central 'speech.queue' datapoint. This datapoint should be used for VIS displays, Alexa or Telegram outputs.": "All text and speech outputs of the adapter – including AI forecasts, warnings, pump status, solar hints and diagnostic messages – are emitted via the central 'speech.queue' datapoint. This datapoint should be used for VIS displays, Alexa or Telegram outputs.",
163
-
164
- "Note: These settings are mainly used as initial values when PoolControl is set up for the first time. Later operation should be done via the PoolControl datapoints or your visualization. Existing runtime datapoints are not overwritten on adapter restart.": "Note: These settings are mainly used as initial values when PoolControl is set up for the first time. Later operation should be done via the PoolControl datapoints or your visualization. Existing runtime datapoints are not overwritten on adapter restart.",
165
-
166
- "This value is used as the initial season status when the datapoint is created for the first time. Later changes should be made via 'status.season_active' or your visualization.": "This value is used as the initial season status when the datapoint is created for the first time. Later changes should be made via 'status.season_active' or your visualization.",
167
-
168
- "These warning values are used as initial values when the datapoints are created for the first time. Later changes should be made via 'solar.warn_active', 'solar.warn_temp' and 'solar.warn_speech' or your visualization.": "These warning values are used as initial values when the datapoints are created for the first time. Later changes should be made via 'solar.warn_active', 'solar.warn_temp' and 'solar.warn_speech' or your visualization."
169
- }