[Beta-Tester gesucht] InverterHub / Multi Wechselrichter - ein Modbus-TCP-Modul für GoodWe, SMA, Fronius, Sungrow, Solis, Growatt, SolaX, SolarEdge, Deye, Solplanet, Kostal, Victron, Huawei und weitere Hersteller

InverterHub — ein Modbus-TCP-Modul für viele Wechselrichter (+ Discovery + Energiefluss-Kachel)

Moin zusammen,

InverterHub liest Wechselrichter verschiedenster Hersteller direkt per Modbus TCP aus — ein generisches Treiber-Framework statt eines eigenen Moduls pro Hersteller. Dazu gibt es einen Netzwerk-Discovery und eine animierte Energiefluss-Kachel .

Dank vieler fleißiger Beta-Tester (danke euch!) läuft mittlerweile einiges an realen Anlagen. Hier der aktuelle Stand.

Die drei Module

  • InverterHub — die Auslese-Instanz. Hersteller wählen, IP eintragen, Datenpunkt-Gruppen aktivieren.
  • InverterHub Discovery — durchsucht einen IP-Bereich und legt gefundene Wechselrichter automatisch als Instanz an (Herstellererkennung über charakteristische Register).
  • InverterHub Kachel — Energiefluss-Visualisierung (Hauslast zentral, Solar/Netz/Batterie/Verbraucher radial). Funktioniert mit einer InverterHub-Instanz oder komplett eigenständig mit manuell zugewiesenen Variablen.

Unterstützte Hersteller

Legende: :white_check_mark: an realer Anlage bestätigt · :wrench: an realer Anlage in Prüfung · :test_tube: nach Herstellerdoku/Referenz implementiert (Feldrückmeldung willkommen)

Hersteller Status Umfang
GoodWe (ET/EH/BT/BH) :white_check_mark: PV, Netz, Batterie 1+2, Meter, Energie, Backup/Insel, EMS-Steuerung, Riso — produktiv im Einsatz
Fronius (SunSpec, GEN24-Hybrid) :white_check_mark: PV je String (U/I/P), Netz, Smart Meter (Gesamt + je Phase U/I/P), Energie, Batterie (SOC/Leistung/Spannung), Status
SolarEdge (SunSpec + StorEdge) :white_check_mark: PV, Netz, Meter inkl. Bezug/Einspeisung, Energie, Temperatur, StorEdge-Batterie (SOC/Leistung/Spannung/Strom/Temp/SOH/Zustand), berechnete PV-Erzeugung
Victron GX (Cerbo/Venus OS) :white_check_mark: PV (DC + AC-gekoppelt), Netz, Batterie (SOC/Leistung/Spannung/Strom/Zustand), Hausverbrauch, Netz-Quelle
Kostal (PLENTICORE plus Gen. 1) :wrench: PV (3 DC-Eingänge), Netz, Batterie, Meter, Hausverbrauch nach Quelle, Energie, Riso
SMA (STP/STPS/SI) :test_tube: PV, Netz, Meter, Energie, Temperatur, Status, Riso
Sungrow (SH-Hybrid) :test_tube: PV, Netz, Batterie, Meter, Energie, Backup, Riso
Solis (Hybrid) :test_tube: PV, Netz, Batterie, Meter, Energie
Growatt (TL-X/MOD/MIX/SPH/WIT) :test_tube: PV, Netz, Energie, Temperatur, Fehlercodes, Riso (optional/modellabhängig)
SolaX :test_tube: PV, Netz, Batterie, Meter — nur über SolaX-Monitoring-Dongle (TCP-Gateway)
Deye (SG04LP3) :test_tube: PV, Netz, Batterie, Hausverbrauch, Energie
Solplanet / AISWEI :test_tube: PV, Batterie, Temperatur, Energie
Huawei (SUN2000 + DTSU666 + LUNA2000) :test_tube: PV, Netz, Wirkleistung, Temperatur, Status, Energie, Smart Meter, Batterie, Riso

Highlights

  • :electric_plug: Ein Modul, viele Hersteller — austauschbare Treiber, gemeinsame Konventionen.
  • :magnifying_glass_tilted_right: Discovery deckt alle Hersteller ab (Victron über Unit-ID 100, Huawei über Modell-Register …).
  • :framed_picture: Energiefluss-Kachel — animiert, skaliert automatisch, radiale Anordnung, beliebig viele Zusatz-Verbraucher (Wärmepumpe, mehrere Wallboxen mit Fahrzeug-Zuordnung, …). Neu: auch ohne InverterHub nutzbar (manuelle Datenpunkte von beliebigen Modulen/Zählern).
  • :house: Hauslast wird sauber berechnet (AC-Bilanz) und kann als eigene Variable ausgegeben werden; optionaler echter Hauslastzähler zeigt zusätzlich die Wandlungsverluste.
  • :shield: Isolationswiderstand (Riso) bei GoodWe, Huawei, Sungrow, SMA, Kostal (Growatt optional).
  • :repeat_button: Invers-Schalter für Netz und Batterie (Datenpunkt-Konvention frei wählbar — die Kachel bleibt trotzdem korrekt).
  • :gear: Energie-Einheit wahlweise kWh oder Wh (Basiseinheit; die neue Symcon-Darstellung skaliert dann selbst).

Anschluss-Besonderheiten (kurz)

  • Kostal: Port 1502 (nicht 502) + Byte-Reihenfolge passend zum Gerät (Werk: CDAB).
  • Victron: Port 502; Unit-ID ist bei Victron ein Geräte-Selektor → Systemdienst liegt fest auf 100 (wird automatisch angesprochen).
  • Huawei: Port 502, Unit-ID meist 1 (auch 0/16 möglich).
  • Fronius: Smart Meter ist ein eigenes Modbus-Gerät → „Smart-Meter-Adresse" (Vorgabe 200, oft 240).
  • SolaX: nur über das Monitoring-Dongle (dessen IP eintragen, nicht die des WR).

Alle Registeradressen stehen im Beschreibungsfeld jeder Variable.

Installation

Über den Module Store → eigene Module → GitHub-Repository:
https://github.com/DG65/InverterHub (Branch beta )

Status

Das Ganze ist Beta . Die Register basieren auf öffentlichen Hersteller-Doku, der Referenz OpenEMS, gepflegten Bibliotheken (z. B. huawei-solar-lib) und von euch geteilten Modbus-Vorlagen — und wurden, wo möglich, gegen reale Anlagen geprüft.

Rückmeldungen sind ausdrücklich erwünscht — besonders zu den mit :test_tube:/:wrench: markierten Herstellern. Bitte mit Hersteller, Modell und betroffenem Register/Wert melden; bei Vorzeichen-Themen hilft ein kurzer Vergleich mit der Hersteller-App enorm.

Danke fürs Testen und die vielen guten Ideen! :raising_hands:

Was noch kommt

Das Modul ist bewusst als wachsendes Projekt angelegt, nicht als abgeschlossenes Werk:

  • Weitere Hersteller: und weitere sind als nächste Kandidaten im Blick — Vorschläge und vor allem Registerdokumentation zu weiteren Herstellern sind sehr willkommen.

  • Monitoring Kachel-Visualisierung: geplant ist eine grafische Übersichts-Kachel die alle relevanten Elektrischen Werte darstellt.

  • Mehrere Wechselrichter zusammenfassen: Bei Anlagen mit mehr als einem Wechselrichter (auch herstellerübergreifend) soll es eine Summen-/Aggregationsansicht geben, die die Werte aller Instanzen zu einer Gesamtanlagen-Sicht zusammenführt.

3 „Gefällt mir“

Hallo DerStandart,

probiere nochmals, Update sollte oben sein und wirken.

Danke für den Test!

Mein WR ist von Sungrow. Ich habe keinerlei Gerät von GoodWe. Die IP von dem Gerät, die hier angezeigt wird, gehört zu einem MODBUS RTU zu MODBUS TCP Konverter und ist somit falsch.

Erstellen der Instanz funktioniert nun ohne Fehlermeldung.

Sehr sehr viele Variablen bleiben leer. Ich warte mal ein bißchen ab und melde mich später noch mal.

Danke Dir für die Rückmeldung. Die Discovery Instanz findet alle Modbusgeräte :man_shrugging: und schaut auf welchen WR es passen könnte. Das ist natürlich suboptimal, bei mir findet er gleich mal 5 WR obwohl ich nur 1 WR habe, das andere sind Zähler und Wallboxen. Wenn alles mit dem Modul klappt, dann habe ich vor ein analoges Modul für Zähler bzw. Netzanalysegeräte wie z.B. PAC2200 bzw. Janitza UMG604 etc. zu bauen.

So wie das Modul den PAC2200 auf der 101 erkennt, scheint er einem SolaX ähnlich zu sein.

Vielleicht bekomme ich das noch hin, dass nicht alles was Modbus ist erkannt wird.

Das ist nicht richtig. Ich habe den MODBUS RTU auf MODBUS TCP Konverter hier insgesamt 2 Mal im Netzwerk. Baugleiche Geräte. Nur eines wird gefunden. Darüber hinaus gibt es hier noch mindestens ein anderes Gerät, welches MODBUS spricht, aber auch nicht erkannt wird.

Mich stört es aber nicht.

Sehr gut wenn es Dich nicht stört. Welchen Sungrow hast Du denn? Da Du sagst, dass nicht sehr viele Register ausgelesen werden, bin ich noch auf der Suche und dem einbinden nach anderen Registertabellen.

Sungrow SH 6.0 RT

Hier die Idents der Variablen, die nie ausgelesen worden sind:

soc                       
bat_total_pwr             
bat_charge_max_w          
bat_discharge_max_w       
work_mode                 
riso                      
temp_air                  
temp_module               
temp_heatsink             
dev_model                 
dev_fw_arm                
dev_fw_dsp                
grid_mode                 
island                    
meter_total               
grid_l1_volt              
grid_l1_curr              
grid_l1_freq              
grid_l1_pwr               
grid_l2_volt              
grid_l2_curr              
grid_l2_freq              
grid_l2_pwr               
grid_l3_volt              
grid_l3_curr              
grid_l3_freq              
grid_l3_pwr               
inv_total                 
pv1_voltage               
pv1_current               
pv2_voltage               
pv2_current               
mppt1_power               
mppt1_current             
pv3_voltage               
pv3_current               
pv4_voltage               
pv4_current               
mppt2_power               
mppt2_current             
pv5_voltage               
pv5_current               
pv6_voltage               
pv6_current               
mppt3_power               
mppt3_current             
warn_code                 
err_msg                   
err_detail                
bat1_volt                 
bat1_curr                 
bat1_pwr                  
bat1_mode                 
bat1_soc                  
bat1_soh                  
bat1_temp                 
bat1_bms_volt             
bat1_bms_curr             
bat1_chg_max_a            
bat1_dis_max_a            
bat1_bms_warn             
bat1_bms_alarm            
bat2_volt                 
bat2_curr                 
bat2_pwr                  
bat2_mode                 
bat2_soc                  
bat2_soh                  
bat2_temp                 
bat2_bms_volt             
bat2_bms_curr             
e_sell_day                
e_buy_day                 
e_load_day                
e_load_total              
e_charge_day              
e_charge_total            
e_disch_day               
e_disch_total             
work_hours                
mt_l1_volt                
mt_l2_volt                
mt_l3_volt                
mt_l1_curr                
mt_l2_curr                
mt_l3_curr                
backup_active             
backup_l1_volt            
backup_l1_curr            
backup_l1_freq            
backup_l1_pwr             
backup_l2_volt            
backup_l2_curr            
backup_l2_freq            
backup_l2_pwr             
backup_l3_volt            
backup_l3_curr            
backup_l3_freq            
backup_l3_pwr             
ctl_work_mode             
ctl_ems_enable            
ctl_ems_mode              
ctl_ems_power             
ctl_export_enable         
ctl_export_limit          
ctl_soc_min               
ctl_internet              
ctl_restart               
ctl_run   

Ich muss dazu sagen, dass bei mir an MPPT2 nichts hängt.

Und ich habe die IP vom WINET-S genutzt. Wenn man die IP des dedizierten Netzwerkanschlusses am Gerät nutzt, mag es möglicherweise mehrere Infos geben. Das muss man ggf. alles noch beachten.

SH 6.0 RT sollte schon funktionieren. Liest Du die Werte auch auf normalem Weg via Symcon aus? Also mit Modbus I/O > Modbus Gerät … etc.

Wenn ja, was bekommst Du da alles vom WR zurück?

Ich habe keine MODBUS Geräte, sondern einzelne Instanzen pro Adresse. Damals gab es die MODBUS Geräts noch nicht. Ich habe mir also aus der Dokumentation des Herstellers alles herausgesucht, was für mich interessant sein könnte.

Momentan frage ich folgendes ab:

Export Power (13010-13011)
Load Power (13008)
Export limit min (5622)
Export limit max (5623)
Phase A Voltage (5019)
Phase B Voltage (5020)
Phase C Voltage (5021)
Meter Active Power (5601-5602)
Selfconsumption of today (13029)
Load 1 / On Off (13011)
Total DC Power (5017-5018)
Total active Power (13034-13035)
System State (13000)
Start Charging Power (13084)
MPPT 1 Current (5012)
MPPT 1 Voltage (5011)
MPPT 2 Current (5014)
MPPT 2 Voltage (5013)
Battery Level (13023)
Daily Output Energy (5003)
Daily Charge Energy (13040)
Battery current (13021)
Battery power (13022)
Battery state of healthy (13024)
Battery voltage (13020)
Batterie temperature (13025)
Min SOC (13059)
Max SOC (13058)
EMS mode selection (13050)
Charge / Discharge power (13052)
Charge / Discharge Command (13051)
Start Discharging Power (13085)
Inside Temperature (5008)
SOC for Backup (13100)
Total Output Energy (5004-5005)
Off-grid option (13075)
Global Scan (30230)
Start/Stop (13000)
Load 1 adjustment mode (13002)
Daily battery charge energy from PV (13012)
Daily direct energy consumption (13017) 
Daily battery discharge energy (13026)
Daily Import Energy (13036)
Daily PV Generation (13002)
Daily export power from PV (13005)
Total export energy from PV (13006-13007)
Total PV Generation (13003-13004)
Total direct energy consumption (13018-13019)
Total Import energy (13037-13038)
Total battery charge energy from PV (13013-13014)
Total battery discharge energy (13027-13028)
Running State (13001)

Welche Werte kommen denn mit meinem Modul?

Ich habe mir das mal angesehen, ich denke, dass ich das Richtung Wochenende hinbekommen könnte. Einige Dinge könnte das Modul auch automatisiert ausblenden, z.B. den 2. Bat Port wenn keiner da ist oder den 3. MPPT etc.

Muss mal gucken wann es geht, aber vielen dank schon mal für Deine Hilfe!

1 „Gefällt mir“
ac_power                 
dev_sn                   
dev_rated_w              
running_state            
dev_type                 
grid_freq                
grid_v1                  
grid_v2                  
grid_v3                  
grid_reactive            
power_factor             
pv_total                 
mppt1_volt               
mppt1_curr               
mppt2_volt               
mppt2_curr               
mppt3_volt               
mppt3_curr               
mppt4_volt               
mppt4_curr               
connected                
e_pv_day                 
e_pv_total               
load_power               
export_power             
mt_l1_pwr                
mt_l2_pwr                
mt_l3_pwr                
backup_total             
backup_freq              
bat_power                
bat_volt                 
bat_curr                 
bat_soc                  
bat_soh                  
bat_temp

Das sind die Werte, die kommen. Zum Teil können sie auch 0 sein oder einen ungültigen Wert haben.

Was denkst Du zum Handling, zur Einrichtung des Moduls. Warst Du bis dahin zufrieden?

Netzwerk durchsuchen mag ich persönlich nicht. Ich hätte lieber eine IP eingegeben und fertig. Mag aber ein komische Eigenart von mir sein.

Mehr habe ich noch nicht damit angestellt. Werde mich heute Abend ausführlich beschäftigen.

1 „Gefällt mir“
grid_reactive, -262145
mt_l1_pwr, -13697025
bat_power, -52690945

Die scheinen mir ungültige Infos zu bekommen.

Sehr wahrscheinlich!

Netzwerk durchsuchen ist kein muss sondern eine Hilfe für so manchen. Generell kann man aber auch das Geräte „Wechselrichter (Multi-Hersteller)“ als Instanz anlegen und kann dann die IP eintippen wie Du es magst.

Nur möchte ich mit dem Modul auch noch eine andere Klasse bedienen und wenn ich da an unsere größte Anlage mit rund 900 Wechselrichtern denke - da möchtest Du dann auch keine Adressen mehr eintippen. Deshalb die Suche und auch die automatische Benennung der Wechselrichter.

1 „Gefällt mir“

Danke für die vielen Rückmeldungen! Es ist einiges passiert, hier der Überblick:

Neue Hersteller

Zu den ursprünglichen sieben (GoodWe, Sungrow, Solis, Growatt, SolaX, SMA, Fronius) sind vier weitere dazugekommen:

  • SolarEdge (reines SunSpec)
  • Deye (SG04LP3-Serie)
  • Solplanet / AISWEI (ASW-Gen-Serie)
  • Kostal (PLENTICORE plus Gen. 1)

Bugfixes

  • Sungrow und Solis hatten einen systematischen Off-by-one-Adressfehler (jedes Register wurde einen Schritt zu früh gelesen) — behoben, dank eines Testers mit Sungrow SH 6.0RT und seiner eigenen bestätigten Registerliste.
  • Bei Sungrow wurde meter_total nie beschrieben — jetzt korrekt aus dem vom Tester bestätigten Register gelesen.
  • Fronius: die SunSpec-Feldoffsets waren im empfohlenen Standardpfad (Float-Modell) fast durchgehend falsch (AC-Leistung, Status, Netzspannung, Netzfrequenz, Energiezähler betroffen) — gegen die offizielle SunSpec-Modelldefinition korrigiert.
  • SMA komplett neu geschrieben: von herstellereigenen Registern auf SunSpec umgestellt — schließt die vorher offene Lücke bei AC-/Netzwerten.
  • Kostal: Ladezustand (SOC) hatte einen Typ-/Profil-Mismatch — behoben, bevor es in freier Wildbahn auffallen konnte.

Discovery-Modul (Netzwerksuche)

  • Erkennt jetzt auch die vier neuen Hersteller.
  • Deutlich robuster gegen Fehlzuordnungen: mehrere gemeldete Fälle, in denen fremde Geräte fälschlich als Wechselrichter erkannt wurden (ein Janitza-Stromzähler als SolaX, ein Modbus-RTU/TCP-Konverter als GoodWe, zuletzt go-e-Wallboxen als Growatt) sind behoben — die Erkennung verlangt jetzt für jeden Hersteller ein zweites, härteres Kriterium (z. B. ein plausibles Seriennummer-/Text-Register), statt sich auf einen einzelnen Schwellenwert zu verlassen.
  • Neu: Fortschrittsanzeige während der Suche — zeigt live den Portscan und danach die Hersteller-Erkennung je gefundener IP, statt einfach nur zu warten, bis alles fertig ist.

InverterHub

  • Neu: Checkbox „Kommunikation aktiv" — damit lässt sich die Kommunikation zu einem Wechselrichter vorübergehend abschalten (z. B. bei Wartungsarbeiten), ohne die Instanz zu löschen oder die Konfiguration zu verlieren.

Bitte einmal neu testen

Wer die Fortschrittsanzeige und die verbesserte Erkennung im Discovery-Modul ausprobieren möchte: am einfachsten beide Instanzen (InverterHub und InverterHubDiscovery) einmal löschen und über die aktuelle Beta-Version neu anlegen. Bestehende, bereits laufende Instanzen profitieren von den Datenkorrekturen ohnehin automatisch beim nächsten Kernel-Neustart bzw. Modul-Update — nur die neue Fortschrittsanzeige und die Erkennungs-Verbesserungen selbst zeigen sich naturgemäß erst bei einer neuen Suche.

Wie immer: Rückmeldungen zu falschen/fehlenden Werten sehr willkommen, am besten mit Hersteller, Modell und betroffenem Register/Ident.

Neue Version ist draussen und ich hoffe, dass ich einiges beheben konnte.

Vielleicht löschst Du auch nochmals beide Instanzen und beginnst nochmals mit der Discovery Instanz, auch wenn Du nicht der Scan-Typ bist, Für mich ist aber wichtig was er vermeintlich zu finden gedenkt etc.

1 „Gefällt mir“