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/08/10 14:20:31 UTC

[plc4x] branch develop updated (5fc5d281b -> 78cd30b6c)

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

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


    from 5fc5d281b fix(plc4go/cbus): fixed detection of server error
     new 7d98c6dc4 fix(plc4go/cbus): decreased log level of static helper
     new 21b3d63e6 fix(cbus): fixed network voltage using the wrong bit size
     new 78cd30b6c feat(plc4go/cbus): added interceptor to browser

The 3 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.


Summary of changes:
 plc4go/internal/cbus/Browser.go                    | 22 ++++-
 plc4go/internal/cbus/Field.go                      | 96 +++++++++++++++++-----
 plc4go/internal/cbus/Reader.go                     |  2 +-
 plc4go/internal/spi/model/DefaultPlcBrowseEvent.go | 64 ++++++++++++++-
 plc4go/pkg/api/model/plc_response_code.go          |  4 +
 .../model/IdentifyReplyCommandNetworkVoltage.go    | 12 +--
 .../protocols/cbus/readwrite/model/StaticHelper.go |  4 +-
 .../tests/drivers/tests/manual_cbus_driver_test.go | 18 ++--
 plc4go/tools/plc4xbrowser/ui/commands.go           |  6 +-
 .../src/main/resources/protocols/cbus/c-bus.mspec  |  4 +-
 10 files changed, 189 insertions(+), 43 deletions(-)


[plc4x] 01/03: fix(plc4go/cbus): decreased log level of static helper

Posted by sr...@apache.org.
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

commit 7d98c6dc4b1e1a149bb71e3cae84046a831560a5
Author: Sebastian Rühl <sr...@apache.org>
AuthorDate: Wed Aug 10 15:29:06 2022 +0200

    fix(plc4go/cbus): decreased log level of static helper
---
 plc4go/protocols/cbus/readwrite/model/StaticHelper.go | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/plc4go/protocols/cbus/readwrite/model/StaticHelper.go b/plc4go/protocols/cbus/readwrite/model/StaticHelper.go
index e0ffdb10d..48341eb7d 100644
--- a/plc4go/protocols/cbus/readwrite/model/StaticHelper.go
+++ b/plc4go/protocols/cbus/readwrite/model/StaticHelper.go
@@ -141,7 +141,7 @@ func readBytesFromHex(logicalName string, readBuffer utils.ReadBuffer, srchk boo
 		readBuffer.Reset(readBuffer.GetPos() - 2)
 		rawBytes = rawBytes[:len(rawBytes)-1]
 	}
-	log.Debug().Msgf("%d bytes decoded", n)
+	log.Trace().Msgf("%d bytes decoded", n)
 	return rawBytes, nil
 }
 
@@ -177,7 +177,7 @@ func writeToHex(logicalName string, writeBuffer utils.WriteBuffer, bytesToWrite
 	// usually you use hex.Encode but we want the encoding in uppercase
 	//n := hex.Encode(hexBytes, wbbb.GetBytes())
 	n := encodeHexUpperCase(hexBytes, bytesToWrite)
-	log.Debug().Msgf("%d bytes encoded", n)
+	log.Trace().Msgf("%d bytes encoded", n)
 	return writeBuffer.WriteByteArray(logicalName, hexBytes)
 }
 


[plc4x] 03/03: feat(plc4go/cbus): added interceptor to browser

Posted by sr...@apache.org.
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

commit 78cd30b6cef6ba0f266b0be411f16aacb59b727e
Author: Sebastian Rühl <sr...@apache.org>
AuthorDate: Wed Aug 10 16:18:21 2022 +0200

    feat(plc4go/cbus): added interceptor to browser
---
 plc4go/internal/cbus/Browser.go                    | 22 ++++-
 plc4go/internal/cbus/Field.go                      | 96 +++++++++++++++++-----
 plc4go/internal/cbus/Reader.go                     |  2 +-
 plc4go/internal/spi/model/DefaultPlcBrowseEvent.go | 64 ++++++++++++++-
 plc4go/pkg/api/model/plc_response_code.go          |  4 +
 .../tests/drivers/tests/manual_cbus_driver_test.go | 18 ++--
 plc4go/tools/plc4xbrowser/ui/commands.go           |  6 +-
 7 files changed, 179 insertions(+), 33 deletions(-)

diff --git a/plc4go/internal/cbus/Browser.go b/plc4go/internal/cbus/Browser.go
index d3ca94512..de095f882 100644
--- a/plc4go/internal/cbus/Browser.go
+++ b/plc4go/internal/cbus/Browser.go
@@ -111,21 +111,37 @@ func (m Browser) BrowseWithInterceptor(browseRequest apiModel.PlcBrowseRequest,
 							}
 							continue unitLoop
 						}
-						queryResults = append(queryResults, &model.DefaultPlcBrowseQueryResult{
+						response := requestResult.GetResponse()
+						if code := response.GetResponseCode(readFieldName); code != apiModel.PlcResponseCode_OK {
+							event.Msgf("unit %d: error reading field %s. Code %s", unitAddress, attribute, code)
+							continue unitLoop
+						}
+						queryResult := &model.DefaultPlcBrowseQueryResult{
 							Field:        NewCALIdentifyField(unit, attribute, 1),
 							Name:         fieldName,
 							Readable:     true,
 							Writable:     false,
 							Subscribable: false,
 							Attributes: map[string]values.PlcValue{
-								"CurrentValue": requestResult.GetResponse().GetValue(readFieldName),
+								"CurrentValue": response.GetValue(readFieldName),
 							},
-						})
+						}
+						if interceptor != nil {
+							interceptor(&model.DefaultPlcBrowseEvent{
+								Request:   browseRequest,
+								FieldName: readFieldName,
+								Result:    queryResult,
+								Err:       nil,
+							})
+						}
+						queryResults = append(queryResults, queryResult)
 					}
 				}
+				responseCodes[fieldName] = apiModel.PlcResponseCode_OK
 			default:
 				responseCodes[fieldName] = apiModel.PlcResponseCode_INTERNAL_ERROR
 			}
+			results[fieldName] = queryResults
 		}
 		result <- &model.DefaultPlcBrowseRequestResult{
 			Request:  browseRequest,
diff --git a/plc4go/internal/cbus/Field.go b/plc4go/internal/cbus/Field.go
index 66145fb56..16a271506 100644
--- a/plc4go/internal/cbus/Field.go
+++ b/plc4go/internal/cbus/Field.go
@@ -281,57 +281,73 @@ func (m statusField) Serialize(writeBuffer utils.WriteBuffer) error {
 	return nil
 }
 
-func (m calField) GetUnitAddress() readWriteModel.UnitAddress {
-	return m.unitAddress
+func (c calField) GetUnitAddress() readWriteModel.UnitAddress {
+	return c.unitAddress
 }
 
-func (m calField) Serialize(writeBuffer utils.WriteBuffer) error {
-	return m.unitAddress.Serialize(writeBuffer)
+func (c calField) Serialize(writeBuffer utils.WriteBuffer) error {
+	return c.unitAddress.Serialize(writeBuffer)
 }
 
-func (m calRecallField) GetParameter() readWriteModel.Parameter {
-	return m.parameter
+func (c calField) String() string {
+	writeBuffer := utils.NewBoxedWriteBufferWithOptions(true, true)
+	if err := writeBuffer.WriteSerializable(c); err != nil {
+		return err.Error()
+	}
+	return writeBuffer.GetBox().String()
 }
 
-func (m calRecallField) GetCount() uint8 {
-	return m.count
+func (c calRecallField) GetParameter() readWriteModel.Parameter {
+	return c.parameter
 }
 
-func (m calRecallField) GetAddressString() string {
-	return fmt.Sprintf("%d[%d]", m.fieldType, m.numElements)
+func (c calRecallField) GetCount() uint8 {
+	return c.count
 }
 
-func (m calRecallField) GetTypeName() string {
-	return m.fieldType.GetName()
+func (c calRecallField) GetAddressString() string {
+	return fmt.Sprintf("%d[%d]", c.fieldType, c.numElements)
 }
 
-func (m calRecallField) GetQuantity() uint16 {
-	return m.numElements
+func (c calRecallField) GetTypeName() string {
+	return c.fieldType.GetName()
 }
 
-func (m calRecallField) Serialize(writeBuffer utils.WriteBuffer) error {
-	if err := writeBuffer.PushContext(m.fieldType.GetName()); err != nil {
+func (c calRecallField) GetQuantity() uint16 {
+	return c.numElements
+}
+
+func (c calRecallField) Serialize(writeBuffer utils.WriteBuffer) error {
+	if err := writeBuffer.PushContext(c.fieldType.GetName()); err != nil {
 		return err
 	}
 
-	if err := m.calField.Serialize(writeBuffer); err != nil {
+	if err := c.calField.Serialize(writeBuffer); err != nil {
 		return err
 	}
 
-	if err := m.parameter.Serialize(writeBuffer); err != nil {
+	if err := c.parameter.Serialize(writeBuffer); err != nil {
 		return err
 	}
 
-	if err := writeBuffer.WriteUint8("count", 8, m.count); err != nil {
+	if err := writeBuffer.WriteUint8("count", 8, c.count); err != nil {
 		return err
 	}
 
-	if err := writeBuffer.PopContext(m.fieldType.GetName()); err != nil {
+	if err := writeBuffer.PopContext(c.fieldType.GetName()); err != nil {
 		return err
 	}
 	return nil
 }
 
+func (c calRecallField) String() string {
+	writeBuffer := utils.NewBoxedWriteBufferWithOptions(true, true)
+	if err := writeBuffer.WriteSerializable(c); err != nil {
+		return err.Error()
+	}
+	return writeBuffer.GetBox().String()
+}
+
 func (c calIdentifyField) GetAttribute() readWriteModel.Attribute {
 	return c.attribute
 }
@@ -367,6 +383,14 @@ func (c calIdentifyField) Serialize(writeBuffer utils.WriteBuffer) error {
 	return nil
 }
 
+func (c calIdentifyField) String() string {
+	writeBuffer := utils.NewBoxedWriteBufferWithOptions(true, true)
+	if err := writeBuffer.WriteSerializable(c); err != nil {
+		return err.Error()
+	}
+	return writeBuffer.GetBox().String()
+}
+
 func (c calGetstatusField) GetParameter() readWriteModel.Parameter {
 	return c.parameter
 }
@@ -410,6 +434,14 @@ func (c calGetstatusField) Serialize(writeBuffer utils.WriteBuffer) error {
 	return nil
 }
 
+func (c calGetstatusField) String() string {
+	writeBuffer := utils.NewBoxedWriteBufferWithOptions(true, true)
+	if err := writeBuffer.WriteSerializable(c); err != nil {
+		return err.Error()
+	}
+	return writeBuffer.GetBox().String()
+}
+
 func (s salMonitorField) GetAddressString() string {
 	return fmt.Sprintf("%d/%s%s[%d]", s.fieldType, s.unitAddress, s.application, s.numElements)
 }
@@ -448,6 +480,14 @@ func (s salMonitorField) Serialize(writeBuffer utils.WriteBuffer) error {
 	return nil
 }
 
+func (s salMonitorField) String() string {
+	writeBuffer := utils.NewBoxedWriteBufferWithOptions(true, true)
+	if err := writeBuffer.WriteSerializable(s); err != nil {
+		return err.Error()
+	}
+	return writeBuffer.GetBox().String()
+}
+
 func (m mmiMonitorField) GetAddressString() string {
 	return fmt.Sprintf("%d/%s%s[%d]", m.fieldType, m.unitAddress, m.application, m.numElements)
 }
@@ -486,6 +526,14 @@ func (m mmiMonitorField) Serialize(writeBuffer utils.WriteBuffer) error {
 	return nil
 }
 
+func (m mmiMonitorField) String() string {
+	writeBuffer := utils.NewBoxedWriteBufferWithOptions(true, true)
+	if err := writeBuffer.WriteSerializable(m); err != nil {
+		return err.Error()
+	}
+	return writeBuffer.GetBox().String()
+}
+
 func (u unitInfoField) GetUnitAddress() *readWriteModel.UnitAddress {
 	return u.unitAddress
 }
@@ -528,3 +576,11 @@ func (u unitInfoField) Serialize(writeBuffer utils.WriteBuffer) error {
 	}
 	return nil
 }
+
+func (u unitInfoField) String() string {
+	writeBuffer := utils.NewBoxedWriteBufferWithOptions(true, true)
+	if err := writeBuffer.WriteSerializable(u); err != nil {
+		return err.Error()
+	}
+	return writeBuffer.GetBox().String()
+}
diff --git a/plc4go/internal/cbus/Reader.go b/plc4go/internal/cbus/Reader.go
index 0778cdeb9..954463e09 100644
--- a/plc4go/internal/cbus/Reader.go
+++ b/plc4go/internal/cbus/Reader.go
@@ -126,7 +126,7 @@ func (m *Reader) Read(readRequest model.PlcReadRequest) <-chan model.PlcReadRequ
 						cbusMessage := receivedMessage.(readWriteModel.CBusMessage)
 						messageToClient := cbusMessage.(readWriteModel.CBusMessageToClient)
 						if _, ok := messageToClient.GetReply().(readWriteModel.ServerErrorReplyExactly); ok {
-							log.Debug().Msg("We got a server failure")
+							log.Trace().Msg("We got a server failure")
 							addResponseCode(fieldNameCopy, model.PlcResponseCode_INVALID_DATA)
 							requestWasOk <- false
 							return transaction.EndRequest()
diff --git a/plc4go/internal/spi/model/DefaultPlcBrowseEvent.go b/plc4go/internal/spi/model/DefaultPlcBrowseEvent.go
index 004ed32df..1c6864fe0 100644
--- a/plc4go/internal/spi/model/DefaultPlcBrowseEvent.go
+++ b/plc4go/internal/spi/model/DefaultPlcBrowseEvent.go
@@ -19,7 +19,11 @@
 
 package model
 
-import "github.com/apache/plc4x/plc4go/pkg/api/model"
+import (
+	"github.com/apache/plc4x/plc4go/internal/spi/utils"
+	"github.com/apache/plc4x/plc4go/pkg/api/model"
+	"github.com/pkg/errors"
+)
 
 type DefaultPlcBrowseEvent struct {
 	Request   model.PlcBrowseRequest
@@ -43,3 +47,61 @@ func (d *DefaultPlcBrowseEvent) GetResult() model.PlcBrowseFoundField {
 func (d *DefaultPlcBrowseEvent) GetErr() error {
 	return d.Err
 }
+
+func (d *DefaultPlcBrowseEvent) Serialize(writeBuffer utils.WriteBuffer) error {
+	if err := writeBuffer.PushContext("PlcBrowseEvent"); err != nil {
+		return err
+	}
+
+	if d.Request != nil {
+		if err := writeBuffer.PushContext("Request"); err != nil {
+			return err
+		}
+		if serializableField, ok := d.Request.(utils.Serializable); ok {
+			if err := serializableField.Serialize(writeBuffer); err != nil {
+				return err
+			}
+		} else {
+			return errors.Errorf("Error serializing. Field %T doesn't implement Serializable", d.Request)
+		}
+		if err := writeBuffer.PopContext("Request"); err != nil {
+			return err
+		}
+	}
+	if err := writeBuffer.WriteString("fieldName", uint32(len(d.FieldName)*8), "UTF-8", d.FieldName); err != nil {
+		return err
+	}
+	if d.Result != nil {
+		if err := writeBuffer.PushContext("Result"); err != nil {
+			return err
+		}
+		if serializableField, ok := d.Result.(utils.Serializable); ok {
+			if err := serializableField.Serialize(writeBuffer); err != nil {
+				return err
+			}
+		} else {
+			return errors.Errorf("Error serializing. Field %T doesn't implement Serializable", d.Result)
+		}
+		if err := writeBuffer.PopContext("Result"); err != nil {
+			return err
+		}
+	}
+	if d.Err != nil {
+		if err := writeBuffer.WriteString("err", uint32(len(d.Err.Error())*8), "UTF-8", d.Err.Error()); err != nil {
+			return err
+		}
+	}
+
+	if err := writeBuffer.PopContext("PlcBrowseEvent"); err != nil {
+		return err
+	}
+	return nil
+}
+
+func (d *DefaultPlcBrowseEvent) String() string {
+	writeBuffer := utils.NewBoxedWriteBufferWithOptions(true, true)
+	if err := writeBuffer.WriteSerializable(d); err != nil {
+		return err.Error()
+	}
+	return writeBuffer.GetBox().String()
+}
diff --git a/plc4go/pkg/api/model/plc_response_code.go b/plc4go/pkg/api/model/plc_response_code.go
index 63f187887..d3daa11d7 100644
--- a/plc4go/pkg/api/model/plc_response_code.go
+++ b/plc4go/pkg/api/model/plc_response_code.go
@@ -66,3 +66,7 @@ func (m PlcResponseCode) GetName() string {
 		return ""
 	}
 }
+
+func (m PlcResponseCode) String() string {
+	return m.GetName()
+}
diff --git a/plc4go/tests/drivers/tests/manual_cbus_driver_test.go b/plc4go/tests/drivers/tests/manual_cbus_driver_test.go
index 9e54c83e7..5242fed86 100644
--- a/plc4go/tests/drivers/tests/manual_cbus_driver_test.go
+++ b/plc4go/tests/drivers/tests/manual_cbus_driver_test.go
@@ -98,10 +98,10 @@ func TestManualCBusBrowse(t *testing.T) {
 	log.Logger = log.
 		With().Caller().Logger().
 		Output(zerolog.ConsoleWriter{Out: os.Stderr}).
-		Level(zerolog.TraceLevel)
-	config.TraceTransactionManagerWorkers = true
-	config.TraceTransactionManagerTransactions = true
-	config.TraceDefaultMessageCodecWorker = true
+		Level(zerolog.InfoLevel)
+	config.TraceTransactionManagerWorkers = false
+	config.TraceTransactionManagerTransactions = false
+	config.TraceDefaultMessageCodecWorker = false
 	t.Skip()
 
 	connectionString := "c-bus://192.168.178.101?Monitor=false&MonitoredApplication1=0x00&MonitoredApplication2=0x00"
@@ -110,7 +110,8 @@ func TestManualCBusBrowse(t *testing.T) {
 	transports.RegisterTcpTransport(driverManager)
 	connectionResult := <-driverManager.GetConnection(connectionString)
 	if err := connectionResult.GetErr(); err != nil {
-		panic(err)
+		t.Error(err)
+		t.FailNow()
 	}
 	connection := connectionResult.GetConnection()
 	defer connection.Close()
@@ -120,6 +121,9 @@ func TestManualCBusBrowse(t *testing.T) {
 	if err != nil {
 		panic(err)
 	}
-	browseRequestResult := <-browseRequest.Execute()
-	fmt.Printf("%s", browseRequestResult)
+	browseRequestResult := <-browseRequest.ExecuteWithInterceptor(func(result model.PlcBrowseEvent) bool {
+		fmt.Printf("%s", result)
+		return true
+	})
+	fmt.Printf("%s", browseRequestResult.GetResponse())
 }
diff --git a/plc4go/tools/plc4xbrowser/ui/commands.go b/plc4go/tools/plc4xbrowser/ui/commands.go
index 26fb8c191..648b61894 100644
--- a/plc4go/tools/plc4xbrowser/ui/commands.go
+++ b/plc4go/tools/plc4xbrowser/ui/commands.go
@@ -269,7 +269,11 @@ var rootCommand = Command{
 					if err != nil {
 						return errors.Wrapf(err, "%s can't browse", connectionsString)
 					}
-					browseRequestResult := <-browseRequest.Execute()
+					browseRequestResult := <-browseRequest.ExecuteWithInterceptor(func(result model.PlcBrowseEvent) bool {
+						numberOfMessagesReceived++
+						messageReceived(numberOfMessagesReceived, time.Now(), browseRequest)
+						return true
+					})
 					if err := browseRequestResult.GetErr(); err != nil {
 						return errors.Wrapf(err, "%s can't browse", connectionsString)
 					}


[plc4x] 02/03: fix(cbus): fixed network voltage using the wrong bit size

Posted by sr...@apache.org.
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

commit 21b3d63e6a5c19ef66afd547fd000a2631b2ae62
Author: Sebastian Rühl <sr...@apache.org>
AuthorDate: Wed Aug 10 15:43:47 2022 +0200

    fix(cbus): fixed network voltage using the wrong bit size
---
 .../readwrite/model/IdentifyReplyCommandNetworkVoltage.go    | 12 ++++++------
 .../c-bus/src/main/resources/protocols/cbus/c-bus.mspec      |  4 ++--
 2 files changed, 8 insertions(+), 8 deletions(-)

diff --git a/plc4go/protocols/cbus/readwrite/model/IdentifyReplyCommandNetworkVoltage.go b/plc4go/protocols/cbus/readwrite/model/IdentifyReplyCommandNetworkVoltage.go
index 22b2a5e3f..0845b06f3 100644
--- a/plc4go/protocols/cbus/readwrite/model/IdentifyReplyCommandNetworkVoltage.go
+++ b/plc4go/protocols/cbus/readwrite/model/IdentifyReplyCommandNetworkVoltage.go
@@ -145,13 +145,13 @@ func (m *_IdentifyReplyCommandNetworkVoltage) GetLengthInBitsConditional(lastIte
 	lengthInBits := uint16(m.GetParentLengthInBits())
 
 	// Simple field (volts)
-	lengthInBits += 2
+	lengthInBits += 16
 
 	// Const Field (dot)
 	lengthInBits += 8
 
 	// Simple field (voltsDecimalPlace)
-	lengthInBits += 2
+	lengthInBits += 16
 
 	// Const Field (v)
 	lengthInBits += 8
@@ -173,7 +173,7 @@ func IdentifyReplyCommandNetworkVoltageParse(readBuffer utils.ReadBuffer, attrib
 	_ = currentPos
 
 	// Simple Field (volts)
-	_volts, _voltsErr := readBuffer.ReadString("volts", uint32(2))
+	_volts, _voltsErr := readBuffer.ReadString("volts", uint32(16))
 	if _voltsErr != nil {
 		return nil, errors.Wrap(_voltsErr, "Error parsing 'volts' field of IdentifyReplyCommandNetworkVoltage")
 	}
@@ -189,7 +189,7 @@ func IdentifyReplyCommandNetworkVoltageParse(readBuffer utils.ReadBuffer, attrib
 	}
 
 	// Simple Field (voltsDecimalPlace)
-	_voltsDecimalPlace, _voltsDecimalPlaceErr := readBuffer.ReadString("voltsDecimalPlace", uint32(2))
+	_voltsDecimalPlace, _voltsDecimalPlaceErr := readBuffer.ReadString("voltsDecimalPlace", uint32(16))
 	if _voltsDecimalPlaceErr != nil {
 		return nil, errors.Wrap(_voltsDecimalPlaceErr, "Error parsing 'voltsDecimalPlace' field of IdentifyReplyCommandNetworkVoltage")
 	}
@@ -230,7 +230,7 @@ func (m *_IdentifyReplyCommandNetworkVoltage) Serialize(writeBuffer utils.WriteB
 
 		// Simple Field (volts)
 		volts := string(m.GetVolts())
-		_voltsErr := writeBuffer.WriteString("volts", uint32(2), "UTF-8", (volts))
+		_voltsErr := writeBuffer.WriteString("volts", uint32(16), "UTF-8", (volts))
 		if _voltsErr != nil {
 			return errors.Wrap(_voltsErr, "Error serializing 'volts' field")
 		}
@@ -243,7 +243,7 @@ func (m *_IdentifyReplyCommandNetworkVoltage) Serialize(writeBuffer utils.WriteB
 
 		// Simple Field (voltsDecimalPlace)
 		voltsDecimalPlace := string(m.GetVoltsDecimalPlace())
-		_voltsDecimalPlaceErr := writeBuffer.WriteString("voltsDecimalPlace", uint32(2), "UTF-8", (voltsDecimalPlace))
+		_voltsDecimalPlaceErr := writeBuffer.WriteString("voltsDecimalPlace", uint32(16), "UTF-8", (voltsDecimalPlace))
 		if _voltsDecimalPlaceErr != nil {
 			return errors.Wrap(_voltsDecimalPlaceErr, "Error serializing 'voltsDecimalPlace' field")
 		}
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 022e5cc53..e76267854 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
@@ -1100,9 +1100,9 @@
             [array  byte        terminalLevels        count 'numBytes'       ] // TODO: check datatype
         ]
         ['NetworkVoltage'               IdentifyReplyCommandNetworkVoltage
-           [simple string 2     volts                   ]
+           [simple string 16    volts                   ]
            [const  byte         dot     0x2C            ]
-           [simple string 2     voltsDecimalPlace       ]
+           [simple string 16    voltsDecimalPlace       ]
            [const  byte         v       0x56            ]
         ]
         ['GAVValuesCurrent'             IdentifyReplyCommandGAVValuesCurrent