Skip to content

Commit

Permalink
Implement KACO Blueplanet Hybrid 10 (#1966)
Browse files Browse the repository at this point in the history
# KACO Blueplanet Hybrid 10

## Implemented Components:

* *Kaco.BlueplanetHybrid10.Core*
  * This component is always required to establish the communication to the hardware device.

* *Kaco.BlueplanetHybrid10.Ess*
  * This implements the Energy Storage System part (i.e. `ManagedSymmetricEss`) for read-only (fast internal control) or read-write (slow external control)

* *Kaco.BlueplanetHybrid10.Charger*
  * This implements the DC Charger/MPP tracker for the photovoltaics system (i.e. `EssDcCharger`). Note that there is only one instance for both MPP trackers, because the inverter does not provide separated power values.

* *Kaco.BlueplanetHybrid10.PvInverter*
  * This implements the inverter as a pure photovoltaics inverter (i.e. `ManagedSymmetricPvInverter`). Use this instead of Ess+Charger, if you are using the inverter purely as PV inverter without a battery.

* *Kaco.BlueplanetHybrid10.GridMeter*
  * This implements the grid meter (product name "VECTIS" or "blueplanet hy-switch") connected to the inverter (i.e. `AsymmetricMeter`) 

## License/Dependencies

NOTE: *The configuration of the Kaco.BlueplanetHybrid10.Core Component requires an `identkey`. This relates to the "Partner ID" that has to be acquired from Katek Memmingen GmbH. Without the `identkey` it is not possible to establish a communication with the hardware device.**

This bundle is provided under the EPL (Eclipse Public License), but it depends on the Katek EDCOM library under `io.openems.edge.katek.edcom`, which is licensed as LGPL (GNU Lesser General Public License) by Katek Memmingen GmbH.

## Product page:
https://kaco-newenergy.com/de/produkte/blueplanet-hybrid-10.0-TL3/

---

# Katek EDCOM Library

EDCOM 8.1 is a java cross platform library for communication with 10kW hybrid Inverter.

Java code provided by Katek Memmingen GmbH under the GNU LPGLv3.0. 
Converted to Java 11 compatible code and packaged as OpenEMS Edge bundle by FENECON GmbH.
  • Loading branch information
sfeilmeier committed Nov 6, 2022
1 parent a50b1e6 commit d1aabf3
Show file tree
Hide file tree
Showing 83 changed files with 10,517 additions and 4 deletions.
2 changes: 1 addition & 1 deletion cnf/build.bnd
Expand Up @@ -64,7 +64,7 @@ testpath: \
Edge_Controller_PVinverter;member=${filter;${p};io\.openems\.edge\.controller\.pvinverter\..*},\
Edge_Ess;member=${filter;${p};io\.openems\.edge\.ess\..*},\
Edge_Evcs;member=${filter;${p};io\.openems\.edge\.evcs\..*|io\.openems\.wrapper\.eu\.chargetime\.ocpp},\
Edge_Multiple;member=${filter;${p};io\.openems\.edge\.fenecon\..*|io\.openems\.edge\.goodwe|io\.openems\.edge\.kostal\.piko|io\.openems\.edge\.tesla\..*|io\.openems\.edge\.solaredge|io\.openems\.edge\.bosch\..*},\
Edge_Multiple;member=${filter;${p};io\.openems\.edge\.fenecon\..*|io\.openems\.edge\.goodwe|io\.openems\.edge\.kostal\.piko|io\.openems\.edge\.tesla\..*|io\.openems\.edge\.solaredge|io\.openems\.edge\.bosch\..*|io\.openems\.edge\.katek\..*|io\.openems\.edge\.kaco\..*},\
Edge_IO;member=${filter;${p};io\.openems\.edge\.io\..*|io\.openems\.edge\.controller\.channelthreshold|io\.openems\.edge\.controller\.chp\..*|io\.openems\.edge\.controller\.highloadtimeslot},\
Edge_Meter;member=${filter;${p};io\.openems\.edge\.meter\..*},\
Edge_Predictor;member=${filter;${p};io\.openems\.edge\.predictor\..*},\
Expand Down
7 changes: 6 additions & 1 deletion io.openems.edge.application/EdgeApp.bndrun
Expand Up @@ -37,11 +37,11 @@
bnd.identity;id='io.openems.edge.battery.bydcommercial',\
bnd.identity;id='io.openems.edge.battery.fenecon.commercial',\
bnd.identity;id='io.openems.edge.battery.fenecon.home',\
bnd.identity;id='io.openems.edge.battery.soltaro',\
bnd.identity;id='io.openems.edge.batteryinverter.kaco.blueplanetgridsave',\
bnd.identity;id='io.openems.edge.batteryinverter.refu88k',\
bnd.identity;id='io.openems.edge.batteryinverter.sinexcel',\
bnd.identity;id='io.openems.edge.batteryinverter.sunspec',\
bnd.identity;id='io.openems.edge.battery.soltaro',\
bnd.identity;id='io.openems.edge.bosch.bpts5hybrid',\
bnd.identity;id='io.openems.edge.bridge.mbus',\
bnd.identity;id='io.openems.edge.bridge.modbus',\
Expand Down Expand Up @@ -125,6 +125,8 @@
bnd.identity;id='io.openems.edge.io.shelly',\
bnd.identity;id='io.openems.edge.io.wago',\
bnd.identity;id='io.openems.edge.io.weidmueller',\
bnd.identity;id='io.openems.edge.kaco.blueplanet.hybrid10',\
bnd.identity;id='io.openems.edge.katek.edcom',\
bnd.identity;id='io.openems.edge.kostal.piko',\
bnd.identity;id='io.openems.edge.meter.abb',\
bnd.identity;id='io.openems.edge.meter.artemes.am2',\
Expand Down Expand Up @@ -276,6 +278,8 @@
io.openems.edge.io.shelly;version=snapshot,\
io.openems.edge.io.wago;version=snapshot,\
io.openems.edge.io.weidmueller;version=snapshot,\
io.openems.edge.kaco.blueplanet.hybrid10;version=snapshot,\
io.openems.edge.katek.edcom;version=snapshot,\
io.openems.edge.kostal.piko;version=snapshot,\
io.openems.edge.meter.abb;version=snapshot,\
io.openems.edge.meter.api;version=snapshot,\
Expand Down Expand Up @@ -343,6 +347,7 @@
io.openems.wrapper.retrofit2;version=snapshot,\
io.openems.wrapper.sdnotify;version=snapshot,\
io.reactivex.rxjava3.rxjava;version='[3.1.5,3.1.6)',\
javax.jmdns;version='[3.4.1,3.4.2)',\
javax.xml.soap-api;version='[1.4.0,1.4.1)',\
org.apache.commons.commons-csv;version='[1.9.0,1.9.1)',\
org.apache.commons.commons-fileupload;version='[1.4.0,1.4.1)',\
Expand Down
12 changes: 12 additions & 0 deletions io.openems.edge.kaco.blueplanet.hybrid10/.classpath
@@ -0,0 +1,12 @@
<?xml version="1.0" encoding="UTF-8"?>
<classpath>
<classpathentry kind="con" path="aQute.bnd.classpath.container"/>
<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-11"/>
<classpathentry kind="src" output="bin" path="src"/>
<classpathentry kind="src" output="bin_test" path="test">
<attributes>
<attribute name="test" value="true"/>
</attributes>
</classpathentry>
<classpathentry kind="output" path="bin"/>
</classpath>
3 changes: 3 additions & 0 deletions io.openems.edge.kaco.blueplanet.hybrid10/.gitignore
@@ -0,0 +1,3 @@
/bin/
/bin_test/
/generated/
23 changes: 23 additions & 0 deletions io.openems.edge.kaco.blueplanet.hybrid10/.project
@@ -0,0 +1,23 @@
<?xml version="1.0" encoding="UTF-8"?>
<projectDescription>
<name>io.openems.edge.kaco.blueplanet.hybrid10</name>
<comment></comment>
<projects>
</projects>
<buildSpec>
<buildCommand>
<name>org.eclipse.jdt.core.javabuilder</name>
<arguments>
</arguments>
</buildCommand>
<buildCommand>
<name>bndtools.core.bndbuilder</name>
<arguments>
</arguments>
</buildCommand>
</buildSpec>
<natures>
<nature>org.eclipse.jdt.core.javanature</nature>
<nature>bndtools.core.bndnature</nature>
</natures>
</projectDescription>
@@ -0,0 +1,2 @@
eclipse.preferences.version=1
encoding/<project>=UTF-8
18 changes: 18 additions & 0 deletions io.openems.edge.kaco.blueplanet.hybrid10/bnd.bnd
@@ -0,0 +1,18 @@
Bundle-Name: OpenEMS Edge KACO blueplanet hybrid 10.0 TL3
Bundle-Vendor: KACO new energy GmbH, FENECON GmbH
Bundle-License: https://opensource.org/licenses/EPL-2.0
Bundle-Version: 1.0.0.${tstamp}

-buildpath: \
${buildpath},\
io.openems.common,\
io.openems.edge.common,\
io.openems.edge.ess.api,\
io.openems.edge.katek.edcom,\
io.openems.edge.meter.api,\
io.openems.edge.pvinverter.api,\
io.openems.edge.timedata.api,\
javax.jmdns,\

-testpath: \
${testpath}
29 changes: 29 additions & 0 deletions io.openems.edge.kaco.blueplanet.hybrid10/readme.adoc
@@ -0,0 +1,29 @@
= KACO Blueplanet Hybrid 10

== Implemented Components:

* *Kaco.BlueplanetHybrid10.Core*
** This component is always required to establish the communication to the hardware device.

* *Kaco.BlueplanetHybrid10.Ess*
** This implements the Energy Storage System part (i.e. `ManagedSymmetricEss`) for read-only (fast internal control) or read-write (slow external control)

* *Kaco.BlueplanetHybrid10.Charger*
** This implements the DC Charger/MPP tracker for the photovoltaics system (i.e. `EssDcCharger`). Note that there is only one instance for both MPP trackers, because the inverter does not provide separated power values.

* *Kaco.BlueplanetHybrid10.PvInverter*
** This implements the inverter as a pure photovoltaics inverter (i.e. `ManagedSymmetricPvInverter`). Use this instead of Ess+Charger, if you are using the inverter purely as PV inverter without a battery.

* *Kaco.BlueplanetHybrid10.GridMeter*
** This implements the grid meter (product name "VECTIS" or "blueplanet hy-switch") connected to the inverter (i.e. `AsymmetricMeter`)

== License/Dependencies

NOTE: *The configuration of the Kaco.BlueplanetHybrid10.Core Component requires an `identkey`. This relates to the "Partner ID" that has to be acquired from Katek Memmingen GmbH. Without the `identkey` it is not possible to establish a communication with the hardware device.**

This bundle is provided under the EPL (Eclipse Public License), but it depends on the Katek EDCOM library under `io.openems.edge.katek.edcom`, which is licensed as LGPL (GNU Lesser General Public License) by Katek Memmingen GmbH.

== Product page:
https://kaco-newenergy.com/de/produkte/blueplanet-hybrid-10.0-TL3/

https://github.com/OpenEMS/openems/tree/develop/io.openems.edge.kaco.blueplanet.hybrid10[Source Code icon:github[]]
@@ -0,0 +1,50 @@
package io.openems.edge.kaco.blueplanet.hybrid10;

import io.openems.common.types.OptionsEnum;

public enum BatteryStatus implements OptionsEnum {
UNDEFINED(-1, "Undefined"), //
ERROR(0, "Error"), //
OFF_STANDBY(1, "Off/Standby"), //
TEST_2(2, "Test 2"), //
TEST_3(3, "Test 3"), //
TEST_4(4, "Test 4"), //
TEST_5(5, "Test 5"), //
TEST_6(6, "Test 6"), //
TEST_7(7, "Test 7"), //
TEST_8(8, "Test 8"), //
TEST_9(9, "Test 9"), //
TEST_10(10, "Test 10"), //
TEST_11(11, "Test 11"), //
TEST_12(12, "Test 12"), //
TEST_13(13, "Test 13"), //
TEST_14(14, "Test 14"), //
TEST_15(15, "Test 15"), //
TEST_16(16, "Test 16"), //
ON_ACTIVE(17, "On/Active"), //
POWER_DOWN(18, "Power down"), //
SOFTWARE_UPDATE(19, "Software Update");

private final int value;
private final String name;

private BatteryStatus(int value, String name) {
this.value = value;
this.name = name;
}

@Override
public int getValue() {
return this.value;
}

@Override
public String getName() {
return this.name;
}

@Override
public OptionsEnum getUndefined() {
return UNDEFINED;
}
}
@@ -0,0 +1,67 @@
package io.openems.edge.kaco.blueplanet.hybrid10;

import io.openems.common.channel.Level;
import io.openems.edge.common.channel.Doc;

public enum ErrorChannelId implements io.openems.edge.common.channel.ChannelId {
A001(Doc.of(Level.WARNING).text("Emergency Stop")), //
A002(Doc.of(Level.WARNING).text("Key Manual Stop")), //
A003(Doc.of(Level.WARNING).text("Transformer Phase B Temperature Sensor Invalidation")), //
A004(Doc.of(Level.WARNING).text("SD Memory Card Invalidation")), //
A005(Doc.of(Level.WARNING).text("Inverter Communication Abnormity")), //
A010(Doc.of(Level.WARNING).text("Battery Stack Communication Abnormity")), //
A021(Doc.of(Level.WARNING).text("Multifunctional Ammeter Communication Abnormity")), //
A022(Doc.of(Level.WARNING).text("Remote Communication Abnormity")), //
A030(Doc.of(Level.WARNING).text("PVDC1 Communication Abnormity")), //
A032(Doc.of(Level.WARNING).text("PVDC2 Communication Abnormity")), //
A040(Doc.of(Level.WARNING).text("Transformer Severe Overtemperature")), //
A050(Doc.of(Level.WARNING).text("DC Precharge Contactor Close Unsuccessfully")), //
A060(Doc.of(Level.WARNING).text("AC Precharge Contactor Close Unsuccessfully")), //
A071(Doc.of(Level.WARNING).text("AC Main Contactor Close Unsuccessfully")), //
A072(Doc.of(Level.WARNING).text("DC Electrical Breaker1 Close Unsuccessfully")), //
A100(Doc.of(Level.WARNING).text("DC Main Contactor Close Unsuccessfully")), //
A110(Doc.of(Level.WARNING).text("AC Breaker Trip")), //
A200(Doc.of(Level.WARNING).text("AC Main Contactor Open When Running")), //
A210(Doc.of(Level.WARNING).text("DC Main Contactor Open When Running")), //
A220(Doc.of(Level.WARNING).text("AC Main Contactor Open Unsuccessfully")), //
A230(Doc.of(Level.WARNING).text("DC Electrical Breaker1 Open Unsuccessfully")), //

E001(Doc.of(Level.FAULT).text("DC Main Contactor Open Unsuccessfully")), //
E002(Doc.of(Level.FAULT).text("Hardware PDP Fault")), //
E010(Doc.of(Level.FAULT).text("Master Stop Suddenly")), //
E021(Doc.of(Level.FAULT).text("DCShortCircuitProtection")), //
E022(Doc.of(Level.FAULT).text("DCOvervoltageProtection")), //
E030(Doc.of(Level.FAULT).text("DCUndervoltageProtection")), //
E041(Doc.of(Level.FAULT).text("DCInverseNoConnectionProtection")), //
E042(Doc.of(Level.FAULT).text("DCDisconnectionProtection")), //
E050(Doc.of(Level.FAULT).text("CommutingVoltageAbnormityProtection")), //
E060(Doc.of(Level.FAULT).text("DCOvercurrentProtection")), //
E070(Doc.of(Level.FAULT).text("Phase1PeakCurrentOverLimitProtection")), //
E080(Doc.of(Level.FAULT).text("Phase2PeakCurrentOverLimitProtection")), //
E101(Doc.of(Level.FAULT).text("Phase3PeakCurrentOverLimitProtection")), //
E102(Doc.of(Level.FAULT).text("Phase1GridVoltageSamplingInvalidation")), //
E103(Doc.of(Level.FAULT).text("Phase2VirtualCurrentOverLimitProtection")), //
E104(Doc.of(Level.FAULT).text("Phase3VirtualCurrentOverLimitProtection")), //
E110(Doc.of(Level.FAULT).text("Phase1GridVoltageSamplingInvalidation2")), //
E120(Doc.of(Level.FAULT).text("Phase2ridVoltageSamplingInvalidation")), //
E140(Doc.of(Level.FAULT).text("Phase3GridVoltageSamplingInvalidation")), //
E150(Doc.of(Level.FAULT).text("Phase1InvertVoltageSamplingInvalidation")), //
E160(Doc.of(Level.FAULT).text("Phase2InvertVoltageSamplingInvalidation")), //
E170(Doc.of(Level.FAULT).text("Phase3InvertVoltageSamplingInvalidation")), //
E180(Doc.of(Level.FAULT).text("ACCurrentSamplingInvalidation")); //

private final Doc doc;

private ErrorChannelId(Doc doc) {
this.doc = doc;
}

@Override
public Doc doc() {
return this.doc;
}

public String getErrorCode() {
return this.name();
}
}
@@ -0,0 +1,45 @@
package io.openems.edge.kaco.blueplanet.hybrid10;

import io.openems.common.types.OptionsEnum;

public enum InverterStatus implements OptionsEnum {
UNDEFINED(-1, "Undefined"), //
ERROR(0, "Error"), //
OFF_STANDBY(1, "Off/Standby"), //
TEST_2(2, "Test 2"), //
TEST_3(3, "Test 3"), //
TEST_4(4, "Test 4"), //
TEST_5(5, "Test 5"), //
TEST_6(6, "Test 6"), //
TEST_7(7, "Test 7"), //
TEST_8(8, "Test 8"), //
TEST_9(9, "Test 9"), //
TEST_10(10, "Test 10"), //
TEST_11(11, "Test 11"), //
OFF_GRID(12, "Off-Grid/Island"), //
GRID_13(13, "Grid 13"), //
GRID_14(14, "Grid 14");

private final int value;
private final String name;

private InverterStatus(int value, String name) {
this.value = value;
this.name = name;
}

@Override
public int getValue() {
return this.value;
}

@Override
public String getName() {
return this.name;
}

@Override
public OptionsEnum getUndefined() {
return UNDEFINED;
}
}

0 comments on commit d1aabf3

Please sign in to comment.