Lokaler Growatt-Energy-Gateway-Dienst für einen Raspberry Pi. Das Projekt soll später Growatt NEO/NOAH-Daten lokal empfangen, zwischenspeichern, für eine eigene Zero-Export-/Nulleinspeisungsregelung auswerten, per MQTT an Home Assistant weitergeben und eine lokale Weboberfläche mit Live-Grafiken bereitstellen.
Aktuelle Version: V0.001.12
Version 1 implementiert noch keine echte Growatt-Protokolldekodierung, keine Growatt-Cloud-Anbindung und keine realen Steuerbefehle an echte Geräte. Alle Messwerte kommen aus einer Mock-Datenquelle.
- FastAPI-Webserver mit Dashboard, Live-Grafiken, Einstellungen und Logs.
- Zweisprachige Weboberfläche mit Deutsch/Englisch-Auswahl.
- WebSocket unter
/ws/livefür Live-Daten. - SQLite-Speicherung für Messwerte, Regelentscheidungen, Einstellungen und Logs.
- Mock-Growatt-Gerät mit realistischen Schwankungen.
- Abstraktes
GrowattDevice-Interface für spätere Adapter. - Offene lokale Messgeräte-Schnittstelle mit Mock-Meter und Shelly-3EM-Adapter.
- Integrationen-Seite mit lokalem Netzwerk-Scan fuer Shelly 3EM / Shelly Pro 3EM.
- Zusatz-Shellys als lokale Datenquellen fuer PV-Leistung, Verbraucher, Batterie oder sonstige Messwerte.
- Langzeit-Tagesstatistik fuer PV-Ertrag, Netzbezug, Einspeisung, Batterie und Shelly-Daten.
- Zero-Export-Regelalgorithmus mit Safety-Checks und Fail-Safe.
- MQTT-Publisher für Home Assistant und Mosquitto.
- MQTT Auto Discovery unter
homeassistant/.... - Dockerfile,
docker-compose.yml,.env.example. - GitHub Actions Workflow für Tests.
- Update-Seite unter
/updatemit GitHub-Versionspruefung.
- Raspberry Pi oder Linux-System mit Docker.
- Git.
- MQTT-Broker, z. B. Mosquitto.
- Optional Home Assistant mit aktiviertem MQTT.
Voraussetzungen auf Raspberry Pi installieren:
sudo apt update
sudo apt install -y git docker.io docker-compose-plugin
sudo systemctl enable docker
sudo systemctl start dockerRepository klonen:
git clone https://github.com/Thomash100/Growatt_Dat.git growatt-local-gateway
cd growatt-local-gatewaycp .env.example .env
nano .envWichtige Variablen:
MQTT_HOSTMQTT_PORTMQTT_USERNAMEMQTT_PASSWORDMQTT_TOPIC_PREFIXMQTT_DISCOVERY_PREFIXDATABASE_PATHWEB_PORTUI_LANGUAGE(deoderen)METER_PROVIDER(mockodershelly_3em)METER_POWER_SIGN(normaloderinverted)SHELLY_3EM_BASE_URL(z. B.http://192.168.178.252)SHELLY_3EM_GENERATION(auto,gen1odergen2)SHELLY_3EM_TIMEOUT_SECONDSUPDATE_CHECK_ENABLEDUPDATE_REPOSITORYUPDATE_CHECK_TIMEOUT_SECONDSWEB_UPDATE_ENABLEDWEB_UPDATE_TOKENWEB_UPDATE_TOKEN_REQUIREDWEB_UPDATE_WORKDIRWEB_UPDATE_COMMAND_TIMEOUT_SECONDSWEB_UPDATE_REQUIRE_CLEAN_TREEWEB_UPDATE_RUN_DOCKER_COMPOSEWEB_UPDATE_RESTART_AFTER_SUCCESSINTEGRATION_SCAN_DEFAULT_CIDRINTEGRATION_SCAN_TIMEOUT_SECONDSINTEGRATION_SCAN_CONCURRENCYINTEGRATION_SCAN_MAX_HOSTSZERO_EXPORT_ENABLEDTARGET_GRID_POWER_WGRID_POWER_BAND_MIN_WGRID_POWER_BAND_MAX_WCONTROL_INTERVAL_SECONDSMIN_OUTPUT_CHANGE_WOUTPUT_STEP_WMAX_OUTPUT_POWER_WMIN_OUTPUT_POWER_WMIN_SOC_PERCENTSTALE_MEASUREMENT_SECONDS
.env darf nicht committed werden. .env.example enthält nur Beispielwerte.
docker compose up -d --buildLogs anzeigen:
docker compose logs -fDienst stoppen:
docker compose downhttp://raspberrypi.local:8080
Die Sprache der Weboberfläche ist über UI_LANGUAGE=de oder UI_LANGUAGE=en vorkonfigurierbar und kann später unter /settings ohne Container-Neustart geändert werden.
Lokale Endpunkte:
//live/statistics/settings/integrations/logs/update/api/status/api/update/check/api/update/install/status/api/update/install/api/integrations/scan/api/integrations/apply/api/shelly-devices/api/statistics/daily/api/settings/api/meters/api/meter/latest/api/measurements/latest/api/measurements/history/api/control/latest
Topic-Prefix: growatt_local_gateway
growatt_local_gateway/stategrowatt_local_gateway/measurementsgrowatt_local_gateway/controlgrowatt_local_gateway/statusgrowatt_local_gateway/settingsgrowatt_local_gateway/shellygrowatt_local_gateway/statistics
Payloads sind JSON.
Rohmesswerte bleiben in SQLite erhalten. Zusaetzlich schreibt der Dienst eine Tagesstatistik in die Tabelle daily_energy. Daraus entstehen lokale Langzeitwerte fuer PV-Ertrag, Ausgangsenergie, Netzbezug, Einspeisung, Batterie-Laden/-Entladen sowie Shelly-PV und weitere Shelly-Rollen.
Die Werte sind unter /statistics sichtbar und per API unter /api/statistics/daily abrufbar. Fuer Home Assistant wird der aktuelle Tagesstand auch unter growatt_local_gateway/statistics veroeffentlicht.
Der Regler nutzt den lokalen Grid-Meter-Wert als grid_power_w. Standard ist METER_PROVIDER=mock. Für einen Shelly 3EM:
METER_PROVIDER=shelly_3em
SHELLY_3EM_BASE_URL=http://192.168.178.252
SHELLY_3EM_GENERATION=gen2
METER_POWER_SIGN=normalDiese Werte sind Startwerte aus .env; danach kannst du Messgeraet-Typ, Shelly-Adresse, Generation, Timeout und Stromrichtung auf /settings aendern. Die Aenderungen werden in SQLite gespeichert und ohne Container-Neustart wirksam. Dein Shelly unter 192.168.178.252 antwortet als Shelly Pro/Gen2 per RPC, daher ist SHELLY_3EM_GENERATION=gen2 passend.
Wenn die Stromrichtung deiner Wandler invertiert ist, setze METER_POWER_SIGN=inverted oder waehle auf der Website Invertiert. Shelly 3EM Gen1 wird über /status gelesen, Shelly Pro/Gen2 über EM.GetStatus; bei auto versucht der Adapter beides. Bei Meter-Fehlern setzt der Regler keine Leistungserhöhung.
Zusaetzliche Shellys koennen unter /integrations als lokale Datenquellen angelegt werden. Rollen sind PV-Anlage, Verbraucher, Batterie und Sonstige. Die App liest Gen1 und Gen2 allgemein aus und speichert verfuegbare Werte wie Leistung, Energie, Spannung, Strom, Temperatur, Relaisstatus und kompakte Rohdaten. Die PV-Summe erscheint im Dashboard als Shelly PV-Leistung und im MQTT-Topic growatt_local_gateway/shelly.
Unter /integrations kann ein lokaler Scan im privaten Heimnetz gestartet werden, z. B. 192.168.178.0/24. Der Scanner nutzt kurze HTTP-Abfragen fuer bekannte Integrationen und ist auf private IPv4-Netze begrenzt. Gefundene Shelly 3EM / Shelly Pro 3EM Geraete koennen direkt als Netz-Messgeraet uebernommen werden. Andere Shellys koennen als Zusatz-Shelly fuer lokale Daten uebernommen werden.
Konfigurierbare Scan-Werte:
INTEGRATION_SCAN_DEFAULT_CIDR=192.168.178.0/24
INTEGRATION_SCAN_TIMEOUT_SECONDS=0.6
INTEGRATION_SCAN_CONCURRENCY=32
INTEGRATION_SCAN_MAX_HOSTS=254Trage in .env den Mosquitto- oder Home-Assistant-MQTT-Broker ein. Danach veröffentlicht der Dienst Messwerte und Regelstatus unter dem konfigurierten Topic-Prefix.
Discovery-Topics werden unter homeassistant/... veröffentlicht. Enthalten sind:
- PV-Leistung
- Ausgangsleistung
- Netzleistung
- Batterie-SOC
- Lade-/Entladeleistung
- Ziel-Ausgangsleistung
- Zero Export aktiv
- Gerätestatus
- letzter Stellbefehl
- letzter Fehler
- Shelly PV-Leistung
- Shelly Gesamtleistung
Die normale Raspberry-Pi-Aktualisierung ueber apt update und apt upgrade aktualisiert Systempakete. Dieses GitHub-Projekt wird damit erst automatisch aktualisiert, wenn spaeter ein eigenes Debian-Paket oder ein APT-Repository bereitgestellt wird.
Die Weboberflaeche bietet unter /update eine Versionspruefung gegen GitHub. Zusaetzlich gibt es einen optionalen Web-Update-Installationsbutton. Er ist standardmaessig deaktiviert und startet nur mit lokalem Token aus .env.
cd growatt-local-gateway
git pull
docker compose up -d --buildOptionaler Web-Update-Button:
openssl rand -hex 24WEB_UPDATE_ENABLED=true
WEB_UPDATE_TOKEN=bitte-ein-langes-zufaelliges-token-setzen
WEB_UPDATE_TOKEN_REQUIRED=true
WEB_UPDATE_WORKDIR=/app
WEB_UPDATE_REQUIRE_CLEAN_TREE=true
WEB_UPDATE_RUN_DOCKER_COMPOSE=true
WEB_UPDATE_RESTART_AFTER_SUCCESS=falseWenn dir der Token im reinen Heimnetz zu unpraktisch ist, kannst du ihn bewusst deaktivieren:
WEB_UPDATE_ENABLED=true
WEB_UPDATE_TOKEN_REQUIRED=false
WEB_UPDATE_TOKEN=Dann blendet die Weboberflaeche das Tokenfeld aus und der Installationsbutton startet direkt. Das sollte nur im eigenen lokalen Netzwerk genutzt werden.
In Docker-Setups ist fuer echte Selbst-Updates zusaetzliche Vorbereitung noetig. Ohne Docker-Zugriff im Container zeigt die Weboberflaeche den Button als nicht bereit an. Fuer einen einfachen Git-Pull-Modus mit Neustart kann das optionale Override genutzt werden:
docker compose -f docker-compose.yml -f docker-compose.web-update.yml up -d --buildOptional:
docker image prune -f- Keine echten Growatt-Zugangsdaten in den Code schreiben.
- Keine
.envcommitten. - Keine Passwörter im Frontend anzeigen.
- Web-Update nur mit langem lokalem Token aktivieren und nicht ins Internet freigeben.
- Version 1 sendet keine realen Steuerbefehle an echte Geräte.
- Spätere Hardwarebefehle müssen durch Safety-Prüfungen und klare Grenzwerte abgesichert werden.
Der Regler erlaubt keine Leistungserhöhung bei ungültigen oder veralteten Messwerten, zu niedrigem SOC, unbekanntem Gerätestatus oder Fehlerstatus. Zielwerte werden immer auf die konfigurierten Mindest- und Maximalwerte begrenzt. Bei veralteten Messwerten und SOC-Unterschreitung wird die Ausgangsleistung reduziert.
- Passiver lokaler Growatt-Listener für NEO/NOAH-Daten.
- Decoder für lokale Growatt-Frames.
- Datenlogger-Proxy oder GroBro-ähnliche Logik als Adapter.
- Optionaler Forwarder zur Growatt Cloud.
- Gekapselter Command-Client für verifizierte lokale Stellbefehle.
- Erweiterte Tests mit aufgezeichneten Protokollframes.
- Weitere lokale Messgeräte-Adapter hinter
EnergyMeter, z. B. Tasmota, Modbus, MQTT-Meter oder Home-Assistant-Sensoren.