iobroker.poolcontrol 1.2.22 → 1.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,552 @@
1
+ 'use strict';
2
+
3
+ /**
4
+ * Legt alle States für die erweiterte Solarsteuerung an
5
+ *
6
+ * @param {import("iobroker").Adapter} adapter - ioBroker Adapter-Instanz
7
+ */
8
+ async function createSolarExtendedStates(adapter) {
9
+ const channelId = 'solar.extended';
10
+
11
+ // ---------------------------------------------------------
12
+ // Channel
13
+ // ---------------------------------------------------------
14
+ await adapter.setObjectNotExistsAsync(channelId, {
15
+ type: 'channel',
16
+ common: {
17
+ name: {
18
+ en: 'Extended solar control',
19
+ de: 'Erweiterte Solarsteuerung',
20
+ },
21
+ },
22
+ native: {},
23
+ });
24
+
25
+ // ---------------------------------------------------------
26
+ // Konfiguration (write = true, persistent)
27
+ await adapter.setObjectNotExistsAsync(`${channelId}.control_object_id`, {
28
+ type: 'state',
29
+ common: {
30
+ name: {
31
+ en: 'Control object ID',
32
+ de: 'Steuerobjekt-ID',
33
+ },
34
+ desc: {
35
+ en: 'Object ID of the external actuator used for extended solar control',
36
+ de: 'Objekt-ID des externen Aktors fuer die erweiterte Solarsteuerung',
37
+ },
38
+ type: 'string',
39
+ role: 'text',
40
+ read: true,
41
+ write: true,
42
+ persist: true,
43
+ },
44
+ native: {},
45
+ });
46
+ const existingControlObjectId = await adapter.getStateAsync(`${channelId}.control_object_id`);
47
+ if (
48
+ existingControlObjectId === null ||
49
+ existingControlObjectId.val === null ||
50
+ existingControlObjectId.val === undefined
51
+ ) {
52
+ await adapter.setStateAsync(`${channelId}.control_object_id`, {
53
+ val: '',
54
+ ack: true,
55
+ });
56
+ }
57
+
58
+ await adapter.setObjectNotExistsAsync(`${channelId}.control_type`, {
59
+ type: 'state',
60
+ common: {
61
+ name: {
62
+ en: 'Control type',
63
+ de: 'Steuerungstyp',
64
+ },
65
+ desc: {
66
+ en: 'Defines the control type of the external actuator, for example boolean or socket',
67
+ de: 'Legt den Steuerungstyp des externen Aktors fest, zum Beispiel boolean oder socket',
68
+ },
69
+ type: 'string',
70
+ role: 'text',
71
+ // NEU: Auswahlwerte für Dropdown
72
+ states: {
73
+ boolean: 'Schalter (boolean)',
74
+ socket: 'Steckdose (socket)',
75
+ },
76
+ read: true,
77
+ write: true,
78
+ persist: true,
79
+ },
80
+ native: {},
81
+ });
82
+ const existingControlType = await adapter.getStateAsync(`${channelId}.control_type`);
83
+ if (existingControlType === null || existingControlType.val === null || existingControlType.val === undefined) {
84
+ await adapter.setStateAsync(`${channelId}.control_type`, {
85
+ val: 'boolean',
86
+ ack: true,
87
+ });
88
+ }
89
+
90
+ await adapter.setObjectNotExistsAsync(`${channelId}.control_inverted`, {
91
+ type: 'state',
92
+ common: {
93
+ name: {
94
+ en: 'Control inverted',
95
+ de: 'Steuerung invertiert',
96
+ },
97
+ desc: {
98
+ en: 'Defines whether the external actuator works with inverted logic',
99
+ de: 'Legt fest, ob der externe Aktor logisch invertiert arbeitet',
100
+ },
101
+ type: 'boolean',
102
+ role: 'switch',
103
+ read: true,
104
+ write: true,
105
+ persist: true,
106
+ },
107
+ native: {},
108
+ });
109
+ const existingControlInverted = await adapter.getStateAsync(`${channelId}.control_inverted`);
110
+ if (
111
+ existingControlInverted === null ||
112
+ existingControlInverted.val === null ||
113
+ existingControlInverted.val === undefined
114
+ ) {
115
+ await adapter.setStateAsync(`${channelId}.control_inverted`, {
116
+ val: false,
117
+ ack: true,
118
+ });
119
+ }
120
+
121
+ await adapter.setObjectNotExistsAsync(`${channelId}.delta_on`, {
122
+ type: 'state',
123
+ common: {
124
+ name: {
125
+ en: 'Switch-on temperature difference',
126
+ de: 'Einschalt-Temperaturdifferenz',
127
+ },
128
+ desc: {
129
+ en: 'Temperature difference in degrees Celsius required to activate extended solar control',
130
+ de: 'Temperaturdifferenz in Grad Celsius, die zum Einschalten der erweiterten Solarsteuerung erforderlich ist',
131
+ },
132
+ type: 'number',
133
+ role: 'level',
134
+ unit: '°C',
135
+ read: true,
136
+ write: true,
137
+ persist: true,
138
+ },
139
+ native: {},
140
+ });
141
+ const existingDeltaOn = await adapter.getStateAsync(`${channelId}.delta_on`);
142
+ if (existingDeltaOn === null || existingDeltaOn.val === null || existingDeltaOn.val === undefined) {
143
+ await adapter.setStateAsync(`${channelId}.delta_on`, {
144
+ val: 3,
145
+ ack: true,
146
+ });
147
+ }
148
+
149
+ await adapter.setObjectNotExistsAsync(`${channelId}.delta_off`, {
150
+ type: 'state',
151
+ common: {
152
+ name: {
153
+ en: 'Switch-off temperature difference',
154
+ de: 'Ausschalt-Temperaturdifferenz',
155
+ },
156
+ desc: {
157
+ en: 'Temperature difference in degrees Celsius below which extended solar control is deactivated',
158
+ de: 'Temperaturdifferenz in Grad Celsius, unterhalb der die erweiterte Solarsteuerung ausgeschaltet wird',
159
+ },
160
+ type: 'number',
161
+ role: 'level',
162
+ unit: '°C',
163
+ read: true,
164
+ write: true,
165
+ persist: true,
166
+ },
167
+ native: {},
168
+ });
169
+ const existingDeltaOff = await adapter.getStateAsync(`${channelId}.delta_off`);
170
+ if (existingDeltaOff === null || existingDeltaOff.val === null || existingDeltaOff.val === undefined) {
171
+ await adapter.setStateAsync(`${channelId}.delta_off`, {
172
+ val: 1,
173
+ ack: true,
174
+ });
175
+ }
176
+
177
+ await adapter.setObjectNotExistsAsync(`${channelId}.max_temperature`, {
178
+ type: 'state',
179
+ common: {
180
+ name: {
181
+ en: 'Maximum pool temperature',
182
+ de: 'Maximale Pooltemperatur',
183
+ },
184
+ desc: {
185
+ en: 'Maximum allowed pool temperature for safety shutdown of the extended solar control',
186
+ de: 'Maximal zulaessige Pooltemperatur fuer die Sicherheitsabschaltung der erweiterten Solarsteuerung',
187
+ },
188
+ type: 'number',
189
+ role: 'level',
190
+ unit: '°C',
191
+ read: true,
192
+ write: true,
193
+ persist: true,
194
+ },
195
+ native: {},
196
+ });
197
+ const existingMaxTemperature = await adapter.getStateAsync(`${channelId}.max_temperature`);
198
+ if (
199
+ existingMaxTemperature === null ||
200
+ existingMaxTemperature.val === null ||
201
+ existingMaxTemperature.val === undefined
202
+ ) {
203
+ await adapter.setStateAsync(`${channelId}.max_temperature`, {
204
+ val: 30,
205
+ ack: true,
206
+ });
207
+ }
208
+
209
+ await adapter.setObjectNotExistsAsync(`${channelId}.pool_temperature_source`, {
210
+ type: 'state',
211
+ common: {
212
+ name: {
213
+ en: 'Pool temperature source selection',
214
+ de: 'Auswahl der Pooltemperatur-Quelle',
215
+ },
216
+ desc: {
217
+ en: 'Defines which pool temperature source is used as comparison value for the extended solar control. Currently only surface or ground are intended values.',
218
+ de: 'Legt fest, welche Pooltemperatur-Quelle als Vergleichswert fuer die erweiterte Solarsteuerung verwendet wird. Aktuell sind nur surface oder ground als Werte vorgesehen.',
219
+ },
220
+ type: 'string',
221
+ role: 'text',
222
+ // NEU: Auswahlwerte für Dropdown
223
+ states: {
224
+ surface: 'Oberfläche (surface)',
225
+ ground: 'Grund (ground)',
226
+ },
227
+ read: true,
228
+ write: true,
229
+ persist: true,
230
+ },
231
+ native: {},
232
+ });
233
+ const existingPoolTemperatureSource = await adapter.getStateAsync(`${channelId}.pool_temperature_source`);
234
+ if (
235
+ existingPoolTemperatureSource === null ||
236
+ existingPoolTemperatureSource.val === null ||
237
+ existingPoolTemperatureSource.val === undefined
238
+ ) {
239
+ await adapter.setStateAsync(`${channelId}.pool_temperature_source`, {
240
+ val: 'surface',
241
+ ack: true,
242
+ });
243
+ }
244
+
245
+ // ---------------------------------------------------------
246
+ // Status / Anforderung (write = false)
247
+ // ---------------------------------------------------------
248
+ await adapter.setObjectNotExistsAsync(`${channelId}.enabled_by_master`, {
249
+ type: 'state',
250
+ common: {
251
+ name: {
252
+ en: 'Enabled by solar master',
253
+ de: 'Durch Solar-Hauptfunktion freigegeben',
254
+ },
255
+ desc: {
256
+ en: 'Shows whether the main solar function currently allows the extended solar control in principle',
257
+ de: 'Zeigt an, ob die Solar-Hauptfunktion die erweiterte Solarsteuerung grundsaetzlich freigibt',
258
+ },
259
+ type: 'boolean',
260
+ role: 'indicator',
261
+ read: true,
262
+ write: false,
263
+ },
264
+ native: {},
265
+ });
266
+ const existingEnabledByMaster = await adapter.getStateAsync(`${channelId}.enabled_by_master`);
267
+ if (
268
+ existingEnabledByMaster === null ||
269
+ existingEnabledByMaster.val === null ||
270
+ existingEnabledByMaster.val === undefined
271
+ ) {
272
+ await adapter.setStateAsync(`${channelId}.enabled_by_master`, {
273
+ val: false,
274
+ ack: true,
275
+ });
276
+ }
277
+
278
+ await adapter.setObjectNotExistsAsync(`${channelId}.request_active`, {
279
+ type: 'state',
280
+ common: {
281
+ name: {
282
+ en: 'Extended solar request active',
283
+ de: 'Solar-Extended-Anforderung aktiv',
284
+ },
285
+ desc: {
286
+ en: 'Shows whether the extended solar logic currently requests activation',
287
+ de: 'Zeigt an, ob die erweiterte Solarlogik aktuell eine Aktivierung anfordert',
288
+ },
289
+ type: 'boolean',
290
+ role: 'indicator.request',
291
+ read: true,
292
+ write: false,
293
+ },
294
+ native: {},
295
+ });
296
+ const existingRequestActive = await adapter.getStateAsync(`${channelId}.request_active`);
297
+ if (
298
+ existingRequestActive === null ||
299
+ existingRequestActive.val === null ||
300
+ existingRequestActive.val === undefined
301
+ ) {
302
+ await adapter.setStateAsync(`${channelId}.request_active`, {
303
+ val: false,
304
+ ack: true,
305
+ });
306
+ }
307
+
308
+ await adapter.setObjectNotExistsAsync(`${channelId}.active`, {
309
+ type: 'state',
310
+ common: {
311
+ name: {
312
+ en: 'Extended solar active',
313
+ de: 'Solar Extended aktiv',
314
+ },
315
+ desc: {
316
+ en: 'Shows whether the extended solar control is currently active',
317
+ de: 'Zeigt an, ob die erweiterte Solarsteuerung aktuell aktiv ist',
318
+ },
319
+ type: 'boolean',
320
+ role: 'indicator.working',
321
+ read: true,
322
+ write: false,
323
+ },
324
+ native: {},
325
+ });
326
+ const existingActive = await adapter.getStateAsync(`${channelId}.active`);
327
+ if (existingActive === null || existingActive.val === null || existingActive.val === undefined) {
328
+ await adapter.setStateAsync(`${channelId}.active`, {
329
+ val: false,
330
+ ack: true,
331
+ });
332
+ }
333
+
334
+ await adapter.setObjectNotExistsAsync(`${channelId}.blocked`, {
335
+ type: 'state',
336
+ common: {
337
+ name: {
338
+ en: 'Extended solar blocked',
339
+ de: 'Solar Extended blockiert',
340
+ },
341
+ desc: {
342
+ en: 'Shows whether the extended solar control is currently blocked',
343
+ de: 'Zeigt an, ob die erweiterte Solarsteuerung aktuell blockiert ist',
344
+ },
345
+ type: 'boolean',
346
+ role: 'indicator.blocked',
347
+ read: true,
348
+ write: false,
349
+ },
350
+ native: {},
351
+ });
352
+ const existingBlocked = await adapter.getStateAsync(`${channelId}.blocked`);
353
+ if (existingBlocked === null || existingBlocked.val === null || existingBlocked.val === undefined) {
354
+ await adapter.setStateAsync(`${channelId}.blocked`, {
355
+ val: false,
356
+ ack: true,
357
+ });
358
+ }
359
+
360
+ await adapter.setObjectNotExistsAsync(`${channelId}.blocked_by`, {
361
+ type: 'state',
362
+ common: {
363
+ name: {
364
+ en: 'Blocked by',
365
+ de: 'Blockiert durch',
366
+ },
367
+ desc: {
368
+ en: 'Shows what currently blocks the extended solar control, for example standard solar, master disabled or missing config',
369
+ de: 'Zeigt, wodurch die erweiterte Solarsteuerung aktuell blockiert ist, zum Beispiel Standard-Solar, Master deaktiviert oder fehlende Konfiguration',
370
+ },
371
+ type: 'string',
372
+ role: 'text',
373
+ read: true,
374
+ write: false,
375
+ },
376
+ native: {},
377
+ });
378
+ const existingBlockedBy = await adapter.getStateAsync(`${channelId}.blocked_by`);
379
+ if (existingBlockedBy === null || existingBlockedBy.val === null || existingBlockedBy.val === undefined) {
380
+ await adapter.setStateAsync(`${channelId}.blocked_by`, {
381
+ val: '',
382
+ ack: true,
383
+ });
384
+ }
385
+
386
+ await adapter.setObjectNotExistsAsync(`${channelId}.priority_status`, {
387
+ type: 'state',
388
+ common: {
389
+ name: {
390
+ en: 'Priority status',
391
+ de: 'Prioritaetsstatus',
392
+ },
393
+ desc: {
394
+ en: 'Text status for the priority decision between standard solar and extended solar control',
395
+ de: 'Textstatus fuer die Prioritaetsentscheidung zwischen Standard-Solar und erweiterter Solarsteuerung',
396
+ },
397
+ type: 'string',
398
+ role: 'text',
399
+ read: true,
400
+ write: false,
401
+ },
402
+ native: {},
403
+ });
404
+ const existingPriorityStatus = await adapter.getStateAsync(`${channelId}.priority_status`);
405
+ if (
406
+ existingPriorityStatus === null ||
407
+ existingPriorityStatus.val === null ||
408
+ existingPriorityStatus.val === undefined
409
+ ) {
410
+ await adapter.setStateAsync(`${channelId}.priority_status`, {
411
+ val: '',
412
+ ack: true,
413
+ });
414
+ }
415
+
416
+ // ---------------------------------------------------------
417
+ // Diagnose / Transparenz
418
+ // ---------------------------------------------------------
419
+ await adapter.setObjectNotExistsAsync(`${channelId}.config_ok`, {
420
+ type: 'state',
421
+ common: {
422
+ name: {
423
+ en: 'Configuration valid',
424
+ de: 'Konfiguration gueltig',
425
+ },
426
+ desc: {
427
+ en: 'Shows whether the configuration for the extended solar control is complete and valid',
428
+ de: 'Zeigt an, ob die Konfiguration fuer die erweiterte Solarsteuerung vollstaendig und gueltig ist',
429
+ },
430
+ type: 'boolean',
431
+ role: 'indicator',
432
+ read: true,
433
+ write: false,
434
+ },
435
+ native: {},
436
+ });
437
+ const existingConfigOk = await adapter.getStateAsync(`${channelId}.config_ok`);
438
+ if (existingConfigOk === null || existingConfigOk.val === null || existingConfigOk.val === undefined) {
439
+ await adapter.setStateAsync(`${channelId}.config_ok`, {
440
+ val: false,
441
+ ack: true,
442
+ });
443
+ }
444
+
445
+ await adapter.setObjectNotExistsAsync(`${channelId}.actor_state`, {
446
+ type: 'state',
447
+ common: {
448
+ name: {
449
+ en: 'Actor state',
450
+ de: 'Aktorstatus',
451
+ },
452
+ desc: {
453
+ en: 'Optional diagnostic value showing the actual read state of the external actuator',
454
+ de: 'Optionaler Diagnosewert, der den tatsaechlich gelesenen Zustand des externen Aktors zeigt',
455
+ },
456
+ type: 'boolean',
457
+ role: 'indicator',
458
+ read: true,
459
+ write: false,
460
+ },
461
+ native: {},
462
+ });
463
+ const existingActorState = await adapter.getStateAsync(`${channelId}.actor_state`);
464
+ if (existingActorState === null || existingActorState.val === null || existingActorState.val === undefined) {
465
+ await adapter.setStateAsync(`${channelId}.actor_state`, {
466
+ val: false,
467
+ ack: true,
468
+ });
469
+ }
470
+
471
+ await adapter.setObjectNotExistsAsync(`${channelId}.last_change`, {
472
+ type: 'state',
473
+ common: {
474
+ name: {
475
+ en: 'Last status change',
476
+ de: 'Letzte Statusaenderung',
477
+ },
478
+ desc: {
479
+ en: 'Timestamp of the last status change of the extended solar control',
480
+ de: 'Zeitstempel der letzten Statusaenderung der erweiterten Solarsteuerung',
481
+ },
482
+ type: 'number',
483
+ role: 'value.time',
484
+ read: true,
485
+ write: false,
486
+ },
487
+ native: {},
488
+ });
489
+ const existingLastChange = await adapter.getStateAsync(`${channelId}.last_change`);
490
+ if (existingLastChange === null || existingLastChange.val === null || existingLastChange.val === undefined) {
491
+ await adapter.setStateAsync(`${channelId}.last_change`, {
492
+ val: 0,
493
+ ack: true,
494
+ });
495
+ }
496
+
497
+ await adapter.setObjectNotExistsAsync(`${channelId}.reason`, {
498
+ type: 'state',
499
+ common: {
500
+ name: {
501
+ en: 'Reason for status',
502
+ de: 'Grund fuer Status',
503
+ },
504
+ desc: {
505
+ en: 'Technical reason why the extended solar control is active, inactive or blocked',
506
+ de: 'Technischer Grund, warum die erweiterte Solarsteuerung aktiv, inaktiv oder blockiert ist',
507
+ },
508
+ type: 'string',
509
+ role: 'text',
510
+ read: true,
511
+ write: false,
512
+ },
513
+ native: {},
514
+ });
515
+ const existingReason = await adapter.getStateAsync(`${channelId}.reason`);
516
+ if (existingReason === null || existingReason.val === null || existingReason.val === undefined) {
517
+ await adapter.setStateAsync(`${channelId}.reason`, {
518
+ val: '',
519
+ ack: true,
520
+ });
521
+ }
522
+
523
+ await adapter.setObjectNotExistsAsync(`${channelId}.info`, {
524
+ type: 'state',
525
+ common: {
526
+ name: {
527
+ en: 'Extended solar info',
528
+ de: 'Solar-Extended-Info',
529
+ },
530
+ desc: {
531
+ en: 'Readable short summary of the current extended solar status for the user',
532
+ de: 'Lesbare kurze Zusammenfassung des aktuellen Solar-Extended-Status fuer den Nutzer',
533
+ },
534
+ type: 'string',
535
+ role: 'text',
536
+ read: true,
537
+ write: false,
538
+ },
539
+ native: {},
540
+ });
541
+ const existingInfo = await adapter.getStateAsync(`${channelId}.info`);
542
+ if (existingInfo === null || existingInfo.val === null || existingInfo.val === undefined) {
543
+ await adapter.setStateAsync(`${channelId}.info`, {
544
+ val: '',
545
+ ack: true,
546
+ });
547
+ }
548
+ }
549
+
550
+ module.exports = {
551
+ createSolarExtendedStates,
552
+ };
@@ -54,6 +54,38 @@ async function createSolarStates(adapter) {
54
54
  });
55
55
  }
56
56
 
57
+ // NEU: Auswahl der Solarsteuerungsart (Standard oder Extended)
58
+ await adapter.setObjectNotExistsAsync('solar.control_mode', {
59
+ type: 'state',
60
+ common: {
61
+ name: {
62
+ en: 'Solar control mode',
63
+ de: 'Solarsteuerungsmodus',
64
+ },
65
+ desc: {
66
+ en: 'Selects which solar control type is active: standard or extended',
67
+ de: 'Waehlt aus, welche Solarsteuerungsart aktiv ist: standard oder extended',
68
+ },
69
+ type: 'string',
70
+ role: 'text',
71
+ read: true,
72
+ write: true,
73
+ persist: true, // dauerhaft speichern
74
+ states: {
75
+ standard: 'Standard',
76
+ extended: 'Extended',
77
+ },
78
+ },
79
+ native: {},
80
+ });
81
+ const existingControlMode = await adapter.getStateAsync('solar.control_mode');
82
+ if (existingControlMode === null || existingControlMode.val === null || existingControlMode.val === undefined) {
83
+ await adapter.setStateAsync('solar.control_mode', {
84
+ val: 'standard',
85
+ ack: true,
86
+ });
87
+ }
88
+
57
89
  // Hysterese aktiv (mit Persist-Schutz)
58
90
  await adapter.setObjectNotExistsAsync('solar.hysteresis_active', {
59
91
  type: 'state',
@@ -173,8 +205,8 @@ async function createSolarStates(adapter) {
173
205
  de: 'Kollektortemperatur-Warnung aktiv',
174
206
  },
175
207
  desc: {
176
- en: 'Shows whether a collector temperature warning is currently active',
177
- de: 'Zeigt an, ob aktuell eine Kollektortemperatur-Warnung aktiv ist',
208
+ en: 'Indicates that the collector temperature has exceeded the warning threshold. This is a warning only and does not trigger any automatic control action.',
209
+ de: 'Zeigt an, dass die Kollektortemperatur die Warnschwelle überschritten hat. Dies ist nur eine Warnung und löst keine automatische Steuerung aus.',
178
210
  },
179
211
  type: 'boolean',
180
212
  role: 'indicator.error',
package/main.js CHANGED
@@ -20,6 +20,7 @@ const pumpSpeedHelper = require('./lib/helpers/pumpSpeedHelper'); // NEU
20
20
  const speechHelper = require('./lib/helpers/speechHelper');
21
21
  const consumptionHelper = require('./lib/helpers/consumptionHelper');
22
22
  const solarHelper = require('./lib/helpers/solarHelper');
23
+ const solarExtendedHelper = require('./lib/helpers/solarExtendedHelper'); // NEU
23
24
  const frostHelper = require('./lib/helpers/frostHelper');
24
25
  const statusHelper = require('./lib/helpers/statusHelper');
25
26
  const photovoltaicHelper = require('./lib/helpers/photovoltaicHelper');
@@ -41,6 +42,7 @@ const { createPumpStates3 } = require('./lib/stateDefinitions/pumpStates3');
41
42
  const { createPumpStates4 } = require('./lib/stateDefinitions/pumpStates4');
42
43
  const { createPumpSpeedStates } = require('./lib/stateDefinitions/pumpSpeedStates'); // NEU
43
44
  const { createSolarStates } = require('./lib/stateDefinitions/solarStates');
45
+ const { createSolarExtendedStates } = require('./lib/stateDefinitions/solarExtendedStates'); // NEU
44
46
  const { createPhotovoltaicStates } = require('./lib/stateDefinitions/photovoltaicStates');
45
47
  const { createGeneralStates } = require('./lib/stateDefinitions/generalStates');
46
48
  const { createTimeStates } = require('./lib/stateDefinitions/timeStates');
@@ -110,6 +112,7 @@ class Poolcontrol extends utils.Adapter {
110
112
 
111
113
  // --- Solarverwaltung ---
112
114
  await createSolarStates(this);
115
+ await createSolarExtendedStates(this); // NEU
113
116
 
114
117
  // --- Heizung / Wärmepumpe ---
115
118
  await createHeatStates(this);
@@ -169,6 +172,7 @@ class Poolcontrol extends utils.Adapter {
169
172
  speechHelper.init(this);
170
173
  consumptionHelper.init(this);
171
174
  solarHelper.init(this);
175
+ solarExtendedHelper.init(this); // NEU
172
176
  heatHelper.init(this); // ← NEU
173
177
  photovoltaicHelper.init(this);
174
178
  aiHelper.init(this);
@@ -222,6 +226,9 @@ class Poolcontrol extends utils.Adapter {
222
226
  if (solarHelper.cleanup) {
223
227
  solarHelper.cleanup();
224
228
  }
229
+ if (solarExtendedHelper.cleanup) {
230
+ solarExtendedHelper.cleanup();
231
+ }
225
232
  if (frostHelper.cleanup) {
226
233
  frostHelper.cleanup();
227
234
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "iobroker.poolcontrol",
3
- "version": "1.2.22",
3
+ "version": "1.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",