iobroker.smartloadmanager 0.1.0 → 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.
- package/LICENSE +1 -1
- package/README.md +23 -5
- package/admin/i18n/de.json +130 -0
- package/admin/i18n/en.json +130 -0
- package/admin/i18n/es.json +130 -0
- package/admin/i18n/fr.json +130 -0
- package/admin/i18n/it.json +130 -0
- package/admin/i18n/nl.json +130 -0
- package/admin/i18n/pl.json +130 -0
- package/admin/i18n/pt.json +130 -0
- package/admin/i18n/ru.json +130 -0
- package/admin/i18n/uk.json +130 -0
- package/admin/i18n/zh-cn.json +130 -0
- package/admin/jsonConfig.json +311 -26
- package/docs/de/README.md +283 -0
- package/docs/de/release-0.2.0-pruefung.md +74 -0
- package/docs/en/README.md +268 -0
- package/io-package.json +114 -11
- package/lib/forecast.js +123 -0
- package/main.js +651 -83
- package/package.json +18 -15
- package/admin/i18n/de/translations.json +0 -110
- package/admin/i18n/en/translations.json +0 -108
- package/admin/i18n/es/translations.json +0 -110
- package/admin/i18n/fr/translations.json +0 -110
- package/admin/i18n/it/translations.json +0 -110
- package/admin/i18n/nl/translations.json +0 -110
- package/admin/i18n/pl/translations.json +0 -110
- package/admin/i18n/pt/translations.json +0 -110
- package/admin/i18n/ru/translations.json +0 -110
- package/admin/i18n/uk/translations.json +0 -110
- package/admin/i18n/zh-cn/translations.json +0 -110
- package/lib/adapter-config.d.ts +0 -20
|
@@ -0,0 +1,283 @@
|
|
|
1
|
+

|
|
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.
|
|
@@ -0,0 +1,268 @@
|
|
|
1
|
+

|
|
2
|
+
|
|
3
|
+
# ioBroker.smartloadmanager
|
|
4
|
+
|
|
5
|
+
## Version 0.2.0 examples
|
|
6
|
+
|
|
7
|
+
Requires Node.js >=22.19.0. Device commands use `ack: false`; the device adapter
|
|
8
|
+
provides the acknowledgement. Feed-in must represent grid connection power in watts.
|
|
9
|
+
Enable `feedinNegativ` when export is negative. Baseload is an additional reserve;
|
|
10
|
+
do not subtract household consumption twice if it is already included in the meter reading.
|
|
11
|
+
|
|
12
|
+
### Binary loads and heating
|
|
13
|
+
|
|
14
|
+
Example: `performance: 1000`, `switchOnPoint: 1200`, `switchOffPoint: 0`,
|
|
15
|
+
`switchOnDelay: 20`, `switchOffDelay: 10`. A 1200 W surplus after baseload starts
|
|
16
|
+
the on timer. Import or surplus below the off threshold starts the off timer.
|
|
17
|
+
`minimumOnMinutes: 10` and `minimumOffMinutes: 5` reduce cycling; import above
|
|
18
|
+
`forecastMaxGridImport` overrides minimum runtime. Set minimum times to 0 to disable them.
|
|
19
|
+
|
|
20
|
+
Use `datapoint` for boolean switching and `numericDatapoint` for numeric 0/1.
|
|
21
|
+
Heating consumers additionally support temperature, enable and heartbeat inputs.
|
|
22
|
+
Maximum temperature and missing enable/heartbeat prevent activation.
|
|
23
|
+
Heartbeat checks the input's truth value, not the age of its last update.
|
|
24
|
+
A missing or nonfinite configured temperature sensor prevents activation and
|
|
25
|
+
stops automatic heating. “Switch off only at switch-off time” intentionally
|
|
26
|
+
disables normal surplus shutdown until the time window ends; heating protection remains active.
|
|
27
|
+
|
|
28
|
+
### Percentage and battery control
|
|
29
|
+
|
|
30
|
+
A 2000 W percent consumer at 50% consumes 1000 W. With 400 W additional export,
|
|
31
|
+
the target becomes 70%. With 200 W import it becomes 40%. Below `minPercentStart`,
|
|
32
|
+
the target becomes 0%. Disabled consumers are not regulated. This calculation
|
|
33
|
+
assumes the load is included in the grid meter reading.
|
|
34
|
+
|
|
35
|
+
Configure a battery's `batterySetpoint`, `performance`, and optional `batterySOC`
|
|
36
|
+
and `batteryTargetSOC`. With 800 W surplus and a 1500 W rating, the charging command
|
|
37
|
+
is 800 W. Reaching target SOC sets charging power to 0. The optional global battery
|
|
38
|
+
mode datapoint uses 0 (off), 1 (target reached), and 2 (charging); verify that these
|
|
39
|
+
values match the device adapter.
|
|
40
|
+
|
|
41
|
+
`controlMode`: 0 = off, 1 = manual on, 2 = automatic. Manual on sets a percent load
|
|
42
|
+
to 100% or battery charging power to its configured rating. Automatic regulators
|
|
43
|
+
respect manual modes.
|
|
44
|
+
Battery control includes already requested charging power and corrects it by the
|
|
45
|
+
measured grid surplus. `batteryDelaySeconds` and `delaySecondsProzent` remain
|
|
46
|
+
effective during frequent meter updates; 0 means immediate regulation.
|
|
47
|
+
Missing configured SOC/target SOC values stop charging. Time windows are also
|
|
48
|
+
checked every 15 seconds. Disabling a consumer cancels pending switches but leaves
|
|
49
|
+
its existing device state unchanged; use `controlMode: 0` to switch it off.
|
|
50
|
+
|
|
51
|
+
### PV forecast example
|
|
52
|
+
|
|
53
|
+
Enable `enableForecast`, select e.g. `pvforecast.0.summary.JSONData` as
|
|
54
|
+
`forecastJsonDatapoint`, and enable `useForecast` for the consumer.
|
|
55
|
+
The expected JSON array uses Unix timestamps in milliseconds:
|
|
56
|
+
|
|
57
|
+
```js
|
|
58
|
+
const now = Date.now();
|
|
59
|
+
const forecast = [0, 15, 30, 45].map(minutes => ({
|
|
60
|
+
t: now + minutes * 60000,
|
|
61
|
+
y: 3.5,
|
|
62
|
+
}));
|
|
63
|
+
// JSON.stringify(forecast), with forecastPowerUnit = "kW"
|
|
64
|
+
```
|
|
65
|
+
|
|
66
|
+
With 500 W baseload this gives 3000 W forecast surplus, reduced to 2400 W at
|
|
67
|
+
`forecastSafetyPercent: 80`. A 2000 W consumer requires a sustained
|
|
68
|
+
`forecastMinMinutes: 30` window starting within `forecastMaxStartMinutes: 30`.
|
|
69
|
+
At `forecastMinCurrentPercent: 50`, at least 1000 W must already be available.
|
|
70
|
+
|
|
71
|
+
`forecastBridgeMinutes: 5` limits dip bridging; `forecastMaxGridImport: 100`
|
|
72
|
+
prevents bridging above 100 W import. Past forecast points are ignored.
|
|
73
|
+
Select `W` explicitly for small watt readings: automatic detection treats values
|
|
74
|
+
up to 100 as kW. Inspect `forecast.*` and each consumer's forecast status states.
|
|
75
|
+
|
|
76
|
+
Time windows may cross midnight (22:00–06:00). Equal start/end times mean all day.
|
|
77
|
+
Automated tests use simulated devices; no physical device installation was available.
|
|
78
|
+
|
|
79
|
+
## 🔧 Description
|
|
80
|
+
|
|
81
|
+
The **smartloadmanager** adapter dynamically controls consumers based on a PV feed-in value.
|
|
82
|
+
The goal is to consume surplus power locally and minimize or completely avoid feeding into the public grid.
|
|
83
|
+
It supports binary consumers, percentage-controllable devices, and battery storage systems.
|
|
84
|
+
|
|
85
|
+
---
|
|
86
|
+
|
|
87
|
+
## 🚀 Features
|
|
88
|
+
|
|
89
|
+
- ✅ Monitoring of a configurable feed-in datapoint
|
|
90
|
+
- ✅ Dynamic switching on of consumers in case of surplus
|
|
91
|
+
- ✅ Dynamic switching off in case of deficit or grid consumption
|
|
92
|
+
- ✅ Supports **binary**, **percent**, **heating** and **battery** consumers
|
|
93
|
+
- ✅ Percentage control with delay (smooth down-regulation), optionally configurable per consumer
|
|
94
|
+
- ✅ Dynamic charging power for battery storage with target SOC
|
|
95
|
+
- ✅ Time windows for on/off logic per consumer (incl. "only at off-time")
|
|
96
|
+
- ✅ Automatic object creation with extended information per consumer
|
|
97
|
+
- ✅ Control mode: Off / Manual On / Auto per consumer
|
|
98
|
+
- ✅ Hysteresis control via separate on/off thresholds
|
|
99
|
+
- ✅ Consumer-specific switching delay (override of global setting)
|
|
100
|
+
- ✅ Global battery switching delay (`batteryDelaySeconds`)
|
|
101
|
+
- ✅ Write check for battery control mode (debug output in log)
|
|
102
|
+
- ✅ **Delayed switching via timers** for on and off
|
|
103
|
+
- ✅ **Display of active timers in debug log** with remaining time
|
|
104
|
+
- ✅ Optional **notifications** for binary, percent, battery and heating (Telegram / Gotify)
|
|
105
|
+
- ✅ Optimization for 0/1 datapoints (boolean or numeric 0/1 control)
|
|
106
|
+
- ✅ Detailed logging of all timers, surpluses and switching operations
|
|
107
|
+
- ✅ Notifications per consumer type (Binary, Percent, Battery, Heating), optionally enabled
|
|
108
|
+
- ✅ Heating/immersion heater control with temperature, enable and heartbeat checks
|
|
109
|
+
|
|
110
|
+
---
|
|
111
|
+
|
|
112
|
+
## ⚙️ Configuration
|
|
113
|
+
|
|
114
|
+
### 🔹 Main settings
|
|
115
|
+
|
|
116
|
+
| Setting | Description |
|
|
117
|
+
| ---------------------------------- | ------------------------------------------------------------------------------- |
|
|
118
|
+
| **Feed-in datapoint** | Object ID of the feed-in value (e.g. PV surplus) |
|
|
119
|
+
| **Base load** | Always subtracted from feed-in value (e.g. standby consumption) |
|
|
120
|
+
| **Switch-on threshold** | Threshold in watts at which consumers are switched on |
|
|
121
|
+
| **Switch-off threshold** | Threshold in watts at which consumers are switched off |
|
|
122
|
+
| **Delay (seconds)** | Delay for binary switching (hysteresis smoothing) |
|
|
123
|
+
| **Delay percent (s)** | Global delay for down-regulation of percent consumers (e.g. wallbox) |
|
|
124
|
+
| **Delay battery (s)** | Global delay for battery control |
|
|
125
|
+
| **Feed-in negative** | If active: negative = feed-in / positive = grid consumption |
|
|
126
|
+
| **Battery control mode datapoint** | Optional datapoint for battery mode switching (Auto/Manual/Off) |
|
|
127
|
+
| **Notifications** | Enable notifications for Binary / Percent / Battery / Heating (Telegram/Gotify) |
|
|
128
|
+
|
|
129
|
+
---
|
|
130
|
+
|
|
131
|
+
### 🔹 Consumers
|
|
132
|
+
|
|
133
|
+
| Field | Description |
|
|
134
|
+
| ----------------------------------- | --------------------------------------------------------------------- |
|
|
135
|
+
| **Name** | Display name |
|
|
136
|
+
| **Active** | Enables control for this consumer |
|
|
137
|
+
| **Rule type** | `"binary"`, `"percent"`, `"battery"`, `"heating"` |
|
|
138
|
+
| **Control datapoint** | ID to switch or regulate, supports 0/1 datapoints |
|
|
139
|
+
| **Power [W]** | Realistic electrical power of the consumer |
|
|
140
|
+
| **Switch-on threshold [W]** | Required surplus for activation |
|
|
141
|
+
| **Switch-off threshold [W]** | Lower limit for deactivation |
|
|
142
|
+
| **Max power [W]** | Reference value for percentage control |
|
|
143
|
+
| **Delay percent [s]** | Optional delay for down-regulation for this consumer only |
|
|
144
|
+
| **Delay override [s]** | Consumer-specific switching delay (e.g. immediate switching possible) |
|
|
145
|
+
| **Switch-on time (HH:MM)** | Time when control may start |
|
|
146
|
+
| **Switch-off time (HH:MM)** | Time when control must end |
|
|
147
|
+
| **Only off at time** | Checkbox: switch off only at configured time |
|
|
148
|
+
| **batterySetpoint (battery only)** | Datapoint where desired charging power is written |
|
|
149
|
+
| **batterySOC / targetSOC** | Optional: SOC & target SOC to stop charging at target |
|
|
150
|
+
| **Timer / TimerEnd** | Internal timer for delayed switching, remaining time visible in log |
|
|
151
|
+
| **minTemperature / maxTemperature** | Lower/upper threshold for heating operation |
|
|
152
|
+
| **temperatureDatapoint (heating)** | Temperature datapoint for min/max checks |
|
|
153
|
+
| **enableDatapoint (heating)** | Optional datapoint: heating only allowed if true |
|
|
154
|
+
| **heartbeatDatapoint (heating)** | Optional: must cyclically deliver true, otherwise switched off |
|
|
155
|
+
|
|
156
|
+
---
|
|
157
|
+
|
|
158
|
+
## 🔋 Battery storage support
|
|
159
|
+
|
|
160
|
+
- Consumers with `"ruletype": "battery"` control the charging setpoint based on current surplus.
|
|
161
|
+
- If `batterySOC` and `batteryTargetSOC` are set, charging stops at target SOC.
|
|
162
|
+
- Optional `batteryControlModeDatapoint`:
|
|
163
|
+
- `0 = Off`, `1 = Manual`, `2 = Auto`
|
|
164
|
+
- Control is only active within configured time windows.
|
|
165
|
+
- Control runs on every feed-in update, after configured delay (`batteryDelaySeconds`).
|
|
166
|
+
- Delays for all consumer types (binary, percent, battery) can be set globally or per consumer.
|
|
167
|
+
- Detailed logging and optional notifications for battery switching.
|
|
168
|
+
|
|
169
|
+
---
|
|
170
|
+
|
|
171
|
+
## 🌡️ Heating support
|
|
172
|
+
|
|
173
|
+
- Consumers with `"ruletype": "heating"` are intended for immersion heaters or similar devices.
|
|
174
|
+
- Control only occurs when:
|
|
175
|
+
- Current temperature is below `maxTemperature`
|
|
176
|
+
- Optional: above `minTemperature`
|
|
177
|
+
- Optional: `enableDatapoint` is active
|
|
178
|
+
- Optional: `heartbeatDatapoint` is valid
|
|
179
|
+
- If conditions are not met, switching is stopped immediately and timers are canceled.
|
|
180
|
+
- Supports on/off timers (`onTimerRemaining` / `offTimerRemaining`) with remaining time display.
|
|
181
|
+
- Detailed logging and optional notifications for heating consumers.
|
|
182
|
+
|
|
183
|
+
---
|
|
184
|
+
|
|
185
|
+
## 🧠 Control logic
|
|
186
|
+
|
|
187
|
+
1. **Feed-in datapoint value is interpreted** (positive = grid consumption or feed-in, depending on config)
|
|
188
|
+
2. **Surplus > base load + switch-on threshold**:
|
|
189
|
+
→ Consumers are switched on (binary) in ascending order of power
|
|
190
|
+
3. **Deficit < base load - switch-off threshold**:
|
|
191
|
+
→ Consumers are switched off in reverse order
|
|
192
|
+
4. **Percent consumers**:
|
|
193
|
+
→ % = surplus / max power
|
|
194
|
+
→ Adjusted after delay (global or per consumer)
|
|
195
|
+
→ Optional overrides possible
|
|
196
|
+
5. **Battery consumers**:
|
|
197
|
+
→ Charging power = min(surplus, max power), if target SOC not reached
|
|
198
|
+
→ Delay via `batteryDelaySeconds` or per consumer
|
|
199
|
+
6. **Time window check for all consumers**
|
|
200
|
+
7. **Control only in mode Auto (2)**
|
|
201
|
+
8. **Delayed switching via timers** (cancel/restart on updates, remaining time visible in log)
|
|
202
|
+
9. **Optional notifications for all switching/regulation types**
|
|
203
|
+
10. **0/1 datapoint optimization** (boolean or numeric 0/1 supported)
|
|
204
|
+
11. **Detailed logging of all switching and surplus values**
|
|
205
|
+
12. **Heating logic**: switch only within temp ranges and with valid enable/heartbeat datapoints
|
|
206
|
+
|
|
207
|
+
---
|
|
208
|
+
|
|
209
|
+
## 💡 Example: Wallbox
|
|
210
|
+
|
|
211
|
+
| Parameter | Value |
|
|
212
|
+
| --------- | ------- |
|
|
213
|
+
| Feed-in | 1000 W |
|
|
214
|
+
| Base load | 100 W |
|
|
215
|
+
| Max power | 11000 W |
|
|
216
|
+
|
|
217
|
+
**Calculation:**
|
|
218
|
+
|
|
219
|
+
- Surplus: 1000 – 100 = 900 W
|
|
220
|
+
- Percent: 900 / 11000 ≈ 8.2 % → Wallbox set to 8 %
|
|
221
|
+
|
|
222
|
+
---
|
|
223
|
+
|
|
224
|
+
## 📋 Object structure
|
|
225
|
+
|
|
226
|
+
Each consumer gets its own channel with the following states:
|
|
227
|
+
|
|
228
|
+
- `.controlMode` → 0 = Off, 1 = Manual, 2 = Auto
|
|
229
|
+
- `.switchOnTime` / `.switchOffTime`
|
|
230
|
+
- `.alwaysOffAtTime` → true/false
|
|
231
|
+
- `.performance`, `.switchOnPoint`, `.switchOffPoint`
|
|
232
|
+
- `.batterySetpoint` (battery only)
|
|
233
|
+
- `.temperatureDatapoint` (heating only)
|
|
234
|
+
- `.onTimerRemaining / .offTimerRemaining` → Remaining time for timers
|
|
235
|
+
- `.timer` → internal timer for delayed switching
|
|
236
|
+
- `.timerEnd` → timestamp when timer expires (for log)
|
|
237
|
+
|
|
238
|
+
---
|
|
239
|
+
|
|
240
|
+
## 🚫 Limitations
|
|
241
|
+
|
|
242
|
+
- No SOC history, no long-term logic
|
|
243
|
+
- No multiple use of identical datapoints
|
|
244
|
+
- Battery control based only on feed-in, not discharge power
|
|
245
|
+
- Heating without direct power measurement – only thresholds and enable checks
|
|
246
|
+
|
|
247
|
+
---
|
|
248
|
+
|
|
249
|
+
## 🛣️ Future features
|
|
250
|
+
|
|
251
|
+
- ~~PV forecast-based control (beta)~~
|
|
252
|
+
- Combined consumer support
|
|
253
|
+
- ~~Prioritization profiles~~
|
|
254
|
+
- Overheating or fault handling per device
|
|
255
|
+
- ~~Min/max percentage limits~~
|
|
256
|
+
- Configurable group or room logic
|
|
257
|
+
|
|
258
|
+
---
|
|
259
|
+
|
|
260
|
+
## PV forecast control
|
|
261
|
+
|
|
262
|
+
SmartLoadManager can use `pvforecast.<instance>.summary.JSONData`. Enable forecast control, select the JSON data point and enable it for the desired consumers.
|
|
263
|
+
|
|
264
|
+
The adapter evaluates a continuous forecast window instead of a single value. A configurable safety factor reduces optimistic forecasts. Forecast-assisted switch-on additionally requires part of the required power to be present as real surplus. Short drops can be bridged for a limited time, but only up to the configured maximum grid import.
|
|
265
|
+
|
|
266
|
+
Minimum run and off times prevent rapid cycling. Forecast decisions never override time windows, heating temperature limits, hardware enable/heartbeat signals or battery SOC limits.
|
|
267
|
+
|
|
268
|
+
Recommended starting values: 80% safety factor, 30-minute forecast window, 30-minute maximum lead time, 50% current-surplus requirement, 5-minute dip bridging, 100 W maximum grid import and 10/5-minute minimum run/off times.
|