378 lines
10 KiB
Markdown
378 lines
10 KiB
Markdown
# 🚀 Battery Charging Optimizer - Installations-Anleitung
|
|
|
|
## Übersicht
|
|
|
|
Dieses System optimiert die Batterieladung basierend auf:
|
|
- ✅ Dynamischen Strompreisen (haStrom FLEX PRO)
|
|
- ✅ PV-Prognose (Forecast.Solar Ost/West)
|
|
- ✅ Batterie-SOC und Kapazität
|
|
- ✅ Haushalts-Reserve
|
|
|
|
**Besonderheit:** Nutzt dein bestehendes, bewährtes manuelles Steuerungssystem!
|
|
|
|
---
|
|
|
|
## 📋 Voraussetzungen
|
|
|
|
### Bereits vorhanden (✅):
|
|
1. **PyScript Integration** installiert und aktiviert
|
|
2. **OpenEMS** läuft auf BeagleBone mit GoodWe Batterie
|
|
3. **Modbus TCP Integration** für OpenEMS
|
|
4. **haStrom FLEX PRO** Sensor für Strompreise
|
|
5. **Forecast.Solar** Integration für PV-Prognose (Ost + West)
|
|
6. **Funktionierendes manuelles System**:
|
|
- `pyscript/ess_set_power.py`
|
|
- 3 Automationen für manuelles Laden
|
|
- REST Commands für Mode-Wechsel
|
|
- Input Helper `goodwe_manual_control` und `charge_power_battery`
|
|
|
|
### Zu installieren:
|
|
- Neue Konfigurationsdateien
|
|
- Neues Optimierungs-Script
|
|
- Dashboard (optional)
|
|
|
|
---
|
|
|
|
## 🔧 Installation
|
|
|
|
### Schritt 1: Konfiguration installieren
|
|
|
|
**Methode A: Als Package (empfohlen)**
|
|
|
|
1. Erstelle Verzeichnis `/config/packages/` falls nicht vorhanden
|
|
2. Kopiere `battery_optimizer_config.yaml` nach `/config/packages/`
|
|
3. In `configuration.yaml` sicherstellen:
|
|
```yaml
|
|
homeassistant:
|
|
packages: !include_dir_named packages
|
|
```
|
|
|
|
**Methode B: In configuration.yaml**
|
|
|
|
Kopiere den Inhalt von `battery_optimizer_config.yaml` in die entsprechenden Sektionen deiner `configuration.yaml`.
|
|
|
|
### Schritt 2: PyScript installieren
|
|
|
|
1. Kopiere `battery_optimizer.py` nach `/config/pyscript/`
|
|
2. **Wichtig:** Dein bestehendes `ess_set_power.py` bleibt unverändert!
|
|
|
|
### Schritt 3: Home Assistant neu starten
|
|
|
|
```bash
|
|
# Developer Tools → YAML → Restart
|
|
```
|
|
|
|
Oder über CLI:
|
|
```bash
|
|
ha core restart
|
|
```
|
|
|
|
### Schritt 4: Input Helper prüfen
|
|
|
|
Nach dem Neustart, gehe zu **Einstellungen → Geräte & Dienste → Helfer**
|
|
|
|
Folgende Helper sollten jetzt existieren:
|
|
- `input_boolean.battery_optimizer_enabled`
|
|
- `input_boolean.battery_optimizer_manual_override`
|
|
- `input_number.battery_capacity_kwh`
|
|
- `input_number.battery_optimizer_min_soc`
|
|
- `input_number.battery_optimizer_max_soc`
|
|
- `input_number.battery_max_charge_power`
|
|
- `input_number.battery_optimizer_price_threshold`
|
|
- `input_number.battery_reserve_capacity_kwh`
|
|
- `input_number.battery_optimizer_pv_threshold`
|
|
- `input_text.battery_optimizer_status`
|
|
|
|
**Falls nicht:** Prüfe die Konfiguration und Logs!
|
|
|
|
### Schritt 5: PyScript-Dienste prüfen
|
|
|
|
Gehe zu **Entwicklerwerkzeuge → Dienste**
|
|
|
|
Suche nach `pyscript` - folgende Dienste sollten vorhanden sein:
|
|
- `pyscript.calculate_charging_schedule`
|
|
- `pyscript.execute_charging_schedule`
|
|
- `pyscript.ess_set_power` (bestehend)
|
|
|
|
**Falls nicht:**
|
|
- Prüfe `/config/pyscript/battery_optimizer.py` existiert
|
|
- Prüfe Logs: `custom_components.pyscript`
|
|
|
|
---
|
|
|
|
## ⚙️ Konfiguration
|
|
|
|
### Batterie-Parameter einstellen
|
|
|
|
Gehe zu **Einstellungen → Geräte & Dienste → Helfer** und setze:
|
|
|
|
1. **Batterie-Kapazität**: `10 kWh` (GoodWe)
|
|
2. **Min. SOC**: `20%` (Schutz vor Tiefentladung)
|
|
3. **Max. SOC**: `100%` (oder z.B. 90% für Langlebigkeit)
|
|
4. **Max. Ladeleistung**: `5000W` (5 kW - dein System-Limit)
|
|
|
|
### Optimierungs-Parameter anpassen
|
|
|
|
1. **Preis-Schwellwert**: `28 ct/kWh` (Startwert, wird automatisch angepasst)
|
|
2. **Reserve-Kapazität**: `2 kWh` (Reserve für Haushalt)
|
|
3. **PV-Schwellwert**: `500 Wh` (Bei mehr PV keine Netz-Ladung)
|
|
|
|
### Sensor-Namen prüfen
|
|
|
|
Falls deine Sensoren andere Namen haben, passe diese in `battery_optimizer.py` an:
|
|
|
|
```python
|
|
# Zeile ~100
|
|
sensor_east = 'sensor.energy_production_today' # Dein Ost-Array
|
|
sensor_west = 'sensor.energy_production_today_2' # Dein West-Array
|
|
|
|
# Zeile ~35
|
|
price_entity = 'sensor.hastrom_flex_pro' # Dein Strompreis-Sensor
|
|
|
|
# Zeile ~185
|
|
current_soc = float(state.get('sensor.openems_ess0_soc') or 50) # Dein SOC-Sensor
|
|
```
|
|
|
|
---
|
|
|
|
## 🧪 Testen
|
|
|
|
### Test 1: Manuelle Berechnung
|
|
|
|
```yaml
|
|
# Entwicklerwerkzeuge → Dienste
|
|
service: pyscript.calculate_charging_schedule
|
|
```
|
|
|
|
**Erwartetes Ergebnis:**
|
|
- Log-Einträge in **Einstellungen → System → Protokolle**
|
|
- State `pyscript.battery_charging_schedule` existiert
|
|
- Attribute `schedule` enthält Array mit Stunden
|
|
|
|
**Prüfen in Developer Tools → Zustände:**
|
|
```
|
|
pyscript.battery_charging_schedule
|
|
Attributes:
|
|
schedule: [...]
|
|
last_update: 2025-11-09T17:30:00
|
|
num_hours: 24
|
|
num_charges: 3
|
|
```
|
|
|
|
### Test 2: Plan ansehen
|
|
|
|
```yaml
|
|
# Entwicklerwerkzeuge → Template
|
|
{{ state_attr('pyscript.battery_charging_schedule', 'schedule') }}
|
|
```
|
|
|
|
Sollte eine Liste mit Stunden-Einträgen zeigen:
|
|
```json
|
|
[
|
|
{
|
|
"datetime": "2025-11-09T23:00:00",
|
|
"hour": 23,
|
|
"action": "charge",
|
|
"power_w": -5000,
|
|
"price": 26.85,
|
|
"reason": "Günstig (26.85 ct) + wenig PV (0 Wh)"
|
|
},
|
|
...
|
|
]
|
|
```
|
|
|
|
### Test 3: Manuelle Ausführung
|
|
|
|
**ACHTUNG:** Nur testen wenn Batterie geladen werden kann!
|
|
|
|
```yaml
|
|
# Entwicklerwerkzeuge → Dienste
|
|
service: pyscript.execute_charging_schedule
|
|
```
|
|
|
|
**Was passiert:**
|
|
- Wenn aktuelle Stunde = Ladezeit → Aktiviert `input_boolean.goodwe_manual_control`
|
|
- Wenn nicht → Deaktiviert manuellen Modus
|
|
|
|
**Prüfen:**
|
|
- Log-Einträge zeigen welche Aktion ausgeführt wird
|
|
- Bei Ladung: `goodwe_manual_control` schaltet auf "on"
|
|
- Deine bestehende Automation übernimmt → Batterie lädt!
|
|
|
|
### Test 4: Automatische Zeitsteuerung warten
|
|
|
|
Die Zeit-Trigger sind aktiv:
|
|
- **14:05 Uhr täglich**: Neue Berechnung
|
|
- **xx:05 Uhr stündlich**: Ausführung
|
|
|
|
Warte bis zur nächsten vollen Stunde + 5 Min und prüfe Logs!
|
|
|
|
---
|
|
|
|
## 📊 Dashboard installieren (Optional)
|
|
|
|
1. Gehe zu deinem Lovelace Dashboard
|
|
2. **Bearbeiten** → **Raw-Konfigurations-Editor** (3 Punkte oben rechts)
|
|
3. Füge den Inhalt von `battery_optimizer_dashboard.yaml` ein
|
|
|
|
**Oder:** Manuell Cards erstellen über die UI
|
|
|
|
---
|
|
|
|
## 🔍 Troubleshooting
|
|
|
|
### Problem: "Keine Strompreis-Daten"
|
|
|
|
**Lösung:**
|
|
1. Prüfe Sensor `sensor.hastrom_flex_pro` existiert
|
|
2. Prüfe Attribut `hours` ist vorhanden:
|
|
```yaml
|
|
# Developer Tools → Zustände
|
|
sensor.hastrom_flex_pro
|
|
Attributes:
|
|
hours: [...]
|
|
```
|
|
3. Falls anderer Name → Anpassen in `battery_optimizer.py` Zeile ~35
|
|
|
|
### Problem: "Keine PV-Prognose"
|
|
|
|
**Lösung:**
|
|
1. Prüfe Forecast.Solar Sensoren existieren:
|
|
- `sensor.energy_production_today`
|
|
- `sensor.energy_production_today_2`
|
|
- `sensor.energy_production_tomorrow`
|
|
- `sensor.energy_production_tomorrow_2`
|
|
2. Falls andere Namen → Anpassen in `battery_optimizer.py` Zeile ~100
|
|
|
|
### Problem: PyScript-Dienste nicht sichtbar
|
|
|
|
**Lösung:**
|
|
1. Prüfe PyScript ist installiert: **HACS → Integrationen → PyScript**
|
|
2. Prüfe `/config/pyscript/battery_optimizer.py` existiert
|
|
3. Home Assistant neu starten
|
|
4. Logs prüfen: `grep pyscript /config/home-assistant.log`
|
|
|
|
### Problem: Batterie lädt nicht trotz Plan
|
|
|
|
**Lösung:**
|
|
1. Prüfe `input_boolean.battery_optimizer_enabled` ist "on"
|
|
2. Prüfe `input_boolean.battery_optimizer_manual_override` ist "off"
|
|
3. Prüfe deine bestehenden Automationen sind aktiv:
|
|
- "Switch: Manuelle Speicherbeladung aktivieren"
|
|
- "Automation: Speicher manuell laden"
|
|
4. Manuell testen:
|
|
```yaml
|
|
service: input_boolean.turn_on
|
|
target:
|
|
entity_id: input_boolean.goodwe_manual_control
|
|
```
|
|
→ Sollte Ladung starten über deine Automation!
|
|
|
|
### Problem: "Keine Daten für aktuelle Stunde"
|
|
|
|
**Ursache:** Plan wurde zu spät erstellt oder enthält nicht alle Stunden
|
|
|
|
**Lösung:**
|
|
1. Plan manuell neu erstellen:
|
|
```yaml
|
|
service: pyscript.calculate_charging_schedule
|
|
```
|
|
2. Prüfe ob tägliche Automation um 14:05 läuft
|
|
3. Plan sollte **aktuelle Stunde inkludieren**
|
|
|
|
---
|
|
|
|
## 🎓 Wie das System funktioniert
|
|
|
|
### Täglicher Ablauf
|
|
|
|
**14:05 Uhr:**
|
|
1. PyScript berechnet optimalen Ladeplan für nächste 24-36h
|
|
2. Berücksichtigt:
|
|
- Strompreise (dynamischer Schwellwert = 90. Perzentil)
|
|
- PV-Prognose Ost + West kombiniert
|
|
- Aktueller Batterie-SOC
|
|
- Konfigurierte Parameter
|
|
3. Speichert Plan als `pyscript.battery_charging_schedule` State
|
|
|
|
**Jede Stunde um xx:05:**
|
|
1. PyScript prüft was für aktuelle Stunde geplant ist
|
|
2. **Wenn "charge":**
|
|
- Setzt `input_number.charge_power_battery` auf Ziel-Leistung
|
|
- Aktiviert `input_boolean.goodwe_manual_control`
|
|
- Deine Automation übernimmt → Schreibt alle 30s via Modbus
|
|
3. **Wenn "auto":**
|
|
- Deaktiviert `goodwe_manual_control`
|
|
- System läuft im Automatik-Modus
|
|
|
|
### Strategie-Logik
|
|
|
|
**Laden wenn:**
|
|
- Strompreis < dynamischer Schwellwert (90. Perzentil)
|
|
- UND PV-Prognose < 500 Wh für diese Stunde
|
|
- UND Batterie nicht voll
|
|
- Sortiert nach: Niedrigster Preis zuerst
|
|
|
|
**Nicht laden wenn:**
|
|
- Preis zu hoch
|
|
- Genug PV-Erzeugung erwartet
|
|
- Batterie voll (inkl. Reserve)
|
|
|
|
---
|
|
|
|
## 🚀 Nächste Schritte
|
|
|
|
### Nach erfolgreicher Installation:
|
|
|
|
1. **Erste Woche beobachten**
|
|
- Prüfe Logs täglich
|
|
- Verifiziere dass Plan erstellt wird (14:05)
|
|
- Verifiziere dass Ausführung läuft (stündlich)
|
|
- Prüfe ob Batterie zur richtigen Zeit lädt
|
|
|
|
2. **Parameter optimieren**
|
|
- Preis-Schwellwert anpassen falls zu oft/selten lädt
|
|
- PV-Schwellwert anpassen basierend auf Erfahrung
|
|
- Reserve-Kapazität optimieren
|
|
|
|
3. **Statistiken sammeln**
|
|
- Notiere Einsparungen
|
|
- Vergleiche mit vorherigem Verbrauch
|
|
- Dokumentiere für Community
|
|
|
|
4. **Community-Veröffentlichung vorbereiten**
|
|
- Anonymisiere IP-Adressen und Passwörter
|
|
- Erstelle README mit deinen Erfahrungen
|
|
- Screenshots vom Dashboard
|
|
- Beispiel-Logs
|
|
|
|
---
|
|
|
|
## 📝 Wartung
|
|
|
|
### Regelmäßig prüfen:
|
|
- Logs auf Fehler durchsuchen
|
|
- Plan-Qualität bewerten (gute Vorhersagen?)
|
|
- Sensor-Verfügbarkeit (Strompreis, PV-Forecast)
|
|
|
|
### Bei Problemen:
|
|
1. Logs prüfen: `custom_components.pyscript`
|
|
2. Sensor-Zustände prüfen
|
|
3. Manuell Plan neu berechnen
|
|
4. Bei Bedarf Parameter anpassen
|
|
|
|
---
|
|
|
|
## 🎉 Fertig!
|
|
|
|
Dein intelligentes Batterie-Optimierungs-System ist jetzt installiert und nutzt dein bewährtes manuelles Steuerungssystem als solide Basis.
|
|
|
|
**Das System wird:**
|
|
- ✅ Automatisch täglich planen (14:05)
|
|
- ✅ Automatisch stündlich ausführen (xx:05)
|
|
- ✅ Zu günstigsten Zeiten laden
|
|
- ✅ PV-Eigenverbrauch maximieren
|
|
- ✅ Stromkosten minimieren
|
|
|
|
**Viel Erfolg! ⚡💰**
|