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/05/11 16:13:19 UTC

[plc4x] branch develop updated: feat(bacnet): implemented BACnetConstructedDataLifeSafetyZoneMembers and BACnetConstructedDataLifeSafetyZoneMembers

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 986009ecca feat(bacnet): implemented BACnetConstructedDataLifeSafetyZoneMembers and BACnetConstructedDataLifeSafetyZoneMembers
986009ecca is described below

commit 986009eccaedd211c4aad7836c8e926397a584a9
Author: Sebastian Rühl <sr...@apache.org>
AuthorDate: Wed May 11 18:13:05 2022 +0200

    feat(bacnet): implemented BACnetConstructedDataLifeSafetyZoneMembers and BACnetConstructedDataLifeSafetyZoneMembers
---
 .../plc4go/bacnetip/readwrite/ParserHelper.go      |   2 +
 .../plc4go/bacnetip/readwrite/XmlParserHelper.go   |   2 +
 .../readwrite/model/BACnetConstructedData.go       |   6 +-
 ...BACnetConstructedDataLifeSafetyZoneMemberOf.go} |  68 +++----
 ... BACnetConstructedDataLifeSafetyZoneMembers.go} |  68 +++----
 .../readwrite/model/BACnetDeviceObjectReference.go | 206 +++++++++++++++++++++
 .../plc4x/java/bacnetip/RandomPackagesTest.java    |  42 ++---
 .../resources/protocols/bacnetip/bacnetip.mspec    |  17 +-
 8 files changed, 318 insertions(+), 93 deletions(-)

diff --git a/plc4go/internal/plc4go/bacnetip/readwrite/ParserHelper.go b/plc4go/internal/plc4go/bacnetip/readwrite/ParserHelper.go
index 2380d7c090..80f0919e5e 100644
--- a/plc4go/internal/plc4go/bacnetip/readwrite/ParserHelper.go
+++ b/plc4go/internal/plc4go/bacnetip/readwrite/ParserHelper.go
@@ -49,6 +49,8 @@ func (m BacnetipParserHelper) Parse(typeName string, arguments []string, io util
 		return model.BACnetReadAccessPropertyErrorParse(io)
 	case "BACnetTagPayloadReal":
 		return model.BACnetTagPayloadRealParse(io)
+	case "BACnetDeviceObjectReference":
+		return model.BACnetDeviceObjectReferenceParse(io)
 	case "BVLCForeignDeviceTableEntry":
 		return model.BVLCForeignDeviceTableEntryParse(io)
 	case "NLM":
diff --git a/plc4go/internal/plc4go/bacnetip/readwrite/XmlParserHelper.go b/plc4go/internal/plc4go/bacnetip/readwrite/XmlParserHelper.go
index 9f7b694c6a..c407e0a332 100644
--- a/plc4go/internal/plc4go/bacnetip/readwrite/XmlParserHelper.go
+++ b/plc4go/internal/plc4go/bacnetip/readwrite/XmlParserHelper.go
@@ -61,6 +61,8 @@ func (m BacnetipXmlParserHelper) Parse(typeName string, xmlString string, parser
 		return model.BACnetReadAccessPropertyErrorParse(utils.NewXmlReadBuffer(strings.NewReader(xmlString)))
 	case "BACnetTagPayloadReal":
 		return model.BACnetTagPayloadRealParse(utils.NewXmlReadBuffer(strings.NewReader(xmlString)))
+	case "BACnetDeviceObjectReference":
+		return model.BACnetDeviceObjectReferenceParse(utils.NewXmlReadBuffer(strings.NewReader(xmlString)))
 	case "BVLCForeignDeviceTableEntry":
 		return model.BVLCForeignDeviceTableEntryParse(utils.NewXmlReadBuffer(strings.NewReader(xmlString)))
 	case "NLM":
diff --git a/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConstructedData.go b/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConstructedData.go
index d181657104..7a19813ddc 100644
--- a/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConstructedData.go
+++ b/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConstructedData.go
@@ -183,8 +183,10 @@ func BACnetConstructedDataParse(readBuffer utils.ReadBuffer, tagNumber uint8, ob
 	switch {
 	case objectType == BACnetObjectType_COMMAND: // BACnetConstructedDataCommand
 		_child, typeSwitchError = BACnetConstructedDataCommandParse(readBuffer, tagNumber, objectType, propertyIdentifierArgument)
-	case objectType == BACnetObjectType_LIFE_SAFETY_ZONE: // BACnetConstructedDataLifeSafetyZone
-		_child, typeSwitchError = BACnetConstructedDataLifeSafetyZoneParse(readBuffer, tagNumber, objectType, propertyIdentifierArgument)
+	case objectType == BACnetObjectType_LIFE_SAFETY_ZONE && propertyIdentifierEnum == BACnetPropertyIdentifier_ZONE_MEMBERS: // BACnetConstructedDataLifeSafetyZoneMembers
+		_child, typeSwitchError = BACnetConstructedDataLifeSafetyZoneMembersParse(readBuffer, tagNumber, objectType, propertyIdentifierArgument)
+	case objectType == BACnetObjectType_LIFE_SAFETY_ZONE && propertyIdentifierEnum == BACnetPropertyIdentifier_MEMBER_OF: // BACnetConstructedDataLifeSafetyZoneMemberOf
+		_child, typeSwitchError = BACnetConstructedDataLifeSafetyZoneMemberOfParse(readBuffer, tagNumber, objectType, propertyIdentifierArgument)
 	case true && propertyIdentifierEnum == BACnetPropertyIdentifier_EVENT_TIME_STAMPS: // BACnetConstructedDataEventTimestamps
 		_child, typeSwitchError = BACnetConstructedDataEventTimestampsParse(readBuffer, tagNumber, objectType, propertyIdentifierArgument)
 	case true && propertyIdentifierEnum == BACnetPropertyIdentifier_LIST_OF_OBJECT_PROPERTY_REFERENCES: // BACnetConstructedDataListOfObjectPropertyReferences
diff --git a/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConstructedDataLifeSafetyZone.go b/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConstructedDataLifeSafetyZoneMemberOf.go
similarity index 63%
copy from plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConstructedDataLifeSafetyZone.go
copy to plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConstructedDataLifeSafetyZoneMemberOf.go
index d4e59790c5..537d08c019 100644
--- a/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConstructedDataLifeSafetyZone.go
+++ b/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConstructedDataLifeSafetyZoneMemberOf.go
@@ -26,21 +26,21 @@ import (
 
 // Code generated by code-generation. DO NOT EDIT.
 
-// BACnetConstructedDataLifeSafetyZone is the data-structure of this message
-type BACnetConstructedDataLifeSafetyZone struct {
+// BACnetConstructedDataLifeSafetyZoneMemberOf is the data-structure of this message
+type BACnetConstructedDataLifeSafetyZoneMemberOf struct {
 	*BACnetConstructedData
-	Zones []*BACnetContextTagObjectIdentifier
+	Zones []*BACnetDeviceObjectReference
 
 	// Arguments.
 	TagNumber                  uint8
 	PropertyIdentifierArgument BACnetContextTagPropertyIdentifier
 }
 
-// IBACnetConstructedDataLifeSafetyZone is the corresponding interface of BACnetConstructedDataLifeSafetyZone
-type IBACnetConstructedDataLifeSafetyZone interface {
+// IBACnetConstructedDataLifeSafetyZoneMemberOf is the corresponding interface of BACnetConstructedDataLifeSafetyZoneMemberOf
+type IBACnetConstructedDataLifeSafetyZoneMemberOf interface {
 	IBACnetConstructedData
 	// GetZones returns Zones (property field)
-	GetZones() []*BACnetContextTagObjectIdentifier
+	GetZones() []*BACnetDeviceObjectReference
 	// GetLengthInBytes returns the length in bytes
 	GetLengthInBytes() uint16
 	// GetLengthInBits returns the length in bits
@@ -54,7 +54,7 @@ type IBACnetConstructedDataLifeSafetyZone interface {
 /////////////////////// Accessors for discriminator values.
 ///////////////////////
 
-func (m *BACnetConstructedDataLifeSafetyZone) GetObjectType() BACnetObjectType {
+func (m *BACnetConstructedDataLifeSafetyZoneMemberOf) GetObjectType() BACnetObjectType {
 	return BACnetObjectType_LIFE_SAFETY_ZONE
 }
 
@@ -63,12 +63,12 @@ func (m *BACnetConstructedDataLifeSafetyZone) GetObjectType() BACnetObjectType {
 ///////////////////////////////////////////////////////////
 ///////////////////////////////////////////////////////////
 
-func (m *BACnetConstructedDataLifeSafetyZone) InitializeParent(parent *BACnetConstructedData, openingTag *BACnetOpeningTag, closingTag *BACnetClosingTag) {
+func (m *BACnetConstructedDataLifeSafetyZoneMemberOf) InitializeParent(parent *BACnetConstructedData, openingTag *BACnetOpeningTag, closingTag *BACnetClosingTag) {
 	m.BACnetConstructedData.OpeningTag = openingTag
 	m.BACnetConstructedData.ClosingTag = closingTag
 }
 
-func (m *BACnetConstructedDataLifeSafetyZone) GetParent() *BACnetConstructedData {
+func (m *BACnetConstructedDataLifeSafetyZoneMemberOf) GetParent() *BACnetConstructedData {
 	return m.BACnetConstructedData
 }
 
@@ -77,7 +77,7 @@ func (m *BACnetConstructedDataLifeSafetyZone) GetParent() *BACnetConstructedData
 /////////////////////// Accessors for property fields.
 ///////////////////////
 
-func (m *BACnetConstructedDataLifeSafetyZone) GetZones() []*BACnetContextTagObjectIdentifier {
+func (m *BACnetConstructedDataLifeSafetyZoneMemberOf) GetZones() []*BACnetDeviceObjectReference {
 	return m.Zones
 }
 
@@ -86,9 +86,9 @@ func (m *BACnetConstructedDataLifeSafetyZone) GetZones() []*BACnetContextTagObje
 ///////////////////////////////////////////////////////////
 ///////////////////////////////////////////////////////////
 
-// NewBACnetConstructedDataLifeSafetyZone factory function for BACnetConstructedDataLifeSafetyZone
-func NewBACnetConstructedDataLifeSafetyZone(zones []*BACnetContextTagObjectIdentifier, openingTag *BACnetOpeningTag, closingTag *BACnetClosingTag, tagNumber uint8, propertyIdentifierArgument BACnetContextTagPropertyIdentifier) *BACnetConstructedDataLifeSafetyZone {
-	_result := &BACnetConstructedDataLifeSafetyZone{
+// NewBACnetConstructedDataLifeSafetyZoneMemberOf factory function for BACnetConstructedDataLifeSafetyZoneMemberOf
+func NewBACnetConstructedDataLifeSafetyZoneMemberOf(zones []*BACnetDeviceObjectReference, openingTag *BACnetOpeningTag, closingTag *BACnetClosingTag, tagNumber uint8, propertyIdentifierArgument BACnetContextTagPropertyIdentifier) *BACnetConstructedDataLifeSafetyZoneMemberOf {
+	_result := &BACnetConstructedDataLifeSafetyZoneMemberOf{
 		Zones:                 zones,
 		BACnetConstructedData: NewBACnetConstructedData(openingTag, closingTag, tagNumber, propertyIdentifierArgument),
 	}
@@ -96,31 +96,31 @@ func NewBACnetConstructedDataLifeSafetyZone(zones []*BACnetContextTagObjectIdent
 	return _result
 }
 
-func CastBACnetConstructedDataLifeSafetyZone(structType interface{}) *BACnetConstructedDataLifeSafetyZone {
-	if casted, ok := structType.(BACnetConstructedDataLifeSafetyZone); ok {
+func CastBACnetConstructedDataLifeSafetyZoneMemberOf(structType interface{}) *BACnetConstructedDataLifeSafetyZoneMemberOf {
+	if casted, ok := structType.(BACnetConstructedDataLifeSafetyZoneMemberOf); ok {
 		return &casted
 	}
-	if casted, ok := structType.(*BACnetConstructedDataLifeSafetyZone); ok {
+	if casted, ok := structType.(*BACnetConstructedDataLifeSafetyZoneMemberOf); ok {
 		return casted
 	}
 	if casted, ok := structType.(BACnetConstructedData); ok {
-		return CastBACnetConstructedDataLifeSafetyZone(casted.Child)
+		return CastBACnetConstructedDataLifeSafetyZoneMemberOf(casted.Child)
 	}
 	if casted, ok := structType.(*BACnetConstructedData); ok {
-		return CastBACnetConstructedDataLifeSafetyZone(casted.Child)
+		return CastBACnetConstructedDataLifeSafetyZoneMemberOf(casted.Child)
 	}
 	return nil
 }
 
-func (m *BACnetConstructedDataLifeSafetyZone) GetTypeName() string {
-	return "BACnetConstructedDataLifeSafetyZone"
+func (m *BACnetConstructedDataLifeSafetyZoneMemberOf) GetTypeName() string {
+	return "BACnetConstructedDataLifeSafetyZoneMemberOf"
 }
 
-func (m *BACnetConstructedDataLifeSafetyZone) GetLengthInBits() uint16 {
+func (m *BACnetConstructedDataLifeSafetyZoneMemberOf) GetLengthInBits() uint16 {
 	return m.GetLengthInBitsConditional(false)
 }
 
-func (m *BACnetConstructedDataLifeSafetyZone) GetLengthInBitsConditional(lastItem bool) uint16 {
+func (m *BACnetConstructedDataLifeSafetyZoneMemberOf) GetLengthInBitsConditional(lastItem bool) uint16 {
 	lengthInBits := uint16(m.GetParentLengthInBits())
 
 	// Array field
@@ -133,12 +133,12 @@ func (m *BACnetConstructedDataLifeSafetyZone) GetLengthInBitsConditional(lastIte
 	return lengthInBits
 }
 
-func (m *BACnetConstructedDataLifeSafetyZone) GetLengthInBytes() uint16 {
+func (m *BACnetConstructedDataLifeSafetyZoneMemberOf) GetLengthInBytes() uint16 {
 	return m.GetLengthInBits() / 8
 }
 
-func BACnetConstructedDataLifeSafetyZoneParse(readBuffer utils.ReadBuffer, tagNumber uint8, objectType BACnetObjectType, propertyIdentifierArgument *BACnetContextTagPropertyIdentifier) (*BACnetConstructedDataLifeSafetyZone, error) {
-	if pullErr := readBuffer.PullContext("BACnetConstructedDataLifeSafetyZone"); pullErr != nil {
+func BACnetConstructedDataLifeSafetyZoneMemberOfParse(readBuffer utils.ReadBuffer, tagNumber uint8, objectType BACnetObjectType, propertyIdentifierArgument *BACnetContextTagPropertyIdentifier) (*BACnetConstructedDataLifeSafetyZoneMemberOf, error) {
+	if pullErr := readBuffer.PullContext("BACnetConstructedDataLifeSafetyZoneMemberOf"); pullErr != nil {
 		return nil, pullErr
 	}
 	currentPos := readBuffer.GetPos()
@@ -149,14 +149,14 @@ func BACnetConstructedDataLifeSafetyZoneParse(readBuffer utils.ReadBuffer, tagNu
 		return nil, pullErr
 	}
 	// Terminated array
-	zones := make([]*BACnetContextTagObjectIdentifier, 0)
+	zones := make([]*BACnetDeviceObjectReference, 0)
 	{
 		for !bool(IsBACnetConstructedDataClosingTag(readBuffer, false, tagNumber)) {
-			_item, _err := BACnetContextTagParse(readBuffer, uint8(1), BACnetDataType_BACNET_OBJECT_IDENTIFIER)
+			_item, _err := BACnetDeviceObjectReferenceParse(readBuffer)
 			if _err != nil {
 				return nil, errors.Wrap(_err, "Error parsing 'zones' field")
 			}
-			zones = append(zones, CastBACnetContextTagObjectIdentifier(_item))
+			zones = append(zones, CastBACnetDeviceObjectReference(_item))
 
 		}
 	}
@@ -164,12 +164,12 @@ func BACnetConstructedDataLifeSafetyZoneParse(readBuffer utils.ReadBuffer, tagNu
 		return nil, closeErr
 	}
 
-	if closeErr := readBuffer.CloseContext("BACnetConstructedDataLifeSafetyZone"); closeErr != nil {
+	if closeErr := readBuffer.CloseContext("BACnetConstructedDataLifeSafetyZoneMemberOf"); closeErr != nil {
 		return nil, closeErr
 	}
 
 	// Create a partially initialized instance
-	_child := &BACnetConstructedDataLifeSafetyZone{
+	_child := &BACnetConstructedDataLifeSafetyZoneMemberOf{
 		Zones:                 zones,
 		BACnetConstructedData: &BACnetConstructedData{},
 	}
@@ -177,9 +177,9 @@ func BACnetConstructedDataLifeSafetyZoneParse(readBuffer utils.ReadBuffer, tagNu
 	return _child, nil
 }
 
-func (m *BACnetConstructedDataLifeSafetyZone) Serialize(writeBuffer utils.WriteBuffer) error {
+func (m *BACnetConstructedDataLifeSafetyZoneMemberOf) Serialize(writeBuffer utils.WriteBuffer) error {
 	ser := func() error {
-		if pushErr := writeBuffer.PushContext("BACnetConstructedDataLifeSafetyZone"); pushErr != nil {
+		if pushErr := writeBuffer.PushContext("BACnetConstructedDataLifeSafetyZoneMemberOf"); pushErr != nil {
 			return pushErr
 		}
 
@@ -199,7 +199,7 @@ func (m *BACnetConstructedDataLifeSafetyZone) Serialize(writeBuffer utils.WriteB
 			}
 		}
 
-		if popErr := writeBuffer.PopContext("BACnetConstructedDataLifeSafetyZone"); popErr != nil {
+		if popErr := writeBuffer.PopContext("BACnetConstructedDataLifeSafetyZoneMemberOf"); popErr != nil {
 			return popErr
 		}
 		return nil
@@ -207,7 +207,7 @@ func (m *BACnetConstructedDataLifeSafetyZone) Serialize(writeBuffer utils.WriteB
 	return m.SerializeParent(writeBuffer, m, ser)
 }
 
-func (m *BACnetConstructedDataLifeSafetyZone) String() string {
+func (m *BACnetConstructedDataLifeSafetyZoneMemberOf) String() string {
 	if m == nil {
 		return "<nil>"
 	}
diff --git a/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConstructedDataLifeSafetyZone.go b/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConstructedDataLifeSafetyZoneMembers.go
similarity index 64%
rename from plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConstructedDataLifeSafetyZone.go
rename to plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConstructedDataLifeSafetyZoneMembers.go
index d4e59790c5..347e796780 100644
--- a/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConstructedDataLifeSafetyZone.go
+++ b/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConstructedDataLifeSafetyZoneMembers.go
@@ -26,21 +26,21 @@ import (
 
 // Code generated by code-generation. DO NOT EDIT.
 
-// BACnetConstructedDataLifeSafetyZone is the data-structure of this message
-type BACnetConstructedDataLifeSafetyZone struct {
+// BACnetConstructedDataLifeSafetyZoneMembers is the data-structure of this message
+type BACnetConstructedDataLifeSafetyZoneMembers struct {
 	*BACnetConstructedData
-	Zones []*BACnetContextTagObjectIdentifier
+	Zones []*BACnetDeviceObjectReference
 
 	// Arguments.
 	TagNumber                  uint8
 	PropertyIdentifierArgument BACnetContextTagPropertyIdentifier
 }
 
-// IBACnetConstructedDataLifeSafetyZone is the corresponding interface of BACnetConstructedDataLifeSafetyZone
-type IBACnetConstructedDataLifeSafetyZone interface {
+// IBACnetConstructedDataLifeSafetyZoneMembers is the corresponding interface of BACnetConstructedDataLifeSafetyZoneMembers
+type IBACnetConstructedDataLifeSafetyZoneMembers interface {
 	IBACnetConstructedData
 	// GetZones returns Zones (property field)
-	GetZones() []*BACnetContextTagObjectIdentifier
+	GetZones() []*BACnetDeviceObjectReference
 	// GetLengthInBytes returns the length in bytes
 	GetLengthInBytes() uint16
 	// GetLengthInBits returns the length in bits
@@ -54,7 +54,7 @@ type IBACnetConstructedDataLifeSafetyZone interface {
 /////////////////////// Accessors for discriminator values.
 ///////////////////////
 
-func (m *BACnetConstructedDataLifeSafetyZone) GetObjectType() BACnetObjectType {
+func (m *BACnetConstructedDataLifeSafetyZoneMembers) GetObjectType() BACnetObjectType {
 	return BACnetObjectType_LIFE_SAFETY_ZONE
 }
 
@@ -63,12 +63,12 @@ func (m *BACnetConstructedDataLifeSafetyZone) GetObjectType() BACnetObjectType {
 ///////////////////////////////////////////////////////////
 ///////////////////////////////////////////////////////////
 
-func (m *BACnetConstructedDataLifeSafetyZone) InitializeParent(parent *BACnetConstructedData, openingTag *BACnetOpeningTag, closingTag *BACnetClosingTag) {
+func (m *BACnetConstructedDataLifeSafetyZoneMembers) InitializeParent(parent *BACnetConstructedData, openingTag *BACnetOpeningTag, closingTag *BACnetClosingTag) {
 	m.BACnetConstructedData.OpeningTag = openingTag
 	m.BACnetConstructedData.ClosingTag = closingTag
 }
 
-func (m *BACnetConstructedDataLifeSafetyZone) GetParent() *BACnetConstructedData {
+func (m *BACnetConstructedDataLifeSafetyZoneMembers) GetParent() *BACnetConstructedData {
 	return m.BACnetConstructedData
 }
 
@@ -77,7 +77,7 @@ func (m *BACnetConstructedDataLifeSafetyZone) GetParent() *BACnetConstructedData
 /////////////////////// Accessors for property fields.
 ///////////////////////
 
-func (m *BACnetConstructedDataLifeSafetyZone) GetZones() []*BACnetContextTagObjectIdentifier {
+func (m *BACnetConstructedDataLifeSafetyZoneMembers) GetZones() []*BACnetDeviceObjectReference {
 	return m.Zones
 }
 
@@ -86,9 +86,9 @@ func (m *BACnetConstructedDataLifeSafetyZone) GetZones() []*BACnetContextTagObje
 ///////////////////////////////////////////////////////////
 ///////////////////////////////////////////////////////////
 
-// NewBACnetConstructedDataLifeSafetyZone factory function for BACnetConstructedDataLifeSafetyZone
-func NewBACnetConstructedDataLifeSafetyZone(zones []*BACnetContextTagObjectIdentifier, openingTag *BACnetOpeningTag, closingTag *BACnetClosingTag, tagNumber uint8, propertyIdentifierArgument BACnetContextTagPropertyIdentifier) *BACnetConstructedDataLifeSafetyZone {
-	_result := &BACnetConstructedDataLifeSafetyZone{
+// NewBACnetConstructedDataLifeSafetyZoneMembers factory function for BACnetConstructedDataLifeSafetyZoneMembers
+func NewBACnetConstructedDataLifeSafetyZoneMembers(zones []*BACnetDeviceObjectReference, openingTag *BACnetOpeningTag, closingTag *BACnetClosingTag, tagNumber uint8, propertyIdentifierArgument BACnetContextTagPropertyIdentifier) *BACnetConstructedDataLifeSafetyZoneMembers {
+	_result := &BACnetConstructedDataLifeSafetyZoneMembers{
 		Zones:                 zones,
 		BACnetConstructedData: NewBACnetConstructedData(openingTag, closingTag, tagNumber, propertyIdentifierArgument),
 	}
@@ -96,31 +96,31 @@ func NewBACnetConstructedDataLifeSafetyZone(zones []*BACnetContextTagObjectIdent
 	return _result
 }
 
-func CastBACnetConstructedDataLifeSafetyZone(structType interface{}) *BACnetConstructedDataLifeSafetyZone {
-	if casted, ok := structType.(BACnetConstructedDataLifeSafetyZone); ok {
+func CastBACnetConstructedDataLifeSafetyZoneMembers(structType interface{}) *BACnetConstructedDataLifeSafetyZoneMembers {
+	if casted, ok := structType.(BACnetConstructedDataLifeSafetyZoneMembers); ok {
 		return &casted
 	}
-	if casted, ok := structType.(*BACnetConstructedDataLifeSafetyZone); ok {
+	if casted, ok := structType.(*BACnetConstructedDataLifeSafetyZoneMembers); ok {
 		return casted
 	}
 	if casted, ok := structType.(BACnetConstructedData); ok {
-		return CastBACnetConstructedDataLifeSafetyZone(casted.Child)
+		return CastBACnetConstructedDataLifeSafetyZoneMembers(casted.Child)
 	}
 	if casted, ok := structType.(*BACnetConstructedData); ok {
-		return CastBACnetConstructedDataLifeSafetyZone(casted.Child)
+		return CastBACnetConstructedDataLifeSafetyZoneMembers(casted.Child)
 	}
 	return nil
 }
 
-func (m *BACnetConstructedDataLifeSafetyZone) GetTypeName() string {
-	return "BACnetConstructedDataLifeSafetyZone"
+func (m *BACnetConstructedDataLifeSafetyZoneMembers) GetTypeName() string {
+	return "BACnetConstructedDataLifeSafetyZoneMembers"
 }
 
-func (m *BACnetConstructedDataLifeSafetyZone) GetLengthInBits() uint16 {
+func (m *BACnetConstructedDataLifeSafetyZoneMembers) GetLengthInBits() uint16 {
 	return m.GetLengthInBitsConditional(false)
 }
 
-func (m *BACnetConstructedDataLifeSafetyZone) GetLengthInBitsConditional(lastItem bool) uint16 {
+func (m *BACnetConstructedDataLifeSafetyZoneMembers) GetLengthInBitsConditional(lastItem bool) uint16 {
 	lengthInBits := uint16(m.GetParentLengthInBits())
 
 	// Array field
@@ -133,12 +133,12 @@ func (m *BACnetConstructedDataLifeSafetyZone) GetLengthInBitsConditional(lastIte
 	return lengthInBits
 }
 
-func (m *BACnetConstructedDataLifeSafetyZone) GetLengthInBytes() uint16 {
+func (m *BACnetConstructedDataLifeSafetyZoneMembers) GetLengthInBytes() uint16 {
 	return m.GetLengthInBits() / 8
 }
 
-func BACnetConstructedDataLifeSafetyZoneParse(readBuffer utils.ReadBuffer, tagNumber uint8, objectType BACnetObjectType, propertyIdentifierArgument *BACnetContextTagPropertyIdentifier) (*BACnetConstructedDataLifeSafetyZone, error) {
-	if pullErr := readBuffer.PullContext("BACnetConstructedDataLifeSafetyZone"); pullErr != nil {
+func BACnetConstructedDataLifeSafetyZoneMembersParse(readBuffer utils.ReadBuffer, tagNumber uint8, objectType BACnetObjectType, propertyIdentifierArgument *BACnetContextTagPropertyIdentifier) (*BACnetConstructedDataLifeSafetyZoneMembers, error) {
+	if pullErr := readBuffer.PullContext("BACnetConstructedDataLifeSafetyZoneMembers"); pullErr != nil {
 		return nil, pullErr
 	}
 	currentPos := readBuffer.GetPos()
@@ -149,14 +149,14 @@ func BACnetConstructedDataLifeSafetyZoneParse(readBuffer utils.ReadBuffer, tagNu
 		return nil, pullErr
 	}
 	// Terminated array
-	zones := make([]*BACnetContextTagObjectIdentifier, 0)
+	zones := make([]*BACnetDeviceObjectReference, 0)
 	{
 		for !bool(IsBACnetConstructedDataClosingTag(readBuffer, false, tagNumber)) {
-			_item, _err := BACnetContextTagParse(readBuffer, uint8(1), BACnetDataType_BACNET_OBJECT_IDENTIFIER)
+			_item, _err := BACnetDeviceObjectReferenceParse(readBuffer)
 			if _err != nil {
 				return nil, errors.Wrap(_err, "Error parsing 'zones' field")
 			}
-			zones = append(zones, CastBACnetContextTagObjectIdentifier(_item))
+			zones = append(zones, CastBACnetDeviceObjectReference(_item))
 
 		}
 	}
@@ -164,12 +164,12 @@ func BACnetConstructedDataLifeSafetyZoneParse(readBuffer utils.ReadBuffer, tagNu
 		return nil, closeErr
 	}
 
-	if closeErr := readBuffer.CloseContext("BACnetConstructedDataLifeSafetyZone"); closeErr != nil {
+	if closeErr := readBuffer.CloseContext("BACnetConstructedDataLifeSafetyZoneMembers"); closeErr != nil {
 		return nil, closeErr
 	}
 
 	// Create a partially initialized instance
-	_child := &BACnetConstructedDataLifeSafetyZone{
+	_child := &BACnetConstructedDataLifeSafetyZoneMembers{
 		Zones:                 zones,
 		BACnetConstructedData: &BACnetConstructedData{},
 	}
@@ -177,9 +177,9 @@ func BACnetConstructedDataLifeSafetyZoneParse(readBuffer utils.ReadBuffer, tagNu
 	return _child, nil
 }
 
-func (m *BACnetConstructedDataLifeSafetyZone) Serialize(writeBuffer utils.WriteBuffer) error {
+func (m *BACnetConstructedDataLifeSafetyZoneMembers) Serialize(writeBuffer utils.WriteBuffer) error {
 	ser := func() error {
-		if pushErr := writeBuffer.PushContext("BACnetConstructedDataLifeSafetyZone"); pushErr != nil {
+		if pushErr := writeBuffer.PushContext("BACnetConstructedDataLifeSafetyZoneMembers"); pushErr != nil {
 			return pushErr
 		}
 
@@ -199,7 +199,7 @@ func (m *BACnetConstructedDataLifeSafetyZone) Serialize(writeBuffer utils.WriteB
 			}
 		}
 
-		if popErr := writeBuffer.PopContext("BACnetConstructedDataLifeSafetyZone"); popErr != nil {
+		if popErr := writeBuffer.PopContext("BACnetConstructedDataLifeSafetyZoneMembers"); popErr != nil {
 			return popErr
 		}
 		return nil
@@ -207,7 +207,7 @@ func (m *BACnetConstructedDataLifeSafetyZone) Serialize(writeBuffer utils.WriteB
 	return m.SerializeParent(writeBuffer, m, ser)
 }
 
-func (m *BACnetConstructedDataLifeSafetyZone) String() string {
+func (m *BACnetConstructedDataLifeSafetyZoneMembers) String() string {
 	if m == nil {
 		return "<nil>"
 	}
diff --git a/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetDeviceObjectReference.go b/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetDeviceObjectReference.go
new file mode 100644
index 0000000000..26b6fa7659
--- /dev/null
+++ b/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetDeviceObjectReference.go
@@ -0,0 +1,206 @@
+/*
+ * 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
+ *
+ *   http://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/plc4go/spi/utils"
+	"github.com/pkg/errors"
+	"io"
+)
+
+// Code generated by code-generation. DO NOT EDIT.
+
+// BACnetDeviceObjectReference is the data-structure of this message
+type BACnetDeviceObjectReference struct {
+	DeviceIdentifier *BACnetContextTagObjectIdentifier
+	ObjectIdentifier *BACnetContextTagObjectIdentifier
+}
+
+// IBACnetDeviceObjectReference is the corresponding interface of BACnetDeviceObjectReference
+type IBACnetDeviceObjectReference interface {
+	// GetDeviceIdentifier returns DeviceIdentifier (property field)
+	GetDeviceIdentifier() *BACnetContextTagObjectIdentifier
+	// GetObjectIdentifier returns ObjectIdentifier (property field)
+	GetObjectIdentifier() *BACnetContextTagObjectIdentifier
+	// GetLengthInBytes returns the length in bytes
+	GetLengthInBytes() uint16
+	// GetLengthInBits returns the length in bits
+	GetLengthInBits() uint16
+	// Serialize serializes this type
+	Serialize(writeBuffer utils.WriteBuffer) error
+}
+
+///////////////////////////////////////////////////////////
+///////////////////////////////////////////////////////////
+/////////////////////// Accessors for property fields.
+///////////////////////
+
+func (m *BACnetDeviceObjectReference) GetDeviceIdentifier() *BACnetContextTagObjectIdentifier {
+	return m.DeviceIdentifier
+}
+
+func (m *BACnetDeviceObjectReference) GetObjectIdentifier() *BACnetContextTagObjectIdentifier {
+	return m.ObjectIdentifier
+}
+
+///////////////////////
+///////////////////////
+///////////////////////////////////////////////////////////
+///////////////////////////////////////////////////////////
+
+// NewBACnetDeviceObjectReference factory function for BACnetDeviceObjectReference
+func NewBACnetDeviceObjectReference(deviceIdentifier *BACnetContextTagObjectIdentifier, objectIdentifier *BACnetContextTagObjectIdentifier) *BACnetDeviceObjectReference {
+	return &BACnetDeviceObjectReference{DeviceIdentifier: deviceIdentifier, ObjectIdentifier: objectIdentifier}
+}
+
+func CastBACnetDeviceObjectReference(structType interface{}) *BACnetDeviceObjectReference {
+	if casted, ok := structType.(BACnetDeviceObjectReference); ok {
+		return &casted
+	}
+	if casted, ok := structType.(*BACnetDeviceObjectReference); ok {
+		return casted
+	}
+	return nil
+}
+
+func (m *BACnetDeviceObjectReference) GetTypeName() string {
+	return "BACnetDeviceObjectReference"
+}
+
+func (m *BACnetDeviceObjectReference) GetLengthInBits() uint16 {
+	return m.GetLengthInBitsConditional(false)
+}
+
+func (m *BACnetDeviceObjectReference) GetLengthInBitsConditional(lastItem bool) uint16 {
+	lengthInBits := uint16(0)
+
+	// Optional Field (deviceIdentifier)
+	if m.DeviceIdentifier != nil {
+		lengthInBits += (*m.DeviceIdentifier).GetLengthInBits()
+	}
+
+	// Simple field (objectIdentifier)
+	lengthInBits += m.ObjectIdentifier.GetLengthInBits()
+
+	return lengthInBits
+}
+
+func (m *BACnetDeviceObjectReference) GetLengthInBytes() uint16 {
+	return m.GetLengthInBits() / 8
+}
+
+func BACnetDeviceObjectReferenceParse(readBuffer utils.ReadBuffer) (*BACnetDeviceObjectReference, error) {
+	if pullErr := readBuffer.PullContext("BACnetDeviceObjectReference"); pullErr != nil {
+		return nil, pullErr
+	}
+	currentPos := readBuffer.GetPos()
+	_ = currentPos
+
+	// Optional Field (deviceIdentifier) (Can be skipped, if a given expression evaluates to false)
+	var deviceIdentifier *BACnetContextTagObjectIdentifier = nil
+	{
+		currentPos = readBuffer.GetPos()
+		if pullErr := readBuffer.PullContext("deviceIdentifier"); pullErr != nil {
+			return nil, pullErr
+		}
+		_val, _err := BACnetContextTagParse(readBuffer, uint8(0), BACnetDataType_BACNET_OBJECT_IDENTIFIER)
+		switch {
+		case errors.Is(_err, utils.ParseAssertError{}) || errors.Is(_err, io.EOF):
+			readBuffer.Reset(currentPos)
+		case _err != nil:
+			return nil, errors.Wrap(_err, "Error parsing 'deviceIdentifier' field")
+		default:
+			deviceIdentifier = CastBACnetContextTagObjectIdentifier(_val)
+			if closeErr := readBuffer.CloseContext("deviceIdentifier"); closeErr != nil {
+				return nil, closeErr
+			}
+		}
+	}
+
+	// Simple Field (objectIdentifier)
+	if pullErr := readBuffer.PullContext("objectIdentifier"); pullErr != nil {
+		return nil, pullErr
+	}
+	_objectIdentifier, _objectIdentifierErr := BACnetContextTagParse(readBuffer, uint8(uint8(1)), BACnetDataType(BACnetDataType_BACNET_OBJECT_IDENTIFIER))
+	if _objectIdentifierErr != nil {
+		return nil, errors.Wrap(_objectIdentifierErr, "Error parsing 'objectIdentifier' field")
+	}
+	objectIdentifier := CastBACnetContextTagObjectIdentifier(_objectIdentifier)
+	if closeErr := readBuffer.CloseContext("objectIdentifier"); closeErr != nil {
+		return nil, closeErr
+	}
+
+	if closeErr := readBuffer.CloseContext("BACnetDeviceObjectReference"); closeErr != nil {
+		return nil, closeErr
+	}
+
+	// Create the instance
+	return NewBACnetDeviceObjectReference(deviceIdentifier, objectIdentifier), nil
+}
+
+func (m *BACnetDeviceObjectReference) Serialize(writeBuffer utils.WriteBuffer) error {
+	if pushErr := writeBuffer.PushContext("BACnetDeviceObjectReference"); pushErr != nil {
+		return pushErr
+	}
+
+	// Optional Field (deviceIdentifier) (Can be skipped, if the value is null)
+	var deviceIdentifier *BACnetContextTagObjectIdentifier = nil
+	if m.DeviceIdentifier != nil {
+		if pushErr := writeBuffer.PushContext("deviceIdentifier"); pushErr != nil {
+			return pushErr
+		}
+		deviceIdentifier = m.DeviceIdentifier
+		_deviceIdentifierErr := deviceIdentifier.Serialize(writeBuffer)
+		if popErr := writeBuffer.PopContext("deviceIdentifier"); popErr != nil {
+			return popErr
+		}
+		if _deviceIdentifierErr != nil {
+			return errors.Wrap(_deviceIdentifierErr, "Error serializing 'deviceIdentifier' field")
+		}
+	}
+
+	// Simple Field (objectIdentifier)
+	if pushErr := writeBuffer.PushContext("objectIdentifier"); pushErr != nil {
+		return pushErr
+	}
+	_objectIdentifierErr := m.ObjectIdentifier.Serialize(writeBuffer)
+	if popErr := writeBuffer.PopContext("objectIdentifier"); popErr != nil {
+		return popErr
+	}
+	if _objectIdentifierErr != nil {
+		return errors.Wrap(_objectIdentifierErr, "Error serializing 'objectIdentifier' field")
+	}
+
+	if popErr := writeBuffer.PopContext("BACnetDeviceObjectReference"); popErr != nil {
+		return popErr
+	}
+	return nil
+}
+
+func (m *BACnetDeviceObjectReference) String() string {
+	if m == nil {
+		return "<nil>"
+	}
+	buffer := utils.NewBoxedWriteBufferWithOptions(true, true)
+	if err := m.Serialize(buffer); err != nil {
+		return err.Error()
+	}
+	return buffer.GetBox().String()
+}
diff --git a/plc4j/drivers/bacnet/src/test/java/org/apache/plc4x/java/bacnetip/RandomPackagesTest.java b/plc4j/drivers/bacnet/src/test/java/org/apache/plc4x/java/bacnetip/RandomPackagesTest.java
index 528f67279f..46213e90da 100644
--- a/plc4j/drivers/bacnet/src/test/java/org/apache/plc4x/java/bacnetip/RandomPackagesTest.java
+++ b/plc4j/drivers/bacnet/src/test/java/org/apache/plc4x/java/bacnetip/RandomPackagesTest.java
@@ -279,24 +279,24 @@ public class RandomPackagesTest {
                     assertEquals(BACnetObjectType.LIFE_SAFETY_ZONE, baCnetServiceAckReadProperty.getObjectIdentifier().getObjectType());
                     assertEquals(1, baCnetServiceAckReadProperty.getObjectIdentifier().getInstanceNumber());
                     assertEquals(BACnetPropertyIdentifier.ZONE_MEMBERS, baCnetServiceAckReadProperty.getPropertyIdentifier().getPropertyIdentifier());
-                    BACnetConstructedDataLifeSafetyZone baCnetConstructedDataLifeSafetyZone = (BACnetConstructedDataLifeSafetyZone) baCnetServiceAckReadProperty.getValues();
-
-                    List<BACnetContextTagObjectIdentifier> zones = baCnetConstructedDataLifeSafetyZone.getZones();
-                    assertThat(zones.get(0)).extracting("objectType", "instanceNumber").contains(BACnetObjectType.LIFE_SAFETY_ZONE, 3L);
-                    assertThat(zones.get(1)).extracting("objectType", "instanceNumber").contains(BACnetObjectType.LIFE_SAFETY_ZONE, 4L);
-                    assertThat(zones.get(2)).extracting("objectType", "instanceNumber").contains(BACnetObjectType.LIFE_SAFETY_ZONE, 5L);
-                    assertThat(zones.get(3)).extracting("objectType", "instanceNumber").contains(BACnetObjectType.LIFE_SAFETY_ZONE, 6L);
-                    assertThat(zones.get(4)).extracting("objectType", "instanceNumber").contains(BACnetObjectType.LIFE_SAFETY_ZONE, 7L);
-                    assertThat(zones.get(5)).extracting("objectType", "instanceNumber").contains(BACnetObjectType.LIFE_SAFETY_ZONE, 8L);
-                    assertThat(zones.get(6)).extracting("objectType", "instanceNumber").contains(BACnetObjectType.LIFE_SAFETY_ZONE, 9L);
-                    assertThat(zones.get(7)).extracting("objectType", "instanceNumber").contains(BACnetObjectType.LIFE_SAFETY_ZONE, 16L);
-                    assertThat(zones.get(8)).extracting("objectType", "instanceNumber").contains(BACnetObjectType.LIFE_SAFETY_ZONE, 494L);
-                    assertThat(zones.get(9)).extracting("objectType", "instanceNumber").contains(BACnetObjectType.LIFE_SAFETY_ZONE, 255L);
-                    assertThat(zones.get(10)).extracting("objectType", "instanceNumber").contains(BACnetObjectType.LIFE_SAFETY_ZONE, 231L);
-                    assertThat(zones.get(11)).extracting("objectType", "instanceNumber").contains(BACnetObjectType.LIFE_SAFETY_ZONE, 4193620L);
-                    assertThat(zones.get(12)).extracting("objectType", "instanceNumber").contains(BACnetObjectType.LIFE_SAFETY_ZONE, 222L);
-                    assertThat(zones.get(13)).extracting("objectType", "instanceNumber").contains(BACnetObjectType.LIFE_SAFETY_ZONE, 300L);
-                    assertThat(zones.get(14)).extracting("objectType", "instanceNumber").contains(BACnetObjectType.LIFE_SAFETY_ZONE, 166L);
+                    BACnetConstructedDataLifeSafetyZoneMembers baCnetConstructedDataLifeSafetyZoneMembers = (BACnetConstructedDataLifeSafetyZoneMembers) baCnetServiceAckReadProperty.getValues();
+
+                    List<BACnetDeviceObjectReference> zones = baCnetConstructedDataLifeSafetyZoneMembers.getZones();
+                    assertThat(zones.get(0)).extracting(BACnetDeviceObjectReference::getObjectIdentifier).extracting("objectType", "instanceNumber").contains(BACnetObjectType.LIFE_SAFETY_ZONE, 3L);
+                    assertThat(zones.get(1)).extracting(BACnetDeviceObjectReference::getObjectIdentifier).extracting("objectType", "instanceNumber").contains(BACnetObjectType.LIFE_SAFETY_ZONE, 4L);
+                    assertThat(zones.get(2)).extracting(BACnetDeviceObjectReference::getObjectIdentifier).extracting("objectType", "instanceNumber").contains(BACnetObjectType.LIFE_SAFETY_ZONE, 5L);
+                    assertThat(zones.get(3)).extracting(BACnetDeviceObjectReference::getObjectIdentifier).extracting("objectType", "instanceNumber").contains(BACnetObjectType.LIFE_SAFETY_ZONE, 6L);
+                    assertThat(zones.get(4)).extracting(BACnetDeviceObjectReference::getObjectIdentifier).extracting("objectType", "instanceNumber").contains(BACnetObjectType.LIFE_SAFETY_ZONE, 7L);
+                    assertThat(zones.get(5)).extracting(BACnetDeviceObjectReference::getObjectIdentifier).extracting("objectType", "instanceNumber").contains(BACnetObjectType.LIFE_SAFETY_ZONE, 8L);
+                    assertThat(zones.get(6)).extracting(BACnetDeviceObjectReference::getObjectIdentifier).extracting("objectType", "instanceNumber").contains(BACnetObjectType.LIFE_SAFETY_ZONE, 9L);
+                    assertThat(zones.get(7)).extracting(BACnetDeviceObjectReference::getObjectIdentifier).extracting("objectType", "instanceNumber").contains(BACnetObjectType.LIFE_SAFETY_ZONE, 16L);
+                    assertThat(zones.get(8)).extracting(BACnetDeviceObjectReference::getObjectIdentifier).extracting("objectType", "instanceNumber").contains(BACnetObjectType.LIFE_SAFETY_ZONE, 494L);
+                    assertThat(zones.get(9)).extracting(BACnetDeviceObjectReference::getObjectIdentifier).extracting("objectType", "instanceNumber").contains(BACnetObjectType.LIFE_SAFETY_ZONE, 255L);
+                    assertThat(zones.get(10)).extracting(BACnetDeviceObjectReference::getObjectIdentifier).extracting("objectType", "instanceNumber").contains(BACnetObjectType.LIFE_SAFETY_ZONE, 231L);
+                    assertThat(zones.get(11)).extracting(BACnetDeviceObjectReference::getObjectIdentifier).extracting("objectType", "instanceNumber").contains(BACnetObjectType.LIFE_SAFETY_ZONE, 4193620L);
+                    assertThat(zones.get(12)).extracting(BACnetDeviceObjectReference::getObjectIdentifier).extracting("objectType", "instanceNumber").contains(BACnetObjectType.LIFE_SAFETY_ZONE, 222L);
+                    assertThat(zones.get(13)).extracting(BACnetDeviceObjectReference::getObjectIdentifier).extracting("objectType", "instanceNumber").contains(BACnetObjectType.LIFE_SAFETY_ZONE, 300L);
+                    assertThat(zones.get(14)).extracting(BACnetDeviceObjectReference::getObjectIdentifier).extracting("objectType", "instanceNumber").contains(BACnetObjectType.LIFE_SAFETY_ZONE, 166L);
                 }),
             DynamicTest.dynamicTest("No. 3 - Confirmed-REQ   readProperty[  0] life-safety-zone,1 member-of",
                 () -> {
@@ -323,10 +323,10 @@ public class RandomPackagesTest {
                     assertEquals(BACnetObjectType.LIFE_SAFETY_ZONE, baCnetServiceAckReadProperty.getObjectIdentifier().getObjectType());
                     assertEquals(1, baCnetServiceAckReadProperty.getObjectIdentifier().getInstanceNumber());
                     assertEquals(BACnetPropertyIdentifier.MEMBER_OF, baCnetServiceAckReadProperty.getPropertyIdentifier().getPropertyIdentifier());
-                    BACnetConstructedDataLifeSafetyZone baCnetConstructedDataLifeSafetyZone = (BACnetConstructedDataLifeSafetyZone) baCnetServiceAckReadProperty.getValues();
+                    BACnetConstructedDataLifeSafetyZoneMemberOf baCnetConstructedDataLifeSafetyZoneMemberOf = (BACnetConstructedDataLifeSafetyZoneMemberOf) baCnetServiceAckReadProperty.getValues();
 
-                    List<BACnetContextTagObjectIdentifier> zones = baCnetConstructedDataLifeSafetyZone.getZones();
-                    assertThat(zones.get(0)).extracting("objectType", "instanceNumber").contains(BACnetObjectType.LIFE_SAFETY_ZONE, 1L);
+                    List<BACnetDeviceObjectReference> zones = baCnetConstructedDataLifeSafetyZoneMemberOf.getZones();
+                    assertThat(zones.get(0)).extracting(BACnetDeviceObjectReference::getObjectIdentifier).extracting("objectType", "instanceNumber").contains(BACnetObjectType.LIFE_SAFETY_ZONE, 1L);
                 })
         );
     }
diff --git a/protocols/bacnetip/src/main/resources/protocols/bacnetip/bacnetip.mspec b/protocols/bacnetip/src/main/resources/protocols/bacnetip/bacnetip.mspec
index f7adb8e490..dcd2bfc601 100644
--- a/protocols/bacnetip/src/main/resources/protocols/bacnetip/bacnetip.mspec
+++ b/protocols/bacnetip/src/main/resources/protocols/bacnetip/bacnetip.mspec
@@ -1738,8 +1738,14 @@
             [simple       BACnetClosingTag('0', 'BACnetDataType.CLOSING_TAG')
                                 innerClosingTag                                                                 ]
         ]
-        ['LIFE_SAFETY_ZONE' BACnetConstructedDataLifeSafetyZone
-            [array  BACnetContextTagObjectIdentifier('1', 'BACnetDataType.BACNET_OBJECT_IDENTIFIER')
+        ['LIFE_SAFETY_ZONE', 'ZONE_MEMBERS' BACnetConstructedDataLifeSafetyZoneMembers
+            [array  BACnetDeviceObjectReference
+                        zones
+                    terminated
+                    'STATIC_CALL("isBACnetConstructedDataClosingTag", readBuffer, false, tagNumber)'            ]
+        ]
+        ['LIFE_SAFETY_ZONE', 'MEMBER_OF' BACnetConstructedDataLifeSafetyZoneMembers
+            [array  BACnetDeviceObjectReference
                         zones
                     terminated
                     'STATIC_CALL("isBACnetConstructedDataClosingTag", readBuffer, false, tagNumber)'            ]
@@ -1772,6 +1778,13 @@
                         closingTag                                                                              ]
 ]
 
+[type BACnetDeviceObjectReference
+    [optional BACnetContextTagObjectIdentifier('0', 'BACnetDataType.BACNET_OBJECT_IDENTIFIER')
+                        deviceIdentifier                                                                        ]
+    [simple   BACnetContextTagObjectIdentifier('1', 'BACnetDataType.BACNET_OBJECT_IDENTIFIER')
+                        objectIdentifier                                                                        ]
+]
+
 [type BACnetDeviceObjectPropertyReference
     [simple   BACnetContextTagObjectIdentifier('0', 'BACnetDataType.BACNET_OBJECT_IDENTIFIER')
                         objectIdentifier                                                                        ]