iobroker.poolcontrol 0.6.2 → 0.6.3
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/io-package.json +14 -13
- package/lib/helpers/consumptionHelper.js +76 -0
- package/lib/helpers/frostHelper.js +27 -0
- package/package.json +1 -1
package/io-package.json
CHANGED
|
@@ -1,8 +1,21 @@
|
|
|
1
1
|
{
|
|
2
2
|
"common": {
|
|
3
3
|
"name": "poolcontrol",
|
|
4
|
-
"version": "0.6.
|
|
4
|
+
"version": "0.6.3",
|
|
5
5
|
"news": {
|
|
6
|
+
"0.6.3": {
|
|
7
|
+
"en": "Fix for weekly, monthly and yearly reset in consumptionHelper",
|
|
8
|
+
"de": "Fix für Wochen-, Monats- und Jahres-Reset im ConsumptionHelper",
|
|
9
|
+
"ru": "Исправление еженедельного, ежемесячного и ежегодного сброса в consumptionHelper",
|
|
10
|
+
"pt": "Correção para redefinição semanal, mensal e anual no consumptionHelper",
|
|
11
|
+
"nl": "Fix voor wekelijkse, maandelijkse en jaarlijkse reset in consumptionHelper",
|
|
12
|
+
"fr": "Correctif pour la réinitialisation hebdomadaire, mensuelle et annuelle dans consumptionHelper",
|
|
13
|
+
"it": "Correzione per il reset settimanale, mensile e annuale in consumptionHelper",
|
|
14
|
+
"es": "Corrección para el reinicio semanal, mensual y anual en consumptionHelper",
|
|
15
|
+
"pl": "Poprawka cotygodniowego, comiesięcznego i corocznego resetu w consumptionHelper",
|
|
16
|
+
"uk": "Виправлення щотижневого, щомісячного та щорічного скидання в consumptionHelper",
|
|
17
|
+
"zh-cn": "修复 consumptionHelper 中每周、每月和每年重置的问题"
|
|
18
|
+
},
|
|
6
19
|
"0.6.2": {
|
|
7
20
|
"en": "UI refinement and admin interface improvements. Added image integration ('Egon in blue overalls') for visual identification. Speech system extended with Alexa output time configuration. Cleaned and optimized jsonConfig with section headers for improved clarity.",
|
|
8
21
|
"de": "Oberflächenüberarbeitung und Verbesserungen der Admin-Ansicht. Bildintegration ('Egon im Blaumann') zur visuellen Wiedererkennung hinzugefügt. Sprachsystem um konfigurierbare Alexa-Ausgabezeiten erweitert. jsonConfig mit Abschnittsüberschriften bereinigt und übersichtlicher gestaltet.",
|
|
@@ -78,18 +91,6 @@
|
|
|
78
91
|
"pl": "Dodano wybór użytkowników dla powiadomień Telegram. Gdy nie wybrano żadnego użytkownika, wiadomości są wysyłane globalnie jak wcześniej; po podaniu jednego lub kilku nazw użytkowników wiadomości otrzymują tylko oni. Ulepszono UI administracyjne (pole odbiorców pod instancją). Zaktualizowano speechHelper i jsonConfig.json.",
|
|
79
92
|
"uk": "Додано вибір користувачів для сповіщень Telegram. Якщо користувача не вибрано, повідомлення надсилаються глобально, як і раніше; якщо вказано одне чи кілька імен, їх отримують лише ці користувачі. Візуально покращено інтерфейс адміністрування (поле одержувача під екземпляром). Оновлено speechHelper та jsonConfig.json.",
|
|
80
93
|
"zh-cn": "新增 Telegram 通知的用户选择功能。未选择用户时消息将像以前一样全局发送;指定一个或多个用户名时,仅这些用户会收到消息。优化了管理界面显示(收件人字段缩进至实例下方)。已更新 speechHelper 和 jsonConfig.json。"
|
|
81
|
-
},
|
|
82
|
-
"0.5.2": {
|
|
83
|
-
"en": "Extended helper priority system: fixed time/solar conflicts, frost pauses during time windows. Stable pump behavior and improved coordination between helpers.",
|
|
84
|
-
"de": "Erweitertes Helper-Vorrangsystem: Konflikte zwischen Zeit- und Solarsteuerung behoben, Frostschutz pausiert während Zeitfenstern. Stabiles Pumpenverhalten und verbesserte Koordination zwischen den Helpern.",
|
|
85
|
-
"ru": "Расширена система приоритетов помощников: устранены конфликты между таймером и солнечным управлением, мороз приостанавливается во время временных окон. Стабильная работа насоса и улучшенная координация между помощниками.",
|
|
86
|
-
"pt": "Sistema de prioridade dos helpers expandido: corrigidos conflitos de tempo/solar, proteção contra geada pausa durante janelas de tempo. Comportamento estável da bomba e melhor coordenação entre helpers.",
|
|
87
|
-
"nl": "Uitgebreid helperprioriteitssysteem: conflicten tussen tijd- en zonregeling opgelost, vorstbeveiliging pauzeert tijdens tijdvensters. Stabiel pompgedrag en betere coördinatie tussen helpers.",
|
|
88
|
-
"fr": "Système de priorité des helpers étendu : conflits temps/solaire corrigés, protection antigel en pause pendant les plages horaires. Comportement de pompe stable et meilleure coordination entre les helpers.",
|
|
89
|
-
"it": "Sistema di priorità degli helper esteso: risolti i conflitti tempo/solare, la protezione antigelo si mette in pausa durante le finestre temporali. Comportamento stabile della pompa e migliore coordinamento tra gli helper.",
|
|
90
|
-
"es": "Sistema de prioridad de helpers ampliado: solucionados los conflictos de tiempo/solar, la protección contra heladas se pausa durante las ventanas de tiempo. Comportamiento estable de la bomba y mejor coordinación entre helpers.",
|
|
91
|
-
"pl": "Rozszerzony system priorytetów helperów: naprawiono konflikty między czasem a sterowaniem solarnym, ochrona przed mrozem wstrzymuje się podczas okien czasowych. Stabilne działanie pompy i lepsza koordynacja między helperami.",
|
|
92
|
-
"zh-cn": "扩展的助手优先级系统:修复时间/太阳能冲突,防冻在时间窗口内暂停。泵运行稳定,助手之间协调更好。"
|
|
93
94
|
}
|
|
94
95
|
},
|
|
95
96
|
"titleLang": {
|
|
@@ -39,6 +39,11 @@ const consumptionHelper = {
|
|
|
39
39
|
this._scheduleDailyReset();
|
|
40
40
|
this._loadCostBaselines();
|
|
41
41
|
this._restoreBaselinesFromStates();
|
|
42
|
+
|
|
43
|
+
// NEU: regelmäßige Perioden-Resets
|
|
44
|
+
this._scheduleWeeklyReset();
|
|
45
|
+
this._scheduleMonthlyReset();
|
|
46
|
+
this._scheduleYearlyReset();
|
|
42
47
|
},
|
|
43
48
|
|
|
44
49
|
async _loadCostBaselines() {
|
|
@@ -262,6 +267,77 @@ const consumptionHelper = {
|
|
|
262
267
|
}, msUntilMidnight);
|
|
263
268
|
},
|
|
264
269
|
|
|
270
|
+
// ---------------------------------------------------------
|
|
271
|
+
// 🔵 WÖCHENTLICHER RESET (Montag 00:05 Uhr)
|
|
272
|
+
// ---------------------------------------------------------
|
|
273
|
+
_scheduleWeeklyReset() {
|
|
274
|
+
const now = new Date();
|
|
275
|
+
const next = new Date(now);
|
|
276
|
+
|
|
277
|
+
// Montag = 1 (Sonntag = 0)
|
|
278
|
+
const day = now.getDay();
|
|
279
|
+
const daysUntilMonday = (1 - day + 7) % 7;
|
|
280
|
+
|
|
281
|
+
next.setDate(now.getDate() + daysUntilMonday);
|
|
282
|
+
next.setHours(0, 5, 0, 0);
|
|
283
|
+
|
|
284
|
+
const delay = next - now;
|
|
285
|
+
|
|
286
|
+
setTimeout(async () => {
|
|
287
|
+
try {
|
|
288
|
+
this.adapter.log.info('[consumptionHelper] Wochen-Reset (Montag 00:05)');
|
|
289
|
+
await this.adapter.setStateAsync('consumption.week_kwh', { val: 0, ack: true });
|
|
290
|
+
await this.adapter.setStateAsync('costs.week_eur', { val: 0, ack: true });
|
|
291
|
+
this.baselines.week = (await this.adapter.getStateAsync('consumption.total_kwh'))?.val || 0;
|
|
292
|
+
} catch (err) {
|
|
293
|
+
this.adapter.log.warn(`[consumptionHelper] Fehler beim Wochenreset: ${err.message}`);
|
|
294
|
+
}
|
|
295
|
+
this._scheduleWeeklyReset(); // erneut planen
|
|
296
|
+
}, delay);
|
|
297
|
+
},
|
|
298
|
+
|
|
299
|
+
// ---------------------------------------------------------
|
|
300
|
+
// 🔵 MONATLICHER RESET (1. des Monats 00:05 Uhr)
|
|
301
|
+
// ---------------------------------------------------------
|
|
302
|
+
_scheduleMonthlyReset() {
|
|
303
|
+
const now = new Date();
|
|
304
|
+
const next = new Date(now.getFullYear(), now.getMonth() + 1, 1, 0, 5, 0, 0);
|
|
305
|
+
const delay = next - now;
|
|
306
|
+
|
|
307
|
+
setTimeout(async () => {
|
|
308
|
+
try {
|
|
309
|
+
this.adapter.log.info('[consumptionHelper] Monats-Reset (1. 00:05)');
|
|
310
|
+
await this.adapter.setStateAsync('consumption.month_kwh', { val: 0, ack: true });
|
|
311
|
+
await this.adapter.setStateAsync('costs.month_eur', { val: 0, ack: true });
|
|
312
|
+
this.baselines.month = (await this.adapter.getStateAsync('consumption.total_kwh'))?.val || 0;
|
|
313
|
+
} catch (err) {
|
|
314
|
+
this.adapter.log.warn(`[consumptionHelper] Fehler beim Monatsreset: ${err.message}`);
|
|
315
|
+
}
|
|
316
|
+
this._scheduleMonthlyReset();
|
|
317
|
+
}, delay);
|
|
318
|
+
},
|
|
319
|
+
|
|
320
|
+
// ---------------------------------------------------------
|
|
321
|
+
// 🔵 JÄHRLICHER RESET (1. Januar 00:10 Uhr)
|
|
322
|
+
// ---------------------------------------------------------
|
|
323
|
+
_scheduleYearlyReset() {
|
|
324
|
+
const now = new Date();
|
|
325
|
+
const next = new Date(now.getFullYear() + 1, 0, 1, 0, 10, 0, 0);
|
|
326
|
+
const delay = next - now;
|
|
327
|
+
|
|
328
|
+
setTimeout(async () => {
|
|
329
|
+
try {
|
|
330
|
+
this.adapter.log.info('[consumptionHelper] Jahres-Reset (1. Januar 00:10)');
|
|
331
|
+
await this.adapter.setStateAsync('consumption.year_kwh', { val: 0, ack: true });
|
|
332
|
+
await this.adapter.setStateAsync('costs.year_eur', { val: 0, ack: true });
|
|
333
|
+
this.baselines.year = (await this.adapter.getStateAsync('consumption.total_kwh'))?.val || 0;
|
|
334
|
+
} catch (err) {
|
|
335
|
+
this.adapter.log.warn(`[consumptionHelper] Fehler beim Jahresreset: ${err.message}`);
|
|
336
|
+
}
|
|
337
|
+
this._scheduleYearlyReset();
|
|
338
|
+
}, delay);
|
|
339
|
+
},
|
|
340
|
+
|
|
265
341
|
cleanup() {
|
|
266
342
|
if (this.resetTimer) {
|
|
267
343
|
clearTimeout(this.resetTimer);
|
|
@@ -13,6 +13,9 @@ const frostHelper = {
|
|
|
13
13
|
adapter: null,
|
|
14
14
|
checkTimer: null,
|
|
15
15
|
|
|
16
|
+
// NEU: interner Zwischenspeicher für den vorherigen Modus, um nach Frost sauber zurückzuspringen
|
|
17
|
+
_prevModeBeforeFrost: null, // ENDE NEU
|
|
18
|
+
|
|
16
19
|
init(adapter) {
|
|
17
20
|
this.adapter = adapter;
|
|
18
21
|
|
|
@@ -92,6 +95,30 @@ const frostHelper = {
|
|
|
92
95
|
|
|
93
96
|
// Schalten nur, wenn sich etwas ändert
|
|
94
97
|
if (shouldRun !== pumpActive) {
|
|
98
|
+
// NEU: Beim Einschalten Modus/Helper setzen und vorherigen Modus merken
|
|
99
|
+
if (shouldRun) {
|
|
100
|
+
// Nur merken, wenn wir nicht bereits im Frostmodus sind
|
|
101
|
+
const currentMode = (await this.adapter.getStateAsync('pump.mode'))?.val || 'auto';
|
|
102
|
+
if (this._prevModeBeforeFrost == null) {
|
|
103
|
+
this._prevModeBeforeFrost = currentMode;
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
// Frost als aktiven Helper/Modus setzen (damit der pumpHelper "EIN (Frostschutz)" anzeigt)
|
|
107
|
+
await this.adapter.setStateAsync('pump.active_helper', { val: 'frostHelper', ack: true });
|
|
108
|
+
await this.adapter.setStateAsync('pump.mode', { val: 'frostHelper', ack: true });
|
|
109
|
+
} else {
|
|
110
|
+
// Ausschalten: Nur zurücksetzen, wenn der Frosthelfer wirklich aktiv war
|
|
111
|
+
const activeHelperNow = (await this.adapter.getStateAsync('pump.active_helper'))?.val || '';
|
|
112
|
+
if (activeHelperNow === 'frostHelper') {
|
|
113
|
+
const modeToRestore = this._prevModeBeforeFrost || 'auto';
|
|
114
|
+
await this.adapter.setStateAsync('pump.active_helper', { val: '', ack: true });
|
|
115
|
+
await this.adapter.setStateAsync('pump.mode', { val: modeToRestore, ack: true });
|
|
116
|
+
}
|
|
117
|
+
// internen Zwischenspeicher nach Ende löschen
|
|
118
|
+
this._prevModeBeforeFrost = null;
|
|
119
|
+
}
|
|
120
|
+
// ENDE NEU
|
|
121
|
+
|
|
95
122
|
await this.adapter.setStateAsync('pump.pump_switch', {
|
|
96
123
|
val: shouldRun,
|
|
97
124
|
ack: false,
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "iobroker.poolcontrol",
|
|
3
|
-
"version": "0.6.
|
|
3
|
+
"version": "0.6.3",
|
|
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",
|