Frage zu Symmetisch/Asymetrisch

Was ist mit Symmetrisch und Asymetrisch bei vielen OpenEMS komponenten gemeint? Hab ja eine Vermutung, allerdings keine genaue Info dazu gefunden.
Geht es da um dreiphasige Komponenten, die auf jeder Phase gleich einspeisen?
Mit ist aufgefallen, dass Inverter nach Sunspec-Spezifikation nur symmetrisch implementiert sind. Ich habe aber einen Deye SUN-12K-SG04LP3, der 100% asymmetrisch arbeiten kann. Käme das openEMS-Modul mit diesem Inverter klar oder liefert das dann falsche Daten?

Hallo,
ich plane auch, den gleichen Deye Hybrid-Wechselrichter einzusetzen und würde ihne gerne mit Openems verheiraten. Bist du bei dem Thema schon weitergekommen?
Viele Grüße,
Michael

Bis jetzt noch nicht. Den Deye hab ich allerdings auch noch nicht physisch vorliegen. Das Protokoll soll wohl nach dem sunspec Standard sein dafür gibt es wohl bei OpenEMS was. Sobald der da ist, probiere ich damit mal rum und schaue, wie es sich verhält. Notfalls muss man da selbst mal an den Code ran.

Hallo zusammen,

richtig, Symmetrisch und Asymmetrisch bezeichnet die symmetrische/asymmetrische Verteilung der Leistung auf drei Phasen. Viele größere Batteriewechselrichter dürfen aufgrund der Phasenschieflast im Netzparallelbetrieb nur symmetrisch genutzt werden.

Für die Implementierung des Deye SUN-12K-SG04LP3 würde ich mich sowohl am Battery-Inverter.Kaco.BlueplanetGridsave (weil er via SunSpec eingebunden ist) als auch an GoodWe ET and BT-Series Hybrid Inverters (weil es ein Hybrid-Wechselrichter ist) orientieren.

Welche SunSpec-Blöcke gelesen und gemappt werden sollen, wird im Code definiert (openems/KacoBlueplanetGridsaveImpl.java at develop · OpenEMS/openems · GitHub), das lässt sich also auch auf asymmetrisch anpassen.

Der KACO nutzt für die Leistungsvorgabe leider keine Standard SunSpec-Register, sondern den prioprietären Bereich (Blöcke S_64201 bis S_64204). Für den Deye müsste man da also sicher nochmal manuell Hand anlegen.

Gibt es für den Deye ein öffentlich zugängliches Modbus-Protokoll?

Gruß,
Stefan

Offentlich nicht, aber im Anhang gibts eine etwas unscharfe Kopie, die ich mal auf mein Google Drive geladen habe. Leider kann man die nicht mit dem Google-Übrsetzter ind Deutsche oder englische übersetzen. Es sind aber zumindest an vielen Stellen engliche Anmerkungen dabei. Aber vielleicht hilft es.

Deye Modbus Protocol

Hallo Thomas,

ja, das sieht schon ganz brauchbar aus. Allerdings ist es kein SunSpec-Protokoll. Das muss aber kein Nachteil sein. Man müsste das Protokoll halt einfach manuell ‘herunterschreiben’.

Gruß,
Stefan

Ich hab noch eine Datei für das Protokoll gefunden. es handelt sich hierbei um eine +.yaml für die chinesische Solarman software.

# Deye 12K EU tree Phase Hybrid
# SUN-12K-SG04LP3 | 12KW | Three Phase | 2 MPPT | Hybrid Inverter | Low Voltage Battery
# Modbus information retrieved from:Deye Modbus RTU tree Phase Energy Storage Communications Protokoll
requests:
  - start: 0x0003
    end: 0x0059
    mb_functioncode: 0x03
  - start: 0x0204  
    end: 0x0210
    mb_functioncode: 0x03
  - start: 0x021C  
    end: 0x021D
    mb_functioncode: 0x03
  - start: 0x0229  
    end: 0x022E
    mb_functioncode: 0x03    
  - start: 0x024A  
    end: 0x024D
    mb_functioncode: 0x03  
  - start: 0x0256  
    end: 0x025E
    mb_functioncode: 0x03 
  - start: 0x0260  
    end: 0x026A
    mb_functioncode: 0x03
  - start: 0x0276  
    end: 0x027C
    mb_functioncode: 0x03    
  - start: 0x0284  
    end: 0x028D
    mb_functioncode: 0x03   
  - start: 0x02A0  
    end: 0x02A7
    mb_functioncode: 0x03 
  - start: 0x0085  
    end: 0x0086
    mb_functioncode: 0x10
  
parameters:
 - group: solar
   items: 
    - name: "PV1 Power"
      class: "power"
      state_class: "measurement"
      uom: "W"
      scale: 1
      rule: 1
      registers: [0x02A0]
      icon: 'mdi:solar-power'

    - name: "PV2 Power"
      class: "power"
      state_class: "measurement"
      uom: "W"
      scale: 1
      rule: 1
      registers: [0x02A1]
      icon: 'mdi:solar-power'

    - name: "PV1 Voltage"
      class: "voltage"
      state_class: "measurement"
      uom: "V"
      scale: 0.1
      rule: 1
      registers: [0x02A4]
      icon: 'mdi:solar-power'

    - name: "PV2 Voltage"
      class: "voltage"
      state_class: "measurement"
      uom: "V"
      scale: 0.1
      rule: 1
      registers: [0x02A6]
      icon: 'mdi:solar-power'

    - name: "PV1 Current"
      class: "current"
      uom: "A"
      scale: 0.1
      rule: 1
      registers: [0x02A5]
      icon: 'mdi:solar-power'

    - name: "PV2 Current"
      class: "current"
      state_class: "measurement"
      uom: "A"
      scale: 0.1
      rule: 1
      registers: [0x02A7]
      icon: 'mdi:solar-power'

    - name: "Daily Production"
      class: "energy"
      state_class: "measurement"
      uom: "kWh"
      scale: 0.1
      rule: 1
      registers: [0x01F5]
      icon: 'mdi:solar-power'

    - name: "Total Production"
      class: "energy"
      state_class: "total_increasing"
      uom: "kWh"
      scale: 0.1
      rule: 3
      registers: [0x0216,0x0217]
      icon: 'mdi:solar-power'

 - group: Battery
   items: 
    - name: "Total Battery Charge"
      class: "energy"
      state_class: "total_increasing"      
      uom: "kWh"
      scale: 0.1
      rule: 3
      registers: [0x0204,0x0205]
      icon: 'mdi:battery-plus'

    - name: "Total Battery Discharge"
      class: "energy"
      state_class: "total_increasing"
      uom: "kWh"
      scale: 0.1
      rule: 3
      registers: [0x0206,0x0207]
      icon: 'mdi:battery-minus'

    - name: "Battery Power"
      class: "power"
      state_class: "measurement"
      uom: "W"
      scale: 1
      rule: 2
      registers: [0x024D]
      icon: 'mdi:battery'

    - name: "Battery Voltage"
      class: "voltage"
      state_class: "measurement"
      uom: "V"
      scale: 0.01
      rule: 1
      registers: [0x024B]
      icon: 'mdi:battery'

    - name: "Battery SOC"
      class: "battery"
      state_class: "measurement"
      uom: "%"
      scale: 1
      rule: 1
      registers: [0x024C]
      icon: 'mdi:battery'

    - name: "Battery Current"
      class: "current"
      state_class: "measurement"
      uom: "A"
      scale: 0.01
      rule: 2
      registers: [0x024B]
      icon: 'mdi:battery'

    - name: "Battery Temperature"
      class: "temperature"
      state_class: "measurement"
      uom: "°C"
      scale: 0.1
      rule: 1
      offset: 1000      
      registers: [0x024A]
      icon: 'mdi:battery'
 
 - group: Grid
   items: 
    - name: "Total Grid Power"
      class: "power"
      state_class: "measurement"
      uom: "W"
      scale: 1
      rule: 2
      registers: [0x0260]
      icon: 'mdi:transmission-tower'

    - name: "Grid Voltage L1"
      class: "voltage"
      state_class: "measurement"
      uom: "V"
      scale: 0.1
      rule: 1
      registers: [0x0256]
      icon: 'mdi:transmission-tower'

    - name: "Grid Voltage L2"
      class: "voltage"
      state_class: "measurement"
      uom: "V"
      scale: 0.1
      rule: 1
      registers: [0x0257]
      icon: 'mdi:transmission-tower'
      
    - name: "Grid Voltage L3"
      class: "voltage"
      state_class: "measurement"
      uom: "V"
      scale: 0.1
      rule: 1
      registers: [0x0258]
      icon: 'mdi:transmission-tower'  

    - name: "Internal CT L1 Power"
      class: "power"
      state_class: "measurement"
      uom: "W"
      scale: 1
      rule: 2
      registers: [0x025C]
      icon: 'mdi:transmission-tower'

    - name: "Internal CT L2 Power"
      class: "power"
      state_class: "measurement"
      uom: "W"
      scale: 1
      rule: 2
      registers: [0x025D]
      icon: 'mdi:transmission-tower'
      
    - name: "Internal CT L3 Power"
      class: "power"
      state_class: "measurement"
      uom: "W"
      scale: 1
      rule: 2
      registers: [0x025E]
      icon: 'mdi:transmission-tower'  

    - name: "External CT L1 Power"
      class: "power"
      state_class: "measurement"
      uom: "W"
      scale: 1
      rule: 2
      registers: [0x0268]
      icon: 'mdi:transmission-tower'

    - name: "External CT L2 Power"
      class: "power"
      state_class: "measurement"
      uom: "W"
      scale: 1
      rule: 2
      registers: [0x0269]
      icon: 'mdi:transmission-tower'
      
    - name: "External CT L3 Power"
      class: "power"
      state_class: "measurement"
      uom: "W"
      scale: 1
      rule: 2
      registers: [0x026A]
      icon: 'mdi:transmission-tower'
      
    - name: "Daily Energy Bought"
      class: "energy"
      state_class: "total_increasing"
      uom: "kWh"
      scale: 0.1
      rule: 1
      registers: [0x0208]
      icon: 'mdi:transmission-tower-export'

    - name: "Total Energy Bought"
      class: "energy"
      state_class: "total_increasing"
      uom: "kWh"
      scale: 0.1
      rule: 1
      registers: [0x020A,0x020B]
      icon: 'mdi:transmission-tower-export'
      
    - name: "Daily Energy Sold"
      class: "energy"
      state_class: "total_increasing"
      uom: "kWh"
      scale: 0.1
      rule: 1
      registers: [0x0209]
      icon: 'mdi:transmission-tower-import'

    - name: "Total Energy Sold"
      class: "energy"
      state_class: "total_increasing"
      uom: "kWh"
      scale: 0.1
      rule: 3
      registers: [0x020A,0x020B]
      icon: 'mdi:transmission-tower-import'

    - name: "Total Grid Production"
      class: "energy"
      state_class: "total_increasing"
      uom: "kWh"
      scale: 0.1
      rule: 4
      registers: [0x020C,0x020D]
      icon: 'mdi:transmission-tower'
      
 - group: Upload
   items: 
    - name: "Total Load Power"
      class: "power"
      state_class: "measurement"      
      uom: "W"
      scale: 1
      rule: 1
      registers: [0x028D]
      icon: 'mdi:lightning-bolt-outline'

    - name: "Load L1 Power"
      class: "power"
      state_class: "measurement"      
      uom: "W"
      scale: 1
      rule: 1
      registers: [0x028A]
      icon: 'mdi:lightning-bolt-outline'

    - name: "Load L2 Power"
      class: "power"
      state_class: "measurement"      
      uom: "W"
      scale: 1
      rule: 1
      registers: [0x028B]
      icon: 'mdi:lightning-bolt-outline'
      
    - name: "Load L3 Power"
      class: "power"
      state_class: "measurement"      
      uom: "W"
      scale: 1
      rule: 1
      registers: [0x028C]
      icon: 'mdi:lightning-bolt-outline'
      
    - name: "Load Voltage L1"
      class: "voltage"
      state_class: "measurement"      
      uom: "V"
      scale: 0.1
      rule: 1
      registers: [0x0284]
      icon: 'mdi:lightning-bolt-outline'
      
    - name: "Load Voltage L2"
      class: "voltage"
      state_class: "measurement"      
      uom: "V"
      scale: 0.1
      rule: 1
      registers: [0x0285]
      icon: 'mdi:lightning-bolt-outline'
      
    - name: "Load Voltage L3"
      class: "voltage"
      state_class: "measurement"      
      uom: "V"
      scale: 0.1
      rule: 1
      registers: [0x0286]
      icon: 'mdi:lightning-bolt-outline'
      
    - name: "Daily Load Consumption"
      class: "energy"
      state_class: "total_increasing"      
      uom: "kWh"
      scale: 0.1
      rule: 1
      registers: [0x020E]
      icon: 'mdi:lightning-bolt-outline'

    - name: "Total Load Consumption"
      class: "energy"
      state_class: "total_increasing"      
      uom: "kWh"
      scale: 0.1
      rule: 3
      registers: [0x020F,0x0210]
      icon: 'mdi:lightning-bolt-outline'

    - name: "SmartLoad Enable Status"
      class: ""
      state_class: ""      
      uom: ""
      scale: 1
      rule: 1
      registers: [0x00C3]
      isstr: true
      lookup: 
      -  key: 0
         value: "OFF"
      -  key: 1
         value: "ON"
      icon: 'mdi:lightning-bolt-outline'
     
 - group: Inverter
   items: 
    - name: "Running Status"
      class: ""
      state_class: ""      
      uom: ""
      scale: 1
      rule: 1
      registers: [0x01F4]
      isstr: true
      lookup: 
      -  key: 0
         value: "Stand-by"
      -  key: 1
         value: "Self-checking"
      -  key: 2
         value: "Normal"
      -  key: 3
         value: "FAULT"
      icon: 'mdi:home-lightning-bolt'

    - name: "Total Power"
      class: "power"
      state_class: "measurement"      
      uom: "W"
      scale: 1
      rule: 2
      registers: [0x00AF]
      icon: 'mdi:home-lightning-bolt'

    - name: "Current L1"
      class: "current"
      state_class: "measurement"      
      uom: "A"
      scale: 0.01
      rule: 2
      registers: [0x0276]
      icon: 'mdi:home-lightning-bolt'

    - name: "Current L2"
      class: "current"
      uom: "A"
      scale: 0.01
      rule: 2
      registers: [0x0277]
      icon: 'mdi:home-lightning-bolt'
      
    - name: "Current L3"
      class: "current"
      uom: "A"
      scale: 0.01
      rule: 2
      registers: [0x0278]
      icon: 'mdi:home-lightning-bolt'
      
    - name: "Inverter L1 Power"
      class: "power"
      state_class: "measurement"      
      uom: "W"
      scale: 1
      rule: 2
      registers: [0x0279]
      icon: 'mdi:home-lightning-bolt'

    - name: "Inverter L2 Power"
      class: "power"
      state_class: "measurement"      
      uom: "W"
      scale: 1
      rule: 2
      registers: [0x027A]
      icon: 'mdi:home-lightning-bolt'
      
    - name: "Inverter L3 Power"
      class: "power"
      state_class: "measurement"      
      uom: "W"
      scale: 1
      rule: 2
      registers: [0x027B]
      icon: 'mdi:home-lightning-bolt'
      
    - name: "DC Temperature"
      class: "temperature"
      state_class: "measurement"      
      uom: "°C"
      scale: 0.1
      rule: 2
      offset: 1000      
      registers: [0x021C]
      icon: 'mdi:thermometer'

    - name: "AC Temperature"
      class: "temperature"
      state_class: "measurement"      
      uom: "°C"
      scale: 0.1
      rule: 2
      offset: 1000      
      registers: [0x021D]
      icon: 'mdi:thermometer'

    - name: "Inverter ID"
      class: ""
      state_class: ""      
      uom: ""
      scale: 1
      rule: 5
      registers: [0x0003,0x0004,0x0005,0x0006,0x0007]
      isstr: true
    
    - name: "Communication Board Version No."
      class: ""
      state_class: ""      
      uom: ""
      scale: 1
      rule: 1
      registers: [0x0011]
      isstr: true

    - name: "Control Board Version No."
      class: ""
      state_class: ""      
      uom: ""
      scale: 1
      rule: 1
      registers: [0x000D]
      isstr: true

 - group: Alert
   items: 
    - name: "Alert"
      class: ""
      state_class: ""      
      uom: ""
      scale: 1
      rule: 6
      registers: [0x0229,0x022A,0x22B,0x022C,0x022D,0x022E]
     

Ich hab jetzt mal versucht, mich entsprechend Implementing a device :: Open Energy Management System an die Geschichte mir dem Deye heran zu wagen, nachdem ich das in PHP für IPSymcon ziemlich gut am Laufen habe. Allerdings bin ich in Java absoluter Neuling und ich scheitere shcon, wenn ich versuche da sowas wie im beispiel für einen Bytteryinverter aufzusetzen. Gibt es jemand, denn ich mit meinen Fragen, auch mal außerhalb des Forums mal belästigen kann?
Sind in OpenEMS Batterieinverter eigentlich nur für die Batterie zuständig, oder können die auch selbst PV eingänge haben?

Hallo Thomas,

in Darstellung Speichersystem - #21 by klinki haben wir gerade ein ähnliches Thema mit SolarEdge diskutiert. Zu den OpenEMS Natures:

ESS (Energy Storage Systems) repräsentieren (AC-)Stromspeichersysteme, also die Kombination aus Batteriewechselrichter und Batterie. Das passt immer dann, wenn OpenEMS nur mit dem Batteriewechselrichter spricht und von diesem auch die Batteriedaten ausliest - z. B. bei SMA, GoodWe, etc z. B. in Verbindung mit einer BYD Battery-Box. Dort kommuniziert der Wechselrichter direkt mit der Batterie und ist die einzige Schnittstelle zum EMS.

Vor allem in Gewerbe- und Industriesystemen (aber auch z. B. beim FENECON Home) ist es sinnvoll mit Batterie und Batteriewechselrichter zu sprechen, um wirklich an alle Informationen zu kommen und das System optimal anzusteuern. Bei diesen Systemen ist es außerdem oft so, dass die Wechselrichter nicht direkt mit den Batterien sprechen können, so dass dann OpenEMS die beiden verheiraten muss. In diesem Fall kann ein Generic-ESS in OpenEMS konfiguriert werden, der dann einen BatteryInverter und eine Battery braucht. BatteryInverter ist in diesem Zusammenhang dann der Batteriewechselrichter; Battery die eigentliche Batterie.

Bei Hybrid-Batteriewechselrichtern, die also zusätzlich zur Batterie auch noch MPP-Tracker für die PV-Anlage integriert haben, muss der ESS auch noch die Datenpunkte von HybridEss zur Verfügung stellen. Die MPP-Tracker werden dann nochmal über separate EssDcCharger Komponenten abgebildet.

EssDcCharger repräsentieren also DC-seitig eingebundene PV-Anlagen am Hybrid-Wechselrichter. AC-seitig eingebunde PV-Anlagen sind im OpenEMS PV-Inverter.

Diese Trennung ist wichtig, damit am Ende die richtige Summe errechnet werden kann. Das sieht man z. B. schön an den Grafiken in diesem sehr guten Artikel mit Bildern: PV-Speichersysteme: Unterschied AC und DC - Memodo Blog. So entspricht z. B. die ActivePower bei einem ESS der kombinierten Ausgangsleistung eines Hybrid-Batteriewechselrichters, enthält also unter Umständen Batterie-Entladung und DC-PV-Produktion. Damit die PV-Produktion aber nicht doppelt gezählt wird, wird die ActualPower eines EssDcChargers intern anders verrechnet als die ActivePower eines PV-Inverters oder SymmetricMeters.

Ich weiß… alles nicht so ganz einfach zu verstehen, aber das ist leider das Ergebnis der verschiedenen Hardwarekonfigurationen, die man ‘draußen’ so findet.

Gruß,
Stefan

1 Like

Hallo MichiH,

nachdem ich nun den Deye WR in Betrieb habe werde ich mich von openEMS verabschieden. Der macht halt schon per interner Firmware all das, was ich eigentlich mit OpenEMS realisieren wollte. Das Einzige was nicht geht, ist prognosebasiertes Laden des Akkus aber daran arbeite ich. Zudem hatte ich, da ich nicht unbedingt in Java so gut bin ohnehin Probleme, durch den doch recht spärlich kommentierten Code und die fehlende Dokumentation durchzusteigen und da ein eigenes Modul für OpenEMS für diesen WR zu schreiben.
In meine Hausautomatisierung IPSymcon ist der Deye nun über ein selbst geschriebenes Modul eingebunden und die Visualisierung lasse ich über Grafana laufen. Funktioniert Super, ich brauch keinen weiteren Raspberry und sieht auch besser aus.