iobroker.smartloadmanager 0.1.2 → 0.2.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.
@@ -98,7 +98,6 @@
98
98
  "xl": 3,
99
99
  "label": "enableForecast"
100
100
  },
101
-
102
101
  "forecastJsonDatapoint": {
103
102
  "type": "objectId",
104
103
  "newLine": true,
@@ -114,6 +113,97 @@
114
113
  "type": "number",
115
114
  "label": "forecastDefaultMinMinutes",
116
115
  "tooltip": "tooltip_forecastDefaultMinMinutes",
116
+ "default": 30,
117
+ "min": 15,
118
+ "max": 360,
119
+ "xs": 12,
120
+ "sm": 12,
121
+ "md": 3,
122
+ "lg": 3,
123
+ "xl": 3
124
+ },
125
+ "forecastPowerUnit": {
126
+ "type": "select",
127
+ "label": "forecastPowerUnit",
128
+ "default": "auto",
129
+ "options": [
130
+ { "label": "forecastUnitAuto", "value": "auto" },
131
+ { "label": "W", "value": "W" },
132
+ { "label": "kW", "value": "kW" }
133
+ ],
134
+ "xs": 12,
135
+ "sm": 12,
136
+ "md": 3,
137
+ "lg": 3,
138
+ "xl": 3
139
+ },
140
+ "forecastSafetyPercent": {
141
+ "type": "number",
142
+ "label": "forecastSafetyPercent",
143
+ "tooltip": "tooltip_forecastSafetyPercent",
144
+ "default": 80,
145
+ "min": 50,
146
+ "max": 100,
147
+ "xs": 12,
148
+ "sm": 12,
149
+ "md": 3,
150
+ "lg": 3,
151
+ "xl": 3
152
+ },
153
+ "forecastMaxStartMinutes": {
154
+ "type": "number",
155
+ "label": "forecastMaxStartMinutes",
156
+ "default": 30,
157
+ "min": 0,
158
+ "max": 180,
159
+ "xs": 12,
160
+ "sm": 12,
161
+ "md": 3,
162
+ "lg": 3,
163
+ "xl": 3
164
+ },
165
+ "forecastMinCurrentPercent": {
166
+ "type": "number",
167
+ "label": "forecastMinCurrentPercent",
168
+ "tooltip": "tooltip_forecastMinCurrentPercent",
169
+ "default": 50,
170
+ "min": 0,
171
+ "max": 100,
172
+ "xs": 12,
173
+ "sm": 12,
174
+ "md": 3,
175
+ "lg": 3,
176
+ "xl": 3
177
+ },
178
+ "forecastBridgeMinutes": {
179
+ "type": "number",
180
+ "label": "forecastBridgeMinutes",
181
+ "default": 5,
182
+ "min": 0,
183
+ "max": 30,
184
+ "xs": 12,
185
+ "sm": 12,
186
+ "md": 3,
187
+ "lg": 3,
188
+ "xl": 3
189
+ },
190
+ "forecastMaxGridImport": {
191
+ "type": "number",
192
+ "label": "forecastMaxGridImport",
193
+ "tooltip": "tooltip_forecastMaxGridImport",
194
+ "default": 100,
195
+ "min": 0,
196
+ "max": 5000,
197
+ "xs": 12,
198
+ "sm": 12,
199
+ "md": 3,
200
+ "lg": 3,
201
+ "xl": 3
202
+ },
203
+ "notifyForecast": {
204
+ "type": "checkbox",
205
+ "label": "notifyForecast",
206
+ "default": false,
117
207
  "xs": 12,
118
208
  "sm": 12,
119
209
  "md": 3,
@@ -135,7 +225,13 @@
135
225
  "lg": 8,
136
226
  "xl": 8,
137
227
  "showSecondAddAt": 10,
138
- "useCardFor": ["xs", "sm", "md", "lg", "xl"],
228
+ "useCardFor": [
229
+ "xs",
230
+ "sm",
231
+ "md",
232
+ "lg",
233
+ "xl"
234
+ ],
139
235
  "compact": true,
140
236
  "items": [
141
237
  {
@@ -205,6 +301,19 @@
205
301
  "pl": "Ustawienia zarządzania akumulatorem:",
206
302
  "uk": "Параметри керування акумуляторами:",
207
303
  "zh-cn": "电池管理设置 :"
304
+ },
305
+ "text": {
306
+ "en": "Battery management settings:",
307
+ "de": "Einstellung Batteriemanagment:",
308
+ "ru": "Настройки управления батареями:",
309
+ "pt": "Configurações de gerenciamento de baterias:",
310
+ "nl": "Instellingen voor batterijbeheer:",
311
+ "fr": "Paramètres de gestion de la batterie :",
312
+ "it": "Impostazioni di gestione della batteria:",
313
+ "es": "Ajustes de gestión de baterías:",
314
+ "pl": "Ustawienia zarządzania akumulatorem:",
315
+ "uk": "Параметри керування акумуляторами:",
316
+ "zh-cn": "电池管理设置 :"
208
317
  }
209
318
  },
210
319
  {
@@ -293,6 +402,19 @@
293
402
  "pl": "Ustawienia prognozy PV",
294
403
  "uk": "Параметри прогнозу PV",
295
404
  "zh-cn": "PV 预测设置"
405
+ },
406
+ "text": {
407
+ "en": "PV Forecast Settings",
408
+ "de": "Einstellung PV-Forecast:",
409
+ "ru": "Настройки PV прогноза",
410
+ "pt": "Configuração da Previsão do PV",
411
+ "nl": "PV-voorspellingsinstellingen",
412
+ "fr": "Paramètres des prévisions PV",
413
+ "it": "Impostazioni di previsione PV",
414
+ "es": "Ajustes de predicción PV",
415
+ "pl": "Ustawienia prognozy PV",
416
+ "uk": "Параметри прогнозу PV",
417
+ "zh-cn": "PV 预测设置"
296
418
  }
297
419
  },
298
420
  {
@@ -329,10 +451,54 @@
329
451
  "uk": "Мінімальна тривалість прогнозу (хвилини)",
330
452
  "zh-cn": "预测最低时间(分钟)"
331
453
  },
332
- "tooltip": "tooltip_forecastMinMinutes"
454
+ "tooltip": "tooltip_forecastMinMinutes",
455
+ "default": 30,
456
+ "min": 15,
457
+ "max": 360
458
+ },
459
+ {
460
+ "type": "number",
461
+ "attr": "minimumOnMinutes",
462
+ "title": {
463
+ "en": "Minimum run time (minutes)",
464
+ "de": "Mindestlaufzeit (Minuten)",
465
+ "ru": "Минимальное время работы (минуты)",
466
+ "pt": "Tempo mínimo de funcionamento (minutos)",
467
+ "nl": "Minimale looptijd (minuten)",
468
+ "fr": "Durée minimale de fonctionnement (minutes)",
469
+ "it": "Tempo minimo di funzionamento (minuti)",
470
+ "es": "Tiempo mínimo de funcionamiento (minutos)",
471
+ "pl": "Minimalny czas pracy (minuty)",
472
+ "uk": "Мінімальний час роботи (хвилини)",
473
+ "zh-cn": "最短运行时间(分钟)"
474
+ },
475
+ "default": 10,
476
+ "min": 0,
477
+ "max": 1440
478
+ },
479
+ {
480
+ "type": "number",
481
+ "attr": "minimumOffMinutes",
482
+ "title": {
483
+ "en": "Minimum off time (minutes)",
484
+ "de": "Mindeststillstandszeit (Minuten)",
485
+ "ru": "Минимальное время простоя (минуты)",
486
+ "pt": "Tempo mínimo desligado (minutos)",
487
+ "nl": "Minimale uitschakeltijd (minuten)",
488
+ "fr": "Durée minimale d’arrêt (minutes)",
489
+ "it": "Tempo minimo di spegnimento (minuti)",
490
+ "es": "Tiempo mínimo de apagado (minutos)",
491
+ "pl": "Minimalny czas wyłączenia (minuty)",
492
+ "uk": "Мінімальний час вимкнення (хвилини)",
493
+ "zh-cn": "最短停机时间(分钟)"
494
+ },
495
+ "default": 5,
496
+ "min": 0,
497
+ "max": 1440
333
498
  },
334
499
  {
335
500
  "type": "staticText",
501
+ "newLine": true,
336
502
  "title": {
337
503
  "en": "Heating element setting:",
338
504
  "de": "Einstellung Heizelement:",
@@ -346,7 +512,19 @@
346
512
  "uk": "Налаштування нагрівальних елементів:",
347
513
  "zh-cn": "加热元素设置 :"
348
514
  },
349
- "newLine": true
515
+ "text": {
516
+ "en": "Heating element setting:",
517
+ "de": "Einstellung Heizelement:",
518
+ "ru": "Настройка нагревательного элемента:",
519
+ "pt": "Configuração do elemento de aquecimento:",
520
+ "nl": "Verwarmingselementinstelling:",
521
+ "fr": "Réglage des éléments de chauffage:",
522
+ "it": "Regolazione degli elementi riscaldanti:",
523
+ "es": "Ajuste del elemento de calefacción:",
524
+ "pl": "Ustawienia elementów grzewczych:",
525
+ "uk": "Налаштування нагрівальних елементів:",
526
+ "zh-cn": "加热元素设置 :"
527
+ }
350
528
  },
351
529
  {
352
530
  "type": "objectId",
@@ -447,6 +625,7 @@
447
625
  },
448
626
  {
449
627
  "type": "staticText",
628
+ "newLine": true,
450
629
  "title": {
451
630
  "en": "Consumer settings:",
452
631
  "de": "Verbrauchereinstellungen:",
@@ -460,7 +639,19 @@
460
639
  "uk": "Параметри споживача:",
461
640
  "zh-cn": "消费者环境:"
462
641
  },
463
- "newLine": true
642
+ "text": {
643
+ "en": "Consumer settings:",
644
+ "de": "Verbrauchereinstellungen:",
645
+ "ru": "Потребительские настройки:",
646
+ "pt": "Configurações do consumidor:",
647
+ "nl": "Instellingen voor consumenten:",
648
+ "fr": "Paramètres des consommateurs:",
649
+ "it": "Impostazioni dei consumatori:",
650
+ "es": "Ajustes del consumidor:",
651
+ "pl": "Ustawienia konsumentów:",
652
+ "uk": "Параметри споживача:",
653
+ "zh-cn": "消费者环境:"
654
+ }
464
655
  },
465
656
  {
466
657
  "type": "number",
@@ -0,0 +1,283 @@
1
+ ![Logo](../../admin/smartloadmanager.png)
2
+
3
+ # ioBroker.smartloadmanager
4
+
5
+ ## Beispiele für Version 0.2.0
6
+
7
+ Voraussetzung: Node.js ab 22.19.0. Der Adapter sendet Gerätebefehle mit
8
+ `ack: false`; die Bestätigung (`ack: true`) übernimmt der zuständige Geräteadapter.
9
+ Der Einspeisewert muss die Leistung am Netzanschlusspunkt in Watt darstellen.
10
+ Bei negativem Vorzeichen für Einspeisung muss `feedinNegativ` aktiviert werden.
11
+ Die Grundlast wird zusätzlich als Reserve abgezogen; bereits im Netzanschlusswert
12
+ enthaltenen Hausverbrauch nicht nochmals als Grundlast eintragen.
13
+
14
+ ### Binärer Verbraucher und Heizung
15
+
16
+ Beispiel: Steckdose mit `performance: 1000`, `switchOnPoint: 1200`,
17
+ `switchOffPoint: 0`, `switchOnDelay: 20`, `switchOffDelay: 10`.
18
+ Ab 1200 W Überschuss nach Grundlast startet die Einschaltverzögerung.
19
+ Bei Netzbezug oder Unterschreiten der Abschaltgrenze startet die Abschaltung.
20
+ `minimumOnMinutes: 10` und `minimumOffMinutes: 5` begrenzen häufiges Schalten;
21
+ stärkerer Netzbezug als `forecastMaxGridImport` übergeht die Mindestlaufzeit.
22
+ Mit `0` können Mindestzeiten explizit deaktiviert werden.
23
+
24
+ `datapoint` schaltet boolean, `numericDatapoint` numerisch mit 0/1.
25
+ Für Heizungen `ruletype: heating` wählen und Temperatur-, Freigabe- und
26
+ Heartbeat-Datenpunkte konfigurieren. Das Erreichen von `maxTemperature` sowie
27
+ fehlende Freigabe oder ein falscher Heartbeat verhindern das Einschalten.
28
+ Ein gesetzter Heartbeat-Datenpunkt wird auf seinen Wahrheitswert geprüft;
29
+ das ist keine Überwachung seines Alters.
30
+ Fehlt ein konfigurierter Temperatursensor oder liefert er keinen endlichen
31
+ Zahlenwert, wird eine Heizung nicht eingeschaltet bzw. automatisch abgeschaltet.
32
+ „Ausschalten nur zu Ausschaltzeit“ unterdrückt absichtlich die normale
33
+ Überschussabschaltung bis zum Zeitfensterende; Heizschutz bleibt wirksam.
34
+
35
+ ### Prozentregelung und Batterie
36
+
37
+ Ein Prozentverbraucher mit 2000 W Maximalleistung und aktuell 50 % benötigt
38
+ 1000 W. Zeigt der Netzzähler zusätzlich 400 W Einspeisung, wird auf 70 % geregelt.
39
+ Bei 200 W Netzbezug wird auf 40 % reduziert. Liegt die tragbare Leistung unter
40
+ `minPercentStart`, wird auf 0 % geregelt. Deaktivierte Verbraucher werden nicht geregelt.
41
+ Die Leistungsrechnung setzt voraus, dass der Verbraucher im Netzzähler enthalten ist.
42
+
43
+ Für eine Batterie `batterySetpoint`, `performance`, optional `batterySOC` und
44
+ `batteryTargetSOC` wählen. Bei 800 W verfügbarem Überschuss und maximal 1500 W
45
+ Ladeleistung wird 800 W vorgegeben. Bei erreichtem Ziel-SOC wird die Ladeleistung 0.
46
+ Der optionale globale Batterie-Modusdatenpunkt verwendet 0 (aus), 1 (Ziel erreicht)
47
+ und 2 (laden); diese Werte müssen zum Geräteadapter passen.
48
+
49
+ `controlMode` im Objektbaum: 0 = aus, 1 = manuell ein, 2 = automatisch.
50
+ Manuell ein setzt Prozentverbraucher auf 100 % bzw. die Batterie auf ihre konfigurierte
51
+ Leistung. Automatische Prozent- und Batterieregler überschreiben manuelle Modi nicht.
52
+ Die Batterie berücksichtigt bereits angeforderte Ladeleistung und korrigiert sie
53
+ um den gemessenen Netzüberschuss. `batteryDelaySeconds` und `delaySecondsProzent`
54
+ gelten auch bei häufigen Zähleraktualisierungen; 0 bedeutet sofortige Regelung.
55
+ Fehlt ein konfigurierter SOC-/Ziel-SOC-Wert, wird die Ladeleistung auf 0 gesetzt.
56
+ Zeitfenster werden zusätzlich alle 15 Sekunden geprüft. Das Deaktivieren eines
57
+ Verbrauchers beendet seine ausstehenden Schaltbefehle; es schaltet das Gerät nicht
58
+ automatisch aus. Dafür `controlMode: 0` verwenden.
59
+
60
+ ### PV-Prognose mit ioBroker.pvforecast
61
+
62
+ `enableForecast` aktivieren, `forecastJsonDatapoint` etwa auf
63
+ `pvforecast.0.summary.JSONData` setzen und beim Verbraucher `useForecast` aktivieren.
64
+ Beispiel für das erwartete Format (Zeitstempel sind Unix-Millisekunden):
65
+
66
+ ```js
67
+ const now = Date.now();
68
+ const forecast = [0, 15, 30, 45].map(minutes => ({
69
+ t: now + minutes * 60000,
70
+ y: 3.5,
71
+ }));
72
+ // JSON.stringify(forecast), mit forecastPowerUnit = "kW"
73
+ ```
74
+
75
+ Bei 500 W Grundlast bleiben 3000 W prognostizierter Überschuss.
76
+ Mit `forecastSafetyPercent: 80` stehen konservativ 2400 W zur Verfügung.
77
+ Ein 2000-W-Verbraucher kann freigegeben werden, wenn das Zeitfenster mindestens
78
+ `forecastMinMinutes: 30` lang ist, höchstens `forecastMaxStartMinutes: 30`
79
+ Minuten entfernt liegt und bei `forecastMinCurrentPercent: 50` bereits mindestens
80
+ 1000 W realer Überschuss vorhanden sind. Prognosen ersetzen keinen gemessenen Überschuss.
81
+
82
+ `forecastBridgeMinutes: 5` begrenzt das Überbrücken kurzer Einbrüche;
83
+ `forecastMaxGridImport: 100` verhindert Überbrücken bei mehr als 100 W Netzbezug.
84
+ Vergangene Datenpunkte werden verworfen. Bei kleinen W-Werten die Einheit explizit
85
+ auf `W` setzen, da die automatische Erkennung Werte bis 100 als kW interpretiert.
86
+ `forecast.*` und die Prognosestatuswerte des Verbrauchers zeigen die Entscheidung an.
87
+
88
+ Zeitfenster können über Mitternacht gehen, z. B. 22:00–06:00.
89
+ Gleiche Start- und Endzeit gelten als ganztägiges Fenster.
90
+
91
+ Prüfumfang und externe Release-Abhängigkeiten: [Release-Prüfbericht](release-0.2.0-pruefung.md).
92
+
93
+ ## 🔧 Beschreibung
94
+
95
+ Der Adapter **smartloadmanager** dient der dynamischen Steuerung von Verbrauchern anhand eines PV-Einspeisewertes. Ziel ist es, Überschuss-Strom lokal zu verbrauchen und so die Einspeisung ins öffentliche Netz zu minimieren oder vollständig zu vermeiden. Er unterstützt sowohl Ein/Aus-Verbraucher als auch prozentual regelbare Geräte und Batteriespeicher.
96
+
97
+ ---
98
+
99
+ ## 🚀 Funktionen
100
+
101
+ - ✅ Überwachung eines konfigurierbaren Einspeisungs-Datenpunkts
102
+ - ✅ Dynamische Zuschaltung von Verbrauchern bei Überschuss
103
+ - ✅ Dynamische Abschaltung bei Defizit oder Netzbezug
104
+ - ✅ Unterstützt **binary**, **percent**, **Heating** und **battery**-Verbraucher
105
+ - ✅ Prozentregelung mit Verzögerung (sanftes Rückregeln), optional pro Verbraucher konfigurierbar
106
+ - ✅ Dynamische Ladeleistung für Batteriespeicher mit Ziel-SOC
107
+ - ✅ Zeitfenster für Ein-/Ausschaltlogik je Verbraucher (inkl. "nur zu Abschaltzeit")
108
+ - ✅ Automatische Objekt-Erstellung mit erweiterten Informationen je Verbraucher
109
+ - ✅ Steuerungsmodus: Off / Manual On / Auto für jeden Verbraucher separat
110
+ - ✅ Hysterese-Steuerung durch separate Ein-/Abschaltgrenzen
111
+ - ✅ Verbraucherspezifische Schaltverzögerung (Override der globalen)
112
+ - ✅ Reihenfolgenlogik bei Zuschaltung (nach Leistung) und Abschaltung (umgekehrt)
113
+ - ✅ Globale Batterie-Schaltverzögerung (`batteryDelaySeconds`)
114
+ - ✅ Schreibprüfung für Batterie-Kontrollmodus (Debug-Ausgabe im Log)
115
+ - ✅ **Verzögerte Schaltung über Timer** für Ein- und Ausschaltung
116
+ - ✅ **Anzeige laufender Timer im Debug-Log** mit verbleibender Zeit
117
+ - ✅ Optionale **Benachrichtigungen** für Ein/Aus, Prozentregelung und Batterie (Telegram / Gotify)
118
+ - ✅ Optimierung für 0/1-Datenpunkte für Geräte mit boolean oder numerischer 0/1-Steuerung
119
+ - ✅ Detailliertes Logging aller Timer, Überschüsse und Schaltvorgänge
120
+ - ✅ Benachrichtigungen pro Verbrauchertyp (Binary, Percent, Battery, Heating), optional aktivierbar
121
+ - ✅ Heizungs-/Heizstab-Steuerung mit Temperatur-, Freigabe- und Heartbeat-Prüfung
122
+
123
+ ---
124
+
125
+ ## ⚙️ Konfiguration
126
+
127
+ ### 🔹 Haupteinstellungen
128
+
129
+ | Einstellung | Beschreibung |
130
+ | ------------------------------- | -------------------------------------------------------------------------------------- |
131
+ | **Einspeisungs-Datenpunkt** | Objekt-ID des Einspeisewerts (z. B. PV-Überschuss) |
132
+ | **Grundlast** | Wird immer vom Einspeisewert abgezogen (z. B. Standby-Verbrauch) |
133
+ | **Einschaltgrenze** | Schwelle in Watt, ab der Verbraucher zugeschaltet werden |
134
+ | **Abschaltgrenze** | Schwelle in Watt, ab der Verbraucher abgeschaltet werden |
135
+ | **Verzögerung (Sekunden)** | Verzögerung für binäre Abschaltungen (Hysterese-Glättung) |
136
+ | **Verzögerung Prozent (Sek.)** | Globale Verzögerung bei Rückregelung von Prozentverbrauchern (z. B. Wallbox) |
137
+ | **Verzögerung Batterie (Sek.)** | Globale Verzögerung für Batterie-Steuerung |
138
+ | **Einspeisewert negativ** | Wenn aktiv: negativer Wert = Einspeisung / positiver Wert = Netzbezug |
139
+ | **Batterie Kontrollmodus-DP** | Optionaler Steuerdatenpunkt für Batterie-Modusumschaltung (Auto/Manual/Aus) |
140
+ | **Benachrichtigungen** | Aktivierung für Binary / Prozent / Batterie / Heating, inkl. Telegram/Gotify-Instanzen |
141
+
142
+ ---
143
+
144
+ ### 🔹 Verbraucher
145
+
146
+ | Feld | Beschreibung |
147
+ | -------------------------------------- | ------------------------------------------------------------------------------- |
148
+ | **Name** | Anzeigename |
149
+ | **Aktiv** | Aktiviert die Steuerung für diesen Verbraucher |
150
+ | **Regeltyp** | `"binary"`, `"percent"` oder `"battery"` |
151
+ | **Steuer-Datenpunkt** | ID zum Schalten oder Regeln, auch 0/1-DP unterstützt |
152
+ | **Leistung [W]** | Realistische elektrische Leistung des Verbrauchers |
153
+ | **Einschaltgrenze [W]** | Benötigter Überschuss für Aktivierung |
154
+ | **Abschaltgrenze [W]** | Untergrenze für Deaktivierung |
155
+ | **Maximalleistung [W]** | Referenzwert zur Prozentregelung |
156
+ | **Verzögerung Prozent [s]** | Optionale Verzögerung für Rückregelung nur dieses Verbrauchers |
157
+ | **Verzögerung Override [s]** | Verbraucherindividuelle Schaltverzögerung (z. B. sofortige Zuschaltung möglich) |
158
+ | **Einschaltzeit (HH:MM)** | Uhrzeit, ab wann Steuerung aktiv sein darf |
159
+ | **Ausschaltzeit (HH:MM)** | Uhrzeit, ab wann Steuerung beendet wird |
160
+ | **Nur zu Ausschaltzeit ausschalten** | Checkbox: Abschaltung nur zu konfigurierter Uhrzeit |
161
+ | **batterySetpoint (nur battery)** | Datenpunkt, in den die gewünschte Ladeleistung geschrieben wird |
162
+ | **batterySOC / targetSOC** | Optional: SOC & Ziel-SOC zur Ladeverhinderung bei vollem Akku |
163
+ | **Timer / TimerEnd** | Interner Timer für verzögerte Schaltungen, Restzeit im Log sichtbar |
164
+ | **minTemperature / maxTemperature** | Unter- und Obergrenze für Heating-Betrieb |
165
+ | **temperatureDatapoint (nur heating)** | Temperatur-Datenpunkt zur Prüfung min/max Grenzwerte |
166
+ | **enableDatapoint (nur heating)** | Optionaler Datenpunkt: nur bei true darf Heizstab laufen |
167
+ | **heartbeatDatapoint (nur heating)** | Optional: muss zyklisch true liefern, sonst wird abgeschaltet |
168
+
169
+ ---
170
+
171
+ ## 🔋 Batteriespeicher-Unterstützung
172
+
173
+ - Verbraucher mit `"ruletype": "battery"` regeln den Lade-Setpoint abhängig vom aktuellen Überschuss.
174
+ - Falls `batterySOC` und `batteryTargetSOC` gesetzt sind, wird ab Zielwert nicht mehr geladen.
175
+ - Optional kann ein `batteryControlModeDatapoint` gesetzt werden:
176
+ - `0 = Aus`, `1 = Manuell`, `2 = Automatik`
177
+ - Die Steuerung erfolgt **nur innerhalb der konfigurierten Zeitfenster**.
178
+ - Die Steuerung wird bei jedem FeedIn-Update nach konfigurierter Verzögerung (`batteryDelaySeconds`) erneut ausgeführt.
179
+ - Verzögerungen für alle Schaltungen (binary, percent, battery) können pro Verbraucher oder global angepasst werden.
180
+ - Detailliertes Logging und optionale Benachrichtigungen für Batterie-Schaltungen.
181
+
182
+ ---
183
+
184
+ ## 🌡️ Heating-Unterstützung
185
+
186
+ - Verbraucher mit "ruletype": "heating" sind für Heizstäbe oder vergleichbare Verbraucher vorgesehen.
187
+ - Steuerung erfolgt nur, wenn: - Aktuelle Temperatur unter maxTemperature liegt - Optional: über minTemperature abgesichert - Optional: enableDatapoint aktiv ist - Optional: heartbeatDatapoint gültig ist
188
+ - Bei Nichterfüllung wird Schaltung sofort abgebrochen und Timer gestoppt.
189
+ - Unterstützt Ein-/Ausschalt-Timer (onTimerRemaining / offTimerRemaining) mit Restzeitanzeige.
190
+ - Detailliertes Logging und optionale Benachrichtigungen für Heating-Verbraucher.
191
+
192
+ ---
193
+
194
+ ## 🧠 Steuerlogik
195
+
196
+ 1. **Datenpunkt-Messwert wird basierend auf Konfiguration interpretiert** (positiv = Netzbezug oder Einspeisung)
197
+ 2. **Überschuss > Grundlast + Einschaltgrenze**:
198
+ → Verbraucher werden (binär) nach steigender Leistung zugeschaltet
199
+ 3. **Unterschuss < Grundlast - Abschaltgrenze**:
200
+ → Verbraucher werden in umgekehrter Reihenfolge abgeschaltet
201
+ 4. **Regelung für Prozent-Verbraucher**:
202
+ → % = Überschuss / Maximalleistung
203
+ → Geregelt nach Verzögerung (global oder pro Verbraucher)
204
+ → Optionale pro-Verbraucher Overrides möglich
205
+ 5. **Regelung für Batterie-Verbraucher**:
206
+ → Ladeleistung = min(Überschuss, Maximalleistung), sofern Ziel-SOC nicht erreicht
207
+ → Verzögerung über `batteryDelaySeconds` oder pro Verbraucher
208
+ 6. **Zeitfensterprüfung für alle Verbraucher**
209
+ → Nur aktiv, wenn aktuelle Uhrzeit innerhalb `switchOnTime` bis `switchOffTime`
210
+ 7. **Steuerung erfolgt nur bei Steuerungsmodus „Auto (2)“**
211
+ → Manuelle Eingriffe (Modus 1 oder 0) bleiben unangetastet
212
+ 8. **Verzögerte Schaltung über Timer**
213
+ → Timer wird vor erneuter Schaltung abgebrochen, Restzeit kann im Log angezeigt werden
214
+ 9. **Benachrichtigungen optional für Ein/Aus, Prozent und Batterie**
215
+ 10. **Optimierung für 0/1-Datenpunkte**
216
+ → Unterstützt boolean oder numerische 0/1-Steuerung automatisch
217
+ 11. **Detailliertes Logging aller Schaltvorgänge, Überschüsse und Timer**
218
+ 12. **Regelung für Heating-Verbraucher:**
219
+ → Schaltung nur innerhalb min/max Temperatur und bei gültigen enable-/heartbeat-States
220
+ → Timer werden abgebrochen, sobald Bedingungen nicht mehr erfüllt sind
221
+
222
+ ---
223
+
224
+ ## 💡 Beispiel: Wallbox
225
+
226
+ | Parameter | Wert |
227
+ | --------------- | ------- |
228
+ | Einspeisung | 1000 W |
229
+ | Grundlast | 100 W |
230
+ | Maximalleistung | 11000 W |
231
+
232
+ **Berechnung:**
233
+
234
+ - Überschuss: 1000 - 100 = 900 W
235
+ - Prozent: 900 / 11000 ≈ 8,2 % → Wallbox wird auf 8 % geregelt
236
+
237
+ ---
238
+
239
+ ## 📋 Objektstruktur
240
+
241
+ Für jeden Verbraucher wird ein eigener Channel mit folgenden States erzeugt:
242
+
243
+ - `.controlMode` → 0 = Aus, 1 = Manuell, 2 = Automatik
244
+ - `.switchOnTime` / `.switchOffTime`
245
+ - `.alwaysOffAtTime` → true/false
246
+ - `.performance`, `.switchOnPoint`, `.switchOffPoint`
247
+ - `.batterySetpoint` (nur für "battery")
248
+ - `.temperatureDatapoint` (nur für "heating")
249
+ - `.onTimerRemaining / .offTimerRemaining` → Restlaufzeit für Ein-/Ausschalt-Timer
250
+ - `.timer` → interner Timer für verzögerte Schaltungen
251
+ - `.timerEnd` → Zeitstempel, wann Timer abläuft (für Log)
252
+
253
+ ---
254
+
255
+ ## 🚫 Einschränkungen
256
+
257
+ - Keine SOC-Historie, keine Langzeitlogik
258
+ - Keine Mehrfachverwendung identischer Datenpunkte
259
+ - Batterie-Steuerung basiert rein auf FeedIn, keine Rücksicht auf Entladeleistung
260
+ - Heating ohne direkte Leistungsmessung – nur Grenzwerte und Freigabe-Checks
261
+
262
+ ---
263
+
264
+ ## 🛣️ Zukünftige Features
265
+
266
+ - ~~PV-Prognosebasierte Steuerung (Beta)~~
267
+ - Unterstützung kombinierter Verbraucher
268
+ - ~~Priorisierungs-Profile~~
269
+ - Überhitzungs- oder Fehler-Handling je Gerät
270
+ - ~~Minimal- und Maximal-Prozentlimits für Regelung~~
271
+ - Konfigurierbare Gruppen- oder Raumlogik
272
+
273
+ ---
274
+
275
+ ## PV-Prognosesteuerung
276
+
277
+ SmartLoadManager kann `pvforecast.<Instanz>.summary.JSONData` verwenden. Dazu wird die Prognosesteuerung aktiviert, der JSON-Datenpunkt ausgewählt und die Funktion bei den gewünschten Verbrauchern eingeschaltet.
278
+
279
+ Der Adapter bewertet ein zusammenhängendes Prognosefenster statt eines einzelnen Werts. Ein konfigurierbarer Sicherheitsfaktor reduziert optimistische Prognosen. Für prognosegestütztes Einschalten muss außerdem bereits ein Teil der benötigten Leistung als realer Überschuss vorhanden sein. Kurze Einbrüche dürfen zeitlich begrenzt überbrückt werden, jedoch nur bis zum eingestellten maximalen Netzbezug.
280
+
281
+ Mindestlauf- und Mindeststillstandszeiten verhindern häufiges Schalten. Prognoseentscheidungen übersteuern niemals Zeitfenster, Temperaturgrenzen, Hardwarefreigabe, Heartbeat oder Batterie-SOC-Grenzen.
282
+
283
+ Empfohlene Startwerte: 80 % Sicherheitsfaktor, 30 Minuten Prognosefenster, 30 Minuten maximale Vorlaufzeit, 50 % erforderlicher realer Überschuss, 5 Minuten Überbrückung, 100 W maximaler Netzbezug und 10/5 Minuten Mindestlauf-/Mindeststillstandszeit.
@@ -0,0 +1,74 @@
1
+ # Arbeits- und Prüfplan für 0.2.0
2
+
3
+ Alle vorgefundenen lokalen Änderungen werden gemäß Auftrag übernommen und geprüft.
4
+ Die vorhandene Adapterarchitektur bleibt erhalten. Fehler werden mit reproduzierbaren
5
+ Regressionstests korrigiert; eine reale Geräteprüfung ist mangels Testanlage nicht möglich.
6
+
7
+ 1. GitHub-Issues #90, #93, #86 und zugehörige Wartungs-PRs prüfen; aktuelle
8
+ npm-Versionen von Controller, Admin und Testwerkzeugen feststellen.
9
+ 2. Steuerungsfehler in `main.js` mit simulierten ioBroker-Zuständen reproduzieren:
10
+ Schaltbefehle, Prozentregelung, Batterie, Betriebsmodi, Heizschutz und Timer.
11
+ 3. Fehler korrigieren und Regressionstests ausführen; Prognoseeingaben und
12
+ Mindestlaufzeiten prüfen.
13
+ 4. Abhängigkeiten, Node-Testmatrix, Übersetzungen und Paketinhalt prüfen.
14
+ 5. README-Changelog und deutsche/englische Nutzerdokumentation mit Beispielen ergänzen.
15
+ 6. Versionen in Paketdateien synchron auf 0.2.0 setzen. Unit-, Paket-, Typ-,
16
+ Lint- und Integrationstests gegen aktuellen js-controller ausführen.
17
+ 7. Änderungen prüfen, committen und nach erfolgreichen Prüfungen pushen.
18
+
19
+ Issue #84 betrifft das separate ioBroker-Stable-Repository. Ein Adapter-Push
20
+ allein aktualisiert dessen Version nicht. Es wird nicht fälschlich als lokal
21
+ behobener Programmfehler behandelt.
22
+
23
+ ## Ausgangslage
24
+
25
+ - Node.js lokal: 22.19.0.
26
+ - Ausgangstests: 6 Unit-Tests (davon ein Platzhalter), 40 Paketprüfungen bestanden.
27
+ - Typprüfung und ESLint bestanden.
28
+ - npm latest bei Prüfung: js-controller 7.2.5, Admin 8.3.3,
29
+ adapter-core 3.4.3, testing 6.3.1.
30
+ - Keine reale ioBroker-Testinstanz und keine angeschlossenen Geräte vorhanden.
31
+
32
+ ## Behobene Fehler und Prüfung
33
+
34
+ - Echte Regressionstests ersetzen den bisherigen Platzhalter. Geprüft werden
35
+ boolesche/numerische Befehle, Betriebsmodi, Prozentregelung, Vorzeichen,
36
+ Batterie-SOC, Ladeleistungsrückführung, Heizschutz und Timerabbrüche.
37
+ - Verzögerte Einschaltungen prüfen den aktuellen Überschuss und das Zeitfenster
38
+ nochmals. Deaktivierung beendet laufende Schalt- und Anzeigetimer.
39
+ - Gleichzeitige Zählerereignisse verschieben Regelungstimer nicht dauerhaft;
40
+ Batterie-Verzögerungen werden nicht durch einen sofortigen Regelpfad umgangen.
41
+ - Prognosen verwerfen vergangene Werte und respektieren 0 Minuten Vorlaufzeit.
42
+ - Eine periodische Prüfung berücksichtigt Zeitfenster auch ohne neue Zählerwerte.
43
+ - Alle elf Übersetzungskataloge enthalten dieselben Schlüssel. Benachrichtigungen
44
+ und Release-Metadaten sind in allen unterstützten Sprachen vorhanden.
45
+ - Offizielle aktuelle JSON-Schemas: 61 Paketprüfungen erfolgreich.
46
+ - 29 Funktionstests erfolgreich unter Node 22.19.0, 24.22.1 und 26.12.1.
47
+ - Konfigurierter Integrationstest gegen js-controller 7.2.5 erfolgreich:
48
+ Verbraucherobjekte erstellt, Schaltbefehl als `ack: false` empfangen.
49
+ - Dieser Integrationstest besteht auch unter Node.js 26.12.1 (2 Tests).
50
+ - Abschließende Typprüfung, ESLint und Kontrolle des npm-Paketinhalts erfolgreich;
51
+ Laufzeitmodul, Übersetzungen und Dokumentation enthalten, Testdateien ausgeschlossen.
52
+ - Saubere Installation mit `npm ci` erfolgreich.
53
+ - Repository-Checker 5.23.2 im lokalen Modus: keine Fehler. Verbleibende Hinweise
54
+ betreffen noch nicht veröffentlichtes 0.2.0, fehlendes Release-Tag, alte nicht
55
+ mehr abrufbare CI-Logs sowie noch offene GitHub-Vorgänge.
56
+
57
+ ## Bewusste Entscheidungen und externe Abhängigkeiten
58
+
59
+ - TypeScript bleibt auf 6.0.3: Version 7 kollidiert mit den Peer-Anforderungen
60
+ des offiziellen ioBroker-ESLint-Setups. PR #79 wird daher nicht blind übernommen.
61
+ - `alwaysOffAtTime` behält seine dokumentierte Bedeutung: normale Abschaltung
62
+ erst zum Zeitfensterende. Die Heizschutzprüfung bleibt davon unabhängig.
63
+ - `npm audit` meldet nach kompatiblen Updates sechs transitive Meldungen:
64
+ drei moderate über `@iobroker/testing` → `@alcalzone/esbuild-register` → `esbuild`
65
+ und drei hohe über `@iobroker/adapter-core` → `@iobroker/js-controller-common-db`
66
+ → `node-forge`. Die Zählung umfasst die jeweils betroffenen Elternpakete.
67
+ Es gibt im verwendeten aktuellen Abhängigkeitsbaum kein kompatibles Update.
68
+ Der Adapter startet keinen esbuild-Entwicklungsserver und verarbeitet selbst
69
+ keine RSA-Signaturen. Es wird keine Sicherheitsfreiheit behauptet und kein
70
+ erzwungenes Downgrade der vom Repository-Checker geforderten Werkzeuge vorgenommen.
71
+ - Issue #84 benötigt eine gesonderte Änderung im ioBroker-Stable-Repository
72
+ nach einer erfolgreichen Veröffentlichung und wird durch einen Git-Push allein
73
+ nicht erledigt.
74
+ - Automatisierte Prüfungen ersetzen keine Inbetriebnahme mit realen Geräten.