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.
@@ -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.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 = {
@@ -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
- await adapter.setStateAsync('speech.active', {
34
- val: adapter.config.speech_active ?? false,
35
- ack: true,
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: true,
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: true,
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: true,
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
- await adapter.setStateAsync('status.season_active', { val: false, ack: true });
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.2.2",
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",