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.
@@ -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
- // Sicherheitslogik im manuellen Modus
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
- await adapter.setStateAsync('pump.manual_safety_enabled', {
134
- val: adapter.config.manual_safety_enabled ?? true,
135
- ack: true,
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.setStateAsync('solar.solar_control_active', {
30
- val: adapter.config.solar_control_active,
31
- ack: true,
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.setStateAsync('solar.hysteresis_active', {
47
- val: adapter.config.solar_hysteresis_active,
48
- ack: true,
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.setStateAsync('solar.temp_on', {
65
- val: adapter.config.solar_temp_on,
66
- ack: true,
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.setStateAsync('solar.temp_off', {
83
- val: adapter.config.solar_temp_off,
84
- ack: true,
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
- // NEU: Warnschwelle (°C)
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.setStateAsync('solar.warn_temp', { val: 80, ack: true });
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.setStateAsync('solar.warn_speech', { val: true, ack: true });
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 = {