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
|
@@ -44,14 +44,14 @@ const pumpHelper3 = {
|
|
|
44
44
|
*/
|
|
45
45
|
async init(adapter) {
|
|
46
46
|
this.adapter = adapter;
|
|
47
|
-
this.adapter.log.info('[pumpHelper3]
|
|
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]
|
|
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]
|
|
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]
|
|
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]
|
|
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]
|
|
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]
|
|
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]
|
|
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
|
|
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]
|
|
33
|
+
adapter.log.info(`[pumpHelper4] Initialization started (OID: ${this.pressureObjectId || 'not set'})`);
|
|
34
34
|
|
|
35
35
|
if (!this.pressureObjectId) {
|
|
36
|
-
adapter.log.info('[pumpHelper4]
|
|
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]
|
|
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]
|
|
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]
|
|
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]
|
|
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]
|
|
301
|
+
this.adapter.log.debug(`[pumpHelper4] Pressure updated: ${newBar} bar (previous: ${previous} bar)`);
|
|
302
302
|
} catch (err) {
|
|
303
|
-
this.adapter.log.warn(`[pumpHelper4]
|
|
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
|
|
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]
|
|
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]
|
|
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]
|
|
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
|
|
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
|
|
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
|
|
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]
|
|
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]
|
|
54
|
+
this.adapter.log.debug('[runtimeHelper] Initialized (with restore)');
|
|
55
55
|
})
|
|
56
56
|
.catch(err => {
|
|
57
|
-
this.adapter.log.warn(`[runtimeHelper] Restore
|
|
57
|
+
this.adapter.log.warn(`[runtimeHelper] Restore failed: ${err.message}`);
|
|
58
58
|
this._scheduleDailyReset();
|
|
59
59
|
this._updateStates();
|
|
60
|
-
this.adapter.log.debug('[runtimeHelper]
|
|
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]
|
|
73
|
+
'[runtimeHelper] No saved runtimes found – possibly 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]
|
|
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]
|
|
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]
|
|
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
|
|
225
|
+
`[runtimeHelper] Circulation values updated (Total=${dailyTotal}, Required=${dailyRequired}, Remaining=${dailyRemaining})`,
|
|
226
226
|
);
|
|
227
227
|
} else {
|
|
228
228
|
this.adapter.log.debug(
|
|
229
|
-
`[runtimeHelper]
|
|
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]
|
|
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]
|
|
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
|
|
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
|
|
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]
|
|
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]
|
|
38
|
+
this.adapter.log.debug('[solarHelper] Priority by ControlHelper active – solar 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]
|
|
44
|
+
this.adapter.log.debug('[solarHelper] Priority by TimeHelper active – solar 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]
|
|
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]
|
|
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]
|
|
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]
|
|
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]
|
|
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]
|
|
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]
|
|
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]
|
|
105
|
+
`[speechHelper] Temperature announcement suppressed (tempDiff=${tempDiff.toFixed(
|
|
106
106
|
1,
|
|
107
|
-
)}°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
|
|
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]
|
|
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
|
|
186
|
+
this.adapter.log.info(`[speechHelper] Alexa says: ${text}`);
|
|
187
187
|
} else {
|
|
188
|
-
this.adapter.log.debug('[speechHelper] Alexa
|
|
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
|
|
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]
|
|
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]
|
|
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]
|
|
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
|
|
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]
|
|
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]
|
|
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]
|
|
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
|
|
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
|
|
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]
|
|
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]
|
|
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]
|
|
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]
|
|
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]
|
|
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
|
|
169
|
+
this.adapter.log.debug(`[speechTextHelper] Text sent: ${text}`);
|
|
170
170
|
} catch (err) {
|
|
171
|
-
this.adapter.log.warn(`[speechTextHelper]
|
|
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]
|
|
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:
|
|
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]
|
|
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:
|
|
63
|
+
adapter.log.debug('statisticsHelper: Initialization completed (sensor monitoring active).');
|
|
64
64
|
} catch (err) {
|
|
65
|
-
adapter.log.warn(`statisticsHelper:
|
|
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]
|
|
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]
|
|
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:
|
|
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:
|
|
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:
|
|
510
|
+
adapter.log.debug('statisticsHelper: Daily statistics reset completed.');
|
|
511
511
|
},
|
|
512
512
|
|
|
513
513
|
/**
|