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.
- package/README.md +285 -292
- package/admin/i18n/de/translations.json +158 -4
- package/admin/i18n/en/translations.json +161 -3
- package/admin/i18n/es/translations.json +158 -4
- package/admin/i18n/fr/translations.json +158 -4
- package/admin/i18n/it/translations.json +158 -4
- package/admin/i18n/nl/translations.json +158 -4
- package/admin/i18n/pl/translations.json +158 -4
- package/admin/i18n/pt/translations.json +158 -4
- package/admin/i18n/ru/translations.json +158 -4
- package/admin/i18n/uk/translations.json +158 -4
- package/admin/i18n/zh-cn/translations.json +158 -4
- package/admin/jsonConfig.json +180 -602
- package/io-package.json +107 -100
- package/lib/helpers/actuatorsHelper.js +6 -8
- package/lib/helpers/aiChemistryHelpHelper.js +7 -7
- package/lib/helpers/aiForecastHelper.js +21 -21
- package/lib/helpers/aiHelper.js +53 -63
- package/lib/helpers/consumptionHelper.js +23 -25
- package/lib/helpers/controlHelper.js +24 -24
- package/lib/helpers/controlHelper2.js +17 -17
- package/lib/helpers/debugLogHelper.js +12 -14
- package/lib/helpers/frostHelper.js +6 -6
- package/lib/helpers/heatHelper.js +14 -14
- package/lib/helpers/infoHelper.js +2 -2
- package/lib/helpers/migrationHelper.js +16 -16
- package/lib/helpers/photovoltaicHelper.js +28 -28
- package/lib/helpers/pumpHelper.js +16 -18
- package/lib/helpers/pumpHelper2.js +8 -10
- package/lib/helpers/pumpHelper3.js +9 -9
- package/lib/helpers/pumpHelper4.js +9 -9
- package/lib/helpers/pumpSpeedHelper.js +6 -6
- package/lib/helpers/runtimeHelper.js +14 -14
- package/lib/helpers/solarHelper.js +9 -9
- package/lib/helpers/speechHelper.js +13 -15
- package/lib/helpers/speechTextHelper.js +13 -13
- package/lib/helpers/statisticsHelper.js +9 -9
- package/lib/helpers/statisticsHelperMonth.js +15 -15
- package/lib/helpers/statisticsHelperWeek.js +11 -11
- package/lib/helpers/statusHelper.js +9 -9
- package/lib/helpers/temperatureHelper.js +9 -11
- package/lib/helpers/timeHelper.js +7 -9
- package/lib/stateDefinitions/actuatorsStates.js +19 -19
- package/lib/stateDefinitions/aiChemistryHelpStates.js +59 -28
- package/lib/stateDefinitions/aiStates.js +119 -31
- package/lib/stateDefinitions/consumptionStates.js +20 -14
- package/lib/stateDefinitions/controlStates.js +90 -37
- package/lib/stateDefinitions/debugLogStates.js +28 -13
- package/lib/stateDefinitions/generalStates.js +4 -4
- package/lib/stateDefinitions/heatStates.js +21 -21
- package/lib/stateDefinitions/infoStates.js +11 -5
- package/lib/stateDefinitions/photovoltaicStates.js +52 -24
- package/lib/stateDefinitions/pumpSpeedStates.js +11 -11
- package/lib/stateDefinitions/pumpStates.js +24 -15
- package/lib/stateDefinitions/pumpStates2.js +22 -10
- package/lib/stateDefinitions/pumpStates3.js +63 -24
- package/lib/stateDefinitions/pumpStates4.js +62 -32
- package/lib/stateDefinitions/runtimeStates.js +10 -10
- package/lib/stateDefinitions/solarStates.js +9 -9
- package/lib/stateDefinitions/speechStates.js +24 -21
- package/lib/stateDefinitions/statisticsStates.js +107 -29
- package/lib/stateDefinitions/statusStates.js +14 -12
- package/lib/stateDefinitions/temperatureStates.js +18 -12
- package/lib/stateDefinitions/timeStates.js +5 -5
- package/main.js +38 -0
- package/package.json +7 -8
|
@@ -30,7 +30,7 @@ const statisticsHelperMonth = {
|
|
|
30
30
|
|
|
31
31
|
async init(adapter) {
|
|
32
32
|
this.adapter = adapter;
|
|
33
|
-
adapter.log.debug('statisticsHelperMonth:
|
|
33
|
+
adapter.log.debug('statisticsHelperMonth: Initialization started.');
|
|
34
34
|
|
|
35
35
|
// --- Überinstallationsschutz ---
|
|
36
36
|
try {
|
|
@@ -43,9 +43,9 @@ const statisticsHelperMonth = {
|
|
|
43
43
|
await this._createTemperatureStatistics();
|
|
44
44
|
await this._subscribeActiveSensors();
|
|
45
45
|
await this._scheduleMonthReset();
|
|
46
|
-
adapter.log.debug('statisticsHelperMonth:
|
|
46
|
+
adapter.log.debug('statisticsHelperMonth: Initialization completed (sensor monitoring active).');
|
|
47
47
|
} catch (err) {
|
|
48
|
-
adapter.log.warn(`statisticsHelperMonth:
|
|
48
|
+
adapter.log.warn(`statisticsHelperMonth: Error during initialization: ${err.message}`);
|
|
49
49
|
}
|
|
50
50
|
},
|
|
51
51
|
|
|
@@ -336,9 +336,9 @@ const statisticsHelperMonth = {
|
|
|
336
336
|
ack: true,
|
|
337
337
|
});
|
|
338
338
|
|
|
339
|
-
adapter.log.debug('statisticsHelperMonth:
|
|
339
|
+
adapter.log.debug('statisticsHelperMonth: Overall summary updated successfully.');
|
|
340
340
|
} catch (err) {
|
|
341
|
-
adapter.log.warn(`statisticsHelperMonth:
|
|
341
|
+
adapter.log.warn(`statisticsHelperMonth: Error while updating overall summary: ${err.message}`);
|
|
342
342
|
}
|
|
343
343
|
},
|
|
344
344
|
|
|
@@ -357,7 +357,7 @@ const statisticsHelperMonth = {
|
|
|
357
357
|
|
|
358
358
|
// Wenn heute bereits der 1. ist → keinen sofortigen Reset starten!
|
|
359
359
|
if (now.getDate() === 1) {
|
|
360
|
-
adapter.log.debug('statisticsHelperMonth:
|
|
360
|
+
adapter.log.debug('statisticsHelperMonth: Today is already the 1st – reset skipped.');
|
|
361
361
|
// Plan auf nächsten Monat verschieben
|
|
362
362
|
nextReset.setMonth(nextReset.getMonth() + 1);
|
|
363
363
|
msUntilReset = nextReset.getTime() - now.getTime();
|
|
@@ -365,14 +365,14 @@ const statisticsHelperMonth = {
|
|
|
365
365
|
|
|
366
366
|
// Wenn Berechnung negativ oder zu klein ist → Sicherheit
|
|
367
367
|
if (msUntilReset <= 0 || msUntilReset < 10 * 60 * 1000) {
|
|
368
|
-
adapter.log.debug('statisticsHelperMonth: msUntilReset
|
|
368
|
+
adapter.log.debug('statisticsHelperMonth: msUntilReset was too small – adjusting timer.');
|
|
369
369
|
msUntilReset = 10 * 60 * 1000; // mindestens 10 Minuten warten
|
|
370
370
|
}
|
|
371
371
|
|
|
372
372
|
// Timer setzen
|
|
373
373
|
this.monthResetTimer = setTimeout(async () => {
|
|
374
374
|
if (this.isResetting) {
|
|
375
|
-
adapter.log.debug('statisticsHelperMonth: Reset
|
|
375
|
+
adapter.log.debug('statisticsHelperMonth: Reset already running – timer skipped.');
|
|
376
376
|
return;
|
|
377
377
|
}
|
|
378
378
|
|
|
@@ -381,7 +381,7 @@ const statisticsHelperMonth = {
|
|
|
381
381
|
}, msUntilReset);
|
|
382
382
|
|
|
383
383
|
adapter.log.debug(
|
|
384
|
-
`statisticsHelperMonth:
|
|
384
|
+
`statisticsHelperMonth: Monthly reset scheduled in ${Math.round(msUntilReset / 60000)} minutes.`,
|
|
385
385
|
);
|
|
386
386
|
},
|
|
387
387
|
|
|
@@ -398,22 +398,22 @@ const statisticsHelperMonth = {
|
|
|
398
398
|
|
|
399
399
|
// Nur am 1. Tag des Monats ausführen (00:05 Uhr geplant)
|
|
400
400
|
if (currentDay !== 1) {
|
|
401
|
-
adapter.log.debug('[statisticsHelperMonth]
|
|
401
|
+
adapter.log.debug('[statisticsHelperMonth] Not the first day of the month – reset skipped.');
|
|
402
402
|
return;
|
|
403
403
|
}
|
|
404
404
|
} catch (err) {
|
|
405
|
-
adapter.log.warn(`[statisticsHelperMonth]
|
|
405
|
+
adapter.log.warn(`[statisticsHelperMonth] Error while checking month start: ${err.message}`);
|
|
406
406
|
}
|
|
407
407
|
|
|
408
408
|
// 🟢 NEU: Schutz vor Endlosschleifen und Mehrfachausführung
|
|
409
409
|
if (this.isResetting) {
|
|
410
|
-
adapter.log.debug('statisticsHelperMonth: Reset
|
|
410
|
+
adapter.log.debug('statisticsHelperMonth: Reset already active – skipped.');
|
|
411
411
|
return;
|
|
412
412
|
}
|
|
413
413
|
this.isResetting = true;
|
|
414
414
|
|
|
415
415
|
try {
|
|
416
|
-
adapter.log.info('statisticsHelperMonth:
|
|
416
|
+
adapter.log.info('statisticsHelperMonth: Monthly statistics are being reset.');
|
|
417
417
|
|
|
418
418
|
// 🟢 NEU: fehlende Zeile wieder einfügen
|
|
419
419
|
const resetDate = new Date().toISOString().slice(0, 19).replace('T', ' ');
|
|
@@ -482,9 +482,9 @@ const statisticsHelperMonth = {
|
|
|
482
482
|
ack: true,
|
|
483
483
|
});
|
|
484
484
|
|
|
485
|
-
adapter.log.debug('statisticsHelperMonth:
|
|
485
|
+
adapter.log.debug('statisticsHelperMonth: Monthly statistics reset completed.');
|
|
486
486
|
} catch (err) {
|
|
487
|
-
adapter.log.warn(`statisticsHelperMonth:
|
|
487
|
+
adapter.log.warn(`statisticsHelperMonth: Error during monthly reset: ${err.message}`);
|
|
488
488
|
} finally {
|
|
489
489
|
this.isResetting = false; // 🟢 NEU: Flag wieder freigeben
|
|
490
490
|
}
|
|
@@ -30,7 +30,7 @@ const statisticsHelperWeek = {
|
|
|
30
30
|
|
|
31
31
|
async init(adapter) {
|
|
32
32
|
this.adapter = adapter;
|
|
33
|
-
adapter.log.debug('statisticsHelperWeek:
|
|
33
|
+
adapter.log.debug('statisticsHelperWeek: Initialization started.');
|
|
34
34
|
|
|
35
35
|
// --- Überinstallationsschutz ---
|
|
36
36
|
try {
|
|
@@ -44,9 +44,9 @@ const statisticsHelperWeek = {
|
|
|
44
44
|
await this._createTemperatureStatistics();
|
|
45
45
|
await this._subscribeActiveSensors();
|
|
46
46
|
await this._scheduleWeekReset();
|
|
47
|
-
adapter.log.debug('statisticsHelperWeek:
|
|
47
|
+
adapter.log.debug('statisticsHelperWeek: Initialization completed (sensor monitoring active).');
|
|
48
48
|
} catch (err) {
|
|
49
|
-
adapter.log.warn(`statisticsHelperWeek:
|
|
49
|
+
adapter.log.warn(`statisticsHelperWeek: Error during initialization: ${err.message}`);
|
|
50
50
|
}
|
|
51
51
|
},
|
|
52
52
|
|
|
@@ -373,9 +373,7 @@ const statisticsHelperWeek = {
|
|
|
373
373
|
// 🟢 NEU: Schutz – falls Resetzeitpunkt in der Vergangenheit liegt
|
|
374
374
|
if (msUntilReset < 60 * 1000) {
|
|
375
375
|
// unter 1 Minute Differenz
|
|
376
|
-
adapter.log.warn(
|
|
377
|
-
'statisticsHelperWeek: Berechneter Resetzeitpunkt liegt in der Vergangenheit – Korrigiere auf nächste Woche.',
|
|
378
|
-
);
|
|
376
|
+
adapter.log.warn('statisticsHelperWeek: Calculated reset time is in the past – adjusting to next week.');
|
|
379
377
|
const corrected = new Date(now);
|
|
380
378
|
corrected.setDate(now.getDate() + 7);
|
|
381
379
|
corrected.setHours(0, 5, 0, 0);
|
|
@@ -392,7 +390,9 @@ const statisticsHelperWeek = {
|
|
|
392
390
|
// await this._scheduleWeekReset();
|
|
393
391
|
}, msUntilReset);
|
|
394
392
|
|
|
395
|
-
adapter.log.debug(
|
|
393
|
+
adapter.log.debug(
|
|
394
|
+
`statisticsHelperWeek: Weekly reset scheduled in ${Math.round(msUntilReset / 60000)} minutes.`,
|
|
395
|
+
);
|
|
396
396
|
},
|
|
397
397
|
|
|
398
398
|
/**
|
|
@@ -403,13 +403,13 @@ const statisticsHelperWeek = {
|
|
|
403
403
|
|
|
404
404
|
// 🟢 NEU: Schutz vor Endlosschleifen und Mehrfachausführung
|
|
405
405
|
if (this.isResetting) {
|
|
406
|
-
adapter.log.debug('statisticsHelperWeek: Reset
|
|
406
|
+
adapter.log.debug('statisticsHelperWeek: Reset already active – skipped.');
|
|
407
407
|
return;
|
|
408
408
|
}
|
|
409
409
|
this.isResetting = true;
|
|
410
410
|
|
|
411
411
|
try {
|
|
412
|
-
adapter.log.info('statisticsHelperWeek:
|
|
412
|
+
adapter.log.info('statisticsHelperWeek: Weekly statistics are being reset.');
|
|
413
413
|
const resetDate = new Date().toISOString().slice(0, 19).replace('T', ' ');
|
|
414
414
|
|
|
415
415
|
for (const sensor of this.sensors) {
|
|
@@ -476,9 +476,9 @@ const statisticsHelperWeek = {
|
|
|
476
476
|
ack: true,
|
|
477
477
|
});
|
|
478
478
|
|
|
479
|
-
adapter.log.debug('statisticsHelperWeek:
|
|
479
|
+
adapter.log.debug('statisticsHelperWeek: Weekly statistics reset completed.');
|
|
480
480
|
} catch (err) {
|
|
481
|
-
adapter.log.warn(`statisticsHelperWeek:
|
|
481
|
+
adapter.log.warn(`statisticsHelperWeek: Error during weekly reset: ${err.message}`);
|
|
482
482
|
} finally {
|
|
483
483
|
this.isResetting = false; // 🟢 NEU: Flag wieder freigeben
|
|
484
484
|
}
|
|
@@ -44,16 +44,16 @@ const statusHelper = {
|
|
|
44
44
|
|
|
45
45
|
// Beim Start initiale Updates
|
|
46
46
|
this.updateSummary().catch(err =>
|
|
47
|
-
this.adapter.log.warn(`[statusHelper] Initial
|
|
47
|
+
this.adapter.log.warn(`[statusHelper] Initial update failed: ${err.message}`),
|
|
48
48
|
);
|
|
49
49
|
this.updateSystemStatus().catch(err =>
|
|
50
|
-
this.adapter.log.warn(`[statusHelper] Initial
|
|
50
|
+
this.adapter.log.warn(`[statusHelper] Initial system status update failed: ${err.message}`),
|
|
51
51
|
);
|
|
52
52
|
|
|
53
53
|
// Mitternacht-Reset einplanen
|
|
54
54
|
this.scheduleMidnightReset();
|
|
55
55
|
|
|
56
|
-
this.adapter.log.debug('[statusHelper]
|
|
56
|
+
this.adapter.log.debug('[statusHelper] initialized');
|
|
57
57
|
},
|
|
58
58
|
|
|
59
59
|
async handleStateChange(id, state) {
|
|
@@ -108,7 +108,7 @@ const statusHelper = {
|
|
|
108
108
|
try {
|
|
109
109
|
// FIX: Throttle - Mehrfachupdates innerhalb 1 Sekunde vermeiden
|
|
110
110
|
if (Date.now() - this._lastSummaryUpdate < 1000) {
|
|
111
|
-
this.adapter.log.debug('[statusHelper]
|
|
111
|
+
this.adapter.log.debug('[statusHelper] updateSummary skipped (throttle)');
|
|
112
112
|
return;
|
|
113
113
|
}
|
|
114
114
|
this._lastSummaryUpdate = Date.now();
|
|
@@ -184,7 +184,7 @@ const statusHelper = {
|
|
|
184
184
|
ack: true,
|
|
185
185
|
});
|
|
186
186
|
} catch (err) {
|
|
187
|
-
this.adapter.log.warn(`[statusHelper]
|
|
187
|
+
this.adapter.log.warn(`[statusHelper] Error while updating summary: ${err.message}`);
|
|
188
188
|
}
|
|
189
189
|
},
|
|
190
190
|
|
|
@@ -209,7 +209,7 @@ const statusHelper = {
|
|
|
209
209
|
await this.adapter.setStateAsync('status.system_warning_text', { val: warningText.trim(), ack: true });
|
|
210
210
|
await this.adapter.setStateAsync('status.system_ok', { val: !warningActive, ack: true });
|
|
211
211
|
} catch (err) {
|
|
212
|
-
this.adapter.log.warn(`[statusHelper]
|
|
212
|
+
this.adapter.log.warn(`[statusHelper] Error while updating system status: ${err.message}`);
|
|
213
213
|
}
|
|
214
214
|
},
|
|
215
215
|
|
|
@@ -227,16 +227,16 @@ const statusHelper = {
|
|
|
227
227
|
this.scheduleMidnightReset(); // neu einplanen
|
|
228
228
|
}, msToMidnight);
|
|
229
229
|
|
|
230
|
-
this.adapter.log.debug(`[statusHelper]
|
|
230
|
+
this.adapter.log.debug(`[statusHelper] Daily reset scheduled in ${Math.round(msToMidnight / 1000)}s`);
|
|
231
231
|
},
|
|
232
232
|
|
|
233
233
|
async doMidnightReset() {
|
|
234
234
|
try {
|
|
235
235
|
await this.adapter.setStateAsync('status.pump_today_count', { val: 0, ack: true });
|
|
236
236
|
await this.adapter.setStateAsync('status.pump_was_on_today', { val: false, ack: true });
|
|
237
|
-
this.adapter.log.debug('[statusHelper]
|
|
237
|
+
this.adapter.log.debug('[statusHelper] Daily reset completed');
|
|
238
238
|
} catch (err) {
|
|
239
|
-
this.adapter.log.warn(`[statusHelper]
|
|
239
|
+
this.adapter.log.warn(`[statusHelper] Error during daily reset: ${err.message}`);
|
|
240
240
|
}
|
|
241
241
|
},
|
|
242
242
|
|
|
@@ -40,12 +40,12 @@ const temperatureHelper = {
|
|
|
40
40
|
this.values[key] = val;
|
|
41
41
|
await this._setCurrentValue(key, val);
|
|
42
42
|
await this._updateMinMax(key, val);
|
|
43
|
-
adapter.log.debug(`[temperatureHelper]
|
|
43
|
+
adapter.log.debug(`[temperatureHelper] Initial value for ${key}: ${val} °C`);
|
|
44
44
|
} else {
|
|
45
|
-
adapter.log.debug(`[temperatureHelper]
|
|
45
|
+
adapter.log.debug(`[temperatureHelper] No valid initial value for ${key}`);
|
|
46
46
|
}
|
|
47
47
|
} catch (err) {
|
|
48
|
-
adapter.log.warn(`[temperatureHelper]
|
|
48
|
+
adapter.log.warn(`[temperatureHelper] Error during initial read for ${key}: ${err.message}`);
|
|
49
49
|
}
|
|
50
50
|
}
|
|
51
51
|
|
|
@@ -61,7 +61,7 @@ const temperatureHelper = {
|
|
|
61
61
|
|
|
62
62
|
// >>> NEU: Alte Min/Max-Werte wiederherstellen
|
|
63
63
|
this._restoreMinMaxFromStates().catch(err =>
|
|
64
|
-
this.adapter.log.warn(`[temperatureHelper]
|
|
64
|
+
this.adapter.log.warn(`[temperatureHelper] Min/Max restore failed: ${err.message}`),
|
|
65
65
|
);
|
|
66
66
|
|
|
67
67
|
// Reset um Mitternacht
|
|
@@ -73,7 +73,7 @@ const temperatureHelper = {
|
|
|
73
73
|
? Object.entries(this.sensors)
|
|
74
74
|
.map(([k, v]) => `${k}=${v}`)
|
|
75
75
|
.join(', ')
|
|
76
|
-
: '
|
|
76
|
+
: 'no sensors configured'
|
|
77
77
|
}`,
|
|
78
78
|
);
|
|
79
79
|
},
|
|
@@ -140,7 +140,7 @@ const temperatureHelper = {
|
|
|
140
140
|
ack: true,
|
|
141
141
|
});
|
|
142
142
|
} catch (err) {
|
|
143
|
-
this.adapter.log.warn(`[temperatureHelper] setState current ${key}
|
|
143
|
+
this.adapter.log.warn(`[temperatureHelper] setState current ${key} failed: ${err.message}`);
|
|
144
144
|
}
|
|
145
145
|
},
|
|
146
146
|
|
|
@@ -152,7 +152,7 @@ const temperatureHelper = {
|
|
|
152
152
|
try {
|
|
153
153
|
await this.adapter.setStateAsync(stateId, { val: delta, ack: true });
|
|
154
154
|
} catch (err) {
|
|
155
|
-
this.adapter.log.warn(`[temperatureHelper] setState ${stateId}
|
|
155
|
+
this.adapter.log.warn(`[temperatureHelper] setState ${stateId} failed: ${err.message}`);
|
|
156
156
|
}
|
|
157
157
|
},
|
|
158
158
|
|
|
@@ -209,9 +209,7 @@ const temperatureHelper = {
|
|
|
209
209
|
ack: true,
|
|
210
210
|
});
|
|
211
211
|
} catch (err) {
|
|
212
|
-
this.adapter.log.warn(
|
|
213
|
-
`[temperatureHelper] setState delta_per_hour ${key} fehlgeschlagen: ${err.message}`,
|
|
214
|
-
);
|
|
212
|
+
this.adapter.log.warn(`[temperatureHelper] setState delta_per_hour ${key} failed: ${err.message}`);
|
|
215
213
|
}
|
|
216
214
|
}
|
|
217
215
|
},
|
|
@@ -230,7 +228,7 @@ const temperatureHelper = {
|
|
|
230
228
|
},
|
|
231
229
|
|
|
232
230
|
async _resetMinMax() {
|
|
233
|
-
this.adapter.log.debug('[temperatureHelper]
|
|
231
|
+
this.adapter.log.debug('[temperatureHelper] Resetting daily min/max');
|
|
234
232
|
for (const key of Object.keys(this.sensors)) {
|
|
235
233
|
// Bugfix: statt leeres Objekt → löschen, damit Neu-Init greift
|
|
236
234
|
delete this.minMax[key];
|
|
@@ -18,7 +18,7 @@ const timeHelper = {
|
|
|
18
18
|
// Minütlicher Check
|
|
19
19
|
this._scheduleCheck();
|
|
20
20
|
|
|
21
|
-
this.adapter.log.debug('[timeHelper]
|
|
21
|
+
this.adapter.log.debug('[timeHelper] Initialized (check every 60s)');
|
|
22
22
|
},
|
|
23
23
|
|
|
24
24
|
_scheduleCheck() {
|
|
@@ -39,7 +39,7 @@ const timeHelper = {
|
|
|
39
39
|
const activeHelper = (await this.adapter.getStateAsync('pump.active_helper'))?.val;
|
|
40
40
|
if (activeHelper === 'timeHelper') {
|
|
41
41
|
await this.adapter.setStateAsync('pump.active_helper', { val: '', ack: true });
|
|
42
|
-
this.adapter.log.debug('[timeHelper]
|
|
42
|
+
this.adapter.log.debug('[timeHelper] Time mode ended – priority released to solar/control.');
|
|
43
43
|
}
|
|
44
44
|
return;
|
|
45
45
|
} // nur aktiv im Zeitmodus
|
|
@@ -77,11 +77,11 @@ const timeHelper = {
|
|
|
77
77
|
const activeHelper = (await this.adapter.getStateAsync('pump.active_helper'))?.val;
|
|
78
78
|
if (shouldRun && activeHelper !== 'timeHelper') {
|
|
79
79
|
await this.adapter.setStateAsync('pump.active_helper', { val: 'timeHelper', ack: true });
|
|
80
|
-
this.adapter.log.debug('[timeHelper]
|
|
80
|
+
this.adapter.log.debug('[timeHelper] Priority claimed (time window active).');
|
|
81
81
|
}
|
|
82
82
|
if (!shouldRun && activeHelper === 'timeHelper') {
|
|
83
83
|
await this.adapter.setStateAsync('pump.active_helper', { val: '', ack: true });
|
|
84
|
-
this.adapter.log.debug('[timeHelper]
|
|
84
|
+
this.adapter.log.debug('[timeHelper] Priority released (time window ended).');
|
|
85
85
|
}
|
|
86
86
|
|
|
87
87
|
// --- Nur schalten, wenn sich der Zustand wirklich ändert ---
|
|
@@ -91,14 +91,12 @@ const timeHelper = {
|
|
|
91
91
|
val: shouldRun,
|
|
92
92
|
ack: false,
|
|
93
93
|
});
|
|
94
|
-
this.adapter.log.debug(`[timeHelper]
|
|
94
|
+
this.adapter.log.debug(`[timeHelper] Pump switch ${shouldRun ? 'ON' : 'OFF'} (${hhmm})`);
|
|
95
95
|
} else {
|
|
96
|
-
this.adapter.log.debug(
|
|
97
|
-
`[timeHelper] Keine Änderung (${hhmm}) – Zustand bleibt ${shouldRun ? 'EIN' : 'AUS'}.`,
|
|
98
|
-
);
|
|
96
|
+
this.adapter.log.debug(`[timeHelper] No change (${hhmm}) – state remains ${shouldRun ? 'ON' : 'OFF'}.`);
|
|
99
97
|
}
|
|
100
98
|
} catch (err) {
|
|
101
|
-
this.adapter.log.warn(`[timeHelper]
|
|
99
|
+
this.adapter.log.warn(`[timeHelper] Error during check: ${err.message}`);
|
|
102
100
|
}
|
|
103
101
|
},
|
|
104
102
|
|
|
@@ -28,7 +28,7 @@ async function createActuatorsStates(adapter) {
|
|
|
28
28
|
await adapter.setObjectNotExistsAsync('actuators', {
|
|
29
29
|
type: 'channel',
|
|
30
30
|
common: {
|
|
31
|
-
name: 'Zusatz-Aktoren',
|
|
31
|
+
name: { de: 'Zusatz-Aktoren', en: 'Additional actuators' },
|
|
32
32
|
},
|
|
33
33
|
native: {},
|
|
34
34
|
});
|
|
@@ -39,7 +39,7 @@ async function createActuatorsStates(adapter) {
|
|
|
39
39
|
await adapter.setObjectNotExistsAsync('actuators.lighting', {
|
|
40
40
|
type: 'channel',
|
|
41
41
|
common: {
|
|
42
|
-
name: 'Beleuchtung',
|
|
42
|
+
name: { de: 'Beleuchtung', en: 'Lighting' },
|
|
43
43
|
},
|
|
44
44
|
native: {},
|
|
45
45
|
});
|
|
@@ -50,7 +50,7 @@ async function createActuatorsStates(adapter) {
|
|
|
50
50
|
await adapter.setObjectNotExistsAsync(base, {
|
|
51
51
|
type: 'channel',
|
|
52
52
|
common: {
|
|
53
|
-
name: `Beleuchtung ${i}`,
|
|
53
|
+
name: { de: `Beleuchtung ${i}`, en: `Lighting ${i}` },
|
|
54
54
|
},
|
|
55
55
|
native: {},
|
|
56
56
|
});
|
|
@@ -58,7 +58,7 @@ async function createActuatorsStates(adapter) {
|
|
|
58
58
|
await adapter.setObjectNotExistsAsync(`${base}.switch`, {
|
|
59
59
|
type: 'state',
|
|
60
60
|
common: {
|
|
61
|
-
name: 'Schalten (Ein/Aus)',
|
|
61
|
+
name: { de: 'Schalten (Ein/Aus)', en: 'Switch (On/Off)' },
|
|
62
62
|
type: 'boolean',
|
|
63
63
|
role: 'switch',
|
|
64
64
|
read: true,
|
|
@@ -72,7 +72,7 @@ async function createActuatorsStates(adapter) {
|
|
|
72
72
|
await adapter.setObjectNotExistsAsync(`${base}.active`, {
|
|
73
73
|
type: 'state',
|
|
74
74
|
common: {
|
|
75
|
-
name: 'Aktiv',
|
|
75
|
+
name: { de: 'Aktiv', en: 'Active' },
|
|
76
76
|
type: 'boolean',
|
|
77
77
|
role: 'indicator',
|
|
78
78
|
read: true,
|
|
@@ -87,7 +87,7 @@ async function createActuatorsStates(adapter) {
|
|
|
87
87
|
await adapter.setObjectNotExistsAsync(`${base}.name`, {
|
|
88
88
|
type: 'state',
|
|
89
89
|
common: {
|
|
90
|
-
name: 'Name',
|
|
90
|
+
name: { de: 'Name', en: 'Name' },
|
|
91
91
|
type: 'string',
|
|
92
92
|
role: 'text',
|
|
93
93
|
read: true,
|
|
@@ -102,7 +102,7 @@ async function createActuatorsStates(adapter) {
|
|
|
102
102
|
await adapter.setObjectNotExistsAsync(`${base}.permanent`, {
|
|
103
103
|
type: 'state',
|
|
104
104
|
common: {
|
|
105
|
-
name: 'Dauerbetrieb',
|
|
105
|
+
name: { de: 'Dauerbetrieb', en: 'Continuous operation' },
|
|
106
106
|
type: 'boolean',
|
|
107
107
|
role: 'switch',
|
|
108
108
|
read: true,
|
|
@@ -117,7 +117,7 @@ async function createActuatorsStates(adapter) {
|
|
|
117
117
|
await adapter.setObjectNotExistsAsync(`${base}.runtime_minutes`, {
|
|
118
118
|
type: 'state',
|
|
119
119
|
common: {
|
|
120
|
-
name: 'Laufzeit (Minuten)',
|
|
120
|
+
name: { de: 'Laufzeit (Minuten)', en: 'Runtime (minutes)' },
|
|
121
121
|
type: 'number',
|
|
122
122
|
role: 'value',
|
|
123
123
|
read: true,
|
|
@@ -133,7 +133,7 @@ async function createActuatorsStates(adapter) {
|
|
|
133
133
|
await adapter.setObjectNotExistsAsync(`${base}.remaining_minutes`, {
|
|
134
134
|
type: 'state',
|
|
135
135
|
common: {
|
|
136
|
-
name: 'Restlaufzeit',
|
|
136
|
+
name: { de: 'Restlaufzeit', en: 'Remaining runtime' },
|
|
137
137
|
type: 'number',
|
|
138
138
|
role: 'value',
|
|
139
139
|
read: true,
|
|
@@ -147,7 +147,7 @@ async function createActuatorsStates(adapter) {
|
|
|
147
147
|
await adapter.setObjectNotExistsAsync(`${base}.status`, {
|
|
148
148
|
type: 'state',
|
|
149
149
|
common: {
|
|
150
|
-
name: 'Status',
|
|
150
|
+
name: { de: 'Status', en: 'Status' },
|
|
151
151
|
type: 'string',
|
|
152
152
|
role: 'text',
|
|
153
153
|
read: true,
|
|
@@ -164,7 +164,7 @@ async function createActuatorsStates(adapter) {
|
|
|
164
164
|
await adapter.setObjectNotExistsAsync('actuators.extrapumps', {
|
|
165
165
|
type: 'channel',
|
|
166
166
|
common: {
|
|
167
|
-
name: 'Zusatzpumpen & Attraktionen',
|
|
167
|
+
name: { de: 'Zusatzpumpen & Attraktionen', en: 'Auxiliary pumps & attractions' },
|
|
168
168
|
},
|
|
169
169
|
native: {},
|
|
170
170
|
});
|
|
@@ -175,7 +175,7 @@ async function createActuatorsStates(adapter) {
|
|
|
175
175
|
await adapter.setObjectNotExistsAsync(base, {
|
|
176
176
|
type: 'channel',
|
|
177
177
|
common: {
|
|
178
|
-
name: `Zusatzpumpe / Attraktion ${i}`,
|
|
178
|
+
name: { de: `Zusatzpumpe / Attraktion ${i}`, en: `Auxiliary pump / attraction ${i}` },
|
|
179
179
|
},
|
|
180
180
|
native: {},
|
|
181
181
|
});
|
|
@@ -183,7 +183,7 @@ async function createActuatorsStates(adapter) {
|
|
|
183
183
|
await adapter.setObjectNotExistsAsync(`${base}.switch`, {
|
|
184
184
|
type: 'state',
|
|
185
185
|
common: {
|
|
186
|
-
name: 'Schalten (Ein/Aus)',
|
|
186
|
+
name: { de: 'Schalten (Ein/Aus)', en: 'Switch (On/Off)' },
|
|
187
187
|
type: 'boolean',
|
|
188
188
|
role: 'switch',
|
|
189
189
|
read: true,
|
|
@@ -197,7 +197,7 @@ async function createActuatorsStates(adapter) {
|
|
|
197
197
|
await adapter.setObjectNotExistsAsync(`${base}.active`, {
|
|
198
198
|
type: 'state',
|
|
199
199
|
common: {
|
|
200
|
-
name: 'Aktiv',
|
|
200
|
+
name: { de: 'Aktiv', en: 'Active' },
|
|
201
201
|
type: 'boolean',
|
|
202
202
|
role: 'indicator',
|
|
203
203
|
read: true,
|
|
@@ -212,7 +212,7 @@ async function createActuatorsStates(adapter) {
|
|
|
212
212
|
await adapter.setObjectNotExistsAsync(`${base}.name`, {
|
|
213
213
|
type: 'state',
|
|
214
214
|
common: {
|
|
215
|
-
name: 'Name',
|
|
215
|
+
name: { de: 'Name', en: 'Name' },
|
|
216
216
|
type: 'string',
|
|
217
217
|
role: 'text',
|
|
218
218
|
read: true,
|
|
@@ -227,7 +227,7 @@ async function createActuatorsStates(adapter) {
|
|
|
227
227
|
await adapter.setObjectNotExistsAsync(`${base}.permanent`, {
|
|
228
228
|
type: 'state',
|
|
229
229
|
common: {
|
|
230
|
-
name: 'Dauerbetrieb',
|
|
230
|
+
name: { de: 'Dauerbetrieb', en: 'Continuous operation' },
|
|
231
231
|
type: 'boolean',
|
|
232
232
|
role: 'switch',
|
|
233
233
|
read: true,
|
|
@@ -242,7 +242,7 @@ async function createActuatorsStates(adapter) {
|
|
|
242
242
|
await adapter.setObjectNotExistsAsync(`${base}.runtime_minutes`, {
|
|
243
243
|
type: 'state',
|
|
244
244
|
common: {
|
|
245
|
-
name: 'Laufzeit (Minuten)',
|
|
245
|
+
name: { de: 'Laufzeit (Minuten)', en: 'Runtime (minutes)' },
|
|
246
246
|
type: 'number',
|
|
247
247
|
role: 'value',
|
|
248
248
|
read: true,
|
|
@@ -258,7 +258,7 @@ async function createActuatorsStates(adapter) {
|
|
|
258
258
|
await adapter.setObjectNotExistsAsync(`${base}.remaining_minutes`, {
|
|
259
259
|
type: 'state',
|
|
260
260
|
common: {
|
|
261
|
-
name: 'Restlaufzeit',
|
|
261
|
+
name: { de: 'Restlaufzeit', en: 'Remaining runtime' },
|
|
262
262
|
type: 'number',
|
|
263
263
|
role: 'value',
|
|
264
264
|
read: true,
|
|
@@ -272,7 +272,7 @@ async function createActuatorsStates(adapter) {
|
|
|
272
272
|
await adapter.setObjectNotExistsAsync(`${base}.status`, {
|
|
273
273
|
type: 'state',
|
|
274
274
|
common: {
|
|
275
|
-
name: 'Status',
|
|
275
|
+
name: { de: 'Status', en: 'Status' },
|
|
276
276
|
type: 'string',
|
|
277
277
|
role: 'text',
|
|
278
278
|
read: true,
|