iobroker.poolcontrol 0.2.0 → 0.2.2

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