iobroker.poolcontrol 0.2.2 → 0.3.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 +26 -0
- package/admin/jsonConfig.json +4 -0
- package/io-package.json +27 -28
- package/lib/helpers/frostHelper.js +8 -3
- package/lib/helpers/migrationHelper.js +117 -0
- package/lib/helpers/pumpHelper2.js +162 -0
- package/lib/helpers/pumpHelper3.js +259 -0
- package/lib/helpers/runtimeHelper.js +75 -8
- package/lib/helpers/statusHelper.js +35 -10
- package/lib/stateDefinitions/controlStates.js +82 -18
- package/lib/stateDefinitions/hardwareStates.js +184 -0
- package/lib/stateDefinitions/pumpStates.js +33 -7
- package/lib/stateDefinitions/pumpStates2.js +125 -0
- package/lib/stateDefinitions/pumpStates3.js +252 -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 +34 -1
- package/package.json +1 -1
|
@@ -98,7 +98,7 @@ async function createPumpStates(adapter) {
|
|
|
98
98
|
});
|
|
99
99
|
await adapter.setStateAsync('pump.pump_switch', { val: false, ack: true });
|
|
100
100
|
|
|
101
|
-
// Pumpenmodus
|
|
101
|
+
// Pumpenmodus (mit Persist-Schutz)
|
|
102
102
|
await adapter.setObjectNotExistsAsync('pump.mode', {
|
|
103
103
|
type: 'state',
|
|
104
104
|
common: {
|
|
@@ -107,6 +107,7 @@ async function createPumpStates(adapter) {
|
|
|
107
107
|
role: 'state',
|
|
108
108
|
read: true,
|
|
109
109
|
write: true,
|
|
110
|
+
persist: true, // NEU: dauerhaft speichern
|
|
110
111
|
states: {
|
|
111
112
|
auto: 'Automatik',
|
|
112
113
|
manual: 'Manuell',
|
|
@@ -116,9 +117,14 @@ async function createPumpStates(adapter) {
|
|
|
116
117
|
},
|
|
117
118
|
native: {},
|
|
118
119
|
});
|
|
119
|
-
await adapter.setStateAsync('pump.mode', { val: 'auto', ack: true });
|
|
120
120
|
|
|
121
|
-
//
|
|
121
|
+
// Prüfen, ob bereits ein Wert vorhanden ist
|
|
122
|
+
const existingPumpMode = await adapter.getStateAsync('pump.mode');
|
|
123
|
+
if (existingPumpMode === null || existingPumpMode.val === null || existingPumpMode.val === undefined) {
|
|
124
|
+
await adapter.setStateAsync('pump.mode', { val: 'auto', ack: true });
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
// Sicherheitslogik im manuellen Modus (mit Persist-Schutz)
|
|
122
128
|
await adapter.setObjectNotExistsAsync('pump.manual_safety_enabled', {
|
|
123
129
|
type: 'state',
|
|
124
130
|
common: {
|
|
@@ -127,13 +133,19 @@ async function createPumpStates(adapter) {
|
|
|
127
133
|
role: 'switch',
|
|
128
134
|
read: true,
|
|
129
135
|
write: true,
|
|
136
|
+
persist: true, // NEU: dauerhaft speichern
|
|
130
137
|
},
|
|
131
138
|
native: {},
|
|
132
139
|
});
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
140
|
+
|
|
141
|
+
// Prüfen, ob bereits ein persistierter Wert vorhanden ist
|
|
142
|
+
const existingSafety = await adapter.getStateAsync('pump.manual_safety_enabled');
|
|
143
|
+
if (existingSafety === null || existingSafety.val === null || existingSafety.val === undefined) {
|
|
144
|
+
await adapter.setStateAsync('pump.manual_safety_enabled', {
|
|
145
|
+
val: adapter.config.manual_safety_enabled ?? true,
|
|
146
|
+
ack: true,
|
|
147
|
+
});
|
|
148
|
+
}
|
|
137
149
|
|
|
138
150
|
// Pumpenstatus (Text)
|
|
139
151
|
await adapter.setObjectNotExistsAsync('pump.status', {
|
|
@@ -196,6 +208,20 @@ async function createPumpStates(adapter) {
|
|
|
196
208
|
native: {},
|
|
197
209
|
});
|
|
198
210
|
await adapter.setStateAsync('pump.current_power', { val: 0, ack: true });
|
|
211
|
+
|
|
212
|
+
await adapter.setObjectNotExistsAsync('pump.reason', {
|
|
213
|
+
type: 'state',
|
|
214
|
+
common: {
|
|
215
|
+
name: 'Grund für aktuellen Pumpenstatus',
|
|
216
|
+
desc: 'Wird intern verwendet, um den Grund des aktuellen Pumpenstatus zu speichern (z. B. Rückspülen, Wartung, Nachpumpen)',
|
|
217
|
+
type: 'string',
|
|
218
|
+
role: 'text',
|
|
219
|
+
read: true,
|
|
220
|
+
write: true,
|
|
221
|
+
},
|
|
222
|
+
native: {},
|
|
223
|
+
});
|
|
224
|
+
await adapter.setStateAsync('pump.reason', { val: '', ack: true });
|
|
199
225
|
}
|
|
200
226
|
|
|
201
227
|
module.exports = {
|
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* pumpStates2.js
|
|
5
|
+
* ----------------------------------------------------------
|
|
6
|
+
* Legt die erweiterten States für Pumpen-Livewerte an.
|
|
7
|
+
*
|
|
8
|
+
* Diese Datei ergänzt die bestehenden pumpStates.js um
|
|
9
|
+
* reelle Durchflussberechnung und Leistungsdaten.
|
|
10
|
+
*
|
|
11
|
+
* Ordnerstruktur:
|
|
12
|
+
* pump.live.*
|
|
13
|
+
* ├── current_power_w (W) - aktuelle Leistung
|
|
14
|
+
* ├── flow_current_lh (L/h) - reell berechneter Durchfluss
|
|
15
|
+
* ├── flow_percent (%) - aktuelle Auslastung
|
|
16
|
+
* ├── last_flow_lh (L/h) - letzter bekannter Durchfluss
|
|
17
|
+
*
|
|
18
|
+
* Alle States sind persistent und bleiben über Updates erhalten.
|
|
19
|
+
* ----------------------------------------------------------
|
|
20
|
+
* Version: 1.0.0
|
|
21
|
+
*/
|
|
22
|
+
|
|
23
|
+
/**
|
|
24
|
+
* Erstellt die erweiterten Pumpen-Live-States.
|
|
25
|
+
*
|
|
26
|
+
* @param {import("iobroker").Adapter} adapter - Aktive ioBroker Adapterinstanz
|
|
27
|
+
* @returns {Promise<void>}
|
|
28
|
+
*/
|
|
29
|
+
async function createPumpStates2(adapter) {
|
|
30
|
+
// ------------------------------------------------------
|
|
31
|
+
// Root-Kanal: pump.live
|
|
32
|
+
// ------------------------------------------------------
|
|
33
|
+
await adapter.setObjectNotExistsAsync('pump.live', {
|
|
34
|
+
type: 'channel',
|
|
35
|
+
common: {
|
|
36
|
+
name: 'Pumpen-Livewerte (aktuelle Betriebsdaten)',
|
|
37
|
+
},
|
|
38
|
+
native: {},
|
|
39
|
+
});
|
|
40
|
+
|
|
41
|
+
// ------------------------------------------------------
|
|
42
|
+
// Aktuelle Leistung (W)
|
|
43
|
+
// ------------------------------------------------------
|
|
44
|
+
await adapter.setObjectNotExistsAsync('pump.live.current_power_w', {
|
|
45
|
+
type: 'state',
|
|
46
|
+
common: {
|
|
47
|
+
name: 'Aktuelle elektrische Leistung',
|
|
48
|
+
desc: 'Momentane Leistungsaufnahme der Pumpe (Watt)',
|
|
49
|
+
type: 'number',
|
|
50
|
+
role: 'value.power',
|
|
51
|
+
unit: 'W',
|
|
52
|
+
read: true,
|
|
53
|
+
write: false,
|
|
54
|
+
persist: true,
|
|
55
|
+
},
|
|
56
|
+
native: {},
|
|
57
|
+
});
|
|
58
|
+
await adapter.setStateAsync('pump.live.current_power_w', { val: 0, ack: true });
|
|
59
|
+
|
|
60
|
+
// ------------------------------------------------------
|
|
61
|
+
// Reell berechneter Durchfluss (L/h)
|
|
62
|
+
// ------------------------------------------------------
|
|
63
|
+
await adapter.setObjectNotExistsAsync('pump.live.flow_current_lh', {
|
|
64
|
+
type: 'state',
|
|
65
|
+
common: {
|
|
66
|
+
name: 'Aktueller reeller Durchfluss',
|
|
67
|
+
desc: 'Berechnete Umwälzleistung basierend auf aktueller Leistung',
|
|
68
|
+
type: 'number',
|
|
69
|
+
role: 'value.flow',
|
|
70
|
+
unit: 'l/h',
|
|
71
|
+
read: true,
|
|
72
|
+
write: false,
|
|
73
|
+
persist: true,
|
|
74
|
+
},
|
|
75
|
+
native: {},
|
|
76
|
+
});
|
|
77
|
+
await adapter.setStateAsync('pump.live.flow_current_lh', { val: 0, ack: true });
|
|
78
|
+
|
|
79
|
+
// ------------------------------------------------------
|
|
80
|
+
// Prozentuale Auslastung (%)
|
|
81
|
+
// ------------------------------------------------------
|
|
82
|
+
await adapter.setObjectNotExistsAsync('pump.live.flow_percent', {
|
|
83
|
+
type: 'state',
|
|
84
|
+
common: {
|
|
85
|
+
name: 'Aktuelle Pumpenauslastung (%)',
|
|
86
|
+
desc: 'Aktuelle Pumpenleistung in Prozent der maximalen Leistung',
|
|
87
|
+
type: 'number',
|
|
88
|
+
role: 'value.percent',
|
|
89
|
+
unit: '%',
|
|
90
|
+
read: true,
|
|
91
|
+
write: false,
|
|
92
|
+
persist: true,
|
|
93
|
+
},
|
|
94
|
+
native: {},
|
|
95
|
+
});
|
|
96
|
+
await adapter.setStateAsync('pump.live.flow_percent', { val: 0, ack: true });
|
|
97
|
+
|
|
98
|
+
// ------------------------------------------------------
|
|
99
|
+
// Letzter bekannter Durchfluss (L/h)
|
|
100
|
+
// ------------------------------------------------------
|
|
101
|
+
await adapter.setObjectNotExistsAsync('pump.live.last_flow_lh', {
|
|
102
|
+
type: 'state',
|
|
103
|
+
common: {
|
|
104
|
+
name: 'Letzter bekannter Durchfluss',
|
|
105
|
+
desc: 'Speichert den letzten berechneten Durchflusswert vor Pumpenstopp',
|
|
106
|
+
type: 'number',
|
|
107
|
+
role: 'value.flow',
|
|
108
|
+
unit: 'l/h',
|
|
109
|
+
read: true,
|
|
110
|
+
write: false,
|
|
111
|
+
persist: true,
|
|
112
|
+
},
|
|
113
|
+
native: {},
|
|
114
|
+
});
|
|
115
|
+
await adapter.setStateAsync('pump.live.last_flow_lh', { val: 0, ack: true });
|
|
116
|
+
|
|
117
|
+
// ------------------------------------------------------
|
|
118
|
+
// Abschluss-Logeintrag
|
|
119
|
+
// ------------------------------------------------------
|
|
120
|
+
adapter.log.debug('[pumpStates2] Live-State-Definitionen erstellt oder geprüft.');
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
module.exports = {
|
|
124
|
+
createPumpStates2,
|
|
125
|
+
};
|
|
@@ -0,0 +1,252 @@
|
|
|
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.1
|
|
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
|
+
const existingPower = await adapter.getStateAsync('pump.learning.learned_avg_power_w');
|
|
53
|
+
if (existingPower === null || existingPower.val === null || existingPower.val === undefined) {
|
|
54
|
+
await adapter.setStateAsync('pump.learning.learned_avg_power_w', { val: 0, ack: true });
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
// ------------------------------------------------------
|
|
58
|
+
// Durchschnittlicher Durchfluss (L/h)
|
|
59
|
+
// ------------------------------------------------------
|
|
60
|
+
await adapter.setObjectNotExistsAsync('pump.learning.learned_avg_flow_lh', {
|
|
61
|
+
type: 'state',
|
|
62
|
+
common: {
|
|
63
|
+
name: 'Erlernter Durchschnitt des Durchflusses',
|
|
64
|
+
desc: 'Durchschnittlicher reeller Durchfluss über alle Lernzyklen (L/h)',
|
|
65
|
+
type: 'number',
|
|
66
|
+
role: 'value.flow',
|
|
67
|
+
unit: 'l/h',
|
|
68
|
+
read: true,
|
|
69
|
+
write: false,
|
|
70
|
+
persist: true,
|
|
71
|
+
},
|
|
72
|
+
native: {},
|
|
73
|
+
});
|
|
74
|
+
const existingFlow = await adapter.getStateAsync('pump.learning.learned_avg_flow_lh');
|
|
75
|
+
if (existingFlow === null || existingFlow.val === null || existingFlow.val === undefined) {
|
|
76
|
+
await adapter.setStateAsync('pump.learning.learned_avg_flow_lh', { val: 0, ack: true });
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
// ------------------------------------------------------
|
|
80
|
+
// Normalbereich Leistung – Untere / Obere Grenze
|
|
81
|
+
// ------------------------------------------------------
|
|
82
|
+
await adapter.setObjectNotExistsAsync('pump.learning.normal_range_power_low', {
|
|
83
|
+
type: 'state',
|
|
84
|
+
common: {
|
|
85
|
+
name: 'Leistungs-Normalbereich (untere Grenze)',
|
|
86
|
+
desc: 'Untergrenze des normalen Leistungsbereichs (W)',
|
|
87
|
+
type: 'number',
|
|
88
|
+
role: 'value.min',
|
|
89
|
+
unit: 'W',
|
|
90
|
+
read: true,
|
|
91
|
+
write: false,
|
|
92
|
+
persist: true,
|
|
93
|
+
},
|
|
94
|
+
native: {},
|
|
95
|
+
});
|
|
96
|
+
const existingPowerLow = await adapter.getStateAsync('pump.learning.normal_range_power_low');
|
|
97
|
+
if (existingPowerLow === null || existingPowerLow.val === null || existingPowerLow.val === undefined) {
|
|
98
|
+
await adapter.setStateAsync('pump.learning.normal_range_power_low', { val: 0, ack: true });
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
await adapter.setObjectNotExistsAsync('pump.learning.normal_range_power_high', {
|
|
102
|
+
type: 'state',
|
|
103
|
+
common: {
|
|
104
|
+
name: 'Leistungs-Normalbereich (obere Grenze)',
|
|
105
|
+
desc: 'Obergrenze des normalen Leistungsbereichs (W)',
|
|
106
|
+
type: 'number',
|
|
107
|
+
role: 'value.max',
|
|
108
|
+
unit: 'W',
|
|
109
|
+
read: true,
|
|
110
|
+
write: false,
|
|
111
|
+
persist: true,
|
|
112
|
+
},
|
|
113
|
+
native: {},
|
|
114
|
+
});
|
|
115
|
+
const existingPowerHigh = await adapter.getStateAsync('pump.learning.normal_range_power_high');
|
|
116
|
+
if (existingPowerHigh === null || existingPowerHigh.val === null || existingPowerHigh.val === undefined) {
|
|
117
|
+
await adapter.setStateAsync('pump.learning.normal_range_power_high', { val: 0, ack: true });
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
// ------------------------------------------------------
|
|
121
|
+
// Normalbereich Durchfluss – Untere / Obere Grenze
|
|
122
|
+
// ------------------------------------------------------
|
|
123
|
+
await adapter.setObjectNotExistsAsync('pump.learning.normal_range_flow_low', {
|
|
124
|
+
type: 'state',
|
|
125
|
+
common: {
|
|
126
|
+
name: 'Durchfluss-Normalbereich (untere Grenze)',
|
|
127
|
+
desc: 'Untergrenze des normalen Durchflussbereichs (L/h)',
|
|
128
|
+
type: 'number',
|
|
129
|
+
role: 'value.min',
|
|
130
|
+
unit: 'l/h',
|
|
131
|
+
read: true,
|
|
132
|
+
write: false,
|
|
133
|
+
persist: true,
|
|
134
|
+
},
|
|
135
|
+
native: {},
|
|
136
|
+
});
|
|
137
|
+
const existingFlowLow = await adapter.getStateAsync('pump.learning.normal_range_flow_low');
|
|
138
|
+
if (existingFlowLow === null || existingFlowLow.val === null || existingFlowLow.val === undefined) {
|
|
139
|
+
await adapter.setStateAsync('pump.learning.normal_range_flow_low', { val: 0, ack: true });
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
await adapter.setObjectNotExistsAsync('pump.learning.normal_range_flow_high', {
|
|
143
|
+
type: 'state',
|
|
144
|
+
common: {
|
|
145
|
+
name: 'Durchfluss-Normalbereich (obere Grenze)',
|
|
146
|
+
desc: 'Obergrenze des normalen Durchflussbereichs (L/h)',
|
|
147
|
+
type: 'number',
|
|
148
|
+
role: 'value.max',
|
|
149
|
+
unit: 'l/h',
|
|
150
|
+
read: true,
|
|
151
|
+
write: false,
|
|
152
|
+
persist: true,
|
|
153
|
+
},
|
|
154
|
+
native: {},
|
|
155
|
+
});
|
|
156
|
+
const existingFlowHigh = await adapter.getStateAsync('pump.learning.normal_range_flow_high');
|
|
157
|
+
if (existingFlowHigh === null || existingFlowHigh.val === null || existingFlowHigh.val === undefined) {
|
|
158
|
+
await adapter.setStateAsync('pump.learning.normal_range_flow_high', { val: 0, ack: true });
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
// ------------------------------------------------------
|
|
162
|
+
// Abweichungen (Prozent)
|
|
163
|
+
// ------------------------------------------------------
|
|
164
|
+
await adapter.setObjectNotExistsAsync('pump.learning.deviation_power_percent', {
|
|
165
|
+
type: 'state',
|
|
166
|
+
common: {
|
|
167
|
+
name: 'Leistungsabweichung (%)',
|
|
168
|
+
desc: 'Aktuelle Abweichung der Leistungsaufnahme vom Durchschnittswert',
|
|
169
|
+
type: 'number',
|
|
170
|
+
role: 'value.percent',
|
|
171
|
+
unit: '%',
|
|
172
|
+
read: true,
|
|
173
|
+
write: false,
|
|
174
|
+
persist: true,
|
|
175
|
+
},
|
|
176
|
+
native: {},
|
|
177
|
+
});
|
|
178
|
+
const existingDevPower = await adapter.getStateAsync('pump.learning.deviation_power_percent');
|
|
179
|
+
if (existingDevPower === null || existingDevPower.val === null || existingDevPower.val === undefined) {
|
|
180
|
+
await adapter.setStateAsync('pump.learning.deviation_power_percent', { val: 0, ack: true });
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
await adapter.setObjectNotExistsAsync('pump.learning.deviation_flow_percent', {
|
|
184
|
+
type: 'state',
|
|
185
|
+
common: {
|
|
186
|
+
name: 'Durchflussabweichung (%)',
|
|
187
|
+
desc: 'Aktuelle Abweichung des Durchflusses vom Durchschnittswert',
|
|
188
|
+
type: 'number',
|
|
189
|
+
role: 'value.percent',
|
|
190
|
+
unit: '%',
|
|
191
|
+
read: true,
|
|
192
|
+
write: false,
|
|
193
|
+
persist: true,
|
|
194
|
+
},
|
|
195
|
+
native: {},
|
|
196
|
+
});
|
|
197
|
+
const existingDevFlow = await adapter.getStateAsync('pump.learning.deviation_flow_percent');
|
|
198
|
+
if (existingDevFlow === null || existingDevFlow.val === null || existingDevFlow.val === undefined) {
|
|
199
|
+
await adapter.setStateAsync('pump.learning.deviation_flow_percent', { val: 0, ack: true });
|
|
200
|
+
}
|
|
201
|
+
|
|
202
|
+
// ------------------------------------------------------
|
|
203
|
+
// Textbewertung (Status)
|
|
204
|
+
// ------------------------------------------------------
|
|
205
|
+
await adapter.setObjectNotExistsAsync('pump.learning.status_text', {
|
|
206
|
+
type: 'state',
|
|
207
|
+
common: {
|
|
208
|
+
name: 'Statusbewertung',
|
|
209
|
+
desc: 'Textbasierte Bewertung des aktuellen Pumpenverhaltens (z. B. "im Normalbereich", "auffällig niedrig")',
|
|
210
|
+
type: 'string',
|
|
211
|
+
role: 'text',
|
|
212
|
+
read: true,
|
|
213
|
+
write: false,
|
|
214
|
+
persist: true,
|
|
215
|
+
},
|
|
216
|
+
native: {},
|
|
217
|
+
});
|
|
218
|
+
const existingStatus = await adapter.getStateAsync('pump.learning.status_text');
|
|
219
|
+
if (existingStatus === null || existingStatus.val === null || existingStatus.val === undefined) {
|
|
220
|
+
await adapter.setStateAsync('pump.learning.status_text', { val: '', ack: true });
|
|
221
|
+
}
|
|
222
|
+
|
|
223
|
+
// ------------------------------------------------------
|
|
224
|
+
// Anzahl Lernzyklen
|
|
225
|
+
// ------------------------------------------------------
|
|
226
|
+
await adapter.setObjectNotExistsAsync('pump.learning.learning_cycles_total', {
|
|
227
|
+
type: 'state',
|
|
228
|
+
common: {
|
|
229
|
+
name: 'Gesamtzahl der Lernzyklen',
|
|
230
|
+
desc: 'Anzahl der Pumpenläufe, die in die Lernberechnung eingeflossen sind',
|
|
231
|
+
type: 'number',
|
|
232
|
+
role: 'value',
|
|
233
|
+
read: true,
|
|
234
|
+
write: false,
|
|
235
|
+
persist: true,
|
|
236
|
+
},
|
|
237
|
+
native: {},
|
|
238
|
+
});
|
|
239
|
+
const existingCycles = await adapter.getStateAsync('pump.learning.learning_cycles_total');
|
|
240
|
+
if (existingCycles === null || existingCycles.val === null || existingCycles.val === undefined) {
|
|
241
|
+
await adapter.setStateAsync('pump.learning.learning_cycles_total', { val: 0, ack: true });
|
|
242
|
+
}
|
|
243
|
+
|
|
244
|
+
// ------------------------------------------------------
|
|
245
|
+
// Log-Eintrag
|
|
246
|
+
// ------------------------------------------------------
|
|
247
|
+
adapter.log.debug('[pumpStates3] Lern-States erstellt oder geprüft.');
|
|
248
|
+
}
|
|
249
|
+
|
|
250
|
+
module.exports = {
|
|
251
|
+
createPumpStates3,
|
|
252
|
+
};
|
|
@@ -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 = {
|