iobroker.poolcontrol 0.2.0 → 0.2.2
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 +42 -67
- package/io-package.json +34 -30
- package/lib/helpers/consumptionHelper.js +6 -6
- package/lib/helpers/controlHelper.js +209 -50
- package/lib/helpers/controlHelper2.js +195 -0
- package/lib/helpers/debugLogHelper.js +5 -5
- package/lib/helpers/frostHelper.js +18 -2
- package/lib/helpers/pumpHelper.js +41 -8
- package/lib/helpers/runtimeHelper.js +36 -6
- package/lib/helpers/solarHelper.js +36 -12
- package/lib/helpers/speechHelper.js +68 -40
- package/lib/helpers/speechTextHelper.js +184 -0
- package/lib/helpers/statusHelper.js +2 -2
- package/lib/helpers/temperatureHelper.js +2 -2
- package/lib/helpers/timeHelper.js +10 -1
- package/lib/stateDefinitions/controlStates.js +128 -0
- package/lib/stateDefinitions/pumpStates.js +19 -0
- package/lib/stateDefinitions/runtimeStates.js +1 -1
- package/lib/stateDefinitions/speechStates.js +58 -0
- package/lib/stateDefinitions/statusStates.js +4 -0
- package/main.js +18 -0
- package/package.json +3 -2
|
@@ -118,6 +118,70 @@ async function createControlStates(adapter) {
|
|
|
118
118
|
});
|
|
119
119
|
await adapter.setStateAsync('control.pump.backwash_duration', { val: 1, ack: true });
|
|
120
120
|
|
|
121
|
+
// >>> NEU: Rückspülerinnerung
|
|
122
|
+
await adapter.setObjectNotExistsAsync('control.pump.backwash_reminder_active', {
|
|
123
|
+
type: 'state',
|
|
124
|
+
common: {
|
|
125
|
+
name: 'Rückspülerinnerung aktiv',
|
|
126
|
+
desc: 'Wenn aktiviert, erinnert der Adapter automatisch nach Ablauf des eingestellten Intervalls an die Rückspülung',
|
|
127
|
+
type: 'boolean',
|
|
128
|
+
role: 'switch',
|
|
129
|
+
read: true,
|
|
130
|
+
write: true,
|
|
131
|
+
def: false,
|
|
132
|
+
},
|
|
133
|
+
native: {},
|
|
134
|
+
});
|
|
135
|
+
await adapter.setStateAsync('control.pump.backwash_reminder_active', { val: false, ack: true });
|
|
136
|
+
|
|
137
|
+
await adapter.setObjectNotExistsAsync('control.pump.backwash_interval_days', {
|
|
138
|
+
type: 'state',
|
|
139
|
+
common: {
|
|
140
|
+
name: 'Rückspülerinnerung: Intervall (Tage)',
|
|
141
|
+
desc: 'Anzahl Tage, nach denen eine Erinnerung für die Rückspülung erfolgt',
|
|
142
|
+
type: 'number',
|
|
143
|
+
role: 'value.interval',
|
|
144
|
+
unit: 'Tage',
|
|
145
|
+
read: true,
|
|
146
|
+
write: true,
|
|
147
|
+
def: 7,
|
|
148
|
+
min: 1,
|
|
149
|
+
max: 60,
|
|
150
|
+
},
|
|
151
|
+
native: {},
|
|
152
|
+
});
|
|
153
|
+
await adapter.setStateAsync('control.pump.backwash_interval_days', { val: 7, ack: true });
|
|
154
|
+
|
|
155
|
+
await adapter.setObjectNotExistsAsync('control.pump.backwash_last_date', {
|
|
156
|
+
type: 'state',
|
|
157
|
+
common: {
|
|
158
|
+
name: 'Letzte Rückspülung (Datum)',
|
|
159
|
+
desc: 'Zeitstempel der letzten ausgeführten Rückspülung, dient der Erinnerungsberechnung',
|
|
160
|
+
type: 'string',
|
|
161
|
+
role: 'date',
|
|
162
|
+
read: true,
|
|
163
|
+
write: false,
|
|
164
|
+
},
|
|
165
|
+
native: {},
|
|
166
|
+
});
|
|
167
|
+
await adapter.setStateAsync('control.pump.backwash_last_date', { val: '', ack: true });
|
|
168
|
+
|
|
169
|
+
await adapter.setObjectNotExistsAsync('control.pump.backwash_required', {
|
|
170
|
+
type: 'state',
|
|
171
|
+
common: {
|
|
172
|
+
name: 'Rückspülung erforderlich',
|
|
173
|
+
desc: 'Wird automatisch auf true gesetzt, wenn die eingestellte Rückspülzeit überschritten wurde',
|
|
174
|
+
type: 'boolean',
|
|
175
|
+
role: 'indicator.alarm',
|
|
176
|
+
read: true,
|
|
177
|
+
write: false,
|
|
178
|
+
def: false,
|
|
179
|
+
},
|
|
180
|
+
native: {},
|
|
181
|
+
});
|
|
182
|
+
await adapter.setStateAsync('control.pump.backwash_required', { val: false, ack: true });
|
|
183
|
+
|
|
184
|
+
// ---------------------------------------------------------------------
|
|
121
185
|
// Wartungsmodus aktiv
|
|
122
186
|
await adapter.setObjectNotExistsAsync('control.pump.maintenance_active', {
|
|
123
187
|
type: 'state',
|
|
@@ -176,6 +240,70 @@ async function createControlStates(adapter) {
|
|
|
176
240
|
native: {},
|
|
177
241
|
});
|
|
178
242
|
await adapter.setStateAsync('control.energy.reset', { val: false, ack: true });
|
|
243
|
+
|
|
244
|
+
// ---------------------------------------------------------------------
|
|
245
|
+
// Channel: control.circulation
|
|
246
|
+
await adapter.setObjectNotExistsAsync('control.circulation', {
|
|
247
|
+
type: 'channel',
|
|
248
|
+
common: {
|
|
249
|
+
name: 'Tagesumwälzungs-Steuerung',
|
|
250
|
+
desc: 'Automatische oder manuelle Prüfung der täglichen Umwälzmenge',
|
|
251
|
+
},
|
|
252
|
+
native: {},
|
|
253
|
+
});
|
|
254
|
+
|
|
255
|
+
// State: Modus (auto/manual/notify/off)
|
|
256
|
+
await adapter.setObjectNotExistsAsync('control.circulation.mode', {
|
|
257
|
+
type: 'state',
|
|
258
|
+
common: {
|
|
259
|
+
name: 'Modus der Umwälzungsprüfung',
|
|
260
|
+
desc: 'Legt fest, ob und wie die Tagesumwälzung geprüft und ggf. nachgepumpt wird',
|
|
261
|
+
type: 'string',
|
|
262
|
+
role: 'value',
|
|
263
|
+
read: true,
|
|
264
|
+
write: true,
|
|
265
|
+
def: 'notify',
|
|
266
|
+
states: {
|
|
267
|
+
auto: 'Automatik',
|
|
268
|
+
manual: 'Manuell',
|
|
269
|
+
notify: 'Nur benachrichtigen',
|
|
270
|
+
off: 'Aus',
|
|
271
|
+
},
|
|
272
|
+
},
|
|
273
|
+
native: {},
|
|
274
|
+
});
|
|
275
|
+
await adapter.setStateAsync('control.circulation.mode', { val: 'notify', ack: true });
|
|
276
|
+
|
|
277
|
+
// State: Prüfzeitpunkt
|
|
278
|
+
await adapter.setObjectNotExistsAsync('control.circulation.check_time', {
|
|
279
|
+
type: 'state',
|
|
280
|
+
common: {
|
|
281
|
+
name: 'Prüfzeitpunkt für Tagesumwälzung',
|
|
282
|
+
desc: 'Uhrzeit, zu der täglich die Tagesumwälzung geprüft und ggf. gemeldet wird (Format HH:MM)',
|
|
283
|
+
type: 'string',
|
|
284
|
+
role: 'value.time',
|
|
285
|
+
read: true,
|
|
286
|
+
write: true,
|
|
287
|
+
def: '18:00',
|
|
288
|
+
},
|
|
289
|
+
native: {},
|
|
290
|
+
});
|
|
291
|
+
await adapter.setStateAsync('control.circulation.check_time', { val: '18:00', ack: true });
|
|
292
|
+
|
|
293
|
+
// State: letzter Bericht
|
|
294
|
+
await adapter.setObjectNotExistsAsync('control.circulation.last_report', {
|
|
295
|
+
type: 'state',
|
|
296
|
+
common: {
|
|
297
|
+
name: 'Letzter Bericht zur Tagesumwälzung',
|
|
298
|
+
desc: 'Zeitstempel des letzten automatisch erzeugten Umwälzungs-Reports',
|
|
299
|
+
type: 'string',
|
|
300
|
+
role: 'date',
|
|
301
|
+
read: true,
|
|
302
|
+
write: false,
|
|
303
|
+
},
|
|
304
|
+
native: {},
|
|
305
|
+
});
|
|
306
|
+
await adapter.setStateAsync('control.circulation.last_report', { val: '', ack: true });
|
|
179
307
|
} catch (err) {
|
|
180
308
|
adapter.log.error(`[controlStates] Fehler beim Erstellen der Control-States: ${err.message}`);
|
|
181
309
|
}
|
|
@@ -149,6 +149,25 @@ async function createPumpStates(adapter) {
|
|
|
149
149
|
});
|
|
150
150
|
await adapter.setStateAsync('pump.status', { val: 'AUS', ack: true });
|
|
151
151
|
|
|
152
|
+
// Aktiver Helfer (Vorrangsteuerung)
|
|
153
|
+
await adapter.setObjectNotExistsAsync('pump.active_helper', {
|
|
154
|
+
type: 'state',
|
|
155
|
+
common: {
|
|
156
|
+
name: 'Aktiver Helfer (Vorrangsteuerung)',
|
|
157
|
+
desc: 'Zeigt an, welcher Helper aktuell die Vorrangsteuerung der Pumpe übernommen hat (z. B. Control, Solar, Frost, Zeit, Heizung …)',
|
|
158
|
+
type: 'string',
|
|
159
|
+
role: 'text',
|
|
160
|
+
read: true,
|
|
161
|
+
write: false, // Nur intern schreibbar
|
|
162
|
+
hidden: false, // Sichtbar, damit Nutzer den aktiven Helper sehen kann
|
|
163
|
+
},
|
|
164
|
+
native: {},
|
|
165
|
+
});
|
|
166
|
+
await adapter.setStateAsync('pump.active_helper', {
|
|
167
|
+
val: '',
|
|
168
|
+
ack: true,
|
|
169
|
+
});
|
|
170
|
+
|
|
152
171
|
// Pumpenfehler (bool)
|
|
153
172
|
await adapter.setObjectNotExistsAsync('pump.error', {
|
|
154
173
|
type: 'state',
|
|
@@ -4,6 +4,7 @@
|
|
|
4
4
|
* Legt alle States für Sprachausgaben an:
|
|
5
5
|
* - speech.active
|
|
6
6
|
* - speech.last_text
|
|
7
|
+
* - speech.queue
|
|
7
8
|
* - speech.start_text, speech.end_text
|
|
8
9
|
* - speech.texts.[sensor] (Temperaturtexte)
|
|
9
10
|
*
|
|
@@ -43,11 +44,27 @@ async function createSpeechStates(adapter) {
|
|
|
43
44
|
role: 'text',
|
|
44
45
|
read: true,
|
|
45
46
|
write: true,
|
|
47
|
+
persist: true,
|
|
46
48
|
},
|
|
47
49
|
native: {},
|
|
48
50
|
});
|
|
49
51
|
await adapter.setStateAsync('speech.last_text', { val: '', ack: true });
|
|
50
52
|
|
|
53
|
+
// Interner Nachrichtenpuffer für Sprach-Trigger
|
|
54
|
+
await adapter.setObjectNotExistsAsync('speech.queue', {
|
|
55
|
+
type: 'state',
|
|
56
|
+
common: {
|
|
57
|
+
name: 'Interne Sprach-Nachrichtenwarteschlange',
|
|
58
|
+
desc: 'Dient als Übergabepunkt für Textmeldungen aus anderen Modulen (nicht vom Benutzer beschreibbar)',
|
|
59
|
+
type: 'string',
|
|
60
|
+
role: 'text',
|
|
61
|
+
read: true,
|
|
62
|
+
write: false, // kein externes Schreiben erlaubt
|
|
63
|
+
},
|
|
64
|
+
native: {},
|
|
65
|
+
});
|
|
66
|
+
await adapter.setStateAsync('speech.queue', { val: '', ack: true });
|
|
67
|
+
|
|
51
68
|
// Start-/Endtexte
|
|
52
69
|
await adapter.setObjectNotExistsAsync('speech.start_text', {
|
|
53
70
|
type: 'state',
|
|
@@ -80,6 +97,47 @@ async function createSpeechStates(adapter) {
|
|
|
80
97
|
val: 'Die Poolpumpe wurde gestoppt.',
|
|
81
98
|
ack: true,
|
|
82
99
|
});
|
|
100
|
+
|
|
101
|
+
// versteckte Dateien
|
|
102
|
+
|
|
103
|
+
await adapter.setObjectNotExistsAsync('speech.solar_active', {
|
|
104
|
+
type: 'state',
|
|
105
|
+
common: {
|
|
106
|
+
name: 'Solarsteuerung aktiv',
|
|
107
|
+
type: 'boolean',
|
|
108
|
+
role: 'indicator',
|
|
109
|
+
read: true,
|
|
110
|
+
write: true,
|
|
111
|
+
hidden: true, // unsichtbar im Admin
|
|
112
|
+
},
|
|
113
|
+
native: {},
|
|
114
|
+
});
|
|
115
|
+
|
|
116
|
+
await adapter.setObjectNotExistsAsync('speech.time_active', {
|
|
117
|
+
type: 'state',
|
|
118
|
+
common: {
|
|
119
|
+
name: 'Zeitsteuerung aktiv',
|
|
120
|
+
type: 'boolean',
|
|
121
|
+
role: 'indicator',
|
|
122
|
+
read: true,
|
|
123
|
+
write: true,
|
|
124
|
+
hidden: true, // unsichtbar im Admin
|
|
125
|
+
},
|
|
126
|
+
native: {},
|
|
127
|
+
});
|
|
128
|
+
|
|
129
|
+
await adapter.setObjectNotExistsAsync('speech.frost_active', {
|
|
130
|
+
type: 'state',
|
|
131
|
+
common: {
|
|
132
|
+
name: 'Frostschutz aktiv',
|
|
133
|
+
type: 'boolean',
|
|
134
|
+
role: 'indicator',
|
|
135
|
+
read: true,
|
|
136
|
+
write: true,
|
|
137
|
+
hidden: true, // unsichtbar im Admin
|
|
138
|
+
},
|
|
139
|
+
native: {},
|
|
140
|
+
});
|
|
83
141
|
}
|
|
84
142
|
|
|
85
143
|
module.exports = {
|
|
@@ -76,6 +76,7 @@ async function createStatusStates(adapter) {
|
|
|
76
76
|
role: 'date',
|
|
77
77
|
read: true,
|
|
78
78
|
write: false,
|
|
79
|
+
persist: true,
|
|
79
80
|
},
|
|
80
81
|
native: {},
|
|
81
82
|
});
|
|
@@ -90,6 +91,7 @@ async function createStatusStates(adapter) {
|
|
|
90
91
|
role: 'date',
|
|
91
92
|
read: true,
|
|
92
93
|
write: false,
|
|
94
|
+
persist: true,
|
|
93
95
|
},
|
|
94
96
|
native: {},
|
|
95
97
|
});
|
|
@@ -104,6 +106,7 @@ async function createStatusStates(adapter) {
|
|
|
104
106
|
role: 'indicator',
|
|
105
107
|
read: true,
|
|
106
108
|
write: false,
|
|
109
|
+
persist: true,
|
|
107
110
|
},
|
|
108
111
|
native: {},
|
|
109
112
|
});
|
|
@@ -118,6 +121,7 @@ async function createStatusStates(adapter) {
|
|
|
118
121
|
role: 'value',
|
|
119
122
|
read: true,
|
|
120
123
|
write: false,
|
|
124
|
+
persist: true,
|
|
121
125
|
},
|
|
122
126
|
native: {},
|
|
123
127
|
});
|
package/main.js
CHANGED
|
@@ -15,7 +15,9 @@ const solarHelper = require('./lib/helpers/solarHelper');
|
|
|
15
15
|
const frostHelper = require('./lib/helpers/frostHelper');
|
|
16
16
|
const statusHelper = require('./lib/helpers/statusHelper');
|
|
17
17
|
const controlHelper = require('./lib/helpers/controlHelper');
|
|
18
|
+
const controlHelper2 = require('./lib/helpers/controlHelper2');
|
|
18
19
|
const debugLogHelper = require('./lib/helpers/debugLogHelper');
|
|
20
|
+
const speechTextHelper = require('./lib/helpers/speechTextHelper');
|
|
19
21
|
const { createTemperatureStates } = require('./lib/stateDefinitions/temperatureStates');
|
|
20
22
|
const { createPumpStates } = require('./lib/stateDefinitions/pumpStates');
|
|
21
23
|
const { createSolarStates } = require('./lib/stateDefinitions/solarStates');
|
|
@@ -92,7 +94,9 @@ class Poolcontrol extends utils.Adapter {
|
|
|
92
94
|
frostHelper.init(this);
|
|
93
95
|
statusHelper.init(this);
|
|
94
96
|
controlHelper.init(this);
|
|
97
|
+
controlHelper2.init(this);
|
|
95
98
|
debugLogHelper.init(this);
|
|
99
|
+
speechTextHelper.init(this);
|
|
96
100
|
}
|
|
97
101
|
|
|
98
102
|
onUnload(callback) {
|
|
@@ -127,6 +131,12 @@ class Poolcontrol extends utils.Adapter {
|
|
|
127
131
|
if (controlHelper.cleanup) {
|
|
128
132
|
controlHelper.cleanup();
|
|
129
133
|
}
|
|
134
|
+
if (controlHelper2.cleanup) {
|
|
135
|
+
controlHelper2.cleanup();
|
|
136
|
+
}
|
|
137
|
+
if (speechTextHelper.cleanup) {
|
|
138
|
+
speechTextHelper.cleanup();
|
|
139
|
+
}
|
|
130
140
|
} catch (e) {
|
|
131
141
|
this.log.warn(`[onUnload] Fehler beim Cleanup: ${e.message}`);
|
|
132
142
|
} finally {
|
|
@@ -178,9 +188,17 @@ class Poolcontrol extends utils.Adapter {
|
|
|
178
188
|
} catch (e) {
|
|
179
189
|
this.log.warn(`[statusHelper] Fehler in handleStateChange: ${e.message}`);
|
|
180
190
|
}
|
|
191
|
+
try {
|
|
192
|
+
speechTextHelper.handleStateChange(id, state);
|
|
193
|
+
} catch (e) {
|
|
194
|
+
this.log.warn(`[speechTextHelper] Fehler in handleStateChange: ${e.message}`);
|
|
195
|
+
}
|
|
181
196
|
if (id.includes('control.')) {
|
|
182
197
|
controlHelper.handleStateChange(id, state);
|
|
183
198
|
}
|
|
199
|
+
if (id.includes('control.')) {
|
|
200
|
+
controlHelper2.handleStateChange(id, state);
|
|
201
|
+
}
|
|
184
202
|
|
|
185
203
|
await debugLogHelper.handleStateChange(id, state);
|
|
186
204
|
}
|
package/package.json
CHANGED
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "iobroker.poolcontrol",
|
|
3
|
-
"version": "0.2.
|
|
3
|
+
"version": "0.2.2",
|
|
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",
|
|
7
7
|
"license": "MIT",
|
|
8
8
|
"keywords": [
|
|
9
|
-
"ioBroker",
|
|
9
|
+
"ioBroker",
|
|
10
10
|
"pool",
|
|
11
11
|
"pumpe",
|
|
12
12
|
"solar",
|
|
@@ -24,6 +24,7 @@
|
|
|
24
24
|
"@iobroker/adapter-core": "^3.3.2"
|
|
25
25
|
},
|
|
26
26
|
"devDependencies": {
|
|
27
|
+
"@alcalzone/release-script": "^4.0.0",
|
|
27
28
|
"@iobroker/adapter-dev": "^1.5.0",
|
|
28
29
|
"@iobroker/eslint-config": "^2.2.0",
|
|
29
30
|
"@iobroker/testing": "^5.1.1",
|