iobroker.poolcontrol 1.3.9 → 1.3.11

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,701 @@
1
+ 'use strict';
2
+
3
+ /**
4
+ * chemistryPhStates.js
5
+ * -------------------------------------------------------------
6
+ * States for the pH evaluation area.
7
+ *
8
+ * Scope:
9
+ * - pH input via manual value or external ioBroker state
10
+ * - Measurement location handling
11
+ * - Evaluation and recommendation states
12
+ * - Optional manual mixing run states
13
+ *
14
+ * No automatic dosing.
15
+ * -------------------------------------------------------------
16
+ */
17
+
18
+ async function createChannel(adapter, id, name) {
19
+ await adapter.setObjectNotExistsAsync(id, {
20
+ type: 'channel',
21
+ common: { name },
22
+ native: {},
23
+ });
24
+ }
25
+
26
+ async function createState(adapter, id, common) {
27
+ await adapter.setObjectNotExistsAsync(id, {
28
+ type: 'state',
29
+ common,
30
+ native: {},
31
+ });
32
+ }
33
+
34
+ /**
35
+ * @param {import('iobroker').Adapter} adapter - ioBroker adapter instance
36
+ */
37
+ async function createChemistryPhStates(adapter) {
38
+ adapter.log.debug('[chemistryPhStates] Initialization started');
39
+
40
+ await createChannel(adapter, 'chemistry', {
41
+ en: 'Chemistry',
42
+ de: 'Chemie',
43
+ });
44
+
45
+ await createChannel(adapter, 'chemistry.ph', {
46
+ en: 'pH evaluation',
47
+ de: 'pH-Auswertung',
48
+ });
49
+
50
+ await createState(adapter, 'chemistry.ph.enabled', {
51
+ name: {
52
+ en: 'Enable pH evaluation',
53
+ de: 'pH-Auswertung aktivieren',
54
+ },
55
+ desc: {
56
+ en: 'Enables the pH evaluation. No automatic dosing is performed.',
57
+ de: 'Aktiviert die pH-Auswertung. Es erfolgt keine automatische Dosierung.',
58
+ },
59
+ type: 'boolean',
60
+ role: 'switch',
61
+ read: true,
62
+ write: true,
63
+ def: false,
64
+ persist: true,
65
+ });
66
+
67
+ // -------------------------------------------------------------
68
+ // Input
69
+ // -------------------------------------------------------------
70
+ await createChannel(adapter, 'chemistry.ph.input', {
71
+ en: 'Input',
72
+ de: 'Eingang',
73
+ });
74
+
75
+ await createState(adapter, 'chemistry.ph.input.source_mode', {
76
+ name: {
77
+ en: 'Source mode',
78
+ de: 'Quellenmodus',
79
+ },
80
+ desc: {
81
+ en: 'Defines how the pH value is provided.',
82
+ de: 'Legt fest, wie der pH-Wert bereitgestellt wird.',
83
+ },
84
+ type: 'string',
85
+ role: 'level',
86
+ read: true,
87
+ write: true,
88
+ def: 'disabled',
89
+ states: {
90
+ disabled: 'disabled',
91
+ manual: 'manual',
92
+ state: 'state',
93
+ },
94
+ persist: true,
95
+ });
96
+
97
+ await createState(adapter, 'chemistry.ph.input.source_state_id', {
98
+ name: {
99
+ en: 'Source state ID',
100
+ de: 'Quell-Datenpunkt',
101
+ },
102
+ desc: {
103
+ en: 'External ioBroker state ID that provides the pH value.',
104
+ de: 'Externer ioBroker-Datenpunkt, der den pH-Wert liefert.',
105
+ },
106
+ type: 'string',
107
+ role: 'text',
108
+ read: true,
109
+ write: true,
110
+ def: '',
111
+ persist: true,
112
+ });
113
+
114
+ await createState(adapter, 'chemistry.ph.input.manual_value', {
115
+ name: {
116
+ en: 'Manual pH value',
117
+ de: 'Manueller pH-Wert',
118
+ },
119
+ desc: {
120
+ en: 'Manually entered pH value.',
121
+ de: 'Manuell eingetragener pH-Wert.',
122
+ },
123
+ type: 'number',
124
+ role: 'value',
125
+ read: true,
126
+ write: true,
127
+ def: 7.2,
128
+ min: 0,
129
+ max: 14,
130
+ persist: true,
131
+ });
132
+
133
+ await createState(adapter, 'chemistry.ph.input.current_value', {
134
+ name: {
135
+ en: 'Current pH value',
136
+ de: 'Aktueller pH-Wert',
137
+ },
138
+ desc: {
139
+ en: 'Current pH value used or received by PoolControl.',
140
+ de: 'Aktueller von PoolControl verwendeter oder empfangener pH-Wert.',
141
+ },
142
+ type: 'number',
143
+ role: 'value',
144
+ read: true,
145
+ write: false,
146
+ def: 0,
147
+ min: 0,
148
+ max: 14,
149
+ persist: true,
150
+ });
151
+
152
+ await createState(adapter, 'chemistry.ph.input.source_valid', {
153
+ name: {
154
+ en: 'Source valid',
155
+ de: 'Quelle gültig',
156
+ },
157
+ desc: {
158
+ en: 'Shows whether the configured source exists and can be used.',
159
+ de: 'Zeigt an, ob die konfigurierte Quelle existiert und genutzt werden kann.',
160
+ },
161
+ type: 'boolean',
162
+ role: 'indicator',
163
+ read: true,
164
+ write: false,
165
+ def: false,
166
+ persist: true,
167
+ });
168
+
169
+ await createState(adapter, 'chemistry.ph.input.value_valid', {
170
+ name: {
171
+ en: 'Value valid',
172
+ de: 'Wert gültig',
173
+ },
174
+ desc: {
175
+ en: 'Shows whether the current pH value is plausible.',
176
+ de: 'Zeigt an, ob der aktuelle pH-Wert plausibel ist.',
177
+ },
178
+ type: 'boolean',
179
+ role: 'indicator',
180
+ read: true,
181
+ write: false,
182
+ def: false,
183
+ persist: true,
184
+ });
185
+
186
+ await createState(adapter, 'chemistry.ph.input.source_status', {
187
+ name: {
188
+ en: 'Source status',
189
+ de: 'Quellenstatus',
190
+ },
191
+ desc: {
192
+ en: 'Readable status of the pH input source.',
193
+ de: 'Lesbarer Status der pH-Eingangsquelle.',
194
+ },
195
+ type: 'string',
196
+ role: 'text',
197
+ read: true,
198
+ write: false,
199
+ def: '',
200
+ persist: true,
201
+ });
202
+
203
+ await createState(adapter, 'chemistry.ph.input.last_value_at', {
204
+ name: {
205
+ en: 'Last value time',
206
+ de: 'Zeitpunkt des letzten Werts',
207
+ },
208
+ desc: {
209
+ en: 'Readable date and time when the last pH value was received.',
210
+ de: 'Lesbares Datum und Uhrzeit, wann der letzte pH-Wert empfangen wurde.',
211
+ },
212
+ type: 'string',
213
+ role: 'value.time',
214
+ read: true,
215
+ write: false,
216
+ def: '',
217
+ persist: true,
218
+ });
219
+
220
+ await createState(adapter, 'chemistry.ph.input.last_valid_value', {
221
+ name: {
222
+ en: 'Last valid pH value',
223
+ de: 'Letzter gültiger pH-Wert',
224
+ },
225
+ desc: {
226
+ en: 'Last valid and plausible pH value.',
227
+ de: 'Letzter gültiger und plausibler pH-Wert.',
228
+ },
229
+ type: 'number',
230
+ role: 'value',
231
+ read: true,
232
+ write: false,
233
+ def: 0,
234
+ min: 0,
235
+ max: 14,
236
+ persist: true,
237
+ });
238
+
239
+ await createState(adapter, 'chemistry.ph.input.last_valid_value_at', {
240
+ name: {
241
+ en: 'Last valid value time',
242
+ de: 'Zeitpunkt des letzten gültigen Werts',
243
+ },
244
+ desc: {
245
+ en: 'Readable date and time of the last valid pH value.',
246
+ de: 'Lesbares Datum und Uhrzeit des letzten gültigen pH-Werts.',
247
+ },
248
+ type: 'string',
249
+ role: 'value.time',
250
+ read: true,
251
+ write: false,
252
+ def: '',
253
+ persist: true,
254
+ });
255
+
256
+ await createState(adapter, 'chemistry.ph.input.previous_value', {
257
+ name: {
258
+ en: 'Previous valid pH value',
259
+ de: 'Vorheriger gültiger pH-Wert',
260
+ },
261
+ desc: {
262
+ en: 'Valid pH value before the latest valid value.',
263
+ de: 'Gültiger pH-Wert vor dem letzten gültigen Wert.',
264
+ },
265
+ type: 'number',
266
+ role: 'value',
267
+ read: true,
268
+ write: false,
269
+ def: 0,
270
+ min: 0,
271
+ max: 14,
272
+ persist: true,
273
+ });
274
+
275
+ await createState(adapter, 'chemistry.ph.input.previous_value_at', {
276
+ name: {
277
+ en: 'Previous valid value time',
278
+ de: 'Zeitpunkt des vorherigen gültigen Werts',
279
+ },
280
+ desc: {
281
+ en: 'Readable date and time of the previous valid pH value.',
282
+ de: 'Lesbares Datum und Uhrzeit des vorherigen gültigen pH-Werts.',
283
+ },
284
+ type: 'string',
285
+ role: 'value.time',
286
+ read: true,
287
+ write: false,
288
+ def: '',
289
+ persist: true,
290
+ });
291
+
292
+ await createState(adapter, 'chemistry.ph.input.minutes_since_previous_value', {
293
+ name: {
294
+ en: 'Minutes since previous value',
295
+ de: 'Minuten seit vorherigem Wert',
296
+ },
297
+ desc: {
298
+ en: 'Time difference between the last two valid pH values.',
299
+ de: 'Zeitdifferenz zwischen den letzten beiden gültigen pH-Werten.',
300
+ },
301
+ type: 'number',
302
+ role: 'value',
303
+ read: true,
304
+ write: false,
305
+ def: 0,
306
+ unit: 'min',
307
+ persist: true,
308
+ });
309
+
310
+ // -------------------------------------------------------------
311
+ // Evaluation
312
+ // -------------------------------------------------------------
313
+ await createChannel(adapter, 'chemistry.ph.evaluation', {
314
+ en: 'Evaluation',
315
+ de: 'Auswertung',
316
+ });
317
+
318
+ await createState(adapter, 'chemistry.ph.evaluation.target_min', {
319
+ name: {
320
+ en: 'Target minimum',
321
+ de: 'Zielwert Minimum',
322
+ },
323
+ desc: {
324
+ en: 'Lower limit of the desired pH range.',
325
+ de: 'Untere Grenze des gewünschten pH-Bereichs.',
326
+ },
327
+ type: 'number',
328
+ role: 'level',
329
+ read: true,
330
+ write: true,
331
+ def: 7.0,
332
+ min: 0,
333
+ max: 14,
334
+ persist: true,
335
+ });
336
+
337
+ await createState(adapter, 'chemistry.ph.evaluation.target_max', {
338
+ name: {
339
+ en: 'Target maximum',
340
+ de: 'Zielwert Maximum',
341
+ },
342
+ desc: {
343
+ en: 'Upper limit of the desired pH range.',
344
+ de: 'Obere Grenze des gewünschten pH-Bereichs.',
345
+ },
346
+ type: 'number',
347
+ role: 'level',
348
+ read: true,
349
+ write: true,
350
+ def: 7.4,
351
+ min: 0,
352
+ max: 14,
353
+ persist: true,
354
+ });
355
+
356
+ await createState(adapter, 'chemistry.ph.evaluation.status', {
357
+ name: {
358
+ en: 'pH status',
359
+ de: 'pH-Status',
360
+ },
361
+ desc: {
362
+ en: 'Compact pH evaluation status.',
363
+ de: 'Kompakter Status der pH-Auswertung.',
364
+ },
365
+ type: 'string',
366
+ role: 'text',
367
+ read: true,
368
+ write: false,
369
+ def: 'disabled',
370
+ persist: true,
371
+ });
372
+
373
+ await createState(adapter, 'chemistry.ph.evaluation.recommendation', {
374
+ name: {
375
+ en: 'Recommendation',
376
+ de: 'Empfehlung',
377
+ },
378
+ desc: {
379
+ en: 'Readable recommendation for the user. No automatic dosing.',
380
+ de: 'Lesbare Empfehlung für den Nutzer. Keine automatische Dosierung.',
381
+ },
382
+ type: 'string',
383
+ role: 'text',
384
+ read: true,
385
+ write: false,
386
+ def: '',
387
+ persist: true,
388
+ });
389
+
390
+ await createState(adapter, 'chemistry.ph.evaluation.action_required', {
391
+ name: {
392
+ en: 'Action required',
393
+ de: 'Handlung erforderlich',
394
+ },
395
+ desc: {
396
+ en: 'Shows whether user action is recommended.',
397
+ de: 'Zeigt an, ob eine Handlung durch den Nutzer empfohlen wird.',
398
+ },
399
+ type: 'boolean',
400
+ role: 'indicator',
401
+ read: true,
402
+ write: false,
403
+ def: false,
404
+ persist: true,
405
+ });
406
+
407
+ // -------------------------------------------------------------
408
+ // Measurement
409
+ // -------------------------------------------------------------
410
+ await createChannel(adapter, 'chemistry.ph.measurement', {
411
+ en: 'Measurement',
412
+ de: 'Messung',
413
+ });
414
+
415
+ await createState(adapter, 'chemistry.ph.measurement.location', {
416
+ name: {
417
+ en: 'Measurement location',
418
+ de: 'Messort',
419
+ },
420
+ desc: {
421
+ en: 'Defines where the pH value is measured.',
422
+ de: 'Legt fest, wo der pH-Wert gemessen wird.',
423
+ },
424
+ type: 'string',
425
+ role: 'level',
426
+ read: true,
427
+ write: true,
428
+ def: 'manual',
429
+ states: {
430
+ manual: 'manual',
431
+ pool: 'pool',
432
+ measurement_cell: 'measurement_cell',
433
+ pipe_section: 'pipe_section',
434
+ },
435
+ persist: true,
436
+ });
437
+
438
+ await createState(adapter, 'chemistry.ph.measurement.flow_required', {
439
+ name: {
440
+ en: 'Flow required',
441
+ de: 'Durchfluss erforderlich',
442
+ },
443
+ desc: {
444
+ en: 'If enabled, values are only evaluated when the pool pump is running.',
445
+ de: 'Wenn aktiv, werden Werte nur bei laufender Poolpumpe ausgewertet.',
446
+ },
447
+ type: 'boolean',
448
+ role: 'switch',
449
+ read: true,
450
+ write: true,
451
+ def: false,
452
+ persist: true,
453
+ });
454
+
455
+ await createState(adapter, 'chemistry.ph.measurement.stabilization_time_sec', {
456
+ name: {
457
+ en: 'Stabilization time',
458
+ de: 'Stabilisierungszeit',
459
+ },
460
+ desc: {
461
+ en: 'Delay after pump start before values from a measurement section are evaluated.',
462
+ de: 'Wartezeit nach Pumpenstart, bevor Werte aus einer Messstrecke ausgewertet werden.',
463
+ },
464
+ type: 'number',
465
+ role: 'level',
466
+ read: true,
467
+ write: true,
468
+ def: 120,
469
+ min: 0,
470
+ unit: 's',
471
+ persist: true,
472
+ });
473
+
474
+ await createState(adapter, 'chemistry.ph.measurement.allowed', {
475
+ name: {
476
+ en: 'Measurement allowed',
477
+ de: 'Messung erlaubt',
478
+ },
479
+ desc: {
480
+ en: 'Shows whether pH values are currently allowed to be evaluated.',
481
+ de: 'Zeigt an, ob pH-Werte aktuell ausgewertet werden dürfen.',
482
+ },
483
+ type: 'boolean',
484
+ role: 'indicator',
485
+ read: true,
486
+ write: false,
487
+ def: false,
488
+ persist: true,
489
+ });
490
+
491
+ await createState(adapter, 'chemistry.ph.measurement.pump_running', {
492
+ name: {
493
+ en: 'Pump running',
494
+ de: 'Pumpe läuft',
495
+ },
496
+ desc: {
497
+ en: 'Shows whether the pool pump is currently detected as running.',
498
+ de: 'Zeigt an, ob die Poolpumpe aktuell als laufend erkannt wird.',
499
+ },
500
+ type: 'boolean',
501
+ role: 'indicator',
502
+ read: true,
503
+ write: false,
504
+ def: false,
505
+ persist: true,
506
+ });
507
+
508
+ await createState(adapter, 'chemistry.ph.measurement.stabilized', {
509
+ name: {
510
+ en: 'Measurement stabilized',
511
+ de: 'Messung stabilisiert',
512
+ },
513
+ desc: {
514
+ en: 'Shows whether the stabilization time after pump start has elapsed.',
515
+ de: 'Zeigt an, ob die Stabilisierungszeit nach Pumpenstart abgelaufen ist.',
516
+ },
517
+ type: 'boolean',
518
+ role: 'indicator',
519
+ read: true,
520
+ write: false,
521
+ def: false,
522
+ persist: true,
523
+ });
524
+
525
+ await createState(adapter, 'chemistry.ph.measurement.ignored_reason', {
526
+ name: {
527
+ en: 'Ignored reason',
528
+ de: 'Ignorierter Grund',
529
+ },
530
+ desc: {
531
+ en: 'Reason why the current pH value is not evaluated.',
532
+ de: 'Grund, warum der aktuelle pH-Wert nicht ausgewertet wird.',
533
+ },
534
+ type: 'string',
535
+ role: 'text',
536
+ read: true,
537
+ write: false,
538
+ def: '',
539
+ persist: true,
540
+ });
541
+
542
+ // -------------------------------------------------------------
543
+ // Mix
544
+ // -------------------------------------------------------------
545
+ await createChannel(adapter, 'chemistry.ph.mix', {
546
+ en: 'Mixing run',
547
+ de: 'Mischlauf',
548
+ });
549
+
550
+ await createState(adapter, 'chemistry.ph.mix.runtime_minutes', {
551
+ name: {
552
+ en: 'Mixing runtime',
553
+ de: 'Mischlaufzeit',
554
+ },
555
+ desc: {
556
+ en: 'Runtime in minutes for a manual mixing run after chemical correction.',
557
+ de: 'Laufzeit in Minuten für einen manuellen Mischlauf nach einer Chemiekorrektur.',
558
+ },
559
+ type: 'number',
560
+ role: 'level',
561
+ read: true,
562
+ write: true,
563
+ def: 60,
564
+ min: 0,
565
+ unit: 'min',
566
+ persist: true,
567
+ });
568
+
569
+ await createState(adapter, 'chemistry.ph.mix.start', {
570
+ name: {
571
+ en: 'Start mixing run',
572
+ de: 'Mischlauf starten',
573
+ },
574
+ desc: {
575
+ en: 'Starts a manual mixing run. This does not dose chemicals.',
576
+ de: 'Startet einen manuellen Mischlauf. Es wird keine Chemie dosiert.',
577
+ },
578
+ type: 'boolean',
579
+ role: 'button',
580
+ read: true,
581
+ write: true,
582
+ def: false,
583
+ });
584
+
585
+ await createState(adapter, 'chemistry.ph.mix.active', {
586
+ name: {
587
+ en: 'Mixing run active',
588
+ de: 'Mischlauf aktiv',
589
+ },
590
+ desc: {
591
+ en: 'Shows whether a pH mixing run is currently active.',
592
+ de: 'Zeigt an, ob aktuell ein pH-Mischlauf aktiv ist.',
593
+ },
594
+ type: 'boolean',
595
+ role: 'indicator',
596
+ read: true,
597
+ write: false,
598
+ def: false,
599
+ persist: true,
600
+ });
601
+
602
+ await createState(adapter, 'chemistry.ph.mix.remaining_minutes', {
603
+ name: {
604
+ en: 'Remaining mixing runtime',
605
+ de: 'Verbleibende Mischlaufzeit',
606
+ },
607
+ desc: {
608
+ en: 'Remaining runtime of the current pH mixing run.',
609
+ de: 'Verbleibende Laufzeit des aktuellen pH-Mischlaufs.',
610
+ },
611
+ type: 'number',
612
+ role: 'value',
613
+ read: true,
614
+ write: false,
615
+ def: 0,
616
+ unit: 'min',
617
+ persist: true,
618
+ });
619
+
620
+ await createState(adapter, 'chemistry.ph.mix.started_by_helper', {
621
+ name: {
622
+ en: 'Pump started by pH helper',
623
+ de: 'Pumpe durch pH-Helper gestartet',
624
+ },
625
+ desc: {
626
+ en: 'Shows whether the pH helper started the pump for the current mixing run.',
627
+ de: 'Zeigt an, ob der pH-Helper die Pumpe für den aktuellen Mischlauf gestartet hat.',
628
+ },
629
+ type: 'boolean',
630
+ role: 'indicator',
631
+ read: true,
632
+ write: false,
633
+ def: false,
634
+ persist: true,
635
+ });
636
+
637
+ await createState(adapter, 'chemistry.ph.mix.status', {
638
+ name: {
639
+ en: 'Mixing status',
640
+ de: 'Mischlaufstatus',
641
+ },
642
+ desc: {
643
+ en: 'Readable status of the pH mixing run.',
644
+ de: 'Lesbarer Status des pH-Mischlaufs.',
645
+ },
646
+ type: 'string',
647
+ role: 'text',
648
+ read: true,
649
+ write: false,
650
+ def: '',
651
+ persist: true,
652
+ });
653
+
654
+ // -------------------------------------------------------------
655
+ // Debug
656
+ // -------------------------------------------------------------
657
+ await createChannel(adapter, 'chemistry.ph.debug', {
658
+ en: 'Debug',
659
+ de: 'Debug',
660
+ });
661
+
662
+ await createState(adapter, 'chemistry.ph.debug.last_update', {
663
+ name: {
664
+ en: 'Last update',
665
+ de: 'Letzte Aktualisierung',
666
+ },
667
+ desc: {
668
+ en: 'Readable timestamp of the last pH evaluation update.',
669
+ de: 'Lesbarer Zeitstempel der letzten pH-Auswertung.',
670
+ },
671
+ type: 'string',
672
+ role: 'value.time',
673
+ read: true,
674
+ write: false,
675
+ def: '',
676
+ persist: true,
677
+ });
678
+
679
+ await createState(adapter, 'chemistry.ph.debug.last_reason', {
680
+ name: {
681
+ en: 'Last reason',
682
+ de: 'Letzter Grund',
683
+ },
684
+ desc: {
685
+ en: 'Reason for the last pH evaluation update.',
686
+ de: 'Grund der letzten pH-Auswertung.',
687
+ },
688
+ type: 'string',
689
+ role: 'text',
690
+ read: true,
691
+ write: false,
692
+ def: '',
693
+ persist: true,
694
+ });
695
+
696
+ adapter.log.debug('[chemistryPhStates] Initialization completed');
697
+ }
698
+
699
+ module.exports = {
700
+ createChemistryPhStates,
701
+ };