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 2022/07/12 19:20:41 UTC

[plc4x] branch develop updated: feat(cbus): added IdentifyReplyCommandOutputUnitSummary

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 6d304e7e0 feat(cbus): added IdentifyReplyCommandOutputUnitSummary
6d304e7e0 is described below

commit 6d304e7e02fd2254f8c36dbd5d99b63c4d5d3071
Author: Sebastian Rühl <sr...@apache.org>
AuthorDate: Tue Jul 12 21:20:35 2022 +0200

    feat(cbus): added IdentifyReplyCommandOutputUnitSummary
---
 plc4go/protocols/cbus/readwrite/ParserHelper.go    |   8 +-
 plc4go/protocols/cbus/readwrite/XmlParserHelper.go |   9 +-
 .../cbus/readwrite/model/CALDataIdentifyReply.go   |   2 +-
 .../cbus/readwrite/model/IdentifyReplyCommand.go   |  45 +-
 .../IdentifyReplyCommandCurrentSenseLevels.go      |  10 +-
 .../model/IdentifyReplyCommandDSIStatus.go         |  10 +-
 .../readwrite/model/IdentifyReplyCommandDelays.go  |  10 +-
 ...dentifyReplyCommandExtendedDiagnosticSummary.go | 466 +++++++++++----------
 .../model/IdentifyReplyCommandFirmwareSummary.go   |  16 +-
 .../model/IdentifyReplyCommandFirmwareVersion.go   |  12 +-
 .../IdentifyReplyCommandGAVPhysicalAddresses.go    |  12 +-
 .../model/IdentifyReplyCommandGAVValuesCurrent.go  |  12 +-
 .../model/IdentifyReplyCommandGAVValuesStored.go   |  12 +-
 .../model/IdentifyReplyCommandLogicalAssignment.go |  10 +-
 .../model/IdentifyReplyCommandManufacturer.go      |  12 +-
 .../model/IdentifyReplyCommandMaximumLevels.go     |  10 +-
 .../model/IdentifyReplyCommandMinimumLevels.go     |  10 +-
 .../IdentifyReplyCommandNetworkTerminalLevels.go   |  10 +-
 .../model/IdentifyReplyCommandNetworkVoltage.go    |  14 +-
 .../model/IdentifyReplyCommandOutputUnitSummary.go | 135 +++++-
 .../model/IdentifyReplyCommandTerminalLevels.go    |  10 +-
 .../readwrite/model/IdentifyReplyCommandType.go    |  12 +-
 .../model/IdentifyReplyCommandUnitSummary.go       | 325 ++++++++++++++
 .../internal/cbusanalyzer/analyzer.go              |   7 +-
 .../src/main/resources/protocols/cbus/c-bus.mspec  |  70 ++--
 25 files changed, 900 insertions(+), 349 deletions(-)

diff --git a/plc4go/protocols/cbus/readwrite/ParserHelper.go b/plc4go/protocols/cbus/readwrite/ParserHelper.go
index 6a3c6dcbe..ac04be750 100644
--- a/plc4go/protocols/cbus/readwrite/ParserHelper.go
+++ b/plc4go/protocols/cbus/readwrite/ParserHelper.go
@@ -88,9 +88,15 @@ func (m CbusParserHelper) Parse(typeName string, arguments []string, io utils.Re
 		return model.CBusCommandParse(io, cBusOptions)
 	case "IdentifyReplyCommand":
 		attribute, _ := model.AttributeByName(arguments[0])
-		return model.IdentifyReplyCommandParse(io, attribute)
+		numBytes, err := utils.StrToUint8(arguments[1])
+		if err != nil {
+			return nil, errors.Wrap(err, "Error parsing")
+		}
+		return model.IdentifyReplyCommandParse(io, attribute, numBytes)
 	case "CALDataOrSetParameter":
 		return model.CALDataOrSetParameterParse(io)
+	case "IdentifyReplyCommandUnitSummary":
+		return model.IdentifyReplyCommandUnitSummaryParse(io)
 	case "CBusConstants":
 		return model.CBusConstantsParse(io)
 	case "BridgeCount":
diff --git a/plc4go/protocols/cbus/readwrite/XmlParserHelper.go b/plc4go/protocols/cbus/readwrite/XmlParserHelper.go
index 22590809c..05f4f2aee 100644
--- a/plc4go/protocols/cbus/readwrite/XmlParserHelper.go
+++ b/plc4go/protocols/cbus/readwrite/XmlParserHelper.go
@@ -105,9 +105,16 @@ func (m CbusXmlParserHelper) Parse(typeName string, xmlString string, parserArgu
 		return model.CBusCommandParse(utils.NewXmlReadBuffer(strings.NewReader(xmlString)), cBusOptions)
 	case "IdentifyReplyCommand":
 		attribute, _ := model.AttributeByName(parserArguments[0])
-		return model.IdentifyReplyCommandParse(utils.NewXmlReadBuffer(strings.NewReader(xmlString)), attribute)
+		parsedUint1, err := strconv.ParseUint(parserArguments[1], 10, 5)
+		if err != nil {
+			return nil, err
+		}
+		numBytes := uint8(parsedUint1)
+		return model.IdentifyReplyCommandParse(utils.NewXmlReadBuffer(strings.NewReader(xmlString)), attribute, numBytes)
 	case "CALDataOrSetParameter":
 		return model.CALDataOrSetParameterParse(utils.NewXmlReadBuffer(strings.NewReader(xmlString)))
+	case "IdentifyReplyCommandUnitSummary":
+		return model.IdentifyReplyCommandUnitSummaryParse(utils.NewXmlReadBuffer(strings.NewReader(xmlString)))
 	case "CBusConstants":
 		return model.CBusConstantsParse(utils.NewXmlReadBuffer(strings.NewReader(xmlString)))
 	case "BridgeCount":
diff --git a/plc4go/protocols/cbus/readwrite/model/CALDataIdentifyReply.go b/plc4go/protocols/cbus/readwrite/model/CALDataIdentifyReply.go
index 5988db38f..599f8c807 100644
--- a/plc4go/protocols/cbus/readwrite/model/CALDataIdentifyReply.go
+++ b/plc4go/protocols/cbus/readwrite/model/CALDataIdentifyReply.go
@@ -160,7 +160,7 @@ func CALDataIdentifyReplyParse(readBuffer utils.ReadBuffer, requestContext Reque
 	if pullErr := readBuffer.PullContext("identifyReplyCommand"); pullErr != nil {
 		return nil, errors.Wrap(pullErr, "Error pulling for identifyReplyCommand")
 	}
-	_identifyReplyCommand, _identifyReplyCommandErr := IdentifyReplyCommandParse(readBuffer, Attribute(attribute))
+	_identifyReplyCommand, _identifyReplyCommandErr := IdentifyReplyCommandParse(readBuffer, Attribute(attribute), uint8(uint8(commandTypeContainer.NumBytes())-uint8(uint8(1))))
 	if _identifyReplyCommandErr != nil {
 		return nil, errors.Wrap(_identifyReplyCommandErr, "Error parsing 'identifyReplyCommand' field of CALDataIdentifyReply")
 	}
diff --git a/plc4go/protocols/cbus/readwrite/model/IdentifyReplyCommand.go b/plc4go/protocols/cbus/readwrite/model/IdentifyReplyCommand.go
index 153b57c24..0d8cb457d 100644
--- a/plc4go/protocols/cbus/readwrite/model/IdentifyReplyCommand.go
+++ b/plc4go/protocols/cbus/readwrite/model/IdentifyReplyCommand.go
@@ -44,6 +44,9 @@ type IdentifyReplyCommandExactly interface {
 // _IdentifyReplyCommand is the data-structure of this message
 type _IdentifyReplyCommand struct {
 	_IdentifyReplyCommandChildRequirements
+
+	// Arguments.
+	NumBytes uint8
 }
 
 type _IdentifyReplyCommandChildRequirements interface {
@@ -68,8 +71,8 @@ type IdentifyReplyCommandChild interface {
 }
 
 // NewIdentifyReplyCommand factory function for _IdentifyReplyCommand
-func NewIdentifyReplyCommand() *_IdentifyReplyCommand {
-	return &_IdentifyReplyCommand{}
+func NewIdentifyReplyCommand(numBytes uint8) *_IdentifyReplyCommand {
+	return &_IdentifyReplyCommand{NumBytes: numBytes}
 }
 
 // Deprecated: use the interface for direct cast
@@ -97,7 +100,7 @@ func (m *_IdentifyReplyCommand) GetLengthInBytes() uint16 {
 	return m.GetLengthInBits() / 8
 }
 
-func IdentifyReplyCommandParse(readBuffer utils.ReadBuffer, attribute Attribute) (IdentifyReplyCommand, error) {
+func IdentifyReplyCommandParse(readBuffer utils.ReadBuffer, attribute Attribute, numBytes uint8) (IdentifyReplyCommand, error) {
 	positionAware := readBuffer
 	_ = positionAware
 	if pullErr := readBuffer.PullContext("IdentifyReplyCommand"); pullErr != nil {
@@ -117,41 +120,41 @@ func IdentifyReplyCommandParse(readBuffer utils.ReadBuffer, attribute Attribute)
 	var typeSwitchError error
 	switch {
 	case attribute == Attribute_Manufacturer: // IdentifyReplyCommandManufacturer
-		_childTemp, typeSwitchError = IdentifyReplyCommandManufacturerParse(readBuffer, attribute)
+		_childTemp, typeSwitchError = IdentifyReplyCommandManufacturerParse(readBuffer, attribute, numBytes)
 	case attribute == Attribute_Type: // IdentifyReplyCommandType
-		_childTemp, typeSwitchError = IdentifyReplyCommandTypeParse(readBuffer, attribute)
+		_childTemp, typeSwitchError = IdentifyReplyCommandTypeParse(readBuffer, attribute, numBytes)
 	case attribute == Attribute_FirmwareVersion: // IdentifyReplyCommandFirmwareVersion
-		_childTemp, typeSwitchError = IdentifyReplyCommandFirmwareVersionParse(readBuffer, attribute)
+		_childTemp, typeSwitchError = IdentifyReplyCommandFirmwareVersionParse(readBuffer, attribute, numBytes)
 	case attribute == Attribute_Summary: // IdentifyReplyCommandFirmwareSummary
-		_childTemp, typeSwitchError = IdentifyReplyCommandFirmwareSummaryParse(readBuffer, attribute)
+		_childTemp, typeSwitchError = IdentifyReplyCommandFirmwareSummaryParse(readBuffer, attribute, numBytes)
 	case attribute == Attribute_ExtendedDiagnosticSummary: // IdentifyReplyCommandExtendedDiagnosticSummary
-		_childTemp, typeSwitchError = IdentifyReplyCommandExtendedDiagnosticSummaryParse(readBuffer, attribute)
+		_childTemp, typeSwitchError = IdentifyReplyCommandExtendedDiagnosticSummaryParse(readBuffer, attribute, numBytes)
 	case attribute == Attribute_NetworkTerminalLevels: // IdentifyReplyCommandNetworkTerminalLevels
-		_childTemp, typeSwitchError = IdentifyReplyCommandNetworkTerminalLevelsParse(readBuffer, attribute)
+		_childTemp, typeSwitchError = IdentifyReplyCommandNetworkTerminalLevelsParse(readBuffer, attribute, numBytes)
 	case attribute == Attribute_TerminalLevel: // IdentifyReplyCommandTerminalLevels
-		_childTemp, typeSwitchError = IdentifyReplyCommandTerminalLevelsParse(readBuffer, attribute)
+		_childTemp, typeSwitchError = IdentifyReplyCommandTerminalLevelsParse(readBuffer, attribute, numBytes)
 	case attribute == Attribute_NetworkVoltage: // IdentifyReplyCommandNetworkVoltage
-		_childTemp, typeSwitchError = IdentifyReplyCommandNetworkVoltageParse(readBuffer, attribute)
+		_childTemp, typeSwitchError = IdentifyReplyCommandNetworkVoltageParse(readBuffer, attribute, numBytes)
 	case attribute == Attribute_GAVValuesCurrent: // IdentifyReplyCommandGAVValuesCurrent
-		_childTemp, typeSwitchError = IdentifyReplyCommandGAVValuesCurrentParse(readBuffer, attribute)
+		_childTemp, typeSwitchError = IdentifyReplyCommandGAVValuesCurrentParse(readBuffer, attribute, numBytes)
 	case attribute == Attribute_GAVValuesStored: // IdentifyReplyCommandGAVValuesStored
-		_childTemp, typeSwitchError = IdentifyReplyCommandGAVValuesStoredParse(readBuffer, attribute)
+		_childTemp, typeSwitchError = IdentifyReplyCommandGAVValuesStoredParse(readBuffer, attribute, numBytes)
 	case attribute == Attribute_GAVPhysicalAddresses: // IdentifyReplyCommandGAVPhysicalAddresses
-		_childTemp, typeSwitchError = IdentifyReplyCommandGAVPhysicalAddressesParse(readBuffer, attribute)
+		_childTemp, typeSwitchError = IdentifyReplyCommandGAVPhysicalAddressesParse(readBuffer, attribute, numBytes)
 	case attribute == Attribute_LogicalAssignment: // IdentifyReplyCommandLogicalAssignment
-		_childTemp, typeSwitchError = IdentifyReplyCommandLogicalAssignmentParse(readBuffer, attribute)
+		_childTemp, typeSwitchError = IdentifyReplyCommandLogicalAssignmentParse(readBuffer, attribute, numBytes)
 	case attribute == Attribute_Delays: // IdentifyReplyCommandDelays
-		_childTemp, typeSwitchError = IdentifyReplyCommandDelaysParse(readBuffer, attribute)
+		_childTemp, typeSwitchError = IdentifyReplyCommandDelaysParse(readBuffer, attribute, numBytes)
 	case attribute == Attribute_MinimumLevels: // IdentifyReplyCommandMinimumLevels
-		_childTemp, typeSwitchError = IdentifyReplyCommandMinimumLevelsParse(readBuffer, attribute)
+		_childTemp, typeSwitchError = IdentifyReplyCommandMinimumLevelsParse(readBuffer, attribute, numBytes)
 	case attribute == Attribute_MaximumLevels: // IdentifyReplyCommandMaximumLevels
-		_childTemp, typeSwitchError = IdentifyReplyCommandMaximumLevelsParse(readBuffer, attribute)
+		_childTemp, typeSwitchError = IdentifyReplyCommandMaximumLevelsParse(readBuffer, attribute, numBytes)
 	case attribute == Attribute_CurrentSenseLevels: // IdentifyReplyCommandCurrentSenseLevels
-		_childTemp, typeSwitchError = IdentifyReplyCommandCurrentSenseLevelsParse(readBuffer, attribute)
+		_childTemp, typeSwitchError = IdentifyReplyCommandCurrentSenseLevelsParse(readBuffer, attribute, numBytes)
 	case attribute == Attribute_OutputUnitSummary: // IdentifyReplyCommandOutputUnitSummary
-		_childTemp, typeSwitchError = IdentifyReplyCommandOutputUnitSummaryParse(readBuffer, attribute)
+		_childTemp, typeSwitchError = IdentifyReplyCommandOutputUnitSummaryParse(readBuffer, attribute, numBytes)
 	case attribute == Attribute_DSIStatus: // IdentifyReplyCommandDSIStatus
-		_childTemp, typeSwitchError = IdentifyReplyCommandDSIStatusParse(readBuffer, attribute)
+		_childTemp, typeSwitchError = IdentifyReplyCommandDSIStatusParse(readBuffer, attribute, numBytes)
 	default:
 		typeSwitchError = errors.Errorf("Unmapped type for parameters [attribute=%v]", attribute)
 	}
diff --git a/plc4go/protocols/cbus/readwrite/model/IdentifyReplyCommandCurrentSenseLevels.go b/plc4go/protocols/cbus/readwrite/model/IdentifyReplyCommandCurrentSenseLevels.go
index c1bda5e08..59cee4c1e 100644
--- a/plc4go/protocols/cbus/readwrite/model/IdentifyReplyCommandCurrentSenseLevels.go
+++ b/plc4go/protocols/cbus/readwrite/model/IdentifyReplyCommandCurrentSenseLevels.go
@@ -66,9 +66,9 @@ func (m *_IdentifyReplyCommandCurrentSenseLevels) GetParent() IdentifyReplyComma
 }
 
 // NewIdentifyReplyCommandCurrentSenseLevels factory function for _IdentifyReplyCommandCurrentSenseLevels
-func NewIdentifyReplyCommandCurrentSenseLevels() *_IdentifyReplyCommandCurrentSenseLevels {
+func NewIdentifyReplyCommandCurrentSenseLevels(numBytes uint8) *_IdentifyReplyCommandCurrentSenseLevels {
 	_result := &_IdentifyReplyCommandCurrentSenseLevels{
-		_IdentifyReplyCommand: NewIdentifyReplyCommand(),
+		_IdentifyReplyCommand: NewIdentifyReplyCommand(numBytes),
 	}
 	_result._IdentifyReplyCommand._IdentifyReplyCommandChildRequirements = _result
 	return _result
@@ -103,7 +103,7 @@ func (m *_IdentifyReplyCommandCurrentSenseLevels) GetLengthInBytes() uint16 {
 	return m.GetLengthInBits() / 8
 }
 
-func IdentifyReplyCommandCurrentSenseLevelsParse(readBuffer utils.ReadBuffer, attribute Attribute) (IdentifyReplyCommandCurrentSenseLevels, error) {
+func IdentifyReplyCommandCurrentSenseLevelsParse(readBuffer utils.ReadBuffer, attribute Attribute, numBytes uint8) (IdentifyReplyCommandCurrentSenseLevels, error) {
 	positionAware := readBuffer
 	_ = positionAware
 	if pullErr := readBuffer.PullContext("IdentifyReplyCommandCurrentSenseLevels"); pullErr != nil {
@@ -118,7 +118,9 @@ func IdentifyReplyCommandCurrentSenseLevelsParse(readBuffer utils.ReadBuffer, at
 
 	// Create a partially initialized instance
 	_child := &_IdentifyReplyCommandCurrentSenseLevels{
-		_IdentifyReplyCommand: &_IdentifyReplyCommand{},
+		_IdentifyReplyCommand: &_IdentifyReplyCommand{
+			NumBytes: numBytes,
+		},
 	}
 	_child._IdentifyReplyCommand._IdentifyReplyCommandChildRequirements = _child
 	return _child, nil
diff --git a/plc4go/protocols/cbus/readwrite/model/IdentifyReplyCommandDSIStatus.go b/plc4go/protocols/cbus/readwrite/model/IdentifyReplyCommandDSIStatus.go
index c4d7aed15..89763b2bc 100644
--- a/plc4go/protocols/cbus/readwrite/model/IdentifyReplyCommandDSIStatus.go
+++ b/plc4go/protocols/cbus/readwrite/model/IdentifyReplyCommandDSIStatus.go
@@ -146,7 +146,7 @@ func (m *_IdentifyReplyCommandDSIStatus) GetDimmingUCRevisionNumber() byte {
 ///////////////////////////////////////////////////////////
 
 // NewIdentifyReplyCommandDSIStatus factory function for _IdentifyReplyCommandDSIStatus
-func NewIdentifyReplyCommandDSIStatus(channelStatus1 ChannelStatus, channelStatus2 ChannelStatus, channelStatus3 ChannelStatus, channelStatus4 ChannelStatus, channelStatus5 ChannelStatus, channelStatus6 ChannelStatus, channelStatus7 ChannelStatus, channelStatus8 ChannelStatus, unitStatus UnitStatus, dimmingUCRevisionNumber byte) *_IdentifyReplyCommandDSIStatus {
+func NewIdentifyReplyCommandDSIStatus(channelStatus1 ChannelStatus, channelStatus2 ChannelStatus, channelStatus3 ChannelStatus, channelStatus4 ChannelStatus, channelStatus5 ChannelStatus, channelStatus6 ChannelStatus, channelStatus7 ChannelStatus, channelStatus8 ChannelStatus, unitStatus UnitStatus, dimmingUCRevisionNumber byte, numBytes uint8) *_IdentifyReplyCommandDSIStatus {
 	_result := &_IdentifyReplyCommandDSIStatus{
 		ChannelStatus1:          channelStatus1,
 		ChannelStatus2:          channelStatus2,
@@ -158,7 +158,7 @@ func NewIdentifyReplyCommandDSIStatus(channelStatus1 ChannelStatus, channelStatu
 		ChannelStatus8:          channelStatus8,
 		UnitStatus:              unitStatus,
 		DimmingUCRevisionNumber: dimmingUCRevisionNumber,
-		_IdentifyReplyCommand:   NewIdentifyReplyCommand(),
+		_IdentifyReplyCommand:   NewIdentifyReplyCommand(numBytes),
 	}
 	_result._IdentifyReplyCommand._IdentifyReplyCommandChildRequirements = _result
 	return _result
@@ -223,7 +223,7 @@ func (m *_IdentifyReplyCommandDSIStatus) GetLengthInBytes() uint16 {
 	return m.GetLengthInBits() / 8
 }
 
-func IdentifyReplyCommandDSIStatusParse(readBuffer utils.ReadBuffer, attribute Attribute) (IdentifyReplyCommandDSIStatus, error) {
+func IdentifyReplyCommandDSIStatusParse(readBuffer utils.ReadBuffer, attribute Attribute, numBytes uint8) (IdentifyReplyCommandDSIStatus, error) {
 	positionAware := readBuffer
 	_ = positionAware
 	if pullErr := readBuffer.PullContext("IdentifyReplyCommandDSIStatus"); pullErr != nil {
@@ -372,7 +372,9 @@ func IdentifyReplyCommandDSIStatusParse(readBuffer utils.ReadBuffer, attribute A
 		ChannelStatus8:          channelStatus8,
 		UnitStatus:              unitStatus,
 		DimmingUCRevisionNumber: dimmingUCRevisionNumber,
-		_IdentifyReplyCommand:   &_IdentifyReplyCommand{},
+		_IdentifyReplyCommand: &_IdentifyReplyCommand{
+			NumBytes: numBytes,
+		},
 	}
 	_child._IdentifyReplyCommand._IdentifyReplyCommandChildRequirements = _child
 	return _child, nil
diff --git a/plc4go/protocols/cbus/readwrite/model/IdentifyReplyCommandDelays.go b/plc4go/protocols/cbus/readwrite/model/IdentifyReplyCommandDelays.go
index b38a02adb..aec94fac9 100644
--- a/plc4go/protocols/cbus/readwrite/model/IdentifyReplyCommandDelays.go
+++ b/plc4go/protocols/cbus/readwrite/model/IdentifyReplyCommandDelays.go
@@ -66,9 +66,9 @@ func (m *_IdentifyReplyCommandDelays) GetParent() IdentifyReplyCommand {
 }
 
 // NewIdentifyReplyCommandDelays factory function for _IdentifyReplyCommandDelays
-func NewIdentifyReplyCommandDelays() *_IdentifyReplyCommandDelays {
+func NewIdentifyReplyCommandDelays(numBytes uint8) *_IdentifyReplyCommandDelays {
 	_result := &_IdentifyReplyCommandDelays{
-		_IdentifyReplyCommand: NewIdentifyReplyCommand(),
+		_IdentifyReplyCommand: NewIdentifyReplyCommand(numBytes),
 	}
 	_result._IdentifyReplyCommand._IdentifyReplyCommandChildRequirements = _result
 	return _result
@@ -103,7 +103,7 @@ func (m *_IdentifyReplyCommandDelays) GetLengthInBytes() uint16 {
 	return m.GetLengthInBits() / 8
 }
 
-func IdentifyReplyCommandDelaysParse(readBuffer utils.ReadBuffer, attribute Attribute) (IdentifyReplyCommandDelays, error) {
+func IdentifyReplyCommandDelaysParse(readBuffer utils.ReadBuffer, attribute Attribute, numBytes uint8) (IdentifyReplyCommandDelays, error) {
 	positionAware := readBuffer
 	_ = positionAware
 	if pullErr := readBuffer.PullContext("IdentifyReplyCommandDelays"); pullErr != nil {
@@ -118,7 +118,9 @@ func IdentifyReplyCommandDelaysParse(readBuffer utils.ReadBuffer, attribute Attr
 
 	// Create a partially initialized instance
 	_child := &_IdentifyReplyCommandDelays{
-		_IdentifyReplyCommand: &_IdentifyReplyCommand{},
+		_IdentifyReplyCommand: &_IdentifyReplyCommand{
+			NumBytes: numBytes,
+		},
 	}
 	_child._IdentifyReplyCommand._IdentifyReplyCommandChildRequirements = _child
 	return _child, nil
diff --git a/plc4go/protocols/cbus/readwrite/model/IdentifyReplyCommandExtendedDiagnosticSummary.go b/plc4go/protocols/cbus/readwrite/model/IdentifyReplyCommandExtendedDiagnosticSummary.go
index ce1c52619..2cd2a126b 100644
--- a/plc4go/protocols/cbus/readwrite/model/IdentifyReplyCommandExtendedDiagnosticSummary.go
+++ b/plc4go/protocols/cbus/readwrite/model/IdentifyReplyCommandExtendedDiagnosticSummary.go
@@ -44,32 +44,34 @@ type IdentifyReplyCommandExtendedDiagnosticSummary interface {
 	GetSerialNumber() uint32
 	// GetNetworkVoltage returns NetworkVoltage (property field)
 	GetNetworkVoltage() byte
-	// GetOutputUnit returns OutputUnit (property field)
-	GetOutputUnit() bool
-	// GetEnableChecksumAlarm returns EnableChecksumAlarm (property field)
-	GetEnableChecksumAlarm() bool
-	// GetNetworkVoltageMarginal returns NetworkVoltageMarginal (property field)
-	GetNetworkVoltageMarginal() bool
-	// GetNetworkVoltageLow returns NetworkVoltageLow (property field)
-	GetNetworkVoltageLow() bool
 	// GetUnitInLearnMode returns UnitInLearnMode (property field)
 	GetUnitInLearnMode() bool
-	// GetMicroPowerReset returns MicroPowerReset (property field)
-	GetMicroPowerReset() bool
-	// GetInternalStackOverflow returns InternalStackOverflow (property field)
-	GetInternalStackOverflow() bool
-	// GetCommsTxError returns CommsTxError (property field)
-	GetCommsTxError() bool
-	// GetMicroReset returns MicroReset (property field)
-	GetMicroReset() bool
-	// GetEEDataError returns EEDataError (property field)
-	GetEEDataError() bool
-	// GetEEChecksumError returns EEChecksumError (property field)
-	GetEEChecksumError() bool
-	// GetEEWriteError returns EEWriteError (property field)
-	GetEEWriteError() bool
+	// GetNetworkVoltageLow returns NetworkVoltageLow (property field)
+	GetNetworkVoltageLow() bool
+	// GetNetworkVoltageMarginal returns NetworkVoltageMarginal (property field)
+	GetNetworkVoltageMarginal() bool
+	// GetEnableChecksumAlarm returns EnableChecksumAlarm (property field)
+	GetEnableChecksumAlarm() bool
+	// GetOutputUnit returns OutputUnit (property field)
+	GetOutputUnit() bool
 	// GetInstallationMMIError returns InstallationMMIError (property field)
 	GetInstallationMMIError() bool
+	// GetEEWriteError returns EEWriteError (property field)
+	GetEEWriteError() bool
+	// GetEEChecksumError returns EEChecksumError (property field)
+	GetEEChecksumError() bool
+	// GetEEDataError returns EEDataError (property field)
+	GetEEDataError() bool
+	// GetMicroReset returns MicroReset (property field)
+	GetMicroReset() bool
+	// GetCommsTxError returns CommsTxError (property field)
+	GetCommsTxError() bool
+	// GetInternalStackOverflow returns InternalStackOverflow (property field)
+	GetInternalStackOverflow() bool
+	// GetMicroPowerReset returns MicroPowerReset (property field)
+	GetMicroPowerReset() bool
+	// GetNetworkVoltageInVolts returns NetworkVoltageInVolts (virtual field)
+	GetNetworkVoltageInVolts() float32
 }
 
 // IdentifyReplyCommandExtendedDiagnosticSummaryExactly can be used when we want exactly this type and not a type which fulfills IdentifyReplyCommandExtendedDiagnosticSummary.
@@ -88,19 +90,19 @@ type _IdentifyReplyCommandExtendedDiagnosticSummary struct {
 	Crc                    uint16
 	SerialNumber           uint32
 	NetworkVoltage         byte
-	OutputUnit             bool
-	EnableChecksumAlarm    bool
-	NetworkVoltageMarginal bool
-	NetworkVoltageLow      bool
 	UnitInLearnMode        bool
-	MicroPowerReset        bool
-	InternalStackOverflow  bool
-	CommsTxError           bool
-	MicroReset             bool
-	EEDataError            bool
-	EEChecksumError        bool
-	EEWriteError           bool
+	NetworkVoltageLow      bool
+	NetworkVoltageMarginal bool
+	EnableChecksumAlarm    bool
+	OutputUnit             bool
 	InstallationMMIError   bool
+	EEWriteError           bool
+	EEChecksumError        bool
+	EEDataError            bool
+	MicroReset             bool
+	CommsTxError           bool
+	InternalStackOverflow  bool
+	MicroPowerReset        bool
 }
 
 ///////////////////////////////////////////////////////////
@@ -153,56 +155,69 @@ func (m *_IdentifyReplyCommandExtendedDiagnosticSummary) GetNetworkVoltage() byt
 	return m.NetworkVoltage
 }
 
-func (m *_IdentifyReplyCommandExtendedDiagnosticSummary) GetOutputUnit() bool {
-	return m.OutputUnit
+func (m *_IdentifyReplyCommandExtendedDiagnosticSummary) GetUnitInLearnMode() bool {
+	return m.UnitInLearnMode
 }
 
-func (m *_IdentifyReplyCommandExtendedDiagnosticSummary) GetEnableChecksumAlarm() bool {
-	return m.EnableChecksumAlarm
+func (m *_IdentifyReplyCommandExtendedDiagnosticSummary) GetNetworkVoltageLow() bool {
+	return m.NetworkVoltageLow
 }
 
 func (m *_IdentifyReplyCommandExtendedDiagnosticSummary) GetNetworkVoltageMarginal() bool {
 	return m.NetworkVoltageMarginal
 }
 
-func (m *_IdentifyReplyCommandExtendedDiagnosticSummary) GetNetworkVoltageLow() bool {
-	return m.NetworkVoltageLow
+func (m *_IdentifyReplyCommandExtendedDiagnosticSummary) GetEnableChecksumAlarm() bool {
+	return m.EnableChecksumAlarm
 }
 
-func (m *_IdentifyReplyCommandExtendedDiagnosticSummary) GetUnitInLearnMode() bool {
-	return m.UnitInLearnMode
+func (m *_IdentifyReplyCommandExtendedDiagnosticSummary) GetOutputUnit() bool {
+	return m.OutputUnit
 }
 
-func (m *_IdentifyReplyCommandExtendedDiagnosticSummary) GetMicroPowerReset() bool {
-	return m.MicroPowerReset
+func (m *_IdentifyReplyCommandExtendedDiagnosticSummary) GetInstallationMMIError() bool {
+	return m.InstallationMMIError
 }
 
-func (m *_IdentifyReplyCommandExtendedDiagnosticSummary) GetInternalStackOverflow() bool {
-	return m.InternalStackOverflow
+func (m *_IdentifyReplyCommandExtendedDiagnosticSummary) GetEEWriteError() bool {
+	return m.EEWriteError
 }
 
-func (m *_IdentifyReplyCommandExtendedDiagnosticSummary) GetCommsTxError() bool {
-	return m.CommsTxError
+func (m *_IdentifyReplyCommandExtendedDiagnosticSummary) GetEEChecksumError() bool {
+	return m.EEChecksumError
+}
+
+func (m *_IdentifyReplyCommandExtendedDiagnosticSummary) GetEEDataError() bool {
+	return m.EEDataError
 }
 
 func (m *_IdentifyReplyCommandExtendedDiagnosticSummary) GetMicroReset() bool {
 	return m.MicroReset
 }
 
-func (m *_IdentifyReplyCommandExtendedDiagnosticSummary) GetEEDataError() bool {
-	return m.EEDataError
+func (m *_IdentifyReplyCommandExtendedDiagnosticSummary) GetCommsTxError() bool {
+	return m.CommsTxError
 }
 
-func (m *_IdentifyReplyCommandExtendedDiagnosticSummary) GetEEChecksumError() bool {
-	return m.EEChecksumError
+func (m *_IdentifyReplyCommandExtendedDiagnosticSummary) GetInternalStackOverflow() bool {
+	return m.InternalStackOverflow
 }
 
-func (m *_IdentifyReplyCommandExtendedDiagnosticSummary) GetEEWriteError() bool {
-	return m.EEWriteError
+func (m *_IdentifyReplyCommandExtendedDiagnosticSummary) GetMicroPowerReset() bool {
+	return m.MicroPowerReset
 }
 
-func (m *_IdentifyReplyCommandExtendedDiagnosticSummary) GetInstallationMMIError() bool {
-	return m.InstallationMMIError
+///////////////////////
+///////////////////////
+///////////////////////////////////////////////////////////
+///////////////////////////////////////////////////////////
+///////////////////////////////////////////////////////////
+///////////////////////////////////////////////////////////
+/////////////////////// Accessors for virtual fields.
+///////////////////////
+
+func (m *_IdentifyReplyCommandExtendedDiagnosticSummary) GetNetworkVoltageInVolts() float32 {
+	return float32(float32(m.GetNetworkVoltage()) / float32(float32(6.375)))
 }
 
 ///////////////////////
@@ -211,7 +226,7 @@ func (m *_IdentifyReplyCommandExtendedDiagnosticSummary) GetInstallationMMIError
 ///////////////////////////////////////////////////////////
 
 // NewIdentifyReplyCommandExtendedDiagnosticSummary factory function for _IdentifyReplyCommandExtendedDiagnosticSummary
-func NewIdentifyReplyCommandExtendedDiagnosticSummary(lowApplication ApplicationIdContainer, highApplication ApplicationIdContainer, area byte, crc uint16, serialNumber uint32, networkVoltage byte, outputUnit bool, enableChecksumAlarm bool, networkVoltageMarginal bool, networkVoltageLow bool, unitInLearnMode bool, microPowerReset bool, internalStackOverflow bool, commsTxError bool, microReset bool, EEDataError bool, EEChecksumError bool, EEWriteError bool, installationMMIError bool) *_Id [...]
+func NewIdentifyReplyCommandExtendedDiagnosticSummary(lowApplication ApplicationIdContainer, highApplication ApplicationIdContainer, area byte, crc uint16, serialNumber uint32, networkVoltage byte, unitInLearnMode bool, networkVoltageLow bool, networkVoltageMarginal bool, enableChecksumAlarm bool, outputUnit bool, installationMMIError bool, EEWriteError bool, EEChecksumError bool, EEDataError bool, microReset bool, commsTxError bool, internalStackOverflow bool, microPowerReset bool, numB [...]
 	_result := &_IdentifyReplyCommandExtendedDiagnosticSummary{
 		LowApplication:         lowApplication,
 		HighApplication:        highApplication,
@@ -219,20 +234,20 @@ func NewIdentifyReplyCommandExtendedDiagnosticSummary(lowApplication Application
 		Crc:                    crc,
 		SerialNumber:           serialNumber,
 		NetworkVoltage:         networkVoltage,
-		OutputUnit:             outputUnit,
-		EnableChecksumAlarm:    enableChecksumAlarm,
-		NetworkVoltageMarginal: networkVoltageMarginal,
-		NetworkVoltageLow:      networkVoltageLow,
 		UnitInLearnMode:        unitInLearnMode,
-		MicroPowerReset:        microPowerReset,
-		InternalStackOverflow:  internalStackOverflow,
-		CommsTxError:           commsTxError,
-		MicroReset:             microReset,
-		EEDataError:            EEDataError,
-		EEChecksumError:        EEChecksumError,
-		EEWriteError:           EEWriteError,
+		NetworkVoltageLow:      networkVoltageLow,
+		NetworkVoltageMarginal: networkVoltageMarginal,
+		EnableChecksumAlarm:    enableChecksumAlarm,
+		OutputUnit:             outputUnit,
 		InstallationMMIError:   installationMMIError,
-		_IdentifyReplyCommand:  NewIdentifyReplyCommand(),
+		EEWriteError:           EEWriteError,
+		EEChecksumError:        EEChecksumError,
+		EEDataError:            EEDataError,
+		MicroReset:             microReset,
+		CommsTxError:           commsTxError,
+		InternalStackOverflow:  internalStackOverflow,
+		MicroPowerReset:        microPowerReset,
+		_IdentifyReplyCommand:  NewIdentifyReplyCommand(numBytes),
 	}
 	_result._IdentifyReplyCommand._IdentifyReplyCommandChildRequirements = _result
 	return _result
@@ -278,13 +293,15 @@ func (m *_IdentifyReplyCommandExtendedDiagnosticSummary) GetLengthInBitsConditio
 	// Simple field (networkVoltage)
 	lengthInBits += 8
 
-	// Simple field (outputUnit)
+	// A virtual field doesn't have any in- or output.
+
+	// Simple field (unitInLearnMode)
 	lengthInBits += 1
 
-	// Simple field (enableChecksumAlarm)
+	// Simple field (networkVoltageLow)
 	lengthInBits += 1
 
-	// Reserved Field (reserved)
+	// Simple field (networkVoltageMarginal)
 	lengthInBits += 1
 
 	// Reserved Field (reserved)
@@ -293,37 +310,37 @@ func (m *_IdentifyReplyCommandExtendedDiagnosticSummary) GetLengthInBitsConditio
 	// Reserved Field (reserved)
 	lengthInBits += 1
 
-	// Simple field (networkVoltageMarginal)
+	// Reserved Field (reserved)
 	lengthInBits += 1
 
-	// Simple field (networkVoltageLow)
+	// Simple field (enableChecksumAlarm)
 	lengthInBits += 1
 
-	// Simple field (unitInLearnMode)
+	// Simple field (outputUnit)
 	lengthInBits += 1
 
-	// Simple field (microPowerReset)
+	// Simple field (installationMMIError)
 	lengthInBits += 1
 
-	// Simple field (internalStackOverflow)
+	// Simple field (EEWriteError)
 	lengthInBits += 1
 
-	// Simple field (commsTxError)
+	// Simple field (EEChecksumError)
 	lengthInBits += 1
 
-	// Simple field (microReset)
+	// Simple field (EEDataError)
 	lengthInBits += 1
 
-	// Simple field (EEDataError)
+	// Simple field (microReset)
 	lengthInBits += 1
 
-	// Simple field (EEChecksumError)
+	// Simple field (commsTxError)
 	lengthInBits += 1
 
-	// Simple field (EEWriteError)
+	// Simple field (internalStackOverflow)
 	lengthInBits += 1
 
-	// Simple field (installationMMIError)
+	// Simple field (microPowerReset)
 	lengthInBits += 1
 
 	return lengthInBits
@@ -333,7 +350,7 @@ func (m *_IdentifyReplyCommandExtendedDiagnosticSummary) GetLengthInBytes() uint
 	return m.GetLengthInBits() / 8
 }
 
-func IdentifyReplyCommandExtendedDiagnosticSummaryParse(readBuffer utils.ReadBuffer, attribute Attribute) (IdentifyReplyCommandExtendedDiagnosticSummary, error) {
+func IdentifyReplyCommandExtendedDiagnosticSummaryParse(readBuffer utils.ReadBuffer, attribute Attribute, numBytes uint8) (IdentifyReplyCommandExtendedDiagnosticSummary, error) {
 	positionAware := readBuffer
 	_ = positionAware
 	if pullErr := readBuffer.PullContext("IdentifyReplyCommandExtendedDiagnosticSummary"); pullErr != nil {
@@ -396,19 +413,31 @@ func IdentifyReplyCommandExtendedDiagnosticSummaryParse(readBuffer utils.ReadBuf
 	}
 	networkVoltage := _networkVoltage
 
-	// Simple Field (outputUnit)
-	_outputUnit, _outputUnitErr := readBuffer.ReadBit("outputUnit")
-	if _outputUnitErr != nil {
-		return nil, errors.Wrap(_outputUnitErr, "Error parsing 'outputUnit' field of IdentifyReplyCommandExtendedDiagnosticSummary")
+	// Virtual field
+	_networkVoltageInVolts := float32(networkVoltage) / float32(float32(6.375))
+	networkVoltageInVolts := float32(_networkVoltageInVolts)
+	_ = networkVoltageInVolts
+
+	// Simple Field (unitInLearnMode)
+	_unitInLearnMode, _unitInLearnModeErr := readBuffer.ReadBit("unitInLearnMode")
+	if _unitInLearnModeErr != nil {
+		return nil, errors.Wrap(_unitInLearnModeErr, "Error parsing 'unitInLearnMode' field of IdentifyReplyCommandExtendedDiagnosticSummary")
 	}
-	outputUnit := _outputUnit
+	unitInLearnMode := _unitInLearnMode
 
-	// Simple Field (enableChecksumAlarm)
-	_enableChecksumAlarm, _enableChecksumAlarmErr := readBuffer.ReadBit("enableChecksumAlarm")
-	if _enableChecksumAlarmErr != nil {
-		return nil, errors.Wrap(_enableChecksumAlarmErr, "Error parsing 'enableChecksumAlarm' field of IdentifyReplyCommandExtendedDiagnosticSummary")
+	// Simple Field (networkVoltageLow)
+	_networkVoltageLow, _networkVoltageLowErr := readBuffer.ReadBit("networkVoltageLow")
+	if _networkVoltageLowErr != nil {
+		return nil, errors.Wrap(_networkVoltageLowErr, "Error parsing 'networkVoltageLow' field of IdentifyReplyCommandExtendedDiagnosticSummary")
 	}
-	enableChecksumAlarm := _enableChecksumAlarm
+	networkVoltageLow := _networkVoltageLow
+
+	// Simple Field (networkVoltageMarginal)
+	_networkVoltageMarginal, _networkVoltageMarginalErr := readBuffer.ReadBit("networkVoltageMarginal")
+	if _networkVoltageMarginalErr != nil {
+		return nil, errors.Wrap(_networkVoltageMarginalErr, "Error parsing 'networkVoltageMarginal' field of IdentifyReplyCommandExtendedDiagnosticSummary")
+	}
+	networkVoltageMarginal := _networkVoltageMarginal
 
 	// Reserved Field (Compartmentalized so the "reserved" variable can't leak)
 	{
@@ -452,47 +481,47 @@ func IdentifyReplyCommandExtendedDiagnosticSummaryParse(readBuffer utils.ReadBuf
 		}
 	}
 
-	// Simple Field (networkVoltageMarginal)
-	_networkVoltageMarginal, _networkVoltageMarginalErr := readBuffer.ReadBit("networkVoltageMarginal")
-	if _networkVoltageMarginalErr != nil {
-		return nil, errors.Wrap(_networkVoltageMarginalErr, "Error parsing 'networkVoltageMarginal' field of IdentifyReplyCommandExtendedDiagnosticSummary")
+	// Simple Field (enableChecksumAlarm)
+	_enableChecksumAlarm, _enableChecksumAlarmErr := readBuffer.ReadBit("enableChecksumAlarm")
+	if _enableChecksumAlarmErr != nil {
+		return nil, errors.Wrap(_enableChecksumAlarmErr, "Error parsing 'enableChecksumAlarm' field of IdentifyReplyCommandExtendedDiagnosticSummary")
 	}
-	networkVoltageMarginal := _networkVoltageMarginal
+	enableChecksumAlarm := _enableChecksumAlarm
 
-	// Simple Field (networkVoltageLow)
-	_networkVoltageLow, _networkVoltageLowErr := readBuffer.ReadBit("networkVoltageLow")
-	if _networkVoltageLowErr != nil {
-		return nil, errors.Wrap(_networkVoltageLowErr, "Error parsing 'networkVoltageLow' field of IdentifyReplyCommandExtendedDiagnosticSummary")
+	// Simple Field (outputUnit)
+	_outputUnit, _outputUnitErr := readBuffer.ReadBit("outputUnit")
+	if _outputUnitErr != nil {
+		return nil, errors.Wrap(_outputUnitErr, "Error parsing 'outputUnit' field of IdentifyReplyCommandExtendedDiagnosticSummary")
 	}
-	networkVoltageLow := _networkVoltageLow
+	outputUnit := _outputUnit
 
-	// Simple Field (unitInLearnMode)
-	_unitInLearnMode, _unitInLearnModeErr := readBuffer.ReadBit("unitInLearnMode")
-	if _unitInLearnModeErr != nil {
-		return nil, errors.Wrap(_unitInLearnModeErr, "Error parsing 'unitInLearnMode' field of IdentifyReplyCommandExtendedDiagnosticSummary")
+	// Simple Field (installationMMIError)
+	_installationMMIError, _installationMMIErrorErr := readBuffer.ReadBit("installationMMIError")
+	if _installationMMIErrorErr != nil {
+		return nil, errors.Wrap(_installationMMIErrorErr, "Error parsing 'installationMMIError' field of IdentifyReplyCommandExtendedDiagnosticSummary")
 	}
-	unitInLearnMode := _unitInLearnMode
+	installationMMIError := _installationMMIError
 
-	// Simple Field (microPowerReset)
-	_microPowerReset, _microPowerResetErr := readBuffer.ReadBit("microPowerReset")
-	if _microPowerResetErr != nil {
-		return nil, errors.Wrap(_microPowerResetErr, "Error parsing 'microPowerReset' field of IdentifyReplyCommandExtendedDiagnosticSummary")
+	// Simple Field (EEWriteError)
+	_EEWriteError, _EEWriteErrorErr := readBuffer.ReadBit("EEWriteError")
+	if _EEWriteErrorErr != nil {
+		return nil, errors.Wrap(_EEWriteErrorErr, "Error parsing 'EEWriteError' field of IdentifyReplyCommandExtendedDiagnosticSummary")
 	}
-	microPowerReset := _microPowerReset
+	EEWriteError := _EEWriteError
 
-	// Simple Field (internalStackOverflow)
-	_internalStackOverflow, _internalStackOverflowErr := readBuffer.ReadBit("internalStackOverflow")
-	if _internalStackOverflowErr != nil {
-		return nil, errors.Wrap(_internalStackOverflowErr, "Error parsing 'internalStackOverflow' field of IdentifyReplyCommandExtendedDiagnosticSummary")
+	// Simple Field (EEChecksumError)
+	_EEChecksumError, _EEChecksumErrorErr := readBuffer.ReadBit("EEChecksumError")
+	if _EEChecksumErrorErr != nil {
+		return nil, errors.Wrap(_EEChecksumErrorErr, "Error parsing 'EEChecksumError' field of IdentifyReplyCommandExtendedDiagnosticSummary")
 	}
-	internalStackOverflow := _internalStackOverflow
+	EEChecksumError := _EEChecksumError
 
-	// Simple Field (commsTxError)
-	_commsTxError, _commsTxErrorErr := readBuffer.ReadBit("commsTxError")
-	if _commsTxErrorErr != nil {
-		return nil, errors.Wrap(_commsTxErrorErr, "Error parsing 'commsTxError' field of IdentifyReplyCommandExtendedDiagnosticSummary")
+	// Simple Field (EEDataError)
+	_EEDataError, _EEDataErrorErr := readBuffer.ReadBit("EEDataError")
+	if _EEDataErrorErr != nil {
+		return nil, errors.Wrap(_EEDataErrorErr, "Error parsing 'EEDataError' field of IdentifyReplyCommandExtendedDiagnosticSummary")
 	}
-	commsTxError := _commsTxError
+	EEDataError := _EEDataError
 
 	// Simple Field (microReset)
 	_microReset, _microResetErr := readBuffer.ReadBit("microReset")
@@ -501,33 +530,26 @@ func IdentifyReplyCommandExtendedDiagnosticSummaryParse(readBuffer utils.ReadBuf
 	}
 	microReset := _microReset
 
-	// Simple Field (EEDataError)
-	_EEDataError, _EEDataErrorErr := readBuffer.ReadBit("EEDataError")
-	if _EEDataErrorErr != nil {
-		return nil, errors.Wrap(_EEDataErrorErr, "Error parsing 'EEDataError' field of IdentifyReplyCommandExtendedDiagnosticSummary")
-	}
-	EEDataError := _EEDataError
-
-	// Simple Field (EEChecksumError)
-	_EEChecksumError, _EEChecksumErrorErr := readBuffer.ReadBit("EEChecksumError")
-	if _EEChecksumErrorErr != nil {
-		return nil, errors.Wrap(_EEChecksumErrorErr, "Error parsing 'EEChecksumError' field of IdentifyReplyCommandExtendedDiagnosticSummary")
+	// Simple Field (commsTxError)
+	_commsTxError, _commsTxErrorErr := readBuffer.ReadBit("commsTxError")
+	if _commsTxErrorErr != nil {
+		return nil, errors.Wrap(_commsTxErrorErr, "Error parsing 'commsTxError' field of IdentifyReplyCommandExtendedDiagnosticSummary")
 	}
-	EEChecksumError := _EEChecksumError
+	commsTxError := _commsTxError
 
-	// Simple Field (EEWriteError)
-	_EEWriteError, _EEWriteErrorErr := readBuffer.ReadBit("EEWriteError")
-	if _EEWriteErrorErr != nil {
-		return nil, errors.Wrap(_EEWriteErrorErr, "Error parsing 'EEWriteError' field of IdentifyReplyCommandExtendedDiagnosticSummary")
+	// Simple Field (internalStackOverflow)
+	_internalStackOverflow, _internalStackOverflowErr := readBuffer.ReadBit("internalStackOverflow")
+	if _internalStackOverflowErr != nil {
+		return nil, errors.Wrap(_internalStackOverflowErr, "Error parsing 'internalStackOverflow' field of IdentifyReplyCommandExtendedDiagnosticSummary")
 	}
-	EEWriteError := _EEWriteError
+	internalStackOverflow := _internalStackOverflow
 
-	// Simple Field (installationMMIError)
-	_installationMMIError, _installationMMIErrorErr := readBuffer.ReadBit("installationMMIError")
-	if _installationMMIErrorErr != nil {
-		return nil, errors.Wrap(_installationMMIErrorErr, "Error parsing 'installationMMIError' field of IdentifyReplyCommandExtendedDiagnosticSummary")
+	// Simple Field (microPowerReset)
+	_microPowerReset, _microPowerResetErr := readBuffer.ReadBit("microPowerReset")
+	if _microPowerResetErr != nil {
+		return nil, errors.Wrap(_microPowerResetErr, "Error parsing 'microPowerReset' field of IdentifyReplyCommandExtendedDiagnosticSummary")
 	}
-	installationMMIError := _installationMMIError
+	microPowerReset := _microPowerReset
 
 	if closeErr := readBuffer.CloseContext("IdentifyReplyCommandExtendedDiagnosticSummary"); closeErr != nil {
 		return nil, errors.Wrap(closeErr, "Error closing for IdentifyReplyCommandExtendedDiagnosticSummary")
@@ -541,20 +563,22 @@ func IdentifyReplyCommandExtendedDiagnosticSummaryParse(readBuffer utils.ReadBuf
 		Crc:                    crc,
 		SerialNumber:           serialNumber,
 		NetworkVoltage:         networkVoltage,
-		OutputUnit:             outputUnit,
-		EnableChecksumAlarm:    enableChecksumAlarm,
-		NetworkVoltageMarginal: networkVoltageMarginal,
-		NetworkVoltageLow:      networkVoltageLow,
 		UnitInLearnMode:        unitInLearnMode,
-		MicroPowerReset:        microPowerReset,
-		InternalStackOverflow:  internalStackOverflow,
-		CommsTxError:           commsTxError,
-		MicroReset:             microReset,
-		EEDataError:            EEDataError,
-		EEChecksumError:        EEChecksumError,
-		EEWriteError:           EEWriteError,
+		NetworkVoltageLow:      networkVoltageLow,
+		NetworkVoltageMarginal: networkVoltageMarginal,
+		EnableChecksumAlarm:    enableChecksumAlarm,
+		OutputUnit:             outputUnit,
 		InstallationMMIError:   installationMMIError,
-		_IdentifyReplyCommand:  &_IdentifyReplyCommand{},
+		EEWriteError:           EEWriteError,
+		EEChecksumError:        EEChecksumError,
+		EEDataError:            EEDataError,
+		MicroReset:             microReset,
+		CommsTxError:           commsTxError,
+		InternalStackOverflow:  internalStackOverflow,
+		MicroPowerReset:        microPowerReset,
+		_IdentifyReplyCommand: &_IdentifyReplyCommand{
+			NumBytes: numBytes,
+		},
 	}
 	_child._IdentifyReplyCommand._IdentifyReplyCommandChildRequirements = _child
 	return _child, nil
@@ -619,19 +643,30 @@ func (m *_IdentifyReplyCommandExtendedDiagnosticSummary) Serialize(writeBuffer u
 		if _networkVoltageErr != nil {
 			return errors.Wrap(_networkVoltageErr, "Error serializing 'networkVoltage' field")
 		}
+		// Virtual field
+		if _networkVoltageInVoltsErr := writeBuffer.WriteVirtual("networkVoltageInVolts", m.GetNetworkVoltageInVolts()); _networkVoltageInVoltsErr != nil {
+			return errors.Wrap(_networkVoltageInVoltsErr, "Error serializing 'networkVoltageInVolts' field")
+		}
 
-		// Simple Field (outputUnit)
-		outputUnit := bool(m.GetOutputUnit())
-		_outputUnitErr := writeBuffer.WriteBit("outputUnit", (outputUnit))
-		if _outputUnitErr != nil {
-			return errors.Wrap(_outputUnitErr, "Error serializing 'outputUnit' field")
+		// Simple Field (unitInLearnMode)
+		unitInLearnMode := bool(m.GetUnitInLearnMode())
+		_unitInLearnModeErr := writeBuffer.WriteBit("unitInLearnMode", (unitInLearnMode))
+		if _unitInLearnModeErr != nil {
+			return errors.Wrap(_unitInLearnModeErr, "Error serializing 'unitInLearnMode' field")
 		}
 
-		// Simple Field (enableChecksumAlarm)
-		enableChecksumAlarm := bool(m.GetEnableChecksumAlarm())
-		_enableChecksumAlarmErr := writeBuffer.WriteBit("enableChecksumAlarm", (enableChecksumAlarm))
-		if _enableChecksumAlarmErr != nil {
-			return errors.Wrap(_enableChecksumAlarmErr, "Error serializing 'enableChecksumAlarm' field")
+		// Simple Field (networkVoltageLow)
+		networkVoltageLow := bool(m.GetNetworkVoltageLow())
+		_networkVoltageLowErr := writeBuffer.WriteBit("networkVoltageLow", (networkVoltageLow))
+		if _networkVoltageLowErr != nil {
+			return errors.Wrap(_networkVoltageLowErr, "Error serializing 'networkVoltageLow' field")
+		}
+
+		// Simple Field (networkVoltageMarginal)
+		networkVoltageMarginal := bool(m.GetNetworkVoltageMarginal())
+		_networkVoltageMarginalErr := writeBuffer.WriteBit("networkVoltageMarginal", (networkVoltageMarginal))
+		if _networkVoltageMarginalErr != nil {
+			return errors.Wrap(_networkVoltageMarginalErr, "Error serializing 'networkVoltageMarginal' field")
 		}
 
 		// Reserved Field (reserved)
@@ -658,46 +693,46 @@ func (m *_IdentifyReplyCommandExtendedDiagnosticSummary) Serialize(writeBuffer u
 			}
 		}
 
-		// Simple Field (networkVoltageMarginal)
-		networkVoltageMarginal := bool(m.GetNetworkVoltageMarginal())
-		_networkVoltageMarginalErr := writeBuffer.WriteBit("networkVoltageMarginal", (networkVoltageMarginal))
-		if _networkVoltageMarginalErr != nil {
-			return errors.Wrap(_networkVoltageMarginalErr, "Error serializing 'networkVoltageMarginal' field")
+		// Simple Field (enableChecksumAlarm)
+		enableChecksumAlarm := bool(m.GetEnableChecksumAlarm())
+		_enableChecksumAlarmErr := writeBuffer.WriteBit("enableChecksumAlarm", (enableChecksumAlarm))
+		if _enableChecksumAlarmErr != nil {
+			return errors.Wrap(_enableChecksumAlarmErr, "Error serializing 'enableChecksumAlarm' field")
 		}
 
-		// Simple Field (networkVoltageLow)
-		networkVoltageLow := bool(m.GetNetworkVoltageLow())
-		_networkVoltageLowErr := writeBuffer.WriteBit("networkVoltageLow", (networkVoltageLow))
-		if _networkVoltageLowErr != nil {
-			return errors.Wrap(_networkVoltageLowErr, "Error serializing 'networkVoltageLow' field")
+		// Simple Field (outputUnit)
+		outputUnit := bool(m.GetOutputUnit())
+		_outputUnitErr := writeBuffer.WriteBit("outputUnit", (outputUnit))
+		if _outputUnitErr != nil {
+			return errors.Wrap(_outputUnitErr, "Error serializing 'outputUnit' field")
 		}
 
-		// Simple Field (unitInLearnMode)
-		unitInLearnMode := bool(m.GetUnitInLearnMode())
-		_unitInLearnModeErr := writeBuffer.WriteBit("unitInLearnMode", (unitInLearnMode))
-		if _unitInLearnModeErr != nil {
-			return errors.Wrap(_unitInLearnModeErr, "Error serializing 'unitInLearnMode' field")
+		// Simple Field (installationMMIError)
+		installationMMIError := bool(m.GetInstallationMMIError())
+		_installationMMIErrorErr := writeBuffer.WriteBit("installationMMIError", (installationMMIError))
+		if _installationMMIErrorErr != nil {
+			return errors.Wrap(_installationMMIErrorErr, "Error serializing 'installationMMIError' field")
 		}
 
-		// Simple Field (microPowerReset)
-		microPowerReset := bool(m.GetMicroPowerReset())
-		_microPowerResetErr := writeBuffer.WriteBit("microPowerReset", (microPowerReset))
-		if _microPowerResetErr != nil {
-			return errors.Wrap(_microPowerResetErr, "Error serializing 'microPowerReset' field")
+		// Simple Field (EEWriteError)
+		EEWriteError := bool(m.GetEEWriteError())
+		_EEWriteErrorErr := writeBuffer.WriteBit("EEWriteError", (EEWriteError))
+		if _EEWriteErrorErr != nil {
+			return errors.Wrap(_EEWriteErrorErr, "Error serializing 'EEWriteError' field")
 		}
 
-		// Simple Field (internalStackOverflow)
-		internalStackOverflow := bool(m.GetInternalStackOverflow())
-		_internalStackOverflowErr := writeBuffer.WriteBit("internalStackOverflow", (internalStackOverflow))
-		if _internalStackOverflowErr != nil {
-			return errors.Wrap(_internalStackOverflowErr, "Error serializing 'internalStackOverflow' field")
+		// Simple Field (EEChecksumError)
+		EEChecksumError := bool(m.GetEEChecksumError())
+		_EEChecksumErrorErr := writeBuffer.WriteBit("EEChecksumError", (EEChecksumError))
+		if _EEChecksumErrorErr != nil {
+			return errors.Wrap(_EEChecksumErrorErr, "Error serializing 'EEChecksumError' field")
 		}
 
-		// Simple Field (commsTxError)
-		commsTxError := bool(m.GetCommsTxError())
-		_commsTxErrorErr := writeBuffer.WriteBit("commsTxError", (commsTxError))
-		if _commsTxErrorErr != nil {
-			return errors.Wrap(_commsTxErrorErr, "Error serializing 'commsTxError' field")
+		// Simple Field (EEDataError)
+		EEDataError := bool(m.GetEEDataError())
+		_EEDataErrorErr := writeBuffer.WriteBit("EEDataError", (EEDataError))
+		if _EEDataErrorErr != nil {
+			return errors.Wrap(_EEDataErrorErr, "Error serializing 'EEDataError' field")
 		}
 
 		// Simple Field (microReset)
@@ -707,32 +742,25 @@ func (m *_IdentifyReplyCommandExtendedDiagnosticSummary) Serialize(writeBuffer u
 			return errors.Wrap(_microResetErr, "Error serializing 'microReset' field")
 		}
 
-		// Simple Field (EEDataError)
-		EEDataError := bool(m.GetEEDataError())
-		_EEDataErrorErr := writeBuffer.WriteBit("EEDataError", (EEDataError))
-		if _EEDataErrorErr != nil {
-			return errors.Wrap(_EEDataErrorErr, "Error serializing 'EEDataError' field")
-		}
-
-		// Simple Field (EEChecksumError)
-		EEChecksumError := bool(m.GetEEChecksumError())
-		_EEChecksumErrorErr := writeBuffer.WriteBit("EEChecksumError", (EEChecksumError))
-		if _EEChecksumErrorErr != nil {
-			return errors.Wrap(_EEChecksumErrorErr, "Error serializing 'EEChecksumError' field")
+		// Simple Field (commsTxError)
+		commsTxError := bool(m.GetCommsTxError())
+		_commsTxErrorErr := writeBuffer.WriteBit("commsTxError", (commsTxError))
+		if _commsTxErrorErr != nil {
+			return errors.Wrap(_commsTxErrorErr, "Error serializing 'commsTxError' field")
 		}
 
-		// Simple Field (EEWriteError)
-		EEWriteError := bool(m.GetEEWriteError())
-		_EEWriteErrorErr := writeBuffer.WriteBit("EEWriteError", (EEWriteError))
-		if _EEWriteErrorErr != nil {
-			return errors.Wrap(_EEWriteErrorErr, "Error serializing 'EEWriteError' field")
+		// Simple Field (internalStackOverflow)
+		internalStackOverflow := bool(m.GetInternalStackOverflow())
+		_internalStackOverflowErr := writeBuffer.WriteBit("internalStackOverflow", (internalStackOverflow))
+		if _internalStackOverflowErr != nil {
+			return errors.Wrap(_internalStackOverflowErr, "Error serializing 'internalStackOverflow' field")
 		}
 
-		// Simple Field (installationMMIError)
-		installationMMIError := bool(m.GetInstallationMMIError())
-		_installationMMIErrorErr := writeBuffer.WriteBit("installationMMIError", (installationMMIError))
-		if _installationMMIErrorErr != nil {
-			return errors.Wrap(_installationMMIErrorErr, "Error serializing 'installationMMIError' field")
+		// Simple Field (microPowerReset)
+		microPowerReset := bool(m.GetMicroPowerReset())
+		_microPowerResetErr := writeBuffer.WriteBit("microPowerReset", (microPowerReset))
+		if _microPowerResetErr != nil {
+			return errors.Wrap(_microPowerResetErr, "Error serializing 'microPowerReset' field")
 		}
 
 		if popErr := writeBuffer.PopContext("IdentifyReplyCommandExtendedDiagnosticSummary"); popErr != nil {
diff --git a/plc4go/protocols/cbus/readwrite/model/IdentifyReplyCommandFirmwareSummary.go b/plc4go/protocols/cbus/readwrite/model/IdentifyReplyCommandFirmwareSummary.go
index b09ee7960..b84656489 100644
--- a/plc4go/protocols/cbus/readwrite/model/IdentifyReplyCommandFirmwareSummary.go
+++ b/plc4go/protocols/cbus/readwrite/model/IdentifyReplyCommandFirmwareSummary.go
@@ -97,12 +97,12 @@ func (m *_IdentifyReplyCommandFirmwareSummary) GetVersion() string {
 ///////////////////////////////////////////////////////////
 
 // NewIdentifyReplyCommandFirmwareSummary factory function for _IdentifyReplyCommandFirmwareSummary
-func NewIdentifyReplyCommandFirmwareSummary(firmwareVersion string, unitServiceType byte, version string) *_IdentifyReplyCommandFirmwareSummary {
+func NewIdentifyReplyCommandFirmwareSummary(firmwareVersion string, unitServiceType byte, version string, numBytes uint8) *_IdentifyReplyCommandFirmwareSummary {
 	_result := &_IdentifyReplyCommandFirmwareSummary{
 		FirmwareVersion:       firmwareVersion,
 		UnitServiceType:       unitServiceType,
 		Version:               version,
-		_IdentifyReplyCommand: NewIdentifyReplyCommand(),
+		_IdentifyReplyCommand: NewIdentifyReplyCommand(numBytes),
 	}
 	_result._IdentifyReplyCommand._IdentifyReplyCommandChildRequirements = _result
 	return _result
@@ -146,7 +146,7 @@ func (m *_IdentifyReplyCommandFirmwareSummary) GetLengthInBytes() uint16 {
 	return m.GetLengthInBits() / 8
 }
 
-func IdentifyReplyCommandFirmwareSummaryParse(readBuffer utils.ReadBuffer, attribute Attribute) (IdentifyReplyCommandFirmwareSummary, error) {
+func IdentifyReplyCommandFirmwareSummaryParse(readBuffer utils.ReadBuffer, attribute Attribute, numBytes uint8) (IdentifyReplyCommandFirmwareSummary, error) {
 	positionAware := readBuffer
 	_ = positionAware
 	if pullErr := readBuffer.PullContext("IdentifyReplyCommandFirmwareSummary"); pullErr != nil {
@@ -182,10 +182,12 @@ func IdentifyReplyCommandFirmwareSummaryParse(readBuffer utils.ReadBuffer, attri
 
 	// Create a partially initialized instance
 	_child := &_IdentifyReplyCommandFirmwareSummary{
-		FirmwareVersion:       firmwareVersion,
-		UnitServiceType:       unitServiceType,
-		Version:               version,
-		_IdentifyReplyCommand: &_IdentifyReplyCommand{},
+		FirmwareVersion: firmwareVersion,
+		UnitServiceType: unitServiceType,
+		Version:         version,
+		_IdentifyReplyCommand: &_IdentifyReplyCommand{
+			NumBytes: numBytes,
+		},
 	}
 	_child._IdentifyReplyCommand._IdentifyReplyCommandChildRequirements = _child
 	return _child, nil
diff --git a/plc4go/protocols/cbus/readwrite/model/IdentifyReplyCommandFirmwareVersion.go b/plc4go/protocols/cbus/readwrite/model/IdentifyReplyCommandFirmwareVersion.go
index dd17d7477..701249044 100644
--- a/plc4go/protocols/cbus/readwrite/model/IdentifyReplyCommandFirmwareVersion.go
+++ b/plc4go/protocols/cbus/readwrite/model/IdentifyReplyCommandFirmwareVersion.go
@@ -83,10 +83,10 @@ func (m *_IdentifyReplyCommandFirmwareVersion) GetFirmwareVersion() string {
 ///////////////////////////////////////////////////////////
 
 // NewIdentifyReplyCommandFirmwareVersion factory function for _IdentifyReplyCommandFirmwareVersion
-func NewIdentifyReplyCommandFirmwareVersion(firmwareVersion string) *_IdentifyReplyCommandFirmwareVersion {
+func NewIdentifyReplyCommandFirmwareVersion(firmwareVersion string, numBytes uint8) *_IdentifyReplyCommandFirmwareVersion {
 	_result := &_IdentifyReplyCommandFirmwareVersion{
 		FirmwareVersion:       firmwareVersion,
-		_IdentifyReplyCommand: NewIdentifyReplyCommand(),
+		_IdentifyReplyCommand: NewIdentifyReplyCommand(numBytes),
 	}
 	_result._IdentifyReplyCommand._IdentifyReplyCommandChildRequirements = _result
 	return _result
@@ -124,7 +124,7 @@ func (m *_IdentifyReplyCommandFirmwareVersion) GetLengthInBytes() uint16 {
 	return m.GetLengthInBits() / 8
 }
 
-func IdentifyReplyCommandFirmwareVersionParse(readBuffer utils.ReadBuffer, attribute Attribute) (IdentifyReplyCommandFirmwareVersion, error) {
+func IdentifyReplyCommandFirmwareVersionParse(readBuffer utils.ReadBuffer, attribute Attribute, numBytes uint8) (IdentifyReplyCommandFirmwareVersion, error) {
 	positionAware := readBuffer
 	_ = positionAware
 	if pullErr := readBuffer.PullContext("IdentifyReplyCommandFirmwareVersion"); pullErr != nil {
@@ -146,8 +146,10 @@ func IdentifyReplyCommandFirmwareVersionParse(readBuffer utils.ReadBuffer, attri
 
 	// Create a partially initialized instance
 	_child := &_IdentifyReplyCommandFirmwareVersion{
-		FirmwareVersion:       firmwareVersion,
-		_IdentifyReplyCommand: &_IdentifyReplyCommand{},
+		FirmwareVersion: firmwareVersion,
+		_IdentifyReplyCommand: &_IdentifyReplyCommand{
+			NumBytes: numBytes,
+		},
 	}
 	_child._IdentifyReplyCommand._IdentifyReplyCommandChildRequirements = _child
 	return _child, nil
diff --git a/plc4go/protocols/cbus/readwrite/model/IdentifyReplyCommandGAVPhysicalAddresses.go b/plc4go/protocols/cbus/readwrite/model/IdentifyReplyCommandGAVPhysicalAddresses.go
index 993872ccf..2654d0189 100644
--- a/plc4go/protocols/cbus/readwrite/model/IdentifyReplyCommandGAVPhysicalAddresses.go
+++ b/plc4go/protocols/cbus/readwrite/model/IdentifyReplyCommandGAVPhysicalAddresses.go
@@ -83,10 +83,10 @@ func (m *_IdentifyReplyCommandGAVPhysicalAddresses) GetValues() []byte {
 ///////////////////////////////////////////////////////////
 
 // NewIdentifyReplyCommandGAVPhysicalAddresses factory function for _IdentifyReplyCommandGAVPhysicalAddresses
-func NewIdentifyReplyCommandGAVPhysicalAddresses(values []byte) *_IdentifyReplyCommandGAVPhysicalAddresses {
+func NewIdentifyReplyCommandGAVPhysicalAddresses(values []byte, numBytes uint8) *_IdentifyReplyCommandGAVPhysicalAddresses {
 	_result := &_IdentifyReplyCommandGAVPhysicalAddresses{
 		Values:                values,
-		_IdentifyReplyCommand: NewIdentifyReplyCommand(),
+		_IdentifyReplyCommand: NewIdentifyReplyCommand(numBytes),
 	}
 	_result._IdentifyReplyCommand._IdentifyReplyCommandChildRequirements = _result
 	return _result
@@ -126,7 +126,7 @@ func (m *_IdentifyReplyCommandGAVPhysicalAddresses) GetLengthInBytes() uint16 {
 	return m.GetLengthInBits() / 8
 }
 
-func IdentifyReplyCommandGAVPhysicalAddressesParse(readBuffer utils.ReadBuffer, attribute Attribute) (IdentifyReplyCommandGAVPhysicalAddresses, error) {
+func IdentifyReplyCommandGAVPhysicalAddressesParse(readBuffer utils.ReadBuffer, attribute Attribute, numBytes uint8) (IdentifyReplyCommandGAVPhysicalAddresses, error) {
 	positionAware := readBuffer
 	_ = positionAware
 	if pullErr := readBuffer.PullContext("IdentifyReplyCommandGAVPhysicalAddresses"); pullErr != nil {
@@ -147,8 +147,10 @@ func IdentifyReplyCommandGAVPhysicalAddressesParse(readBuffer utils.ReadBuffer,
 
 	// Create a partially initialized instance
 	_child := &_IdentifyReplyCommandGAVPhysicalAddresses{
-		Values:                values,
-		_IdentifyReplyCommand: &_IdentifyReplyCommand{},
+		Values: values,
+		_IdentifyReplyCommand: &_IdentifyReplyCommand{
+			NumBytes: numBytes,
+		},
 	}
 	_child._IdentifyReplyCommand._IdentifyReplyCommandChildRequirements = _child
 	return _child, nil
diff --git a/plc4go/protocols/cbus/readwrite/model/IdentifyReplyCommandGAVValuesCurrent.go b/plc4go/protocols/cbus/readwrite/model/IdentifyReplyCommandGAVValuesCurrent.go
index f4866ec18..5f9a02fd4 100644
--- a/plc4go/protocols/cbus/readwrite/model/IdentifyReplyCommandGAVValuesCurrent.go
+++ b/plc4go/protocols/cbus/readwrite/model/IdentifyReplyCommandGAVValuesCurrent.go
@@ -83,10 +83,10 @@ func (m *_IdentifyReplyCommandGAVValuesCurrent) GetValues() []byte {
 ///////////////////////////////////////////////////////////
 
 // NewIdentifyReplyCommandGAVValuesCurrent factory function for _IdentifyReplyCommandGAVValuesCurrent
-func NewIdentifyReplyCommandGAVValuesCurrent(values []byte) *_IdentifyReplyCommandGAVValuesCurrent {
+func NewIdentifyReplyCommandGAVValuesCurrent(values []byte, numBytes uint8) *_IdentifyReplyCommandGAVValuesCurrent {
 	_result := &_IdentifyReplyCommandGAVValuesCurrent{
 		Values:                values,
-		_IdentifyReplyCommand: NewIdentifyReplyCommand(),
+		_IdentifyReplyCommand: NewIdentifyReplyCommand(numBytes),
 	}
 	_result._IdentifyReplyCommand._IdentifyReplyCommandChildRequirements = _result
 	return _result
@@ -126,7 +126,7 @@ func (m *_IdentifyReplyCommandGAVValuesCurrent) GetLengthInBytes() uint16 {
 	return m.GetLengthInBits() / 8
 }
 
-func IdentifyReplyCommandGAVValuesCurrentParse(readBuffer utils.ReadBuffer, attribute Attribute) (IdentifyReplyCommandGAVValuesCurrent, error) {
+func IdentifyReplyCommandGAVValuesCurrentParse(readBuffer utils.ReadBuffer, attribute Attribute, numBytes uint8) (IdentifyReplyCommandGAVValuesCurrent, error) {
 	positionAware := readBuffer
 	_ = positionAware
 	if pullErr := readBuffer.PullContext("IdentifyReplyCommandGAVValuesCurrent"); pullErr != nil {
@@ -147,8 +147,10 @@ func IdentifyReplyCommandGAVValuesCurrentParse(readBuffer utils.ReadBuffer, attr
 
 	// Create a partially initialized instance
 	_child := &_IdentifyReplyCommandGAVValuesCurrent{
-		Values:                values,
-		_IdentifyReplyCommand: &_IdentifyReplyCommand{},
+		Values: values,
+		_IdentifyReplyCommand: &_IdentifyReplyCommand{
+			NumBytes: numBytes,
+		},
 	}
 	_child._IdentifyReplyCommand._IdentifyReplyCommandChildRequirements = _child
 	return _child, nil
diff --git a/plc4go/protocols/cbus/readwrite/model/IdentifyReplyCommandGAVValuesStored.go b/plc4go/protocols/cbus/readwrite/model/IdentifyReplyCommandGAVValuesStored.go
index 80508c285..e26147ea6 100644
--- a/plc4go/protocols/cbus/readwrite/model/IdentifyReplyCommandGAVValuesStored.go
+++ b/plc4go/protocols/cbus/readwrite/model/IdentifyReplyCommandGAVValuesStored.go
@@ -83,10 +83,10 @@ func (m *_IdentifyReplyCommandGAVValuesStored) GetValues() []byte {
 ///////////////////////////////////////////////////////////
 
 // NewIdentifyReplyCommandGAVValuesStored factory function for _IdentifyReplyCommandGAVValuesStored
-func NewIdentifyReplyCommandGAVValuesStored(values []byte) *_IdentifyReplyCommandGAVValuesStored {
+func NewIdentifyReplyCommandGAVValuesStored(values []byte, numBytes uint8) *_IdentifyReplyCommandGAVValuesStored {
 	_result := &_IdentifyReplyCommandGAVValuesStored{
 		Values:                values,
-		_IdentifyReplyCommand: NewIdentifyReplyCommand(),
+		_IdentifyReplyCommand: NewIdentifyReplyCommand(numBytes),
 	}
 	_result._IdentifyReplyCommand._IdentifyReplyCommandChildRequirements = _result
 	return _result
@@ -126,7 +126,7 @@ func (m *_IdentifyReplyCommandGAVValuesStored) GetLengthInBytes() uint16 {
 	return m.GetLengthInBits() / 8
 }
 
-func IdentifyReplyCommandGAVValuesStoredParse(readBuffer utils.ReadBuffer, attribute Attribute) (IdentifyReplyCommandGAVValuesStored, error) {
+func IdentifyReplyCommandGAVValuesStoredParse(readBuffer utils.ReadBuffer, attribute Attribute, numBytes uint8) (IdentifyReplyCommandGAVValuesStored, error) {
 	positionAware := readBuffer
 	_ = positionAware
 	if pullErr := readBuffer.PullContext("IdentifyReplyCommandGAVValuesStored"); pullErr != nil {
@@ -147,8 +147,10 @@ func IdentifyReplyCommandGAVValuesStoredParse(readBuffer utils.ReadBuffer, attri
 
 	// Create a partially initialized instance
 	_child := &_IdentifyReplyCommandGAVValuesStored{
-		Values:                values,
-		_IdentifyReplyCommand: &_IdentifyReplyCommand{},
+		Values: values,
+		_IdentifyReplyCommand: &_IdentifyReplyCommand{
+			NumBytes: numBytes,
+		},
 	}
 	_child._IdentifyReplyCommand._IdentifyReplyCommandChildRequirements = _child
 	return _child, nil
diff --git a/plc4go/protocols/cbus/readwrite/model/IdentifyReplyCommandLogicalAssignment.go b/plc4go/protocols/cbus/readwrite/model/IdentifyReplyCommandLogicalAssignment.go
index 0706a6ccc..e0633103f 100644
--- a/plc4go/protocols/cbus/readwrite/model/IdentifyReplyCommandLogicalAssignment.go
+++ b/plc4go/protocols/cbus/readwrite/model/IdentifyReplyCommandLogicalAssignment.go
@@ -66,9 +66,9 @@ func (m *_IdentifyReplyCommandLogicalAssignment) GetParent() IdentifyReplyComman
 }
 
 // NewIdentifyReplyCommandLogicalAssignment factory function for _IdentifyReplyCommandLogicalAssignment
-func NewIdentifyReplyCommandLogicalAssignment() *_IdentifyReplyCommandLogicalAssignment {
+func NewIdentifyReplyCommandLogicalAssignment(numBytes uint8) *_IdentifyReplyCommandLogicalAssignment {
 	_result := &_IdentifyReplyCommandLogicalAssignment{
-		_IdentifyReplyCommand: NewIdentifyReplyCommand(),
+		_IdentifyReplyCommand: NewIdentifyReplyCommand(numBytes),
 	}
 	_result._IdentifyReplyCommand._IdentifyReplyCommandChildRequirements = _result
 	return _result
@@ -103,7 +103,7 @@ func (m *_IdentifyReplyCommandLogicalAssignment) GetLengthInBytes() uint16 {
 	return m.GetLengthInBits() / 8
 }
 
-func IdentifyReplyCommandLogicalAssignmentParse(readBuffer utils.ReadBuffer, attribute Attribute) (IdentifyReplyCommandLogicalAssignment, error) {
+func IdentifyReplyCommandLogicalAssignmentParse(readBuffer utils.ReadBuffer, attribute Attribute, numBytes uint8) (IdentifyReplyCommandLogicalAssignment, error) {
 	positionAware := readBuffer
 	_ = positionAware
 	if pullErr := readBuffer.PullContext("IdentifyReplyCommandLogicalAssignment"); pullErr != nil {
@@ -118,7 +118,9 @@ func IdentifyReplyCommandLogicalAssignmentParse(readBuffer utils.ReadBuffer, att
 
 	// Create a partially initialized instance
 	_child := &_IdentifyReplyCommandLogicalAssignment{
-		_IdentifyReplyCommand: &_IdentifyReplyCommand{},
+		_IdentifyReplyCommand: &_IdentifyReplyCommand{
+			NumBytes: numBytes,
+		},
 	}
 	_child._IdentifyReplyCommand._IdentifyReplyCommandChildRequirements = _child
 	return _child, nil
diff --git a/plc4go/protocols/cbus/readwrite/model/IdentifyReplyCommandManufacturer.go b/plc4go/protocols/cbus/readwrite/model/IdentifyReplyCommandManufacturer.go
index ab2db1f10..37315da99 100644
--- a/plc4go/protocols/cbus/readwrite/model/IdentifyReplyCommandManufacturer.go
+++ b/plc4go/protocols/cbus/readwrite/model/IdentifyReplyCommandManufacturer.go
@@ -83,10 +83,10 @@ func (m *_IdentifyReplyCommandManufacturer) GetManufacturerName() string {
 ///////////////////////////////////////////////////////////
 
 // NewIdentifyReplyCommandManufacturer factory function for _IdentifyReplyCommandManufacturer
-func NewIdentifyReplyCommandManufacturer(manufacturerName string) *_IdentifyReplyCommandManufacturer {
+func NewIdentifyReplyCommandManufacturer(manufacturerName string, numBytes uint8) *_IdentifyReplyCommandManufacturer {
 	_result := &_IdentifyReplyCommandManufacturer{
 		ManufacturerName:      manufacturerName,
-		_IdentifyReplyCommand: NewIdentifyReplyCommand(),
+		_IdentifyReplyCommand: NewIdentifyReplyCommand(numBytes),
 	}
 	_result._IdentifyReplyCommand._IdentifyReplyCommandChildRequirements = _result
 	return _result
@@ -124,7 +124,7 @@ func (m *_IdentifyReplyCommandManufacturer) GetLengthInBytes() uint16 {
 	return m.GetLengthInBits() / 8
 }
 
-func IdentifyReplyCommandManufacturerParse(readBuffer utils.ReadBuffer, attribute Attribute) (IdentifyReplyCommandManufacturer, error) {
+func IdentifyReplyCommandManufacturerParse(readBuffer utils.ReadBuffer, attribute Attribute, numBytes uint8) (IdentifyReplyCommandManufacturer, error) {
 	positionAware := readBuffer
 	_ = positionAware
 	if pullErr := readBuffer.PullContext("IdentifyReplyCommandManufacturer"); pullErr != nil {
@@ -146,8 +146,10 @@ func IdentifyReplyCommandManufacturerParse(readBuffer utils.ReadBuffer, attribut
 
 	// Create a partially initialized instance
 	_child := &_IdentifyReplyCommandManufacturer{
-		ManufacturerName:      manufacturerName,
-		_IdentifyReplyCommand: &_IdentifyReplyCommand{},
+		ManufacturerName: manufacturerName,
+		_IdentifyReplyCommand: &_IdentifyReplyCommand{
+			NumBytes: numBytes,
+		},
 	}
 	_child._IdentifyReplyCommand._IdentifyReplyCommandChildRequirements = _child
 	return _child, nil
diff --git a/plc4go/protocols/cbus/readwrite/model/IdentifyReplyCommandMaximumLevels.go b/plc4go/protocols/cbus/readwrite/model/IdentifyReplyCommandMaximumLevels.go
index 2185453aa..d4cc097bb 100644
--- a/plc4go/protocols/cbus/readwrite/model/IdentifyReplyCommandMaximumLevels.go
+++ b/plc4go/protocols/cbus/readwrite/model/IdentifyReplyCommandMaximumLevels.go
@@ -66,9 +66,9 @@ func (m *_IdentifyReplyCommandMaximumLevels) GetParent() IdentifyReplyCommand {
 }
 
 // NewIdentifyReplyCommandMaximumLevels factory function for _IdentifyReplyCommandMaximumLevels
-func NewIdentifyReplyCommandMaximumLevels() *_IdentifyReplyCommandMaximumLevels {
+func NewIdentifyReplyCommandMaximumLevels(numBytes uint8) *_IdentifyReplyCommandMaximumLevels {
 	_result := &_IdentifyReplyCommandMaximumLevels{
-		_IdentifyReplyCommand: NewIdentifyReplyCommand(),
+		_IdentifyReplyCommand: NewIdentifyReplyCommand(numBytes),
 	}
 	_result._IdentifyReplyCommand._IdentifyReplyCommandChildRequirements = _result
 	return _result
@@ -103,7 +103,7 @@ func (m *_IdentifyReplyCommandMaximumLevels) GetLengthInBytes() uint16 {
 	return m.GetLengthInBits() / 8
 }
 
-func IdentifyReplyCommandMaximumLevelsParse(readBuffer utils.ReadBuffer, attribute Attribute) (IdentifyReplyCommandMaximumLevels, error) {
+func IdentifyReplyCommandMaximumLevelsParse(readBuffer utils.ReadBuffer, attribute Attribute, numBytes uint8) (IdentifyReplyCommandMaximumLevels, error) {
 	positionAware := readBuffer
 	_ = positionAware
 	if pullErr := readBuffer.PullContext("IdentifyReplyCommandMaximumLevels"); pullErr != nil {
@@ -118,7 +118,9 @@ func IdentifyReplyCommandMaximumLevelsParse(readBuffer utils.ReadBuffer, attribu
 
 	// Create a partially initialized instance
 	_child := &_IdentifyReplyCommandMaximumLevels{
-		_IdentifyReplyCommand: &_IdentifyReplyCommand{},
+		_IdentifyReplyCommand: &_IdentifyReplyCommand{
+			NumBytes: numBytes,
+		},
 	}
 	_child._IdentifyReplyCommand._IdentifyReplyCommandChildRequirements = _child
 	return _child, nil
diff --git a/plc4go/protocols/cbus/readwrite/model/IdentifyReplyCommandMinimumLevels.go b/plc4go/protocols/cbus/readwrite/model/IdentifyReplyCommandMinimumLevels.go
index 80a4fa6ee..5a4b5a6f1 100644
--- a/plc4go/protocols/cbus/readwrite/model/IdentifyReplyCommandMinimumLevels.go
+++ b/plc4go/protocols/cbus/readwrite/model/IdentifyReplyCommandMinimumLevels.go
@@ -66,9 +66,9 @@ func (m *_IdentifyReplyCommandMinimumLevels) GetParent() IdentifyReplyCommand {
 }
 
 // NewIdentifyReplyCommandMinimumLevels factory function for _IdentifyReplyCommandMinimumLevels
-func NewIdentifyReplyCommandMinimumLevels() *_IdentifyReplyCommandMinimumLevels {
+func NewIdentifyReplyCommandMinimumLevels(numBytes uint8) *_IdentifyReplyCommandMinimumLevels {
 	_result := &_IdentifyReplyCommandMinimumLevels{
-		_IdentifyReplyCommand: NewIdentifyReplyCommand(),
+		_IdentifyReplyCommand: NewIdentifyReplyCommand(numBytes),
 	}
 	_result._IdentifyReplyCommand._IdentifyReplyCommandChildRequirements = _result
 	return _result
@@ -103,7 +103,7 @@ func (m *_IdentifyReplyCommandMinimumLevels) GetLengthInBytes() uint16 {
 	return m.GetLengthInBits() / 8
 }
 
-func IdentifyReplyCommandMinimumLevelsParse(readBuffer utils.ReadBuffer, attribute Attribute) (IdentifyReplyCommandMinimumLevels, error) {
+func IdentifyReplyCommandMinimumLevelsParse(readBuffer utils.ReadBuffer, attribute Attribute, numBytes uint8) (IdentifyReplyCommandMinimumLevels, error) {
 	positionAware := readBuffer
 	_ = positionAware
 	if pullErr := readBuffer.PullContext("IdentifyReplyCommandMinimumLevels"); pullErr != nil {
@@ -118,7 +118,9 @@ func IdentifyReplyCommandMinimumLevelsParse(readBuffer utils.ReadBuffer, attribu
 
 	// Create a partially initialized instance
 	_child := &_IdentifyReplyCommandMinimumLevels{
-		_IdentifyReplyCommand: &_IdentifyReplyCommand{},
+		_IdentifyReplyCommand: &_IdentifyReplyCommand{
+			NumBytes: numBytes,
+		},
 	}
 	_child._IdentifyReplyCommand._IdentifyReplyCommandChildRequirements = _child
 	return _child, nil
diff --git a/plc4go/protocols/cbus/readwrite/model/IdentifyReplyCommandNetworkTerminalLevels.go b/plc4go/protocols/cbus/readwrite/model/IdentifyReplyCommandNetworkTerminalLevels.go
index 81804a9cd..fd9a3693f 100644
--- a/plc4go/protocols/cbus/readwrite/model/IdentifyReplyCommandNetworkTerminalLevels.go
+++ b/plc4go/protocols/cbus/readwrite/model/IdentifyReplyCommandNetworkTerminalLevels.go
@@ -66,9 +66,9 @@ func (m *_IdentifyReplyCommandNetworkTerminalLevels) GetParent() IdentifyReplyCo
 }
 
 // NewIdentifyReplyCommandNetworkTerminalLevels factory function for _IdentifyReplyCommandNetworkTerminalLevels
-func NewIdentifyReplyCommandNetworkTerminalLevels() *_IdentifyReplyCommandNetworkTerminalLevels {
+func NewIdentifyReplyCommandNetworkTerminalLevels(numBytes uint8) *_IdentifyReplyCommandNetworkTerminalLevels {
 	_result := &_IdentifyReplyCommandNetworkTerminalLevels{
-		_IdentifyReplyCommand: NewIdentifyReplyCommand(),
+		_IdentifyReplyCommand: NewIdentifyReplyCommand(numBytes),
 	}
 	_result._IdentifyReplyCommand._IdentifyReplyCommandChildRequirements = _result
 	return _result
@@ -103,7 +103,7 @@ func (m *_IdentifyReplyCommandNetworkTerminalLevels) GetLengthInBytes() uint16 {
 	return m.GetLengthInBits() / 8
 }
 
-func IdentifyReplyCommandNetworkTerminalLevelsParse(readBuffer utils.ReadBuffer, attribute Attribute) (IdentifyReplyCommandNetworkTerminalLevels, error) {
+func IdentifyReplyCommandNetworkTerminalLevelsParse(readBuffer utils.ReadBuffer, attribute Attribute, numBytes uint8) (IdentifyReplyCommandNetworkTerminalLevels, error) {
 	positionAware := readBuffer
 	_ = positionAware
 	if pullErr := readBuffer.PullContext("IdentifyReplyCommandNetworkTerminalLevels"); pullErr != nil {
@@ -118,7 +118,9 @@ func IdentifyReplyCommandNetworkTerminalLevelsParse(readBuffer utils.ReadBuffer,
 
 	// Create a partially initialized instance
 	_child := &_IdentifyReplyCommandNetworkTerminalLevels{
-		_IdentifyReplyCommand: &_IdentifyReplyCommand{},
+		_IdentifyReplyCommand: &_IdentifyReplyCommand{
+			NumBytes: numBytes,
+		},
 	}
 	_child._IdentifyReplyCommand._IdentifyReplyCommandChildRequirements = _child
 	return _child, nil
diff --git a/plc4go/protocols/cbus/readwrite/model/IdentifyReplyCommandNetworkVoltage.go b/plc4go/protocols/cbus/readwrite/model/IdentifyReplyCommandNetworkVoltage.go
index 98916b4b7..8b38e303d 100644
--- a/plc4go/protocols/cbus/readwrite/model/IdentifyReplyCommandNetworkVoltage.go
+++ b/plc4go/protocols/cbus/readwrite/model/IdentifyReplyCommandNetworkVoltage.go
@@ -112,11 +112,11 @@ func (m *_IdentifyReplyCommandNetworkVoltage) GetV() byte {
 ///////////////////////////////////////////////////////////
 
 // NewIdentifyReplyCommandNetworkVoltage factory function for _IdentifyReplyCommandNetworkVoltage
-func NewIdentifyReplyCommandNetworkVoltage(volts string, voltsDecimalPlace string) *_IdentifyReplyCommandNetworkVoltage {
+func NewIdentifyReplyCommandNetworkVoltage(volts string, voltsDecimalPlace string, numBytes uint8) *_IdentifyReplyCommandNetworkVoltage {
 	_result := &_IdentifyReplyCommandNetworkVoltage{
 		Volts:                 volts,
 		VoltsDecimalPlace:     voltsDecimalPlace,
-		_IdentifyReplyCommand: NewIdentifyReplyCommand(),
+		_IdentifyReplyCommand: NewIdentifyReplyCommand(numBytes),
 	}
 	_result._IdentifyReplyCommand._IdentifyReplyCommandChildRequirements = _result
 	return _result
@@ -163,7 +163,7 @@ func (m *_IdentifyReplyCommandNetworkVoltage) GetLengthInBytes() uint16 {
 	return m.GetLengthInBits() / 8
 }
 
-func IdentifyReplyCommandNetworkVoltageParse(readBuffer utils.ReadBuffer, attribute Attribute) (IdentifyReplyCommandNetworkVoltage, error) {
+func IdentifyReplyCommandNetworkVoltageParse(readBuffer utils.ReadBuffer, attribute Attribute, numBytes uint8) (IdentifyReplyCommandNetworkVoltage, error) {
 	positionAware := readBuffer
 	_ = positionAware
 	if pullErr := readBuffer.PullContext("IdentifyReplyCommandNetworkVoltage"); pullErr != nil {
@@ -210,9 +210,11 @@ func IdentifyReplyCommandNetworkVoltageParse(readBuffer utils.ReadBuffer, attrib
 
 	// Create a partially initialized instance
 	_child := &_IdentifyReplyCommandNetworkVoltage{
-		Volts:                 volts,
-		VoltsDecimalPlace:     voltsDecimalPlace,
-		_IdentifyReplyCommand: &_IdentifyReplyCommand{},
+		Volts:             volts,
+		VoltsDecimalPlace: voltsDecimalPlace,
+		_IdentifyReplyCommand: &_IdentifyReplyCommand{
+			NumBytes: numBytes,
+		},
 	}
 	_child._IdentifyReplyCommand._IdentifyReplyCommandChildRequirements = _child
 	return _child, nil
diff --git a/plc4go/protocols/cbus/readwrite/model/IdentifyReplyCommandOutputUnitSummary.go b/plc4go/protocols/cbus/readwrite/model/IdentifyReplyCommandOutputUnitSummary.go
index 6a1c15be6..cad20973c 100644
--- a/plc4go/protocols/cbus/readwrite/model/IdentifyReplyCommandOutputUnitSummary.go
+++ b/plc4go/protocols/cbus/readwrite/model/IdentifyReplyCommandOutputUnitSummary.go
@@ -31,6 +31,14 @@ type IdentifyReplyCommandOutputUnitSummary interface {
 	utils.LengthAware
 	utils.Serializable
 	IdentifyReplyCommand
+	// GetUnitFlags returns UnitFlags (property field)
+	GetUnitFlags() IdentifyReplyCommandUnitSummary
+	// GetGavStoreEnabledByte1 returns GavStoreEnabledByte1 (property field)
+	GetGavStoreEnabledByte1() byte
+	// GetGavStoreEnabledByte2 returns GavStoreEnabledByte2 (property field)
+	GetGavStoreEnabledByte2() byte
+	// GetTimeFromLastRecoverOfMainsInSeconds returns TimeFromLastRecoverOfMainsInSeconds (property field)
+	GetTimeFromLastRecoverOfMainsInSeconds() uint8
 }
 
 // IdentifyReplyCommandOutputUnitSummaryExactly can be used when we want exactly this type and not a type which fulfills IdentifyReplyCommandOutputUnitSummary.
@@ -43,6 +51,10 @@ type IdentifyReplyCommandOutputUnitSummaryExactly interface {
 // _IdentifyReplyCommandOutputUnitSummary is the data-structure of this message
 type _IdentifyReplyCommandOutputUnitSummary struct {
 	*_IdentifyReplyCommand
+	UnitFlags                           IdentifyReplyCommandUnitSummary
+	GavStoreEnabledByte1                byte
+	GavStoreEnabledByte2                byte
+	TimeFromLastRecoverOfMainsInSeconds uint8
 }
 
 ///////////////////////////////////////////////////////////
@@ -65,10 +77,40 @@ func (m *_IdentifyReplyCommandOutputUnitSummary) GetParent() IdentifyReplyComman
 	return m._IdentifyReplyCommand
 }
 
+///////////////////////////////////////////////////////////
+///////////////////////////////////////////////////////////
+/////////////////////// Accessors for property fields.
+///////////////////////
+
+func (m *_IdentifyReplyCommandOutputUnitSummary) GetUnitFlags() IdentifyReplyCommandUnitSummary {
+	return m.UnitFlags
+}
+
+func (m *_IdentifyReplyCommandOutputUnitSummary) GetGavStoreEnabledByte1() byte {
+	return m.GavStoreEnabledByte1
+}
+
+func (m *_IdentifyReplyCommandOutputUnitSummary) GetGavStoreEnabledByte2() byte {
+	return m.GavStoreEnabledByte2
+}
+
+func (m *_IdentifyReplyCommandOutputUnitSummary) GetTimeFromLastRecoverOfMainsInSeconds() uint8 {
+	return m.TimeFromLastRecoverOfMainsInSeconds
+}
+
+///////////////////////
+///////////////////////
+///////////////////////////////////////////////////////////
+///////////////////////////////////////////////////////////
+
 // NewIdentifyReplyCommandOutputUnitSummary factory function for _IdentifyReplyCommandOutputUnitSummary
-func NewIdentifyReplyCommandOutputUnitSummary() *_IdentifyReplyCommandOutputUnitSummary {
+func NewIdentifyReplyCommandOutputUnitSummary(unitFlags IdentifyReplyCommandUnitSummary, gavStoreEnabledByte1 byte, gavStoreEnabledByte2 byte, timeFromLastRecoverOfMainsInSeconds uint8, numBytes uint8) *_IdentifyReplyCommandOutputUnitSummary {
 	_result := &_IdentifyReplyCommandOutputUnitSummary{
-		_IdentifyReplyCommand: NewIdentifyReplyCommand(),
+		UnitFlags:                           unitFlags,
+		GavStoreEnabledByte1:                gavStoreEnabledByte1,
+		GavStoreEnabledByte2:                gavStoreEnabledByte2,
+		TimeFromLastRecoverOfMainsInSeconds: timeFromLastRecoverOfMainsInSeconds,
+		_IdentifyReplyCommand:               NewIdentifyReplyCommand(numBytes),
 	}
 	_result._IdentifyReplyCommand._IdentifyReplyCommandChildRequirements = _result
 	return _result
@@ -96,6 +138,18 @@ func (m *_IdentifyReplyCommandOutputUnitSummary) GetLengthInBits() uint16 {
 func (m *_IdentifyReplyCommandOutputUnitSummary) GetLengthInBitsConditional(lastItem bool) uint16 {
 	lengthInBits := uint16(m.GetParentLengthInBits())
 
+	// Simple field (unitFlags)
+	lengthInBits += m.UnitFlags.GetLengthInBits()
+
+	// Simple field (gavStoreEnabledByte1)
+	lengthInBits += 8
+
+	// Simple field (gavStoreEnabledByte2)
+	lengthInBits += 8
+
+	// Simple field (timeFromLastRecoverOfMainsInSeconds)
+	lengthInBits += 8
+
 	return lengthInBits
 }
 
@@ -103,7 +157,7 @@ func (m *_IdentifyReplyCommandOutputUnitSummary) GetLengthInBytes() uint16 {
 	return m.GetLengthInBits() / 8
 }
 
-func IdentifyReplyCommandOutputUnitSummaryParse(readBuffer utils.ReadBuffer, attribute Attribute) (IdentifyReplyCommandOutputUnitSummary, error) {
+func IdentifyReplyCommandOutputUnitSummaryParse(readBuffer utils.ReadBuffer, attribute Attribute, numBytes uint8) (IdentifyReplyCommandOutputUnitSummary, error) {
 	positionAware := readBuffer
 	_ = positionAware
 	if pullErr := readBuffer.PullContext("IdentifyReplyCommandOutputUnitSummary"); pullErr != nil {
@@ -112,13 +166,53 @@ func IdentifyReplyCommandOutputUnitSummaryParse(readBuffer utils.ReadBuffer, att
 	currentPos := positionAware.GetPos()
 	_ = currentPos
 
+	// Simple Field (unitFlags)
+	if pullErr := readBuffer.PullContext("unitFlags"); pullErr != nil {
+		return nil, errors.Wrap(pullErr, "Error pulling for unitFlags")
+	}
+	_unitFlags, _unitFlagsErr := IdentifyReplyCommandUnitSummaryParse(readBuffer)
+	if _unitFlagsErr != nil {
+		return nil, errors.Wrap(_unitFlagsErr, "Error parsing 'unitFlags' field of IdentifyReplyCommandOutputUnitSummary")
+	}
+	unitFlags := _unitFlags.(IdentifyReplyCommandUnitSummary)
+	if closeErr := readBuffer.CloseContext("unitFlags"); closeErr != nil {
+		return nil, errors.Wrap(closeErr, "Error closing for unitFlags")
+	}
+
+	// Simple Field (gavStoreEnabledByte1)
+	_gavStoreEnabledByte1, _gavStoreEnabledByte1Err := readBuffer.ReadByte("gavStoreEnabledByte1")
+	if _gavStoreEnabledByte1Err != nil {
+		return nil, errors.Wrap(_gavStoreEnabledByte1Err, "Error parsing 'gavStoreEnabledByte1' field of IdentifyReplyCommandOutputUnitSummary")
+	}
+	gavStoreEnabledByte1 := _gavStoreEnabledByte1
+
+	// Simple Field (gavStoreEnabledByte2)
+	_gavStoreEnabledByte2, _gavStoreEnabledByte2Err := readBuffer.ReadByte("gavStoreEnabledByte2")
+	if _gavStoreEnabledByte2Err != nil {
+		return nil, errors.Wrap(_gavStoreEnabledByte2Err, "Error parsing 'gavStoreEnabledByte2' field of IdentifyReplyCommandOutputUnitSummary")
+	}
+	gavStoreEnabledByte2 := _gavStoreEnabledByte2
+
+	// Simple Field (timeFromLastRecoverOfMainsInSeconds)
+	_timeFromLastRecoverOfMainsInSeconds, _timeFromLastRecoverOfMainsInSecondsErr := readBuffer.ReadUint8("timeFromLastRecoverOfMainsInSeconds", 8)
+	if _timeFromLastRecoverOfMainsInSecondsErr != nil {
+		return nil, errors.Wrap(_timeFromLastRecoverOfMainsInSecondsErr, "Error parsing 'timeFromLastRecoverOfMainsInSeconds' field of IdentifyReplyCommandOutputUnitSummary")
+	}
+	timeFromLastRecoverOfMainsInSeconds := _timeFromLastRecoverOfMainsInSeconds
+
 	if closeErr := readBuffer.CloseContext("IdentifyReplyCommandOutputUnitSummary"); closeErr != nil {
 		return nil, errors.Wrap(closeErr, "Error closing for IdentifyReplyCommandOutputUnitSummary")
 	}
 
 	// Create a partially initialized instance
 	_child := &_IdentifyReplyCommandOutputUnitSummary{
-		_IdentifyReplyCommand: &_IdentifyReplyCommand{},
+		UnitFlags:                           unitFlags,
+		GavStoreEnabledByte1:                gavStoreEnabledByte1,
+		GavStoreEnabledByte2:                gavStoreEnabledByte2,
+		TimeFromLastRecoverOfMainsInSeconds: timeFromLastRecoverOfMainsInSeconds,
+		_IdentifyReplyCommand: &_IdentifyReplyCommand{
+			NumBytes: numBytes,
+		},
 	}
 	_child._IdentifyReplyCommand._IdentifyReplyCommandChildRequirements = _child
 	return _child, nil
@@ -132,6 +226,39 @@ func (m *_IdentifyReplyCommandOutputUnitSummary) Serialize(writeBuffer utils.Wri
 			return errors.Wrap(pushErr, "Error pushing for IdentifyReplyCommandOutputUnitSummary")
 		}
 
+		// Simple Field (unitFlags)
+		if pushErr := writeBuffer.PushContext("unitFlags"); pushErr != nil {
+			return errors.Wrap(pushErr, "Error pushing for unitFlags")
+		}
+		_unitFlagsErr := writeBuffer.WriteSerializable(m.GetUnitFlags())
+		if popErr := writeBuffer.PopContext("unitFlags"); popErr != nil {
+			return errors.Wrap(popErr, "Error popping for unitFlags")
+		}
+		if _unitFlagsErr != nil {
+			return errors.Wrap(_unitFlagsErr, "Error serializing 'unitFlags' field")
+		}
+
+		// Simple Field (gavStoreEnabledByte1)
+		gavStoreEnabledByte1 := byte(m.GetGavStoreEnabledByte1())
+		_gavStoreEnabledByte1Err := writeBuffer.WriteByte("gavStoreEnabledByte1", (gavStoreEnabledByte1))
+		if _gavStoreEnabledByte1Err != nil {
+			return errors.Wrap(_gavStoreEnabledByte1Err, "Error serializing 'gavStoreEnabledByte1' field")
+		}
+
+		// Simple Field (gavStoreEnabledByte2)
+		gavStoreEnabledByte2 := byte(m.GetGavStoreEnabledByte2())
+		_gavStoreEnabledByte2Err := writeBuffer.WriteByte("gavStoreEnabledByte2", (gavStoreEnabledByte2))
+		if _gavStoreEnabledByte2Err != nil {
+			return errors.Wrap(_gavStoreEnabledByte2Err, "Error serializing 'gavStoreEnabledByte2' field")
+		}
+
+		// Simple Field (timeFromLastRecoverOfMainsInSeconds)
+		timeFromLastRecoverOfMainsInSeconds := uint8(m.GetTimeFromLastRecoverOfMainsInSeconds())
+		_timeFromLastRecoverOfMainsInSecondsErr := writeBuffer.WriteUint8("timeFromLastRecoverOfMainsInSeconds", 8, (timeFromLastRecoverOfMainsInSeconds))
+		if _timeFromLastRecoverOfMainsInSecondsErr != nil {
+			return errors.Wrap(_timeFromLastRecoverOfMainsInSecondsErr, "Error serializing 'timeFromLastRecoverOfMainsInSeconds' field")
+		}
+
 		if popErr := writeBuffer.PopContext("IdentifyReplyCommandOutputUnitSummary"); popErr != nil {
 			return errors.Wrap(popErr, "Error popping for IdentifyReplyCommandOutputUnitSummary")
 		}
diff --git a/plc4go/protocols/cbus/readwrite/model/IdentifyReplyCommandTerminalLevels.go b/plc4go/protocols/cbus/readwrite/model/IdentifyReplyCommandTerminalLevels.go
index 2d27d091d..55d89cd12 100644
--- a/plc4go/protocols/cbus/readwrite/model/IdentifyReplyCommandTerminalLevels.go
+++ b/plc4go/protocols/cbus/readwrite/model/IdentifyReplyCommandTerminalLevels.go
@@ -66,9 +66,9 @@ func (m *_IdentifyReplyCommandTerminalLevels) GetParent() IdentifyReplyCommand {
 }
 
 // NewIdentifyReplyCommandTerminalLevels factory function for _IdentifyReplyCommandTerminalLevels
-func NewIdentifyReplyCommandTerminalLevels() *_IdentifyReplyCommandTerminalLevels {
+func NewIdentifyReplyCommandTerminalLevels(numBytes uint8) *_IdentifyReplyCommandTerminalLevels {
 	_result := &_IdentifyReplyCommandTerminalLevels{
-		_IdentifyReplyCommand: NewIdentifyReplyCommand(),
+		_IdentifyReplyCommand: NewIdentifyReplyCommand(numBytes),
 	}
 	_result._IdentifyReplyCommand._IdentifyReplyCommandChildRequirements = _result
 	return _result
@@ -103,7 +103,7 @@ func (m *_IdentifyReplyCommandTerminalLevels) GetLengthInBytes() uint16 {
 	return m.GetLengthInBits() / 8
 }
 
-func IdentifyReplyCommandTerminalLevelsParse(readBuffer utils.ReadBuffer, attribute Attribute) (IdentifyReplyCommandTerminalLevels, error) {
+func IdentifyReplyCommandTerminalLevelsParse(readBuffer utils.ReadBuffer, attribute Attribute, numBytes uint8) (IdentifyReplyCommandTerminalLevels, error) {
 	positionAware := readBuffer
 	_ = positionAware
 	if pullErr := readBuffer.PullContext("IdentifyReplyCommandTerminalLevels"); pullErr != nil {
@@ -118,7 +118,9 @@ func IdentifyReplyCommandTerminalLevelsParse(readBuffer utils.ReadBuffer, attrib
 
 	// Create a partially initialized instance
 	_child := &_IdentifyReplyCommandTerminalLevels{
-		_IdentifyReplyCommand: &_IdentifyReplyCommand{},
+		_IdentifyReplyCommand: &_IdentifyReplyCommand{
+			NumBytes: numBytes,
+		},
 	}
 	_child._IdentifyReplyCommand._IdentifyReplyCommandChildRequirements = _child
 	return _child, nil
diff --git a/plc4go/protocols/cbus/readwrite/model/IdentifyReplyCommandType.go b/plc4go/protocols/cbus/readwrite/model/IdentifyReplyCommandType.go
index d4d34fddd..bf3c5e776 100644
--- a/plc4go/protocols/cbus/readwrite/model/IdentifyReplyCommandType.go
+++ b/plc4go/protocols/cbus/readwrite/model/IdentifyReplyCommandType.go
@@ -83,10 +83,10 @@ func (m *_IdentifyReplyCommandType) GetUnitType() string {
 ///////////////////////////////////////////////////////////
 
 // NewIdentifyReplyCommandType factory function for _IdentifyReplyCommandType
-func NewIdentifyReplyCommandType(unitType string) *_IdentifyReplyCommandType {
+func NewIdentifyReplyCommandType(unitType string, numBytes uint8) *_IdentifyReplyCommandType {
 	_result := &_IdentifyReplyCommandType{
 		UnitType:              unitType,
-		_IdentifyReplyCommand: NewIdentifyReplyCommand(),
+		_IdentifyReplyCommand: NewIdentifyReplyCommand(numBytes),
 	}
 	_result._IdentifyReplyCommand._IdentifyReplyCommandChildRequirements = _result
 	return _result
@@ -124,7 +124,7 @@ func (m *_IdentifyReplyCommandType) GetLengthInBytes() uint16 {
 	return m.GetLengthInBits() / 8
 }
 
-func IdentifyReplyCommandTypeParse(readBuffer utils.ReadBuffer, attribute Attribute) (IdentifyReplyCommandType, error) {
+func IdentifyReplyCommandTypeParse(readBuffer utils.ReadBuffer, attribute Attribute, numBytes uint8) (IdentifyReplyCommandType, error) {
 	positionAware := readBuffer
 	_ = positionAware
 	if pullErr := readBuffer.PullContext("IdentifyReplyCommandType"); pullErr != nil {
@@ -146,8 +146,10 @@ func IdentifyReplyCommandTypeParse(readBuffer utils.ReadBuffer, attribute Attrib
 
 	// Create a partially initialized instance
 	_child := &_IdentifyReplyCommandType{
-		UnitType:              unitType,
-		_IdentifyReplyCommand: &_IdentifyReplyCommand{},
+		UnitType: unitType,
+		_IdentifyReplyCommand: &_IdentifyReplyCommand{
+			NumBytes: numBytes,
+		},
 	}
 	_child._IdentifyReplyCommand._IdentifyReplyCommandChildRequirements = _child
 	return _child, nil
diff --git a/plc4go/protocols/cbus/readwrite/model/IdentifyReplyCommandUnitSummary.go b/plc4go/protocols/cbus/readwrite/model/IdentifyReplyCommandUnitSummary.go
new file mode 100644
index 000000000..b654abb0e
--- /dev/null
+++ b/plc4go/protocols/cbus/readwrite/model/IdentifyReplyCommandUnitSummary.go
@@ -0,0 +1,325 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   https://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package model
+
+import (
+	"github.com/apache/plc4x/plc4go/internal/spi/utils"
+	"github.com/pkg/errors"
+)
+
+// Code generated by code-generation. DO NOT EDIT.
+
+// IdentifyReplyCommandUnitSummary is the corresponding interface of IdentifyReplyCommandUnitSummary
+type IdentifyReplyCommandUnitSummary interface {
+	utils.LengthAware
+	utils.Serializable
+	// GetAssertingNetworkBurden returns AssertingNetworkBurden (property field)
+	GetAssertingNetworkBurden() bool
+	// GetRestrikeTimingActive returns RestrikeTimingActive (property field)
+	GetRestrikeTimingActive() bool
+	// GetRemoteOFFInputAsserted returns RemoteOFFInputAsserted (property field)
+	GetRemoteOFFInputAsserted() bool
+	// GetRemoteONInputAsserted returns RemoteONInputAsserted (property field)
+	GetRemoteONInputAsserted() bool
+	// GetLocalToggleEnabled returns LocalToggleEnabled (property field)
+	GetLocalToggleEnabled() bool
+	// GetLocalToggleActiveState returns LocalToggleActiveState (property field)
+	GetLocalToggleActiveState() bool
+	// GetClockGenerationEnabled returns ClockGenerationEnabled (property field)
+	GetClockGenerationEnabled() bool
+	// GetUnitGeneratingClock returns UnitGeneratingClock (property field)
+	GetUnitGeneratingClock() bool
+}
+
+// IdentifyReplyCommandUnitSummaryExactly can be used when we want exactly this type and not a type which fulfills IdentifyReplyCommandUnitSummary.
+// This is useful for switch cases.
+type IdentifyReplyCommandUnitSummaryExactly interface {
+	IdentifyReplyCommandUnitSummary
+	isIdentifyReplyCommandUnitSummary() bool
+}
+
+// _IdentifyReplyCommandUnitSummary is the data-structure of this message
+type _IdentifyReplyCommandUnitSummary struct {
+	AssertingNetworkBurden bool
+	RestrikeTimingActive   bool
+	RemoteOFFInputAsserted bool
+	RemoteONInputAsserted  bool
+	LocalToggleEnabled     bool
+	LocalToggleActiveState bool
+	ClockGenerationEnabled bool
+	UnitGeneratingClock    bool
+}
+
+///////////////////////////////////////////////////////////
+///////////////////////////////////////////////////////////
+/////////////////////// Accessors for property fields.
+///////////////////////
+
+func (m *_IdentifyReplyCommandUnitSummary) GetAssertingNetworkBurden() bool {
+	return m.AssertingNetworkBurden
+}
+
+func (m *_IdentifyReplyCommandUnitSummary) GetRestrikeTimingActive() bool {
+	return m.RestrikeTimingActive
+}
+
+func (m *_IdentifyReplyCommandUnitSummary) GetRemoteOFFInputAsserted() bool {
+	return m.RemoteOFFInputAsserted
+}
+
+func (m *_IdentifyReplyCommandUnitSummary) GetRemoteONInputAsserted() bool {
+	return m.RemoteONInputAsserted
+}
+
+func (m *_IdentifyReplyCommandUnitSummary) GetLocalToggleEnabled() bool {
+	return m.LocalToggleEnabled
+}
+
+func (m *_IdentifyReplyCommandUnitSummary) GetLocalToggleActiveState() bool {
+	return m.LocalToggleActiveState
+}
+
+func (m *_IdentifyReplyCommandUnitSummary) GetClockGenerationEnabled() bool {
+	return m.ClockGenerationEnabled
+}
+
+func (m *_IdentifyReplyCommandUnitSummary) GetUnitGeneratingClock() bool {
+	return m.UnitGeneratingClock
+}
+
+///////////////////////
+///////////////////////
+///////////////////////////////////////////////////////////
+///////////////////////////////////////////////////////////
+
+// NewIdentifyReplyCommandUnitSummary factory function for _IdentifyReplyCommandUnitSummary
+func NewIdentifyReplyCommandUnitSummary(assertingNetworkBurden bool, restrikeTimingActive bool, remoteOFFInputAsserted bool, remoteONInputAsserted bool, localToggleEnabled bool, localToggleActiveState bool, clockGenerationEnabled bool, unitGeneratingClock bool) *_IdentifyReplyCommandUnitSummary {
+	return &_IdentifyReplyCommandUnitSummary{AssertingNetworkBurden: assertingNetworkBurden, RestrikeTimingActive: restrikeTimingActive, RemoteOFFInputAsserted: remoteOFFInputAsserted, RemoteONInputAsserted: remoteONInputAsserted, LocalToggleEnabled: localToggleEnabled, LocalToggleActiveState: localToggleActiveState, ClockGenerationEnabled: clockGenerationEnabled, UnitGeneratingClock: unitGeneratingClock}
+}
+
+// Deprecated: use the interface for direct cast
+func CastIdentifyReplyCommandUnitSummary(structType interface{}) IdentifyReplyCommandUnitSummary {
+	if casted, ok := structType.(IdentifyReplyCommandUnitSummary); ok {
+		return casted
+	}
+	if casted, ok := structType.(*IdentifyReplyCommandUnitSummary); ok {
+		return *casted
+	}
+	return nil
+}
+
+func (m *_IdentifyReplyCommandUnitSummary) GetTypeName() string {
+	return "IdentifyReplyCommandUnitSummary"
+}
+
+func (m *_IdentifyReplyCommandUnitSummary) GetLengthInBits() uint16 {
+	return m.GetLengthInBitsConditional(false)
+}
+
+func (m *_IdentifyReplyCommandUnitSummary) GetLengthInBitsConditional(lastItem bool) uint16 {
+	lengthInBits := uint16(0)
+
+	// Simple field (assertingNetworkBurden)
+	lengthInBits += 1
+
+	// Simple field (restrikeTimingActive)
+	lengthInBits += 1
+
+	// Simple field (remoteOFFInputAsserted)
+	lengthInBits += 1
+
+	// Simple field (remoteONInputAsserted)
+	lengthInBits += 1
+
+	// Simple field (localToggleEnabled)
+	lengthInBits += 1
+
+	// Simple field (localToggleActiveState)
+	lengthInBits += 1
+
+	// Simple field (clockGenerationEnabled)
+	lengthInBits += 1
+
+	// Simple field (unitGeneratingClock)
+	lengthInBits += 1
+
+	return lengthInBits
+}
+
+func (m *_IdentifyReplyCommandUnitSummary) GetLengthInBytes() uint16 {
+	return m.GetLengthInBits() / 8
+}
+
+func IdentifyReplyCommandUnitSummaryParse(readBuffer utils.ReadBuffer) (IdentifyReplyCommandUnitSummary, error) {
+	positionAware := readBuffer
+	_ = positionAware
+	if pullErr := readBuffer.PullContext("IdentifyReplyCommandUnitSummary"); pullErr != nil {
+		return nil, errors.Wrap(pullErr, "Error pulling for IdentifyReplyCommandUnitSummary")
+	}
+	currentPos := positionAware.GetPos()
+	_ = currentPos
+
+	// Simple Field (assertingNetworkBurden)
+	_assertingNetworkBurden, _assertingNetworkBurdenErr := readBuffer.ReadBit("assertingNetworkBurden")
+	if _assertingNetworkBurdenErr != nil {
+		return nil, errors.Wrap(_assertingNetworkBurdenErr, "Error parsing 'assertingNetworkBurden' field of IdentifyReplyCommandUnitSummary")
+	}
+	assertingNetworkBurden := _assertingNetworkBurden
+
+	// Simple Field (restrikeTimingActive)
+	_restrikeTimingActive, _restrikeTimingActiveErr := readBuffer.ReadBit("restrikeTimingActive")
+	if _restrikeTimingActiveErr != nil {
+		return nil, errors.Wrap(_restrikeTimingActiveErr, "Error parsing 'restrikeTimingActive' field of IdentifyReplyCommandUnitSummary")
+	}
+	restrikeTimingActive := _restrikeTimingActive
+
+	// Simple Field (remoteOFFInputAsserted)
+	_remoteOFFInputAsserted, _remoteOFFInputAssertedErr := readBuffer.ReadBit("remoteOFFInputAsserted")
+	if _remoteOFFInputAssertedErr != nil {
+		return nil, errors.Wrap(_remoteOFFInputAssertedErr, "Error parsing 'remoteOFFInputAsserted' field of IdentifyReplyCommandUnitSummary")
+	}
+	remoteOFFInputAsserted := _remoteOFFInputAsserted
+
+	// Simple Field (remoteONInputAsserted)
+	_remoteONInputAsserted, _remoteONInputAssertedErr := readBuffer.ReadBit("remoteONInputAsserted")
+	if _remoteONInputAssertedErr != nil {
+		return nil, errors.Wrap(_remoteONInputAssertedErr, "Error parsing 'remoteONInputAsserted' field of IdentifyReplyCommandUnitSummary")
+	}
+	remoteONInputAsserted := _remoteONInputAsserted
+
+	// Simple Field (localToggleEnabled)
+	_localToggleEnabled, _localToggleEnabledErr := readBuffer.ReadBit("localToggleEnabled")
+	if _localToggleEnabledErr != nil {
+		return nil, errors.Wrap(_localToggleEnabledErr, "Error parsing 'localToggleEnabled' field of IdentifyReplyCommandUnitSummary")
+	}
+	localToggleEnabled := _localToggleEnabled
+
+	// Simple Field (localToggleActiveState)
+	_localToggleActiveState, _localToggleActiveStateErr := readBuffer.ReadBit("localToggleActiveState")
+	if _localToggleActiveStateErr != nil {
+		return nil, errors.Wrap(_localToggleActiveStateErr, "Error parsing 'localToggleActiveState' field of IdentifyReplyCommandUnitSummary")
+	}
+	localToggleActiveState := _localToggleActiveState
+
+	// Simple Field (clockGenerationEnabled)
+	_clockGenerationEnabled, _clockGenerationEnabledErr := readBuffer.ReadBit("clockGenerationEnabled")
+	if _clockGenerationEnabledErr != nil {
+		return nil, errors.Wrap(_clockGenerationEnabledErr, "Error parsing 'clockGenerationEnabled' field of IdentifyReplyCommandUnitSummary")
+	}
+	clockGenerationEnabled := _clockGenerationEnabled
+
+	// Simple Field (unitGeneratingClock)
+	_unitGeneratingClock, _unitGeneratingClockErr := readBuffer.ReadBit("unitGeneratingClock")
+	if _unitGeneratingClockErr != nil {
+		return nil, errors.Wrap(_unitGeneratingClockErr, "Error parsing 'unitGeneratingClock' field of IdentifyReplyCommandUnitSummary")
+	}
+	unitGeneratingClock := _unitGeneratingClock
+
+	if closeErr := readBuffer.CloseContext("IdentifyReplyCommandUnitSummary"); closeErr != nil {
+		return nil, errors.Wrap(closeErr, "Error closing for IdentifyReplyCommandUnitSummary")
+	}
+
+	// Create the instance
+	return NewIdentifyReplyCommandUnitSummary(assertingNetworkBurden, restrikeTimingActive, remoteOFFInputAsserted, remoteONInputAsserted, localToggleEnabled, localToggleActiveState, clockGenerationEnabled, unitGeneratingClock), nil
+}
+
+func (m *_IdentifyReplyCommandUnitSummary) Serialize(writeBuffer utils.WriteBuffer) error {
+	positionAware := writeBuffer
+	_ = positionAware
+	if pushErr := writeBuffer.PushContext("IdentifyReplyCommandUnitSummary"); pushErr != nil {
+		return errors.Wrap(pushErr, "Error pushing for IdentifyReplyCommandUnitSummary")
+	}
+
+	// Simple Field (assertingNetworkBurden)
+	assertingNetworkBurden := bool(m.GetAssertingNetworkBurden())
+	_assertingNetworkBurdenErr := writeBuffer.WriteBit("assertingNetworkBurden", (assertingNetworkBurden))
+	if _assertingNetworkBurdenErr != nil {
+		return errors.Wrap(_assertingNetworkBurdenErr, "Error serializing 'assertingNetworkBurden' field")
+	}
+
+	// Simple Field (restrikeTimingActive)
+	restrikeTimingActive := bool(m.GetRestrikeTimingActive())
+	_restrikeTimingActiveErr := writeBuffer.WriteBit("restrikeTimingActive", (restrikeTimingActive))
+	if _restrikeTimingActiveErr != nil {
+		return errors.Wrap(_restrikeTimingActiveErr, "Error serializing 'restrikeTimingActive' field")
+	}
+
+	// Simple Field (remoteOFFInputAsserted)
+	remoteOFFInputAsserted := bool(m.GetRemoteOFFInputAsserted())
+	_remoteOFFInputAssertedErr := writeBuffer.WriteBit("remoteOFFInputAsserted", (remoteOFFInputAsserted))
+	if _remoteOFFInputAssertedErr != nil {
+		return errors.Wrap(_remoteOFFInputAssertedErr, "Error serializing 'remoteOFFInputAsserted' field")
+	}
+
+	// Simple Field (remoteONInputAsserted)
+	remoteONInputAsserted := bool(m.GetRemoteONInputAsserted())
+	_remoteONInputAssertedErr := writeBuffer.WriteBit("remoteONInputAsserted", (remoteONInputAsserted))
+	if _remoteONInputAssertedErr != nil {
+		return errors.Wrap(_remoteONInputAssertedErr, "Error serializing 'remoteONInputAsserted' field")
+	}
+
+	// Simple Field (localToggleEnabled)
+	localToggleEnabled := bool(m.GetLocalToggleEnabled())
+	_localToggleEnabledErr := writeBuffer.WriteBit("localToggleEnabled", (localToggleEnabled))
+	if _localToggleEnabledErr != nil {
+		return errors.Wrap(_localToggleEnabledErr, "Error serializing 'localToggleEnabled' field")
+	}
+
+	// Simple Field (localToggleActiveState)
+	localToggleActiveState := bool(m.GetLocalToggleActiveState())
+	_localToggleActiveStateErr := writeBuffer.WriteBit("localToggleActiveState", (localToggleActiveState))
+	if _localToggleActiveStateErr != nil {
+		return errors.Wrap(_localToggleActiveStateErr, "Error serializing 'localToggleActiveState' field")
+	}
+
+	// Simple Field (clockGenerationEnabled)
+	clockGenerationEnabled := bool(m.GetClockGenerationEnabled())
+	_clockGenerationEnabledErr := writeBuffer.WriteBit("clockGenerationEnabled", (clockGenerationEnabled))
+	if _clockGenerationEnabledErr != nil {
+		return errors.Wrap(_clockGenerationEnabledErr, "Error serializing 'clockGenerationEnabled' field")
+	}
+
+	// Simple Field (unitGeneratingClock)
+	unitGeneratingClock := bool(m.GetUnitGeneratingClock())
+	_unitGeneratingClockErr := writeBuffer.WriteBit("unitGeneratingClock", (unitGeneratingClock))
+	if _unitGeneratingClockErr != nil {
+		return errors.Wrap(_unitGeneratingClockErr, "Error serializing 'unitGeneratingClock' field")
+	}
+
+	if popErr := writeBuffer.PopContext("IdentifyReplyCommandUnitSummary"); popErr != nil {
+		return errors.Wrap(popErr, "Error popping for IdentifyReplyCommandUnitSummary")
+	}
+	return nil
+}
+
+func (m *_IdentifyReplyCommandUnitSummary) isIdentifyReplyCommandUnitSummary() bool {
+	return true
+}
+
+func (m *_IdentifyReplyCommandUnitSummary) String() string {
+	if m == nil {
+		return "<nil>"
+	}
+	writeBuffer := utils.NewBoxedWriteBufferWithOptions(true, true)
+	if err := writeBuffer.WriteSerializable(m); err != nil {
+		return err.Error()
+	}
+	return writeBuffer.GetBox().String()
+}
diff --git a/plc4go/tools/plc4xpcapanalyzer/internal/cbusanalyzer/analyzer.go b/plc4go/tools/plc4xpcapanalyzer/internal/cbusanalyzer/analyzer.go
index 180394e79..3cd8dd9fd 100644
--- a/plc4go/tools/plc4xpcapanalyzer/internal/cbusanalyzer/analyzer.go
+++ b/plc4go/tools/plc4xpcapanalyzer/internal/cbusanalyzer/analyzer.go
@@ -72,8 +72,13 @@ func (a *Analyzer) PackageParse(packetInformation common.PacketInformation, payl
 				log.Debug().Msgf("No.[%d] CAL request detected", packetInformation.PacketNumber)
 				a.requestContext = model.NewRequestContext(true, false, false)
 			case model.CBusCommandPointToPointExactly:
+				sendIdentifyRequestBefore := false
 				log.Debug().Msgf("No.[%d] CAL request detected", packetInformation.PacketNumber)
-				a.requestContext = model.NewRequestContext(true, false, false)
+				switch command.GetCommand().GetCalData().(type) {
+				case model.CALDataIdentifyExactly:
+					sendIdentifyRequestBefore = true
+				}
+				a.requestContext = model.NewRequestContext(true, false, sendIdentifyRequestBefore)
 			case model.CBusCommandPointToMultiPointExactly:
 				switch command.GetCommand().(type) {
 				case model.CBusPointToMultiPointCommandStatusExactly:
diff --git a/protocols/c-bus/src/main/resources/protocols/cbus/c-bus.mspec b/protocols/c-bus/src/main/resources/protocols/cbus/c-bus.mspec
index cbabc8723..fc0acc692 100644
--- a/protocols/c-bus/src/main/resources/protocols/cbus/c-bus.mspec
+++ b/protocols/c-bus/src/main/resources/protocols/cbus/c-bus.mspec
@@ -592,8 +592,9 @@
             [simple uint 8    code                                                          ]
         ]
         ['REPLY', 'true'    *IdentifyReply(CALCommandTypeContainer commandTypeContainer) // Reply
-            [simple Attribute attribute                                                     ]
-            [simple IdentifyReplyCommand('attribute') identifyReplyCommand                  ]
+            [simple Attribute   attribute                                                   ]
+            [simple IdentifyReplyCommand('attribute', 'commandTypeContainer.numBytes-1') // We substract 1 byte as it was used by the attribute
+                                identifyReplyCommand                                        ]
         ]
         ['REPLY'            *Reply(CALCommandTypeContainer commandTypeContainer) // Reply
             [simple uint 8 paramNumber                                                      ]
@@ -981,7 +982,7 @@
     ['0x11' DSIStatus                 ['10']]
 ]
 
-[type IdentifyReplyCommand(Attribute attribute)
+[type IdentifyReplyCommand(Attribute attribute, uint 5 numBytes)
     [typeSwitch attribute
         ['Manufacturer'                 IdentifyReplyCommandManufacturer
             [simple string 64  manufacturerName ]
@@ -998,28 +999,29 @@
             [simple string 32  version          ]
         ]
         ['ExtendedDiagnosticSummary'    IdentifyReplyCommandExtendedDiagnosticSummary
-            [simple ApplicationIdContainer  lowApplication         ]
-            [simple ApplicationIdContainer  highApplication        ]
-            [simple byte                    area                   ]
-            [simple uint 16                 crc                    ]
-            [simple uint 32                 serialNumber           ]
-            [simple byte                    networkVoltage         ]
-            [simple bit                     outputUnit             ]
-            [simple bit                     enableChecksumAlarm    ]
-            [reserved uint 1                '0'                    ]
-            [reserved uint 1                '0'                    ]
-            [reserved uint 1                '0'                    ]
-            [simple bit                     networkVoltageMarginal ]
-            [simple bit                     networkVoltageLow      ]
-            [simple bit                     unitInLearnMode        ]
-            [simple bit                     microPowerReset        ]
-            [simple bit                     internalStackOverflow  ]
-            [simple bit                     commsTxError           ]
-            [simple bit                     microReset             ]
-            [simple bit                     EEDataError            ]
-            [simple bit                     EEChecksumError        ]
-            [simple bit                     EEWriteError           ]
-            [simple bit                     installationMMIError   ]
+            [simple   ApplicationIdContainer  lowApplication         ]
+            [simple   ApplicationIdContainer  highApplication        ]
+            [simple   byte                    area                   ]
+            [simple   uint 16                 crc                    ]
+            [simple   uint 32                 serialNumber           ]
+            [simple   byte                    networkVoltage         ]
+            [virtual  float 32                networkVoltageInVolts 'networkVoltage/6.375']
+            [simple   bit                     unitInLearnMode        ]
+            [simple   bit                     networkVoltageLow      ]
+            [simple   bit                     networkVoltageMarginal ]
+            [reserved uint 1                  '0'                    ]
+            [reserved uint 1                  '0'                    ]
+            [reserved uint 1                  '0'                    ]
+            [simple   bit                     enableChecksumAlarm    ]
+            [simple   bit                     outputUnit             ]
+            [simple   bit                     installationMMIError   ]
+            [simple   bit                     EEWriteError           ]
+            [simple   bit                     EEChecksumError        ]
+            [simple   bit                     EEDataError            ]
+            [simple   bit                     microReset             ]
+            [simple   bit                     commsTxError           ]
+            [simple   bit                     internalStackOverflow  ]
+            [simple   bit                     microPowerReset        ]
         ]
         ['NetworkTerminalLevels'        IdentifyReplyCommandNetworkTerminalLevels
             //TODO: read dynamic
@@ -1058,7 +1060,12 @@
             //TODO: read dynamic
         ]
         ['OutputUnitSummary'            IdentifyReplyCommandOutputUnitSummary
-            //TODO: read dynamic
+            // TODO: we can use the bytes from above, but how is that dynamic? repeat the complete block here?
+            [simple   IdentifyReplyCommandUnitSummary
+                             unitFlags                              ]
+            [simple   byte   gavStoreEnabledByte1                   ]
+            [simple   byte   gavStoreEnabledByte2                   ]
+            [simple   uint 8 timeFromLastRecoverOfMainsInSeconds    ]
         ]
         ['DSIStatus'                    IdentifyReplyCommandDSIStatus
             [simple ChannelStatus   channelStatus1          ]
@@ -1075,6 +1082,17 @@
     ]
 ]
 
+[type IdentifyReplyCommandUnitSummary
+    [simple bit assertingNetworkBurden  ]
+    [simple bit restrikeTimingActive    ]
+    [simple bit remoteOFFInputAsserted  ]
+    [simple bit remoteONInputAsserted   ]
+    [simple bit localToggleEnabled      ]
+    [simple bit localToggleActiveState  ]
+    [simple bit clockGenerationEnabled  ]
+    [simple bit unitGeneratingClock     ]
+]
+
 [enum uint 8 ChannelStatus
     ['0'    OK                      ]
     ['2'    LAMP_FAULT              ]