Update: Battery Optimizer v3.4.0 mit allen Fixes und Features
This commit is contained in:
456
INSTALLATION.md
Normal file
456
INSTALLATION.md
Normal file
@@ -0,0 +1,456 @@
|
||||
# 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!)
|
||||
Reference in New Issue
Block a user