You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@plc4x.apache.org by cd...@apache.org on 2019/12/27 19:16:13 UTC

[plc4x] 08/09: - Continued implementing the new S7 driver

This is an automated email from the ASF dual-hosted git repository.

cdutz pushed a commit to branch next-gen-core
in repository https://gitbox.apache.org/repos/asf/plc4x.git

commit 250e860e04d83e53237d3d0c70c713882882011b
Author: Christofer Dutz <ch...@c-ware.de>
AuthorDate: Fri Dec 27 00:05:18 2019 +0100

    - Continued implementing the new S7 driver
---
 .../apache/plc4x/java/s7}/utils/StaticHelper.java  |  15 +-
 sandbox/test-java-s7-driver-passive/pom.xml        |   6 +
 .../apache/plc4x/java/s7}/utils/StaticHelper.java  |   2 +-
 sandbox/test-java-s7-driver/pom.xml                |  24 +--
 .../s7/readwrite/protocol/S7ProtocolLogic.java     | 215 ++-------------------
 .../java/s7/readwrite/utils/S7PlcFieldHandler.java | 141 +++++++-------
 .../s7/{readwrite => }/utils/StaticHelper.java     |  16 +-
 .../enrich/knxnetip/ets5/Ets5DataEnrichment.java   |  32 +--
 8 files changed, 126 insertions(+), 325 deletions(-)

diff --git a/sandbox/test-java-s7-driver/src/main/java/org/apache/plc4x/java/s7/readwrite/utils/StaticHelper.java b/sandbox/plc-simulator/src/main/java/org/apache/plc4x/java/s7/utils/StaticHelper.java
similarity index 88%
copy from sandbox/test-java-s7-driver/src/main/java/org/apache/plc4x/java/s7/readwrite/utils/StaticHelper.java
copy to sandbox/plc-simulator/src/main/java/org/apache/plc4x/java/s7/utils/StaticHelper.java
index 60bf88a..7c085b9 100644
--- a/sandbox/test-java-s7-driver/src/main/java/org/apache/plc4x/java/s7/readwrite/utils/StaticHelper.java
+++ b/sandbox/plc-simulator/src/main/java/org/apache/plc4x/java/s7/utils/StaticHelper.java
@@ -16,9 +16,10 @@ KIND, either express or implied.  See the License for the
 specific language governing permissions and limitations
 under the License.
 */
-package org.apache.plc4x.java.s7.readwrite.utils;
+package org.apache.plc4x.java.s7.utils;
 
 import org.apache.commons.lang3.NotImplementedException;
+import org.apache.plc4x.java.api.value.PlcValue;
 import org.apache.plc4x.java.spi.generation.ParseException;
 import org.apache.plc4x.java.spi.generation.ReadBuffer;
 import org.apache.plc4x.java.spi.generation.WriteBuffer;
@@ -40,7 +41,7 @@ public class StaticHelper {
         }
     }
 
-    public static void serializeTiaTime(WriteBuffer io, LocalTime value) {
+    public static void serializeTiaTime(WriteBuffer io, PlcValue value) {
 
     }
 
@@ -54,7 +55,7 @@ public class StaticHelper {
         }
     }
 
-    public static void serializeS5Time(WriteBuffer io, LocalTime value) {
+    public static void serializeS5Time(WriteBuffer io, PlcValue value) {
 
     }
 
@@ -62,7 +63,7 @@ public class StaticHelper {
         throw new NotImplementedException("LTime not implemented");
     }
 
-    public static void serializeTiaLTime(WriteBuffer io, LocalTime value) {
+    public static void serializeTiaLTime(WriteBuffer io, PlcValue value) {
 
     }
 
@@ -76,7 +77,7 @@ public class StaticHelper {
         }
     }
 
-    public static void serializeTiaTimeOfDay(WriteBuffer io, LocalTime value) {
+    public static void serializeTiaTimeOfDay(WriteBuffer io, PlcValue value) {
 
     }
 
@@ -89,7 +90,7 @@ public class StaticHelper {
         }
     }
 
-    public static void serializeTiaDate(WriteBuffer io, LocalDate value) {
+    public static void serializeTiaDate(WriteBuffer io, PlcValue value) {
 
     }
 
@@ -118,7 +119,7 @@ public class StaticHelper {
         }
     }
 
-    public static void serializeTiaDateTime(WriteBuffer io, LocalDateTime value) {
+    public static void serializeTiaDateTime(WriteBuffer io, PlcValue value) {
 
     }
 
diff --git a/sandbox/test-java-s7-driver-passive/pom.xml b/sandbox/test-java-s7-driver-passive/pom.xml
index 259972b..5a1b5d8 100644
--- a/sandbox/test-java-s7-driver-passive/pom.xml
+++ b/sandbox/test-java-s7-driver-passive/pom.xml
@@ -61,9 +61,15 @@
     </dependency>
     <dependency>
       <groupId>org.apache.plc4x</groupId>
+      <artifactId>plc4j-spi</artifactId>
+      <version>0.6.0-SNAPSHOT</version>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.plc4x</groupId>
       <artifactId>plc4j-transport-raw-socket</artifactId>
       <version>0.6.0-SNAPSHOT</version>
     </dependency>
+
     <dependency>
       <groupId>com.fasterxml.jackson.core</groupId>
       <artifactId>jackson-annotations</artifactId>
diff --git a/sandbox/test-java-s7-driver/src/main/java/org/apache/plc4x/java/s7/readwrite/utils/StaticHelper.java b/sandbox/test-java-s7-driver-passive/src/main/java/org/apache/plc4x/java/s7/utils/StaticHelper.java
similarity index 98%
copy from sandbox/test-java-s7-driver/src/main/java/org/apache/plc4x/java/s7/readwrite/utils/StaticHelper.java
copy to sandbox/test-java-s7-driver-passive/src/main/java/org/apache/plc4x/java/s7/utils/StaticHelper.java
index 60bf88a..4c29fd8 100644
--- a/sandbox/test-java-s7-driver/src/main/java/org/apache/plc4x/java/s7/readwrite/utils/StaticHelper.java
+++ b/sandbox/test-java-s7-driver-passive/src/main/java/org/apache/plc4x/java/s7/utils/StaticHelper.java
@@ -16,7 +16,7 @@ KIND, either express or implied.  See the License for the
 specific language governing permissions and limitations
 under the License.
 */
-package org.apache.plc4x.java.s7.readwrite.utils;
+package org.apache.plc4x.java.s7.utils;
 
 import org.apache.commons.lang3.NotImplementedException;
 import org.apache.plc4x.java.spi.generation.ParseException;
diff --git a/sandbox/test-java-s7-driver/pom.xml b/sandbox/test-java-s7-driver/pom.xml
index 222cca5..e8e1210 100644
--- a/sandbox/test-java-s7-driver/pom.xml
+++ b/sandbox/test-java-s7-driver/pom.xml
@@ -48,18 +48,6 @@
               <outputFlavor>read-write</outputFlavor>
             </configuration>
           </execution>
-          <execution>
-            <id>generate-data</id>
-            <phase>generate-sources</phase>
-            <goals>
-              <goal>generate-driver</goal>
-            </goals>
-            <configuration>
-              <protocolName>s7-data</protocolName>
-              <languageName>java</languageName>
-              <outputFlavor>read-write</outputFlavor>
-            </configuration>
-          </execution>
         </executions>
       </plugin>
     </plugins>
@@ -71,6 +59,11 @@
       <artifactId>plc4j-api</artifactId>
       <version>0.6.0-SNAPSHOT</version>
     </dependency>
+    <dependency>
+      <groupId>org.apache.plc4x</groupId>
+      <artifactId>plc4j-spi</artifactId>
+      <version>0.6.0-SNAPSHOT</version>
+    </dependency>
 
     <dependency>
       <groupId>org.apache.plc4x</groupId>
@@ -81,7 +74,6 @@
     <dependency>
       <groupId>commons-beanutils</groupId>
       <artifactId>commons-beanutils</artifactId>
-      <version>1.9.3</version>
     </dependency>
     <dependency>
       <groupId>com.fasterxml.jackson.core</groupId>
@@ -116,12 +108,6 @@
       <!-- Scope is 'provided' as this way it's not shipped with the driver -->
       <scope>provided</scope>
     </dependency>
-    <dependency>
-      <groupId>org.apache.plc4x</groupId>
-      <artifactId>plc4j-spi</artifactId>
-      <version>0.6.0-SNAPSHOT</version>
-      <scope>compile</scope>
-    </dependency>
   </dependencies>
 
 </project>
diff --git a/sandbox/test-java-s7-driver/src/main/java/org/apache/plc4x/java/s7/readwrite/protocol/S7ProtocolLogic.java b/sandbox/test-java-s7-driver/src/main/java/org/apache/plc4x/java/s7/readwrite/protocol/S7ProtocolLogic.java
index 7e7cd30..9344c61 100644
--- a/sandbox/test-java-s7-driver/src/main/java/org/apache/plc4x/java/s7/readwrite/protocol/S7ProtocolLogic.java
+++ b/sandbox/test-java-s7-driver/src/main/java/org/apache/plc4x/java/s7/readwrite/protocol/S7ProtocolLogic.java
@@ -20,16 +20,16 @@ package org.apache.plc4x.java.s7.readwrite.protocol;
 
 import io.netty.buffer.ByteBuf;
 import io.netty.buffer.Unpooled;
-import org.apache.commons.lang3.ArrayUtils;
-import org.apache.commons.lang3.NotImplementedException;
 import org.apache.commons.lang3.tuple.ImmutablePair;
 import org.apache.commons.lang3.tuple.Pair;
 import org.apache.plc4x.java.api.exceptions.PlcProtocolException;
 import org.apache.plc4x.java.api.messages.*;
 import org.apache.plc4x.java.api.model.PlcField;
 import org.apache.plc4x.java.api.types.PlcResponseCode;
+import org.apache.plc4x.java.api.value.PlcValue;
 import org.apache.plc4x.java.s7.readwrite.*;
 import org.apache.plc4x.java.s7.readwrite.connection.S7Configuration;
+import org.apache.plc4x.java.s7.readwrite.io.DataItemIO;
 import org.apache.plc4x.java.s7.readwrite.types.COTPProtocolClass;
 import org.apache.plc4x.java.s7.readwrite.types.COTPTpduSize;
 import org.apache.plc4x.java.s7.readwrite.types.DataTransportErrorCode;
@@ -40,13 +40,10 @@ import org.apache.plc4x.java.s7.readwrite.types.SzlModuleTypeClass;
 import org.apache.plc4x.java.s7.readwrite.types.SzlSublist;
 import org.apache.plc4x.java.s7.readwrite.utils.S7Field;
 import org.apache.plc4x.java.s7.readwrite.utils.S7TsapIdEncoder;
-import org.apache.plc4x.java.s7data.readwrite.*;
-import org.apache.plc4x.java.s7data.readwrite.io.*;
 import org.apache.plc4x.java.spi.ConversationContext;
 import org.apache.plc4x.java.spi.HasConfiguration;
 import org.apache.plc4x.java.spi.Plc4xProtocolBase;
 import org.apache.plc4x.java.spi.messages.*;
-import org.apache.plc4x.java.spi.messages.items.*;
 import org.apache.plc4x.java.spi.generation.ParseException;
 import org.apache.plc4x.java.spi.generation.ReadBuffer;
 import org.apache.plc4x.java.spi.generation.WriteBuffer;
@@ -91,7 +88,7 @@ public class S7ProtocolLogic extends Plc4xProtocolBase<TPKTPacket> implements Ha
 
     @Override
     public void onConnect(ConversationContext<TPKTPacket> context) {
-        logger.debug("ISO Transport Protocol Sending Connection Request");
+        logger.debug("Sending COTP Connection Request");
         // Open the session on ISO Transport Protocol first.
         TPKTPacket packet = new TPKTPacket(createCOTPConnectionRequest(calledTsapId, callingTsapId, cotpTpduSize));
 
@@ -100,6 +97,8 @@ public class S7ProtocolLogic extends Plc4xProtocolBase<TPKTPacket> implements Ha
             .check(p -> p.getPayload() instanceof COTPPacketConnectionResponse)
             .unwrap(p -> (COTPPacketConnectionResponse) p.getPayload())
             .handle(cotpPacketConnectionResponse -> {
+                logger.debug("Got COTP Connection Response");
+                logger.debug("Sending S7 Connection Request");
                 context.sendRequest(createS7ConnectionRequest(cotpPacketConnectionResponse))
                     .expectResponse(TPKTPacket.class, REQUEST_TIMEOUT)
                     .unwrap(TPKTPacket::getPayload)
@@ -109,6 +108,7 @@ public class S7ProtocolLogic extends Plc4xProtocolBase<TPKTPacket> implements Ha
                     .unwrap(S7Message::getParameter)
                     .only(S7ParameterSetupCommunication.class)
                     .handle(setupCommunication -> {
+                        logger.debug("Got S7 Connection Response");
                         // Save some data from the response.
                         maxAmqCaller = setupCommunication.getMaxAmqCaller();
                         maxAmqCallee = setupCommunication.getMaxAmqCallee();
@@ -180,9 +180,9 @@ public class S7ProtocolLogic extends Plc4xProtocolBase<TPKTPacket> implements Ha
         List<S7VarPayloadDataItem> payloadItems = new ArrayList<>(request.getNumberOfFields());
         for (String fieldName : request.getFieldNames()) {
             final S7Field field = (S7Field) request.getField(fieldName);
-            final BaseDefaultFieldItem fieldItem = request.getFieldItem(fieldName);
+/*            final BaseDefaultFieldItem fieldItem = request.getFieldItem(fieldName);
             parameterItems.add(new S7VarRequestParameterItemAddress(encodeS7Address(field)));
-            payloadItems.add(serializeFieldItem(field, fieldItem));
+            payloadItems.add(serializeFieldItem(field, fieldItem));*/
         }
         final int tpduId = tpduGenerator.getAndIncrement();
         TPKTPacket tpktPacket = new TPKTPacket(new COTPPacketData(null,
@@ -294,7 +294,7 @@ public class S7ProtocolLogic extends Plc4xProtocolBase<TPKTPacket> implements Ha
                 "The number of requested items doesn't match the number of returned items");
         }
 
-        Map<String, Pair<PlcResponseCode, BaseDefaultFieldItem>> values = new HashMap<>();
+        Map<String, Pair<PlcResponseCode, PlcValue>> values = new HashMap<>();
         S7VarPayloadDataItem[] payloadItems = payload.getItems();
         int index = 0;
         for (String fieldName : plcReadRequest.getFieldNames()) {
@@ -302,12 +302,12 @@ public class S7ProtocolLogic extends Plc4xProtocolBase<TPKTPacket> implements Ha
             S7VarPayloadDataItem payloadItem = payloadItems[index];
 
             PlcResponseCode responseCode = decodeResponseCode(payloadItem.getReturnCode());
-            BaseDefaultFieldItem fieldItem = null;
+            PlcValue fieldItem = null;
             ByteBuf data = Unpooled.wrappedBuffer(payloadItem.getData());
             if (responseCode == PlcResponseCode.OK) {
                 fieldItem = parseFieldItem(field, data);
             }
-            Pair<PlcResponseCode, BaseDefaultFieldItem> result = new ImmutablePair<>(responseCode, fieldItem);
+            Pair<PlcResponseCode, PlcValue> result = new ImmutablePair(responseCode, fieldItem);
             values.put(fieldName, result);
             index++;
         }
@@ -340,134 +340,11 @@ public class S7ProtocolLogic extends Plc4xProtocolBase<TPKTPacket> implements Ha
         return new DefaultPlcWriteResponse(plcWriteRequest, responses);
     }
 
-    private S7VarPayloadDataItem serializeFieldItem(S7Field field, BaseDefaultFieldItem fieldItem) {
-        if(fieldItem.getNumberOfValues() > 0) {
-            throw new NotImplementedException("Writing more than one element currently not supported");
-        }
-
+    private S7VarPayloadDataItem serializeFieldItem(S7Field field, PlcValue plcValue) {
         try {
-            WriteBuffer writeBuffer;
-            DataTransportSize transportSize;
-            switch (field.getDataType().getDataProtocolId()) {
-                case 1: // 1 Bit
-                    writeBuffer = new WriteBuffer(1);
-                    DataItemBOOLIO.serialize(writeBuffer, new DataItemBOOL(fieldItem.getBoolean(0)));
-                    transportSize = DataTransportSize.BIT;
-                    break;
-
-                case 11: // BYTE
-                    writeBuffer = new WriteBuffer(1);
-                    DataItemBYTEIO.serialize(writeBuffer, new DataItemBYTE(ArrayUtils.toPrimitive((Boolean[]) fieldItem.getValues())));
-                    transportSize = DataTransportSize.BYTE_WORD_DWORD;
-                    break;
-                case 12: // WORD
-                    writeBuffer = new WriteBuffer(2);
-                    DataItemWORDIO.serialize(writeBuffer, new DataItemWORD(ArrayUtils.toPrimitive((Boolean[]) fieldItem.getValues())));
-                    transportSize = DataTransportSize.BYTE_WORD_DWORD;
-                    break;
-                case 13: // DWORD
-                    writeBuffer = new WriteBuffer(4);
-                    DataItemDWORDIO.serialize(writeBuffer, new DataItemDWORD(ArrayUtils.toPrimitive((Boolean[]) fieldItem.getValues())));
-                    transportSize = DataTransportSize.BYTE_WORD_DWORD;
-                    break;
-                case 14: // LWORD
-                    writeBuffer = new WriteBuffer(8);
-                    DataItemLWORDIO.serialize(writeBuffer, new DataItemLWORD(ArrayUtils.toPrimitive((Boolean[]) fieldItem.getValues())));
-                    transportSize = DataTransportSize.BYTE_WORD_DWORD;
-                    break;
-
-                case 21: // SINT
-                    writeBuffer = new WriteBuffer(1);
-                    DataItemSINTIO.serialize(writeBuffer, new DataItemSINT(fieldItem.getByte(0)));
-                    transportSize = DataTransportSize.BYTE_WORD_DWORD;
-                    break;
-                case 22: // USINT
-                    writeBuffer = new WriteBuffer(1);
-                    DataItemUSINTIO.serialize(writeBuffer, new DataItemUSINT(fieldItem.getShort(0)));
-                    transportSize = DataTransportSize.BYTE_WORD_DWORD;
-                    break;
-                case 23: // INT
-                    writeBuffer = new WriteBuffer(2);
-                    DataItemINTIO.serialize(writeBuffer, new DataItemINT(fieldItem.getShort(0)));
-                    transportSize = DataTransportSize.BYTE_WORD_DWORD;
-                    break;
-                case 24: // UINT
-                    writeBuffer = new WriteBuffer(2);
-                    DataItemUINTIO.serialize(writeBuffer, new DataItemUINT(fieldItem.getInteger(0)));
-                    transportSize = DataTransportSize.BYTE_WORD_DWORD;
-                    break;
-                case 25: // DINT
-                    writeBuffer = new WriteBuffer(4);
-                    DataItemDINTIO.serialize(writeBuffer, new DataItemDINT(fieldItem.getInteger(0)));
-                    transportSize = DataTransportSize.BYTE_WORD_DWORD;
-                    break;
-                case 26: // UDINT
-                    writeBuffer = new WriteBuffer(4);
-                    DataItemUDINTIO.serialize(writeBuffer, new DataItemUDINT(fieldItem.getLong(0)));
-                    transportSize = DataTransportSize.BYTE_WORD_DWORD;
-                    break;
-                case 27: // LINT
-                    writeBuffer = new WriteBuffer(8);
-                    DataItemLINTIO.serialize(writeBuffer, new DataItemLINT(fieldItem.getLong(0)));
-                    transportSize = DataTransportSize.BYTE_WORD_DWORD;
-                    break;
-                case 28: // ULINT
-                    writeBuffer = new WriteBuffer(8);
-                    DataItemULINTIO.serialize(writeBuffer, new DataItemULINT(fieldItem.getBigInteger(0)));
-                    transportSize = DataTransportSize.BYTE_WORD_DWORD;
-                    break;
-
-                case 31: // REAL
-                    writeBuffer = new WriteBuffer(2);
-                    DataItemREALIO.serialize(writeBuffer, new DataItemREAL(fieldItem.getFloat(0)));
-                    transportSize = DataTransportSize.BYTE_WORD_DWORD;
-                    break;
-                case 32: // LREAL
-                    writeBuffer = new WriteBuffer(4);
-                    DataItemLREALIO.serialize(writeBuffer, new DataItemLREAL(fieldItem.getDouble(0)));
-                    transportSize = DataTransportSize.BYTE_WORD_DWORD;
-                    break;
-
-/*                case 41: // CHAR
-                    return new DefaultStringFieldItem(((DataItemCHAR) item).getValue());
-                case 42: // WCHAR
-                    return new DefaultStringFieldItem(((DataItemCHAR) item).getValue());
-                case 43: // STRING
-                    return new DefaultStringFieldItem(((DataItemCHAR) item).getValue());
-                case 44: // WSTRING
-                    return new DefaultStringFieldItem(((DataItemCHAR) item).getValue());*/
-
-                case 51: // Time
-                    writeBuffer = new WriteBuffer(4);
-                    DataItemTimeIO.serialize(writeBuffer, new DataItemTime(fieldItem.getTime(0)));
-                    transportSize = DataTransportSize.BYTE_WORD_DWORD;
-                    break;
-                case 52: // LTime
-                    writeBuffer = new WriteBuffer(4);
-                    DataItemLTimeIO.serialize(writeBuffer, new DataItemLTime(fieldItem.getTime(0)));
-                    transportSize = DataTransportSize.BYTE_WORD_DWORD;
-                    break;
-                case 53: // Date
-                    writeBuffer = new WriteBuffer(2);
-                    DataItemDateIO.serialize(writeBuffer, new DataItemDate(fieldItem.getDate(0)));
-                    transportSize = DataTransportSize.BYTE_WORD_DWORD;
-                    break;
-                case 54: // TimeOfDay
-                    writeBuffer = new WriteBuffer(4);
-                    DataItemTimeOfDayIO.serialize(writeBuffer, new DataItemTimeOfDay(fieldItem.getTime(0)));
-                    transportSize = DataTransportSize.BYTE_WORD_DWORD;
-                    break;
-                case 55: // DateAndTime
-                    writeBuffer = new WriteBuffer(8);
-                    DataItemDateAndTimeIO.serialize(writeBuffer, new DataItemDateAndTime(fieldItem.getDateTime(0)));
-                    transportSize = DataTransportSize.BYTE_WORD_DWORD;
-                    break;
-
-                default:
-                    throw new NotImplementedException(
-                        "Processing of datatype " + field.getDataType() + " currently not supported");
-            }
-
+            DataTransportSize transportSize = (field.getDataType().getDataProtocolId() == 1) ?
+                DataTransportSize.BIT : DataTransportSize.BYTE_WORD_DWORD;
+            WriteBuffer writeBuffer = DataItemIO.serialize(plcValue, field.getDataType().getDataProtocolId());
             byte[] data = writeBuffer.getData();
             return new S7VarPayloadDataItem(DataTransportErrorCode.OK, transportSize, data.length, data);
         } catch (ParseException e) {
@@ -476,68 +353,10 @@ public class S7ProtocolLogic extends Plc4xProtocolBase<TPKTPacket> implements Ha
         return null;
     }
 
-    private BaseDefaultFieldItem parseFieldItem(S7Field field, ByteBuf data) {
+    private PlcValue parseFieldItem(S7Field field, ByteBuf data) {
         ReadBuffer readBuffer = new ReadBuffer(data.array());
         try {
-            DataItem item = DataItemIO.parse(readBuffer, field.getDataType().getDataProtocolId());
-            switch (field.getDataType().getDataProtocolId()) {
-                case 1: // 1 Bit
-                    return new DefaultBooleanFieldItem(((DataItemBOOL) item).getValue());
-                case 11: // BYTE
-                    return new DefaultBooleanFieldItem(ArrayUtils.toObject(((DataItemBYTE) item).getValue()));
-                case 12: // WORD
-                    return new DefaultBooleanFieldItem(ArrayUtils.toObject(((DataItemWORD) item).getValue()));
-                case 13: // DWORD
-                    return new DefaultBooleanFieldItem(ArrayUtils.toObject(((DataItemDWORD) item).getValue()));
-                case 14: // LWORD
-                    return new DefaultBooleanFieldItem(ArrayUtils.toObject(((DataItemLWORD) item).getValue()));
-
-                case 21: // SINT
-                    return new DefaultByteFieldItem(((DataItemSINT) item).getValue());
-                case 22: // USINT
-                    return new DefaultShortFieldItem(((DataItemUSINT) item).getValue());
-                case 23: // INT
-                    return new DefaultShortFieldItem(((DataItemINT) item).getValue());
-                case 24: // UINT
-                    return new DefaultIntegerFieldItem(((DataItemUINT) item).getValue());
-                case 25: // DINT
-                    return new DefaultIntegerFieldItem(((DataItemDINT) item).getValue());
-                case 26: // UDINT
-                    return new DefaultLongFieldItem(((DataItemUDINT) item).getValue());
-                case 27: // LINT
-                    return new DefaultLongFieldItem(((DataItemLINT) item).getValue());
-                case 28: // ULINT
-                    return new DefaultBigIntegerFieldItem(((DataItemULINT) item).getValue());
-
-                case 31: // REAL
-                    return new DefaultFloatFieldItem(((DataItemREAL) item).getValue());
-                case 32: // LREAL
-                    return new DefaultDoubleFieldItem(((DataItemLREAL) item).getValue());
-
-/*                case 41: // CHAR
-                    return new DefaultStringFieldItem(((DataItemCHAR) item).getValue());
-                case 42: // WCHAR
-                    return new DefaultStringFieldItem(((DataItemCHAR) item).getValue());
-                case 43: // STRING
-                    return new DefaultStringFieldItem(((DataItemCHAR) item).getValue());
-                case 44: // WSTRING
-                    return new DefaultStringFieldItem(((DataItemCHAR) item).getValue());*/
-
-                case 51: // Time
-                    return new DefaultLocalTimeFieldItem(((DataItemTime) item).getValue());
-                case 52: // LTime
-                    return new DefaultLocalTimeFieldItem(((DataItemLTime) item).getValue());
-                case 53: // Date
-                    return new DefaultLocalDateFieldItem(((DataItemDate) item).getValue());
-                case 54: // TimeOfDay
-                    return new DefaultLocalTimeFieldItem(((DataItemTimeOfDay) item).getValue());
-                case 55: // DateAndTime
-                    return new DefaultLocalDateTimeFieldItem(((DataItemDateAndTime) item).getValue());
-
-                default:
-                    throw new NotImplementedException(
-                        "Processing of datatype " + field.getDataType() + " currently not supported");
-            }
+            return DataItemIO.parse(readBuffer, field.getDataType().getDataProtocolId());
         } catch (ParseException e) {
             logger.warn(String.format("Error parsing field item of type: '%s'", field.getDataType().name()), e);
         }
diff --git a/sandbox/test-java-s7-driver/src/main/java/org/apache/plc4x/java/s7/readwrite/utils/S7PlcFieldHandler.java b/sandbox/test-java-s7-driver/src/main/java/org/apache/plc4x/java/s7/readwrite/utils/S7PlcFieldHandler.java
index a2cfd80..d781a10 100644
--- a/sandbox/test-java-s7-driver/src/main/java/org/apache/plc4x/java/s7/readwrite/utils/S7PlcFieldHandler.java
+++ b/sandbox/test-java-s7-driver/src/main/java/org/apache/plc4x/java/s7/readwrite/utils/S7PlcFieldHandler.java
@@ -21,22 +21,16 @@ package org.apache.plc4x.java.s7.readwrite.utils;
 import org.apache.plc4x.java.api.exceptions.PlcInvalidFieldException;
 import org.apache.plc4x.java.api.exceptions.PlcRuntimeException;
 import org.apache.plc4x.java.api.model.PlcField;
+import org.apache.plc4x.java.api.value.*;
 import org.apache.plc4x.java.spi.connection.DefaultPlcFieldHandler;
-import org.apache.plc4x.java.spi.messages.items.BaseDefaultFieldItem;
-import org.apache.plc4x.java.spi.messages.items.DefaultBigIntegerFieldItem;
-import org.apache.plc4x.java.spi.messages.items.DefaultBooleanFieldItem;
-import org.apache.plc4x.java.spi.messages.items.DefaultByteFieldItem;
-import org.apache.plc4x.java.spi.messages.items.DefaultDoubleFieldItem;
-import org.apache.plc4x.java.spi.messages.items.DefaultFloatFieldItem;
-import org.apache.plc4x.java.spi.messages.items.DefaultIntegerFieldItem;
-import org.apache.plc4x.java.spi.messages.items.DefaultLocalDateTimeFieldItem;
-import org.apache.plc4x.java.spi.messages.items.DefaultLongFieldItem;
-import org.apache.plc4x.java.spi.messages.items.DefaultShortFieldItem;
-import org.apache.plc4x.java.spi.messages.items.DefaultStringFieldItem;
 
 import java.lang.reflect.InvocationTargetException;
 import java.math.BigInteger;
 import java.nio.charset.StandardCharsets;
+import java.time.LocalDate;
+import java.time.LocalDateTime;
+import java.time.LocalTime;
+import java.util.Arrays;
 import java.util.BitSet;
 import java.util.LinkedList;
 import java.util.List;
@@ -52,7 +46,7 @@ public class S7PlcFieldHandler extends DefaultPlcFieldHandler {
     }
 
     @Override
-    public BaseDefaultFieldItem encodeBoolean(PlcField field, Object[] values) {
+    public PlcValue encodeBoolean(PlcField field, Object[] values) {
         S7Field s7Field = (S7Field) field;
         // All of these types are declared as Bit or Bit-String types.
         switch (s7Field.getDataType()) {
@@ -68,7 +62,7 @@ public class S7PlcFieldHandler extends DefaultPlcFieldHandler {
     }
 
     @Override
-    public BaseDefaultFieldItem encodeByte(PlcField field, Object[] values) {
+    public PlcValue encodeByte(PlcField field, Object[] values) {
         S7Field s7Field = (S7Field) field;
         // All of these types are declared as Bit or Bit-String types.
         switch (s7Field.getDataType()) {
@@ -83,7 +77,7 @@ public class S7PlcFieldHandler extends DefaultPlcFieldHandler {
     }
 
     @Override
-    public BaseDefaultFieldItem encodeShort(PlcField field, Object[] values) {
+    public PlcValue encodeShort(PlcField field, Object[] values) {
         S7Field s7Field = (S7Field) field;
         switch (s7Field.getDataType()) {
             case WORD:
@@ -96,7 +90,7 @@ public class S7PlcFieldHandler extends DefaultPlcFieldHandler {
     }
 
     @Override
-    public BaseDefaultFieldItem encodeInteger(PlcField field, Object[] values) {
+    public PlcValue encodeInteger(PlcField field, Object[] values) {
         S7Field s7Field = (S7Field) field;
         switch (s7Field.getDataType()) {
             case DWORD:
@@ -109,7 +103,7 @@ public class S7PlcFieldHandler extends DefaultPlcFieldHandler {
     }
 
     @Override
-    public BaseDefaultFieldItem encodeBigInteger(PlcField field, Object[] values) {
+    public PlcValue encodeBigInteger(PlcField field, Object[] values) {
         S7Field s7Field = (S7Field) field;
         switch (s7Field.getDataType()) {
             case DWORD:
@@ -122,7 +116,7 @@ public class S7PlcFieldHandler extends DefaultPlcFieldHandler {
     }
 
     @Override
-    public BaseDefaultFieldItem encodeLong(PlcField field, Object[] values) {
+    public PlcValue encodeLong(PlcField field, Object[] values) {
         S7Field s7Field = (S7Field) field;
         switch (s7Field.getDataType()) {
             case LWORD:
@@ -135,7 +129,7 @@ public class S7PlcFieldHandler extends DefaultPlcFieldHandler {
     }
 
     @Override
-    public BaseDefaultFieldItem encodeFloat(PlcField field, Object[] values) {
+    public PlcValue encodeFloat(PlcField field, Object[] values) {
         S7Field s7Field = (S7Field) field;
         switch (s7Field.getDataType()) {
             case REAL:
@@ -146,7 +140,7 @@ public class S7PlcFieldHandler extends DefaultPlcFieldHandler {
     }
 
     @Override
-    public BaseDefaultFieldItem encodeDouble(PlcField field, Object[] values) {
+    public PlcValue encodeDouble(PlcField field, Object[] values) {
         S7Field s7Field = (S7Field) field;
         switch (s7Field.getDataType()) {
             case LREAL:
@@ -157,7 +151,7 @@ public class S7PlcFieldHandler extends DefaultPlcFieldHandler {
     }
 
     @Override
-    public BaseDefaultFieldItem encodeString(PlcField field, Object[] values) {
+    public PlcValue encodeString(PlcField field, Object[] values) {
         S7Field s7Field = (S7Field) field;
         switch (s7Field.getDataType()) {
             case CHAR:
@@ -171,7 +165,7 @@ public class S7PlcFieldHandler extends DefaultPlcFieldHandler {
     }
 
     @Override
-    public BaseDefaultFieldItem encodeTime(PlcField field, Object[] values) {
+    public PlcValue encodeTime(PlcField field, Object[] values) {
         S7Field s7Field = (S7Field) field;
         switch (s7Field.getDataType()) {
             case TIME:
@@ -182,7 +176,7 @@ public class S7PlcFieldHandler extends DefaultPlcFieldHandler {
     }
 
     @Override
-    public BaseDefaultFieldItem encodeDate(PlcField field, Object[] values) {
+    public PlcValue encodeDate(PlcField field, Object[] values) {
         S7Field s7Field = (S7Field) field;
         switch (s7Field.getDataType()) {
             case DATE:
@@ -193,7 +187,7 @@ public class S7PlcFieldHandler extends DefaultPlcFieldHandler {
     }
 
     @Override
-    public BaseDefaultFieldItem encodeDateTime(PlcField field, Object[] values) {
+    public PlcValue encodeDateTime(PlcField field, Object[] values) {
         S7Field s7Field = (S7Field) field;
         switch (s7Field.getDataType()) {
             case DATE_AND_TIME:
@@ -203,7 +197,7 @@ public class S7PlcFieldHandler extends DefaultPlcFieldHandler {
         }
     }
 
-    private BaseDefaultFieldItem internalEncodeBoolean(PlcField field, Object[] values) {
+    private PlcValue internalEncodeBoolean(PlcField field, Object[] values) {
         S7Field s7Field = (S7Field) field;
         switch (s7Field.getDataType()) {
             case BOOL:
@@ -251,100 +245,104 @@ public class S7PlcFieldHandler extends DefaultPlcFieldHandler {
                         " is not assignable to " + s7Field.getDataType().name() + " fields.");
             }
         }
-        return new DefaultBooleanFieldItem(booleanValues.toArray(new Boolean[0]));
+        if(booleanValues.size() == 1) {
+            return new PlcBoolean(booleanValues.get(0));
+        } else {
+            return new PlcList(booleanValues);
+        }
     }
 
-    private BaseDefaultFieldItem internalEncodeInteger(PlcField field, Object[] values) {
+    private PlcValue internalEncodeInteger(PlcField field, Object[] values) {
         S7Field s7Field = (S7Field) field;
 
         // Initialize the constraints.
         BigInteger minValue;
         BigInteger maxValue;
-        Class<? extends BaseDefaultFieldItem> fieldType;
+        Class<? extends PlcValue> fieldType;
         Class<?> valueType;
         Object[] castedValues;
         switch (s7Field.getDataType()) {
             case BYTE:
-                minValue = BigInteger.valueOf((long) Byte.MIN_VALUE);
-                maxValue = BigInteger.valueOf((long) Byte.MAX_VALUE);
-                fieldType = DefaultByteFieldItem.class;
+                minValue = BigInteger.valueOf(Byte.MIN_VALUE);
+                maxValue = BigInteger.valueOf(Byte.MAX_VALUE);
+                fieldType = PlcInteger.class;
                 valueType = Byte[].class;
                 castedValues = new Byte[values.length];
                 break;
             case WORD:
-                minValue = BigInteger.valueOf((long) Short.MIN_VALUE);
-                maxValue = BigInteger.valueOf((long) Short.MAX_VALUE);
-                fieldType = DefaultShortFieldItem.class;
+                minValue = BigInteger.valueOf(Short.MIN_VALUE);
+                maxValue = BigInteger.valueOf(Short.MAX_VALUE);
+                fieldType = PlcInteger.class;
                 valueType = Short[].class;
                 castedValues = new Short[values.length];
                 break;
             case DWORD:
-                minValue = BigInteger.valueOf((long) Integer.MIN_VALUE);
-                maxValue = BigInteger.valueOf((long) Integer.MAX_VALUE);
-                fieldType = DefaultIntegerFieldItem.class;
+                minValue = BigInteger.valueOf(Integer.MIN_VALUE);
+                maxValue = BigInteger.valueOf(Integer.MAX_VALUE);
+                fieldType = PlcInteger.class;
                 valueType = Integer[].class;
                 castedValues = new Integer[values.length];
                 break;
             case LWORD:
                 minValue = BigInteger.valueOf(Long.MIN_VALUE);
                 maxValue = BigInteger.valueOf(Long.MAX_VALUE);
-                fieldType = DefaultLongFieldItem.class;
+                fieldType = PlcLong.class;
                 valueType = Long[].class;
                 castedValues = new Long[values.length];
                 break;
             case SINT:
-                minValue = BigInteger.valueOf((long) Byte.MIN_VALUE);
-                maxValue = BigInteger.valueOf((long) Byte.MAX_VALUE);
-                fieldType = DefaultByteFieldItem.class;
+                minValue = BigInteger.valueOf(Byte.MIN_VALUE);
+                maxValue = BigInteger.valueOf(Byte.MAX_VALUE);
+                fieldType = PlcInteger.class;
                 valueType = Byte[].class;
                 castedValues = new Byte[values.length];
                 break;
             case USINT:
-                minValue = BigInteger.valueOf((long) 0);
+                minValue = BigInteger.valueOf(0);
                 maxValue = BigInteger.valueOf((long) Byte.MAX_VALUE * 2);
-                fieldType = DefaultShortFieldItem.class;
+                fieldType = PlcInteger.class;
                 valueType = Short[].class;
                 castedValues = new Short[values.length];
                 break;
             case INT:
-                minValue = BigInteger.valueOf((long) Short.MIN_VALUE);
-                maxValue = BigInteger.valueOf((long) Short.MAX_VALUE);
-                fieldType = DefaultShortFieldItem.class;
+                minValue = BigInteger.valueOf(Short.MIN_VALUE);
+                maxValue = BigInteger.valueOf(Short.MAX_VALUE);
+                fieldType = PlcInteger.class;
                 valueType = Short[].class;
                 castedValues = new Short[values.length];
                 break;
             case UINT:
-                minValue = BigInteger.valueOf((long) 0);
+                minValue = BigInteger.valueOf(0);
                 maxValue = BigInteger.valueOf(((long) Short.MAX_VALUE) * 2);
-                fieldType = DefaultIntegerFieldItem.class;
+                fieldType = PlcInteger.class;
                 valueType = Integer[].class;
                 castedValues = new Integer[values.length];
                 break;
             case DINT:
-                minValue = BigInteger.valueOf((long) Integer.MIN_VALUE);
-                maxValue = BigInteger.valueOf((long) Integer.MAX_VALUE);
-                fieldType = DefaultIntegerFieldItem.class;
+                minValue = BigInteger.valueOf(Integer.MIN_VALUE);
+                maxValue = BigInteger.valueOf(Integer.MAX_VALUE);
+                fieldType = PlcInteger.class;
                 valueType = Integer[].class;
                 castedValues = new Integer[values.length];
                 break;
             case UDINT:
-                minValue = BigInteger.valueOf((long) 0);
+                minValue = BigInteger.valueOf(0);
                 maxValue = BigInteger.valueOf(((long) Integer.MAX_VALUE) * 2);
-                fieldType = DefaultLongFieldItem.class;
+                fieldType = PlcLong.class;
                 valueType = Long[].class;
                 castedValues = new Long[values.length];
                 break;
             case LINT:
                 minValue = BigInteger.valueOf(Long.MIN_VALUE);
                 maxValue = BigInteger.valueOf(Long.MAX_VALUE);
-                fieldType = DefaultLongFieldItem.class;
+                fieldType = PlcLong.class;
                 valueType = Long[].class;
                 castedValues = new Long[values.length];
                 break;
             case ULINT:
-                minValue = BigInteger.valueOf((long) 0);
-                maxValue = BigInteger.valueOf(Long.MAX_VALUE).multiply(BigInteger.valueOf((long) 2));
-                fieldType = DefaultBigIntegerFieldItem.class;
+                minValue = BigInteger.valueOf(0);
+                maxValue = BigInteger.valueOf(Long.MAX_VALUE).multiply(BigInteger.valueOf(2));
+                fieldType = PlcBigInteger.class;
                 valueType = BigInteger[].class;
                 castedValues = new BigInteger[values.length];
                 break;
@@ -391,33 +389,33 @@ public class S7PlcFieldHandler extends DefaultPlcFieldHandler {
 
         // Create the field item.
         try {
-            return fieldType.getDeclaredConstructor(valueType).newInstance(new Object[]{castedValues});
+            return fieldType.getDeclaredConstructor(valueType).newInstance(castedValues);
         } catch (InstantiationException | IllegalAccessException | InvocationTargetException | NoSuchMethodException e) {
             throw new PlcRuntimeException("Error initializing field class " + fieldType.getSimpleName(), e);
         }
     }
 
-    private BaseDefaultFieldItem internalEncodeFloatingPoint(PlcField field, Object[] values) {
+    private PlcValue internalEncodeFloatingPoint(PlcField field, Object[] values) {
         S7Field s7Field = (S7Field) field;
 
         // Initialize the constraints.
         Double minValue;
         Double maxValue;
-        Class<? extends BaseDefaultFieldItem> fieldType;
+        Class<? extends PlcValue> fieldType;
         Class<?> valueType;
         Object[] castedValues;
         switch (s7Field.getDataType()) {
             case REAL:
                 minValue = (double) -Float.MAX_VALUE;
                 maxValue = (double) Float.MAX_VALUE;
-                fieldType = DefaultFloatFieldItem.class;
+                fieldType = PlcFloat.class;
                 valueType = Float[].class;
                 castedValues = new Float[values.length];
                 break;
             case LREAL:
                 minValue = -Double.MAX_VALUE;
                 maxValue = Double.MAX_VALUE;
-                fieldType = DefaultDoubleFieldItem.class;
+                fieldType = PlcDouble.class;
                 valueType = Double[].class;
                 castedValues = new Double[values.length];
                 break;
@@ -457,13 +455,13 @@ public class S7PlcFieldHandler extends DefaultPlcFieldHandler {
 
         // Create the field item.
         try {
-            return fieldType.getDeclaredConstructor(valueType).newInstance(new Object[]{castedValues});
+            return fieldType.getDeclaredConstructor(valueType).newInstance(castedValues);
         } catch (InstantiationException | IllegalAccessException | InvocationTargetException | NoSuchMethodException e) {
             throw new PlcRuntimeException("Error initializing field class " + fieldType.getSimpleName(), e);
         }
     }
 
-    private BaseDefaultFieldItem internalEncodeString(PlcField field, Object[] values) {
+    private PlcValue internalEncodeString(PlcField field, Object[] values) {
         S7Field s7Field = (S7Field) field;
 
         // Initialize the constraints.
@@ -558,18 +556,25 @@ public class S7PlcFieldHandler extends DefaultPlcFieldHandler {
         }
 
         // Create the field item.
-        return new DefaultStringFieldItem(stringValues.toArray(new String[0]));
+        if(stringValues.size() == 1) {
+            return new PlcString(stringValues.get(0));
+        } else {
+            return new PlcList(stringValues);
+        }
     }
 
-    private BaseDefaultFieldItem internalEncodeTemporal(PlcField field, Object[] values) {
+    private PlcValue internalEncodeTemporal(PlcField field, Object[] values) {
+        if(values.length > 1) {
+            return new PlcList(Arrays.asList(values));
+        }
         S7Field s7Field = (S7Field) field;
         switch (s7Field.getDataType()) {
             case TIME:
-                // TODO: I think I should implement this some time ...
+                return new PlcTime((LocalTime) values[0]);
             case DATE:
-                // TODO: I think I should implement this some time ...
+                return new PlcDate((LocalDate) values[0]);
             case DATE_AND_TIME:
-                return new DefaultLocalDateTimeFieldItem();
+                return new PlcDateTime((LocalDateTime) values[0]);
             default:
                 throw new IllegalArgumentException(
                     "Cannot assign temporal values to " + s7Field.getDataType().name() + " fields.");
diff --git a/sandbox/test-java-s7-driver/src/main/java/org/apache/plc4x/java/s7/readwrite/utils/StaticHelper.java b/sandbox/test-java-s7-driver/src/main/java/org/apache/plc4x/java/s7/utils/StaticHelper.java
similarity index 87%
rename from sandbox/test-java-s7-driver/src/main/java/org/apache/plc4x/java/s7/readwrite/utils/StaticHelper.java
rename to sandbox/test-java-s7-driver/src/main/java/org/apache/plc4x/java/s7/utils/StaticHelper.java
index 60bf88a..8c38d0e 100644
--- a/sandbox/test-java-s7-driver/src/main/java/org/apache/plc4x/java/s7/readwrite/utils/StaticHelper.java
+++ b/sandbox/test-java-s7-driver/src/main/java/org/apache/plc4x/java/s7/utils/StaticHelper.java
@@ -16,9 +16,11 @@ KIND, either express or implied.  See the License for the
 specific language governing permissions and limitations
 under the License.
 */
-package org.apache.plc4x.java.s7.readwrite.utils;
+package org.apache.plc4x.java.s7.utils;
 
 import org.apache.commons.lang3.NotImplementedException;
+import org.apache.plc4x.java.api.value.PlcTime;
+import org.apache.plc4x.java.api.value.PlcValue;
 import org.apache.plc4x.java.spi.generation.ParseException;
 import org.apache.plc4x.java.spi.generation.ReadBuffer;
 import org.apache.plc4x.java.spi.generation.WriteBuffer;
@@ -40,7 +42,7 @@ public class StaticHelper {
         }
     }
 
-    public static void serializeTiaTime(WriteBuffer io, LocalTime value) {
+    public static void serializeTiaTime(WriteBuffer io, PlcValue value) {
 
     }
 
@@ -54,7 +56,7 @@ public class StaticHelper {
         }
     }
 
-    public static void serializeS5Time(WriteBuffer io, LocalTime value) {
+    public static void serializeS5Time(WriteBuffer io, PlcValue value) {
 
     }
 
@@ -62,7 +64,7 @@ public class StaticHelper {
         throw new NotImplementedException("LTime not implemented");
     }
 
-    public static void serializeTiaLTime(WriteBuffer io, LocalTime value) {
+    public static void serializeTiaLTime(WriteBuffer io, PlcValue value) {
 
     }
 
@@ -76,7 +78,7 @@ public class StaticHelper {
         }
     }
 
-    public static void serializeTiaTimeOfDay(WriteBuffer io, LocalTime value) {
+    public static void serializeTiaTimeOfDay(WriteBuffer io, PlcValue value) {
 
     }
 
@@ -89,7 +91,7 @@ public class StaticHelper {
         }
     }
 
-    public static void serializeTiaDate(WriteBuffer io, LocalDate value) {
+    public static void serializeTiaDate(WriteBuffer io, PlcValue value) {
 
     }
 
@@ -118,7 +120,7 @@ public class StaticHelper {
         }
     }
 
-    public static void serializeTiaDateTime(WriteBuffer io, LocalDateTime value) {
+    public static void serializeTiaDateTime(WriteBuffer io, PlcValue value) {
 
     }
 
diff --git a/sandbox/test-streampipes-plc4x-processors/src/main/java/org/apache/plc4x/java/streampipes/processors/enrich/knxnetip/ets5/Ets5DataEnrichment.java b/sandbox/test-streampipes-plc4x-processors/src/main/java/org/apache/plc4x/java/streampipes/processors/enrich/knxnetip/ets5/Ets5DataEnrichment.java
index cfdc0ae..bf7714b 100644
--- a/sandbox/test-streampipes-plc4x-processors/src/main/java/org/apache/plc4x/java/streampipes/processors/enrich/knxnetip/ets5/Ets5DataEnrichment.java
+++ b/sandbox/test-streampipes-plc4x-processors/src/main/java/org/apache/plc4x/java/streampipes/processors/enrich/knxnetip/ets5/Ets5DataEnrichment.java
@@ -17,13 +17,11 @@ package org.apache.plc4x.java.streampipes.processors.enrich.knxnetip.ets5;
 
 import org.apache.commons.codec.DecoderException;
 import org.apache.commons.codec.binary.Hex;
-import org.apache.commons.lang3.builder.ToStringStyle;
-import org.apache.plc4x.java.ets5.passive.*;
-import org.apache.plc4x.java.ets5.passive.io.KNXGroupAddressIO;
-import org.apache.plc4x.java.ets5.passive.io.KnxDatapointIO;
+import org.apache.plc4x.java.api.value.PlcValue;
 import org.apache.plc4x.java.knxnetip.ets5.Ets5Parser;
 import org.apache.plc4x.java.knxnetip.ets5.model.Ets5Model;
 import org.apache.plc4x.java.knxnetip.ets5.model.GroupAddress;
+import org.apache.plc4x.java.knxnetip.readwrite.io.KnxDatapointIO;
 import org.apache.plc4x.java.spi.generation.ParseException;
 import org.apache.plc4x.java.spi.generation.ReadBuffer;
 import org.streampipes.model.runtime.Event;
@@ -53,10 +51,8 @@ public class Ets5DataEnrichment implements EventProcessor<Ets5DataEnrichmentPara
             // Get the raw group address data.
             String destinationFieldValue = event.getFieldBySelector(this.destinationIdFieldName).getAsPrimitive().getAsString();
             byte[] destinationGroupAddress = Hex.decodeHex(destinationFieldValue);
-            ReadBuffer addressReadBuffer = new ReadBuffer(destinationGroupAddress);
             // Decode the group address depending on the project settings.
-            KNXGroupAddress destinationAddress =
-                KNXGroupAddressIO.parse(addressReadBuffer, ets5Model.getGroupAddressType());
+            String destinationAddress = Ets5Model.parseGroupAddress(ets5Model.getGroupAddressType(), destinationGroupAddress);
             final GroupAddress groupAddress = ets5Model.getGroupAddresses().get(destinationAddress);
 
             // Get the raw HEX-encoded data
@@ -67,10 +63,10 @@ public class Ets5DataEnrichment implements EventProcessor<Ets5DataEnrichmentPara
 
             if (groupAddress != null) {
                 // Decode the raw data.
-                final KnxDatapoint datapoint = KnxDatapointIO.parse(rawDataReader, groupAddress.getType().getMainType(), groupAddress.getType().getSubType());
+                final PlcValue plcValue = KnxDatapointIO.parse(rawDataReader, groupAddress.getType().getMainType(), groupAddress.getType().getSubType());
 
                 // Serialize the decoded object to json
-                final String jsonDatapoint = datapoint.toString(ToStringStyle.JSON_STYLE);
+                /*final String jsonDatapoint = datapoint.toString(ToStringStyle.JSON_STYLE);
 
                 // Add the additional properties.
                 event.addField(Ets5DataEnrichmentController.MAPPING_FIELD_DECODED_GROUP_ADDRESS,
@@ -89,9 +85,9 @@ public class Ets5DataEnrichment implements EventProcessor<Ets5DataEnrichmentPara
                 System.out.println(hexEncodedRawData + " decoded to: " + jsonDatapoint + " " + groupAddress.getType().getMainType() + " " + groupAddress.getType().getSubType());
 
                 //Event enrichedEvent = new Event()
-                spOutputCollector.collect(event);
+                spOutputCollector.collect(event);*/
             } else {
-                System.out.println("Couldn't decode group address " + toGroupAddressString(destinationAddress));
+                System.out.println("Couldn't decode group address " + destinationAddress);
             }
         } catch (ParseException e) {
             // Driver Decoding
@@ -107,18 +103,4 @@ public class Ets5DataEnrichment implements EventProcessor<Ets5DataEnrichmentPara
 
     }
 
-    private String toGroupAddressString(KNXGroupAddress groupAddress) {
-        if(groupAddress instanceof KNXGroupAddress3Level) {
-            KNXGroupAddress3Level castedAddress = (KNXGroupAddress3Level) groupAddress;
-            return castedAddress.getMainGroup() + "/" + castedAddress.getMiddleGroup() + "/" + castedAddress.getSubGroup();
-        } else if(groupAddress instanceof KNXGroupAddress2Level) {
-            KNXGroupAddress2Level castedAddress = (KNXGroupAddress2Level) groupAddress;
-            return castedAddress.getMainGroup() + "/" + castedAddress.getSubGroup();
-        } else if(groupAddress instanceof KNXGroupAddressFreeLevel) {
-            KNXGroupAddressFreeLevel castedAddress = (KNXGroupAddressFreeLevel) groupAddress;
-            return castedAddress.getSubGroup() + "";
-        }
-        throw new RuntimeException("Unknown group address type");
-    }
-
 }