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.
- package/README.md +10 -5
- package/io-package.json +14 -14
- package/lib/helpers/solarExtendedHelper.js +285 -0
- package/lib/helpers/solarHelper.js +25 -6
- package/lib/i18n/de.json +37 -1
- package/lib/i18n/en.json +37 -1
- package/lib/i18n/es.json +37 -1
- package/lib/i18n/fr.json +37 -1
- package/lib/i18n/it.json +37 -1
- package/lib/i18n/nl.json +37 -1
- package/lib/i18n/pl.json +37 -1
- package/lib/i18n/pt.json +37 -1
- package/lib/i18n/ru.json +37 -1
- package/lib/i18n/uk.json +37 -1
- package/lib/i18n/zh-cn.json +37 -1
- package/lib/stateDefinitions/solarExtendedStates.js +552 -0
- package/lib/stateDefinitions/solarStates.js +34 -2
- package/main.js +7 -0
- package/package.json +1 -1
|
@@ -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: '
|
|
177
|
-
de: 'Zeigt an,
|
|
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.
|
|
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",
|