You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@plc4x.apache.org by sr...@apache.org on 2021/05/07 09:05:53 UTC

[plc4x] branch develop updated: plc4go: fixed bug where parsing was using the wrong types on content enums

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

sruehl pushed a commit to branch develop
in repository https://gitbox.apache.org/repos/asf/plc4x.git


The following commit(s) were added to refs/heads/develop by this push:
     new 9425728  plc4go: fixed bug where parsing was using the wrong types on content enums
9425728 is described below

commit 942572885c1fdd18459bfded1b4b3ff9c04d4973
Author: Sebastian Rühl <sr...@apache.org>
AuthorDate: Fri May 7 11:05:37 2021 +0200

    plc4go: fixed bug where parsing was using the wrong types on content enums
    
    + Added a packet write test to s7Io_test.go (which discovered this bug)
---
 .../resources/templates/go/enum-template.go.ftlh   |  11 +
 .../resources/templates/go/model-template.go.ftlh  |  14 +-
 .../plc4go/ads/readwrite/model/AdsDataType.go      |  20 +
 .../plc4go/ads/readwrite/model/CommandId.go        |   2 +
 .../ads/readwrite/model/ReservedIndexGroups.go     |   2 +
 .../plc4go/ads/readwrite/model/ReturnCode.go       |   2 +
 .../bacnetip/readwrite/model/ApplicationTag.go     |   2 +
 .../bacnetip/readwrite/model/BACnetNetworkType.go  |   2 +
 .../bacnetip/readwrite/model/BACnetNodeType.go     |   2 +
 .../bacnetip/readwrite/model/BACnetNotifyType.go   |   2 +
 .../bacnetip/readwrite/model/BACnetObjectType.go   |   2 +
 .../plc4go/eip/readwrite/model/CIPDataTypeCode.go  |  11 +
 .../plc4go/eip/readwrite/model/EiPCommand.go       |   2 +
 .../plc4go/firmata/readwrite/model/PinMode.go      |   2 +
 .../plc4go/knxnetip/readwrite/model/AccessLevel.go |  20 +
 .../knxnetip/readwrite/model/CEMIPriority.go       |   2 +
 .../readwrite/model/ComObjectTableAddresses.go     |  11 +
 .../knxnetip/readwrite/model/ComObjectValueType.go |  11 +
 .../knxnetip/readwrite/model/DeviceDescriptor.go   |  20 +
 .../readwrite/model/DeviceDescriptorMediumType.go  |   2 +
 .../knxnetip/readwrite/model/FirmwareType.go       |   2 +
 .../knxnetip/readwrite/model/HostProtocolCode.go   |   2 +
 .../readwrite/model/KnxDatapointMainType.go        |  29 ++
 .../knxnetip/readwrite/model/KnxDatapointType.go   |  29 ++
 .../readwrite/model/KnxInterfaceObjectProperty.go  |  38 ++
 .../readwrite/model/KnxInterfaceObjectType.go      |  20 +
 .../plc4go/knxnetip/readwrite/model/KnxLayer.go    |   2 +
 .../knxnetip/readwrite/model/KnxManufacturer.go    |  20 +
 .../plc4go/knxnetip/readwrite/model/KnxMedium.go   |   2 +
 .../readwrite/model/KnxPropertyDataType.go         |  29 ++
 .../plc4go/knxnetip/readwrite/model/Status.go      |   2 +
 .../readwrite/model/SupportedPhysicalMedia.go      |  20 +
 .../modbus/readwrite/model/ModbusDataType.go       |  11 +
 .../modbus/readwrite/model/ModbusErrorCode.go      |   2 +
 .../plc4go/s7/readwrite/model/COTPProtocolClass.go |   2 +
 .../plc4go/s7/readwrite/model/COTPTpduSize.go      |  11 +
 .../s7/readwrite/model/DataTransportErrorCode.go   |   2 +
 .../plc4go/s7/readwrite/model/DataTransportSize.go |  11 +
 .../plc4go/s7/readwrite/model/DeviceGroup.go       |   2 +
 .../plc4go/s7/readwrite/model/MemoryArea.go        |  11 +
 .../plc4go/s7/readwrite/model/S7AddressAny.go      |   8 +-
 .../s7/readwrite/model/SzlModuleTypeClass.go       |   2 +
 .../plc4go/s7/readwrite/model/SzlSublist.go        |   2 +
 .../plc4go/s7/readwrite/model/TransportSize.go     | 101 +++++
 plc4go/internal/plc4go/s7/s7Io_test.go             | 467 ++++++++++++++++++++-
 .../readwrite/model/SimulatedDataTypeSizes.go      |  11 +
 46 files changed, 976 insertions(+), 4 deletions(-)

diff --git a/build-utils/language-go/src/main/resources/templates/go/enum-template.go.ftlh b/build-utils/language-go/src/main/resources/templates/go/enum-template.go.ftlh
index 11a885a..d8d3907 100644
--- a/build-utils/language-go/src/main/resources/templates/go/enum-template.go.ftlh
+++ b/build-utils/language-go/src/main/resources/templates/go/enum-template.go.ftlh
@@ -50,6 +50,7 @@ package model
 
 import (
 	"github.com/apache/plc4x/plc4go/internal/plc4go/spi/utils"
+	"github.com/pkg/errors"
 )
 
 // Code generated by build-utils. DO NOT EDIT.
@@ -75,6 +76,7 @@ const(
 var ${type.name}Values []${type.name}
 
 func init() {
+	_ = errors.New
 	${type.name}Values = []${type.name} {
 <#list type.enumValues as enumValue>
 		${type.name}_${enumValue.name},
@@ -110,6 +112,15 @@ func (e ${type.name}) ${constantName?cap_first}() ${helper.getLanguageTypeNameFo
 		}
 	}
 }
+
+func ${type.name}FirstEnumForField${constantName?cap_first}(value ${helper.getLanguageTypeNameForTypeReference(type.getConstantType(constantName))}) (${type.name}, error) {
+	for _, sizeValue := range ${type.name}Values {
+		if sizeValue.${constantName?cap_first}() == value {
+			return sizeValue, nil
+		}
+	}
+	return 0, errors.Errorf("enum for %v describing ${constantName?cap_first} not found", value)
+}
 	</#list>
 </#if>
 func ${type.name}ByValue(value <#if type.type?has_content>${helper.getLanguageTypeNameForTypeReference(type.type)}<#else>string</#if>) ${type.name} {
diff --git a/build-utils/language-go/src/main/resources/templates/go/model-template.go.ftlh b/build-utils/language-go/src/main/resources/templates/go/model-template.go.ftlh
index 1f29983..28a1edb 100644
--- a/build-utils/language-go/src/main/resources/templates/go/model-template.go.ftlh
+++ b/build-utils/language-go/src/main/resources/templates/go/model-template.go.ftlh
@@ -633,7 +633,7 @@ func ${type.name}Parse(readBuffer utils.ReadBuffer<#if type.parserArguments?has_
 				<#assign checksumField = field>
 				<#assign simpleTypeReference = checksumField.type>
 
-			// Checksum Field (checksum)
+	// Checksum Field (checksum)
 	{
 		checksumRef, _checksumRefErr := ${helper.getReadBufferReadMethodCall("checksum", simpleTypeReference)}
 		if _checksumRefErr != nil {
@@ -682,11 +682,23 @@ func ${type.name}Parse(readBuffer utils.ReadBuffer<#if type.parserArguments?has_
 	if pullErr := readBuffer.PullContext("${enumField.name}"); pullErr != nil {
 		return nil, pullErr
 	}
+				<#if enumField.fieldName?has_content>
+	// Enum field (${enumField.name})
+	${enumField.name}${enumField.fieldName?cap_first}, _${enumField.name}${enumField.fieldName?cap_first}Err := ${helper.getReadBufferReadMethodCall(enumField.type.name, helper.getEnumFieldSimpleTypeReference(enumField.type, enumField.fieldName))}
+	if _${enumField.name}${enumField.fieldName?cap_first}Err != nil {
+		return nil, errors.Wrap(_${enumField.name}${enumField.fieldName?cap_first}Err, "Error serializing '${enumField.name}' field")<@emitImport import="github.com/pkg/errors" />
+	}
+	${enumField.name}, _${enumField.name}Err := ${helper.getLanguageTypeNameForField(field)}FirstEnumForField${enumField.fieldName?cap_first}(${enumField.name}${enumField.fieldName?cap_first})
+	if _${enumField.name}Err != nil {
+		return nil, errors.Wrap(_${enumField.name}Err, "Error serializing '${enumField.name}' field")<@emitImport import="github.com/pkg/errors" />
+	}
+				<#else>
 	// Enum field (${enumField.name})
 	${enumField.name}, _${enumField.name}Err := ${helper.getLanguageTypeNameForField(field)}Parse(readBuffer)
 	if _${enumField.name}Err != nil {
 		return nil, errors.Wrap(_${enumField.name}Err, "Error parsing '${enumField.name}' field")<@emitImport import="github.com/pkg/errors" />
 	}
+				</#if>
 	if closeErr := readBuffer.CloseContext("${enumField.name}"); closeErr != nil {
 		return nil, closeErr
 	}
diff --git a/plc4go/internal/plc4go/ads/readwrite/model/AdsDataType.go b/plc4go/internal/plc4go/ads/readwrite/model/AdsDataType.go
index b7c9e15..470eba1 100644
--- a/plc4go/internal/plc4go/ads/readwrite/model/AdsDataType.go
+++ b/plc4go/internal/plc4go/ads/readwrite/model/AdsDataType.go
@@ -21,6 +21,7 @@ package model
 
 import (
 	"github.com/apache/plc4x/plc4go/internal/plc4go/spi/utils"
+	"github.com/pkg/errors"
 )
 
 // Code generated by build-utils. DO NOT EDIT.
@@ -79,6 +80,7 @@ const (
 var AdsDataTypeValues []AdsDataType
 
 func init() {
+	_ = errors.New
 	AdsDataTypeValues = []AdsDataType{
 		AdsDataType_BOOL,
 		AdsDataType_BIT,
@@ -292,6 +294,15 @@ func (e AdsDataType) NumBytes() uint16 {
 	}
 }
 
+func AdsDataTypeFirstEnumForFieldNumBytes(value uint16) (AdsDataType, error) {
+	for _, sizeValue := range AdsDataTypeValues {
+		if sizeValue.NumBytes() == value {
+			return sizeValue, nil
+		}
+	}
+	return 0, errors.Errorf("enum for %v not found", value)
+}
+
 func (e AdsDataType) DataFormatName() string {
 	switch e {
 	case 0x01:
@@ -460,6 +471,15 @@ func (e AdsDataType) DataFormatName() string {
 		}
 	}
 }
+
+func AdsDataTypeFirstEnumForFieldDataFormatName(value string) (AdsDataType, error) {
+	for _, sizeValue := range AdsDataTypeValues {
+		if sizeValue.DataFormatName() == value {
+			return sizeValue, nil
+		}
+	}
+	return 0, errors.Errorf("enum for %v not found", value)
+}
 func AdsDataTypeByValue(value int8) AdsDataType {
 	switch value {
 	case 0x01:
diff --git a/plc4go/internal/plc4go/ads/readwrite/model/CommandId.go b/plc4go/internal/plc4go/ads/readwrite/model/CommandId.go
index b106ae7..8c3a3e7 100644
--- a/plc4go/internal/plc4go/ads/readwrite/model/CommandId.go
+++ b/plc4go/internal/plc4go/ads/readwrite/model/CommandId.go
@@ -21,6 +21,7 @@ package model
 
 import (
 	"github.com/apache/plc4x/plc4go/internal/plc4go/spi/utils"
+	"github.com/pkg/errors"
 )
 
 // Code generated by build-utils. DO NOT EDIT.
@@ -47,6 +48,7 @@ const (
 var CommandIdValues []CommandId
 
 func init() {
+	_ = errors.New
 	CommandIdValues = []CommandId{
 		CommandId_INVALID,
 		CommandId_ADS_READ_DEVICE_INFO,
diff --git a/plc4go/internal/plc4go/ads/readwrite/model/ReservedIndexGroups.go b/plc4go/internal/plc4go/ads/readwrite/model/ReservedIndexGroups.go
index f4d5765..5c8ec16 100644
--- a/plc4go/internal/plc4go/ads/readwrite/model/ReservedIndexGroups.go
+++ b/plc4go/internal/plc4go/ads/readwrite/model/ReservedIndexGroups.go
@@ -21,6 +21,7 @@ package model
 
 import (
 	"github.com/apache/plc4x/plc4go/internal/plc4go/spi/utils"
+	"github.com/pkg/errors"
 )
 
 // Code generated by build-utils. DO NOT EDIT.
@@ -67,6 +68,7 @@ const (
 var ReservedIndexGroupsValues []ReservedIndexGroups
 
 func init() {
+	_ = errors.New
 	ReservedIndexGroupsValues = []ReservedIndexGroups{
 		ReservedIndexGroups_ADSIGRP_SYMTAB,
 		ReservedIndexGroups_ADSIGRP_SYMNAME,
diff --git a/plc4go/internal/plc4go/ads/readwrite/model/ReturnCode.go b/plc4go/internal/plc4go/ads/readwrite/model/ReturnCode.go
index 45b97d7..baefeb4 100644
--- a/plc4go/internal/plc4go/ads/readwrite/model/ReturnCode.go
+++ b/plc4go/internal/plc4go/ads/readwrite/model/ReturnCode.go
@@ -21,6 +21,7 @@ package model
 
 import (
 	"github.com/apache/plc4x/plc4go/internal/plc4go/spi/utils"
+	"github.com/pkg/errors"
 )
 
 // Code generated by build-utils. DO NOT EDIT.
@@ -159,6 +160,7 @@ const (
 var ReturnCodeValues []ReturnCode
 
 func init() {
+	_ = errors.New
 	ReturnCodeValues = []ReturnCode{
 		ReturnCode_OK,
 		ReturnCode_INTERNAL_ERROR,
diff --git a/plc4go/internal/plc4go/bacnetip/readwrite/model/ApplicationTag.go b/plc4go/internal/plc4go/bacnetip/readwrite/model/ApplicationTag.go
index 18f805f..998c80b 100644
--- a/plc4go/internal/plc4go/bacnetip/readwrite/model/ApplicationTag.go
+++ b/plc4go/internal/plc4go/bacnetip/readwrite/model/ApplicationTag.go
@@ -21,6 +21,7 @@ package model
 
 import (
 	"github.com/apache/plc4x/plc4go/internal/plc4go/spi/utils"
+	"github.com/pkg/errors"
 )
 
 // Code generated by build-utils. DO NOT EDIT.
@@ -50,6 +51,7 @@ const (
 var ApplicationTagValues []ApplicationTag
 
 func init() {
+	_ = errors.New
 	ApplicationTagValues = []ApplicationTag{
 		ApplicationTag_NULL,
 		ApplicationTag_BOOLEAN,
diff --git a/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetNetworkType.go b/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetNetworkType.go
index c71a6f9..9e47761 100644
--- a/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetNetworkType.go
+++ b/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetNetworkType.go
@@ -21,6 +21,7 @@ package model
 
 import (
 	"github.com/apache/plc4x/plc4go/internal/plc4go/spi/utils"
+	"github.com/pkg/errors"
 )
 
 // Code generated by build-utils. DO NOT EDIT.
@@ -48,6 +49,7 @@ const (
 var BACnetNetworkTypeValues []BACnetNetworkType
 
 func init() {
+	_ = errors.New
 	BACnetNetworkTypeValues = []BACnetNetworkType{
 		BACnetNetworkType_ETHERNET,
 		BACnetNetworkType_ARCNET,
diff --git a/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetNodeType.go b/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetNodeType.go
index 66d36d6..139faa2 100644
--- a/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetNodeType.go
+++ b/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetNodeType.go
@@ -21,6 +21,7 @@ package model
 
 import (
 	"github.com/apache/plc4x/plc4go/internal/plc4go/spi/utils"
+	"github.com/pkg/errors"
 )
 
 // Code generated by build-utils. DO NOT EDIT.
@@ -59,6 +60,7 @@ const (
 var BACnetNodeTypeValues []BACnetNodeType
 
 func init() {
+	_ = errors.New
 	BACnetNodeTypeValues = []BACnetNodeType{
 		BACnetNodeType_UNKNOWN,
 		BACnetNodeType_SYSTEM,
diff --git a/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetNotifyType.go b/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetNotifyType.go
index 1b6472c..1ef9b6d 100644
--- a/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetNotifyType.go
+++ b/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetNotifyType.go
@@ -21,6 +21,7 @@ package model
 
 import (
 	"github.com/apache/plc4x/plc4go/internal/plc4go/spi/utils"
+	"github.com/pkg/errors"
 )
 
 // Code generated by build-utils. DO NOT EDIT.
@@ -40,6 +41,7 @@ const (
 var BACnetNotifyTypeValues []BACnetNotifyType
 
 func init() {
+	_ = errors.New
 	BACnetNotifyTypeValues = []BACnetNotifyType{
 		BACnetNotifyType_ALARM,
 		BACnetNotifyType_EVENT,
diff --git a/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetObjectType.go b/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetObjectType.go
index 7a8e8df..075accc 100644
--- a/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetObjectType.go
+++ b/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetObjectType.go
@@ -21,6 +21,7 @@ package model
 
 import (
 	"github.com/apache/plc4x/plc4go/internal/plc4go/spi/utils"
+	"github.com/pkg/errors"
 )
 
 // Code generated by build-utils. DO NOT EDIT.
@@ -96,6 +97,7 @@ const (
 var BACnetObjectTypeValues []BACnetObjectType
 
 func init() {
+	_ = errors.New
 	BACnetObjectTypeValues = []BACnetObjectType{
 		BACnetObjectType_ANALOG_INPUT,
 		BACnetObjectType_ANALOG_OUTPUT,
diff --git a/plc4go/internal/plc4go/eip/readwrite/model/CIPDataTypeCode.go b/plc4go/internal/plc4go/eip/readwrite/model/CIPDataTypeCode.go
index bc5ca2b..ead8b01 100644
--- a/plc4go/internal/plc4go/eip/readwrite/model/CIPDataTypeCode.go
+++ b/plc4go/internal/plc4go/eip/readwrite/model/CIPDataTypeCode.go
@@ -21,6 +21,7 @@ package model
 
 import (
 	"github.com/apache/plc4x/plc4go/internal/plc4go/spi/utils"
+	"github.com/pkg/errors"
 )
 
 // Code generated by build-utils. DO NOT EDIT.
@@ -48,6 +49,7 @@ const (
 var CIPDataTypeCodeValues []CIPDataTypeCode
 
 func init() {
+	_ = errors.New
 	CIPDataTypeCodeValues = []CIPDataTypeCode{
 		CIPDataTypeCode_BOOL,
 		CIPDataTypeCode_SINT,
@@ -102,6 +104,15 @@ func (e CIPDataTypeCode) Size() uint8 {
 		}
 	}
 }
+
+func CIPDataTypeCodeFirstEnumForFieldSize(value uint8) (CIPDataTypeCode, error) {
+	for _, sizeValue := range CIPDataTypeCodeValues {
+		if sizeValue.Size() == value {
+			return sizeValue, nil
+		}
+	}
+	return 0, errors.Errorf("enum for %v not found", value)
+}
 func CIPDataTypeCodeByValue(value uint16) CIPDataTypeCode {
 	switch value {
 	case 0x00C1:
diff --git a/plc4go/internal/plc4go/eip/readwrite/model/EiPCommand.go b/plc4go/internal/plc4go/eip/readwrite/model/EiPCommand.go
index de76426..f7ac27c 100644
--- a/plc4go/internal/plc4go/eip/readwrite/model/EiPCommand.go
+++ b/plc4go/internal/plc4go/eip/readwrite/model/EiPCommand.go
@@ -21,6 +21,7 @@ package model
 
 import (
 	"github.com/apache/plc4x/plc4go/internal/plc4go/spi/utils"
+	"github.com/pkg/errors"
 )
 
 // Code generated by build-utils. DO NOT EDIT.
@@ -40,6 +41,7 @@ const (
 var EiPCommandValues []EiPCommand
 
 func init() {
+	_ = errors.New
 	EiPCommandValues = []EiPCommand{
 		EiPCommand_RegisterSession,
 		EiPCommand_UnregisterSession,
diff --git a/plc4go/internal/plc4go/firmata/readwrite/model/PinMode.go b/plc4go/internal/plc4go/firmata/readwrite/model/PinMode.go
index ab8a378..8f7b955 100644
--- a/plc4go/internal/plc4go/firmata/readwrite/model/PinMode.go
+++ b/plc4go/internal/plc4go/firmata/readwrite/model/PinMode.go
@@ -21,6 +21,7 @@ package model
 
 import (
 	"github.com/apache/plc4x/plc4go/internal/plc4go/spi/utils"
+	"github.com/pkg/errors"
 )
 
 // Code generated by build-utils. DO NOT EDIT.
@@ -49,6 +50,7 @@ const (
 var PinModeValues []PinMode
 
 func init() {
+	_ = errors.New
 	PinModeValues = []PinMode{
 		PinMode_PinModeInput,
 		PinMode_PinModeOutput,
diff --git a/plc4go/internal/plc4go/knxnetip/readwrite/model/AccessLevel.go b/plc4go/internal/plc4go/knxnetip/readwrite/model/AccessLevel.go
index 7223bac..9e7f0b4 100644
--- a/plc4go/internal/plc4go/knxnetip/readwrite/model/AccessLevel.go
+++ b/plc4go/internal/plc4go/knxnetip/readwrite/model/AccessLevel.go
@@ -21,6 +21,7 @@ package model
 
 import (
 	"github.com/apache/plc4x/plc4go/internal/plc4go/spi/utils"
+	"github.com/pkg/errors"
 )
 
 // Code generated by build-utils. DO NOT EDIT.
@@ -44,6 +45,7 @@ const (
 var AccessLevelValues []AccessLevel
 
 func init() {
+	_ = errors.New
 	AccessLevelValues = []AccessLevel{
 		AccessLevel_Level0,
 		AccessLevel_Level1,
@@ -82,6 +84,15 @@ func (e AccessLevel) Purpose() string {
 	}
 }
 
+func AccessLevelFirstEnumForFieldPurpose(value string) (AccessLevel, error) {
+	for _, sizeValue := range AccessLevelValues {
+		if sizeValue.Purpose() == value {
+			return sizeValue, nil
+		}
+	}
+	return 0, errors.Errorf("enum for %v not found", value)
+}
+
 func (e AccessLevel) NeedsAuthentication() bool {
 	switch e {
 	case 0x0:
@@ -110,6 +121,15 @@ func (e AccessLevel) NeedsAuthentication() bool {
 		}
 	}
 }
+
+func AccessLevelFirstEnumForFieldNeedsAuthentication(value bool) (AccessLevel, error) {
+	for _, sizeValue := range AccessLevelValues {
+		if sizeValue.NeedsAuthentication() == value {
+			return sizeValue, nil
+		}
+	}
+	return 0, errors.Errorf("enum for %v not found", value)
+}
 func AccessLevelByValue(value uint8) AccessLevel {
 	switch value {
 	case 0x0:
diff --git a/plc4go/internal/plc4go/knxnetip/readwrite/model/CEMIPriority.go b/plc4go/internal/plc4go/knxnetip/readwrite/model/CEMIPriority.go
index de6b9b8..a70fc54 100644
--- a/plc4go/internal/plc4go/knxnetip/readwrite/model/CEMIPriority.go
+++ b/plc4go/internal/plc4go/knxnetip/readwrite/model/CEMIPriority.go
@@ -21,6 +21,7 @@ package model
 
 import (
 	"github.com/apache/plc4x/plc4go/internal/plc4go/spi/utils"
+	"github.com/pkg/errors"
 )
 
 // Code generated by build-utils. DO NOT EDIT.
@@ -41,6 +42,7 @@ const (
 var CEMIPriorityValues []CEMIPriority
 
 func init() {
+	_ = errors.New
 	CEMIPriorityValues = []CEMIPriority{
 		CEMIPriority_SYSTEM,
 		CEMIPriority_NORMAL,
diff --git a/plc4go/internal/plc4go/knxnetip/readwrite/model/ComObjectTableAddresses.go b/plc4go/internal/plc4go/knxnetip/readwrite/model/ComObjectTableAddresses.go
index 407ef26..fd216b2 100644
--- a/plc4go/internal/plc4go/knxnetip/readwrite/model/ComObjectTableAddresses.go
+++ b/plc4go/internal/plc4go/knxnetip/readwrite/model/ComObjectTableAddresses.go
@@ -21,6 +21,7 @@ package model
 
 import (
 	"github.com/apache/plc4x/plc4go/internal/plc4go/spi/utils"
+	"github.com/pkg/errors"
 )
 
 // Code generated by build-utils. DO NOT EDIT.
@@ -1744,6 +1745,7 @@ const (
 var ComObjectTableAddressesValues []ComObjectTableAddresses
 
 func init() {
+	_ = errors.New
 	ComObjectTableAddressesValues = []ComObjectTableAddresses{
 		ComObjectTableAddresses_DEV0001914201,
 		ComObjectTableAddresses_DEV0001140C13,
@@ -10286,6 +10288,15 @@ func (e ComObjectTableAddresses) ComObjectTableAddress() uint16 {
 		}
 	}
 }
+
+func ComObjectTableAddressesFirstEnumForFieldComObjectTableAddress(value uint16) (ComObjectTableAddresses, error) {
+	for _, sizeValue := range ComObjectTableAddressesValues {
+		if sizeValue.ComObjectTableAddress() == value {
+			return sizeValue, nil
+		}
+	}
+	return 0, errors.Errorf("enum for %v not found", value)
+}
 func ComObjectTableAddressesByValue(value uint16) ComObjectTableAddresses {
 	switch value {
 	case 1:
diff --git a/plc4go/internal/plc4go/knxnetip/readwrite/model/ComObjectValueType.go b/plc4go/internal/plc4go/knxnetip/readwrite/model/ComObjectValueType.go
index 2706e9a..d7da244 100644
--- a/plc4go/internal/plc4go/knxnetip/readwrite/model/ComObjectValueType.go
+++ b/plc4go/internal/plc4go/knxnetip/readwrite/model/ComObjectValueType.go
@@ -21,6 +21,7 @@ package model
 
 import (
 	"github.com/apache/plc4x/plc4go/internal/plc4go/spi/utils"
+	"github.com/pkg/errors"
 )
 
 // Code generated by build-utils. DO NOT EDIT.
@@ -53,6 +54,7 @@ const (
 var ComObjectValueTypeValues []ComObjectValueType
 
 func init() {
+	_ = errors.New
 	ComObjectValueTypeValues = []ComObjectValueType{
 		ComObjectValueType_BIT1,
 		ComObjectValueType_BIT2,
@@ -140,6 +142,15 @@ func (e ComObjectValueType) SizeInBytes() uint8 {
 		}
 	}
 }
+
+func ComObjectValueTypeFirstEnumForFieldSizeInBytes(value uint8) (ComObjectValueType, error) {
+	for _, sizeValue := range ComObjectValueTypeValues {
+		if sizeValue.SizeInBytes() == value {
+			return sizeValue, nil
+		}
+	}
+	return 0, errors.Errorf("enum for %v not found", value)
+}
 func ComObjectValueTypeByValue(value uint8) ComObjectValueType {
 	switch value {
 	case 0x00:
diff --git a/plc4go/internal/plc4go/knxnetip/readwrite/model/DeviceDescriptor.go b/plc4go/internal/plc4go/knxnetip/readwrite/model/DeviceDescriptor.go
index 6dcf27e..c541dd1 100644
--- a/plc4go/internal/plc4go/knxnetip/readwrite/model/DeviceDescriptor.go
+++ b/plc4go/internal/plc4go/knxnetip/readwrite/model/DeviceDescriptor.go
@@ -21,6 +21,7 @@ package model
 
 import (
 	"github.com/apache/plc4x/plc4go/internal/plc4go/spi/utils"
+	"github.com/pkg/errors"
 )
 
 // Code generated by build-utils. DO NOT EDIT.
@@ -68,6 +69,7 @@ const (
 var DeviceDescriptorValues []DeviceDescriptor
 
 func init() {
+	_ = errors.New
 	DeviceDescriptorValues = []DeviceDescriptor{
 		DeviceDescriptor_TP1_BCU_1_SYSTEM_1_0,
 		DeviceDescriptor_TP1_BCU_1_SYSTEM_1_1,
@@ -226,6 +228,15 @@ func (e DeviceDescriptor) FirmwareType() FirmwareType {
 	}
 }
 
+func DeviceDescriptorFirstEnumForFieldFirmwareType(value FirmwareType) (DeviceDescriptor, error) {
+	for _, sizeValue := range DeviceDescriptorValues {
+		if sizeValue.FirmwareType() == value {
+			return sizeValue, nil
+		}
+	}
+	return 0, errors.Errorf("enum for %v not found", value)
+}
+
 func (e DeviceDescriptor) MediumType() DeviceDescriptorMediumType {
 	switch e {
 	case 0x0010:
@@ -350,6 +361,15 @@ func (e DeviceDescriptor) MediumType() DeviceDescriptorMediumType {
 		}
 	}
 }
+
+func DeviceDescriptorFirstEnumForFieldMediumType(value DeviceDescriptorMediumType) (DeviceDescriptor, error) {
+	for _, sizeValue := range DeviceDescriptorValues {
+		if sizeValue.MediumType() == value {
+			return sizeValue, nil
+		}
+	}
+	return 0, errors.Errorf("enum for %v not found", value)
+}
 func DeviceDescriptorByValue(value uint16) DeviceDescriptor {
 	switch value {
 	case 0x0010:
diff --git a/plc4go/internal/plc4go/knxnetip/readwrite/model/DeviceDescriptorMediumType.go b/plc4go/internal/plc4go/knxnetip/readwrite/model/DeviceDescriptorMediumType.go
index af90921..29784e7 100644
--- a/plc4go/internal/plc4go/knxnetip/readwrite/model/DeviceDescriptorMediumType.go
+++ b/plc4go/internal/plc4go/knxnetip/readwrite/model/DeviceDescriptorMediumType.go
@@ -21,6 +21,7 @@ package model
 
 import (
 	"github.com/apache/plc4x/plc4go/internal/plc4go/spi/utils"
+	"github.com/pkg/errors"
 )
 
 // Code generated by build-utils. DO NOT EDIT.
@@ -43,6 +44,7 @@ const (
 var DeviceDescriptorMediumTypeValues []DeviceDescriptorMediumType
 
 func init() {
+	_ = errors.New
 	DeviceDescriptorMediumTypeValues = []DeviceDescriptorMediumType{
 		DeviceDescriptorMediumType_TP1,
 		DeviceDescriptorMediumType_PL110,
diff --git a/plc4go/internal/plc4go/knxnetip/readwrite/model/FirmwareType.go b/plc4go/internal/plc4go/knxnetip/readwrite/model/FirmwareType.go
index 50d0772..06aa7de 100644
--- a/plc4go/internal/plc4go/knxnetip/readwrite/model/FirmwareType.go
+++ b/plc4go/internal/plc4go/knxnetip/readwrite/model/FirmwareType.go
@@ -21,6 +21,7 @@ package model
 
 import (
 	"github.com/apache/plc4x/plc4go/internal/plc4go/spi/utils"
+	"github.com/pkg/errors"
 )
 
 // Code generated by build-utils. DO NOT EDIT.
@@ -53,6 +54,7 @@ const (
 var FirmwareTypeValues []FirmwareType
 
 func init() {
+	_ = errors.New
 	FirmwareTypeValues = []FirmwareType{
 		FirmwareType_SYSTEM_1,
 		FirmwareType_SYSTEM_2,
diff --git a/plc4go/internal/plc4go/knxnetip/readwrite/model/HostProtocolCode.go b/plc4go/internal/plc4go/knxnetip/readwrite/model/HostProtocolCode.go
index d8e54d2..f175702 100644
--- a/plc4go/internal/plc4go/knxnetip/readwrite/model/HostProtocolCode.go
+++ b/plc4go/internal/plc4go/knxnetip/readwrite/model/HostProtocolCode.go
@@ -21,6 +21,7 @@ package model
 
 import (
 	"github.com/apache/plc4x/plc4go/internal/plc4go/spi/utils"
+	"github.com/pkg/errors"
 )
 
 // Code generated by build-utils. DO NOT EDIT.
@@ -39,6 +40,7 @@ const (
 var HostProtocolCodeValues []HostProtocolCode
 
 func init() {
+	_ = errors.New
 	HostProtocolCodeValues = []HostProtocolCode{
 		HostProtocolCode_IPV4_UDP,
 		HostProtocolCode_IPV4_TCP,
diff --git a/plc4go/internal/plc4go/knxnetip/readwrite/model/KnxDatapointMainType.go b/plc4go/internal/plc4go/knxnetip/readwrite/model/KnxDatapointMainType.go
index 4fad281..c827292 100644
--- a/plc4go/internal/plc4go/knxnetip/readwrite/model/KnxDatapointMainType.go
+++ b/plc4go/internal/plc4go/knxnetip/readwrite/model/KnxDatapointMainType.go
@@ -21,6 +21,7 @@ package model
 
 import (
 	"github.com/apache/plc4x/plc4go/internal/plc4go/spi/utils"
+	"github.com/pkg/errors"
 )
 
 // Code generated by build-utils. DO NOT EDIT.
@@ -100,6 +101,7 @@ const (
 var KnxDatapointMainTypeValues []KnxDatapointMainType
 
 func init() {
+	_ = errors.New
 	KnxDatapointMainTypeValues = []KnxDatapointMainType{
 		KnxDatapointMainType_DPT_UNKNOWN,
 		KnxDatapointMainType_DPT_64_BIT_SET,
@@ -413,6 +415,15 @@ func (e KnxDatapointMainType) Number() uint16 {
 	}
 }
 
+func KnxDatapointMainTypeFirstEnumForFieldNumber(value uint16) (KnxDatapointMainType, error) {
+	for _, sizeValue := range KnxDatapointMainTypeValues {
+		if sizeValue.Number() == value {
+			return sizeValue, nil
+		}
+	}
+	return 0, errors.Errorf("enum for %v not found", value)
+}
+
 func (e KnxDatapointMainType) Name() string {
 	switch e {
 	case 0:
@@ -662,6 +673,15 @@ func (e KnxDatapointMainType) Name() string {
 	}
 }
 
+func KnxDatapointMainTypeFirstEnumForFieldName(value string) (KnxDatapointMainType, error) {
+	for _, sizeValue := range KnxDatapointMainTypeValues {
+		if sizeValue.Name() == value {
+			return sizeValue, nil
+		}
+	}
+	return 0, errors.Errorf("enum for %v not found", value)
+}
+
 func (e KnxDatapointMainType) SizeInBits() uint8 {
 	switch e {
 	case 0:
@@ -910,6 +930,15 @@ func (e KnxDatapointMainType) SizeInBits() uint8 {
 		}
 	}
 }
+
+func KnxDatapointMainTypeFirstEnumForFieldSizeInBits(value uint8) (KnxDatapointMainType, error) {
+	for _, sizeValue := range KnxDatapointMainTypeValues {
+		if sizeValue.SizeInBits() == value {
+			return sizeValue, nil
+		}
+	}
+	return 0, errors.Errorf("enum for %v not found", value)
+}
 func KnxDatapointMainTypeByValue(value uint16) KnxDatapointMainType {
 	switch value {
 	case 0:
diff --git a/plc4go/internal/plc4go/knxnetip/readwrite/model/KnxDatapointType.go b/plc4go/internal/plc4go/knxnetip/readwrite/model/KnxDatapointType.go
index d3448a4..bf2c51f 100644
--- a/plc4go/internal/plc4go/knxnetip/readwrite/model/KnxDatapointType.go
+++ b/plc4go/internal/plc4go/knxnetip/readwrite/model/KnxDatapointType.go
@@ -21,6 +21,7 @@ package model
 
 import (
 	"github.com/apache/plc4x/plc4go/internal/plc4go/spi/utils"
+	"github.com/pkg/errors"
 )
 
 // Code generated by build-utils. DO NOT EDIT.
@@ -388,6 +389,7 @@ const (
 var KnxDatapointTypeValues []KnxDatapointType
 
 func init() {
+	_ = errors.New
 	KnxDatapointTypeValues = []KnxDatapointType{
 		KnxDatapointType_DPT_UNKNOWN,
 		KnxDatapointType_BOOL,
@@ -2141,6 +2143,15 @@ func (e KnxDatapointType) Number() uint16 {
 	}
 }
 
+func KnxDatapointTypeFirstEnumForFieldNumber(value uint16) (KnxDatapointType, error) {
+	for _, sizeValue := range KnxDatapointTypeValues {
+		if sizeValue.Number() == value {
+			return sizeValue, nil
+		}
+	}
+	return 0, errors.Errorf("enum for %v not found", value)
+}
+
 func (e KnxDatapointType) Name() string {
 	switch e {
 	case 0:
@@ -3542,6 +3553,15 @@ func (e KnxDatapointType) Name() string {
 	}
 }
 
+func KnxDatapointTypeFirstEnumForFieldName(value string) (KnxDatapointType, error) {
+	for _, sizeValue := range KnxDatapointTypeValues {
+		if sizeValue.Name() == value {
+			return sizeValue, nil
+		}
+	}
+	return 0, errors.Errorf("enum for %v not found", value)
+}
+
 func (e KnxDatapointType) DatapointMainType() KnxDatapointMainType {
 	switch e {
 	case 0:
@@ -4942,6 +4962,15 @@ func (e KnxDatapointType) DatapointMainType() KnxDatapointMainType {
 		}
 	}
 }
+
+func KnxDatapointTypeFirstEnumForFieldDatapointMainType(value KnxDatapointMainType) (KnxDatapointType, error) {
+	for _, sizeValue := range KnxDatapointTypeValues {
+		if sizeValue.DatapointMainType() == value {
+			return sizeValue, nil
+		}
+	}
+	return 0, errors.Errorf("enum for %v not found", value)
+}
 func KnxDatapointTypeByValue(value uint32) KnxDatapointType {
 	switch value {
 	case 0:
diff --git a/plc4go/internal/plc4go/knxnetip/readwrite/model/KnxInterfaceObjectProperty.go b/plc4go/internal/plc4go/knxnetip/readwrite/model/KnxInterfaceObjectProperty.go
index 476299f..adb8b22 100644
--- a/plc4go/internal/plc4go/knxnetip/readwrite/model/KnxInterfaceObjectProperty.go
+++ b/plc4go/internal/plc4go/knxnetip/readwrite/model/KnxInterfaceObjectProperty.go
@@ -21,6 +21,7 @@ package model
 
 import (
 	"github.com/apache/plc4x/plc4go/internal/plc4go/spi/utils"
+	"github.com/pkg/errors"
 )
 
 // Code generated by build-utils. DO NOT EDIT.
@@ -257,6 +258,7 @@ const (
 var KnxInterfaceObjectPropertyValues []KnxInterfaceObjectProperty
 
 func init() {
+	_ = errors.New
 	KnxInterfaceObjectPropertyValues = []KnxInterfaceObjectProperty{
 		KnxInterfaceObjectProperty_PID_UNKNOWN,
 		KnxInterfaceObjectProperty_PID_GENERAL_OBJECT_TYPE,
@@ -1350,6 +1352,15 @@ func (e KnxInterfaceObjectProperty) PropertyDataType() KnxPropertyDataType {
 	}
 }
 
+func KnxInterfaceObjectPropertyFirstEnumForFieldPropertyDataType(value KnxPropertyDataType) (KnxInterfaceObjectProperty, error) {
+	for _, sizeValue := range KnxInterfaceObjectPropertyValues {
+		if sizeValue.PropertyDataType() == value {
+			return sizeValue, nil
+		}
+	}
+	return 0, errors.Errorf("enum for %v not found", value)
+}
+
 func (e KnxInterfaceObjectProperty) Name() string {
 	switch e {
 	case 0:
@@ -2223,6 +2234,15 @@ func (e KnxInterfaceObjectProperty) Name() string {
 	}
 }
 
+func KnxInterfaceObjectPropertyFirstEnumForFieldName(value string) (KnxInterfaceObjectProperty, error) {
+	for _, sizeValue := range KnxInterfaceObjectPropertyValues {
+		if sizeValue.Name() == value {
+			return sizeValue, nil
+		}
+	}
+	return 0, errors.Errorf("enum for %v not found", value)
+}
+
 func (e KnxInterfaceObjectProperty) PropertyId() uint8 {
 	switch e {
 	case 0:
@@ -3096,6 +3116,15 @@ func (e KnxInterfaceObjectProperty) PropertyId() uint8 {
 	}
 }
 
+func KnxInterfaceObjectPropertyFirstEnumForFieldPropertyId(value uint8) (KnxInterfaceObjectProperty, error) {
+	for _, sizeValue := range KnxInterfaceObjectPropertyValues {
+		if sizeValue.PropertyId() == value {
+			return sizeValue, nil
+		}
+	}
+	return 0, errors.Errorf("enum for %v not found", value)
+}
+
 func (e KnxInterfaceObjectProperty) ObjectType() KnxInterfaceObjectType {
 	switch e {
 	case 0:
@@ -3968,6 +3997,15 @@ func (e KnxInterfaceObjectProperty) ObjectType() KnxInterfaceObjectType {
 		}
 	}
 }
+
+func KnxInterfaceObjectPropertyFirstEnumForFieldObjectType(value KnxInterfaceObjectType) (KnxInterfaceObjectProperty, error) {
+	for _, sizeValue := range KnxInterfaceObjectPropertyValues {
+		if sizeValue.ObjectType() == value {
+			return sizeValue, nil
+		}
+	}
+	return 0, errors.Errorf("enum for %v not found", value)
+}
 func KnxInterfaceObjectPropertyByValue(value uint32) KnxInterfaceObjectProperty {
 	switch value {
 	case 0:
diff --git a/plc4go/internal/plc4go/knxnetip/readwrite/model/KnxInterfaceObjectType.go b/plc4go/internal/plc4go/knxnetip/readwrite/model/KnxInterfaceObjectType.go
index 4bf332d..644a846 100644
--- a/plc4go/internal/plc4go/knxnetip/readwrite/model/KnxInterfaceObjectType.go
+++ b/plc4go/internal/plc4go/knxnetip/readwrite/model/KnxInterfaceObjectType.go
@@ -21,6 +21,7 @@ package model
 
 import (
 	"github.com/apache/plc4x/plc4go/internal/plc4go/spi/utils"
+	"github.com/pkg/errors"
 )
 
 // Code generated by build-utils. DO NOT EDIT.
@@ -64,6 +65,7 @@ const (
 var KnxInterfaceObjectTypeValues []KnxInterfaceObjectType
 
 func init() {
+	_ = errors.New
 	KnxInterfaceObjectTypeValues = []KnxInterfaceObjectType{
 		KnxInterfaceObjectType_OT_UNKNOWN,
 		KnxInterfaceObjectType_OT_GENERAL,
@@ -202,6 +204,15 @@ func (e KnxInterfaceObjectType) Code() string {
 	}
 }
 
+func KnxInterfaceObjectTypeFirstEnumForFieldCode(value string) (KnxInterfaceObjectType, error) {
+	for _, sizeValue := range KnxInterfaceObjectTypeValues {
+		if sizeValue.Code() == value {
+			return sizeValue, nil
+		}
+	}
+	return 0, errors.Errorf("enum for %v not found", value)
+}
+
 func (e KnxInterfaceObjectType) Name() string {
 	switch e {
 	case 0:
@@ -310,6 +321,15 @@ func (e KnxInterfaceObjectType) Name() string {
 		}
 	}
 }
+
+func KnxInterfaceObjectTypeFirstEnumForFieldName(value string) (KnxInterfaceObjectType, error) {
+	for _, sizeValue := range KnxInterfaceObjectTypeValues {
+		if sizeValue.Name() == value {
+			return sizeValue, nil
+		}
+	}
+	return 0, errors.Errorf("enum for %v not found", value)
+}
 func KnxInterfaceObjectTypeByValue(value uint16) KnxInterfaceObjectType {
 	switch value {
 	case 0:
diff --git a/plc4go/internal/plc4go/knxnetip/readwrite/model/KnxLayer.go b/plc4go/internal/plc4go/knxnetip/readwrite/model/KnxLayer.go
index 287e2e7..3d0b3a6 100644
--- a/plc4go/internal/plc4go/knxnetip/readwrite/model/KnxLayer.go
+++ b/plc4go/internal/plc4go/knxnetip/readwrite/model/KnxLayer.go
@@ -21,6 +21,7 @@ package model
 
 import (
 	"github.com/apache/plc4x/plc4go/internal/plc4go/spi/utils"
+	"github.com/pkg/errors"
 )
 
 // Code generated by build-utils. DO NOT EDIT.
@@ -40,6 +41,7 @@ const (
 var KnxLayerValues []KnxLayer
 
 func init() {
+	_ = errors.New
 	KnxLayerValues = []KnxLayer{
 		KnxLayer_TUNNEL_LINK_LAYER,
 		KnxLayer_TUNNEL_RAW,
diff --git a/plc4go/internal/plc4go/knxnetip/readwrite/model/KnxManufacturer.go b/plc4go/internal/plc4go/knxnetip/readwrite/model/KnxManufacturer.go
index ce8506b..cd59626 100644
--- a/plc4go/internal/plc4go/knxnetip/readwrite/model/KnxManufacturer.go
+++ b/plc4go/internal/plc4go/knxnetip/readwrite/model/KnxManufacturer.go
@@ -21,6 +21,7 @@ package model
 
 import (
 	"github.com/apache/plc4x/plc4go/internal/plc4go/spi/utils"
+	"github.com/pkg/errors"
 )
 
 // Code generated by build-utils. DO NOT EDIT.
@@ -590,6 +591,7 @@ const (
 var KnxManufacturerValues []KnxManufacturer
 
 func init() {
+	_ = errors.New
 	KnxManufacturerValues = []KnxManufacturer{
 		KnxManufacturer_M_UNKNOWN,
 		KnxManufacturer_M_SIEMENS,
@@ -3358,6 +3360,15 @@ func (e KnxManufacturer) Number() uint16 {
 	}
 }
 
+func KnxManufacturerFirstEnumForFieldNumber(value uint16) (KnxManufacturer, error) {
+	for _, sizeValue := range KnxManufacturerValues {
+		if sizeValue.Number() == value {
+			return sizeValue, nil
+		}
+	}
+	return 0, errors.Errorf("enum for %v not found", value)
+}
+
 func (e KnxManufacturer) Name() string {
 	switch e {
 	case 0:
@@ -5570,6 +5581,15 @@ func (e KnxManufacturer) Name() string {
 		}
 	}
 }
+
+func KnxManufacturerFirstEnumForFieldName(value string) (KnxManufacturer, error) {
+	for _, sizeValue := range KnxManufacturerValues {
+		if sizeValue.Name() == value {
+			return sizeValue, nil
+		}
+	}
+	return 0, errors.Errorf("enum for %v not found", value)
+}
 func KnxManufacturerByValue(value uint16) KnxManufacturer {
 	switch value {
 	case 0:
diff --git a/plc4go/internal/plc4go/knxnetip/readwrite/model/KnxMedium.go b/plc4go/internal/plc4go/knxnetip/readwrite/model/KnxMedium.go
index 2f82c3b..cf5f01a 100644
--- a/plc4go/internal/plc4go/knxnetip/readwrite/model/KnxMedium.go
+++ b/plc4go/internal/plc4go/knxnetip/readwrite/model/KnxMedium.go
@@ -21,6 +21,7 @@ package model
 
 import (
 	"github.com/apache/plc4x/plc4go/internal/plc4go/spi/utils"
+	"github.com/pkg/errors"
 )
 
 // Code generated by build-utils. DO NOT EDIT.
@@ -43,6 +44,7 @@ const (
 var KnxMediumValues []KnxMedium
 
 func init() {
+	_ = errors.New
 	KnxMediumValues = []KnxMedium{
 		KnxMedium_MEDIUM_RESERVED_1,
 		KnxMedium_MEDIUM_TP1,
diff --git a/plc4go/internal/plc4go/knxnetip/readwrite/model/KnxPropertyDataType.go b/plc4go/internal/plc4go/knxnetip/readwrite/model/KnxPropertyDataType.go
index a6ab223..e33fba0 100644
--- a/plc4go/internal/plc4go/knxnetip/readwrite/model/KnxPropertyDataType.go
+++ b/plc4go/internal/plc4go/knxnetip/readwrite/model/KnxPropertyDataType.go
@@ -21,6 +21,7 @@ package model
 
 import (
 	"github.com/apache/plc4x/plc4go/internal/plc4go/spi/utils"
+	"github.com/pkg/errors"
 )
 
 // Code generated by build-utils. DO NOT EDIT.
@@ -90,6 +91,7 @@ const (
 var KnxPropertyDataTypeValues []KnxPropertyDataType
 
 func init() {
+	_ = errors.New
 	KnxPropertyDataTypeValues = []KnxPropertyDataType{
 		KnxPropertyDataType_PDT_UNKNOWN,
 		KnxPropertyDataType_PDT_CONTROL,
@@ -353,6 +355,15 @@ func (e KnxPropertyDataType) Number() uint8 {
 	}
 }
 
+func KnxPropertyDataTypeFirstEnumForFieldNumber(value uint8) (KnxPropertyDataType, error) {
+	for _, sizeValue := range KnxPropertyDataTypeValues {
+		if sizeValue.Number() == value {
+			return sizeValue, nil
+		}
+	}
+	return 0, errors.Errorf("enum for %v not found", value)
+}
+
 func (e KnxPropertyDataType) SizeInBytes() uint8 {
 	switch e {
 	case 0:
@@ -562,6 +573,15 @@ func (e KnxPropertyDataType) SizeInBytes() uint8 {
 	}
 }
 
+func KnxPropertyDataTypeFirstEnumForFieldSizeInBytes(value uint8) (KnxPropertyDataType, error) {
+	for _, sizeValue := range KnxPropertyDataTypeValues {
+		if sizeValue.SizeInBytes() == value {
+			return sizeValue, nil
+		}
+	}
+	return 0, errors.Errorf("enum for %v not found", value)
+}
+
 func (e KnxPropertyDataType) Name() string {
 	switch e {
 	case 0:
@@ -770,6 +790,15 @@ func (e KnxPropertyDataType) Name() string {
 		}
 	}
 }
+
+func KnxPropertyDataTypeFirstEnumForFieldName(value string) (KnxPropertyDataType, error) {
+	for _, sizeValue := range KnxPropertyDataTypeValues {
+		if sizeValue.Name() == value {
+			return sizeValue, nil
+		}
+	}
+	return 0, errors.Errorf("enum for %v not found", value)
+}
 func KnxPropertyDataTypeByValue(value uint8) KnxPropertyDataType {
 	switch value {
 	case 0:
diff --git a/plc4go/internal/plc4go/knxnetip/readwrite/model/Status.go b/plc4go/internal/plc4go/knxnetip/readwrite/model/Status.go
index 67bd073..9f0d227 100644
--- a/plc4go/internal/plc4go/knxnetip/readwrite/model/Status.go
+++ b/plc4go/internal/plc4go/knxnetip/readwrite/model/Status.go
@@ -21,6 +21,7 @@ package model
 
 import (
 	"github.com/apache/plc4x/plc4go/internal/plc4go/spi/utils"
+	"github.com/pkg/errors"
 )
 
 // Code generated by build-utils. DO NOT EDIT.
@@ -49,6 +50,7 @@ const (
 var StatusValues []Status
 
 func init() {
+	_ = errors.New
 	StatusValues = []Status{
 		Status_NO_ERROR,
 		Status_PROTOCOL_TYPE_NOT_SUPPORTED,
diff --git a/plc4go/internal/plc4go/knxnetip/readwrite/model/SupportedPhysicalMedia.go b/plc4go/internal/plc4go/knxnetip/readwrite/model/SupportedPhysicalMedia.go
index 9fbef6f..b8e12ac 100644
--- a/plc4go/internal/plc4go/knxnetip/readwrite/model/SupportedPhysicalMedia.go
+++ b/plc4go/internal/plc4go/knxnetip/readwrite/model/SupportedPhysicalMedia.go
@@ -21,6 +21,7 @@ package model
 
 import (
 	"github.com/apache/plc4x/plc4go/internal/plc4go/spi/utils"
+	"github.com/pkg/errors"
 )
 
 // Code generated by build-utils. DO NOT EDIT.
@@ -60,6 +61,7 @@ const (
 var SupportedPhysicalMediaValues []SupportedPhysicalMedia
 
 func init() {
+	_ = errors.New
 	SupportedPhysicalMediaValues = []SupportedPhysicalMedia{
 		SupportedPhysicalMedia_OTHER,
 		SupportedPhysicalMedia_OIL_METER,
@@ -178,6 +180,15 @@ func (e SupportedPhysicalMedia) KnxSupport() bool {
 	}
 }
 
+func SupportedPhysicalMediaFirstEnumForFieldKnxSupport(value bool) (SupportedPhysicalMedia, error) {
+	for _, sizeValue := range SupportedPhysicalMediaValues {
+		if sizeValue.KnxSupport() == value {
+			return sizeValue, nil
+		}
+	}
+	return 0, errors.Errorf("enum for %v not found", value)
+}
+
 func (e SupportedPhysicalMedia) Description() string {
 	switch e {
 	case 0x00:
@@ -270,6 +281,15 @@ func (e SupportedPhysicalMedia) Description() string {
 		}
 	}
 }
+
+func SupportedPhysicalMediaFirstEnumForFieldDescription(value string) (SupportedPhysicalMedia, error) {
+	for _, sizeValue := range SupportedPhysicalMediaValues {
+		if sizeValue.Description() == value {
+			return sizeValue, nil
+		}
+	}
+	return 0, errors.Errorf("enum for %v not found", value)
+}
 func SupportedPhysicalMediaByValue(value uint8) SupportedPhysicalMedia {
 	switch value {
 	case 0x00:
diff --git a/plc4go/internal/plc4go/modbus/readwrite/model/ModbusDataType.go b/plc4go/internal/plc4go/modbus/readwrite/model/ModbusDataType.go
index 737c0c9..e81b1dd 100644
--- a/plc4go/internal/plc4go/modbus/readwrite/model/ModbusDataType.go
+++ b/plc4go/internal/plc4go/modbus/readwrite/model/ModbusDataType.go
@@ -21,6 +21,7 @@ package model
 
 import (
 	"github.com/apache/plc4x/plc4go/internal/plc4go/spi/utils"
+	"github.com/pkg/errors"
 )
 
 // Code generated by build-utils. DO NOT EDIT.
@@ -65,6 +66,7 @@ const (
 var ModbusDataTypeValues []ModbusDataType
 
 func init() {
+	_ = errors.New
 	ModbusDataTypeValues = []ModbusDataType{
 		ModbusDataType_BOOL,
 		ModbusDataType_BYTE,
@@ -212,6 +214,15 @@ func (e ModbusDataType) DataTypeSize() uint8 {
 		}
 	}
 }
+
+func ModbusDataTypeFirstEnumForFieldDataTypeSize(value uint8) (ModbusDataType, error) {
+	for _, sizeValue := range ModbusDataTypeValues {
+		if sizeValue.DataTypeSize() == value {
+			return sizeValue, nil
+		}
+	}
+	return 0, errors.Errorf("enum for %v not found", value)
+}
 func ModbusDataTypeByValue(value uint8) ModbusDataType {
 	switch value {
 	case 1:
diff --git a/plc4go/internal/plc4go/modbus/readwrite/model/ModbusErrorCode.go b/plc4go/internal/plc4go/modbus/readwrite/model/ModbusErrorCode.go
index 4137e78..24fa2fd 100644
--- a/plc4go/internal/plc4go/modbus/readwrite/model/ModbusErrorCode.go
+++ b/plc4go/internal/plc4go/modbus/readwrite/model/ModbusErrorCode.go
@@ -21,6 +21,7 @@ package model
 
 import (
 	"github.com/apache/plc4x/plc4go/internal/plc4go/spi/utils"
+	"github.com/pkg/errors"
 )
 
 // Code generated by build-utils. DO NOT EDIT.
@@ -47,6 +48,7 @@ const (
 var ModbusErrorCodeValues []ModbusErrorCode
 
 func init() {
+	_ = errors.New
 	ModbusErrorCodeValues = []ModbusErrorCode{
 		ModbusErrorCode_ILLEGAL_FUNCTION,
 		ModbusErrorCode_ILLEGAL_DATA_ADDRESS,
diff --git a/plc4go/internal/plc4go/s7/readwrite/model/COTPProtocolClass.go b/plc4go/internal/plc4go/s7/readwrite/model/COTPProtocolClass.go
index 36dfeb0..7e5bfa5 100644
--- a/plc4go/internal/plc4go/s7/readwrite/model/COTPProtocolClass.go
+++ b/plc4go/internal/plc4go/s7/readwrite/model/COTPProtocolClass.go
@@ -21,6 +21,7 @@ package model
 
 import (
 	"github.com/apache/plc4x/plc4go/internal/plc4go/spi/utils"
+	"github.com/pkg/errors"
 )
 
 // Code generated by build-utils. DO NOT EDIT.
@@ -42,6 +43,7 @@ const (
 var COTPProtocolClassValues []COTPProtocolClass
 
 func init() {
+	_ = errors.New
 	COTPProtocolClassValues = []COTPProtocolClass{
 		COTPProtocolClass_CLASS_0,
 		COTPProtocolClass_CLASS_1,
diff --git a/plc4go/internal/plc4go/s7/readwrite/model/COTPTpduSize.go b/plc4go/internal/plc4go/s7/readwrite/model/COTPTpduSize.go
index a01e917..2b9c945 100644
--- a/plc4go/internal/plc4go/s7/readwrite/model/COTPTpduSize.go
+++ b/plc4go/internal/plc4go/s7/readwrite/model/COTPTpduSize.go
@@ -21,6 +21,7 @@ package model
 
 import (
 	"github.com/apache/plc4x/plc4go/internal/plc4go/spi/utils"
+	"github.com/pkg/errors"
 )
 
 // Code generated by build-utils. DO NOT EDIT.
@@ -45,6 +46,7 @@ const (
 var COTPTpduSizeValues []COTPTpduSize
 
 func init() {
+	_ = errors.New
 	COTPTpduSizeValues = []COTPTpduSize{
 		COTPTpduSize_SIZE_128,
 		COTPTpduSize_SIZE_256,
@@ -92,6 +94,15 @@ func (e COTPTpduSize) SizeInBytes() uint16 {
 		}
 	}
 }
+
+func COTPTpduSizeFirstEnumForFieldSizeInBytes(value uint16) (COTPTpduSize, error) {
+	for _, sizeValue := range COTPTpduSizeValues {
+		if sizeValue.SizeInBytes() == value {
+			return sizeValue, nil
+		}
+	}
+	return 0, errors.Errorf("enum for %v not found", value)
+}
 func COTPTpduSizeByValue(value int8) COTPTpduSize {
 	switch value {
 	case 0x07:
diff --git a/plc4go/internal/plc4go/s7/readwrite/model/DataTransportErrorCode.go b/plc4go/internal/plc4go/s7/readwrite/model/DataTransportErrorCode.go
index 0e9172e..22e0ca9 100644
--- a/plc4go/internal/plc4go/s7/readwrite/model/DataTransportErrorCode.go
+++ b/plc4go/internal/plc4go/s7/readwrite/model/DataTransportErrorCode.go
@@ -21,6 +21,7 @@ package model
 
 import (
 	"github.com/apache/plc4x/plc4go/internal/plc4go/spi/utils"
+	"github.com/pkg/errors"
 )
 
 // Code generated by build-utils. DO NOT EDIT.
@@ -43,6 +44,7 @@ const (
 var DataTransportErrorCodeValues []DataTransportErrorCode
 
 func init() {
+	_ = errors.New
 	DataTransportErrorCodeValues = []DataTransportErrorCode{
 		DataTransportErrorCode_RESERVED,
 		DataTransportErrorCode_OK,
diff --git a/plc4go/internal/plc4go/s7/readwrite/model/DataTransportSize.go b/plc4go/internal/plc4go/s7/readwrite/model/DataTransportSize.go
index adb2578..5cae722 100644
--- a/plc4go/internal/plc4go/s7/readwrite/model/DataTransportSize.go
+++ b/plc4go/internal/plc4go/s7/readwrite/model/DataTransportSize.go
@@ -21,6 +21,7 @@ package model
 
 import (
 	"github.com/apache/plc4x/plc4go/internal/plc4go/spi/utils"
+	"github.com/pkg/errors"
 )
 
 // Code generated by build-utils. DO NOT EDIT.
@@ -45,6 +46,7 @@ const (
 var DataTransportSizeValues []DataTransportSize
 
 func init() {
+	_ = errors.New
 	DataTransportSizeValues = []DataTransportSize{
 		DataTransportSize_NULL,
 		DataTransportSize_BIT,
@@ -92,6 +94,15 @@ func (e DataTransportSize) SizeInBits() bool {
 		}
 	}
 }
+
+func DataTransportSizeFirstEnumForFieldSizeInBits(value bool) (DataTransportSize, error) {
+	for _, sizeValue := range DataTransportSizeValues {
+		if sizeValue.SizeInBits() == value {
+			return sizeValue, nil
+		}
+	}
+	return 0, errors.Errorf("enum for %v not found", value)
+}
 func DataTransportSizeByValue(value uint8) DataTransportSize {
 	switch value {
 	case 0x00:
diff --git a/plc4go/internal/plc4go/s7/readwrite/model/DeviceGroup.go b/plc4go/internal/plc4go/s7/readwrite/model/DeviceGroup.go
index fec80f3..5101f9b 100644
--- a/plc4go/internal/plc4go/s7/readwrite/model/DeviceGroup.go
+++ b/plc4go/internal/plc4go/s7/readwrite/model/DeviceGroup.go
@@ -21,6 +21,7 @@ package model
 
 import (
 	"github.com/apache/plc4x/plc4go/internal/plc4go/spi/utils"
+	"github.com/pkg/errors"
 )
 
 // Code generated by build-utils. DO NOT EDIT.
@@ -40,6 +41,7 @@ const (
 var DeviceGroupValues []DeviceGroup
 
 func init() {
+	_ = errors.New
 	DeviceGroupValues = []DeviceGroup{
 		DeviceGroup_PG_OR_PC,
 		DeviceGroup_OS,
diff --git a/plc4go/internal/plc4go/s7/readwrite/model/MemoryArea.go b/plc4go/internal/plc4go/s7/readwrite/model/MemoryArea.go
index c7804ac..a2e2ea8 100644
--- a/plc4go/internal/plc4go/s7/readwrite/model/MemoryArea.go
+++ b/plc4go/internal/plc4go/s7/readwrite/model/MemoryArea.go
@@ -21,6 +21,7 @@ package model
 
 import (
 	"github.com/apache/plc4x/plc4go/internal/plc4go/spi/utils"
+	"github.com/pkg/errors"
 )
 
 // Code generated by build-utils. DO NOT EDIT.
@@ -47,6 +48,7 @@ const (
 var MemoryAreaValues []MemoryArea
 
 func init() {
+	_ = errors.New
 	MemoryAreaValues = []MemoryArea{
 		MemoryArea_COUNTERS,
 		MemoryArea_TIMERS,
@@ -104,6 +106,15 @@ func (e MemoryArea) ShortName() string {
 		}
 	}
 }
+
+func MemoryAreaFirstEnumForFieldShortName(value string) (MemoryArea, error) {
+	for _, sizeValue := range MemoryAreaValues {
+		if sizeValue.ShortName() == value {
+			return sizeValue, nil
+		}
+	}
+	return 0, errors.Errorf("enum for %v not found", value)
+}
 func MemoryAreaByValue(value uint8) MemoryArea {
 	switch value {
 	case 0x1C:
diff --git a/plc4go/internal/plc4go/s7/readwrite/model/S7AddressAny.go b/plc4go/internal/plc4go/s7/readwrite/model/S7AddressAny.go
index bee965c..97abd9b 100644
--- a/plc4go/internal/plc4go/s7/readwrite/model/S7AddressAny.go
+++ b/plc4go/internal/plc4go/s7/readwrite/model/S7AddressAny.go
@@ -136,9 +136,13 @@ func S7AddressAnyParse(readBuffer utils.ReadBuffer) (*S7Address, error) {
 		return nil, pullErr
 	}
 	// Enum field (transportSize)
-	transportSize, _transportSizeErr := TransportSizeParse(readBuffer)
+	transportSizeCode, _transportSizeCodeErr := readBuffer.ReadUint8("TransportSize", 8)
+	if _transportSizeCodeErr != nil {
+		return nil, errors.Wrap(_transportSizeCodeErr, "Error serializing 'transportSize' field")
+	}
+	transportSize, _transportSizeErr := TransportSizeFirstEnumForFieldCode(transportSizeCode)
 	if _transportSizeErr != nil {
-		return nil, errors.Wrap(_transportSizeErr, "Error parsing 'transportSize' field")
+		return nil, errors.Wrap(_transportSizeErr, "Error serializing 'transportSize' field")
 	}
 	if closeErr := readBuffer.CloseContext("transportSize"); closeErr != nil {
 		return nil, closeErr
diff --git a/plc4go/internal/plc4go/s7/readwrite/model/SzlModuleTypeClass.go b/plc4go/internal/plc4go/s7/readwrite/model/SzlModuleTypeClass.go
index 1814b7d..375f88a 100644
--- a/plc4go/internal/plc4go/s7/readwrite/model/SzlModuleTypeClass.go
+++ b/plc4go/internal/plc4go/s7/readwrite/model/SzlModuleTypeClass.go
@@ -21,6 +21,7 @@ package model
 
 import (
 	"github.com/apache/plc4x/plc4go/internal/plc4go/spi/utils"
+	"github.com/pkg/errors"
 )
 
 // Code generated by build-utils. DO NOT EDIT.
@@ -41,6 +42,7 @@ const (
 var SzlModuleTypeClassValues []SzlModuleTypeClass
 
 func init() {
+	_ = errors.New
 	SzlModuleTypeClassValues = []SzlModuleTypeClass{
 		SzlModuleTypeClass_CPU,
 		SzlModuleTypeClass_IM,
diff --git a/plc4go/internal/plc4go/s7/readwrite/model/SzlSublist.go b/plc4go/internal/plc4go/s7/readwrite/model/SzlSublist.go
index e47c4cd..4929987 100644
--- a/plc4go/internal/plc4go/s7/readwrite/model/SzlSublist.go
+++ b/plc4go/internal/plc4go/s7/readwrite/model/SzlSublist.go
@@ -21,6 +21,7 @@ package model
 
 import (
 	"github.com/apache/plc4x/plc4go/internal/plc4go/spi/utils"
+	"github.com/pkg/errors"
 )
 
 // Code generated by build-utils. DO NOT EDIT.
@@ -56,6 +57,7 @@ const (
 var SzlSublistValues []SzlSublist
 
 func init() {
+	_ = errors.New
 	SzlSublistValues = []SzlSublist{
 		SzlSublist_MODULE_IDENTIFICATION,
 		SzlSublist_CPU_FEATURES,
diff --git a/plc4go/internal/plc4go/s7/readwrite/model/TransportSize.go b/plc4go/internal/plc4go/s7/readwrite/model/TransportSize.go
index e04877f..f5ecaaa 100644
--- a/plc4go/internal/plc4go/s7/readwrite/model/TransportSize.go
+++ b/plc4go/internal/plc4go/s7/readwrite/model/TransportSize.go
@@ -21,6 +21,7 @@ package model
 
 import (
 	"github.com/apache/plc4x/plc4go/internal/plc4go/spi/utils"
+	"github.com/pkg/errors"
 )
 
 // Code generated by build-utils. DO NOT EDIT.
@@ -74,6 +75,7 @@ const (
 var TransportSizeValues []TransportSize
 
 func init() {
+	_ = errors.New
 	TransportSizeValues = []TransportSize{
 		TransportSize_BOOL,
 		TransportSize_BYTE,
@@ -217,6 +219,15 @@ func (e TransportSize) Supported_S7_300() bool {
 	}
 }
 
+func TransportSizeFirstEnumForFieldSupported_S7_300(value bool) (TransportSize, error) {
+	for _, sizeValue := range TransportSizeValues {
+		if sizeValue.Supported_S7_300() == value {
+			return sizeValue, nil
+		}
+	}
+	return 0, errors.Errorf("enum for %v not found", value)
+}
+
 func (e TransportSize) Supported_LOGO() bool {
 	switch e {
 	case 0x01:
@@ -330,6 +341,15 @@ func (e TransportSize) Supported_LOGO() bool {
 	}
 }
 
+func TransportSizeFirstEnumForFieldSupported_LOGO(value bool) (TransportSize, error) {
+	for _, sizeValue := range TransportSizeValues {
+		if sizeValue.Supported_LOGO() == value {
+			return sizeValue, nil
+		}
+	}
+	return 0, errors.Errorf("enum for %v not found", value)
+}
+
 func (e TransportSize) Code() uint8 {
 	switch e {
 	case 0x01:
@@ -443,6 +463,15 @@ func (e TransportSize) Code() uint8 {
 	}
 }
 
+func TransportSizeFirstEnumForFieldCode(value uint8) (TransportSize, error) {
+	for _, sizeValue := range TransportSizeValues {
+		if sizeValue.Code() == value {
+			return sizeValue, nil
+		}
+	}
+	return 0, errors.Errorf("enum for %v not found", value)
+}
+
 func (e TransportSize) SizeInBytes() uint8 {
 	switch e {
 	case 0x01:
@@ -556,6 +585,15 @@ func (e TransportSize) SizeInBytes() uint8 {
 	}
 }
 
+func TransportSizeFirstEnumForFieldSizeInBytes(value uint8) (TransportSize, error) {
+	for _, sizeValue := range TransportSizeValues {
+		if sizeValue.SizeInBytes() == value {
+			return sizeValue, nil
+		}
+	}
+	return 0, errors.Errorf("enum for %v not found", value)
+}
+
 func (e TransportSize) Supported_S7_400() bool {
 	switch e {
 	case 0x01:
@@ -669,6 +707,15 @@ func (e TransportSize) Supported_S7_400() bool {
 	}
 }
 
+func TransportSizeFirstEnumForFieldSupported_S7_400(value bool) (TransportSize, error) {
+	for _, sizeValue := range TransportSizeValues {
+		if sizeValue.Supported_S7_400() == value {
+			return sizeValue, nil
+		}
+	}
+	return 0, errors.Errorf("enum for %v not found", value)
+}
+
 func (e TransportSize) Supported_S7_1200() bool {
 	switch e {
 	case 0x01:
@@ -782,6 +829,15 @@ func (e TransportSize) Supported_S7_1200() bool {
 	}
 }
 
+func TransportSizeFirstEnumForFieldSupported_S7_1200(value bool) (TransportSize, error) {
+	for _, sizeValue := range TransportSizeValues {
+		if sizeValue.Supported_S7_1200() == value {
+			return sizeValue, nil
+		}
+	}
+	return 0, errors.Errorf("enum for %v not found", value)
+}
+
 func (e TransportSize) ShortName() uint8 {
 	switch e {
 	case 0x01:
@@ -895,6 +951,15 @@ func (e TransportSize) ShortName() uint8 {
 	}
 }
 
+func TransportSizeFirstEnumForFieldShortName(value uint8) (TransportSize, error) {
+	for _, sizeValue := range TransportSizeValues {
+		if sizeValue.ShortName() == value {
+			return sizeValue, nil
+		}
+	}
+	return 0, errors.Errorf("enum for %v not found", value)
+}
+
 func (e TransportSize) Supported_S7_1500() bool {
 	switch e {
 	case 0x01:
@@ -1008,6 +1073,15 @@ func (e TransportSize) Supported_S7_1500() bool {
 	}
 }
 
+func TransportSizeFirstEnumForFieldSupported_S7_1500(value bool) (TransportSize, error) {
+	for _, sizeValue := range TransportSizeValues {
+		if sizeValue.Supported_S7_1500() == value {
+			return sizeValue, nil
+		}
+	}
+	return 0, errors.Errorf("enum for %v not found", value)
+}
+
 func (e TransportSize) DataTransportSize() DataTransportSize {
 	switch e {
 	case 0x01:
@@ -1121,6 +1195,15 @@ func (e TransportSize) DataTransportSize() DataTransportSize {
 	}
 }
 
+func TransportSizeFirstEnumForFieldDataTransportSize(value DataTransportSize) (TransportSize, error) {
+	for _, sizeValue := range TransportSizeValues {
+		if sizeValue.DataTransportSize() == value {
+			return sizeValue, nil
+		}
+	}
+	return 0, errors.Errorf("enum for %v not found", value)
+}
+
 func (e TransportSize) BaseType() TransportSize {
 	switch e {
 	case 0x01:
@@ -1234,6 +1317,15 @@ func (e TransportSize) BaseType() TransportSize {
 	}
 }
 
+func TransportSizeFirstEnumForFieldBaseType(value TransportSize) (TransportSize, error) {
+	for _, sizeValue := range TransportSizeValues {
+		if sizeValue.BaseType() == value {
+			return sizeValue, nil
+		}
+	}
+	return 0, errors.Errorf("enum for %v not found", value)
+}
+
 func (e TransportSize) DataProtocolId() string {
 	switch e {
 	case 0x01:
@@ -1346,6 +1438,15 @@ func (e TransportSize) DataProtocolId() string {
 		}
 	}
 }
+
+func TransportSizeFirstEnumForFieldDataProtocolId(value string) (TransportSize, error) {
+	for _, sizeValue := range TransportSizeValues {
+		if sizeValue.DataProtocolId() == value {
+			return sizeValue, nil
+		}
+	}
+	return 0, errors.Errorf("enum for %v not found", value)
+}
 func TransportSizeByValue(value int8) TransportSize {
 	switch value {
 	case 0x01:
diff --git a/plc4go/internal/plc4go/s7/s7Io_test.go b/plc4go/internal/plc4go/s7/s7Io_test.go
index 2983573..77efbb2 100644
--- a/plc4go/internal/plc4go/s7/s7Io_test.go
+++ b/plc4go/internal/plc4go/s7/s7Io_test.go
@@ -383,6 +383,471 @@ func TestS7MessageBytes(t *testing.T) {
 20|00 00 04 01 ff 03 00 01 01    '......... '
 `,
 		},
+		{
+			name: "TPKT Packet with write var request data",
+			args: args{
+				debuggable: model.NewTPKTPacket(
+					model.NewCOTPPacketData(
+						false,
+						13,
+						[]*model.COTPParameter{model.NewCOTPParameterTpduSize(model.COTPTpduSize_SIZE_4096)},
+						model.NewS7MessageRequest(
+							13,
+							model.NewS7ParameterWriteVarRequest([]*model.S7VarRequestParameterItem{
+								model.NewS7VarRequestParameterItemAddress(model.NewS7AddressAny(
+									model.TransportSize_BYTE,
+									64,
+									13,
+									model.MemoryArea_INPUTS,
+									0,
+									0,
+								)),
+							}),
+							model.NewS7PayloadWriteVarRequest([]*model.S7VarPayloadDataItem{
+								model.NewS7VarPayloadDataItem(
+									model.DataTransportErrorCode_OK,
+									model.DataTransportSize_BYTE_WORD_DWORD,
+									[]byte{
+										0xAF, 0xFE, 0xAF, 0xFE, 0xAF, 0xFE, 0xAF, 0xFE,
+										0xAF, 0xFE, 0xAF, 0xFE, 0xAF, 0xFE, 0xAF, 0xFE,
+										0xAF, 0xFE, 0xAF, 0xFE, 0xAF, 0xFE, 0xAF, 0xFE,
+										0xAF, 0xFE, 0xAF, 0xFE, 0xAF, 0xFE, 0xAF, 0xFE,
+										0xAF, 0xFE, 0xAF, 0xFE, 0xAF, 0xFE, 0xAF, 0xFE,
+										0xAF, 0xFE, 0xAF, 0xFE, 0xAF, 0xFE, 0xAF, 0xFE,
+										0xAF, 0xFE, 0xAF, 0xFE, 0xAF, 0xFE, 0xAF, 0xFE,
+										0xAF, 0xFE, 0xAF, 0xFE, 0xAF, 0xFE, 0xAF, 0xFE,
+									},
+								),
+							}),
+						),
+					),
+				),
+			},
+			wantString: `
+TBD
+`,
+			wantStringSerialized: `
+╔═TPKTPacket═══════════════════════════════════════════════════════════════════════════════════════════════════════╗
+║╔═protocolId╗╔═reserved╗╔═len══════╗                                                                              ║
+║║  0x03 3   ║║ 0x00 0  ║║0x0066 102║                                                                              ║
+║╚═══════════╝╚═════════╝╚══════════╝                                                                              ║
+║╔═payload════════════════════════════════════════════════════════════════════════════════════════════════════════╗║
+║║╔═COTPPacket═══════════════════════════════════════════════════════════════════════════════════════════════════╗║║
+║║║╔═headerLength╗╔═tpduCode╗╔═COTPPacketData═════╗╔═parameters═════════════════════════════════════════════════╗║║║
+║║║║   0x05 5    ║║0xf0 240 ║║╔═eot════╗╔═tpduRef╗║║╔═COTPParameter════════════════════════════════════════════╗║║║║
+║║║╚═════════════╝╚═════════╝║║b0 false║║ 0xd 13 ║║║║╔═parameterType╗╔═parameterLength╗╔═COTPParameterTpduSize╗║║║║║
+║║║                          ║╚════════╝╚════════╝║║║║   0xc0 192   ║║     0x01 1     ║║╔═tpduSize══════════╗ ║║║║║║
+║║║                          ╚════════════════════╝║║╚══════════════╝╚════════════════╝║║╔═COTPTpduSize════╗║ ║║║║║║
+║║║                                                ║║                                  ║║║0x0c 12 SIZE_4096║║ ║║║║║║
+║║║                                                ║║                                  ║║╚═════════════════╝║ ║║║║║║
+║║║                                                ║║                                  ║╚═══════════════════╝ ║║║║║║
+║║║                                                ║║                                  ╚══════════════════════╝║║║║║
+║║║                                                ║╚══════════════════════════════════════════════════════════╝║║║║
+║║║                                                ╚════════════════════════════════════════════════════════════╝║║║
+║║║╔═S7Message══════════════════════════════════════════════════════════════════════════════════════════════════╗║║║
+║║║║╔═protocolId╗╔═messageType╗╔═reserved╗╔═tpduReference╗╔═parameterLength╗╔═payloadLength╗╔═S7MessageRequest╗ ║║║║
+║║║║║  0x32 50  ║║   0x01 1   ║║0x0000 0 ║║  0x000d 13   ║║   0x000e 14    ║║  0x0044 68   ║║                 ║ ║║║║
+║║║║╚═══════════╝╚════════════╝╚═════════╝╚══════════════╝╚════════════════╝╚══════════════╝╚═════════════════╝ ║║║║
+║║║║╔═S7Parameter══════════════════════════════════════════════════════════════════════════════════════════════╗║║║║
+║║║║║╔═parameterType╗                                                                                          ║║║║║
+║║║║║║    0x05 5    ║                                                                                          ║║║║║
+║║║║║╚══════════════╝                                                                                          ║║║║║
+║║║║║╔═S7ParameterWriteVarRequest═════════════════════════════════════════════════════════════════════════════╗║║║║║
+║║║║║║╔═numItems╗                                                                                             ║║║║║║
+║║║║║║║ 0x01 1  ║                                                                                             ║║║║║║
+║║║║║║╚═════════╝                                                                                             ║║║║║║
+║║║║║║╔═items════════════════════════════════════════════════════════════════════════════════════════════════╗║║║║║║
+║║║║║║║╔═S7VarRequestParameterItem══════════════════════════════════════════════════════════════════════════╗║║║║║║║
+║║║║║║║║╔═itemType╗                                                                                         ║║║║║║║║
+║║║║║║║║║ 0x12 18 ║                                                                                         ║║║║║║║║
+║║║║║║║║╚═════════╝                                                                                         ║║║║║║║║
+║║║║║║║║╔═S7VarRequestParameterItemAddress═════════════════════════════════════════════════════════════════╗║║║║║║║║
+║║║║║║║║║╔═itemLength╗                                                                                     ║║║║║║║║║
+║║║║║║║║║║  0x0a 10  ║                                                                                     ║║║║║║║║║
+║║║║║║║║║╚═══════════╝                                                                                     ║║║║║║║║║
+║║║║║║║║║╔═address════════════════════════════════════════════════════════════════════════════════════════╗║║║║║║║║║
+║║║║║║║║║║╔═S7Address════════════════════════════════════════════════════════════════════════════════════╗║║║║║║║║║║
+║║║║║║║║║║║╔═addressType╗                                                                                ║║║║║║║║║║║
+║║║║║║║║║║║║  0x10 16   ║                                                                                ║║║║║║║║║║║
+║║║║║║║║║║║╚════════════╝                                                                                ║║║║║║║║║║║
+║║║║║║║║║║║╔═S7AddressAny═══════════════════════════════════════════════════════════════════════════════╗║║║║║║║║║║║
+║║║║║║║║║║║║╔═transportSize══╗╔═numberOfElements╗╔═dbNumber╗╔═area════════════╗╔═reserved╗╔═byteAddress╗║║║║║║║║║║║║
+║║║║║║║║║║║║║╔═TransportSize╗║║    0x0040 64    ║║0x000d 13║║╔═MemoryArea════╗║║  0x0 0  ║║  0x0000 0  ║║║║║║║║║║║║║
+║║║║║║║║║║║║║║ 0x02 2 BYTE  ║║╚═════════════════╝╚═════════╝║║0x81 129 INPUTS║║╚═════════╝╚════════════╝║║║║║║║║║║║║
+║║║║║║║║║║║║║╚══════════════╝║                              ║╚═══════════════╝║                         ║║║║║║║║║║║║
+║║║║║║║║║║║║╚════════════════╝                              ╚═════════════════╝                         ║║║║║║║║║║║║
+║║║║║║║║║║║║╔═bitAddress╗                                                                               ║║║║║║║║║║║║
+║║║║║║║║║║║║║   0x0 0   ║                                                                               ║║║║║║║║║║║║
+║║║║║║║║║║║║╚═══════════╝                                                                               ║║║║║║║║║║║║
+║║║║║║║║║║║╚════════════════════════════════════════════════════════════════════════════════════════════╝║║║║║║║║║║║
+║║║║║║║║║║╚══════════════════════════════════════════════════════════════════════════════════════════════╝║║║║║║║║║║
+║║║║║║║║║╚════════════════════════════════════════════════════════════════════════════════════════════════╝║║║║║║║║║
+║║║║║║║║╚══════════════════════════════════════════════════════════════════════════════════════════════════╝║║║║║║║║
+║║║║║║║╚════════════════════════════════════════════════════════════════════════════════════════════════════╝║║║║║║║
+║║║║║║╚══════════════════════════════════════════════════════════════════════════════════════════════════════╝║║║║║║
+║║║║║╚════════════════════════════════════════════════════════════════════════════════════════════════════════╝║║║║║
+║║║║╚══════════════════════════════════════════════════════════════════════════════════════════════════════════╝║║║║
+║║║║╔═S7Payload══════════════════════════════════════════════════════════════╗                                  ║║║║
+║║║║║╔═S7PayloadWriteVarRequest═════════════════════════════════════════════╗║                                  ║║║║
+║║║║║║╔═items══════════════════════════════════════════════════════════════╗║║                                  ║║║║
+║║║║║║║╔═S7VarPayloadDataItem═════════════════════════════════════════════╗║║║                                  ║║║║
+║║║║║║║║╔═returnCode══════════════╗╔═transportSize══════════╗╔═dataLength╗║║║║                                  ║║║║
+║║║║║║║║║╔═DataTransportErrorCode╗║║╔═DataTransportSize════╗║║0x0200 512 ║║║║║                                  ║║║║
+║║║║║║║║║║      0xff 255 OK      ║║║║0x04 4 BYTE_WORD_DWORD║║╚═══════════╝║║║║                                  ║║║║
+║║║║║║║║║╚═══════════════════════╝║║╚══════════════════════╝║             ║║║║                                  ║║║║
+║║║║║║║║╚═════════════════════════╝╚════════════════════════╝             ║║║║                                  ║║║║
+║║║║║║║║╔═data════════════════════════════════════════╗╔═padding╗         ║║║║                                  ║║║║
+║║║║║║║║║00|af fe af fe af fe af fe af fe '..........'║║        ║         ║║║║                                  ║║║║
+║║║║║║║║║10|af fe af fe af fe af fe af fe '..........'║╚════════╝         ║║║║                                  ║║║║
+║║║║║║║║║20|af fe af fe af fe af fe af fe '..........'║                   ║║║║                                  ║║║║
+║║║║║║║║║30|af fe af fe af fe af fe af fe '..........'║                   ║║║║                                  ║║║║
+║║║║║║║║║40|af fe af fe af fe af fe af fe '..........'║                   ║║║║                                  ║║║║
+║║║║║║║║║50|af fe af fe af fe af fe af fe '..........'║                   ║║║║                                  ║║║║
+║║║║║║║║║60|af fe af fe                   '....      '║                   ║║║║                                  ║║║║
+║║║║║║║║╚═════════════════════════════════════════════╝                   ║║║║                                  ║║║║
+║║║║║║║╚══════════════════════════════════════════════════════════════════╝║║║                                  ║║║║
+║║║║║║╚════════════════════════════════════════════════════════════════════╝║║                                  ║║║║
+║║║║║╚══════════════════════════════════════════════════════════════════════╝║                                  ║║║║
+║║║║╚════════════════════════════════════════════════════════════════════════╝                                  ║║║║
+║║║╚════════════════════════════════════════════════════════════════════════════════════════════════════════════╝║║║
+║║╚══════════════════════════════════════════════════════════════════════════════════════════════════════════════╝║║
+║╚════════════════════════════════════════════════════════════════════════════════════════════════════════════════╝║
+╚══════════════════════════════════════════════════════════════════════════════════════════════════════════════════╝
+`,
+			wantStringSerializedCompact: `
+╔═TPKTPacket═════════════════════════════════════════════════════════════════════════════════════════════════╗
+║╔═protocolId╗╔═reserved╗╔═len══════╗                                                                        ║
+║║  0x03 3   ║║ 0x00 0  ║║0x0066 102║                                                                        ║
+║╚═══════════╝╚═════════╝╚══════════╝                                                                        ║
+║╔═payload/COTPPacket═══════════════════════════════════════════════════════════════════════════════════════╗║
+║║╔═headerLength╗╔═tpduCode╗╔═COTPPacketData═════╗                                                          ║║
+║║║   0x05 5    ║║0xf0 240 ║║╔═eot════╗╔═tpduRef╗║                                                          ║║
+║║╚═════════════╝╚═════════╝║║b0 false║║ 0xd 13 ║║                                                          ║║
+║║                          ║╚════════╝╚════════╝║                                                          ║║
+║║                          ╚════════════════════╝                                                          ║║
+║║╔═parameters/COTPParameter════════════════════════════════════════════════════════════╗                   ║║
+║║║╔═parameterType╗╔═parameterLength╗╔═COTPParameterTpduSize/tpduSize/COTPTpduSize═════╗║                   ║║
+║║║║   0xc0 192   ║║     0x01 1     ║║                0x0c 12 SIZE_4096                ║║                   ║║
+║║║╚══════════════╝╚════════════════╝╚═════════════════════════════════════════════════╝║                   ║║
+║║╚═════════════════════════════════════════════════════════════════════════════════════╝                   ║║
+║║╔═S7Message══════════════════════════════════════════════════════════════════════════════════════════════╗║║
+║║║╔═protocolId╗╔═messageType╗╔═reserved╗╔═tpduReference╗╔═parameterLength╗╔═payloadLength╗                ║║║
+║║║║  0x32 50  ║║   0x01 1   ║║0x0000 0 ║║  0x000d 13   ║║   0x000e 14    ║║  0x0044 68   ║                ║║║
+║║║╚═══════════╝╚════════════╝╚═════════╝╚══════════════╝╚════════════════╝╚══════════════╝                ║║║
+║║║╔═S7Parameter══════════════════════════════════════════════════════════════════════════════════════════╗║║║
+║║║║╔═parameterType╗                                                                                      ║║║║
+║║║║║    0x05 5    ║                                                                                      ║║║║
+║║║║╚══════════════╝                                                                                      ║║║║
+║║║║╔═S7ParameterWriteVarRequest═════════════════════════════════════════════════════════════════════════╗║║║║
+║║║║║╔═numItems╗                                                                                         ║║║║║
+║║║║║║ 0x01 1  ║                                                                                         ║║║║║
+║║║║║╚═════════╝                                                                                         ║║║║║
+║║║║║╔═items/S7VarRequestParameterItem══════════════════════════════════════════════════════════════════╗║║║║║
+║║║║║║╔═itemType╗                                                                                       ║║║║║║
+║║║║║║║ 0x12 18 ║                                                                                       ║║║║║║
+║║║║║║╚═════════╝                                                                                       ║║║║║║
+║║║║║║╔═S7VarRequestParameterItemAddress═══════════════════════════════════════════════════════════════╗║║║║║║
+║║║║║║║╔═itemLength╗                                                                                   ║║║║║║║
+║║║║║║║║  0x0a 10  ║                                                                                   ║║║║║║║
+║║║║║║║╚═══════════╝                                                                                   ║║║║║║║
+║║║║║║║╔═address/S7Address════════════════════════════════════════════════════════════════════════════╗║║║║║║║
+║║║║║║║║╔═addressType╗                                                                                ║║║║║║║║
+║║║║║║║║║  0x10 16   ║                                                                                ║║║║║║║║
+║║║║║║║║╚════════════╝                                                                                ║║║║║║║║
+║║║║║║║║╔═S7AddressAny═══════════════════════════════════════════════════════════════════════════════╗║║║║║║║║
+║║║║║║║║║╔═transportSize/TransportSize═══╗╔═numberOfElements╗╔═dbNumber╗╔═area/MemoryArea╗╔═reserved╗║║║║║║║║║
+║║║║║║║║║║          0x02 2 BYTE          ║║    0x0040 64    ║║0x000d 13║║0x81 129 INPUTS ║║  0x0 0  ║║║║║║║║║║
+║║║║║║║║║╚═══════════════════════════════╝╚═════════════════╝╚═════════╝╚════════════════╝╚═════════╝║║║║║║║║║
+║║║║║║║║║╔═byteAddress╗╔═bitAddress╗                                                                 ║║║║║║║║║
+║║║║║║║║║║  0x0000 0  ║║   0x0 0   ║                                                                 ║║║║║║║║║
+║║║║║║║║║╚════════════╝╚═══════════╝                                                                 ║║║║║║║║║
+║║║║║║║║╚════════════════════════════════════════════════════════════════════════════════════════════╝║║║║║║║║
+║║║║║║║╚══════════════════════════════════════════════════════════════════════════════════════════════╝║║║║║║║
+║║║║║║╚════════════════════════════════════════════════════════════════════════════════════════════════╝║║║║║║
+║║║║║╚══════════════════════════════════════════════════════════════════════════════════════════════════╝║║║║║
+║║║║╚════════════════════════════════════════════════════════════════════════════════════════════════════╝║║║║
+║║║╚══════════════════════════════════════════════════════════════════════════════════════════════════════╝║║║
+║║║╔═S7Payload/S7PayloadWriteVarRequest/items/S7VarPayloadDataItem═════════════════════════════════╗       ║║║
+║║║║╔═returnCode/DataTransportErrorCode════════════╗╔═transportSize/DataTransportSize╗╔═dataLength╗║       ║║║
+║║║║║                 0xff 255 OK                  ║║     0x04 4 BYTE_WORD_DWORD     ║║0x0200 512 ║║       ║║║
+║║║║╚══════════════════════════════════════════════╝╚════════════════════════════════╝╚═══════════╝║       ║║║
+║║║║╔═data════════════════════════════════════════╗                                                ║       ║║║
+║║║║║00|af fe af fe af fe af fe af fe '..........'║                                                ║       ║║║
+║║║║║10|af fe af fe af fe af fe af fe '..........'║                                                ║       ║║║
+║║║║║20|af fe af fe af fe af fe af fe '..........'║                                                ║       ║║║
+║║║║║30|af fe af fe af fe af fe af fe '..........'║                                                ║       ║║║
+║║║║║40|af fe af fe af fe af fe af fe '..........'║                                                ║       ║║║
+║║║║║50|af fe af fe af fe af fe af fe '..........'║                                                ║       ║║║
+║║║║║60|af fe af fe                   '....      '║                                                ║       ║║║
+║║║║╚═════════════════════════════════════════════╝                                                ║       ║║║
+║║║╚═══════════════════════════════════════════════════════════════════════════════════════════════╝       ║║║
+║║╚════════════════════════════════════════════════════════════════════════════════════════════════════════╝║║
+║╚══════════════════════════════════════════════════════════════════════════════════════════════════════════╝║
+╚════════════════════════════════════════════════════════════════════════════════════════════════════════════╝
+`,
+			wantStringXml: `
+<TPKTPacket>
+  <protocolId dataType="uint" bitLength="8">3</protocolId>
+  <reserved dataType="uint" bitLength="8">0</reserved>
+  <len dataType="uint" bitLength="16">102</len>
+  <payload>
+    <COTPPacket>
+      <headerLength dataType="uint" bitLength="8">5</headerLength>
+      <tpduCode dataType="uint" bitLength="8">240</tpduCode>
+      <COTPPacketData>
+        <eot dataType="bit" bitLength="1">false</eot>
+        <tpduRef dataType="uint" bitLength="7">13</tpduRef>
+      </COTPPacketData>
+      <parameters isList="true">
+        <COTPParameter>
+          <parameterType dataType="uint" bitLength="8">192</parameterType>
+          <parameterLength dataType="uint" bitLength="8">1</parameterLength>
+          <COTPParameterTpduSize>
+            <tpduSize>
+              <COTPTpduSize dataType="int" bitLength="8" stringRepresentation="SIZE_4096">12</COTPTpduSize>
+            </tpduSize>
+          </COTPParameterTpduSize>
+        </COTPParameter>
+      </parameters>
+      <S7Message>
+        <protocolId dataType="uint" bitLength="8">50</protocolId>
+        <messageType dataType="uint" bitLength="8">1</messageType>
+        <reserved dataType="uint" bitLength="16">0</reserved>
+        <tpduReference dataType="uint" bitLength="16">13</tpduReference>
+        <parameterLength dataType="uint" bitLength="16">14</parameterLength>
+        <payloadLength dataType="uint" bitLength="16">68</payloadLength>
+        <S7MessageRequest></S7MessageRequest>
+        <S7Parameter>
+          <parameterType dataType="uint" bitLength="8">5</parameterType>
+          <S7ParameterWriteVarRequest>
+            <numItems dataType="uint" bitLength="8">1</numItems>
+            <items isList="true">
+              <S7VarRequestParameterItem>
+                <itemType dataType="uint" bitLength="8">18</itemType>
+                <S7VarRequestParameterItemAddress>
+                  <itemLength dataType="uint" bitLength="8">10</itemLength>
+                  <address>
+                    <S7Address>
+                      <addressType dataType="uint" bitLength="8">16</addressType>
+                      <S7AddressAny>
+                        <transportSize>
+                          <TransportSize dataType="uint" bitLength="8" stringRepresentation="BYTE">2</TransportSize>
+                        </transportSize>
+                        <numberOfElements dataType="uint" bitLength="16">64</numberOfElements>
+                        <dbNumber dataType="uint" bitLength="16">13</dbNumber>
+                        <area>
+                          <MemoryArea dataType="uint" bitLength="8" stringRepresentation="INPUTS">129</MemoryArea>
+                        </area>
+                        <reserved dataType="uint" bitLength="5">0</reserved>
+                        <byteAddress dataType="uint" bitLength="16">0</byteAddress>
+                        <bitAddress dataType="uint" bitLength="3">0</bitAddress>
+                      </S7AddressAny>
+                    </S7Address>
+                  </address>
+                </S7VarRequestParameterItemAddress>
+              </S7VarRequestParameterItem>
+            </items>
+          </S7ParameterWriteVarRequest>
+        </S7Parameter>
+        <S7Payload>
+          <S7PayloadWriteVarRequest>
+            <items isList="true">
+              <S7VarPayloadDataItem>
+                <returnCode>
+                  <DataTransportErrorCode dataType="uint" bitLength="8" stringRepresentation="OK">255</DataTransportErrorCode>
+                </returnCode>
+                <transportSize>
+                  <DataTransportSize dataType="uint" bitLength="8" stringRepresentation="BYTE_WORD_DWORD">4</DataTransportSize>
+                </transportSize>
+                <dataLength dataType="uint" bitLength="16">512</dataLength>
+                <data dataType="byte" bitLength="512">0xaffeaffeaffeaffeaffeaffeaffeaffeaffeaffeaffeaffeaffeaffeaffeaffeaffeaffeaffeaffeaffeaffeaffeaffeaffeaffeaffeaffeaffeaffeaffeaffe</data>
+                <padding isList="true"></padding>
+              </S7VarPayloadDataItem>
+            </items>
+          </S7PayloadWriteVarRequest>
+        </S7Payload>
+      </S7Message>
+    </COTPPacket>
+  </payload>
+</TPKTPacket>
+`,
+			wantStringJson: `
+{
+  "TPKTPacket": {
+    "len": 102,
+    "len__plc4x_bitLength": 16,
+    "len__plc4x_dataType": "uint",
+    "payload": {
+      "COTPPacket": {
+        "COTPPacketData": {
+          "eot": false,
+          "eot__plc4x_bitLength": 1,
+          "eot__plc4x_dataType": "bit",
+          "tpduRef": 13,
+          "tpduRef__plc4x_bitLength": 7,
+          "tpduRef__plc4x_dataType": "uint"
+        },
+        "S7Message": {
+          "S7MessageRequest": {},
+          "S7Parameter": {
+            "S7ParameterWriteVarRequest": {
+              "items": [
+                {
+                  "S7VarRequestParameterItem": {
+                    "S7VarRequestParameterItemAddress": {
+                      "address": {
+                        "S7Address": {
+                          "S7AddressAny": {
+                            "area": {
+                              "MemoryArea": 129,
+                              "MemoryArea__plc4x_bitLength": 8,
+                              "MemoryArea__plc4x_dataType": "uint",
+                              "MemoryArea__plc4x_stringRepresentation": "INPUTS"
+                            },
+                            "bitAddress": 0,
+                            "bitAddress__plc4x_bitLength": 3,
+                            "bitAddress__plc4x_dataType": "uint",
+                            "byteAddress": 0,
+                            "byteAddress__plc4x_bitLength": 16,
+                            "byteAddress__plc4x_dataType": "uint",
+                            "dbNumber": 13,
+                            "dbNumber__plc4x_bitLength": 16,
+                            "dbNumber__plc4x_dataType": "uint",
+                            "numberOfElements": 64,
+                            "numberOfElements__plc4x_bitLength": 16,
+                            "numberOfElements__plc4x_dataType": "uint",
+                            "reserved": 0,
+                            "reserved__plc4x_bitLength": 5,
+                            "reserved__plc4x_dataType": "uint",
+                            "transportSize": {
+                              "TransportSize": 2,
+                              "TransportSize__plc4x_bitLength": 8,
+                              "TransportSize__plc4x_dataType": "uint",
+                              "TransportSize__plc4x_stringRepresentation": "BYTE"
+                            }
+                          },
+                          "addressType": 16,
+                          "addressType__plc4x_bitLength": 8,
+                          "addressType__plc4x_dataType": "uint"
+                        }
+                      },
+                      "itemLength": 10,
+                      "itemLength__plc4x_bitLength": 8,
+                      "itemLength__plc4x_dataType": "uint"
+                    },
+                    "itemType": 18,
+                    "itemType__plc4x_bitLength": 8,
+                    "itemType__plc4x_dataType": "uint"
+                  }
+                }
+              ],
+              "numItems": 1,
+              "numItems__plc4x_bitLength": 8,
+              "numItems__plc4x_dataType": "uint"
+            },
+            "parameterType": 5,
+            "parameterType__plc4x_bitLength": 8,
+            "parameterType__plc4x_dataType": "uint"
+          },
+          "S7Payload": {
+            "S7PayloadWriteVarRequest": {
+              "items": [
+                {
+                  "S7VarPayloadDataItem": {
+                    "data": "0xaffeaffeaffeaffeaffeaffeaffeaffeaffeaffeaffeaffeaffeaffeaffeaffeaffeaffeaffeaffeaffeaffeaffeaffeaffeaffeaffeaffeaffeaffeaffeaffe",
+                    "dataLength": 512,
+                    "dataLength__plc4x_bitLength": 16,
+                    "dataLength__plc4x_dataType": "uint",
+                    "data__plc4x_bitLength": 512,
+                    "data__plc4x_dataType": "byte",
+                    "padding": [],
+                    "returnCode": {
+                      "DataTransportErrorCode": 255,
+                      "DataTransportErrorCode__plc4x_bitLength": 8,
+                      "DataTransportErrorCode__plc4x_dataType": "uint",
+                      "DataTransportErrorCode__plc4x_stringRepresentation": "OK"
+                    },
+                    "transportSize": {
+                      "DataTransportSize": 4,
+                      "DataTransportSize__plc4x_bitLength": 8,
+                      "DataTransportSize__plc4x_dataType": "uint",
+                      "DataTransportSize__plc4x_stringRepresentation": "BYTE_WORD_DWORD"
+                    }
+                  }
+                }
+              ]
+            }
+          },
+          "messageType": 1,
+          "messageType__plc4x_bitLength": 8,
+          "messageType__plc4x_dataType": "uint",
+          "parameterLength": 14,
+          "parameterLength__plc4x_bitLength": 16,
+          "parameterLength__plc4x_dataType": "uint",
+          "payloadLength": 68,
+          "payloadLength__plc4x_bitLength": 16,
+          "payloadLength__plc4x_dataType": "uint",
+          "protocolId": 50,
+          "protocolId__plc4x_bitLength": 8,
+          "protocolId__plc4x_dataType": "uint",
+          "reserved": 0,
+          "reserved__plc4x_bitLength": 16,
+          "reserved__plc4x_dataType": "uint",
+          "tpduReference": 13,
+          "tpduReference__plc4x_bitLength": 16,
+          "tpduReference__plc4x_dataType": "uint"
+        },
+        "headerLength": 5,
+        "headerLength__plc4x_bitLength": 8,
+        "headerLength__plc4x_dataType": "uint",
+        "parameters": [
+          {
+            "COTPParameter": {
+              "COTPParameterTpduSize": {
+                "tpduSize": {
+                  "COTPTpduSize": 12,
+                  "COTPTpduSize__plc4x_bitLength": 8,
+                  "COTPTpduSize__plc4x_dataType": "int",
+                  "COTPTpduSize__plc4x_stringRepresentation": "SIZE_4096"
+                }
+              },
+              "parameterLength": 1,
+              "parameterLength__plc4x_bitLength": 8,
+              "parameterLength__plc4x_dataType": "uint",
+              "parameterType": 192,
+              "parameterType__plc4x_bitLength": 8,
+              "parameterType__plc4x_dataType": "uint"
+            }
+          }
+        ],
+        "tpduCode": 240,
+        "tpduCode__plc4x_bitLength": 8,
+        "tpduCode__plc4x_dataType": "uint"
+      }
+    },
+    "protocolId": 3,
+    "protocolId__plc4x_bitLength": 8,
+    "protocolId__plc4x_dataType": "uint",
+    "reserved": 0,
+    "reserved__plc4x_bitLength": 8,
+    "reserved__plc4x_dataType": "uint"
+  }
+}
+`,
+			wantDump: `
+000|03 00 00 66 05 f0 0d c0 01 0c '...f......'
+010|32 01 00 00 00 0d 00 0e 00 44 '2........D'
+020|05 01 12 0a 10 02 00 40 00 0d '.......@..'
+030|81 00 00 00 ff 04 02 00 af fe '..........'
+040|af fe af fe af fe af fe af fe '..........'
+050|af fe af fe af fe af fe af fe '..........'
+060|af fe af fe af fe af fe af fe '..........'
+070|af fe af fe af fe af fe af fe '..........'
+080|af fe af fe af fe af fe af fe '..........'
+090|af fe af fe af fe af fe af fe '..........'
+100|af fe                         '..        '
+`,
+		},
 	}
 	for _, tt := range tests {
 		t.Run(tt.name, func(t *testing.T) {
@@ -465,7 +930,7 @@ func TestS7MessageBytes(t *testing.T) {
 					if err != nil {
 						t.Error(err)
 					} else {
-						t.Errorf("Roundtrip(json) = '\n%v\n', want '\n%v\n'", got, tt.wantDump)
+						t.Errorf("Roundtrip(json) = '\n%v\n', want '\n%v\n'", got, tt.args.debuggable)
 					}
 				}
 			})
diff --git a/plc4go/internal/plc4go/simulated/readwrite/model/SimulatedDataTypeSizes.go b/plc4go/internal/plc4go/simulated/readwrite/model/SimulatedDataTypeSizes.go
index e4cf955..b5a7171 100644
--- a/plc4go/internal/plc4go/simulated/readwrite/model/SimulatedDataTypeSizes.go
+++ b/plc4go/internal/plc4go/simulated/readwrite/model/SimulatedDataTypeSizes.go
@@ -21,6 +21,7 @@ package model
 
 import (
 	"github.com/apache/plc4x/plc4go/internal/plc4go/spi/utils"
+	"github.com/pkg/errors"
 )
 
 // Code generated by build-utils. DO NOT EDIT.
@@ -65,6 +66,7 @@ const (
 var SimulatedDataTypeSizesValues []SimulatedDataTypeSizes
 
 func init() {
+	_ = errors.New
 	SimulatedDataTypeSizesValues = []SimulatedDataTypeSizes{
 		SimulatedDataTypeSizes_BOOL,
 		SimulatedDataTypeSizes_BYTE,
@@ -212,6 +214,15 @@ func (e SimulatedDataTypeSizes) DataTypeSize() uint8 {
 		}
 	}
 }
+
+func SimulatedDataTypeSizesFirstEnumForFieldDataTypeSize(value uint8) (SimulatedDataTypeSizes, error) {
+	for _, sizeValue := range SimulatedDataTypeSizesValues {
+		if sizeValue.DataTypeSize() == value {
+			return sizeValue, nil
+		}
+	}
+	return 0, errors.Errorf("enum for %v not found", value)
+}
 func SimulatedDataTypeSizesByValue(value uint8) SimulatedDataTypeSizes {
 	switch value {
 	case 1: