iobroker.poolcontrol 0.2.2 → 0.3.0
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 +18 -0
- package/io-package.json +14 -28
- package/lib/helpers/migrationHelper.js +117 -0
- package/lib/helpers/pumpHelper2.js +160 -0
- package/lib/helpers/pumpHelper3.js +259 -0
- package/lib/helpers/runtimeHelper.js +12 -2
- package/lib/helpers/statusHelper.js +35 -10
- package/lib/stateDefinitions/controlStates.js +58 -18
- package/lib/stateDefinitions/pumpStates.js +33 -7
- package/lib/stateDefinitions/pumpStates2.js +125 -0
- package/lib/stateDefinitions/pumpStates3.js +222 -0
- package/lib/stateDefinitions/solarStates.js +57 -26
- package/lib/stateDefinitions/speechStates.js +34 -8
- package/lib/stateDefinitions/statusStates.js +8 -2
- package/main.js +29 -0
- package/package.json +1 -1
|
@@ -0,0 +1,222 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* pumpStates3.js
|
|
5
|
+
* ----------------------------------------------------------
|
|
6
|
+
* Legt die States für den Lern- und Analysebereich der Pumpe an.
|
|
7
|
+
*
|
|
8
|
+
* Ordner: pump.learning
|
|
9
|
+
* Zweck: Speicherung von Durchschnitts- und Normalwerten
|
|
10
|
+
* zur Erkennung des typischen Pumpenverhaltens.
|
|
11
|
+
*
|
|
12
|
+
* Wird durch pumpHelper3.js verwaltet.
|
|
13
|
+
* Alle Werte sind persistent (persist: true).
|
|
14
|
+
* ----------------------------------------------------------
|
|
15
|
+
* Version: 1.0.0
|
|
16
|
+
*/
|
|
17
|
+
|
|
18
|
+
/**
|
|
19
|
+
* Erstellt die Lernfeld-States für Pumpenanalyse.
|
|
20
|
+
*
|
|
21
|
+
* @param {import('iobroker').Adapter} adapter – Aktive ioBroker Adapterinstanz
|
|
22
|
+
*/
|
|
23
|
+
async function createPumpStates3(adapter) {
|
|
24
|
+
// ------------------------------------------------------
|
|
25
|
+
// Root-Kanal: pump.learning
|
|
26
|
+
// ------------------------------------------------------
|
|
27
|
+
await adapter.setObjectNotExistsAsync('pump.learning', {
|
|
28
|
+
type: 'channel',
|
|
29
|
+
common: {
|
|
30
|
+
name: 'Pumpen-Lernwerte (Analyse & Normalbereich)',
|
|
31
|
+
},
|
|
32
|
+
native: {},
|
|
33
|
+
});
|
|
34
|
+
|
|
35
|
+
// ------------------------------------------------------
|
|
36
|
+
// Durchschnittliche Leistungsaufnahme (W)
|
|
37
|
+
// ------------------------------------------------------
|
|
38
|
+
await adapter.setObjectNotExistsAsync('pump.learning.learned_avg_power_w', {
|
|
39
|
+
type: 'state',
|
|
40
|
+
common: {
|
|
41
|
+
name: 'Erlernter Durchschnitt der Leistungsaufnahme',
|
|
42
|
+
desc: 'Durchschnittliche Leistungsaufnahme der Pumpe über alle Lernzyklen (W)',
|
|
43
|
+
type: 'number',
|
|
44
|
+
role: 'value.power',
|
|
45
|
+
unit: 'W',
|
|
46
|
+
read: true,
|
|
47
|
+
write: false,
|
|
48
|
+
persist: true,
|
|
49
|
+
},
|
|
50
|
+
native: {},
|
|
51
|
+
});
|
|
52
|
+
await adapter.setStateAsync('pump.learning.learned_avg_power_w', { val: 0, ack: true });
|
|
53
|
+
|
|
54
|
+
// ------------------------------------------------------
|
|
55
|
+
// Durchschnittlicher Durchfluss (L/h)
|
|
56
|
+
// ------------------------------------------------------
|
|
57
|
+
await adapter.setObjectNotExistsAsync('pump.learning.learned_avg_flow_lh', {
|
|
58
|
+
type: 'state',
|
|
59
|
+
common: {
|
|
60
|
+
name: 'Erlernter Durchschnitt des Durchflusses',
|
|
61
|
+
desc: 'Durchschnittlicher reeller Durchfluss über alle Lernzyklen (L/h)',
|
|
62
|
+
type: 'number',
|
|
63
|
+
role: 'value.flow',
|
|
64
|
+
unit: 'l/h',
|
|
65
|
+
read: true,
|
|
66
|
+
write: false,
|
|
67
|
+
persist: true,
|
|
68
|
+
},
|
|
69
|
+
native: {},
|
|
70
|
+
});
|
|
71
|
+
await adapter.setStateAsync('pump.learning.learned_avg_flow_lh', { val: 0, ack: true });
|
|
72
|
+
|
|
73
|
+
// ------------------------------------------------------
|
|
74
|
+
// Normalbereich Leistung – Untere / Obere Grenze
|
|
75
|
+
// ------------------------------------------------------
|
|
76
|
+
await adapter.setObjectNotExistsAsync('pump.learning.normal_range_power_low', {
|
|
77
|
+
type: 'state',
|
|
78
|
+
common: {
|
|
79
|
+
name: 'Leistungs-Normalbereich (untere Grenze)',
|
|
80
|
+
desc: 'Untergrenze des normalen Leistungsbereichs (W)',
|
|
81
|
+
type: 'number',
|
|
82
|
+
role: 'value.min',
|
|
83
|
+
unit: 'W',
|
|
84
|
+
read: true,
|
|
85
|
+
write: false,
|
|
86
|
+
persist: true,
|
|
87
|
+
},
|
|
88
|
+
native: {},
|
|
89
|
+
});
|
|
90
|
+
await adapter.setStateAsync('pump.learning.normal_range_power_low', { val: 0, ack: true });
|
|
91
|
+
|
|
92
|
+
await adapter.setObjectNotExistsAsync('pump.learning.normal_range_power_high', {
|
|
93
|
+
type: 'state',
|
|
94
|
+
common: {
|
|
95
|
+
name: 'Leistungs-Normalbereich (obere Grenze)',
|
|
96
|
+
desc: 'Obergrenze des normalen Leistungsbereichs (W)',
|
|
97
|
+
type: 'number',
|
|
98
|
+
role: 'value.max',
|
|
99
|
+
unit: 'W',
|
|
100
|
+
read: true,
|
|
101
|
+
write: false,
|
|
102
|
+
persist: true,
|
|
103
|
+
},
|
|
104
|
+
native: {},
|
|
105
|
+
});
|
|
106
|
+
await adapter.setStateAsync('pump.learning.normal_range_power_high', { val: 0, ack: true });
|
|
107
|
+
|
|
108
|
+
// ------------------------------------------------------
|
|
109
|
+
// Normalbereich Durchfluss – Untere / Obere Grenze
|
|
110
|
+
// ------------------------------------------------------
|
|
111
|
+
await adapter.setObjectNotExistsAsync('pump.learning.normal_range_flow_low', {
|
|
112
|
+
type: 'state',
|
|
113
|
+
common: {
|
|
114
|
+
name: 'Durchfluss-Normalbereich (untere Grenze)',
|
|
115
|
+
desc: 'Untergrenze des normalen Durchflussbereichs (L/h)',
|
|
116
|
+
type: 'number',
|
|
117
|
+
role: 'value.min',
|
|
118
|
+
unit: 'l/h',
|
|
119
|
+
read: true,
|
|
120
|
+
write: false,
|
|
121
|
+
persist: true,
|
|
122
|
+
},
|
|
123
|
+
native: {},
|
|
124
|
+
});
|
|
125
|
+
await adapter.setStateAsync('pump.learning.normal_range_flow_low', { val: 0, ack: true });
|
|
126
|
+
|
|
127
|
+
await adapter.setObjectNotExistsAsync('pump.learning.normal_range_flow_high', {
|
|
128
|
+
type: 'state',
|
|
129
|
+
common: {
|
|
130
|
+
name: 'Durchfluss-Normalbereich (obere Grenze)',
|
|
131
|
+
desc: 'Obergrenze des normalen Durchflussbereichs (L/h)',
|
|
132
|
+
type: 'number',
|
|
133
|
+
role: 'value.max',
|
|
134
|
+
unit: 'l/h',
|
|
135
|
+
read: true,
|
|
136
|
+
write: false,
|
|
137
|
+
persist: true,
|
|
138
|
+
},
|
|
139
|
+
native: {},
|
|
140
|
+
});
|
|
141
|
+
await adapter.setStateAsync('pump.learning.normal_range_flow_high', { val: 0, ack: true });
|
|
142
|
+
|
|
143
|
+
// ------------------------------------------------------
|
|
144
|
+
// Abweichungen (Prozent)
|
|
145
|
+
// ------------------------------------------------------
|
|
146
|
+
await adapter.setObjectNotExistsAsync('pump.learning.deviation_power_percent', {
|
|
147
|
+
type: 'state',
|
|
148
|
+
common: {
|
|
149
|
+
name: 'Leistungsabweichung (%)',
|
|
150
|
+
desc: 'Aktuelle Abweichung der Leistungsaufnahme vom Durchschnittswert',
|
|
151
|
+
type: 'number',
|
|
152
|
+
role: 'value.percent',
|
|
153
|
+
unit: '%',
|
|
154
|
+
read: true,
|
|
155
|
+
write: false,
|
|
156
|
+
persist: true,
|
|
157
|
+
},
|
|
158
|
+
native: {},
|
|
159
|
+
});
|
|
160
|
+
await adapter.setStateAsync('pump.learning.deviation_power_percent', { val: 0, ack: true });
|
|
161
|
+
|
|
162
|
+
await adapter.setObjectNotExistsAsync('pump.learning.deviation_flow_percent', {
|
|
163
|
+
type: 'state',
|
|
164
|
+
common: {
|
|
165
|
+
name: 'Durchflussabweichung (%)',
|
|
166
|
+
desc: 'Aktuelle Abweichung des Durchflusses vom Durchschnittswert',
|
|
167
|
+
type: 'number',
|
|
168
|
+
role: 'value.percent',
|
|
169
|
+
unit: '%',
|
|
170
|
+
read: true,
|
|
171
|
+
write: false,
|
|
172
|
+
persist: true,
|
|
173
|
+
},
|
|
174
|
+
native: {},
|
|
175
|
+
});
|
|
176
|
+
await adapter.setStateAsync('pump.learning.deviation_flow_percent', { val: 0, ack: true });
|
|
177
|
+
|
|
178
|
+
// ------------------------------------------------------
|
|
179
|
+
// Textbewertung (Status)
|
|
180
|
+
// ------------------------------------------------------
|
|
181
|
+
await adapter.setObjectNotExistsAsync('pump.learning.status_text', {
|
|
182
|
+
type: 'state',
|
|
183
|
+
common: {
|
|
184
|
+
name: 'Statusbewertung',
|
|
185
|
+
desc: 'Textbasierte Bewertung des aktuellen Pumpenverhaltens (z. B. "im Normalbereich", "auffällig niedrig")',
|
|
186
|
+
type: 'string',
|
|
187
|
+
role: 'text',
|
|
188
|
+
read: true,
|
|
189
|
+
write: false,
|
|
190
|
+
persist: true,
|
|
191
|
+
},
|
|
192
|
+
native: {},
|
|
193
|
+
});
|
|
194
|
+
await adapter.setStateAsync('pump.learning.status_text', { val: '', ack: true });
|
|
195
|
+
|
|
196
|
+
// ------------------------------------------------------
|
|
197
|
+
// Anzahl Lernzyklen
|
|
198
|
+
// ------------------------------------------------------
|
|
199
|
+
await adapter.setObjectNotExistsAsync('pump.learning.learning_cycles_total', {
|
|
200
|
+
type: 'state',
|
|
201
|
+
common: {
|
|
202
|
+
name: 'Gesamtzahl der Lernzyklen',
|
|
203
|
+
desc: 'Anzahl der Pumpenläufe, die in die Lernberechnung eingeflossen sind',
|
|
204
|
+
type: 'number',
|
|
205
|
+
role: 'value',
|
|
206
|
+
read: true,
|
|
207
|
+
write: false,
|
|
208
|
+
persist: true,
|
|
209
|
+
},
|
|
210
|
+
native: {},
|
|
211
|
+
});
|
|
212
|
+
await adapter.setStateAsync('pump.learning.learning_cycles_total', { val: 0, ack: true });
|
|
213
|
+
|
|
214
|
+
// ------------------------------------------------------
|
|
215
|
+
// Log-Eintrag
|
|
216
|
+
// ------------------------------------------------------
|
|
217
|
+
adapter.log.debug('[pumpStates3] Lern-States erstellt oder geprüft.');
|
|
218
|
+
}
|
|
219
|
+
|
|
220
|
+
module.exports = {
|
|
221
|
+
createPumpStates3,
|
|
222
|
+
};
|
|
@@ -14,7 +14,7 @@
|
|
|
14
14
|
* @param {import("iobroker").Adapter} adapter - ioBroker Adapter-Instanz
|
|
15
15
|
*/
|
|
16
16
|
async function createSolarStates(adapter) {
|
|
17
|
-
// Solarsteuerung aktiv
|
|
17
|
+
// Solarsteuerung aktiv (mit Persist-Schutz)
|
|
18
18
|
await adapter.setObjectNotExistsAsync('solar.solar_control_active', {
|
|
19
19
|
type: 'state',
|
|
20
20
|
common: {
|
|
@@ -23,15 +23,19 @@ async function createSolarStates(adapter) {
|
|
|
23
23
|
role: 'switch',
|
|
24
24
|
read: true,
|
|
25
25
|
write: true,
|
|
26
|
+
persist: true, // dauerhaft speichern
|
|
26
27
|
},
|
|
27
28
|
native: {},
|
|
28
29
|
});
|
|
29
|
-
await adapter.
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
30
|
+
const existingSolarActive = await adapter.getStateAsync('solar.solar_control_active');
|
|
31
|
+
if (existingSolarActive === null || existingSolarActive.val === null || existingSolarActive.val === undefined) {
|
|
32
|
+
await adapter.setStateAsync('solar.solar_control_active', {
|
|
33
|
+
val: adapter.config.solar_control_active,
|
|
34
|
+
ack: true,
|
|
35
|
+
});
|
|
36
|
+
}
|
|
33
37
|
|
|
34
|
-
// Hysterese aktiv
|
|
38
|
+
// Hysterese aktiv (mit Persist-Schutz)
|
|
35
39
|
await adapter.setObjectNotExistsAsync('solar.hysteresis_active', {
|
|
36
40
|
type: 'state',
|
|
37
41
|
common: {
|
|
@@ -40,15 +44,19 @@ async function createSolarStates(adapter) {
|
|
|
40
44
|
role: 'switch',
|
|
41
45
|
read: true,
|
|
42
46
|
write: true,
|
|
47
|
+
persist: true, // dauerhaft speichern
|
|
43
48
|
},
|
|
44
49
|
native: {},
|
|
45
50
|
});
|
|
46
|
-
await adapter.
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
51
|
+
const existingHyst = await adapter.getStateAsync('solar.hysteresis_active');
|
|
52
|
+
if (existingHyst === null || existingHyst.val === null || existingHyst.val === undefined) {
|
|
53
|
+
await adapter.setStateAsync('solar.hysteresis_active', {
|
|
54
|
+
val: adapter.config.solar_hysteresis_active,
|
|
55
|
+
ack: true,
|
|
56
|
+
});
|
|
57
|
+
}
|
|
50
58
|
|
|
51
|
-
// Einschaltgrenze
|
|
59
|
+
// Einschaltgrenze (mit Persist-Schutz)
|
|
52
60
|
await adapter.setObjectNotExistsAsync('solar.temp_on', {
|
|
53
61
|
type: 'state',
|
|
54
62
|
common: {
|
|
@@ -58,15 +66,19 @@ async function createSolarStates(adapter) {
|
|
|
58
66
|
unit: '°C',
|
|
59
67
|
read: true,
|
|
60
68
|
write: true,
|
|
69
|
+
persist: true, // dauerhaft speichern
|
|
61
70
|
},
|
|
62
71
|
native: {},
|
|
63
72
|
});
|
|
64
|
-
await adapter.
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
73
|
+
const existingTempOn = await adapter.getStateAsync('solar.temp_on');
|
|
74
|
+
if (existingTempOn === null || existingTempOn.val === null || existingTempOn.val === undefined) {
|
|
75
|
+
await adapter.setStateAsync('solar.temp_on', {
|
|
76
|
+
val: adapter.config.solar_temp_on,
|
|
77
|
+
ack: true,
|
|
78
|
+
});
|
|
79
|
+
}
|
|
68
80
|
|
|
69
|
-
// Ausschaltgrenze
|
|
81
|
+
// Ausschaltgrenze (mit Persist-Schutz)
|
|
70
82
|
await adapter.setObjectNotExistsAsync('solar.temp_off', {
|
|
71
83
|
type: 'state',
|
|
72
84
|
common: {
|
|
@@ -76,13 +88,17 @@ async function createSolarStates(adapter) {
|
|
|
76
88
|
unit: '°C',
|
|
77
89
|
read: true,
|
|
78
90
|
write: true,
|
|
91
|
+
persist: true, // dauerhaft speichern
|
|
79
92
|
},
|
|
80
93
|
native: {},
|
|
81
94
|
});
|
|
82
|
-
await adapter.
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
95
|
+
const existingTempOff = await adapter.getStateAsync('solar.temp_off');
|
|
96
|
+
if (existingTempOff === null || existingTempOff.val === null || existingTempOff.val === undefined) {
|
|
97
|
+
await adapter.setStateAsync('solar.temp_off', {
|
|
98
|
+
val: adapter.config.solar_temp_off,
|
|
99
|
+
ack: true,
|
|
100
|
+
});
|
|
101
|
+
}
|
|
86
102
|
|
|
87
103
|
// Warnung Kollektortemperatur aktiv
|
|
88
104
|
await adapter.setObjectNotExistsAsync('solar.collector_warning', {
|
|
@@ -101,7 +117,7 @@ async function createSolarStates(adapter) {
|
|
|
101
117
|
ack: true,
|
|
102
118
|
});
|
|
103
119
|
|
|
104
|
-
// NEU: Warnlogik aktivieren
|
|
120
|
+
// NEU: Warnlogik aktivieren (mit Persist-Schutz)
|
|
105
121
|
await adapter.setObjectNotExistsAsync('solar.warn_active', {
|
|
106
122
|
type: 'state',
|
|
107
123
|
common: {
|
|
@@ -110,12 +126,19 @@ async function createSolarStates(adapter) {
|
|
|
110
126
|
role: 'switch',
|
|
111
127
|
read: true,
|
|
112
128
|
write: true,
|
|
129
|
+
persist: true, // dauerhaft speichern
|
|
113
130
|
},
|
|
114
131
|
native: {},
|
|
115
132
|
});
|
|
116
|
-
await adapter.setStateAsync('solar.warn_active', { val: false, ack: true });
|
|
117
133
|
|
|
118
|
-
//
|
|
134
|
+
// Prüfen, ob bereits ein persistierter Wert existiert
|
|
135
|
+
const existingWarnActive = await adapter.getStateAsync('solar.warn_active');
|
|
136
|
+
if (existingWarnActive === null || existingWarnActive.val === null || existingWarnActive.val === undefined) {
|
|
137
|
+
// Nur bei erstmaligem Anlegen auf false setzen
|
|
138
|
+
await adapter.setStateAsync('solar.warn_active', { val: false, ack: true });
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
// NEU: Warnschwelle (°C, mit Persist-Schutz)
|
|
119
142
|
await adapter.setObjectNotExistsAsync('solar.warn_temp', {
|
|
120
143
|
type: 'state',
|
|
121
144
|
common: {
|
|
@@ -125,12 +148,16 @@ async function createSolarStates(adapter) {
|
|
|
125
148
|
unit: '°C',
|
|
126
149
|
read: true,
|
|
127
150
|
write: true,
|
|
151
|
+
persist: true, // dauerhaft speichern
|
|
128
152
|
},
|
|
129
153
|
native: {},
|
|
130
154
|
});
|
|
131
|
-
await adapter.
|
|
155
|
+
const existingWarnTemp = await adapter.getStateAsync('solar.warn_temp');
|
|
156
|
+
if (existingWarnTemp === null || existingWarnTemp.val === null || existingWarnTemp.val === undefined) {
|
|
157
|
+
await adapter.setStateAsync('solar.warn_temp', { val: 80, ack: true });
|
|
158
|
+
}
|
|
132
159
|
|
|
133
|
-
// NEU: Sprachausgabe bei Warnung
|
|
160
|
+
// NEU: Sprachausgabe bei Warnung (mit Persist-Schutz)
|
|
134
161
|
await adapter.setObjectNotExistsAsync('solar.warn_speech', {
|
|
135
162
|
type: 'state',
|
|
136
163
|
common: {
|
|
@@ -139,10 +166,14 @@ async function createSolarStates(adapter) {
|
|
|
139
166
|
role: 'switch',
|
|
140
167
|
read: true,
|
|
141
168
|
write: true,
|
|
169
|
+
persist: true, // dauerhaft speichern
|
|
142
170
|
},
|
|
143
171
|
native: {},
|
|
144
172
|
});
|
|
145
|
-
await adapter.
|
|
173
|
+
const existingWarnSpeech = await adapter.getStateAsync('solar.warn_speech');
|
|
174
|
+
if (existingWarnSpeech === null || existingWarnSpeech.val === null || existingWarnSpeech.val === undefined) {
|
|
175
|
+
await adapter.setStateAsync('solar.warn_speech', { val: true, ack: true });
|
|
176
|
+
}
|
|
146
177
|
}
|
|
147
178
|
|
|
148
179
|
module.exports = {
|
|
@@ -18,7 +18,7 @@ async function createSpeechStates(adapter) {
|
|
|
18
18
|
native: {},
|
|
19
19
|
});
|
|
20
20
|
|
|
21
|
-
// Sprachausgaben global aktiv
|
|
21
|
+
// Sprachausgaben global aktiv (mit Persist-Schutz)
|
|
22
22
|
await adapter.setObjectNotExistsAsync('speech.active', {
|
|
23
23
|
type: 'state',
|
|
24
24
|
common: {
|
|
@@ -27,13 +27,19 @@ async function createSpeechStates(adapter) {
|
|
|
27
27
|
role: 'switch',
|
|
28
28
|
read: true,
|
|
29
29
|
write: true,
|
|
30
|
+
persist: true, // dauerhaft speichern
|
|
30
31
|
},
|
|
31
32
|
native: {},
|
|
32
33
|
});
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
34
|
+
|
|
35
|
+
// Prüfen, ob bereits ein persistierter Wert existiert
|
|
36
|
+
const existingSpeechActive = await adapter.getStateAsync('speech.active');
|
|
37
|
+
if (existingSpeechActive === null || existingSpeechActive.val === null || existingSpeechActive.val === undefined) {
|
|
38
|
+
await adapter.setStateAsync('speech.active', {
|
|
39
|
+
val: adapter.config.speech_active ?? false,
|
|
40
|
+
ack: true,
|
|
41
|
+
});
|
|
42
|
+
}
|
|
37
43
|
|
|
38
44
|
// Letzter gesprochener Text
|
|
39
45
|
await adapter.setObjectNotExistsAsync('speech.last_text', {
|
|
@@ -107,8 +113,9 @@ async function createSpeechStates(adapter) {
|
|
|
107
113
|
type: 'boolean',
|
|
108
114
|
role: 'indicator',
|
|
109
115
|
read: true,
|
|
110
|
-
write:
|
|
116
|
+
write: false,
|
|
111
117
|
hidden: true, // unsichtbar im Admin
|
|
118
|
+
dontShow: true,
|
|
112
119
|
},
|
|
113
120
|
native: {},
|
|
114
121
|
});
|
|
@@ -120,8 +127,9 @@ async function createSpeechStates(adapter) {
|
|
|
120
127
|
type: 'boolean',
|
|
121
128
|
role: 'indicator',
|
|
122
129
|
read: true,
|
|
123
|
-
write:
|
|
130
|
+
write: false,
|
|
124
131
|
hidden: true, // unsichtbar im Admin
|
|
132
|
+
dontShow: true,
|
|
125
133
|
},
|
|
126
134
|
native: {},
|
|
127
135
|
});
|
|
@@ -133,11 +141,29 @@ async function createSpeechStates(adapter) {
|
|
|
133
141
|
type: 'boolean',
|
|
134
142
|
role: 'indicator',
|
|
135
143
|
read: true,
|
|
136
|
-
write:
|
|
144
|
+
write: false,
|
|
137
145
|
hidden: true, // unsichtbar im Admin
|
|
146
|
+
dontShow: true,
|
|
138
147
|
},
|
|
139
148
|
native: {},
|
|
140
149
|
});
|
|
150
|
+
|
|
151
|
+
// --- Sicherstellen, dass bestehende Installationen nachträglich korrigiert werden ---
|
|
152
|
+
const hiddenStates = ['speech.solar_active', 'speech.time_active', 'speech.frost_active'];
|
|
153
|
+
for (const id of hiddenStates) {
|
|
154
|
+
try {
|
|
155
|
+
await adapter.extendObjectAsync(id, {
|
|
156
|
+
common: {
|
|
157
|
+
hidden: true,
|
|
158
|
+
dontShow: true,
|
|
159
|
+
write: false,
|
|
160
|
+
},
|
|
161
|
+
});
|
|
162
|
+
} catch (err) {
|
|
163
|
+
adapter.log.warn(`[speechStates] Konnte hidden-Flag für ${id} nicht setzen: ${err.message}`);
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
adapter.log.debug('[speechStates] Hidden-Flags für Solar/Time/Frost geprüft und aktualisiert');
|
|
141
167
|
}
|
|
142
168
|
|
|
143
169
|
module.exports = {
|
|
@@ -169,7 +169,7 @@ async function createStatusStates(adapter) {
|
|
|
169
169
|
});
|
|
170
170
|
await adapter.setStateAsync('status.system_warning_text', { val: '', ack: true });
|
|
171
171
|
|
|
172
|
-
// Saisonstatus
|
|
172
|
+
// Saisonstatus (mit Persist-Schutz)
|
|
173
173
|
await adapter.setObjectNotExistsAsync('status.season_active', {
|
|
174
174
|
type: 'state',
|
|
175
175
|
common: {
|
|
@@ -178,10 +178,16 @@ async function createStatusStates(adapter) {
|
|
|
178
178
|
role: 'switch',
|
|
179
179
|
read: true,
|
|
180
180
|
write: true,
|
|
181
|
+
persist: true, // dauerhaft speichern
|
|
181
182
|
},
|
|
182
183
|
native: {},
|
|
183
184
|
});
|
|
184
|
-
|
|
185
|
+
|
|
186
|
+
// Prüfen, ob bereits ein persistierter Wert existiert
|
|
187
|
+
const existingSeasonActive = await adapter.getStateAsync('status.season_active');
|
|
188
|
+
if (existingSeasonActive === null || existingSeasonActive.val === null || existingSeasonActive.val === undefined) {
|
|
189
|
+
await adapter.setStateAsync('status.season_active', { val: false, ack: true });
|
|
190
|
+
}
|
|
185
191
|
}
|
|
186
192
|
|
|
187
193
|
module.exports = {
|
package/main.js
CHANGED
|
@@ -9,6 +9,8 @@ const temperatureHelper = require('./lib/helpers/temperatureHelper');
|
|
|
9
9
|
const timeHelper = require('./lib/helpers/timeHelper');
|
|
10
10
|
const runtimeHelper = require('./lib/helpers/runtimeHelper');
|
|
11
11
|
const pumpHelper = require('./lib/helpers/pumpHelper');
|
|
12
|
+
const pumpHelper2 = require('./lib/helpers/pumpHelper2');
|
|
13
|
+
const pumpHelper3 = require('./lib/helpers/pumpHelper3');
|
|
12
14
|
const speechHelper = require('./lib/helpers/speechHelper');
|
|
13
15
|
const consumptionHelper = require('./lib/helpers/consumptionHelper');
|
|
14
16
|
const solarHelper = require('./lib/helpers/solarHelper');
|
|
@@ -18,8 +20,11 @@ const controlHelper = require('./lib/helpers/controlHelper');
|
|
|
18
20
|
const controlHelper2 = require('./lib/helpers/controlHelper2');
|
|
19
21
|
const debugLogHelper = require('./lib/helpers/debugLogHelper');
|
|
20
22
|
const speechTextHelper = require('./lib/helpers/speechTextHelper');
|
|
23
|
+
const migrationHelper = require('./lib/helpers/migrationHelper');
|
|
21
24
|
const { createTemperatureStates } = require('./lib/stateDefinitions/temperatureStates');
|
|
22
25
|
const { createPumpStates } = require('./lib/stateDefinitions/pumpStates');
|
|
26
|
+
const { createPumpStates2 } = require('./lib/stateDefinitions/pumpStates2');
|
|
27
|
+
const { createPumpStates3 } = require('./lib/stateDefinitions/pumpStates3');
|
|
23
28
|
const { createSolarStates } = require('./lib/stateDefinitions/solarStates');
|
|
24
29
|
const { createGeneralStates } = require('./lib/stateDefinitions/generalStates');
|
|
25
30
|
const { createTimeStates } = require('./lib/stateDefinitions/timeStates');
|
|
@@ -49,6 +54,8 @@ class Poolcontrol extends utils.Adapter {
|
|
|
49
54
|
|
|
50
55
|
// --- Pumpe ---
|
|
51
56
|
await createPumpStates(this);
|
|
57
|
+
await createPumpStates2(this);
|
|
58
|
+
await createPumpStates3(this);
|
|
52
59
|
|
|
53
60
|
// --- Temperaturverwaltung ---
|
|
54
61
|
await createTemperatureStates(this);
|
|
@@ -83,11 +90,16 @@ class Poolcontrol extends utils.Adapter {
|
|
|
83
90
|
// --- DebugLog Staets ---
|
|
84
91
|
await createDebugLogStates(this);
|
|
85
92
|
|
|
93
|
+
// --- Migration Helper zuletzt starten ---
|
|
94
|
+
await migrationHelper.init(this);
|
|
95
|
+
|
|
86
96
|
// --- Helper starten ---
|
|
87
97
|
temperatureHelper.init(this);
|
|
88
98
|
timeHelper.init(this);
|
|
89
99
|
runtimeHelper.init(this);
|
|
90
100
|
pumpHelper.init(this);
|
|
101
|
+
pumpHelper2.init(this);
|
|
102
|
+
pumpHelper3.init(this);
|
|
91
103
|
speechHelper.init(this);
|
|
92
104
|
consumptionHelper.init(this);
|
|
93
105
|
solarHelper.init(this);
|
|
@@ -113,6 +125,12 @@ class Poolcontrol extends utils.Adapter {
|
|
|
113
125
|
if (pumpHelper.cleanup) {
|
|
114
126
|
pumpHelper.cleanup();
|
|
115
127
|
}
|
|
128
|
+
if (pumpHelper2.cleanup) {
|
|
129
|
+
pumpHelper2.cleanup();
|
|
130
|
+
}
|
|
131
|
+
if (pumpHelper3.cleanup) {
|
|
132
|
+
pumpHelper3.cleanup();
|
|
133
|
+
}
|
|
116
134
|
if (speechHelper.cleanup) {
|
|
117
135
|
speechHelper.cleanup();
|
|
118
136
|
}
|
|
@@ -173,6 +191,17 @@ class Poolcontrol extends utils.Adapter {
|
|
|
173
191
|
} catch (e) {
|
|
174
192
|
this.log.warn(`[pumpHelper] Fehler in handleStateChange: ${e.message}`);
|
|
175
193
|
}
|
|
194
|
+
try {
|
|
195
|
+
pumpHelper2.handleStateChange(id, state);
|
|
196
|
+
} catch (e) {
|
|
197
|
+
this.log.warn(`[pumpHelper2] Fehler in handleStateChange: ${e.message}`);
|
|
198
|
+
}
|
|
199
|
+
try {
|
|
200
|
+
pumpHelper3.handleStateChange(id, state);
|
|
201
|
+
} catch (e) {
|
|
202
|
+
this.log.warn(`[pumpHelper3] Fehler in handleStateChange: ${e.message}`);
|
|
203
|
+
}
|
|
204
|
+
|
|
176
205
|
try {
|
|
177
206
|
speechHelper.handleStateChange(id, state);
|
|
178
207
|
} catch (e) {
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "iobroker.poolcontrol",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.3.0",
|
|
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",
|