Files
battery-charging-optimizer/INSTALLATION.md

457 lines
10 KiB
Markdown

# Installation Guide - OpenEMS Battery Optimizer
Vollständige Schritt-für-Schritt-Anleitung zur Installation des Battery Charging Optimizers.
## Inhaltsverzeichnis
1. [Voraussetzungen](#voraussetzungen)
2. [PyScript Installation](#1-pyscript-installation)
3. [Script-Dateien kopieren](#2-script-dateien-kopieren)
4. [Konfiguration](#3-konfiguration)
5. [Automationen einrichten](#4-automationen-einrichten)
6. [Dashboard installieren](#5-dashboard-installieren)
7. [Erste Inbetriebnahme](#6-erste-inbetriebnahme)
8. [Verifizierung](#7-verifizierung)
---
## Voraussetzungen
### Home Assistant
- Home Assistant 2024.2 oder neuer
- Zugriff auf `/config/` Verzeichnis (via File Editor oder SSH)
- HACS installiert
### Hardware
- OpenEMS auf BeagleBone (oder vergleichbar)
- GoodWe Batterie & Inverter
- Netzwerkverbindung zu OpenEMS (Modbus TCP Port 502, JSON-RPC Port 8074)
### Erforderliche Integrationen
1. **PyScript** (via HACS)
- Settings → Devices & Services → Add Integration → PyScript
2. **Forecast.Solar** (Standard Integration)
- Settings → Devices & Services → Add Integration → Forecast.Solar
- Konfiguriere deine PV-Arrays (Azimut, Neigung, kWp)
3. **Modbus** (Standard Integration)
- Wird in `configuration.yaml` konfiguriert (siehe unten)
---
## 1. PyScript Installation
### Via HACS
1. HACS → Integrations → "Explore & Download Repositories"
2. Suche nach "PyScript"
3. Download & Install
4. Home Assistant neu starten
### Konfiguration
Füge zu `configuration.yaml` hinzu:
```yaml
pyscript:
allow_all_imports: true
hass_is_global: true
```
**Neustart erforderlich!**
---
## 2. Script-Dateien kopieren
Kopiere die folgenden Dateien nach `/config/pyscript/`:
```bash
/config/pyscript/
├── battery_charging_optimizer.py # Haupt-Optimizer
├── hastrom_flex_extended.py # Strompreis-Fetcher
└── ess_set_power.py # Modbus Power Control
```
### Via File Editor
1. Settings → Add-ons → File Editor
2. Navigiere zu `/config/pyscript/`
3. Erstelle neue Dateien und kopiere den Inhalt
### Via SSH/Terminal
```bash
cd /config/pyscript
wget https://gitea.ges4.net/felix/openems-battery-optimizer/raw/branch/main/pyscripts/battery_charging_optimizer.py
wget https://gitea.ges4.net/felix/openems-battery-optimizer/raw/branch/main/pyscripts/hastrom_flex_extended.py
wget https://gitea.ges4.net/felix/openems-battery-optimizer/raw/branch/main/pyscripts/ess_set_power.py
```
---
## 3. Konfiguration
### 3.1 Input Helper erstellen
Kopiere `config/battery_optimizer_config.yaml` und füge den Inhalt zu deiner `configuration.yaml` hinzu:
<details>
<summary>Input Helper Konfiguration (Klicken zum Ausklappen)</summary>
```yaml
input_boolean:
battery_optimizer_enabled:
name: "Batterie-Optimierung aktiviert"
icon: mdi:battery-charging
goodwe_manual_control:
name: "Manuelle Batteriesteuerung"
icon: mdi:battery-sync
battery_optimizer_manual_override:
name: "Manueller Override (Automatik pausieren)"
icon: mdi:pause-circle
input_number:
battery_capacity_kwh:
name: "Batteriekapazität"
min: 1
max: 50
step: 0.1
unit_of_measurement: "kWh"
icon: mdi:battery
initial: 10 # ← DEINE KAPAZITÄT
battery_optimizer_min_soc:
name: "Minimum SOC"
min: 0
max: 100
step: 1
unit_of_measurement: "%"
initial: 20
battery_optimizer_max_soc:
name: "Maximum SOC"
min: 0
max: 100
step: 1
unit_of_measurement: "%"
initial: 100
battery_optimizer_max_charge_power:
name: "Maximale Ladeleistung"
min: 1000
max: 10000
step: 100
unit_of_measurement: "W"
initial: 5000 # ← DEINE MAX LADELEISTUNG
charge_power_battery:
name: "Ziel-Ladeleistung"
min: -10000
max: 10000
step: 100
unit_of_measurement: "W"
icon: mdi:flash
# ... weitere Input Helper aus battery_optimizer_config.yaml
```
</details>
### 3.2 REST Commands
Füge `config/rest_requests.yaml` zu deiner `configuration.yaml` hinzu:
```yaml
rest_command:
set_ess_remote_mode:
url: "http://x:admin@192.168.89.144:8074/jsonrpc" # ← DEINE OPENEMS IP
method: POST
payload: '{"method": "updateComponentConfig", "params": {"componentId": "ess0","properties":[{"name": "controlMode","value": "REMOTE"}]}}'
set_ess_internal_mode:
url: "http://x:admin@192.168.89.144:8074/jsonrpc" # ← DEINE OPENEMS IP
method: POST
payload: '{"method": "updateComponentConfig", "params": {"componentId": "ess0","properties":[{"name": "controlMode","value": "INTERNAL"}]}}'
```
### 3.3 Modbus Konfiguration
Füge zu `configuration.yaml` hinzu:
```yaml
modbus:
- name: openEMS
type: tcp
host: 192.168.89.144 # ← DEINE OPENEMS IP
port: 502
sensors:
- name: "EssSoc"
address: 802
slave: 1
scan_interval: 5
unit_of_measurement: "%"
device_class: battery
- name: "EssActivepower"
address: 806
slave: 1
scan_interval: 5
unit_of_measurement: "W"
device_class: power
- name: "GridActivepower"
address: 2822
slave: 1
scan_interval: 5
unit_of_measurement: "W"
device_class: power
- name: "ProductionActivepower"
address: 2837
slave: 1
scan_interval: 5
unit_of_measurement: "W"
device_class: power
- name: "ConsumptionActivepower"
address: 2827
slave: 1
scan_interval: 5
unit_of_measurement: "W"
device_class: power
```
**Nach jeder Änderung**: Configuration → Reload YAML Configuration (oder Neustart)
---
## 4. Automationen einrichten
### 4.1 Optimizer Automationen
Importiere `automations/battery_optimizer_automations.yaml`:
**Option A: Via UI**
1. Settings → Automations & Scenes
2. Rechts unten: "⋮" → "Edit in YAML"
3. Kopiere jede Automation einzeln
**Option B: Via automations.yaml**
Füge alle Automations aus der Datei zu deiner `/config/automations.yaml` hinzu.
**Wichtig**: Passe IDs an, falls Konflikte:
```yaml
- id: battery_optimizer_daily_calculation # ← Muss unique sein
alias: "Batterie Optimierung: Tägliche Planung"
...
```
### 4.2 Keep-Alive & ESS-Modus Automationen
Importiere die drei Automations aus `automations/`:
1. `speicher_manuell_laden.yaml` - Keep-Alive (30s)
2. `manuelle_speicherbeladung_aktivieren.yaml` - ESS → REMOTE
3. `manuelle_speicherbeladung_deaktivieren.yaml` - ESS → INTERNAL
---
## 5. Dashboard installieren
### Empfohlen: Sections Dashboard (Standard)
1. Settings → Dashboards → "+ ADD DASHBOARD"
2. Name: "Batterie Optimierung"
3. Icon: `mdi:battery-charging`
4. "⋮" → "Edit Dashboard" → "Raw configuration editor"
5. Kopiere Inhalt von `dashboards/battery_optimizer_sections_standard.yaml`
### Alternative Dashboards
- **Compact**: `battery_optimizer_sections_compact.yaml`
- **Minimal**: `battery_optimizer_sections_minimal.yaml`
### Erforderliche Custom Cards (HACS)
```
HACS → Frontend → Explore & Download Repositories:
- Mushroom Cards
- Bubble Card
- Plotly Graph Card
- Power Flow Card Plus
- Stack-in-Card
```
---
## 6. Erste Inbetriebnahme
### 6.1 PyScript neu laden
```
Developer Tools → Services
Service: pyscript.reload
```
### 6.2 Optimizer aktivieren
```
Developer Tools → States
Suche: input_boolean.battery_optimizer_enabled
Set State: on
```
### 6.3 Ersten Plan erstellen
```
Developer Tools → Services
Service: pyscript.calculate_charging_schedule
```
Prüfe die Logs:
```
Settings → System → Logs
Filter: "battery"
```
---
## 7. Verifizierung
### 7.1 Schedule prüfen
```
Developer Tools → States
Entity: pyscript.battery_charging_schedule
```
Attributes sollten enthalten:
- `schedule`: Array mit Stunden
- `num_charges`: Anzahl Ladestunden
- `last_update`: Timestamp
### 7.2 Preis-Sensor prüfen
```
Developer Tools → States
Entity: sensor.hastrom_flex_pro_ext
```
Attributes:
- `prices_today`: Array mit 24 Preisen
- `datetime_today`: Array mit Timestamps
- `tomorrow_available`: true/false
- `prices_tomorrow`: Array (ab 14:00)
### 7.3 Modbus-Verbindung prüfen
```
Developer Tools → States
Entity: sensor.esssoc
```
Sollte aktuellen SOC anzeigen (z.B. 65%).
### 7.4 Test-Ladung
**Vorsicht: Startet echte Batterieladung!**
```yaml
Developer Tools → Services
# 1. Ladeleistung setzen
Service: input_number.set_value
Target: input_number.charge_power_battery
Data:
value: -3000 # Negativ = Laden mit 3000W
# 2. Manuellen Modus aktivieren
Service: input_boolean.turn_on
Target: input_boolean.goodwe_manual_control
```
Prüfe:
- OpenEMS sollte "REMOTE" Modus zeigen
- Batterie sollte mit ~3000W laden
- Nach 30s wieder stoppen:
```yaml
Service: input_boolean.turn_off
Target: input_boolean.goodwe_manual_control
```
---
## Troubleshooting
### PyScript startet nicht
```bash
# Prüfe Syntax-Fehler
cd /config/pyscript
python3 battery_charging_optimizer.py
```
### Keine Strompreise
- Prüfe Internet-Verbindung
- URL testen: `http://eex.stwhas.de/api/spotprices/flexpro?start_date=20250126&end_date=20250127`
- Log prüfen: `grep -i hastrom /config/home-assistant.log`
### Modbus Fehler
```yaml
# Test Modbus Verbindung
Developer Tools → Services
Service: modbus.write_register
Data:
hub: openEMS
slave: 1
address: 706
value: [0, 0] # 0W (Test)
```
### Batterie lädt nicht
1. Prüfe `input_boolean.goodwe_manual_control` ist ON
2. Prüfe OpenEMS ESS Mode (sollte REMOTE sein)
3. Prüfe Keep-Alive Automation läuft
4. Prüfe OpenEMS Logs: `tail -f /var/log/openems/openems.log`
---
## Nächste Schritte
Nach erfolgreicher Installation:
1. **Monitoring**: Beobachte den ersten Ladezyklus
2. **Feintuning**: Passe `min_soc`, `max_charge_power` an
3. **Dashboard**: Experimentiere mit verschiedenen Dashboard-Varianten
4. **Automationen**: Erweitere mit eigenen Automationen
---
## Support
Bei Problemen:
1. Prüfe [TROUBLESHOOTING.md](docs/TROUBLESHOOTING.md)
2. Schaue in die [Issues](https://gitea.ges4.net/felix/openems-battery-optimizer/issues)
3. Erstelle ein Issue mit:
- Home Assistant Version
- OpenEMS Version
- Relevante Logs
- Konfiguration (ohne Passwörter!)