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/19 16:07:25 UTC

[plc4x] branch develop updated (70a64ab2f -> 409a709cf)

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 70a64ab2f feat(cbus): implemented error hvac actuator application
     new 4d1b020c2 feat(cbus): implemented heating application
     new 409a709cf feat(cbus): implemented audio and video application

The 2 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:
 .../cbus/readwrite/model/SALDataAudioAndVideo.go   | 54 +++++++++++++++++---
 .../cbus/readwrite/model/SALDataHeating.go         | 54 +++++++++++++++++---
 .../readwrite/model/SALDataIrrigationControl.go    | 58 +++++++++++-----------
 .../model/SALDataPoolsSpasPondsFountainsControl.go | 58 +++++++++++-----------
 .../src/main/resources/protocols/cbus/c-bus.mspec  | 12 +++--
 5 files changed, 161 insertions(+), 75 deletions(-)


[plc4x] 02/02: feat(cbus): implemented audio and video application

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 409a709cf8c5d92f63d5140d75d375935c93ae4d
Author: Sebastian Rühl <sr...@apache.org>
AuthorDate: Tue Jul 19 18:02:50 2022 +0200

    feat(cbus): implemented audio and video application
---
 .../cbus/readwrite/model/SALDataAudioAndVideo.go   | 54 +++++++++++++++++++---
 .../src/main/resources/protocols/cbus/c-bus.mspec  |  3 +-
 2 files changed, 50 insertions(+), 7 deletions(-)

diff --git a/plc4go/protocols/cbus/readwrite/model/SALDataAudioAndVideo.go b/plc4go/protocols/cbus/readwrite/model/SALDataAudioAndVideo.go
index f63e0243e..ea83e5173 100644
--- a/plc4go/protocols/cbus/readwrite/model/SALDataAudioAndVideo.go
+++ b/plc4go/protocols/cbus/readwrite/model/SALDataAudioAndVideo.go
@@ -31,6 +31,8 @@ type SALDataAudioAndVideo interface {
 	utils.LengthAware
 	utils.Serializable
 	SALData
+	// GetAudioVideoData returns AudioVideoData (property field)
+	GetAudioVideoData() LightingData
 }
 
 // SALDataAudioAndVideoExactly can be used when we want exactly this type and not a type which fulfills SALDataAudioAndVideo.
@@ -43,6 +45,7 @@ type SALDataAudioAndVideoExactly interface {
 // _SALDataAudioAndVideo is the data-structure of this message
 type _SALDataAudioAndVideo struct {
 	*_SALData
+	AudioVideoData LightingData
 }
 
 ///////////////////////////////////////////////////////////
@@ -67,10 +70,25 @@ func (m *_SALDataAudioAndVideo) GetParent() SALData {
 	return m._SALData
 }
 
+///////////////////////////////////////////////////////////
+///////////////////////////////////////////////////////////
+/////////////////////// Accessors for property fields.
+///////////////////////
+
+func (m *_SALDataAudioAndVideo) GetAudioVideoData() LightingData {
+	return m.AudioVideoData
+}
+
+///////////////////////
+///////////////////////
+///////////////////////////////////////////////////////////
+///////////////////////////////////////////////////////////
+
 // NewSALDataAudioAndVideo factory function for _SALDataAudioAndVideo
-func NewSALDataAudioAndVideo(salData SALData) *_SALDataAudioAndVideo {
+func NewSALDataAudioAndVideo(audioVideoData LightingData, salData SALData) *_SALDataAudioAndVideo {
 	_result := &_SALDataAudioAndVideo{
-		_SALData: NewSALData(salData),
+		AudioVideoData: audioVideoData,
+		_SALData:       NewSALData(salData),
 	}
 	_result._SALData._SALDataChildRequirements = _result
 	return _result
@@ -98,6 +116,9 @@ func (m *_SALDataAudioAndVideo) GetLengthInBits() uint16 {
 func (m *_SALDataAudioAndVideo) GetLengthInBitsConditional(lastItem bool) uint16 {
 	lengthInBits := uint16(m.GetParentLengthInBits())
 
+	// Simple field (audioVideoData)
+	lengthInBits += m.AudioVideoData.GetLengthInBits()
+
 	return lengthInBits
 }
 
@@ -114,9 +135,17 @@ func SALDataAudioAndVideoParse(readBuffer utils.ReadBuffer, applicationId Applic
 	currentPos := positionAware.GetPos()
 	_ = currentPos
 
-	// Validation
-	if !(bool((1) == (2))) {
-		return nil, errors.WithStack(utils.ParseValidationError{"AUDIO_AND_VIDEO Not yet implemented"})
+	// Simple Field (audioVideoData)
+	if pullErr := readBuffer.PullContext("audioVideoData"); pullErr != nil {
+		return nil, errors.Wrap(pullErr, "Error pulling for audioVideoData")
+	}
+	_audioVideoData, _audioVideoDataErr := LightingDataParse(readBuffer)
+	if _audioVideoDataErr != nil {
+		return nil, errors.Wrap(_audioVideoDataErr, "Error parsing 'audioVideoData' field of SALDataAudioAndVideo")
+	}
+	audioVideoData := _audioVideoData.(LightingData)
+	if closeErr := readBuffer.CloseContext("audioVideoData"); closeErr != nil {
+		return nil, errors.Wrap(closeErr, "Error closing for audioVideoData")
 	}
 
 	if closeErr := readBuffer.CloseContext("SALDataAudioAndVideo"); closeErr != nil {
@@ -125,7 +154,8 @@ func SALDataAudioAndVideoParse(readBuffer utils.ReadBuffer, applicationId Applic
 
 	// Create a partially initialized instance
 	_child := &_SALDataAudioAndVideo{
-		_SALData: &_SALData{},
+		AudioVideoData: audioVideoData,
+		_SALData:       &_SALData{},
 	}
 	_child._SALData._SALDataChildRequirements = _child
 	return _child, nil
@@ -139,6 +169,18 @@ func (m *_SALDataAudioAndVideo) Serialize(writeBuffer utils.WriteBuffer) error {
 			return errors.Wrap(pushErr, "Error pushing for SALDataAudioAndVideo")
 		}
 
+		// Simple Field (audioVideoData)
+		if pushErr := writeBuffer.PushContext("audioVideoData"); pushErr != nil {
+			return errors.Wrap(pushErr, "Error pushing for audioVideoData")
+		}
+		_audioVideoDataErr := writeBuffer.WriteSerializable(m.GetAudioVideoData())
+		if popErr := writeBuffer.PopContext("audioVideoData"); popErr != nil {
+			return errors.Wrap(popErr, "Error popping for audioVideoData")
+		}
+		if _audioVideoDataErr != nil {
+			return errors.Wrap(_audioVideoDataErr, "Error serializing 'audioVideoData' field")
+		}
+
 		if popErr := writeBuffer.PopContext("SALDataAudioAndVideo"); popErr != nil {
 			return errors.Wrap(popErr, "Error popping for SALDataAudioAndVideo")
 		}
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 ad67589ba..1a2f2520e 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
@@ -1342,7 +1342,8 @@
             [simple EnableControlData enableControlData]
         ]
         ['AUDIO_AND_VIDEO'                      *AudioAndVideo
-            [validation '1==2' "AUDIO_AND_VIDEO Not yet implemented"] // TODO: implement me
+             // Note: the documentation states that the data for ventilation uses LightingData
+            [simple LightingData audioVideoData]
         ]
         ['SECURITY'                             *Security
             [simple SecurityData securityData]


[plc4x] 01/02: feat(cbus): implemented heating application

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 4d1b020c27ffbf86bc8cec881d9b961806019d95
Author: Sebastian Rühl <sr...@apache.org>
AuthorDate: Tue Jul 19 18:00:11 2022 +0200

    feat(cbus): implemented heating application
---
 .../cbus/readwrite/model/SALDataHeating.go         | 54 +++++++++++++++++---
 .../readwrite/model/SALDataIrrigationControl.go    | 58 +++++++++++-----------
 .../model/SALDataPoolsSpasPondsFountainsControl.go | 58 +++++++++++-----------
 .../src/main/resources/protocols/cbus/c-bus.mspec  |  9 ++--
 4 files changed, 111 insertions(+), 68 deletions(-)

diff --git a/plc4go/protocols/cbus/readwrite/model/SALDataHeating.go b/plc4go/protocols/cbus/readwrite/model/SALDataHeating.go
index 41cb5e248..f5dbe26b7 100644
--- a/plc4go/protocols/cbus/readwrite/model/SALDataHeating.go
+++ b/plc4go/protocols/cbus/readwrite/model/SALDataHeating.go
@@ -31,6 +31,8 @@ type SALDataHeating interface {
 	utils.LengthAware
 	utils.Serializable
 	SALData
+	// GetHeatingData returns HeatingData (property field)
+	GetHeatingData() LightingData
 }
 
 // SALDataHeatingExactly can be used when we want exactly this type and not a type which fulfills SALDataHeating.
@@ -43,6 +45,7 @@ type SALDataHeatingExactly interface {
 // _SALDataHeating is the data-structure of this message
 type _SALDataHeating struct {
 	*_SALData
+	HeatingData LightingData
 }
 
 ///////////////////////////////////////////////////////////
@@ -67,10 +70,25 @@ func (m *_SALDataHeating) GetParent() SALData {
 	return m._SALData
 }
 
+///////////////////////////////////////////////////////////
+///////////////////////////////////////////////////////////
+/////////////////////// Accessors for property fields.
+///////////////////////
+
+func (m *_SALDataHeating) GetHeatingData() LightingData {
+	return m.HeatingData
+}
+
+///////////////////////
+///////////////////////
+///////////////////////////////////////////////////////////
+///////////////////////////////////////////////////////////
+
 // NewSALDataHeating factory function for _SALDataHeating
-func NewSALDataHeating(salData SALData) *_SALDataHeating {
+func NewSALDataHeating(heatingData LightingData, salData SALData) *_SALDataHeating {
 	_result := &_SALDataHeating{
-		_SALData: NewSALData(salData),
+		HeatingData: heatingData,
+		_SALData:    NewSALData(salData),
 	}
 	_result._SALData._SALDataChildRequirements = _result
 	return _result
@@ -98,6 +116,9 @@ func (m *_SALDataHeating) GetLengthInBits() uint16 {
 func (m *_SALDataHeating) GetLengthInBitsConditional(lastItem bool) uint16 {
 	lengthInBits := uint16(m.GetParentLengthInBits())
 
+	// Simple field (heatingData)
+	lengthInBits += m.HeatingData.GetLengthInBits()
+
 	return lengthInBits
 }
 
@@ -114,9 +135,17 @@ func SALDataHeatingParse(readBuffer utils.ReadBuffer, applicationId ApplicationI
 	currentPos := positionAware.GetPos()
 	_ = currentPos
 
-	// Validation
-	if !(bool((1) == (2))) {
-		return nil, errors.WithStack(utils.ParseValidationError{"HEATING Not yet implemented"})
+	// Simple Field (heatingData)
+	if pullErr := readBuffer.PullContext("heatingData"); pullErr != nil {
+		return nil, errors.Wrap(pullErr, "Error pulling for heatingData")
+	}
+	_heatingData, _heatingDataErr := LightingDataParse(readBuffer)
+	if _heatingDataErr != nil {
+		return nil, errors.Wrap(_heatingDataErr, "Error parsing 'heatingData' field of SALDataHeating")
+	}
+	heatingData := _heatingData.(LightingData)
+	if closeErr := readBuffer.CloseContext("heatingData"); closeErr != nil {
+		return nil, errors.Wrap(closeErr, "Error closing for heatingData")
 	}
 
 	if closeErr := readBuffer.CloseContext("SALDataHeating"); closeErr != nil {
@@ -125,7 +154,8 @@ func SALDataHeatingParse(readBuffer utils.ReadBuffer, applicationId ApplicationI
 
 	// Create a partially initialized instance
 	_child := &_SALDataHeating{
-		_SALData: &_SALData{},
+		HeatingData: heatingData,
+		_SALData:    &_SALData{},
 	}
 	_child._SALData._SALDataChildRequirements = _child
 	return _child, nil
@@ -139,6 +169,18 @@ func (m *_SALDataHeating) Serialize(writeBuffer utils.WriteBuffer) error {
 			return errors.Wrap(pushErr, "Error pushing for SALDataHeating")
 		}
 
+		// Simple Field (heatingData)
+		if pushErr := writeBuffer.PushContext("heatingData"); pushErr != nil {
+			return errors.Wrap(pushErr, "Error pushing for heatingData")
+		}
+		_heatingDataErr := writeBuffer.WriteSerializable(m.GetHeatingData())
+		if popErr := writeBuffer.PopContext("heatingData"); popErr != nil {
+			return errors.Wrap(popErr, "Error popping for heatingData")
+		}
+		if _heatingDataErr != nil {
+			return errors.Wrap(_heatingDataErr, "Error serializing 'heatingData' field")
+		}
+
 		if popErr := writeBuffer.PopContext("SALDataHeating"); popErr != nil {
 			return errors.Wrap(popErr, "Error popping for SALDataHeating")
 		}
diff --git a/plc4go/protocols/cbus/readwrite/model/SALDataIrrigationControl.go b/plc4go/protocols/cbus/readwrite/model/SALDataIrrigationControl.go
index f66465d0b..5d84bc332 100644
--- a/plc4go/protocols/cbus/readwrite/model/SALDataIrrigationControl.go
+++ b/plc4go/protocols/cbus/readwrite/model/SALDataIrrigationControl.go
@@ -31,8 +31,8 @@ type SALDataIrrigationControl interface {
 	utils.LengthAware
 	utils.Serializable
 	SALData
-	// GetVentilationData returns VentilationData (property field)
-	GetVentilationData() LightingData
+	// GetIrrigationControlData returns IrrigationControlData (property field)
+	GetIrrigationControlData() LightingData
 }
 
 // SALDataIrrigationControlExactly can be used when we want exactly this type and not a type which fulfills SALDataIrrigationControl.
@@ -45,7 +45,7 @@ type SALDataIrrigationControlExactly interface {
 // _SALDataIrrigationControl is the data-structure of this message
 type _SALDataIrrigationControl struct {
 	*_SALData
-	VentilationData LightingData
+	IrrigationControlData LightingData
 }
 
 ///////////////////////////////////////////////////////////
@@ -75,8 +75,8 @@ func (m *_SALDataIrrigationControl) GetParent() SALData {
 /////////////////////// Accessors for property fields.
 ///////////////////////
 
-func (m *_SALDataIrrigationControl) GetVentilationData() LightingData {
-	return m.VentilationData
+func (m *_SALDataIrrigationControl) GetIrrigationControlData() LightingData {
+	return m.IrrigationControlData
 }
 
 ///////////////////////
@@ -85,10 +85,10 @@ func (m *_SALDataIrrigationControl) GetVentilationData() LightingData {
 ///////////////////////////////////////////////////////////
 
 // NewSALDataIrrigationControl factory function for _SALDataIrrigationControl
-func NewSALDataIrrigationControl(ventilationData LightingData, salData SALData) *_SALDataIrrigationControl {
+func NewSALDataIrrigationControl(irrigationControlData LightingData, salData SALData) *_SALDataIrrigationControl {
 	_result := &_SALDataIrrigationControl{
-		VentilationData: ventilationData,
-		_SALData:        NewSALData(salData),
+		IrrigationControlData: irrigationControlData,
+		_SALData:              NewSALData(salData),
 	}
 	_result._SALData._SALDataChildRequirements = _result
 	return _result
@@ -116,8 +116,8 @@ func (m *_SALDataIrrigationControl) GetLengthInBits() uint16 {
 func (m *_SALDataIrrigationControl) GetLengthInBitsConditional(lastItem bool) uint16 {
 	lengthInBits := uint16(m.GetParentLengthInBits())
 
-	// Simple field (ventilationData)
-	lengthInBits += m.VentilationData.GetLengthInBits()
+	// Simple field (irrigationControlData)
+	lengthInBits += m.IrrigationControlData.GetLengthInBits()
 
 	return lengthInBits
 }
@@ -135,17 +135,17 @@ func SALDataIrrigationControlParse(readBuffer utils.ReadBuffer, applicationId Ap
 	currentPos := positionAware.GetPos()
 	_ = currentPos
 
-	// Simple Field (ventilationData)
-	if pullErr := readBuffer.PullContext("ventilationData"); pullErr != nil {
-		return nil, errors.Wrap(pullErr, "Error pulling for ventilationData")
+	// Simple Field (irrigationControlData)
+	if pullErr := readBuffer.PullContext("irrigationControlData"); pullErr != nil {
+		return nil, errors.Wrap(pullErr, "Error pulling for irrigationControlData")
 	}
-	_ventilationData, _ventilationDataErr := LightingDataParse(readBuffer)
-	if _ventilationDataErr != nil {
-		return nil, errors.Wrap(_ventilationDataErr, "Error parsing 'ventilationData' field of SALDataIrrigationControl")
+	_irrigationControlData, _irrigationControlDataErr := LightingDataParse(readBuffer)
+	if _irrigationControlDataErr != nil {
+		return nil, errors.Wrap(_irrigationControlDataErr, "Error parsing 'irrigationControlData' field of SALDataIrrigationControl")
 	}
-	ventilationData := _ventilationData.(LightingData)
-	if closeErr := readBuffer.CloseContext("ventilationData"); closeErr != nil {
-		return nil, errors.Wrap(closeErr, "Error closing for ventilationData")
+	irrigationControlData := _irrigationControlData.(LightingData)
+	if closeErr := readBuffer.CloseContext("irrigationControlData"); closeErr != nil {
+		return nil, errors.Wrap(closeErr, "Error closing for irrigationControlData")
 	}
 
 	if closeErr := readBuffer.CloseContext("SALDataIrrigationControl"); closeErr != nil {
@@ -154,8 +154,8 @@ func SALDataIrrigationControlParse(readBuffer utils.ReadBuffer, applicationId Ap
 
 	// Create a partially initialized instance
 	_child := &_SALDataIrrigationControl{
-		VentilationData: ventilationData,
-		_SALData:        &_SALData{},
+		IrrigationControlData: irrigationControlData,
+		_SALData:              &_SALData{},
 	}
 	_child._SALData._SALDataChildRequirements = _child
 	return _child, nil
@@ -169,16 +169,16 @@ func (m *_SALDataIrrigationControl) Serialize(writeBuffer utils.WriteBuffer) err
 			return errors.Wrap(pushErr, "Error pushing for SALDataIrrigationControl")
 		}
 
-		// Simple Field (ventilationData)
-		if pushErr := writeBuffer.PushContext("ventilationData"); pushErr != nil {
-			return errors.Wrap(pushErr, "Error pushing for ventilationData")
+		// Simple Field (irrigationControlData)
+		if pushErr := writeBuffer.PushContext("irrigationControlData"); pushErr != nil {
+			return errors.Wrap(pushErr, "Error pushing for irrigationControlData")
 		}
-		_ventilationDataErr := writeBuffer.WriteSerializable(m.GetVentilationData())
-		if popErr := writeBuffer.PopContext("ventilationData"); popErr != nil {
-			return errors.Wrap(popErr, "Error popping for ventilationData")
+		_irrigationControlDataErr := writeBuffer.WriteSerializable(m.GetIrrigationControlData())
+		if popErr := writeBuffer.PopContext("irrigationControlData"); popErr != nil {
+			return errors.Wrap(popErr, "Error popping for irrigationControlData")
 		}
-		if _ventilationDataErr != nil {
-			return errors.Wrap(_ventilationDataErr, "Error serializing 'ventilationData' field")
+		if _irrigationControlDataErr != nil {
+			return errors.Wrap(_irrigationControlDataErr, "Error serializing 'irrigationControlData' field")
 		}
 
 		if popErr := writeBuffer.PopContext("SALDataIrrigationControl"); popErr != nil {
diff --git a/plc4go/protocols/cbus/readwrite/model/SALDataPoolsSpasPondsFountainsControl.go b/plc4go/protocols/cbus/readwrite/model/SALDataPoolsSpasPondsFountainsControl.go
index e7f8ad09b..01315bfe7 100644
--- a/plc4go/protocols/cbus/readwrite/model/SALDataPoolsSpasPondsFountainsControl.go
+++ b/plc4go/protocols/cbus/readwrite/model/SALDataPoolsSpasPondsFountainsControl.go
@@ -31,8 +31,8 @@ type SALDataPoolsSpasPondsFountainsControl interface {
 	utils.LengthAware
 	utils.Serializable
 	SALData
-	// GetVentilationData returns VentilationData (property field)
-	GetVentilationData() LightingData
+	// GetPoolsSpaPondsFountainsData returns PoolsSpaPondsFountainsData (property field)
+	GetPoolsSpaPondsFountainsData() LightingData
 }
 
 // SALDataPoolsSpasPondsFountainsControlExactly can be used when we want exactly this type and not a type which fulfills SALDataPoolsSpasPondsFountainsControl.
@@ -45,7 +45,7 @@ type SALDataPoolsSpasPondsFountainsControlExactly interface {
 // _SALDataPoolsSpasPondsFountainsControl is the data-structure of this message
 type _SALDataPoolsSpasPondsFountainsControl struct {
 	*_SALData
-	VentilationData LightingData
+	PoolsSpaPondsFountainsData LightingData
 }
 
 ///////////////////////////////////////////////////////////
@@ -75,8 +75,8 @@ func (m *_SALDataPoolsSpasPondsFountainsControl) GetParent() SALData {
 /////////////////////// Accessors for property fields.
 ///////////////////////
 
-func (m *_SALDataPoolsSpasPondsFountainsControl) GetVentilationData() LightingData {
-	return m.VentilationData
+func (m *_SALDataPoolsSpasPondsFountainsControl) GetPoolsSpaPondsFountainsData() LightingData {
+	return m.PoolsSpaPondsFountainsData
 }
 
 ///////////////////////
@@ -85,10 +85,10 @@ func (m *_SALDataPoolsSpasPondsFountainsControl) GetVentilationData() LightingDa
 ///////////////////////////////////////////////////////////
 
 // NewSALDataPoolsSpasPondsFountainsControl factory function for _SALDataPoolsSpasPondsFountainsControl
-func NewSALDataPoolsSpasPondsFountainsControl(ventilationData LightingData, salData SALData) *_SALDataPoolsSpasPondsFountainsControl {
+func NewSALDataPoolsSpasPondsFountainsControl(poolsSpaPondsFountainsData LightingData, salData SALData) *_SALDataPoolsSpasPondsFountainsControl {
 	_result := &_SALDataPoolsSpasPondsFountainsControl{
-		VentilationData: ventilationData,
-		_SALData:        NewSALData(salData),
+		PoolsSpaPondsFountainsData: poolsSpaPondsFountainsData,
+		_SALData:                   NewSALData(salData),
 	}
 	_result._SALData._SALDataChildRequirements = _result
 	return _result
@@ -116,8 +116,8 @@ func (m *_SALDataPoolsSpasPondsFountainsControl) GetLengthInBits() uint16 {
 func (m *_SALDataPoolsSpasPondsFountainsControl) GetLengthInBitsConditional(lastItem bool) uint16 {
 	lengthInBits := uint16(m.GetParentLengthInBits())
 
-	// Simple field (ventilationData)
-	lengthInBits += m.VentilationData.GetLengthInBits()
+	// Simple field (poolsSpaPondsFountainsData)
+	lengthInBits += m.PoolsSpaPondsFountainsData.GetLengthInBits()
 
 	return lengthInBits
 }
@@ -135,17 +135,17 @@ func SALDataPoolsSpasPondsFountainsControlParse(readBuffer utils.ReadBuffer, app
 	currentPos := positionAware.GetPos()
 	_ = currentPos
 
-	// Simple Field (ventilationData)
-	if pullErr := readBuffer.PullContext("ventilationData"); pullErr != nil {
-		return nil, errors.Wrap(pullErr, "Error pulling for ventilationData")
+	// Simple Field (poolsSpaPondsFountainsData)
+	if pullErr := readBuffer.PullContext("poolsSpaPondsFountainsData"); pullErr != nil {
+		return nil, errors.Wrap(pullErr, "Error pulling for poolsSpaPondsFountainsData")
 	}
-	_ventilationData, _ventilationDataErr := LightingDataParse(readBuffer)
-	if _ventilationDataErr != nil {
-		return nil, errors.Wrap(_ventilationDataErr, "Error parsing 'ventilationData' field of SALDataPoolsSpasPondsFountainsControl")
+	_poolsSpaPondsFountainsData, _poolsSpaPondsFountainsDataErr := LightingDataParse(readBuffer)
+	if _poolsSpaPondsFountainsDataErr != nil {
+		return nil, errors.Wrap(_poolsSpaPondsFountainsDataErr, "Error parsing 'poolsSpaPondsFountainsData' field of SALDataPoolsSpasPondsFountainsControl")
 	}
-	ventilationData := _ventilationData.(LightingData)
-	if closeErr := readBuffer.CloseContext("ventilationData"); closeErr != nil {
-		return nil, errors.Wrap(closeErr, "Error closing for ventilationData")
+	poolsSpaPondsFountainsData := _poolsSpaPondsFountainsData.(LightingData)
+	if closeErr := readBuffer.CloseContext("poolsSpaPondsFountainsData"); closeErr != nil {
+		return nil, errors.Wrap(closeErr, "Error closing for poolsSpaPondsFountainsData")
 	}
 
 	if closeErr := readBuffer.CloseContext("SALDataPoolsSpasPondsFountainsControl"); closeErr != nil {
@@ -154,8 +154,8 @@ func SALDataPoolsSpasPondsFountainsControlParse(readBuffer utils.ReadBuffer, app
 
 	// Create a partially initialized instance
 	_child := &_SALDataPoolsSpasPondsFountainsControl{
-		VentilationData: ventilationData,
-		_SALData:        &_SALData{},
+		PoolsSpaPondsFountainsData: poolsSpaPondsFountainsData,
+		_SALData:                   &_SALData{},
 	}
 	_child._SALData._SALDataChildRequirements = _child
 	return _child, nil
@@ -169,16 +169,16 @@ func (m *_SALDataPoolsSpasPondsFountainsControl) Serialize(writeBuffer utils.Wri
 			return errors.Wrap(pushErr, "Error pushing for SALDataPoolsSpasPondsFountainsControl")
 		}
 
-		// Simple Field (ventilationData)
-		if pushErr := writeBuffer.PushContext("ventilationData"); pushErr != nil {
-			return errors.Wrap(pushErr, "Error pushing for ventilationData")
+		// Simple Field (poolsSpaPondsFountainsData)
+		if pushErr := writeBuffer.PushContext("poolsSpaPondsFountainsData"); pushErr != nil {
+			return errors.Wrap(pushErr, "Error pushing for poolsSpaPondsFountainsData")
 		}
-		_ventilationDataErr := writeBuffer.WriteSerializable(m.GetVentilationData())
-		if popErr := writeBuffer.PopContext("ventilationData"); popErr != nil {
-			return errors.Wrap(popErr, "Error popping for ventilationData")
+		_poolsSpaPondsFountainsDataErr := writeBuffer.WriteSerializable(m.GetPoolsSpaPondsFountainsData())
+		if popErr := writeBuffer.PopContext("poolsSpaPondsFountainsData"); popErr != nil {
+			return errors.Wrap(popErr, "Error popping for poolsSpaPondsFountainsData")
 		}
-		if _ventilationDataErr != nil {
-			return errors.Wrap(_ventilationDataErr, "Error serializing 'ventilationData' field")
+		if _poolsSpaPondsFountainsDataErr != nil {
+			return errors.Wrap(_poolsSpaPondsFountainsDataErr, "Error serializing 'poolsSpaPondsFountainsData' field")
 		}
 
 		if popErr := writeBuffer.PopContext("SALDataPoolsSpasPondsFountainsControl"); popErr != nil {
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 88f746d6e..ad67589ba 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
@@ -1322,14 +1322,15 @@
         ]
         ['IRRIGATION_CONTROL'                   *IrrigationControl
              // Note: the documentation states that the data for irrigation control uses LightingData
-            [simple LightingData ventilationData]
+            [simple LightingData irrigationControlData]
         ]
         ['POOLS_SPAS_PONDS_FOUNTAINS_CONTROL'   *PoolsSpasPondsFountainsControl
-             // Note: the documentation states that the data for pools spas ponds fauntains uses LightingData
-            [simple LightingData ventilationData]
+             // Note: the documentation states that the data for pools spas ponds fountains uses LightingData
+            [simple LightingData poolsSpaPondsFountainsData]
         ]
         ['HEATING'                              *Heating
-            [validation '1==2' "HEATING Not yet implemented"] // TODO: implement me
+            // Note: the documentation states that the data for ventilation uses LightingData
+            [simple LightingData heatingData]
         ]
         ['AIR_CONDITIONING'                     *AirConditioning
             [simple AirConditioningData airConditioningData]